From 342e672574c4e67d510e46ab6acd0e21a7d0cf54 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 26 Apr 2015 22:16:26 +0000 Subject: (tl)perl 5.20.2 for windows, from siep git-svn-id: svn://tug.org/texlive/trunk@37064 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/tlperl/README.TEXLIVE | 2 +- Master/tlpkg/tlperl/bin/a2p.exe | Bin 121856 -> 124416 bytes Master/tlpkg/tlperl/bin/libgcc_s_sjlj-1.dll | Bin 95232 -> 461048 bytes Master/tlpkg/tlperl/bin/libpng16-16_.dll | Bin 182553 -> 0 bytes Master/tlpkg/tlperl/bin/libstdc++-6.dll | Bin 860160 -> 887921 bytes Master/tlpkg/tlperl/bin/libwinpthread-1.dll | Bin 0 -> 52612 bytes Master/tlpkg/tlperl/bin/perl.exe | Bin 16384 -> 17408 bytes Master/tlpkg/tlperl/bin/perl5.18.2.exe | Bin 16384 -> 0 bytes Master/tlpkg/tlperl/bin/perl5.20.2.exe | Bin 0 -> 17408 bytes Master/tlpkg/tlperl/bin/perl518.dll | Bin 1837568 -> 0 bytes Master/tlpkg/tlperl/bin/perl520.dll | Bin 0 -> 2046464 bytes Master/tlpkg/tlperl/bin/perlglob.exe | Bin 12800 -> 13824 bytes Master/tlpkg/tlperl/bin/wperl.exe | Bin 16384 -> 17408 bytes Master/tlpkg/tlperl/bin/zlib1_.dll | Bin 91648 -> 0 bytes Master/tlpkg/tlperl/lib/.packlist | 3600 +- Master/tlpkg/tlperl/lib/App/Cpan.pm | 17 +- Master/tlpkg/tlperl/lib/App/Prove.pm | 15 +- Master/tlpkg/tlperl/lib/App/Prove/State.pm | 11 +- Master/tlpkg/tlperl/lib/App/Prove/State/Result.pm | 8 +- .../tlperl/lib/App/Prove/State/Result/Test.pm | 9 +- Master/tlpkg/tlperl/lib/Archive/Extract.pm | 1690 - Master/tlpkg/tlperl/lib/Archive/Tar.pm | 121 +- Master/tlpkg/tlperl/lib/Archive/Tar/Constant.pm | 30 +- Master/tlpkg/tlperl/lib/Archive/Tar/File.pm | 6 +- Master/tlpkg/tlperl/lib/Attribute/Handlers.pm | 9 +- Master/tlpkg/tlperl/lib/AutoLoader.pm | 4 +- Master/tlpkg/tlperl/lib/B.pm | 44 +- Master/tlpkg/tlperl/lib/B/Concise.pm | 153 +- Master/tlpkg/tlperl/lib/B/Debug.pm | 20 +- Master/tlpkg/tlperl/lib/B/Deparse.pm | 113 +- Master/tlpkg/tlperl/lib/B/Lint.pm | 793 - Master/tlpkg/tlperl/lib/B/Lint/Debug.pm | 73 - Master/tlpkg/tlperl/lib/B/Showlex.pm | 4 +- Master/tlpkg/tlperl/lib/Benchmark.pm | 110 +- Master/tlpkg/tlperl/lib/CGI.pm | 63 +- Master/tlpkg/tlperl/lib/CGI/Apache.pm | 3 +- Master/tlpkg/tlperl/lib/CGI/Carp.pm | 7 +- Master/tlpkg/tlperl/lib/CGI/Cookie.pm | 9 +- Master/tlpkg/tlperl/lib/CGI/Fast.pm | 3 +- Master/tlpkg/tlperl/lib/CGI/Pretty.pm | 5 +- Master/tlpkg/tlperl/lib/CGI/Push.pm | 3 +- Master/tlpkg/tlperl/lib/CGI/Switch.pm | 3 +- Master/tlpkg/tlperl/lib/CGI/Util.pm | 5 +- Master/tlpkg/tlperl/lib/CORE.pod | 96 + Master/tlpkg/tlperl/lib/CORE/XSUB.h | 10 +- Master/tlpkg/tlperl/lib/CORE/av.h | 3 + Master/tlpkg/tlperl/lib/CORE/charclass_invlists.h | 11379 +++- Master/tlpkg/tlperl/lib/CORE/config.h | 131 +- Master/tlpkg/tlperl/lib/CORE/cop.h | 45 +- Master/tlpkg/tlperl/lib/CORE/cv.h | 26 +- Master/tlpkg/tlperl/lib/CORE/dosish.h | 17 - Master/tlpkg/tlperl/lib/CORE/embed.h | 239 +- Master/tlpkg/tlperl/lib/CORE/embedvar.h | 12 +- Master/tlpkg/tlperl/lib/CORE/fakethr.h | 75 - Master/tlpkg/tlperl/lib/CORE/feature.h | 20 +- Master/tlpkg/tlperl/lib/CORE/gv.h | 5 +- Master/tlpkg/tlperl/lib/CORE/handy.h | 914 +- Master/tlpkg/tlperl/lib/CORE/hv.h | 62 +- Master/tlpkg/tlperl/lib/CORE/hv_func.h | 12 +- Master/tlpkg/tlperl/lib/CORE/inline.h | 189 +- Master/tlpkg/tlperl/lib/CORE/intrpvar.h | 50 +- Master/tlpkg/tlperl/lib/CORE/iperlsys.h | 8 +- Master/tlpkg/tlperl/lib/CORE/keywords.h | 493 +- Master/tlpkg/tlperl/lib/CORE/libperl518.a | Bin 916938 -> 0 bytes Master/tlpkg/tlperl/lib/CORE/libperl520.a | Bin 0 -> 926094 bytes Master/tlpkg/tlperl/lib/CORE/mg.h | 20 +- Master/tlpkg/tlperl/lib/CORE/mg_data.h | 2 +- Master/tlpkg/tlperl/lib/CORE/mg_raw.h | 2 +- Master/tlpkg/tlperl/lib/CORE/op.h | 185 +- Master/tlpkg/tlperl/lib/CORE/opcode.h | 18 +- Master/tlpkg/tlperl/lib/CORE/opnames.h | 494 +- Master/tlpkg/tlperl/lib/CORE/pad.h | 33 +- Master/tlpkg/tlperl/lib/CORE/parser.h | 8 +- Master/tlpkg/tlperl/lib/CORE/patchlevel.h | 6 +- Master/tlpkg/tlperl/lib/CORE/perl.h | 932 +- Master/tlpkg/tlperl/lib/CORE/perlio.h | 41 +- Master/tlpkg/tlperl/lib/CORE/perliol.h | 11 +- Master/tlpkg/tlperl/lib/CORE/perlsfio.h | 84 - Master/tlpkg/tlperl/lib/CORE/perlvars.h | 11 +- Master/tlpkg/tlperl/lib/CORE/perly.h | 60 +- Master/tlpkg/tlperl/lib/CORE/pp.h | 55 +- Master/tlpkg/tlperl/lib/CORE/pp_proto.h | 2 + Master/tlpkg/tlperl/lib/CORE/proto.h | 921 +- Master/tlpkg/tlperl/lib/CORE/reentr.h | 145 +- Master/tlpkg/tlperl/lib/CORE/regcharclass.h | 1188 +- Master/tlpkg/tlperl/lib/CORE/regcomp.h | 265 +- Master/tlpkg/tlperl/lib/CORE/regexp.h | 236 +- Master/tlpkg/tlperl/lib/CORE/regnodes.h | 375 +- Master/tlpkg/tlperl/lib/CORE/scope.h | 35 +- Master/tlpkg/tlperl/lib/CORE/sv.h | 234 +- Master/tlpkg/tlperl/lib/CORE/sys/errno2.h | 178 + Master/tlpkg/tlperl/lib/CORE/sys/socket.h | 14 +- Master/tlpkg/tlperl/lib/CORE/thread.h | 6 +- Master/tlpkg/tlperl/lib/CORE/time64.h | 11 +- Master/tlpkg/tlperl/lib/CORE/uconfig.h | 131 +- Master/tlpkg/tlperl/lib/CORE/unicode_constants.h | 15 +- Master/tlpkg/tlperl/lib/CORE/utf8.h | 219 +- Master/tlpkg/tlperl/lib/CORE/utfebcdic.h | 274 +- Master/tlpkg/tlperl/lib/CORE/util.h | 30 + Master/tlpkg/tlperl/lib/CORE/vdir.h | 42 +- Master/tlpkg/tlperl/lib/CORE/vutil.h | 241 + Master/tlpkg/tlperl/lib/CORE/warnings.h | 21 +- Master/tlpkg/tlperl/lib/CORE/win32.h | 117 +- Master/tlpkg/tlperl/lib/CORE/win32iop.h | 158 + Master/tlpkg/tlperl/lib/CPAN.pm | 22 +- Master/tlpkg/tlperl/lib/CPAN/API/HOWTO.pod | 44 + Master/tlpkg/tlperl/lib/CPAN/Author.pm | 4 +- Master/tlpkg/tlperl/lib/CPAN/Bundle.pm | 8 +- Master/tlpkg/tlperl/lib/CPAN/CacheMgr.pm | 4 +- Master/tlpkg/tlperl/lib/CPAN/Complete.pm | 4 +- Master/tlpkg/tlperl/lib/CPAN/Distribution.pm | 1048 +- Master/tlpkg/tlperl/lib/CPAN/Distroprefs.pm | 52 +- Master/tlpkg/tlperl/lib/CPAN/FTP.pm | 5 +- Master/tlpkg/tlperl/lib/CPAN/FirstTime.pm | 60 +- Master/tlpkg/tlperl/lib/CPAN/HTTP/Client.pm | 4 +- Master/tlpkg/tlperl/lib/CPAN/HandleConfig.pm | 7 +- Master/tlpkg/tlperl/lib/CPAN/Index.pm | 123 +- Master/tlpkg/tlperl/lib/CPAN/LWP/UserAgent.pm | 19 +- Master/tlpkg/tlperl/lib/CPAN/Meta.pm | 442 +- Master/tlpkg/tlperl/lib/CPAN/Meta/Converter.pm | 162 +- Master/tlpkg/tlperl/lib/CPAN/Meta/Feature.pm | 48 +- Master/tlpkg/tlperl/lib/CPAN/Meta/History.pm | 18 +- Master/tlpkg/tlperl/lib/CPAN/Meta/Prereqs.pm | 160 +- Master/tlpkg/tlperl/lib/CPAN/Meta/Requirements.pm | 14 +- Master/tlpkg/tlperl/lib/CPAN/Meta/Spec.pm | 115 +- Master/tlpkg/tlperl/lib/CPAN/Meta/Validator.pm | 225 +- Master/tlpkg/tlperl/lib/CPAN/Meta/YAML.pm | 1366 +- Master/tlpkg/tlperl/lib/CPAN/Mirrors.pm | 296 +- Master/tlpkg/tlperl/lib/CPAN/Queue.pm | 28 +- Master/tlpkg/tlperl/lib/CPAN/Shell.pm | 345 +- Master/tlpkg/tlperl/lib/CPAN/Tarzip.pm | 12 +- Master/tlpkg/tlperl/lib/CPAN/Version.pm | 6 +- Master/tlpkg/tlperl/lib/CPANPLUS.pm | 272 - Master/tlpkg/tlperl/lib/CPANPLUS/Backend.pm | 1344 - Master/tlpkg/tlperl/lib/CPANPLUS/Backend/RV.pm | 145 - Master/tlpkg/tlperl/lib/CPANPLUS/Config.pm | 834 - Master/tlpkg/tlperl/lib/CPANPLUS/Config/HomeEnv.pm | 63 - Master/tlpkg/tlperl/lib/CPANPLUS/Configure.pm | 637 - .../tlpkg/tlperl/lib/CPANPLUS/Configure/Setup.pm | 1654 - Master/tlpkg/tlperl/lib/CPANPLUS/Dist.pm | 808 - .../tlpkg/tlperl/lib/CPANPLUS/Dist/Autobundle.pm | 120 - Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Base.pm | 261 - Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build.pm | 879 - .../tlperl/lib/CPANPLUS/Dist/Build/Constants.pm | 74 - Master/tlpkg/tlperl/lib/CPANPLUS/Dist/MM.pm | 1044 - Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Sample.pm | 20 - Master/tlpkg/tlperl/lib/CPANPLUS/Error.pm | 210 - Master/tlpkg/tlperl/lib/CPANPLUS/Internals.pm | 556 - .../tlperl/lib/CPANPLUS/Internals/Constants.pm | 391 - .../lib/CPANPLUS/Internals/Constants/Report.pm | 426 - .../tlpkg/tlperl/lib/CPANPLUS/Internals/Extract.pm | 247 - .../tlpkg/tlperl/lib/CPANPLUS/Internals/Fetch.pm | 476 - .../tlpkg/tlperl/lib/CPANPLUS/Internals/Report.pm | 696 - .../tlpkg/tlperl/lib/CPANPLUS/Internals/Search.pm | 367 - .../tlpkg/tlperl/lib/CPANPLUS/Internals/Source.pm | 1470 - .../tlperl/lib/CPANPLUS/Internals/Source/Memory.pm | 381 - .../tlperl/lib/CPANPLUS/Internals/Source/SQLite.pm | 383 - .../lib/CPANPLUS/Internals/Source/SQLite/Tie.pm | 143 - .../tlpkg/tlperl/lib/CPANPLUS/Internals/Utils.pm | 680 - .../lib/CPANPLUS/Internals/Utils/Autoflush.pm | 9 - Master/tlpkg/tlperl/lib/CPANPLUS/Module.pm | 1839 - Master/tlpkg/tlperl/lib/CPANPLUS/Module/Author.pm | 235 - .../tlperl/lib/CPANPLUS/Module/Author/Fake.pm | 83 - .../tlpkg/tlperl/lib/CPANPLUS/Module/Checksums.pm | 260 - Master/tlpkg/tlperl/lib/CPANPLUS/Module/Fake.pm | 88 - .../tlpkg/tlperl/lib/CPANPLUS/Module/Signature.pm | 66 - Master/tlpkg/tlperl/lib/CPANPLUS/Selfupdate.pm | 554 - Master/tlpkg/tlperl/lib/CPANPLUS/Shell.pm | 343 - Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Classic.pm | 1269 - Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Default.pm | 1978 - .../CPANPLUS/Shell/Default/Plugins/CustomSource.pm | 205 - .../lib/CPANPLUS/Shell/Default/Plugins/Remote.pm | 190 - .../lib/CPANPLUS/Shell/Default/Plugins/Source.pm | 111 - Master/tlpkg/tlperl/lib/Carp.pm | 261 +- Master/tlpkg/tlperl/lib/Carp/Heavy.pm | 7 +- Master/tlpkg/tlperl/lib/Class/Struct.pm | 34 +- Master/tlpkg/tlperl/lib/Compress/Raw/Bzip2.pm | 5 +- Master/tlpkg/tlperl/lib/Compress/Raw/Zlib.pm | 20 +- Master/tlpkg/tlperl/lib/Compress/Zlib.pm | 23 +- Master/tlpkg/tlperl/lib/Config.pm | 13 +- Master/tlpkg/tlperl/lib/Config.pm.orig | 23 +- Master/tlpkg/tlperl/lib/Config.pod | 9124 +++ Master/tlpkg/tlperl/lib/Config/Perl/V.pm | 115 +- Master/tlpkg/tlperl/lib/Config_heavy.pl | 70 +- Master/tlpkg/tlperl/lib/Config_heavy.pl.orig | 148 +- Master/tlpkg/tlperl/lib/Cwd.pm | 44 +- Master/tlpkg/tlperl/lib/DB.pm | 12 +- Master/tlpkg/tlperl/lib/DBM_Filter.pm | 4 +- Master/tlpkg/tlperl/lib/DBM_Filter/compress.pm | 4 +- Master/tlpkg/tlperl/lib/DBM_Filter/encode.pm | 4 +- Master/tlpkg/tlperl/lib/DBM_Filter/int32.pm | 4 +- Master/tlpkg/tlperl/lib/DBM_Filter/null.pm | 4 +- Master/tlpkg/tlperl/lib/DBM_Filter/utf8.pm | 6 +- Master/tlpkg/tlperl/lib/Data/Dumper.pm | 72 +- Master/tlpkg/tlperl/lib/Date/Format.pm | 403 + Master/tlpkg/tlperl/lib/Date/Language.pm | 144 + Master/tlpkg/tlperl/lib/Date/Language/Afar.pm | 49 + Master/tlpkg/tlperl/lib/Date/Language/Amharic.pm | 87 + Master/tlpkg/tlperl/lib/Date/Language/Austrian.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Brazilian.pm | 35 + Master/tlpkg/tlperl/lib/Date/Language/Bulgarian.pm | 92 + Master/tlpkg/tlperl/lib/Date/Language/Chinese.pm | 36 + .../tlpkg/tlperl/lib/Date/Language/Chinese_GB.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Czech.pm | 58 + Master/tlpkg/tlperl/lib/Date/Language/Danish.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Dutch.pm | 40 + Master/tlpkg/tlperl/lib/Date/Language/English.pm | 37 + Master/tlpkg/tlperl/lib/Date/Language/Finnish.pm | 45 + Master/tlpkg/tlperl/lib/Date/Language/French.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Gedeo.pm | 51 + Master/tlpkg/tlperl/lib/Date/Language/German.pm | 37 + Master/tlpkg/tlperl/lib/Date/Language/Greek.pm | 91 + Master/tlpkg/tlperl/lib/Date/Language/Hungarian.pm | 88 + Master/tlpkg/tlperl/lib/Date/Language/Icelandic.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Italian.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Norwegian.pm | 36 + Master/tlpkg/tlperl/lib/Date/Language/Oromo.pm | 37 + Master/tlpkg/tlperl/lib/Date/Language/Romanian.pm | 37 + Master/tlpkg/tlperl/lib/Date/Language/Russian.pm | 49 + .../tlperl/lib/Date/Language/Russian_cp1251.pm | 39 + .../tlperl/lib/Date/Language/Russian_koi8r.pm | 39 + Master/tlpkg/tlperl/lib/Date/Language/Sidama.pm | 37 + Master/tlpkg/tlperl/lib/Date/Language/Somali.pm | 62 + Master/tlpkg/tlperl/lib/Date/Language/Spanish.pm | 35 + Master/tlpkg/tlperl/lib/Date/Language/Swedish.pm | 41 + Master/tlpkg/tlperl/lib/Date/Language/Tigrinya.pm | 58 + .../tlperl/lib/Date/Language/TigrinyaEritrean.pm | 93 + .../tlperl/lib/Date/Language/TigrinyaEthiopian.pm | 93 + Master/tlpkg/tlperl/lib/Date/Language/Turkish.pm | 59 + Master/tlpkg/tlperl/lib/Date/Parse.pm | 380 + Master/tlpkg/tlperl/lib/Devel/InnerPackage.pm | 129 - Master/tlpkg/tlperl/lib/Devel/PPPort.pm | 1137 +- Master/tlpkg/tlperl/lib/Devel/Peek.pm | 21 +- Master/tlpkg/tlperl/lib/Digest/MD5.pm | 11 +- Master/tlpkg/tlperl/lib/Digest/SHA.pm | 188 +- Master/tlpkg/tlperl/lib/DynaLoader.pm | 28 +- Master/tlpkg/tlperl/lib/Encode.pm | 32 +- Master/tlpkg/tlperl/lib/Encode/Alias.pm | 8 +- Master/tlpkg/tlperl/lib/Encode/CN/HZ.pm | 10 +- Master/tlpkg/tlperl/lib/Encode/Encoder.pm | 6 +- Master/tlpkg/tlperl/lib/Encode/Encoding.pm | 12 +- Master/tlpkg/tlperl/lib/Encode/GSM0338.pm | 12 +- Master/tlpkg/tlperl/lib/Encode/Guess.pm | 4 +- Master/tlpkg/tlperl/lib/Encode/JP/JIS7.pm | 4 +- Master/tlpkg/tlperl/lib/Encode/KR/2022_KR.pm | 4 +- Master/tlpkg/tlperl/lib/Encode/Locale.pm | 72 +- Master/tlpkg/tlperl/lib/Encode/MIME/Header.pm | 6 +- .../tlperl/lib/Encode/MIME/Header/ISO_2022_JP.pm | 4 +- Master/tlpkg/tlperl/lib/Encode/Makefile_PL.e2x | 19 +- Master/tlpkg/tlperl/lib/Encode/PerlIO.pod | 167 + Master/tlpkg/tlperl/lib/Encode/Supported.pod | 901 + Master/tlpkg/tlperl/lib/Encode/Unicode.pm | 6 +- Master/tlpkg/tlperl/lib/Encode/Unicode/UTF7.pm | 11 +- Master/tlpkg/tlperl/lib/Encode/compat.pm | 87 + Master/tlpkg/tlperl/lib/Encode/compat/5006001.pm | 32 + Master/tlpkg/tlperl/lib/Encode/compat/Alias.pm | 330 + Master/tlpkg/tlperl/lib/Encode/compat/common.pm | 127 + Master/tlpkg/tlperl/lib/Encode/encode.h | 11 +- Master/tlpkg/tlperl/lib/English.pm | 10 +- Master/tlpkg/tlperl/lib/Errno.pm | 597 +- Master/tlpkg/tlperl/lib/Exporter.pm | 22 +- Master/tlpkg/tlperl/lib/Exporter/Heavy.pm | 5 + Master/tlpkg/tlperl/lib/ExtUtils/CBuilder.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/CBuilder/Base.pm | 23 +- .../tlperl/lib/ExtUtils/CBuilder/Platform/Unix.pm | 2 +- .../tlperl/lib/ExtUtils/CBuilder/Platform/VMS.pm | 18 +- .../lib/ExtUtils/CBuilder/Platform/Windows.pm | 2 +- .../lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm | 4 +- .../lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm | 2 +- .../lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm | 2 +- .../tlperl/lib/ExtUtils/CBuilder/Platform/aix.pm | 2 +- .../lib/ExtUtils/CBuilder/Platform/android.pm | 39 + .../lib/ExtUtils/CBuilder/Platform/cygwin.pm | 2 +- .../lib/ExtUtils/CBuilder/Platform/darwin.pm | 2 +- .../lib/ExtUtils/CBuilder/Platform/dec_osf.pm | 2 +- .../tlperl/lib/ExtUtils/CBuilder/Platform/os2.pm | 8 +- Master/tlpkg/tlperl/lib/ExtUtils/Command.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/Command/MM.pm | 63 +- Master/tlpkg/tlperl/lib/ExtUtils/Embed.pm | 198 +- Master/tlpkg/tlperl/lib/ExtUtils/Install.pm | 37 +- Master/tlpkg/tlperl/lib/ExtUtils/Installed.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/Liblist.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/Liblist/Kid.pm | 30 +- Master/tlpkg/tlperl/lib/ExtUtils/MM.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_AIX.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_Any.pm | 295 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_BeOS.pm | 4 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_Cygwin.pm | 20 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_DOS.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_Darwin.pm | 10 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_MacOS.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_NW5.pm | 16 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_OS2.pm | 10 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_QNX.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_UWIN.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_Unix.pm | 345 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_VMS.pm | 110 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_VOS.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_Win32.pm | 16 +- Master/tlpkg/tlperl/lib/ExtUtils/MM_Win95.pm | 6 +- Master/tlpkg/tlperl/lib/ExtUtils/MY.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MakeMaker.pm | 362 +- .../tlpkg/tlperl/lib/ExtUtils/MakeMaker/Config.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/MakeMaker/FAQ.pod | 464 + .../tlperl/lib/ExtUtils/MakeMaker/Tutorial.pod | 180 + Master/tlpkg/tlperl/lib/ExtUtils/Miniperl.pm | 174 +- Master/tlpkg/tlperl/lib/ExtUtils/Mkbootstrap.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/Mksymlists.pm | 6 +- Master/tlpkg/tlperl/lib/ExtUtils/Packlist.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/ParseXS.pm | 752 +- Master/tlpkg/tlperl/lib/ExtUtils/ParseXS.pod | 177 + .../tlpkg/tlperl/lib/ExtUtils/ParseXS/Constants.pm | 4 +- .../tlperl/lib/ExtUtils/ParseXS/CountLines.pm | 2 +- Master/tlpkg/tlperl/lib/ExtUtils/ParseXS/Eval.pm | 97 + .../tlpkg/tlperl/lib/ExtUtils/ParseXS/Utilities.pm | 166 +- Master/tlpkg/tlperl/lib/ExtUtils/Typemaps.pm | 115 +- Master/tlpkg/tlperl/lib/ExtUtils/Typemaps/Cmd.pm | 2 +- .../tlpkg/tlperl/lib/ExtUtils/Typemaps/InputMap.pm | 2 +- .../tlperl/lib/ExtUtils/Typemaps/OutputMap.pm | 36 +- Master/tlpkg/tlperl/lib/ExtUtils/Typemaps/Type.pm | 4 +- Master/tlpkg/tlperl/lib/ExtUtils/testlib.pm | 4 +- Master/tlpkg/tlperl/lib/ExtUtils/xsubpp | 31 +- Master/tlpkg/tlperl/lib/Fatal.pm | 892 +- Master/tlpkg/tlperl/lib/File/Basename.pm | 18 +- Master/tlpkg/tlperl/lib/File/CheckTree.pm | 240 - Master/tlpkg/tlperl/lib/File/Copy.pm | 156 +- Master/tlpkg/tlperl/lib/File/DosGlob.pm | 6 +- Master/tlpkg/tlperl/lib/File/Fetch.pm | 62 +- Master/tlpkg/tlperl/lib/File/Find.pm | 14 +- Master/tlpkg/tlperl/lib/File/Glob.pm | 2 +- Master/tlpkg/tlperl/lib/File/Spec.pm | 2 +- Master/tlpkg/tlperl/lib/File/Spec/Cygwin.pm | 15 +- Master/tlpkg/tlperl/lib/File/Spec/Epoc.pm | 8 +- Master/tlpkg/tlperl/lib/File/Spec/Functions.pm | 24 +- Master/tlpkg/tlperl/lib/File/Spec/Mac.pm | 8 +- Master/tlpkg/tlperl/lib/File/Spec/OS2.pm | 10 +- Master/tlpkg/tlperl/lib/File/Spec/Unix.pm | 76 +- Master/tlpkg/tlperl/lib/File/Spec/VMS.pm | 23 +- Master/tlpkg/tlperl/lib/File/Spec/Win32.pm | 13 +- Master/tlpkg/tlperl/lib/File/Temp.pm | 1687 +- Master/tlpkg/tlperl/lib/File/Which.pm | 281 + Master/tlpkg/tlperl/lib/FileCache.pm | 4 +- Master/tlpkg/tlperl/lib/Filter/Simple.pm | 5 +- Master/tlpkg/tlperl/lib/Filter/Util/Call.pm | 9 +- Master/tlpkg/tlperl/lib/Getopt/Long.pm | 21 +- Master/tlpkg/tlperl/lib/Getopt/Std.pm | 45 +- Master/tlpkg/tlperl/lib/HTTP/Tiny.pm | 951 +- Master/tlpkg/tlperl/lib/Hash/Util/FieldHash.pm | 17 +- Master/tlpkg/tlperl/lib/I18N/LangTags.pm | 4 +- Master/tlpkg/tlperl/lib/IO.pm | 2 +- .../tlpkg/tlperl/lib/IO/Compress/Adapter/Bzip2.pm | 6 +- .../tlperl/lib/IO/Compress/Adapter/Deflate.pm | 6 +- .../tlperl/lib/IO/Compress/Adapter/Identity.pm | 4 +- Master/tlpkg/tlperl/lib/IO/Compress/Base.pm | 8 +- Master/tlpkg/tlperl/lib/IO/Compress/Base/Common.pm | 2 +- Master/tlpkg/tlperl/lib/IO/Compress/Bzip2.pm | 165 +- Master/tlpkg/tlperl/lib/IO/Compress/Deflate.pm | 16 +- Master/tlpkg/tlperl/lib/IO/Compress/FAQ.pod | 672 + Master/tlpkg/tlperl/lib/IO/Compress/Gzip.pm | 25 +- .../tlpkg/tlperl/lib/IO/Compress/Gzip/Constants.pm | 2 +- Master/tlpkg/tlperl/lib/IO/Compress/RawDeflate.pm | 18 +- Master/tlpkg/tlperl/lib/IO/Compress/Zip.pm | 36 +- .../tlpkg/tlperl/lib/IO/Compress/Zip/Constants.pm | 2 +- .../tlpkg/tlperl/lib/IO/Compress/Zlib/Constants.pm | 2 +- Master/tlpkg/tlperl/lib/IO/Compress/Zlib/Extra.pm | 4 +- Master/tlpkg/tlperl/lib/IO/HTML.pm | 22 +- Master/tlpkg/tlperl/lib/IO/Handle.pm | 4 +- Master/tlpkg/tlperl/lib/IO/Select.pm | 27 +- Master/tlpkg/tlperl/lib/IO/Socket.pm | 27 +- Master/tlpkg/tlperl/lib/IO/Socket/INET.pm | 9 +- Master/tlpkg/tlperl/lib/IO/Socket/IP.pm | 1107 + Master/tlpkg/tlperl/lib/IO/Socket/UNIX.pm | 34 +- .../tlperl/lib/IO/Uncompress/Adapter/Bunzip2.pm | 6 +- .../tlperl/lib/IO/Uncompress/Adapter/Identity.pm | 6 +- .../tlperl/lib/IO/Uncompress/Adapter/Inflate.pm | 6 +- .../tlpkg/tlperl/lib/IO/Uncompress/AnyInflate.pm | 30 +- .../tlperl/lib/IO/Uncompress/AnyUncompress.pm | 50 +- Master/tlpkg/tlperl/lib/IO/Uncompress/Base.pm | 10 +- Master/tlpkg/tlperl/lib/IO/Uncompress/Bunzip2.pm | 174 +- Master/tlpkg/tlperl/lib/IO/Uncompress/Gunzip.pm | 24 +- Master/tlpkg/tlperl/lib/IO/Uncompress/Inflate.pm | 20 +- .../tlpkg/tlperl/lib/IO/Uncompress/RawInflate.pm | 22 +- Master/tlpkg/tlperl/lib/IO/Uncompress/Unzip.pm | 37 +- Master/tlpkg/tlperl/lib/IPC/Cmd.pm | 593 +- Master/tlpkg/tlperl/lib/IPC/Open3.pm | 12 +- Master/tlpkg/tlperl/lib/JSON/PP.pm | 4 +- Master/tlpkg/tlperl/lib/LWP.pm | 4 +- Master/tlpkg/tlperl/lib/LWP/Authen/Ntlm.pm | 2 +- Master/tlpkg/tlperl/lib/LWP/ConnCache.pm | 2 +- Master/tlpkg/tlperl/lib/LWP/Protocol.pm | 2 +- Master/tlpkg/tlperl/lib/LWP/Protocol/http.pm | 16 +- Master/tlpkg/tlperl/lib/LWP/Protocol/https.pm | 211 - Master/tlpkg/tlperl/lib/LWP/RobotUA.pm | 2 +- Master/tlpkg/tlperl/lib/LWP/Simple.pm | 2 +- Master/tlpkg/tlperl/lib/LWP/UserAgent.pm | 6 +- Master/tlpkg/tlperl/lib/List/Util.pm | 343 +- Master/tlpkg/tlperl/lib/List/Util/XS.pm | 2 +- Master/tlpkg/tlperl/lib/Locale/Codes.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes.pod | 297 + Master/tlpkg/tlperl/lib/Locale/Codes/API.pod | 320 + Master/tlpkg/tlperl/lib/Locale/Codes/Changes.pod | 708 + Master/tlpkg/tlperl/lib/Locale/Codes/Constants.pm | 7 +- Master/tlpkg/tlperl/lib/Locale/Codes/Constants.pod | 41 + Master/tlpkg/tlperl/lib/Locale/Codes/Country.pm | 5 +- Master/tlpkg/tlperl/lib/Locale/Codes/Country.pod | 206 + .../tlpkg/tlperl/lib/Locale/Codes/Country_Codes.pm | 3047 +- .../tlperl/lib/Locale/Codes/Country_Retired.pm | 338 +- Master/tlpkg/tlperl/lib/Locale/Codes/Currency.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes/Currency.pod | 127 + .../tlperl/lib/Locale/Codes/Currency_Codes.pm | 1149 +- .../tlperl/lib/Locale/Codes/Currency_Retired.pm | 45 +- Master/tlpkg/tlperl/lib/Locale/Codes/LangExt.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes/LangExt.pod | 116 + .../tlpkg/tlperl/lib/Locale/Codes/LangExt_Codes.pm | 63 +- .../tlperl/lib/Locale/Codes/LangExt_Retired.pm | 35 +- Master/tlpkg/tlperl/lib/Locale/Codes/LangFam.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes/LangFam.pod | 116 + .../tlpkg/tlperl/lib/Locale/Codes/LangFam_Codes.pm | 37 +- .../tlperl/lib/Locale/Codes/LangFam_Retired.pm | 7 +- Master/tlpkg/tlperl/lib/Locale/Codes/LangVar.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes/LangVar.pod | 118 + .../tlpkg/tlperl/lib/Locale/Codes/LangVar_Codes.pm | 583 +- .../tlperl/lib/Locale/Codes/LangVar_Retired.pm | 36 +- Master/tlpkg/tlperl/lib/Locale/Codes/Language.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes/Language.pod | 137 + .../tlperl/lib/Locale/Codes/Language_Codes.pm | 57688 ++++++++++--------- .../tlperl/lib/Locale/Codes/Language_Retired.pm | 97 +- Master/tlpkg/tlperl/lib/Locale/Codes/Script.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Codes/Script.pod | 131 + .../tlpkg/tlperl/lib/Locale/Codes/Script_Codes.pm | 2207 +- .../tlperl/lib/Locale/Codes/Script_Retired.pm | 41 +- Master/tlpkg/tlperl/lib/Locale/Country.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Country.pod | 206 + Master/tlpkg/tlperl/lib/Locale/Currency.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Currency.pod | 127 + Master/tlpkg/tlperl/lib/Locale/Language.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Language.pod | 137 + Master/tlpkg/tlperl/lib/Locale/Maketext.pm | 7 +- Master/tlpkg/tlperl/lib/Locale/Maketext.pod | 1350 + .../tlpkg/tlperl/lib/Locale/Maketext/Cookbook.pod | 150 + Master/tlpkg/tlperl/lib/Locale/Maketext/TPJ13.pod | 775 + Master/tlpkg/tlperl/lib/Locale/Script.pm | 4 +- Master/tlpkg/tlperl/lib/Locale/Script.pod | 131 + Master/tlpkg/tlperl/lib/Log/Message.pm | 599 - Master/tlpkg/tlperl/lib/Log/Message/Config.pm | 198 - Master/tlpkg/tlperl/lib/Log/Message/Handlers.pm | 195 - Master/tlpkg/tlperl/lib/Log/Message/Item.pm | 194 - Master/tlpkg/tlperl/lib/Log/Message/Simple.pm | 296 - Master/tlpkg/tlperl/lib/MIME/Base64.pm | 2 +- Master/tlpkg/tlperl/lib/Math/BigFloat.pm | 161 +- Master/tlpkg/tlperl/lib/Math/BigFloat/Trace.pm | 2 +- Master/tlpkg/tlperl/lib/Math/BigInt.pm | 646 +- Master/tlpkg/tlperl/lib/Math/BigInt/Calc.pm | 8 +- Master/tlpkg/tlperl/lib/Math/BigInt/CalcEmu.pm | 14 +- Master/tlpkg/tlperl/lib/Math/BigInt/FastCalc.pm | 2 +- Master/tlpkg/tlperl/lib/Math/BigInt/Trace.pm | 2 +- Master/tlpkg/tlperl/lib/Math/BigRat.pm | 10 +- Master/tlpkg/tlperl/lib/Math/Int64.pm | 53 +- .../tlpkg/tlperl/lib/Math/Int64/die_on_overflow.pm | 16 +- .../tlperl/lib/Math/Int64/native_if_available.pm | 30 +- Master/tlpkg/tlperl/lib/Math/UInt64.pm | 19 +- Master/tlpkg/tlperl/lib/Module/Build.pm | 18 +- Master/tlpkg/tlperl/lib/Module/Build/API.pod | 2124 + Master/tlpkg/tlperl/lib/Module/Build/Authoring.pod | 326 + Master/tlpkg/tlperl/lib/Module/Build/Base.pm | 565 +- Master/tlpkg/tlperl/lib/Module/Build/Bundling.pod | 147 + Master/tlpkg/tlperl/lib/Module/Build/Compat.pm | 7 +- Master/tlpkg/tlperl/lib/Module/Build/Config.pm | 2 +- Master/tlpkg/tlperl/lib/Module/Build/ConfigData.pm | 64 +- Master/tlpkg/tlperl/lib/Module/Build/Cookbook.pm | 2 +- Master/tlpkg/tlperl/lib/Module/Build/Dumper.pm | 2 +- Master/tlpkg/tlperl/lib/Module/Build/ModuleInfo.pm | 2 +- Master/tlpkg/tlperl/lib/Module/Build/Notes.pm | 20 +- Master/tlpkg/tlperl/lib/Module/Build/PPMMaker.pm | 10 +- .../tlperl/lib/Module/Build/Platform/Amiga.pm | 34 - .../tlperl/lib/Module/Build/Platform/Default.pm | 2 +- .../tlperl/lib/Module/Build/Platform/EBCDIC.pm | 34 - .../tlperl/lib/Module/Build/Platform/MPEiX.pm | 34 - .../tlperl/lib/Module/Build/Platform/MacOS.pm | 2 +- .../tlperl/lib/Module/Build/Platform/RiscOS.pm | 34 - .../tlpkg/tlperl/lib/Module/Build/Platform/Unix.pm | 6 +- .../tlpkg/tlperl/lib/Module/Build/Platform/VMS.pm | 47 +- .../tlpkg/tlperl/lib/Module/Build/Platform/VOS.pm | 2 +- .../tlperl/lib/Module/Build/Platform/Windows.pm | 13 +- .../tlpkg/tlperl/lib/Module/Build/Platform/aix.pm | 2 +- .../tlperl/lib/Module/Build/Platform/cygwin.pm | 2 +- .../tlperl/lib/Module/Build/Platform/darwin.pm | 2 +- .../tlpkg/tlperl/lib/Module/Build/Platform/os2.pm | 2 +- Master/tlpkg/tlperl/lib/Module/Build/PodParser.pm | 6 +- Master/tlpkg/tlperl/lib/Module/CoreList.pm | 2053 +- Master/tlpkg/tlperl/lib/Module/CoreList.pod | 251 + .../tlperl/lib/Module/CoreList/TieHashDelta.pm | 6 +- Master/tlpkg/tlperl/lib/Module/CoreList/Utils.pm | 133 +- Master/tlpkg/tlperl/lib/Module/Load.pm | 214 +- Master/tlpkg/tlperl/lib/Module/Load/Conditional.pm | 35 +- Master/tlpkg/tlperl/lib/Module/Metadata.pm | 125 +- Master/tlpkg/tlperl/lib/Module/Pluggable.pm | 457 - Master/tlpkg/tlperl/lib/Module/Pluggable/Object.pm | 405 - Master/tlpkg/tlperl/lib/Mozilla/CA.pm | 99 + Master/tlpkg/tlperl/lib/Mozilla/CA/cacert.pem | 3894 ++ Master/tlpkg/tlperl/lib/Mozilla/mk-ca-bundle.pl | 495 + Master/tlpkg/tlperl/lib/Net/Cmd.pm | 16 +- Master/tlpkg/tlperl/lib/Net/Config.pm | 20 +- Master/tlpkg/tlperl/lib/Net/Domain.pm | 13 +- Master/tlpkg/tlperl/lib/Net/FTP.pm | 98 +- Master/tlpkg/tlperl/lib/Net/FTP/A.pm | 6 +- Master/tlpkg/tlperl/lib/Net/FTP/dataconn.pm | 11 +- Master/tlpkg/tlperl/lib/Net/HTTP.pm | 27 +- Master/tlpkg/tlperl/lib/Net/HTTP/Methods.pm | 41 +- Master/tlpkg/tlperl/lib/Net/NNTP.pm | 46 +- Master/tlpkg/tlperl/lib/Net/Netrc.pm | 20 +- Master/tlpkg/tlperl/lib/Net/POP3.pm | 38 +- Master/tlpkg/tlperl/lib/Net/Ping.pm | 17 +- Master/tlpkg/tlperl/lib/Net/SMTP.pm | 52 +- Master/tlpkg/tlperl/lib/Net/libnetFAQ.pod | 302 + Master/tlpkg/tlperl/lib/Object/Accessor.pm | 818 - Master/tlpkg/tlperl/lib/Opcode.pm | 9 +- Master/tlpkg/tlperl/lib/POSIX.pm | 31 +- Master/tlpkg/tlperl/lib/POSIX.pod | 2367 + Master/tlpkg/tlperl/lib/Package/Constants.pm | 28 +- Master/tlpkg/tlperl/lib/Params/Check.pm | 4 +- Master/tlpkg/tlperl/lib/Parse/CPAN/Meta.pm | 177 +- Master/tlpkg/tlperl/lib/Perl/OSType.pm | 50 +- Master/tlpkg/tlperl/lib/PerlIO.pm | 24 +- Master/tlpkg/tlperl/lib/PerlIO/encoding.pm | 2 +- Master/tlpkg/tlperl/lib/PerlIO/scalar.pm | 2 +- Master/tlpkg/tlperl/lib/PerlIO/via.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Escapes.pm | 61 +- Master/tlpkg/tlperl/lib/Pod/Find.pm | 6 +- Master/tlpkg/tlperl/lib/Pod/Functions.pm | 30 +- Master/tlpkg/tlperl/lib/Pod/Html.pm | 21 +- Master/tlpkg/tlperl/lib/Pod/InputObjects.pm | 8 +- Master/tlpkg/tlperl/lib/Pod/LaTeX.pm | 1883 - Master/tlpkg/tlperl/lib/Pod/Man.pm | 161 +- Master/tlpkg/tlperl/lib/Pod/ParseUtils.pm | 8 +- Master/tlpkg/tlperl/lib/Pod/Parser.pm | 28 +- Master/tlpkg/tlperl/lib/Pod/Perldoc.pm | 236 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/BaseTo.pm | 3 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/GetOptsOO.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToANSI.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToChecker.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToMan.pm | 37 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToNroff.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToPod.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToRtf.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToTerm.pm | 49 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToText.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToTk.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/Perldoc/ToXml.pm | 2 +- Master/tlpkg/tlperl/lib/Pod/PlainText.pm | 6 +- Master/tlpkg/tlperl/lib/Pod/Select.pm | 32 +- Master/tlpkg/tlperl/lib/Pod/Simple.pod | 430 + Master/tlpkg/tlperl/lib/Pod/Simple/Subclassing.pod | 1071 + Master/tlpkg/tlperl/lib/Pod/Text.pm | 48 +- Master/tlpkg/tlperl/lib/Pod/Text/Termcap.pm | 6 +- Master/tlpkg/tlperl/lib/Pod/Usage.pm | 76 +- Master/tlpkg/tlperl/lib/SDBM_File.pm | 75 +- Master/tlpkg/tlperl/lib/Safe.pm | 8 +- Master/tlpkg/tlperl/lib/Scalar/Util.pm | 288 +- Master/tlpkg/tlperl/lib/Socket.pm | 18 +- Master/tlpkg/tlperl/lib/Storable.pm | 22 +- Master/tlpkg/tlperl/lib/Sys/Hostname.pm | 4 +- Master/tlpkg/tlperl/lib/TAP/Base.pm | 15 +- Master/tlpkg/tlperl/lib/TAP/Formatter/Base.pm | 11 +- Master/tlpkg/tlperl/lib/TAP/Formatter/Color.pm | 8 +- Master/tlpkg/tlperl/lib/TAP/Formatter/Console.pm | 27 +- .../lib/TAP/Formatter/Console/ParallelSession.pm | 11 +- .../tlperl/lib/TAP/Formatter/Console/Session.pm | 10 +- Master/tlpkg/tlperl/lib/TAP/Formatter/File.pm | 10 +- .../tlpkg/tlperl/lib/TAP/Formatter/File/Session.pm | 11 +- Master/tlpkg/tlperl/lib/TAP/Formatter/Session.pm | 10 +- Master/tlpkg/tlperl/lib/TAP/Harness.pm | 58 +- Master/tlpkg/tlperl/lib/TAP/Harness/Beyond.pod | 422 + Master/tlpkg/tlperl/lib/TAP/Harness/Env.pm | 149 + Master/tlpkg/tlperl/lib/TAP/Object.pm | 13 +- Master/tlpkg/tlperl/lib/TAP/Parser.pm | 42 +- Master/tlpkg/tlperl/lib/TAP/Parser/Aggregator.pm | 10 +- Master/tlpkg/tlperl/lib/TAP/Parser/Grammar.pm | 14 +- Master/tlpkg/tlperl/lib/TAP/Parser/Iterator.pm | 13 +- .../tlpkg/tlperl/lib/TAP/Parser/Iterator/Array.pm | 10 +- .../tlperl/lib/TAP/Parser/Iterator/Process.pm | 17 +- .../tlpkg/tlperl/lib/TAP/Parser/Iterator/Stream.pm | 10 +- .../tlpkg/tlperl/lib/TAP/Parser/IteratorFactory.pm | 15 +- Master/tlpkg/tlperl/lib/TAP/Parser/Multiplexer.pm | 11 +- Master/tlpkg/tlperl/lib/TAP/Parser/Result.pm | 13 +- .../tlpkg/tlperl/lib/TAP/Parser/Result/Bailout.pm | 9 +- .../tlpkg/tlperl/lib/TAP/Parser/Result/Comment.pm | 9 +- Master/tlpkg/tlperl/lib/TAP/Parser/Result/Plan.pm | 9 +- .../tlpkg/tlperl/lib/TAP/Parser/Result/Pragma.pm | 9 +- Master/tlpkg/tlperl/lib/TAP/Parser/Result/Test.pm | 11 +- .../tlpkg/tlperl/lib/TAP/Parser/Result/Unknown.pm | 11 +- .../tlpkg/tlperl/lib/TAP/Parser/Result/Version.pm | 9 +- Master/tlpkg/tlperl/lib/TAP/Parser/Result/YAML.pm | 9 +- .../tlpkg/tlperl/lib/TAP/Parser/ResultFactory.pm | 38 +- Master/tlpkg/tlperl/lib/TAP/Parser/Scheduler.pm | 152 +- .../tlpkg/tlperl/lib/TAP/Parser/Scheduler/Job.pm | 34 +- .../tlperl/lib/TAP/Parser/Scheduler/Spinner.pm | 16 +- Master/tlpkg/tlperl/lib/TAP/Parser/Source.pm | 12 +- .../tlpkg/tlperl/lib/TAP/Parser/SourceHandler.pm | 17 +- .../lib/TAP/Parser/SourceHandler/Executable.pm | 12 +- .../tlperl/lib/TAP/Parser/SourceHandler/File.pm | 9 +- .../tlperl/lib/TAP/Parser/SourceHandler/Handle.pm | 9 +- .../tlperl/lib/TAP/Parser/SourceHandler/Perl.pm | 39 +- .../tlperl/lib/TAP/Parser/SourceHandler/RawTAP.pm | 9 +- Master/tlpkg/tlperl/lib/TAP/Parser/Utils.pm | 72 - .../tlpkg/tlperl/lib/TAP/Parser/YAMLish/Reader.pm | 9 +- .../tlpkg/tlperl/lib/TAP/Parser/YAMLish/Writer.pm | 9 +- Master/tlpkg/tlperl/lib/Term/Cap.pm | 24 +- Master/tlpkg/tlperl/lib/Term/ReadLine.pm | 12 +- Master/tlpkg/tlperl/lib/Term/UI.pm | 627 - Master/tlpkg/tlperl/lib/Term/UI/History.pm | 139 - Master/tlpkg/tlperl/lib/Test/Builder.pm | 170 +- Master/tlpkg/tlperl/lib/Test/Builder/Module.pm | 4 +- Master/tlpkg/tlperl/lib/Test/Builder/Tester.pm | 27 +- .../tlpkg/tlperl/lib/Test/Builder/Tester/Color.pm | 2 +- Master/tlpkg/tlperl/lib/Test/Harness.pm | 73 +- Master/tlpkg/tlperl/lib/Test/More.pm | 324 +- Master/tlpkg/tlperl/lib/Test/Simple.pm | 4 +- Master/tlpkg/tlperl/lib/Test/Tutorial.pod | 610 + Master/tlpkg/tlperl/lib/Text/ParseWords.pm | 2 +- Master/tlpkg/tlperl/lib/Text/Soundex.pm | 262 - Master/tlpkg/tlperl/lib/Text/Tabs.pm | 12 +- Master/tlpkg/tlperl/lib/Text/Wrap.pm | 11 +- Master/tlpkg/tlperl/lib/Thread.pm | 4 +- Master/tlpkg/tlperl/lib/Thread/Queue.pm | 48 +- Master/tlpkg/tlperl/lib/Tie/Array.pm | 10 +- Master/tlpkg/tlperl/lib/Tie/File.pm | 6 +- Master/tlpkg/tlperl/lib/Tie/Hash.pm | 12 +- Master/tlpkg/tlperl/lib/Tie/Scalar.pm | 5 +- Master/tlpkg/tlperl/lib/Tie/StdHandle.pm | 5 +- Master/tlpkg/tlperl/lib/Time/HiRes.pm | 29 +- Master/tlpkg/tlperl/lib/Time/Piece.pm | 17 +- Master/tlpkg/tlperl/lib/Time/Seconds.pm | 17 +- Master/tlpkg/tlperl/lib/Time/Zone.pm | 291 + Master/tlpkg/tlperl/lib/Tk.pm | 2 +- Master/tlpkg/tlperl/lib/Tk.pod | 865 + Master/tlpkg/tlperl/lib/Tk/804delta.pod | 110 + Master/tlpkg/tlperl/lib/Tk/Adjuster.pod | 223 + Master/tlpkg/tlperl/lib/Tk/Animation.pod | 92 + Master/tlpkg/tlperl/lib/Tk/Balloon.pod | 293 + Master/tlpkg/tlperl/lib/Tk/Bitmap.pod | 103 + Master/tlpkg/tlperl/lib/Tk/BrowseEntry.pod | 210 + Master/tlpkg/tlperl/lib/Tk/Button.pod | 255 + Master/tlpkg/tlperl/lib/Tk/Canvas.pod | 2394 + Master/tlpkg/tlperl/lib/Tk/Checkbutton.pod | 347 + Master/tlpkg/tlperl/lib/Tk/Clipboard.pod | 89 + Master/tlpkg/tlperl/lib/Tk/CmdLine.pod | 454 + Master/tlpkg/tlperl/lib/Tk/ColorEditor.pod | 120 + Master/tlpkg/tlperl/lib/Tk/Compound.pod | 298 + Master/tlpkg/tlperl/lib/Tk/Config.pm | 2 +- Master/tlpkg/tlperl/lib/Tk/ConfigSpecs.pod | 262 + Master/tlpkg/tlperl/lib/Tk/DItem.pod | 439 + Master/tlpkg/tlperl/lib/Tk/Derived.pod | 89 + Master/tlpkg/tlperl/lib/Tk/Dialog.pod | 107 + Master/tlpkg/tlperl/lib/Tk/DialogBox.pod | 156 + Master/tlpkg/tlperl/lib/Tk/DirTree.pm | 4 +- Master/tlpkg/tlperl/lib/Tk/DirTree.pod | 172 + Master/tlpkg/tlperl/lib/Tk/DragDrop/Common.pod | 16 + Master/tlpkg/tlperl/lib/Tk/DragDrop/SunConst.pod | 18 + Master/tlpkg/tlperl/lib/Tk/DropSite.pod | 33 + Master/tlpkg/tlperl/lib/Tk/Entry.pod | 693 + Master/tlpkg/tlperl/lib/Tk/Error.pod | 145 + Master/tlpkg/tlperl/lib/Tk/ErrorDialog.pod | 36 + Master/tlpkg/tlperl/lib/Tk/Event.pm | 4 +- Master/tlpkg/tlperl/lib/Tk/Eventloop.pod | 62 + Master/tlpkg/tlperl/lib/Tk/FBox.pod | 67 + Master/tlpkg/tlperl/lib/Tk/FileSelect.pod | 150 + Master/tlpkg/tlperl/lib/Tk/Font.pod | 407 + Master/tlpkg/tlperl/lib/Tk/Frame.pod | 146 + Master/tlpkg/tlperl/lib/Tk/HList.pod | 1050 + Master/tlpkg/tlperl/lib/Tk/IO.pod | 51 + Master/tlpkg/tlperl/lib/Tk/IconList.pod | 82 + Master/tlpkg/tlperl/lib/Tk/Image.pod | 145 + Master/tlpkg/tlperl/lib/Tk/InputO.pod | 50 + Master/tlpkg/tlperl/lib/Tk/Internals.pod | 142 + Master/tlpkg/tlperl/lib/Tk/LabFrame.pod | 110 + Master/tlpkg/tlperl/lib/Tk/Label.pod | 133 + Master/tlpkg/tlperl/lib/Tk/Labelframe.pod | 206 + Master/tlpkg/tlperl/lib/Tk/Listbox.pod | 794 + Master/tlpkg/tlperl/lib/Tk/MMutil.pm | 14 +- Master/tlpkg/tlperl/lib/Tk/MainWindow.pod | 85 + Master/tlpkg/tlperl/lib/Tk/Menu.pod | 876 + Master/tlpkg/tlperl/lib/Tk/Menu/Item.pod | 96 + Master/tlpkg/tlperl/lib/Tk/Menubutton.pod | 249 + Master/tlpkg/tlperl/lib/Tk/Message.pod | 151 + Master/tlpkg/tlperl/lib/Tk/MsgBox.pod | 83 + Master/tlpkg/tlperl/lib/Tk/Mwm.pod | 109 + Master/tlpkg/tlperl/lib/Tk/NoteBook.pod | 235 + Master/tlpkg/tlperl/lib/Tk/Optionmenu.pod | 100 + Master/tlpkg/tlperl/lib/Tk/Panedwindow.pod | 326 + Master/tlpkg/tlperl/lib/Tk/Photo.pod | 475 + Master/tlpkg/tlperl/lib/Tk/Pixmap.pod | 64 + Master/tlpkg/tlperl/lib/Tk/Popup.pod | 89 + Master/tlpkg/tlperl/lib/Tk/ROText.pod | 48 + Master/tlpkg/tlperl/lib/Tk/Radiobutton.pod | 333 + Master/tlpkg/tlperl/lib/Tk/Scale.pod | 356 + Master/tlpkg/tlperl/lib/Tk/Scrollbar.pod | 429 + Master/tlpkg/tlperl/lib/Tk/Scrolled.pod | 86 + Master/tlpkg/tlperl/lib/Tk/Spinbox.pod | 819 + Master/tlpkg/tlperl/lib/Tk/Submethods.pod | 27 + Master/tlpkg/tlperl/lib/Tk/TList.pod | 597 + Master/tlpkg/tlperl/lib/Tk/Table.pod | 102 + Master/tlpkg/tlperl/lib/Tk/Tcl-perl.pod | 200 + Master/tlpkg/tlperl/lib/Tk/Text.pm | 4 +- Master/tlpkg/tlperl/lib/Tk/Text.pod | 2224 + Master/tlpkg/tlperl/lib/Tk/TextUndo.pod | 73 + Master/tlpkg/tlperl/lib/Tk/Tiler.pod | 32 + Master/tlpkg/tlperl/lib/Tk/TixGrid.pod | 539 + Master/tlpkg/tlperl/lib/Tk/Tk.def | 4 - Master/tlpkg/tlperl/lib/Tk/Toplevel.pod | 199 + Master/tlpkg/tlperl/lib/Tk/Tree.pod | 274 + Master/tlpkg/tlperl/lib/Tk/UserGuide.pod | 586 + Master/tlpkg/tlperl/lib/Tk/Widget.pm | 6 +- Master/tlpkg/tlperl/lib/Tk/Widget.pod | 678 + Master/tlpkg/tlperl/lib/Tk/WidgetDemo.pod | 59 + Master/tlpkg/tlperl/lib/Tk/Wm.pod | 669 + Master/tlpkg/tlperl/lib/Tk/X.pod | 373 + Master/tlpkg/tlperl/lib/Tk/X11Font.pod | 88 + Master/tlpkg/tlperl/lib/Tk/Xrm.pod | 45 + Master/tlpkg/tlperl/lib/Tk/after.pod | 168 + Master/tlpkg/tlperl/lib/Tk/bind.pod | 583 + Master/tlpkg/tlperl/lib/Tk/bindtags.pod | 107 + Master/tlpkg/tlperl/lib/Tk/callbacks.pod | 104 + Master/tlpkg/tlperl/lib/Tk/chooseColor.pod | 64 + Master/tlpkg/tlperl/lib/Tk/chooseDirectory.pod | 95 + Master/tlpkg/tlperl/lib/Tk/composite.pod | 171 + .../tlpkg/tlperl/lib/Tk/demos/widget_lib/HList.pl | 2 +- Master/tlpkg/tlperl/lib/Tk/event.pod | 417 + Master/tlpkg/tlperl/lib/Tk/exit.pod | 42 + Master/tlpkg/tlperl/lib/Tk/fileevent.pod | 112 + Master/tlpkg/tlperl/lib/Tk/focus.pod | 166 + Master/tlpkg/tlperl/lib/Tk/form.pod | 397 + Master/tlpkg/tlperl/lib/Tk/getOpenFile.pod | 182 + Master/tlpkg/tlperl/lib/Tk/grab.pod | 140 + Master/tlpkg/tlperl/lib/Tk/grid.pod | 409 + Master/tlpkg/tlperl/lib/Tk/mega.pod | 423 + Master/tlpkg/tlperl/lib/Tk/messageBox.pod | 67 + Master/tlpkg/tlperl/lib/Tk/option.pod | 217 + Master/tlpkg/tlperl/lib/Tk/options.pod | 787 + Master/tlpkg/tlperl/lib/Tk/overview.pod | 138 + Master/tlpkg/tlperl/lib/Tk/pTk.pod | 550 + Master/tlpkg/tlperl/lib/Tk/pack.pod | 324 + Master/tlpkg/tlperl/lib/Tk/palette.pod | 89 + Master/tlpkg/tlperl/lib/Tk/place.pod | 283 + Master/tlpkg/tlperl/lib/Tk/selection.pod | 159 + Master/tlpkg/tlperl/lib/Tk/send.pod | 118 + Master/tlpkg/tlperl/lib/Tk/tixWm.pod | 73 + Master/tlpkg/tlperl/lib/Tk/tkvars.pod | 107 + Master/tlpkg/tlperl/lib/Tk/widgets.pod | 20 + Master/tlpkg/tlperl/lib/URI.pm | 48 +- Master/tlpkg/tlperl/lib/URI/Escape.pm | 18 +- Master/tlpkg/tlperl/lib/URI/Heuristic.pm | 12 +- Master/tlpkg/tlperl/lib/URI/IRI.pm | 3 +- Master/tlpkg/tlperl/lib/URI/QueryParam.pm | 1 + Master/tlpkg/tlperl/lib/URI/Split.pm | 7 +- Master/tlpkg/tlperl/lib/URI/URL.pm | 18 +- Master/tlpkg/tlperl/lib/URI/WithBase.pm | 11 +- Master/tlpkg/tlperl/lib/URI/_foreign.pm | 6 +- Master/tlpkg/tlperl/lib/URI/_generic.pm | 10 +- Master/tlpkg/tlperl/lib/URI/_idna.pm | 2 + Master/tlpkg/tlperl/lib/URI/_ldap.pm | 8 +- Master/tlpkg/tlperl/lib/URI/_login.pm | 7 +- Master/tlpkg/tlperl/lib/URI/_punycode.pm | 7 +- Master/tlpkg/tlperl/lib/URI/_query.pm | 4 +- Master/tlpkg/tlperl/lib/URI/_segment.pm | 2 + Master/tlpkg/tlperl/lib/URI/_server.pm | 8 +- Master/tlpkg/tlperl/lib/URI/_userpass.pm | 8 +- Master/tlpkg/tlperl/lib/URI/data.pm | 8 +- Master/tlpkg/tlperl/lib/URI/file.pm | 11 +- Master/tlpkg/tlperl/lib/URI/file/Base.pm | 2 + Master/tlpkg/tlperl/lib/URI/file/FAT.pm | 6 +- Master/tlpkg/tlperl/lib/URI/file/Mac.pm | 7 +- Master/tlpkg/tlperl/lib/URI/file/OS2.pm | 6 +- Master/tlpkg/tlperl/lib/URI/file/QNX.pm | 6 +- Master/tlpkg/tlperl/lib/URI/file/Unix.pm | 7 +- Master/tlpkg/tlperl/lib/URI/file/Win32.pm | 7 +- Master/tlpkg/tlperl/lib/URI/ftp.pm | 7 +- Master/tlpkg/tlperl/lib/URI/gopher.pm | 9 +- Master/tlpkg/tlperl/lib/URI/http.pm | 6 +- Master/tlpkg/tlperl/lib/URI/https.pm | 7 +- Master/tlpkg/tlperl/lib/URI/ldap.pm | 8 +- Master/tlpkg/tlperl/lib/URI/ldapi.pm | 7 +- Master/tlpkg/tlperl/lib/URI/ldaps.pm | 7 +- Master/tlpkg/tlperl/lib/URI/mailto.pm | 7 +- Master/tlpkg/tlperl/lib/URI/mms.pm | 6 +- Master/tlpkg/tlperl/lib/URI/news.pm | 9 +- Master/tlpkg/tlperl/lib/URI/nntp.pm | 6 +- Master/tlpkg/tlperl/lib/URI/pop.pm | 11 +- Master/tlpkg/tlperl/lib/URI/rlogin.pm | 7 +- Master/tlpkg/tlperl/lib/URI/rsync.pm | 6 +- Master/tlpkg/tlperl/lib/URI/rtsp.pm | 6 +- Master/tlpkg/tlperl/lib/URI/rtspu.pm | 6 +- Master/tlpkg/tlperl/lib/URI/sip.pm | 11 +- Master/tlpkg/tlperl/lib/URI/sips.pm | 7 +- Master/tlpkg/tlperl/lib/URI/snews.pm | 6 +- Master/tlpkg/tlperl/lib/URI/ssh.pm | 7 +- Master/tlpkg/tlperl/lib/URI/telnet.pm | 7 +- Master/tlpkg/tlperl/lib/URI/tn3270.pm | 7 +- Master/tlpkg/tlperl/lib/URI/urn.pm | 9 +- Master/tlpkg/tlperl/lib/URI/urn/isbn.pm | 7 +- Master/tlpkg/tlperl/lib/URI/urn/oid.pm | 6 +- Master/tlpkg/tlperl/lib/Unicode/Collate.pm | 179 +- .../tlpkg/tlperl/lib/Unicode/Collate/CJK/Korean.pm | 26 +- Master/tlpkg/tlperl/lib/Unicode/Collate/Locale.pm | 4 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/af.pl | 6 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ar.pl | 24 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/as.pl | 20 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/az.pl | 94 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/be.pl | 72 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/bg.pl | 76 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/bn.pl | 12 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ca.pl | 28 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/cs.pl | 44 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/cy.pl | 52 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/da.pl | 146 +- .../tlperl/lib/Unicode/Collate/Locale/de_phone.pl | 52 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ee.pl | 64 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/eo.pl | 52 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/es.pl | 12 +- .../tlperl/lib/Unicode/Collate/Locale/es_trad.pl | 24 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/et.pl | 100 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/fa.pl | 96 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/fi.pl | 121 +- .../tlperl/lib/Unicode/Collate/Locale/fi_phone.pl | 117 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/fil.pl | 18 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/fo.pl | 146 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/gu.pl | 12 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ha.pl | 24 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/haw.pl | 67 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/hi.pl | 12 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/hr.pl | 90 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/hu.pl | 296 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/hy.pl | 12 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ig.pl | 102 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/is.pl | 154 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ja.pl | 3774 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/kk.pl | 92 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/kl.pl | 142 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/kn.pl | 14 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ko.pl | 1284 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/kok.pl | 20 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ln.pl | 18 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/lt.pl | 88 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/lv.pl | 68 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/mk.pl | 76 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ml.pl | 40 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/mr.pl | 22 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/mt.pl | 53 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/nb.pl | 144 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/nn.pl | 144 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/nso.pl | 68 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/om.pl | 38 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/or.pl | 18 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/pa.pl | 48 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/pl.pl | 96 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ro.pl | 100 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ru.pl | 76 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/sa.pl | 22 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/se.pl | 290 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/si.pl | 14 +- .../tlperl/lib/Unicode/Collate/Locale/si_dict.pl | 12 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/sk.pl | 84 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/sl.pl | 28 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/sq.pl | 92 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/sr.pl | 84 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/sv.pl | 170 +- .../tlperl/lib/Unicode/Collate/Locale/sv_refo.pl | 166 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ta.pl | 104 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/te.pl | 12 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/th.pl | 36 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/tn.pl | 68 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/to.pl | 118 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/tr.pl | 86 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/uk.pl | 76 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/ur.pl | 172 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/vi.pl | 434 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/wae.pl | 42 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/wo.pl | 56 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/yo.pl | 46 +- .../tlpkg/tlperl/lib/Unicode/Collate/Locale/zh.pl | 416 +- .../tlperl/lib/Unicode/Collate/Locale/zh_big5.pl | 1880 +- .../tlperl/lib/Unicode/Collate/Locale/zh_gb.pl | 1244 +- .../tlperl/lib/Unicode/Collate/Locale/zh_pin.pl | 3000 +- .../tlperl/lib/Unicode/Collate/Locale/zh_strk.pl | 3168 +- .../tlperl/lib/Unicode/Collate/Locale/zh_zhu.pl | 3116 +- .../tlpkg/tlperl/lib/Unicode/Collate/allkeys.txt | 50282 ++++++++-------- Master/tlpkg/tlperl/lib/Unicode/Normalize.pm | 10 +- Master/tlpkg/tlperl/lib/Unicode/UCD.pm | 874 +- Master/tlpkg/tlperl/lib/Win32.pm | 10 +- Master/tlpkg/tlperl/lib/Win32/API.pm | 2 +- Master/tlpkg/tlperl/lib/Win32/API/Callback.pm | 14 +- .../tlperl/lib/Win32/API/Callback/IATPatch.pod | 181 + Master/tlpkg/tlperl/lib/Win32/Console.pm | 1463 + Master/tlpkg/tlperl/lib/Win32/OLE.pm | 4 +- Master/tlpkg/tlperl/lib/Win32/OLE/NEWS.pod | 380 + Master/tlpkg/tlperl/lib/Win32/OLE/TPJ.pod | 798 + Master/tlpkg/tlperl/lib/Win32/Process/Info.pm | 1005 - Master/tlpkg/tlperl/lib/Win32/Process/Info/NT.pm | 865 - Master/tlpkg/tlperl/lib/Win32/Process/Info/PT.pm | 306 - Master/tlpkg/tlperl/lib/Win32/Process/Info/WMI.pm | 430 - Master/tlpkg/tlperl/lib/Win32/TieRegistry.pm | 51 +- Master/tlpkg/tlperl/lib/Win32/WinError.pm | 1017 + Master/tlpkg/tlperl/lib/Win32API/Registry.pm | 36 +- Master/tlpkg/tlperl/lib/XSLoader.pm | 4 +- Master/tlpkg/tlperl/lib/_charnames.pm | 34 +- Master/tlpkg/tlperl/lib/arybase.pm | 2 +- Master/tlpkg/tlperl/lib/attributes.pm | 15 +- Master/tlpkg/tlperl/lib/auto/B/B.bs | 0 Master/tlpkg/tlperl/lib/auto/B/B.dll | Bin 79360 -> 82432 bytes .../tlperl/lib/auto/Compress/Raw/Bzip2/Bzip2.bs | 0 .../tlperl/lib/auto/Compress/Raw/Bzip2/Bzip2.dll | Bin 100352 -> 101376 bytes .../lib/auto/Compress/Raw/Bzip2/autosplit.ix | 3 - .../tlperl/lib/auto/Compress/Raw/Zlib/Zlib.bs | 0 .../tlperl/lib/auto/Compress/Raw/Zlib/Zlib.dll | Bin 140288 -> 142336 bytes .../tlperl/lib/auto/Compress/Raw/Zlib/autosplit.ix | 3 - Master/tlpkg/tlperl/lib/auto/Cwd/Cwd.bs | 0 Master/tlpkg/tlperl/lib/auto/Cwd/Cwd.dll | Bin 15360 -> 22528 bytes Master/tlpkg/tlperl/lib/auto/Data/Dumper/Dumper.bs | 0 .../tlpkg/tlperl/lib/auto/Data/Dumper/Dumper.dll | Bin 41472 -> 45568 bytes Master/tlpkg/tlperl/lib/auto/Date/Parse/.packlist | 37 + .../tlpkg/tlperl/lib/auto/Devel/PPPort/PPPort.bs | 0 .../tlpkg/tlperl/lib/auto/Devel/PPPort/PPPort.dll | Bin 125952 -> 110592 bytes Master/tlpkg/tlperl/lib/auto/Devel/Peek/Peek.bs | 0 Master/tlpkg/tlperl/lib/auto/Devel/Peek/Peek.dll | Bin 21504 -> 23040 bytes Master/tlpkg/tlperl/lib/auto/Digest/MD5/MD5.bs | 0 Master/tlpkg/tlperl/lib/auto/Digest/MD5/MD5.dll | Bin 24064 -> 24576 bytes Master/tlpkg/tlperl/lib/auto/Digest/SHA/SHA.bs | 0 Master/tlpkg/tlperl/lib/auto/Digest/SHA/SHA.dll | Bin 56320 -> 55808 bytes Master/tlpkg/tlperl/lib/auto/Digest/SHA1/.packlist | 5 +- Master/tlpkg/tlperl/lib/auto/Digest/SHA1/SHA1.bs | 0 Master/tlpkg/tlperl/lib/auto/Digest/SHA1/SHA1.dll | Bin 24064 -> 25600 bytes Master/tlpkg/tlperl/lib/auto/Encode/Byte/Byte.bs | 0 Master/tlpkg/tlperl/lib/auto/Encode/Byte/Byte.dll | Bin 115712 -> 117248 bytes Master/tlpkg/tlperl/lib/auto/Encode/CN/CN.bs | 0 Master/tlpkg/tlperl/lib/auto/Encode/CN/CN.dll | Bin 747008 -> 748544 bytes .../tlpkg/tlperl/lib/auto/Encode/EBCDIC/EBCDIC.bs | 0 .../tlpkg/tlperl/lib/auto/Encode/EBCDIC/EBCDIC.dll | Bin 22528 -> 24064 bytes Master/tlpkg/tlperl/lib/auto/Encode/Encode.bs | 0 Master/tlpkg/tlperl/lib/auto/Encode/Encode.dll | Bin 38912 -> 40960 bytes Master/tlpkg/tlperl/lib/auto/Encode/JP/JP.bs | 0 Master/tlpkg/tlperl/lib/auto/Encode/JP/JP.dll | Bin 863232 -> 864768 bytes Master/tlpkg/tlperl/lib/auto/Encode/KR/KR.bs | 0 Master/tlpkg/tlperl/lib/auto/Encode/KR/KR.dll | Bin 818176 -> 819712 bytes .../tlpkg/tlperl/lib/auto/Encode/Locale/.packlist | 2 +- .../tlpkg/tlperl/lib/auto/Encode/Symbol/Symbol.bs | 0 .../tlpkg/tlperl/lib/auto/Encode/Symbol/Symbol.dll | Bin 26112 -> 27648 bytes Master/tlpkg/tlperl/lib/auto/Encode/TW/TW.bs | 0 Master/tlpkg/tlperl/lib/auto/Encode/TW/TW.dll | Bin 763904 -> 765440 bytes .../tlperl/lib/auto/Encode/Unicode/Unicode.bs | 0 .../tlperl/lib/auto/Encode/Unicode/Unicode.dll | Bin 31232 -> 32768 bytes .../tlpkg/tlperl/lib/auto/Encode/compat/.packlist | 4 + Master/tlpkg/tlperl/lib/auto/Fcntl/Fcntl.bs | 0 Master/tlpkg/tlperl/lib/auto/Fcntl/Fcntl.dll | Bin 19456 -> 20480 bytes .../tlpkg/tlperl/lib/auto/File/DosGlob/DosGlob.bs | 0 .../tlpkg/tlperl/lib/auto/File/DosGlob/DosGlob.dll | Bin 12800 -> 13824 bytes Master/tlpkg/tlperl/lib/auto/File/Glob/Glob.bs | 0 Master/tlpkg/tlperl/lib/auto/File/Glob/Glob.dll | Bin 28672 -> 29696 bytes .../tlpkg/tlperl/lib/auto/File/Listing/.packlist | 2 +- Master/tlpkg/tlperl/lib/auto/File/Which/.packlist | 3 + .../tlpkg/tlperl/lib/auto/Filter/Util/Call/Call.bs | 0 .../tlperl/lib/auto/Filter/Util/Call/Call.dll | Bin 17920 -> 18944 bytes Master/tlpkg/tlperl/lib/auto/HTML/Parser/.packlist | 17 +- Master/tlpkg/tlperl/lib/auto/HTML/Parser/Parser.bs | 0 .../tlpkg/tlperl/lib/auto/HTML/Parser/Parser.dll | Bin 55808 -> 56320 bytes Master/tlpkg/tlperl/lib/auto/HTML/Tagset/.packlist | 2 +- .../tlpkg/tlperl/lib/auto/HTTP/Cookies/.packlist | 6 +- Master/tlpkg/tlperl/lib/auto/HTTP/Daemon/.packlist | 2 +- Master/tlpkg/tlperl/lib/auto/HTTP/Date/.packlist | 2 +- .../tlpkg/tlperl/lib/auto/HTTP/Message/.packlist | 20 +- .../tlpkg/tlperl/lib/auto/HTTP/Negotiate/.packlist | 2 +- .../lib/auto/Hash/Util/FieldHash/FieldHash.bs | 0 .../lib/auto/Hash/Util/FieldHash/FieldHash.dll | Bin 20992 -> 22528 bytes Master/tlpkg/tlperl/lib/auto/Hash/Util/Util.bs | 0 Master/tlpkg/tlperl/lib/auto/Hash/Util/Util.dll | Bin 19456 -> 20480 bytes Master/tlpkg/tlperl/lib/auto/IO/HTML/.packlist | 2 +- Master/tlpkg/tlperl/lib/auto/IO/IO.bs | 0 Master/tlpkg/tlperl/lib/auto/IO/IO.dll | Bin 24064 -> 25088 bytes Master/tlpkg/tlperl/lib/auto/IO/String/.packlist | 2 +- Master/tlpkg/tlperl/lib/auto/LWP/.packlist | 66 +- .../tlpkg/tlperl/lib/auto/LWP/MediaTypes/.packlist | 4 +- .../tlperl/lib/auto/LWP/Protocol/https/.packlist | 1 - Master/tlpkg/tlperl/lib/auto/List/Util/Util.bs | 0 Master/tlpkg/tlperl/lib/auto/List/Util/Util.dll | Bin 30720 -> 51200 bytes Master/tlpkg/tlperl/lib/auto/MIME/Base64/Base64.bs | 0 .../tlpkg/tlperl/lib/auto/MIME/Base64/Base64.dll | Bin 19968 -> 21504 bytes .../lib/auto/Math/BigInt/FastCalc/FastCalc.bs | 0 .../lib/auto/Math/BigInt/FastCalc/FastCalc.dll | Bin 19968 -> 21504 bytes Master/tlpkg/tlperl/lib/auto/Math/Int64/.packlist | 11 +- Master/tlpkg/tlperl/lib/auto/Math/Int64/Int64.bs | 0 Master/tlpkg/tlperl/lib/auto/Math/Int64/Int64.dll | Bin 81920 -> 82944 bytes Master/tlpkg/tlperl/lib/auto/Mozilla/CA/.packlist | 3 + Master/tlpkg/tlperl/lib/auto/Net/HTTP/.packlist | 8 +- Master/tlpkg/tlperl/lib/auto/Opcode/Opcode.bs | 0 Master/tlpkg/tlperl/lib/auto/Opcode/Opcode.dll | Bin 25600 -> 27136 bytes Master/tlpkg/tlperl/lib/auto/POSIX/POSIX.bs | 0 Master/tlpkg/tlperl/lib/auto/POSIX/POSIX.dll | Bin 96256 -> 98816 bytes .../tlperl/lib/auto/PerlIO/encoding/encoding.bs | 0 .../tlperl/lib/auto/PerlIO/encoding/encoding.dll | Bin 28672 -> 30208 bytes Master/tlpkg/tlperl/lib/auto/PerlIO/mmap/mmap.bs | 0 Master/tlpkg/tlperl/lib/auto/PerlIO/mmap/mmap.dll | Bin 12288 -> 13312 bytes .../tlpkg/tlperl/lib/auto/PerlIO/scalar/scalar.bs | 0 .../tlpkg/tlperl/lib/auto/PerlIO/scalar/scalar.dll | Bin 17920 -> 19456 bytes Master/tlpkg/tlperl/lib/auto/PerlIO/via/via.bs | 0 Master/tlpkg/tlperl/lib/auto/PerlIO/via/via.dll | Bin 22528 -> 23552 bytes .../tlpkg/tlperl/lib/auto/SDBM_File/SDBM_File.bs | 0 .../tlpkg/tlperl/lib/auto/SDBM_File/SDBM_File.dll | Bin 34816 -> 35840 bytes Master/tlpkg/tlperl/lib/auto/Socket/.packlist | 2 + Master/tlpkg/tlperl/lib/auto/Socket/Socket.bs | 0 Master/tlpkg/tlperl/lib/auto/Socket/Socket.dll | Bin 29696 -> 35328 bytes Master/tlpkg/tlperl/lib/auto/Storable/Storable.bs | 0 Master/tlpkg/tlperl/lib/auto/Storable/Storable.dll | Bin 116736 -> 117760 bytes .../tlpkg/tlperl/lib/auto/Sys/Hostname/Hostname.bs | 0 .../tlperl/lib/auto/Sys/Hostname/Hostname.dll | Bin 12288 -> 13824 bytes .../tlpkg/tlperl/lib/auto/Text/Soundex/Soundex.bs | 0 .../tlpkg/tlperl/lib/auto/Text/Soundex/Soundex.dll | Bin 14336 -> 0 bytes .../lib/auto/Tie/Hash/NamedCapture/NamedCapture.bs | 0 .../auto/Tie/Hash/NamedCapture/NamedCapture.dll | Bin 16896 -> 17920 bytes Master/tlpkg/tlperl/lib/auto/Time/HiRes/HiRes.bs | 0 Master/tlpkg/tlperl/lib/auto/Time/HiRes/HiRes.dll | Bin 25600 -> 26624 bytes Master/tlpkg/tlperl/lib/auto/Time/Piece/Piece.bs | 0 Master/tlpkg/tlperl/lib/auto/Time/Piece/Piece.dll | Bin 29696 -> 27136 bytes Master/tlpkg/tlperl/lib/auto/Tk/.packlist | 1309 +- Master/tlpkg/tlperl/lib/auto/Tk/Canvas/Canvas.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Canvas/Canvas.dll | Bin 208384 -> 210944 bytes .../tlpkg/tlperl/lib/auto/Tk/Compound/Compound.bs | 0 .../tlpkg/tlperl/lib/auto/Tk/Compound/Compound.dll | Bin 26624 -> 27648 bytes .../tlpkg/tlperl/lib/auto/Tk/DirSelect/.packlist | 2 +- .../lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs | 0 .../lib/auto/Tk/DragDrop/Win32Site/Win32Site.dll | Bin 16896 -> 17408 bytes Master/tlpkg/tlperl/lib/auto/Tk/Entry/Entry.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Entry/Entry.dll | Bin 52736 -> 53760 bytes Master/tlpkg/tlperl/lib/auto/Tk/Event/Event.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Event/Event.dll | Bin 63488 -> 65024 bytes Master/tlpkg/tlperl/lib/auto/Tk/HList/HList.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/HList/HList.dll | Bin 66048 -> 67584 bytes Master/tlpkg/tlperl/lib/auto/Tk/IO/IO.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/IO/IO.dll | Bin 16384 -> 17408 bytes Master/tlpkg/tlperl/lib/auto/Tk/JPEG/JPEG.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/JPEG/JPEG.dll | Bin 24064 -> 128512 bytes Master/tlpkg/tlperl/lib/auto/Tk/Listbox/Listbox.bs | 0 .../tlpkg/tlperl/lib/auto/Tk/Listbox/Listbox.dll | Bin 40448 -> 40960 bytes .../tlperl/lib/auto/Tk/Menubutton/Menubutton.bs | 0 .../tlperl/lib/auto/Tk/Menubutton/Menubutton.dll | Bin 27136 -> 28160 bytes Master/tlpkg/tlperl/lib/auto/Tk/NBFrame/NBFrame.bs | 0 .../tlpkg/tlperl/lib/auto/Tk/NBFrame/NBFrame.dll | Bin 30208 -> 30720 bytes Master/tlpkg/tlperl/lib/auto/Tk/PNG/PNG.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/PNG/PNG.dll | Bin 20992 -> 215040 bytes Master/tlpkg/tlperl/lib/auto/Tk/Pixmap/Pixmap.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Pixmap/Pixmap.dll | Bin 33792 -> 34304 bytes Master/tlpkg/tlperl/lib/auto/Tk/Scale/Scale.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Scale/Scale.dll | Bin 31744 -> 32256 bytes .../tlperl/lib/auto/Tk/Scrollbar/Scrollbar.bs | 0 .../tlperl/lib/auto/Tk/Scrollbar/Scrollbar.dll | Bin 28160 -> 28672 bytes Master/tlpkg/tlperl/lib/auto/Tk/TList/TList.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/TList/TList.dll | Bin 36864 -> 38400 bytes Master/tlpkg/tlperl/lib/auto/Tk/Text/Text.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Text/Text.dll | Bin 129536 -> 130560 bytes Master/tlpkg/tlperl/lib/auto/Tk/TixGrid/TixGrid.bs | 0 .../tlpkg/tlperl/lib/auto/Tk/TixGrid/TixGrid.dll | Bin 83456 -> 84992 bytes Master/tlpkg/tlperl/lib/auto/Tk/Tk.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Tk.dll | Bin 931840 -> 941056 bytes Master/tlpkg/tlperl/lib/auto/Tk/Widget/bindDump.al | 4 +- Master/tlpkg/tlperl/lib/auto/Tk/X/X.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/X/X.dll | Bin 30720 -> 31744 bytes Master/tlpkg/tlperl/lib/auto/Tk/Xlib/Xlib.bs | 0 Master/tlpkg/tlperl/lib/auto/Tk/Xlib/Xlib.dll | Bin 36864 -> 37888 bytes Master/tlpkg/tlperl/lib/auto/URI/.packlist | 104 +- .../tlperl/lib/auto/Unicode/Collate/Collate.bs | 0 .../tlperl/lib/auto/Unicode/Collate/Collate.dll | Bin 564736 -> 528896 bytes .../tlperl/lib/auto/Unicode/Normalize/Normalize.bs | 0 .../lib/auto/Unicode/Normalize/Normalize.dll | Bin 212480 -> 212992 bytes .../tlpkg/tlperl/lib/auto/WWW/RobotRules/.packlist | 4 +- Master/tlpkg/tlperl/lib/auto/Win32/API/.packlist | 18 +- Master/tlpkg/tlperl/lib/auto/Win32/API/API.bs | 0 Master/tlpkg/tlperl/lib/auto/Win32/API/API.dll | Bin 31744 -> 33280 bytes .../tlperl/lib/auto/Win32/API/Callback/Callback.bs | 0 .../lib/auto/Win32/API/Callback/Callback.dll | Bin 24064 -> 25088 bytes .../tlpkg/tlperl/lib/auto/Win32/Console/.packlist | 2 + .../tlperl/lib/auto/Win32/Console/Console.dll | Bin 0 -> 59904 bytes Master/tlpkg/tlperl/lib/auto/Win32/OLE/.packlist | 23 +- Master/tlpkg/tlperl/lib/auto/Win32/OLE/OLE.bs | 0 Master/tlpkg/tlperl/lib/auto/Win32/OLE/OLE.dll | Bin 164352 -> 148480 bytes .../tlperl/lib/auto/Win32/Process/Info/.packlist | 4 - .../tlpkg/tlperl/lib/auto/Win32/Shortcut/.packlist | 5 +- .../tlperl/lib/auto/Win32/Shortcut/Shortcut.bs | 0 .../tlperl/lib/auto/Win32/Shortcut/Shortcut.dll | Bin 41472 -> 52224 bytes .../tlperl/lib/auto/Win32/TieRegistry/.packlist | 4 +- Master/tlpkg/tlperl/lib/auto/Win32/Win32.bs | 0 Master/tlpkg/tlperl/lib/auto/Win32/Win32.dll | Bin 56320 -> 58368 bytes Master/tlpkg/tlperl/lib/auto/Win32API/File/File.bs | 0 .../tlpkg/tlperl/lib/auto/Win32API/File/File.dll | Bin 105472 -> 107008 bytes .../tlperl/lib/auto/Win32API/Registry/.packlist | 7 +- .../tlperl/lib/auto/Win32API/Registry/Registry.bs | 0 .../tlperl/lib/auto/Win32API/Registry/Registry.dll | Bin 228352 -> 229888 bytes Master/tlpkg/tlperl/lib/auto/arybase/arybase.bs | 0 Master/tlpkg/tlperl/lib/auto/arybase/arybase.dll | Bin 25088 -> 26112 bytes .../tlpkg/tlperl/lib/auto/attributes/attributes.bs | 0 .../tlperl/lib/auto/attributes/attributes.dll | Bin 16384 -> 17920 bytes Master/tlpkg/tlperl/lib/auto/mro/mro.bs | 0 Master/tlpkg/tlperl/lib/auto/mro/mro.dll | Bin 25088 -> 26112 bytes Master/tlpkg/tlperl/lib/auto/re/re.bs | 0 Master/tlpkg/tlperl/lib/auto/re/re.dll | Bin 421888 -> 460800 bytes .../tlpkg/tlperl/lib/auto/threads/shared/shared.bs | 0 .../tlperl/lib/auto/threads/shared/shared.dll | Bin 40448 -> 41472 bytes Master/tlpkg/tlperl/lib/auto/threads/threads.bs | 0 Master/tlpkg/tlperl/lib/auto/threads/threads.dll | Bin 40960 -> 42496 bytes Master/tlpkg/tlperl/lib/autodie.pm | 14 +- Master/tlpkg/tlperl/lib/autodie/exception.pm | 32 +- .../tlpkg/tlperl/lib/autodie/exception/system.pm | 4 +- Master/tlpkg/tlperl/lib/autodie/hints.pm | 6 +- Master/tlpkg/tlperl/lib/autodie/skip.pm | 54 + Master/tlpkg/tlperl/lib/autouse.pm | 2 +- Master/tlpkg/tlperl/lib/base.pm | 31 +- Master/tlpkg/tlperl/lib/bigint.pm | 4 +- Master/tlpkg/tlperl/lib/bignum.pm | 4 +- Master/tlpkg/tlperl/lib/bigrat.pm | 3 +- Master/tlpkg/tlperl/lib/charnames.pm | 14 +- Master/tlpkg/tlperl/lib/constant.pm | 74 +- Master/tlpkg/tlperl/lib/deprecate.pm | 6 +- Master/tlpkg/tlperl/lib/diagnostics.pm | 25 +- Master/tlpkg/tlperl/lib/encoding.pm | 11 +- Master/tlpkg/tlperl/lib/experimental.pm | 151 + Master/tlpkg/tlperl/lib/feature.pm | 57 +- Master/tlpkg/tlperl/lib/fields.pm | 69 +- Master/tlpkg/tlperl/lib/if.pm | 50 +- Master/tlpkg/tlperl/lib/inc/latest.pm | 8 +- Master/tlpkg/tlperl/lib/inc/latest/private.pm | 11 +- Master/tlpkg/tlperl/lib/integer.pm | 4 +- Master/tlpkg/tlperl/lib/locale.pm | 41 +- Master/tlpkg/tlperl/lib/lwpcook.pod | 311 + Master/tlpkg/tlperl/lib/lwptut.pod | 839 + Master/tlpkg/tlperl/lib/mro.pm | 6 +- Master/tlpkg/tlperl/lib/parent.pm | 2 +- Master/tlpkg/tlperl/lib/perl5db.pl | 209 +- Master/tlpkg/tlperl/lib/perlfaq.pm | 2 +- Master/tlpkg/tlperl/lib/perllocal.pod | 682 + Master/tlpkg/tlperl/lib/re.pm | 4 +- Master/tlpkg/tlperl/lib/strict.pm | 8 +- Master/tlpkg/tlperl/lib/subs.pm | 4 +- Master/tlpkg/tlperl/lib/threads.pm | 33 +- Master/tlpkg/tlperl/lib/threads/shared.pm | 36 +- Master/tlpkg/tlperl/lib/unicore/Blocks.txt | 4 +- Master/tlpkg/tlperl/lib/unicore/CombiningClass.pl | 349 +- Master/tlpkg/tlperl/lib/unicore/Decomposition.pl | 965 +- Master/tlpkg/tlperl/lib/unicore/Heavy.pl | 6184 +- Master/tlpkg/tlperl/lib/unicore/Name.pl | 26 +- Master/tlpkg/tlperl/lib/unicore/Name.pm | 5 +- Master/tlpkg/tlperl/lib/unicore/NamedSequences.txt | 19 +- Master/tlpkg/tlperl/lib/unicore/SpecialCasing.txt | 8 +- Master/tlpkg/tlperl/lib/unicore/To/Age.pl | 737 +- Master/tlpkg/tlperl/lib/unicore/To/Bc.pl | 405 +- Master/tlpkg/tlperl/lib/unicore/To/Bmg.pl | 2 +- Master/tlpkg/tlperl/lib/unicore/To/Bpb.pl | 140 + Master/tlpkg/tlperl/lib/unicore/To/Bpt.pl | 140 + Master/tlpkg/tlperl/lib/unicore/To/Cf.pl | 1267 +- Master/tlpkg/tlperl/lib/unicore/To/Digit.pl | 2 +- Master/tlpkg/tlperl/lib/unicore/To/Ea.pl | 137 +- Master/tlpkg/tlperl/lib/unicore/To/Fold.pl | 2 +- Master/tlpkg/tlperl/lib/unicore/To/GCB.pl | 322 +- Master/tlpkg/tlperl/lib/unicore/To/Gc.pl | 1972 +- Master/tlpkg/tlperl/lib/unicore/To/Hst.pl | 5 +- Master/tlpkg/tlperl/lib/unicore/To/Isc.pl | 5 +- Master/tlpkg/tlperl/lib/unicore/To/Jg.pl | 279 +- Master/tlpkg/tlperl/lib/unicore/To/Jt.pl | 348 +- Master/tlpkg/tlperl/lib/unicore/To/Lb.pl | 840 +- Master/tlpkg/tlperl/lib/unicore/To/Lc.pl | 1243 +- Master/tlpkg/tlperl/lib/unicore/To/Lower.pl | 2 +- Master/tlpkg/tlperl/lib/unicore/To/NFCQC.pl | 119 +- Master/tlpkg/tlperl/lib/unicore/To/NFDQC.pl | 199 +- Master/tlpkg/tlperl/lib/unicore/To/NFKCCF.pl | 4 +- Master/tlpkg/tlperl/lib/unicore/To/NFKCQC.pl | 173 +- Master/tlpkg/tlperl/lib/unicore/To/NFKDQC.pl | 235 +- Master/tlpkg/tlperl/lib/unicore/To/Na1.pl | 1721 +- Master/tlpkg/tlperl/lib/unicore/To/NameAlia.pl | 348 +- Master/tlpkg/tlperl/lib/unicore/To/Nt.pl | 55 +- Master/tlpkg/tlperl/lib/unicore/To/Nv.pl | 112 +- Master/tlpkg/tlperl/lib/unicore/To/PerlDeci.pl | 37 +- Master/tlpkg/tlperl/lib/unicore/To/SB.pl | 1685 +- Master/tlpkg/tlperl/lib/unicore/To/Sc.pl | 483 +- Master/tlpkg/tlperl/lib/unicore/To/Scx.pl | 498 +- Master/tlpkg/tlperl/lib/unicore/To/Tc.pl | 1259 +- Master/tlpkg/tlperl/lib/unicore/To/Title.pl | 2 +- Master/tlpkg/tlperl/lib/unicore/To/Uc.pl | 1259 +- Master/tlpkg/tlperl/lib/unicore/To/Upper.pl | 2 +- Master/tlpkg/tlperl/lib/unicore/To/WB.pl | 593 +- Master/tlpkg/tlperl/lib/unicore/UCD.pl | 149 +- Master/tlpkg/tlperl/lib/unicore/lib/AHex/Y.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Age/NA.pl | 1651 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V11.pl | 870 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V20.pl | 93 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V21.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Age/V30.pl | 369 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V31.pl | 114 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V32.pl | 183 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V40.pl | 237 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V41.pl | 264 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V50.pl | 111 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V51.pl | 273 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V52.pl | 276 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V60.pl | 324 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V61.pl | 273 +- Master/tlpkg/tlperl/lib/unicore/lib/Age/V62.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Alpha/Y.pl | 1626 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/AL.pl | 72 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/AN.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/B.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/BN.pl | 97 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/CS.pl | 45 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/EN.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/ES.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/ET.pl | 72 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/L.pl | 1054 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/LRE.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Bc/LRO.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Bc/NSM.pl | 656 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/ON.pl | 519 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/PDF.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Bc/R.pl | 93 +- Master/tlpkg/tlperl/lib/unicore/lib/Bc/RLE.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Bc/RLO.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Bc/S.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Bc/WS.pl | 28 +- Master/tlpkg/tlperl/lib/unicore/lib/BidiC/Y.pl | 16 +- Master/tlpkg/tlperl/lib/unicore/lib/BidiM/Y.pl | 339 +- Master/tlpkg/tlperl/lib/unicore/lib/Blk/ASCII.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/AegeanNu.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Alchemic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Alphabet.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Ancient2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/AncientG.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/AncientS.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Arabic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/ArabicEx.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/ArabicMa.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/ArabicP2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/ArabicPF.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/ArabicSu.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Armenian.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Arrows.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Avestan.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Balinese.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Bamum.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/BamumSup.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Batak.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Bengali.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/BlockEle.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Bopomof2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Bopomofo.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/BoxDrawi.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Brahmi.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Braille.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Buginese.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Buhid.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Byzantin.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJK.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKComp2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKComp3.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKComp4.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKCompa.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtA.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtB.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtC.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtD.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKRadic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKStrok.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CJKSymbo.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Carian.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Chakma.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cham.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cherokee.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CompatJa.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/ControlP.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Coptic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Counting.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cuneifo2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cuneifor.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Currency.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/CypriotS.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cyrilli2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cyrilli3.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cyrilli4.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Cyrillic.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Deseret.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Devanag2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Devanaga.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Diacrit2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Diacrit3.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Diacriti.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Dingbats.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Domino.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Egyptian.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Emoticon.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Enclose2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Enclose3.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Enclose4.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Enclosed.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopi2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopi3.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopi4.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Geometri.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Georgia2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Georgian.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Glagolit.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Gothic.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Greek.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/GreekExt.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Gujarati.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Gurmukhi.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/HalfAndF.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/HalfMark.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hangul.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hanunoo.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hebrew.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/HighPUSu.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/HighSurr.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Hiragana.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/IDC.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/IPAExt.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Imperial.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/IndicNum.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Inscrip2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Inscript.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Jamo.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/JamoExtA.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/JamoExtB.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Javanese.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kaithi.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/KanaSup.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kanbun.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kangxi.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kannada.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Katakan2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Katakana.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/KayahLi.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Kharosht.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Khmer.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/KhmerSym.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lao.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Latin1.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx3.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx4.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx5.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LatinExt.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lepcha.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Letterli.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Limbu.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LinearBI.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LinearBS.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lisu.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/LowSurro.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lycian.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lydian.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Mahjong.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Malayala.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Mandaic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MathAlph.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MathOper.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MeeteiM2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MeeteiMa.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Meroiti2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Meroitic.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Miao.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MiscArro.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MiscMat2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MiscMath.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MiscPict.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MiscSymb.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MiscTech.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Modifie2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Modifier.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Mongolia.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Music.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Myanmar.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/MyanmarE.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/NB.pl | 115 +- Master/tlpkg/tlperl/lib/unicore/lib/Blk/NKo.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/NewTaiLu.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/NumberFo.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/OCR.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ogham.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/OlChiki.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/OldItali.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/OldPersi.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/OldSouth.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/OldTurki.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Oriya.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Osmanya.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/PUA.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/PhagsPa.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Phaistos.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Phoenici.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Phoneti2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Phonetic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/PlayingC.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Punctuat.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Rejang.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Rumi.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Runic.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Samarita.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Saurasht.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Sharada.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Shavian.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Sinhala.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SmallFor.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SoraSomp.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Specials.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Sundane2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Sundanes.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SupArro2.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SupArrow.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SupMathO.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupPUAA.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupPUAB.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SupPunct.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SuperAnd.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/SylotiNa.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Syriac.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tagalog.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Tagbanwa.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tags.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiLe.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiTham.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiViet.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/TaiXuanJ.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Takri.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tamil.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Telugu.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Thaana.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Thai.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tibetan.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Tifinagh.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Transpor.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/UCAS.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/UCASExt.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Ugaritic.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/VS.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/VSSup.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Vai.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/VedicExt.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/Vertical.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/YiRadica.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Blk/YiSyllab.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Blk/Yijing.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Bpt/C.pl | 134 + Master/tlpkg/tlperl/lib/unicore/lib/Bpt/N.pl | 73 + Master/tlpkg/tlperl/lib/unicore/lib/Bpt/O.pl | 134 + Master/tlpkg/tlperl/lib/unicore/lib/CE/Y.pl | 105 +- Master/tlpkg/tlperl/lib/unicore/lib/CI/Y.pl | 895 +- Master/tlpkg/tlperl/lib/unicore/lib/CWCF/Y.pl | 1752 +- Master/tlpkg/tlperl/lib/unicore/lib/CWCM/Y.pl | 318 +- Master/tlpkg/tlperl/lib/unicore/lib/CWKCF/Y.pl | 2381 +- Master/tlpkg/tlperl/lib/unicore/lib/CWL/Y.pl | 1719 +- Master/tlpkg/tlperl/lib/unicore/lib/CWT/Y.pl | 1767 +- Master/tlpkg/tlperl/lib/unicore/lib/CWU/Y.pl | 1764 +- Master/tlpkg/tlperl/lib/unicore/lib/Cased/Y.pl | 363 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/A.pl | 285 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/AL.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/AR.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/ATA.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/ATAR.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/ATB.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/B.pl | 198 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/BL.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/BR.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC10.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC103.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC107.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC11.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC118.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC12.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC122.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC129.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC13.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC130.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC132.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC14.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC15.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC16.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC17.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC18.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC19.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC20.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC21.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC22.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC23.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC24.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC25.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC26.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC27.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC28.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC29.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC30.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC31.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC32.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC33.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC34.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC35.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC36.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC84.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC91.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/DA.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/DB.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/IS.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/KV.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/L.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/NK.pl | 45 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/NR.pl | 398 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/OV.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Ccc/R.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ccc/VR.pl | 105 +- Master/tlpkg/tlperl/lib/unicore/lib/CompEx/Y.pl | 225 +- Master/tlpkg/tlperl/lib/unicore/lib/DI/Y.pl | 53 +- Master/tlpkg/tlperl/lib/unicore/lib/Dash/Y.pl | 66 +- Master/tlpkg/tlperl/lib/unicore/lib/Dep/Y.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Dia/Y.pl | 381 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Com.pl | 228 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Enc.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Fin.pl | 345 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Font.pl | 207 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Fra.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Dt/Init.pl | 231 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Iso.pl | 300 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Med.pl | 168 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Nar.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Nb.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/NonCanon.pl | 558 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Sml.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Dt/Sqr.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Sub.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Sup.pl | 72 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Vert.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Dt/Wide.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Ea/A.pl | 525 +- Master/tlpkg/tlperl/lib/unicore/lib/Ea/H.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Ea/N.pl | 638 +- Master/tlpkg/tlperl/lib/unicore/lib/Ea/Na.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Ea/W.pl | 105 +- Master/tlpkg/tlperl/lib/unicore/lib/Ext/Y.pl | 72 +- Master/tlpkg/tlperl/lib/unicore/lib/GCB/CN.pl | 67 +- Master/tlpkg/tlperl/lib/unicore/lib/GCB/CR.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/GCB/EX.pl | 704 +- Master/tlpkg/tlperl/lib/unicore/lib/GCB/LF.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/GCB/LV.pl | 812 + Master/tlpkg/tlperl/lib/unicore/lib/GCB/LVT.pl | 812 + Master/tlpkg/tlperl/lib/unicore/lib/GCB/SM.pl | 342 +- Master/tlpkg/tlperl/lib/unicore/lib/GCB/XX.pl | 676 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/C.pl | 1628 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Cc.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Gc/Cf.pl | 52 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Cn.pl | 1622 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Co.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Gc/Cs.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Gc/L.pl | 1464 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/LC.pl | 345 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Ll.pl | 1839 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Lm.pl | 162 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Lo.pl | 1119 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Lt.pl | 34 + Master/tlpkg/tlperl/lib/unicore/lib/Gc/Lu.pl | 1830 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/M.pl | 618 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Mc.pl | 384 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Me.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Mn.pl | 668 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/N.pl | 270 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Nd.pl | 132 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Nl.pl | 42 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/No.pl | 132 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/P.pl | 428 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Pd.pl | 54 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Pe.pl | 220 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Pf.pl | 36 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Pi.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Po.pl | 411 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Ps.pl | 226 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/S.pl | 602 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Sc.pl | 57 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Sk.pl | 87 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Sm.pl | 199 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/So.pl | 465 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Z.pl | 31 +- Master/tlpkg/tlperl/lib/unicore/lib/Gc/Zl.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Gc/Zp.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Gc/Zs.pl | 28 +- Master/tlpkg/tlperl/lib/unicore/lib/GrBase/Y.pl | 1933 +- Master/tlpkg/tlperl/lib/unicore/lib/Hex/Y.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Hst/NA.pl | 23 +- Master/tlpkg/tlperl/lib/unicore/lib/Hyphen/Y.pl | 36 +- Master/tlpkg/tlperl/lib/unicore/lib/IDC/Y.pl | 1698 +- Master/tlpkg/tlperl/lib/unicore/lib/IDS/Y.pl | 1470 +- Master/tlpkg/tlperl/lib/unicore/lib/IDSB/Y.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/IDST/Y.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Ideo/Y.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/In/2_0.pl | 942 +- Master/tlpkg/tlperl/lib/unicore/lib/In/2_1.pl | 942 +- Master/tlpkg/tlperl/lib/unicore/lib/In/3_0.pl | 1113 +- Master/tlpkg/tlperl/lib/unicore/lib/In/3_1.pl | 1212 +- Master/tlpkg/tlperl/lib/unicore/lib/In/3_2.pl | 1197 +- Master/tlpkg/tlperl/lib/unicore/lib/In/4_0.pl | 1242 +- Master/tlpkg/tlperl/lib/unicore/lib/In/4_1.pl | 1296 +- Master/tlpkg/tlperl/lib/unicore/lib/In/5_0.pl | 1326 +- Master/tlpkg/tlperl/lib/unicore/lib/In/5_1.pl | 1371 +- Master/tlpkg/tlperl/lib/unicore/lib/In/5_2.pl | 1491 +- Master/tlpkg/tlperl/lib/unicore/lib/In/6_0.pl | 1539 +- Master/tlpkg/tlperl/lib/unicore/lib/In/6_1.pl | 1653 +- Master/tlpkg/tlperl/lib/unicore/lib/In/6_2.pl | 1653 +- Master/tlpkg/tlperl/lib/unicore/lib/In/6_3.pl | 1112 + Master/tlpkg/tlperl/lib/unicore/lib/Jg/Ain.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Alaph.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Alef.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Beh.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Beth.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Burushas.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Dal.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/DalathRi.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/E.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/FarsiYeh.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Fe.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Feh.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/FinalSem.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Gaf.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Gamal.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Hah.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/HamzaOnH.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/He.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Heh.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/HehGoal.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Heth.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Kaf.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Kaph.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Khaph.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/KnottedH.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Lam.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Lamadh.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Meem.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Mim.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/NoJoinin.pl | 53 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Noon.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Nun.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Nya.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Pe.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Qaf.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Qaph.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Reh.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Reversed.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Rohingya.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Sad.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Sadhe.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Seen.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Semkath.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Shin.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/SwashKaf.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/SyriacWa.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Tah.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Taw.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/TehMarbu.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Teth.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Waw.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/Yeh.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Jg/YehBarre.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/YehWithT.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Yudh.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/YudhHe.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Zain.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jg/Zhain.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/JoinC/Y.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Jt/C.pl | 17 +- Master/tlpkg/tlperl/lib/unicore/lib/Jt/D.pl | 124 +- Master/tlpkg/tlperl/lib/unicore/lib/Jt/R.pl | 108 +- Master/tlpkg/tlperl/lib/unicore/lib/Jt/T.pl | 700 +- Master/tlpkg/tlperl/lib/unicore/lib/Jt/U.pl | 729 +- Master/tlpkg/tlperl/lib/unicore/lib/LOE/Y.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/AI.pl | 333 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/AL.pl | 1794 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/B2.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/BA.pl | 209 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/BB.pl | 42 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/BK.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/CB.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/CJ.pl | 81 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/CL.pl | 243 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/CM.pl | 574 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/CP.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/EX.pl | 72 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/GL.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/HL.pl | 22 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/HY.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/ID.pl | 381 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/IN.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/IS.pl | 36 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/NL.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/NS.pl | 51 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/OP.pl | 243 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/PO.pl | 60 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/PR.pl | 66 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/QU.pl | 42 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/SA.pl | 117 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/SG.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/SP.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/SY.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/WJ.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Lb/XX.pl | 1599 +- Master/tlpkg/tlperl/lib/unicore/lib/Lb/ZW.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Lower/Y.pl | 1860 +- Master/tlpkg/tlperl/lib/unicore/lib/Math/Y.pl | 420 +- Master/tlpkg/tlperl/lib/unicore/lib/NChar/Y.pl | 60 +- Master/tlpkg/tlperl/lib/unicore/lib/NFCQC/M.pl | 111 +- Master/tlpkg/tlperl/lib/unicore/lib/NFCQC/Y.pl | 323 +- Master/tlpkg/tlperl/lib/unicore/lib/NFDQC/N.pl | 687 +- Master/tlpkg/tlperl/lib/unicore/lib/NFDQC/Y.pl | 689 +- Master/tlpkg/tlperl/lib/unicore/lib/NFKCQC/N.pl | 747 +- Master/tlpkg/tlperl/lib/unicore/lib/NFKCQC/Y.pl | 842 +- Master/tlpkg/tlperl/lib/unicore/lib/NFKDQC/N.pl | 1158 +- Master/tlpkg/tlperl/lib/unicore/lib/NFKDQC/Y.pl | 1160 +- Master/tlpkg/tlperl/lib/unicore/lib/Nt/Di.pl | 66 +- Master/tlpkg/tlperl/lib/unicore/lib/Nt/None.pl | 488 +- Master/tlpkg/tlperl/lib/unicore/lib/Nt/Nu.pl | 369 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/0.pl | 183 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1.pl | 288 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/10.pl | 114 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/100.pl | 66 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1000.pl | 54 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/10000.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/100000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/10000000.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/10000002.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/11.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/11_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/12.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/13.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/13_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/14.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/15.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/15_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/16.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/17.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/17_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/18.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/19.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_10.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_16.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_2.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_3.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_4.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_5.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_6.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_7.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_8.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_9.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/2.pl | 299 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/20.pl | 63 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/200.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/2000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/20000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/21.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/216000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/22.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/23.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/24.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/25.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/26.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/27.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/28.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/29.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/2_3.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/2_5.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/3.pl | 293 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/30.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/300.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/3000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/30000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/31.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/32.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/33.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/34.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/35.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/36.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/37.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/38.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/39.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_16.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_4.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_5.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_8.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/4.pl | 273 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/40.pl | 36 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/400.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/4000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/40000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/41.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/42.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/43.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/432000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/44.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/45.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/46.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/47.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/48.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/49.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/4_5.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/5.pl | 273 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/50.pl | 57 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/500.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/5000.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/50000.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/5_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/5_6.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/5_8.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/6.pl | 252 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/60.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/600.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/6000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/60000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/7.pl | 243 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/70.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/700.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/7000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/70000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/7_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/7_8.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/8.pl | 234 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/80.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/800.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/8000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/80000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/9.pl | 240 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/90.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Nv/900.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/9000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/90000.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/9_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/_1.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Nv/_1_2.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/PatSyn/Y.pl | 90 +- Master/tlpkg/tlperl/lib/unicore/lib/PatWS/Y.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Perl/Alnum.pl | 1704 +- Master/tlpkg/tlperl/lib/unicore/lib/Perl/Any.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Perl/Assigned.pl | 1623 +- Master/tlpkg/tlperl/lib/unicore/lib/Perl/Blank.pl | 31 +- Master/tlpkg/tlperl/lib/unicore/lib/Perl/Graph.pl | 1638 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/PerlSpac.pl | 14 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PerlWord.pl | 18 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixAln.pl | 15 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixAlp.pl | 14 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixBla.pl | 14 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixCnt.pl | 14 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixDig.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixGra.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixLow.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixPri.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixPun.pl | 18 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/PosixUpp.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Perl/Print.pl | 1629 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/SpacePer.pl | 23 - Master/tlpkg/tlperl/lib/unicore/lib/Perl/Title.pl | 22 - .../tlpkg/tlperl/lib/unicore/lib/Perl/VertSpac.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Perl/Word.pl | 1701 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/XPosixPu.pl | 413 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlAny.pl | 343 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlCh2.pl | 1731 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlCha.pl | 1482 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlFol.pl | 72 + .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlIDC.pl | 1719 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlIDS.pl | 1497 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlPr2.pl | 40 + .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlPro.pl | 38 + .../tlpkg/tlperl/lib/unicore/lib/Perl/_PerlQuo.pl | 119 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_XExtend.pl | 627 +- Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBL.pl | 14 - .../tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBLV.pl | 411 - .../tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBLVT.pl | 411 - Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBT.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBV.pl | 14 - .../tlpkg/tlperl/lib/unicore/lib/Perl/_XLVLVTV.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XRI.pl | 13 - .../tlpkg/tlperl/lib/unicore/lib/Perl/_XRegula.pl | 78 +- .../tlpkg/tlperl/lib/unicore/lib/Perl/_XSpecia.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/QMark/Y.pl | 42 +- Master/tlpkg/tlperl/lib/unicore/lib/Radical/Y.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/SB/AT.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/CL.pl | 131 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/EX.pl | 624 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/FO.pl | 55 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/LE.pl | 1185 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/LO.pl | 1857 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/NU.pl | 132 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/SC.pl | 63 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/SE.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/SB/ST.pl | 147 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/Sp.pl | 34 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/UP.pl | 1845 +- Master/tlpkg/tlperl/lib/unicore/lib/SB/XX.pl | 1878 +- Master/tlpkg/tlperl/lib/unicore/lib/SD/Y.pl | 99 +- Master/tlpkg/tlperl/lib/unicore/lib/STerm/Y.pl | 156 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Arab.pl | 176 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Armi.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Armn.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Avst.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bali.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bamu.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Batk.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Beng.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bopo.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Brah.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bugi.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Buhd.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cakm.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cans.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cari.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cham.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cher.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Copt.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cprt.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cyrl.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Deva.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Egyp.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ethi.pl | 102 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Geor.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Glag.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Goth.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Grek.pl | 105 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Gujr.pl | 45 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Guru.pl | 54 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Han.pl | 51 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Hang.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Hano.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Hebr.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Hira.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ital.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Java.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Kana.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Khar.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Khmr.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Knda.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Kthi.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lana.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lao.pl | 60 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Latn.pl | 96 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lepc.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Limb.pl | 21 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Linb.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lyci.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lydi.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mand.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Merc.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Miao.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mlym.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mong.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mtei.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mymr.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Nko.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ogam.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Orkh.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Orya.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Osma.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Phag.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Phli.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Phnx.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Prti.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Rjng.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Runr.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Samr.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Saur.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Shrd.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sinh.pl | 39 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sora.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sund.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sylo.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Syrc.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tagb.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Takr.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tale.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Talu.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Taml.pl | 54 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tavt.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Telu.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tfng.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tglg.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Thaa.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Thai.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tibt.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ugar.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Vai.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Xpeo.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Xsux.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Yi.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Sc/Zinh.pl | 78 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Zyyy.pl | 479 +- Master/tlpkg/tlperl/lib/unicore/lib/Sc/Zzzz.pl | 1616 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Arab.pl | 156 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Armn.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Beng.pl | 51 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Bopo.pl | 66 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Buhd.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Scx/Cakm.pl | 22 + Master/tlpkg/tlperl/lib/unicore/lib/Scx/Cprt.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Cyrl.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Deva.pl | 30 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Geor.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Grek.pl | 111 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Gujr.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Guru.pl | 60 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Han.pl | 90 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Hang.pl | 93 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Hano.pl | 13 - Master/tlpkg/tlperl/lib/unicore/lib/Scx/Hira.pl | 78 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Kana.pl | 72 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Kthi.pl | 14 - Master/tlpkg/tlperl/lib/unicore/lib/Scx/Latn.pl | 105 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Linb.pl | 36 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Mand.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Scx/Mong.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Orya.pl | 51 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Phag.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Scx/Syrc.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Tagb.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Takr.pl | 18 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Tglg.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/Scx/Thaa.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Yi.pl | 27 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Zinh.pl | 51 +- Master/tlpkg/tlperl/lib/unicore/lib/Scx/Zyyy.pl | 423 +- Master/tlpkg/tlperl/lib/unicore/lib/Space/Y.pl | 34 + Master/tlpkg/tlperl/lib/unicore/lib/Term/Y.pl | 216 +- Master/tlpkg/tlperl/lib/unicore/lib/UIdeo/Y.pl | 42 +- Master/tlpkg/tlperl/lib/unicore/lib/Upper/Y.pl | 1836 +- Master/tlpkg/tlperl/lib/unicore/lib/VS/Y.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/WB/EX.pl | 24 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/FO.pl | 52 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/HL.pl | 34 + Master/tlpkg/tlperl/lib/unicore/lib/WB/KA.pl | 33 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/LE.pl | 1274 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/MB.pl | 25 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/ML.pl | 32 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/MN.pl | 48 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/NL.pl | 15 - Master/tlpkg/tlperl/lib/unicore/lib/WB/NU.pl | 132 +- Master/tlpkg/tlperl/lib/unicore/lib/WB/XX.pl | 1751 +- Master/tlpkg/tlperl/lib/unicore/lib/XIDC/Y.pl | 1719 +- Master/tlpkg/tlperl/lib/unicore/lib/XIDS/Y.pl | 1491 +- Master/tlpkg/tlperl/lib/unicore/version | 2 +- Master/tlpkg/tlperl/lib/utf8.pm | 61 +- Master/tlpkg/tlperl/lib/utf8_heavy.pl | 51 +- Master/tlpkg/tlperl/lib/version.pm | 141 +- Master/tlpkg/tlperl/lib/version.pod | 322 + Master/tlpkg/tlperl/lib/version/Internals.pod | 699 + Master/tlpkg/tlperl/lib/version/regex.pm | 117 + Master/tlpkg/tlperl/lib/version/vpp.pm | 1023 + Master/tlpkg/tlperl/lib/vmsish.pm | 8 +- Master/tlpkg/tlperl/lib/warnings.pm | 853 +- Master/tlpkg/tlperl/lib/warnings/register.pm | 5 +- 2053 files changed, 280289 insertions(+), 180514 deletions(-) delete mode 100755 Master/tlpkg/tlperl/bin/libpng16-16_.dll create mode 100755 Master/tlpkg/tlperl/bin/libwinpthread-1.dll delete mode 100755 Master/tlpkg/tlperl/bin/perl5.18.2.exe create mode 100755 Master/tlpkg/tlperl/bin/perl5.20.2.exe delete mode 100755 Master/tlpkg/tlperl/bin/perl518.dll create mode 100755 Master/tlpkg/tlperl/bin/perl520.dll delete mode 100755 Master/tlpkg/tlperl/bin/zlib1_.dll delete mode 100644 Master/tlpkg/tlperl/lib/Archive/Extract.pm delete mode 100644 Master/tlpkg/tlperl/lib/B/Lint.pm delete mode 100644 Master/tlpkg/tlperl/lib/B/Lint/Debug.pm create mode 100644 Master/tlpkg/tlperl/lib/CORE.pod delete mode 100644 Master/tlpkg/tlperl/lib/CORE/fakethr.h delete mode 100755 Master/tlpkg/tlperl/lib/CORE/libperl518.a create mode 100644 Master/tlpkg/tlperl/lib/CORE/libperl520.a delete mode 100644 Master/tlpkg/tlperl/lib/CORE/perlsfio.h create mode 100644 Master/tlpkg/tlperl/lib/CORE/sys/errno2.h create mode 100644 Master/tlpkg/tlperl/lib/CORE/vutil.h create mode 100644 Master/tlpkg/tlperl/lib/CPAN/API/HOWTO.pod delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Backend.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Backend/RV.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Config.pm delete mode 100755 Master/tlpkg/tlperl/lib/CPANPLUS/Config/HomeEnv.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Configure.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Configure/Setup.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Autobundle.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Base.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build/Constants.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist/MM.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Sample.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Error.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants/Report.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Extract.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Fetch.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Report.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Search.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/Memory.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils/Autoflush.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Module.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Module/Author.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Module/Author/Fake.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Module/Checksums.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Module/Fake.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Module/Signature.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Selfupdate.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Shell.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Classic.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Default.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Default/Plugins/Remote.pm delete mode 100644 Master/tlpkg/tlperl/lib/CPANPLUS/Shell/Default/Plugins/Source.pm create mode 100644 Master/tlpkg/tlperl/lib/Config.pod create mode 100644 Master/tlpkg/tlperl/lib/Date/Format.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Afar.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Amharic.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Austrian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Brazilian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Bulgarian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Chinese.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Chinese_GB.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Czech.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Danish.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Dutch.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/English.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Finnish.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/French.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Gedeo.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/German.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Greek.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Hungarian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Icelandic.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Italian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Norwegian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Oromo.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Romanian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Russian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Russian_cp1251.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Russian_koi8r.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Sidama.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Somali.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Spanish.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Swedish.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Tigrinya.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/TigrinyaEritrean.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/TigrinyaEthiopian.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Language/Turkish.pm create mode 100644 Master/tlpkg/tlperl/lib/Date/Parse.pm delete mode 100644 Master/tlpkg/tlperl/lib/Devel/InnerPackage.pm create mode 100644 Master/tlpkg/tlperl/lib/Encode/PerlIO.pod create mode 100644 Master/tlpkg/tlperl/lib/Encode/Supported.pod create mode 100644 Master/tlpkg/tlperl/lib/Encode/compat.pm create mode 100644 Master/tlpkg/tlperl/lib/Encode/compat/5006001.pm create mode 100644 Master/tlpkg/tlperl/lib/Encode/compat/Alias.pm create mode 100644 Master/tlpkg/tlperl/lib/Encode/compat/common.pm create mode 100644 Master/tlpkg/tlperl/lib/ExtUtils/CBuilder/Platform/android.pm create mode 100644 Master/tlpkg/tlperl/lib/ExtUtils/MakeMaker/FAQ.pod create mode 100644 Master/tlpkg/tlperl/lib/ExtUtils/MakeMaker/Tutorial.pod create mode 100644 Master/tlpkg/tlperl/lib/ExtUtils/ParseXS.pod create mode 100644 Master/tlpkg/tlperl/lib/ExtUtils/ParseXS/Eval.pm delete mode 100644 Master/tlpkg/tlperl/lib/File/CheckTree.pm create mode 100644 Master/tlpkg/tlperl/lib/File/Which.pm create mode 100644 Master/tlpkg/tlperl/lib/IO/Compress/FAQ.pod create mode 100644 Master/tlpkg/tlperl/lib/IO/Socket/IP.pm delete mode 100755 Master/tlpkg/tlperl/lib/LWP/Protocol/https.pm create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/API.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/Changes.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/Constants.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/Country.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/Currency.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/LangExt.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/LangFam.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/LangVar.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/Language.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Codes/Script.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Country.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Currency.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Language.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Maketext.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Maketext/Cookbook.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Maketext/TPJ13.pod create mode 100644 Master/tlpkg/tlperl/lib/Locale/Script.pod delete mode 100644 Master/tlpkg/tlperl/lib/Log/Message.pm delete mode 100644 Master/tlpkg/tlperl/lib/Log/Message/Config.pm delete mode 100644 Master/tlpkg/tlperl/lib/Log/Message/Handlers.pm delete mode 100644 Master/tlpkg/tlperl/lib/Log/Message/Item.pm delete mode 100644 Master/tlpkg/tlperl/lib/Log/Message/Simple.pm create mode 100644 Master/tlpkg/tlperl/lib/Module/Build/API.pod create mode 100644 Master/tlpkg/tlperl/lib/Module/Build/Authoring.pod create mode 100644 Master/tlpkg/tlperl/lib/Module/Build/Bundling.pod delete mode 100644 Master/tlpkg/tlperl/lib/Module/Build/Platform/Amiga.pm delete mode 100644 Master/tlpkg/tlperl/lib/Module/Build/Platform/EBCDIC.pm delete mode 100644 Master/tlpkg/tlperl/lib/Module/Build/Platform/MPEiX.pm delete mode 100644 Master/tlpkg/tlperl/lib/Module/Build/Platform/RiscOS.pm create mode 100644 Master/tlpkg/tlperl/lib/Module/CoreList.pod delete mode 100644 Master/tlpkg/tlperl/lib/Module/Pluggable.pm delete mode 100644 Master/tlpkg/tlperl/lib/Module/Pluggable/Object.pm create mode 100644 Master/tlpkg/tlperl/lib/Mozilla/CA.pm create mode 100644 Master/tlpkg/tlperl/lib/Mozilla/CA/cacert.pem create mode 100644 Master/tlpkg/tlperl/lib/Mozilla/mk-ca-bundle.pl create mode 100644 Master/tlpkg/tlperl/lib/Net/libnetFAQ.pod delete mode 100644 Master/tlpkg/tlperl/lib/Object/Accessor.pm create mode 100644 Master/tlpkg/tlperl/lib/POSIX.pod delete mode 100644 Master/tlpkg/tlperl/lib/Pod/LaTeX.pm create mode 100644 Master/tlpkg/tlperl/lib/Pod/Simple.pod create mode 100644 Master/tlpkg/tlperl/lib/Pod/Simple/Subclassing.pod create mode 100644 Master/tlpkg/tlperl/lib/TAP/Harness/Beyond.pod create mode 100644 Master/tlpkg/tlperl/lib/TAP/Harness/Env.pm delete mode 100644 Master/tlpkg/tlperl/lib/TAP/Parser/Utils.pm delete mode 100644 Master/tlpkg/tlperl/lib/Term/UI.pm delete mode 100644 Master/tlpkg/tlperl/lib/Term/UI/History.pm create mode 100644 Master/tlpkg/tlperl/lib/Test/Tutorial.pod delete mode 100644 Master/tlpkg/tlperl/lib/Text/Soundex.pm create mode 100644 Master/tlpkg/tlperl/lib/Time/Zone.pm create mode 100644 Master/tlpkg/tlperl/lib/Tk.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/804delta.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Adjuster.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Animation.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Balloon.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Bitmap.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/BrowseEntry.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Button.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Canvas.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Checkbutton.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Clipboard.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/CmdLine.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/ColorEditor.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Compound.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/ConfigSpecs.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/DItem.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Derived.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Dialog.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/DialogBox.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/DirTree.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/DragDrop/Common.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/DragDrop/SunConst.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/DropSite.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Entry.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Error.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/ErrorDialog.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Eventloop.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/FBox.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/FileSelect.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Font.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Frame.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/HList.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/IO.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/IconList.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Image.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/InputO.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Internals.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/LabFrame.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Label.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Labelframe.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Listbox.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/MainWindow.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Menu.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Menu/Item.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Menubutton.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Message.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/MsgBox.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Mwm.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/NoteBook.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Optionmenu.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Panedwindow.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Photo.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Pixmap.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Popup.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/ROText.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Radiobutton.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Scale.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Scrollbar.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Scrolled.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Spinbox.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Submethods.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/TList.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Table.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Tcl-perl.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Text.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/TextUndo.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Tiler.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/TixGrid.pod delete mode 100755 Master/tlpkg/tlperl/lib/Tk/Tk.def create mode 100644 Master/tlpkg/tlperl/lib/Tk/Toplevel.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Tree.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/UserGuide.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Widget.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/WidgetDemo.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Wm.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/X.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/X11Font.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/Xrm.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/after.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/bind.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/bindtags.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/callbacks.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/chooseColor.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/chooseDirectory.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/composite.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/event.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/exit.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/fileevent.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/focus.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/form.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/getOpenFile.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/grab.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/grid.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/mega.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/messageBox.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/option.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/options.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/overview.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/pTk.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/pack.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/palette.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/place.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/selection.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/send.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/tixWm.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/tkvars.pod create mode 100644 Master/tlpkg/tlperl/lib/Tk/widgets.pod create mode 100644 Master/tlpkg/tlperl/lib/Win32/API/Callback/IATPatch.pod create mode 100644 Master/tlpkg/tlperl/lib/Win32/Console.pm create mode 100644 Master/tlpkg/tlperl/lib/Win32/OLE/NEWS.pod create mode 100644 Master/tlpkg/tlperl/lib/Win32/OLE/TPJ.pod delete mode 100644 Master/tlpkg/tlperl/lib/Win32/Process/Info.pm delete mode 100644 Master/tlpkg/tlperl/lib/Win32/Process/Info/NT.pm delete mode 100644 Master/tlpkg/tlperl/lib/Win32/Process/Info/PT.pm delete mode 100644 Master/tlpkg/tlperl/lib/Win32/Process/Info/WMI.pm create mode 100644 Master/tlpkg/tlperl/lib/Win32/WinError.pm delete mode 100644 Master/tlpkg/tlperl/lib/auto/B/B.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Compress/Raw/Bzip2/Bzip2.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Compress/Raw/Bzip2/autosplit.ix delete mode 100644 Master/tlpkg/tlperl/lib/auto/Compress/Raw/Zlib/Zlib.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Compress/Raw/Zlib/autosplit.ix delete mode 100644 Master/tlpkg/tlperl/lib/auto/Cwd/Cwd.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Data/Dumper/Dumper.bs create mode 100644 Master/tlpkg/tlperl/lib/auto/Date/Parse/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/Devel/PPPort/PPPort.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Devel/Peek/Peek.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Digest/MD5/MD5.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Digest/SHA/SHA.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Digest/SHA1/SHA1.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/Byte/Byte.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/CN/CN.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/EBCDIC/EBCDIC.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/Encode.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/JP/JP.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/KR/KR.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/Symbol/Symbol.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/TW/TW.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/Unicode/Unicode.bs create mode 100644 Master/tlpkg/tlperl/lib/auto/Encode/compat/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/Fcntl/Fcntl.bs delete mode 100755 Master/tlpkg/tlperl/lib/auto/File/DosGlob/DosGlob.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/File/Glob/Glob.bs create mode 100644 Master/tlpkg/tlperl/lib/auto/File/Which/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/Filter/Util/Call/Call.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/HTML/Parser/Parser.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Hash/Util/FieldHash/FieldHash.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Hash/Util/Util.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/IO/IO.bs delete mode 100755 Master/tlpkg/tlperl/lib/auto/LWP/Protocol/https/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/List/Util/Util.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/MIME/Base64/Base64.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Math/BigInt/FastCalc/FastCalc.bs delete mode 100755 Master/tlpkg/tlperl/lib/auto/Math/Int64/Int64.bs create mode 100644 Master/tlpkg/tlperl/lib/auto/Mozilla/CA/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/Opcode/Opcode.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/POSIX/POSIX.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/PerlIO/encoding/encoding.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/PerlIO/mmap/mmap.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/PerlIO/scalar/scalar.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/PerlIO/via/via.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/SDBM_File/SDBM_File.bs create mode 100644 Master/tlpkg/tlperl/lib/auto/Socket/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/Socket/Socket.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Storable/Storable.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Sys/Hostname/Hostname.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Text/Soundex/Soundex.bs delete mode 100755 Master/tlpkg/tlperl/lib/auto/Text/Soundex/Soundex.dll delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tie/Hash/NamedCapture/NamedCapture.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Time/HiRes/HiRes.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Time/Piece/Piece.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Canvas/Canvas.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Compound/Compound.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Entry/Entry.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Event/Event.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/HList/HList.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/IO/IO.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/JPEG/JPEG.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Listbox/Listbox.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Menubutton/Menubutton.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/NBFrame/NBFrame.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/PNG/PNG.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Pixmap/Pixmap.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Scale/Scale.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Scrollbar/Scrollbar.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/TList/TList.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Text/Text.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/TixGrid/TixGrid.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Tk.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/X/X.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Tk/Xlib/Xlib.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Unicode/Collate/Collate.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Unicode/Normalize/Normalize.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/API/API.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/API/Callback/Callback.bs create mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/Console/.packlist create mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/Console/Console.dll delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/OLE/OLE.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/Process/Info/.packlist delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/Shortcut/Shortcut.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32/Win32.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32API/File/File.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/Win32API/Registry/Registry.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/arybase/arybase.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/attributes/attributes.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/mro/mro.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/re/re.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/threads/shared/shared.bs delete mode 100644 Master/tlpkg/tlperl/lib/auto/threads/threads.bs create mode 100644 Master/tlpkg/tlperl/lib/autodie/skip.pm create mode 100644 Master/tlpkg/tlperl/lib/experimental.pm create mode 100644 Master/tlpkg/tlperl/lib/lwpcook.pod create mode 100644 Master/tlpkg/tlperl/lib/lwptut.pod create mode 100644 Master/tlpkg/tlperl/lib/perllocal.pod create mode 100644 Master/tlpkg/tlperl/lib/unicore/To/Bpb.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/To/Bpt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/AHex/Y.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Age/V21.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Age/V62.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bc/LRE.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bc/LRO.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bc/PDF.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bc/RLE.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bc/RLO.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bc/S.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ASCII.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/AegeanNu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Alchemic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Alphabet.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ancient2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/AncientG.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/AncientS.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Arabic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ArabicEx.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ArabicMa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ArabicP2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ArabicPF.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ArabicSu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Armenian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Arrows.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Avestan.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Balinese.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Bamum.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/BamumSup.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Batak.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Bengali.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/BlockEle.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Bopomof2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Bopomofo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/BoxDrawi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Brahmi.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Braille.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Buginese.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Buhid.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Byzantin.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJK.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKComp2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKComp3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKComp4.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKCompa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtA.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtB.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtC.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKExtD.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKRadic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKStrok.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CJKSymbo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Carian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Chakma.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cham.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cherokee.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CompatJa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/ControlP.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Coptic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Counting.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cuneifo2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cuneifor.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Currency.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/CypriotS.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cyrilli2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cyrilli3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cyrilli4.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Cyrillic.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Deseret.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Devanag2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Devanaga.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Diacrit2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Diacrit3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Diacriti.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Dingbats.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Domino.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Egyptian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Emoticon.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Enclose2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Enclose3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Enclose4.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Enclosed.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopi2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopi3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopi4.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ethiopic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Geometri.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Georgia2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Georgian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Glagolit.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Gothic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Greek.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/GreekExt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Gujarati.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Gurmukhi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/HalfAndF.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/HalfMark.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hangul.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hanunoo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hebrew.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/HighPUSu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/HighSurr.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Hiragana.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/IDC.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/IPAExt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Imperial.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/IndicNum.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Inscrip2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Inscript.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Jamo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/JamoExtA.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/JamoExtB.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Javanese.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kaithi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/KanaSup.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kanbun.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kangxi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kannada.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Katakan2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Katakana.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/KayahLi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Kharosht.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Khmer.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/KhmerSym.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lao.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Latin1.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx4.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LatinEx5.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LatinExt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lepcha.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Letterli.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Limbu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LinearBI.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LinearBS.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lisu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/LowSurro.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lycian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Lydian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Mahjong.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Malayala.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Mandaic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MathAlph.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MathOper.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MeeteiM2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MeeteiMa.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Meroiti2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Meroitic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Miao.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MiscArro.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MiscMat2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MiscMath.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MiscPict.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MiscSymb.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MiscTech.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Modifie2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Modifier.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Mongolia.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Music.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Myanmar.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/MyanmarE.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/NKo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/NewTaiLu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/NumberFo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/OCR.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ogham.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/OlChiki.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/OldItali.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/OldPersi.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/OldSouth.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/OldTurki.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Oriya.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Osmanya.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/PUA.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/PhagsPa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Phaistos.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Phoenici.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Phoneti2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Phonetic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/PlayingC.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Punctuat.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Rejang.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Rumi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Runic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Samarita.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Saurasht.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Sharada.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Shavian.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Sinhala.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SmallFor.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SoraSomp.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Specials.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Sundane2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Sundanes.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupArro2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupArrow.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupMathO.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupPUAA.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupPUAB.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SupPunct.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SuperAnd.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/SylotiNa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Syriac.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tagalog.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tagbanwa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tags.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiLe.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiTham.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiViet.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/TaiXuanJ.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Takri.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tamil.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Telugu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Thaana.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Thai.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tibetan.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Tifinagh.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Transpor.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/UCAS.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/UCASExt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Ugaritic.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/VS.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/VSSup.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Vai.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/VedicExt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Vertical.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/YiRadica.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/YiSyllab.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Blk/Yijing.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bpt/C.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bpt/N.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Bpt/O.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/AL.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/ATA.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/ATB.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/BL.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC10.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC103.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC107.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC11.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC118.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC12.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC122.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC129.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC13.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC130.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC132.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC14.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC15.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC16.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC17.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC18.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC19.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC20.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC21.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC22.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC23.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC24.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC25.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC26.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC27.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC28.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC29.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC30.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC31.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC32.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC33.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC34.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC35.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC36.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC84.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/CCC91.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/DA.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/IS.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/KV.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/L.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Ccc/R.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Dt/Fra.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Dt/Sml.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Dt/Wide.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/GCB/CR.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/GCB/LF.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/GCB/LV.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/GCB/LVT.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Gc/Cc.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Gc/Co.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Gc/Cs.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Gc/Lt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Gc/Zl.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Gc/Zp.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/IDSB/Y.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/IDST/Y.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/In/6_3.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Alaph.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Beth.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Burushas.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/DalathRi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/E.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Fe.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/FinalSem.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Gamal.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/HamzaOnH.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/He.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Heh.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/HehGoal.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Heth.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Kaf.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Kaph.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Khaph.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/KnottedH.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Lamadh.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Meem.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Mim.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Noon.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Nun.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Nya.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Pe.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Qaph.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Reversed.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Rohingya.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Sad.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Sadhe.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Semkath.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Shin.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/SwashKaf.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/SyriacWa.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Tah.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Taw.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/TehMarbu.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Teth.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/YehBarre.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/YehWithT.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Yudh.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/YudhHe.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Zain.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Jg/Zhain.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/JoinC/Y.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/B2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/BK.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/CB.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/CP.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/HL.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/HY.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/IN.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/NL.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/SG.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/SP.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/SY.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/WJ.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Lb/ZW.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/100000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/10000000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/10000002.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/11_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/13_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/15_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/17_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_10.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_16.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_5.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_6.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_7.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/1_9.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/200.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/2000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/20000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/21.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Nv/216000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/22.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/23.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/24.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/25.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/26.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/27.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/28.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/29.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/2_5.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/300.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/3000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/30000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/31.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/32.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/33.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/34.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/35.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/36.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/37.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/38.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/39.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_16.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_5.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/3_8.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/400.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/4000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/40000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/41.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/42.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/43.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Nv/432000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/44.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/45.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/46.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/47.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/48.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/49.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/4_5.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/5_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/5_6.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/5_8.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/600.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/6000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/60000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/700.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/7000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/70000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/7_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/7_8.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/800.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/8000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/80000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/900.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/9000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/90000.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/9_2.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Nv/_1.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Nv/_1_2.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/Any.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PerlSpac.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixAln.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixAlp.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixBla.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixCnt.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixDig.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixGra.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixLow.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixPri.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/PosixUpp.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/SpacePer.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/Title.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/VertSpac.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_PerlFol.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_PerlPr2.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_PerlPro.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBL.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBLV.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBLVT.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBT.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XGCBV.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XLVLVTV.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Perl/_XRI.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Radical/Y.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/SB/SE.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Armi.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Avst.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bali.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bamu.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Batk.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bopo.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Brah.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Bugi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Buhd.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cakm.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cans.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cari.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Cher.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Copt.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Egyp.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Glag.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Goth.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Hano.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ital.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Java.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Kthi.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lepc.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lyci.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Lydi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mand.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Merc.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Miao.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mtei.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Mymr.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Nko.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ogam.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Orkh.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Osma.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Phag.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Phli.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Phnx.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Prti.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Rjng.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Runr.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Samr.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Saur.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Shrd.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sora.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sund.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Sylo.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Syrc.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tagb.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Takr.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tale.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tavt.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tfng.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Tglg.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Thaa.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Thai.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Ugar.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Vai.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Xpeo.pl delete mode 100755 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Xsux.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Sc/Yi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Buhd.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Cakm.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Hano.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Kthi.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Mand.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Phag.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Scx/Tglg.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/Space/Y.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/VS/Y.pl create mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/WB/HL.pl delete mode 100644 Master/tlpkg/tlperl/lib/unicore/lib/WB/NL.pl create mode 100644 Master/tlpkg/tlperl/lib/version.pod create mode 100644 Master/tlpkg/tlperl/lib/version/Internals.pod create mode 100644 Master/tlpkg/tlperl/lib/version/regex.pm create mode 100644 Master/tlpkg/tlperl/lib/version/vpp.pm (limited to 'Master/tlpkg') diff --git a/Master/tlpkg/tlperl/README.TEXLIVE b/Master/tlpkg/tlperl/README.TEXLIVE index f2a3ddcc490..bf5af4b003f 100644 --- a/Master/tlpkg/tlperl/README.TEXLIVE +++ b/Master/tlpkg/tlperl/README.TEXLIVE @@ -1,4 +1,4 @@ -This directory contains Perl 5.18.2 compiled for Windows. +This directory contains Perl 5.20.2 compiled for Windows. The only purpose of this Perl is to provide support on Windows for Perl scripts shipped with TeX Live. It's not intended for general use. diff --git a/Master/tlpkg/tlperl/bin/a2p.exe b/Master/tlpkg/tlperl/bin/a2p.exe index 8b2a34a9ae0..fd318509a3f 100755 Binary files a/Master/tlpkg/tlperl/bin/a2p.exe and b/Master/tlpkg/tlperl/bin/a2p.exe differ diff --git a/Master/tlpkg/tlperl/bin/libgcc_s_sjlj-1.dll b/Master/tlpkg/tlperl/bin/libgcc_s_sjlj-1.dll index 0ec7756b835..638eeac960d 100755 Binary files a/Master/tlpkg/tlperl/bin/libgcc_s_sjlj-1.dll and b/Master/tlpkg/tlperl/bin/libgcc_s_sjlj-1.dll differ diff --git a/Master/tlpkg/tlperl/bin/libpng16-16_.dll b/Master/tlpkg/tlperl/bin/libpng16-16_.dll deleted file mode 100755 index d046363d1d5..00000000000 Binary files a/Master/tlpkg/tlperl/bin/libpng16-16_.dll and /dev/null differ diff --git a/Master/tlpkg/tlperl/bin/libstdc++-6.dll b/Master/tlpkg/tlperl/bin/libstdc++-6.dll index 9613fa55d6a..2ab11bae8b1 100755 Binary files a/Master/tlpkg/tlperl/bin/libstdc++-6.dll and b/Master/tlpkg/tlperl/bin/libstdc++-6.dll differ diff --git a/Master/tlpkg/tlperl/bin/libwinpthread-1.dll b/Master/tlpkg/tlperl/bin/libwinpthread-1.dll new file mode 100755 index 00000000000..434802becf9 Binary files /dev/null and b/Master/tlpkg/tlperl/bin/libwinpthread-1.dll differ diff --git a/Master/tlpkg/tlperl/bin/perl.exe b/Master/tlpkg/tlperl/bin/perl.exe index d8d95c2d0ad..98045d95c77 100755 Binary files a/Master/tlpkg/tlperl/bin/perl.exe and b/Master/tlpkg/tlperl/bin/perl.exe differ diff --git a/Master/tlpkg/tlperl/bin/perl5.18.2.exe b/Master/tlpkg/tlperl/bin/perl5.18.2.exe deleted file mode 100755 index d8d95c2d0ad..00000000000 Binary files a/Master/tlpkg/tlperl/bin/perl5.18.2.exe and /dev/null differ diff --git a/Master/tlpkg/tlperl/bin/perl5.20.2.exe b/Master/tlpkg/tlperl/bin/perl5.20.2.exe new file mode 100755 index 00000000000..98045d95c77 Binary files /dev/null and b/Master/tlpkg/tlperl/bin/perl5.20.2.exe differ diff --git a/Master/tlpkg/tlperl/bin/perl518.dll b/Master/tlpkg/tlperl/bin/perl518.dll deleted file mode 100755 index 9d1479687f0..00000000000 Binary files a/Master/tlpkg/tlperl/bin/perl518.dll and /dev/null differ diff --git a/Master/tlpkg/tlperl/bin/perl520.dll b/Master/tlpkg/tlperl/bin/perl520.dll new file mode 100755 index 00000000000..e2b3b596921 Binary files /dev/null and b/Master/tlpkg/tlperl/bin/perl520.dll differ diff --git a/Master/tlpkg/tlperl/bin/perlglob.exe b/Master/tlpkg/tlperl/bin/perlglob.exe index b1112f6eff1..0202921e0e8 100755 Binary files a/Master/tlpkg/tlperl/bin/perlglob.exe and b/Master/tlpkg/tlperl/bin/perlglob.exe differ diff --git a/Master/tlpkg/tlperl/bin/wperl.exe b/Master/tlpkg/tlperl/bin/wperl.exe index da2ce0e52bb..fa60b5817b0 100755 Binary files a/Master/tlpkg/tlperl/bin/wperl.exe and b/Master/tlpkg/tlperl/bin/wperl.exe differ diff --git a/Master/tlpkg/tlperl/bin/zlib1_.dll b/Master/tlpkg/tlperl/bin/zlib1_.dll deleted file mode 100755 index a4656bb82f6..00000000000 Binary files a/Master/tlpkg/tlperl/bin/zlib1_.dll and /dev/null differ diff --git a/Master/tlpkg/tlperl/lib/.packlist b/Master/tlpkg/tlperl/lib/.packlist index 3b27b3aa86f..56a724340bb 100644 --- a/Master/tlpkg/tlperl/lib/.packlist +++ b/Master/tlpkg/tlperl/lib/.packlist @@ -1,2103 +1,1497 @@ -c:\perl\bin/a2p.exe type=file -c:\perl\bin/c2ph.bat type=file -c:\perl\bin/config_data.bat type=file -c:\perl\bin/corelist.bat type=file -c:\perl\bin/cpan.bat type=file -c:\perl\bin/cpan2dist.bat type=file -c:\perl\bin/cpanp-run-perl.bat type=file -c:\perl\bin/cpanp.bat type=file -c:\perl\bin/enc2xs.bat type=file -c:\perl\bin/find2perl.bat type=file -c:\perl\bin/h2ph.bat type=file -c:\perl\bin/h2xs.bat type=file -c:\perl\bin/instmodsh.bat type=file -c:\perl\bin/json_pp.bat type=file -c:\perl\bin/libnetcfg.bat type=file -c:\perl\bin/perl.exe from=c:\perl\bin/perl5.18.2.exe type=link -c:\perl\bin/perl5.18.2.exe type=file -c:\perl\bin/perl518.dll type=file -c:\perl\bin/perlbug.bat type=file -c:\perl\bin/perldoc.bat type=file -c:\perl\bin/perlivp.bat type=file -c:\perl\bin/perlthanks.bat from=c:\perl\bin/perlbug.bat type=link -c:\perl\bin/piconv.bat type=file -c:\perl\bin/pl2pm.bat type=file -c:\perl\bin/pod2html.bat type=file -c:\perl\bin/pod2latex.bat type=file -c:\perl\bin/pod2man.bat type=file -c:\perl\bin/pod2text.bat type=file -c:\perl\bin/pod2usage.bat type=file -c:\perl\bin/podchecker.bat type=file -c:\perl\bin/podselect.bat type=file -c:\perl\bin/prove.bat type=file -c:\perl\bin/psed.bat from=c:\perl\bin/s2p.bat type=link -c:\perl\bin/pstruct.bat from=c:\perl\bin/c2ph.bat type=link -c:\perl\bin/ptar.bat type=file -c:\perl\bin/ptardiff.bat type=file -c:\perl\bin/ptargrep.bat type=file -c:\perl\bin/s2p.bat type=file -c:\perl\bin/shasum.bat type=file -c:\perl\bin/splain.bat type=file -c:\perl\bin/xsubpp.bat type=file -c:\perl\bin/zipdetails.bat type=file -c:\perl\lib/AnyDBM_File.pm type=file -c:\perl\lib/App/Cpan.pm type=file -c:\perl\lib/App/Prove.pm type=file -c:\perl\lib/App/Prove/State.pm type=file -c:\perl\lib/App/Prove/State/Result.pm type=file -c:\perl\lib/App/Prove/State/Result/Test.pm type=file -c:\perl\lib/Archive/Extract.pm type=file -c:\perl\lib/Archive/Tar.pm type=file -c:\perl\lib/Archive/Tar/Constant.pm type=file -c:\perl\lib/Archive/Tar/File.pm type=file -c:\perl\lib/Attribute/Handlers.pm type=file -c:\perl\lib/AutoLoader.pm type=file -c:\perl\lib/AutoSplit.pm type=file -c:\perl\lib/B.pm type=file -c:\perl\lib/B/Concise.pm type=file -c:\perl\lib/B/Debug.pm type=file -c:\perl\lib/B/Deparse.pm type=file -c:\perl\lib/B/Lint.pm type=file -c:\perl\lib/B/Lint/Debug.pm type=file -c:\perl\lib/B/Showlex.pm type=file -c:\perl\lib/B/Terse.pm type=file -c:\perl\lib/B/Xref.pm type=file -c:\perl\lib/Benchmark.pm type=file -c:\perl\lib/CGI.pm type=file -c:\perl\lib/CGI/Apache.pm type=file -c:\perl\lib/CGI/Carp.pm type=file -c:\perl\lib/CGI/Cookie.pm type=file -c:\perl\lib/CGI/Fast.pm type=file -c:\perl\lib/CGI/Pretty.pm type=file -c:\perl\lib/CGI/Push.pm type=file -c:\perl\lib/CGI/Switch.pm type=file -c:\perl\lib/CGI/Util.pm type=file -c:\perl\lib/CORE.pod type=file -c:\perl\lib/CORE/EXTERN.h type=file -c:\perl\lib/CORE/INTERN.h type=file -c:\perl\lib/CORE/XSUB.h type=file -c:\perl\lib/CORE/arpa/inet.h type=file -c:\perl\lib/CORE/av.h type=file -c:\perl\lib/CORE/bitcount.h type=file -c:\perl\lib/CORE/charclass_invlists.h type=file -c:\perl\lib/CORE/config.h type=file -c:\perl\lib/CORE/cop.h type=file -c:\perl\lib/CORE/cv.h type=file -c:\perl\lib/CORE/dirent.h type=file -c:\perl\lib/CORE/dosish.h type=file -c:\perl\lib/CORE/embed.h type=file -c:\perl\lib/CORE/embedvar.h type=file -c:\perl\lib/CORE/fakesdio.h type=file -c:\perl\lib/CORE/fakethr.h type=file -c:\perl\lib/CORE/feature.h type=file -c:\perl\lib/CORE/form.h type=file -c:\perl\lib/CORE/git_version.h type=file -c:\perl\lib/CORE/gv.h type=file -c:\perl\lib/CORE/handy.h type=file -c:\perl\lib/CORE/hv.h type=file -c:\perl\lib/CORE/hv_func.h type=file -c:\perl\lib/CORE/inline.h type=file -c:\perl\lib/CORE/intrpvar.h type=file -c:\perl\lib/CORE/iperlsys.h type=file -c:\perl\lib/CORE/keywords.h type=file -c:\perl\lib/CORE/l1_char_class_tab.h type=file -c:\perl\lib/CORE/libperl518.a type=file -c:\perl\lib/CORE/malloc_ctl.h type=file -c:\perl\lib/CORE/metaconfig.h type=file -c:\perl\lib/CORE/mg.h type=file -c:\perl\lib/CORE/mg_data.h type=file -c:\perl\lib/CORE/mg_raw.h type=file -c:\perl\lib/CORE/mg_vtable.h type=file -c:\perl\lib/CORE/mydtrace.h type=file -c:\perl\lib/CORE/netdb.h type=file -c:\perl\lib/CORE/nostdio.h type=file -c:\perl\lib/CORE/op.h type=file -c:\perl\lib/CORE/op_reg_common.h type=file -c:\perl\lib/CORE/opcode.h type=file -c:\perl\lib/CORE/opnames.h type=file -c:\perl\lib/CORE/overload.h type=file -c:\perl\lib/CORE/pad.h type=file -c:\perl\lib/CORE/parser.h type=file -c:\perl\lib/CORE/patchlevel.h type=file -c:\perl\lib/CORE/perl.h type=file -c:\perl\lib/CORE/perlapi.h type=file -c:\perl\lib/CORE/perlhost.h type=file -c:\perl\lib/CORE/perlio.h type=file -c:\perl\lib/CORE/perliol.h type=file -c:\perl\lib/CORE/perlsdio.h type=file -c:\perl\lib/CORE/perlsfio.h type=file -c:\perl\lib/CORE/perlvars.h type=file -c:\perl\lib/CORE/perly.h type=file -c:\perl\lib/CORE/pp.h type=file -c:\perl\lib/CORE/pp_proto.h type=file -c:\perl\lib/CORE/proto.h type=file -c:\perl\lib/CORE/reentr.h type=file -c:\perl\lib/CORE/regcharclass.h type=file -c:\perl\lib/CORE/regcomp.h type=file -c:\perl\lib/CORE/regexp.h type=file -c:\perl\lib/CORE/regnodes.h type=file -c:\perl\lib/CORE/scope.h type=file -c:\perl\lib/CORE/sv.h type=file -c:\perl\lib/CORE/sys/socket.h type=file -c:\perl\lib/CORE/thread.h type=file -c:\perl\lib/CORE/time64.h type=file -c:\perl\lib/CORE/time64_config.h type=file -c:\perl\lib/CORE/uconfig.h type=file -c:\perl\lib/CORE/unicode_constants.h type=file -c:\perl\lib/CORE/unixish.h type=file -c:\perl\lib/CORE/utf8.h type=file -c:\perl\lib/CORE/utfebcdic.h type=file -c:\perl\lib/CORE/util.h type=file -c:\perl\lib/CORE/uudmap.h type=file -c:\perl\lib/CORE/vdir.h type=file -c:\perl\lib/CORE/vmem.h type=file -c:\perl\lib/CORE/warnings.h type=file -c:\perl\lib/CORE/win32.h type=file -c:\perl\lib/CORE/win32iop-o.h type=file -c:\perl\lib/CORE/win32iop.h type=file -c:\perl\lib/CORE/win32thread.h type=file -c:\perl\lib/CORE/wince.h type=file -c:\perl\lib/CPAN.pm type=file -c:\perl\lib/CPAN/API/HOWTO.pod type=file -c:\perl\lib/CPAN/Author.pm type=file -c:\perl\lib/CPAN/Bundle.pm type=file -c:\perl\lib/CPAN/CacheMgr.pm type=file -c:\perl\lib/CPAN/Complete.pm type=file -c:\perl\lib/CPAN/Debug.pm type=file -c:\perl\lib/CPAN/DeferredCode.pm type=file -c:\perl\lib/CPAN/Distribution.pm type=file -c:\perl\lib/CPAN/Distroprefs.pm type=file -c:\perl\lib/CPAN/Distrostatus.pm type=file -c:\perl\lib/CPAN/Exception/RecursiveDependency.pm type=file -c:\perl\lib/CPAN/Exception/blocked_urllist.pm type=file -c:\perl\lib/CPAN/Exception/yaml_not_installed.pm type=file -c:\perl\lib/CPAN/Exception/yaml_process_error.pm type=file -c:\perl\lib/CPAN/FTP.pm type=file -c:\perl\lib/CPAN/FTP/netrc.pm type=file -c:\perl\lib/CPAN/FirstTime.pm type=file -c:\perl\lib/CPAN/HTTP/Client.pm type=file -c:\perl\lib/CPAN/HTTP/Credentials.pm type=file -c:\perl\lib/CPAN/HandleConfig.pm type=file -c:\perl\lib/CPAN/Index.pm type=file -c:\perl\lib/CPAN/InfoObj.pm type=file -c:\perl\lib/CPAN/Kwalify.pm type=file -c:\perl\lib/CPAN/Kwalify/distroprefs.dd type=file -c:\perl\lib/CPAN/Kwalify/distroprefs.yml type=file -c:\perl\lib/CPAN/LWP/UserAgent.pm type=file -c:\perl\lib/CPAN/Meta.pm type=file -c:\perl\lib/CPAN/Meta/Converter.pm type=file -c:\perl\lib/CPAN/Meta/Feature.pm type=file -c:\perl\lib/CPAN/Meta/History.pm type=file -c:\perl\lib/CPAN/Meta/Prereqs.pm type=file -c:\perl\lib/CPAN/Meta/Requirements.pm type=file -c:\perl\lib/CPAN/Meta/Spec.pm type=file -c:\perl\lib/CPAN/Meta/Validator.pm type=file -c:\perl\lib/CPAN/Meta/YAML.pm type=file -c:\perl\lib/CPAN/Mirrors.pm type=file -c:\perl\lib/CPAN/Module.pm type=file -c:\perl\lib/CPAN/Nox.pm type=file -c:\perl\lib/CPAN/Prompt.pm type=file -c:\perl\lib/CPAN/Queue.pm type=file -c:\perl\lib/CPAN/Shell.pm type=file -c:\perl\lib/CPAN/Tarzip.pm type=file -c:\perl\lib/CPAN/URL.pm type=file -c:\perl\lib/CPAN/Version.pm type=file -c:\perl\lib/CPANPLUS.pm type=file -c:\perl\lib/CPANPLUS/Backend.pm type=file -c:\perl\lib/CPANPLUS/Backend/RV.pm type=file -c:\perl\lib/CPANPLUS/Config.pm type=file -c:\perl\lib/CPANPLUS/Config/HomeEnv.pm type=file -c:\perl\lib/CPANPLUS/Configure.pm type=file -c:\perl\lib/CPANPLUS/Configure/Setup.pm type=file -c:\perl\lib/CPANPLUS/Dist.pm type=file -c:\perl\lib/CPANPLUS/Dist/Autobundle.pm type=file -c:\perl\lib/CPANPLUS/Dist/Base.pm type=file -c:\perl\lib/CPANPLUS/Dist/Build.pm type=file -c:\perl\lib/CPANPLUS/Dist/Build/Constants.pm type=file -c:\perl\lib/CPANPLUS/Dist/MM.pm type=file -c:\perl\lib/CPANPLUS/Dist/Sample.pm type=file -c:\perl\lib/CPANPLUS/Error.pm type=file -c:\perl\lib/CPANPLUS/FAQ.pod type=file -c:\perl\lib/CPANPLUS/Hacking.pod type=file -c:\perl\lib/CPANPLUS/Internals.pm type=file -c:\perl\lib/CPANPLUS/Internals/Constants.pm type=file -c:\perl\lib/CPANPLUS/Internals/Constants/Report.pm type=file -c:\perl\lib/CPANPLUS/Internals/Extract.pm type=file -c:\perl\lib/CPANPLUS/Internals/Fetch.pm type=file -c:\perl\lib/CPANPLUS/Internals/Report.pm type=file -c:\perl\lib/CPANPLUS/Internals/Search.pm type=file -c:\perl\lib/CPANPLUS/Internals/Source.pm type=file -c:\perl\lib/CPANPLUS/Internals/Source/Memory.pm type=file -c:\perl\lib/CPANPLUS/Internals/Source/SQLite.pm type=file -c:\perl\lib/CPANPLUS/Internals/Source/SQLite/Tie.pm type=file -c:\perl\lib/CPANPLUS/Internals/Utils.pm type=file -c:\perl\lib/CPANPLUS/Internals/Utils/Autoflush.pm type=file -c:\perl\lib/CPANPLUS/Module.pm type=file -c:\perl\lib/CPANPLUS/Module/Author.pm type=file -c:\perl\lib/CPANPLUS/Module/Author/Fake.pm type=file -c:\perl\lib/CPANPLUS/Module/Checksums.pm type=file -c:\perl\lib/CPANPLUS/Module/Fake.pm type=file -c:\perl\lib/CPANPLUS/Module/Signature.pm type=file -c:\perl\lib/CPANPLUS/Selfupdate.pm type=file -c:\perl\lib/CPANPLUS/Shell.pm type=file -c:\perl\lib/CPANPLUS/Shell/Classic.pm type=file -c:\perl\lib/CPANPLUS/Shell/Default.pm type=file -c:\perl\lib/CPANPLUS/Shell/Default/Plugins/CustomSource.pm type=file -c:\perl\lib/CPANPLUS/Shell/Default/Plugins/HOWTO.pod type=file -c:\perl\lib/CPANPLUS/Shell/Default/Plugins/Remote.pm type=file -c:\perl\lib/CPANPLUS/Shell/Default/Plugins/Source.pm type=file -c:\perl\lib/Carp.pm type=file -c:\perl\lib/Carp/Heavy.pm type=file -c:\perl\lib/Class/Struct.pm type=file -c:\perl\lib/Compress/Raw/Bzip2.pm type=file -c:\perl\lib/Compress/Raw/Zlib.pm type=file -c:\perl\lib/Compress/Zlib.pm type=file -c:\perl\lib/Config.pm type=file -c:\perl\lib/Config.pod type=file -c:\perl\lib/Config/Extensions.pm type=file -c:\perl\lib/Config/Perl/V.pm type=file -c:\perl\lib/Config_git.pl type=file -c:\perl\lib/Config_heavy.pl type=file -c:\perl\lib/Cwd.pm type=file -c:\perl\lib/DB.pm type=file -c:\perl\lib/DBM_Filter.pm type=file -c:\perl\lib/DBM_Filter/compress.pm type=file -c:\perl\lib/DBM_Filter/encode.pm type=file -c:\perl\lib/DBM_Filter/int32.pm type=file -c:\perl\lib/DBM_Filter/null.pm type=file -c:\perl\lib/DBM_Filter/utf8.pm type=file -c:\perl\lib/Data/Dumper.pm type=file -c:\perl\lib/Devel/InnerPackage.pm type=file -c:\perl\lib/Devel/PPPort.pm type=file -c:\perl\lib/Devel/Peek.pm type=file -c:\perl\lib/Devel/SelfStubber.pm type=file -c:\perl\lib/Digest.pm type=file -c:\perl\lib/Digest/MD5.pm type=file -c:\perl\lib/Digest/SHA.pm type=file -c:\perl\lib/Digest/base.pm type=file -c:\perl\lib/Digest/file.pm type=file -c:\perl\lib/DirHandle.pm type=file -c:\perl\lib/Dumpvalue.pm type=file -c:\perl\lib/DynaLoader.pm type=file -c:\perl\lib/Encode.pm type=file -c:\perl\lib/Encode/Alias.pm type=file -c:\perl\lib/Encode/Byte.pm type=file -c:\perl\lib/Encode/CJKConstants.pm type=file -c:\perl\lib/Encode/CN.pm type=file -c:\perl\lib/Encode/CN/HZ.pm type=file -c:\perl\lib/Encode/Changes.e2x type=file -c:\perl\lib/Encode/Config.pm type=file -c:\perl\lib/Encode/ConfigLocal_PM.e2x type=file -c:\perl\lib/Encode/EBCDIC.pm type=file -c:\perl\lib/Encode/Encoder.pm type=file -c:\perl\lib/Encode/Encoding.pm type=file -c:\perl\lib/Encode/GSM0338.pm type=file -c:\perl\lib/Encode/Guess.pm type=file -c:\perl\lib/Encode/JP.pm type=file -c:\perl\lib/Encode/JP/H2Z.pm type=file -c:\perl\lib/Encode/JP/JIS7.pm type=file -c:\perl\lib/Encode/KR.pm type=file -c:\perl\lib/Encode/KR/2022_KR.pm type=file -c:\perl\lib/Encode/MIME/Header.pm type=file -c:\perl\lib/Encode/MIME/Header/ISO_2022_JP.pm type=file -c:\perl\lib/Encode/MIME/Name.pm type=file -c:\perl\lib/Encode/Makefile_PL.e2x type=file -c:\perl\lib/Encode/PerlIO.pod type=file -c:\perl\lib/Encode/README.e2x type=file -c:\perl\lib/Encode/Supported.pod type=file -c:\perl\lib/Encode/Symbol.pm type=file -c:\perl\lib/Encode/TW.pm type=file -c:\perl\lib/Encode/Unicode.pm type=file -c:\perl\lib/Encode/Unicode/UTF7.pm type=file -c:\perl\lib/Encode/_PM.e2x type=file -c:\perl\lib/Encode/_T.e2x type=file -c:\perl\lib/Encode/encode.h type=file -c:\perl\lib/English.pm type=file -c:\perl\lib/Env.pm type=file -c:\perl\lib/Errno.pm type=file -c:\perl\lib/Exporter.pm type=file -c:\perl\lib/Exporter/Heavy.pm type=file -c:\perl\lib/ExtUtils/CBuilder.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Base.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/Unix.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/VMS.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/Windows.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/aix.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/cygwin.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/darwin.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/dec_osf.pm type=file -c:\perl\lib/ExtUtils/CBuilder/Platform/os2.pm type=file -c:\perl\lib/ExtUtils/Command.pm type=file -c:\perl\lib/ExtUtils/Command/MM.pm type=file -c:\perl\lib/ExtUtils/Constant.pm type=file -c:\perl\lib/ExtUtils/Constant/Base.pm type=file -c:\perl\lib/ExtUtils/Constant/ProxySubs.pm type=file -c:\perl\lib/ExtUtils/Constant/Utils.pm type=file -c:\perl\lib/ExtUtils/Constant/XS.pm type=file -c:\perl\lib/ExtUtils/Embed.pm type=file -c:\perl\lib/ExtUtils/Install.pm type=file -c:\perl\lib/ExtUtils/Installed.pm type=file -c:\perl\lib/ExtUtils/Liblist.pm type=file -c:\perl\lib/ExtUtils/Liblist/Kid.pm type=file -c:\perl\lib/ExtUtils/MANIFEST.SKIP type=file -c:\perl\lib/ExtUtils/MM.pm type=file -c:\perl\lib/ExtUtils/MM_AIX.pm type=file -c:\perl\lib/ExtUtils/MM_Any.pm type=file -c:\perl\lib/ExtUtils/MM_BeOS.pm type=file -c:\perl\lib/ExtUtils/MM_Cygwin.pm type=file -c:\perl\lib/ExtUtils/MM_DOS.pm type=file -c:\perl\lib/ExtUtils/MM_Darwin.pm type=file -c:\perl\lib/ExtUtils/MM_MacOS.pm type=file -c:\perl\lib/ExtUtils/MM_NW5.pm type=file -c:\perl\lib/ExtUtils/MM_OS2.pm type=file -c:\perl\lib/ExtUtils/MM_QNX.pm type=file -c:\perl\lib/ExtUtils/MM_UWIN.pm type=file -c:\perl\lib/ExtUtils/MM_Unix.pm type=file -c:\perl\lib/ExtUtils/MM_VMS.pm type=file -c:\perl\lib/ExtUtils/MM_VOS.pm type=file -c:\perl\lib/ExtUtils/MM_Win32.pm type=file -c:\perl\lib/ExtUtils/MM_Win95.pm type=file -c:\perl\lib/ExtUtils/MY.pm type=file -c:\perl\lib/ExtUtils/MakeMaker.pm type=file -c:\perl\lib/ExtUtils/MakeMaker/Config.pm type=file -c:\perl\lib/ExtUtils/MakeMaker/FAQ.pod type=file -c:\perl\lib/ExtUtils/MakeMaker/Tutorial.pod type=file -c:\perl\lib/ExtUtils/Manifest.pm type=file -c:\perl\lib/ExtUtils/Miniperl.pm type=file -c:\perl\lib/ExtUtils/Mkbootstrap.pm type=file -c:\perl\lib/ExtUtils/Mksymlists.pm type=file -c:\perl\lib/ExtUtils/Packlist.pm type=file -c:\perl\lib/ExtUtils/ParseXS.pm type=file -c:\perl\lib/ExtUtils/ParseXS.pod type=file -c:\perl\lib/ExtUtils/ParseXS/Constants.pm type=file -c:\perl\lib/ExtUtils/ParseXS/CountLines.pm type=file -c:\perl\lib/ExtUtils/ParseXS/Utilities.pm type=file -c:\perl\lib/ExtUtils/Typemaps.pm type=file -c:\perl\lib/ExtUtils/Typemaps/Cmd.pm type=file -c:\perl\lib/ExtUtils/Typemaps/InputMap.pm type=file -c:\perl\lib/ExtUtils/Typemaps/OutputMap.pm type=file -c:\perl\lib/ExtUtils/Typemaps/Type.pm type=file -c:\perl\lib/ExtUtils/testlib.pm type=file -c:\perl\lib/ExtUtils/typemap type=file -c:\perl\lib/ExtUtils/xsubpp type=file -c:\perl\lib/Fatal.pm type=file -c:\perl\lib/Fcntl.pm type=file -c:\perl\lib/File/Basename.pm type=file -c:\perl\lib/File/CheckTree.pm type=file -c:\perl\lib/File/Compare.pm type=file -c:\perl\lib/File/Copy.pm type=file -c:\perl\lib/File/DosGlob.pm type=file -c:\perl\lib/File/Fetch.pm type=file -c:\perl\lib/File/Find.pm type=file -c:\perl\lib/File/Glob.pm type=file -c:\perl\lib/File/GlobMapper.pm type=file -c:\perl\lib/File/Path.pm type=file -c:\perl\lib/File/Spec.pm type=file -c:\perl\lib/File/Spec/Cygwin.pm type=file -c:\perl\lib/File/Spec/Epoc.pm type=file -c:\perl\lib/File/Spec/Functions.pm type=file -c:\perl\lib/File/Spec/Mac.pm type=file -c:\perl\lib/File/Spec/OS2.pm type=file -c:\perl\lib/File/Spec/Unix.pm type=file -c:\perl\lib/File/Spec/VMS.pm type=file -c:\perl\lib/File/Spec/Win32.pm type=file -c:\perl\lib/File/Temp.pm type=file -c:\perl\lib/File/stat.pm type=file -c:\perl\lib/FileCache.pm type=file -c:\perl\lib/FileHandle.pm type=file -c:\perl\lib/Filter/Simple.pm type=file -c:\perl\lib/Filter/Util/Call.pm type=file -c:\perl\lib/FindBin.pm type=file -c:\perl\lib/Getopt/Long.pm type=file -c:\perl\lib/Getopt/Std.pm type=file -c:\perl\lib/HTTP/Tiny.pm type=file -c:\perl\lib/Hash/Util.pm type=file -c:\perl\lib/Hash/Util/FieldHash.pm type=file -c:\perl\lib/I18N/Collate.pm type=file -c:\perl\lib/I18N/LangTags.pm type=file -c:\perl\lib/I18N/LangTags/Detect.pm type=file -c:\perl\lib/I18N/LangTags/List.pm type=file -c:\perl\lib/IO.pm type=file -c:\perl\lib/IO/Compress/Adapter/Bzip2.pm type=file -c:\perl\lib/IO/Compress/Adapter/Deflate.pm type=file -c:\perl\lib/IO/Compress/Adapter/Identity.pm type=file -c:\perl\lib/IO/Compress/Base.pm type=file -c:\perl\lib/IO/Compress/Base/Common.pm type=file -c:\perl\lib/IO/Compress/Bzip2.pm type=file -c:\perl\lib/IO/Compress/Deflate.pm type=file -c:\perl\lib/IO/Compress/FAQ.pod type=file -c:\perl\lib/IO/Compress/Gzip.pm type=file -c:\perl\lib/IO/Compress/Gzip/Constants.pm type=file -c:\perl\lib/IO/Compress/RawDeflate.pm type=file -c:\perl\lib/IO/Compress/Zip.pm type=file -c:\perl\lib/IO/Compress/Zip/Constants.pm type=file -c:\perl\lib/IO/Compress/Zlib/Constants.pm type=file -c:\perl\lib/IO/Compress/Zlib/Extra.pm type=file -c:\perl\lib/IO/Dir.pm type=file -c:\perl\lib/IO/File.pm type=file -c:\perl\lib/IO/Handle.pm type=file -c:\perl\lib/IO/Pipe.pm type=file -c:\perl\lib/IO/Poll.pm type=file -c:\perl\lib/IO/Seekable.pm type=file -c:\perl\lib/IO/Select.pm type=file -c:\perl\lib/IO/Socket.pm type=file -c:\perl\lib/IO/Socket/INET.pm type=file -c:\perl\lib/IO/Socket/UNIX.pm type=file -c:\perl\lib/IO/Uncompress/Adapter/Bunzip2.pm type=file -c:\perl\lib/IO/Uncompress/Adapter/Identity.pm type=file -c:\perl\lib/IO/Uncompress/Adapter/Inflate.pm type=file -c:\perl\lib/IO/Uncompress/AnyInflate.pm type=file -c:\perl\lib/IO/Uncompress/AnyUncompress.pm type=file -c:\perl\lib/IO/Uncompress/Base.pm type=file -c:\perl\lib/IO/Uncompress/Bunzip2.pm type=file -c:\perl\lib/IO/Uncompress/Gunzip.pm type=file -c:\perl\lib/IO/Uncompress/Inflate.pm type=file -c:\perl\lib/IO/Uncompress/RawInflate.pm type=file -c:\perl\lib/IO/Uncompress/Unzip.pm type=file -c:\perl\lib/IO/Zlib.pm type=file -c:\perl\lib/IPC/Cmd.pm type=file -c:\perl\lib/IPC/Open2.pm type=file -c:\perl\lib/IPC/Open3.pm type=file -c:\perl\lib/JSON/PP.pm type=file -c:\perl\lib/JSON/PP/Boolean.pm type=file -c:\perl\lib/List/Util.pm type=file -c:\perl\lib/List/Util/XS.pm type=file -c:\perl\lib/Locale/Codes.pm type=file -c:\perl\lib/Locale/Codes.pod type=file -c:\perl\lib/Locale/Codes/API.pod type=file -c:\perl\lib/Locale/Codes/Changes.pod type=file -c:\perl\lib/Locale/Codes/Constants.pm type=file -c:\perl\lib/Locale/Codes/Constants.pod type=file -c:\perl\lib/Locale/Codes/Country.pm type=file -c:\perl\lib/Locale/Codes/Country.pod type=file -c:\perl\lib/Locale/Codes/Country_Codes.pm type=file -c:\perl\lib/Locale/Codes/Country_Retired.pm type=file -c:\perl\lib/Locale/Codes/Currency.pm type=file -c:\perl\lib/Locale/Codes/Currency.pod type=file -c:\perl\lib/Locale/Codes/Currency_Codes.pm type=file -c:\perl\lib/Locale/Codes/Currency_Retired.pm type=file -c:\perl\lib/Locale/Codes/LangExt.pm type=file -c:\perl\lib/Locale/Codes/LangExt.pod type=file -c:\perl\lib/Locale/Codes/LangExt_Codes.pm type=file -c:\perl\lib/Locale/Codes/LangExt_Retired.pm type=file -c:\perl\lib/Locale/Codes/LangFam.pm type=file -c:\perl\lib/Locale/Codes/LangFam.pod type=file -c:\perl\lib/Locale/Codes/LangFam_Codes.pm type=file -c:\perl\lib/Locale/Codes/LangFam_Retired.pm type=file -c:\perl\lib/Locale/Codes/LangVar.pm type=file -c:\perl\lib/Locale/Codes/LangVar.pod type=file -c:\perl\lib/Locale/Codes/LangVar_Codes.pm type=file -c:\perl\lib/Locale/Codes/LangVar_Retired.pm type=file -c:\perl\lib/Locale/Codes/Language.pm type=file -c:\perl\lib/Locale/Codes/Language.pod type=file -c:\perl\lib/Locale/Codes/Language_Codes.pm type=file -c:\perl\lib/Locale/Codes/Language_Retired.pm type=file -c:\perl\lib/Locale/Codes/Script.pm type=file -c:\perl\lib/Locale/Codes/Script.pod type=file -c:\perl\lib/Locale/Codes/Script_Codes.pm type=file -c:\perl\lib/Locale/Codes/Script_Retired.pm type=file -c:\perl\lib/Locale/Country.pm type=file -c:\perl\lib/Locale/Country.pod type=file -c:\perl\lib/Locale/Currency.pm type=file -c:\perl\lib/Locale/Currency.pod type=file -c:\perl\lib/Locale/Language.pm type=file -c:\perl\lib/Locale/Language.pod type=file -c:\perl\lib/Locale/Maketext.pm type=file -c:\perl\lib/Locale/Maketext.pod type=file -c:\perl\lib/Locale/Maketext/Cookbook.pod type=file -c:\perl\lib/Locale/Maketext/Guts.pm type=file -c:\perl\lib/Locale/Maketext/GutsLoader.pm type=file -c:\perl\lib/Locale/Maketext/Simple.pm type=file -c:\perl\lib/Locale/Maketext/TPJ13.pod type=file -c:\perl\lib/Locale/Script.pm type=file -c:\perl\lib/Locale/Script.pod type=file -c:\perl\lib/Log/Message.pm type=file -c:\perl\lib/Log/Message/Config.pm type=file -c:\perl\lib/Log/Message/Handlers.pm type=file -c:\perl\lib/Log/Message/Item.pm type=file -c:\perl\lib/Log/Message/Simple.pm type=file -c:\perl\lib/MIME/Base64.pm type=file -c:\perl\lib/MIME/QuotedPrint.pm type=file -c:\perl\lib/Math/BigFloat.pm type=file -c:\perl\lib/Math/BigFloat/Trace.pm type=file -c:\perl\lib/Math/BigInt.pm type=file -c:\perl\lib/Math/BigInt/Calc.pm type=file -c:\perl\lib/Math/BigInt/CalcEmu.pm type=file -c:\perl\lib/Math/BigInt/FastCalc.pm type=file -c:\perl\lib/Math/BigInt/Trace.pm type=file -c:\perl\lib/Math/BigRat.pm type=file -c:\perl\lib/Math/Complex.pm type=file -c:\perl\lib/Math/Trig.pm type=file -c:\perl\lib/Memoize.pm type=file -c:\perl\lib/Memoize/AnyDBM_File.pm type=file -c:\perl\lib/Memoize/Expire.pm type=file -c:\perl\lib/Memoize/ExpireFile.pm type=file -c:\perl\lib/Memoize/ExpireTest.pm type=file -c:\perl\lib/Memoize/NDBM_File.pm type=file -c:\perl\lib/Memoize/SDBM_File.pm type=file -c:\perl\lib/Memoize/Storable.pm type=file -c:\perl\lib/Module/Build.pm type=file -c:\perl\lib/Module/Build/API.pod type=file -c:\perl\lib/Module/Build/Authoring.pod type=file -c:\perl\lib/Module/Build/Base.pm type=file -c:\perl\lib/Module/Build/Bundling.pod type=file -c:\perl\lib/Module/Build/Compat.pm type=file -c:\perl\lib/Module/Build/Config.pm type=file -c:\perl\lib/Module/Build/ConfigData.pm type=file -c:\perl\lib/Module/Build/Cookbook.pm type=file -c:\perl\lib/Module/Build/Dumper.pm type=file -c:\perl\lib/Module/Build/ModuleInfo.pm type=file -c:\perl\lib/Module/Build/Notes.pm type=file -c:\perl\lib/Module/Build/PPMMaker.pm type=file -c:\perl\lib/Module/Build/Platform/Amiga.pm type=file -c:\perl\lib/Module/Build/Platform/Default.pm type=file -c:\perl\lib/Module/Build/Platform/EBCDIC.pm type=file -c:\perl\lib/Module/Build/Platform/MPEiX.pm type=file -c:\perl\lib/Module/Build/Platform/MacOS.pm type=file -c:\perl\lib/Module/Build/Platform/RiscOS.pm type=file -c:\perl\lib/Module/Build/Platform/Unix.pm type=file -c:\perl\lib/Module/Build/Platform/VMS.pm type=file -c:\perl\lib/Module/Build/Platform/VOS.pm type=file -c:\perl\lib/Module/Build/Platform/Windows.pm type=file -c:\perl\lib/Module/Build/Platform/aix.pm type=file -c:\perl\lib/Module/Build/Platform/cygwin.pm type=file -c:\perl\lib/Module/Build/Platform/darwin.pm type=file -c:\perl\lib/Module/Build/Platform/os2.pm type=file -c:\perl\lib/Module/Build/PodParser.pm type=file -c:\perl\lib/Module/Build/Version.pm type=file -c:\perl\lib/Module/Build/YAML.pm type=file -c:\perl\lib/Module/CoreList.pm type=file -c:\perl\lib/Module/CoreList.pod type=file -c:\perl\lib/Module/CoreList/TieHashDelta.pm type=file -c:\perl\lib/Module/CoreList/Utils.pm type=file -c:\perl\lib/Module/Load.pm type=file -c:\perl\lib/Module/Load/Conditional.pm type=file -c:\perl\lib/Module/Loaded.pm type=file -c:\perl\lib/Module/Metadata.pm type=file -c:\perl\lib/Module/Pluggable.pm type=file -c:\perl\lib/Module/Pluggable/Object.pm type=file -c:\perl\lib/NEXT.pm type=file -c:\perl\lib/Net/Cmd.pm type=file -c:\perl\lib/Net/Config.pm type=file -c:\perl\lib/Net/Domain.pm type=file -c:\perl\lib/Net/FTP.pm type=file -c:\perl\lib/Net/FTP/A.pm type=file -c:\perl\lib/Net/FTP/E.pm type=file -c:\perl\lib/Net/FTP/I.pm type=file -c:\perl\lib/Net/FTP/L.pm type=file -c:\perl\lib/Net/FTP/dataconn.pm type=file -c:\perl\lib/Net/NNTP.pm type=file -c:\perl\lib/Net/Netrc.pm type=file -c:\perl\lib/Net/POP3.pm type=file -c:\perl\lib/Net/Ping.pm type=file -c:\perl\lib/Net/SMTP.pm type=file -c:\perl\lib/Net/Time.pm type=file -c:\perl\lib/Net/hostent.pm type=file -c:\perl\lib/Net/libnetFAQ.pod type=file -c:\perl\lib/Net/netent.pm type=file -c:\perl\lib/Net/protoent.pm type=file -c:\perl\lib/Net/servent.pm type=file -c:\perl\lib/O.pm type=file -c:\perl\lib/Object/Accessor.pm type=file -c:\perl\lib/Opcode.pm type=file -c:\perl\lib/POSIX.pm type=file -c:\perl\lib/POSIX.pod type=file -c:\perl\lib/Package/Constants.pm type=file -c:\perl\lib/Params/Check.pm type=file -c:\perl\lib/Parse/CPAN/Meta.pm type=file -c:\perl\lib/Perl/OSType.pm type=file -c:\perl\lib/PerlIO.pm type=file -c:\perl\lib/PerlIO/encoding.pm type=file -c:\perl\lib/PerlIO/mmap.pm type=file -c:\perl\lib/PerlIO/scalar.pm type=file -c:\perl\lib/PerlIO/via.pm type=file -c:\perl\lib/PerlIO/via/QuotedPrint.pm type=file -c:\perl\lib/Pod/Checker.pm type=file -c:\perl\lib/Pod/Escapes.pm type=file -c:\perl\lib/Pod/Find.pm type=file -c:\perl\lib/Pod/Functions.pm type=file -c:\perl\lib/Pod/Html.pm type=file -c:\perl\lib/Pod/InputObjects.pm type=file -c:\perl\lib/Pod/LaTeX.pm type=file -c:\perl\lib/Pod/Man.pm type=file -c:\perl\lib/Pod/ParseLink.pm type=file -c:\perl\lib/Pod/ParseUtils.pm type=file -c:\perl\lib/Pod/Parser.pm type=file -c:\perl\lib/Pod/Perldoc.pm type=file -c:\perl\lib/Pod/Perldoc/BaseTo.pm type=file -c:\perl\lib/Pod/Perldoc/GetOptsOO.pm type=file -c:\perl\lib/Pod/Perldoc/ToANSI.pm type=file -c:\perl\lib/Pod/Perldoc/ToChecker.pm type=file -c:\perl\lib/Pod/Perldoc/ToMan.pm type=file -c:\perl\lib/Pod/Perldoc/ToNroff.pm type=file -c:\perl\lib/Pod/Perldoc/ToPod.pm type=file -c:\perl\lib/Pod/Perldoc/ToRtf.pm type=file -c:\perl\lib/Pod/Perldoc/ToTerm.pm type=file -c:\perl\lib/Pod/Perldoc/ToText.pm type=file -c:\perl\lib/Pod/Perldoc/ToTk.pm type=file -c:\perl\lib/Pod/Perldoc/ToXml.pm type=file -c:\perl\lib/Pod/PlainText.pm type=file -c:\perl\lib/Pod/Select.pm type=file -c:\perl\lib/Pod/Simple.pm type=file -c:\perl\lib/Pod/Simple.pod type=file -c:\perl\lib/Pod/Simple/BlackBox.pm type=file -c:\perl\lib/Pod/Simple/Checker.pm type=file -c:\perl\lib/Pod/Simple/Debug.pm type=file -c:\perl\lib/Pod/Simple/DumpAsText.pm type=file -c:\perl\lib/Pod/Simple/DumpAsXML.pm type=file -c:\perl\lib/Pod/Simple/HTML.pm type=file -c:\perl\lib/Pod/Simple/HTMLBatch.pm type=file -c:\perl\lib/Pod/Simple/HTMLLegacy.pm type=file -c:\perl\lib/Pod/Simple/LinkSection.pm type=file -c:\perl\lib/Pod/Simple/Methody.pm type=file -c:\perl\lib/Pod/Simple/Progress.pm type=file -c:\perl\lib/Pod/Simple/PullParser.pm type=file -c:\perl\lib/Pod/Simple/PullParserEndToken.pm type=file -c:\perl\lib/Pod/Simple/PullParserStartToken.pm type=file -c:\perl\lib/Pod/Simple/PullParserTextToken.pm type=file -c:\perl\lib/Pod/Simple/PullParserToken.pm type=file -c:\perl\lib/Pod/Simple/RTF.pm type=file -c:\perl\lib/Pod/Simple/Search.pm type=file -c:\perl\lib/Pod/Simple/SimpleTree.pm type=file -c:\perl\lib/Pod/Simple/Subclassing.pod type=file -c:\perl\lib/Pod/Simple/Text.pm type=file -c:\perl\lib/Pod/Simple/TextContent.pm type=file -c:\perl\lib/Pod/Simple/TiedOutFH.pm type=file -c:\perl\lib/Pod/Simple/Transcode.pm type=file -c:\perl\lib/Pod/Simple/TranscodeDumb.pm type=file -c:\perl\lib/Pod/Simple/TranscodeSmart.pm type=file -c:\perl\lib/Pod/Simple/XHTML.pm type=file -c:\perl\lib/Pod/Simple/XMLOutStream.pm type=file -c:\perl\lib/Pod/Text.pm type=file -c:\perl\lib/Pod/Text/Color.pm type=file -c:\perl\lib/Pod/Text/Overstrike.pm type=file -c:\perl\lib/Pod/Text/Termcap.pm type=file -c:\perl\lib/Pod/Usage.pm type=file -c:\perl\lib/SDBM_File.pm type=file -c:\perl\lib/Safe.pm type=file -c:\perl\lib/Scalar/Util.pm type=file -c:\perl\lib/Search/Dict.pm type=file -c:\perl\lib/SelectSaver.pm type=file -c:\perl\lib/SelfLoader.pm type=file -c:\perl\lib/Socket.pm type=file -c:\perl\lib/Storable.pm type=file -c:\perl\lib/Symbol.pm type=file -c:\perl\lib/Sys/Hostname.pm type=file -c:\perl\lib/TAP/Base.pm type=file -c:\perl\lib/TAP/Formatter/Base.pm type=file -c:\perl\lib/TAP/Formatter/Color.pm type=file -c:\perl\lib/TAP/Formatter/Console.pm type=file -c:\perl\lib/TAP/Formatter/Console/ParallelSession.pm type=file -c:\perl\lib/TAP/Formatter/Console/Session.pm type=file -c:\perl\lib/TAP/Formatter/File.pm type=file -c:\perl\lib/TAP/Formatter/File/Session.pm type=file -c:\perl\lib/TAP/Formatter/Session.pm type=file -c:\perl\lib/TAP/Harness.pm type=file -c:\perl\lib/TAP/Harness/Beyond.pod type=file -c:\perl\lib/TAP/Object.pm type=file -c:\perl\lib/TAP/Parser.pm type=file -c:\perl\lib/TAP/Parser/Aggregator.pm type=file -c:\perl\lib/TAP/Parser/Grammar.pm type=file -c:\perl\lib/TAP/Parser/Iterator.pm type=file -c:\perl\lib/TAP/Parser/Iterator/Array.pm type=file -c:\perl\lib/TAP/Parser/Iterator/Process.pm type=file -c:\perl\lib/TAP/Parser/Iterator/Stream.pm type=file -c:\perl\lib/TAP/Parser/IteratorFactory.pm type=file -c:\perl\lib/TAP/Parser/Multiplexer.pm type=file -c:\perl\lib/TAP/Parser/Result.pm type=file -c:\perl\lib/TAP/Parser/Result/Bailout.pm type=file -c:\perl\lib/TAP/Parser/Result/Comment.pm type=file -c:\perl\lib/TAP/Parser/Result/Plan.pm type=file -c:\perl\lib/TAP/Parser/Result/Pragma.pm type=file -c:\perl\lib/TAP/Parser/Result/Test.pm type=file -c:\perl\lib/TAP/Parser/Result/Unknown.pm type=file -c:\perl\lib/TAP/Parser/Result/Version.pm type=file -c:\perl\lib/TAP/Parser/Result/YAML.pm type=file -c:\perl\lib/TAP/Parser/ResultFactory.pm type=file -c:\perl\lib/TAP/Parser/Scheduler.pm type=file -c:\perl\lib/TAP/Parser/Scheduler/Job.pm type=file -c:\perl\lib/TAP/Parser/Scheduler/Spinner.pm type=file -c:\perl\lib/TAP/Parser/Source.pm type=file -c:\perl\lib/TAP/Parser/SourceHandler.pm type=file -c:\perl\lib/TAP/Parser/SourceHandler/Executable.pm type=file -c:\perl\lib/TAP/Parser/SourceHandler/File.pm type=file -c:\perl\lib/TAP/Parser/SourceHandler/Handle.pm type=file -c:\perl\lib/TAP/Parser/SourceHandler/Perl.pm type=file -c:\perl\lib/TAP/Parser/SourceHandler/RawTAP.pm type=file -c:\perl\lib/TAP/Parser/Utils.pm type=file -c:\perl\lib/TAP/Parser/YAMLish/Reader.pm type=file -c:\perl\lib/TAP/Parser/YAMLish/Writer.pm type=file -c:\perl\lib/Term/ANSIColor.pm type=file -c:\perl\lib/Term/Cap.pm type=file -c:\perl\lib/Term/Complete.pm type=file -c:\perl\lib/Term/ReadLine.pm type=file -c:\perl\lib/Term/UI.pm type=file -c:\perl\lib/Term/UI/History.pm type=file -c:\perl\lib/Test.pm type=file -c:\perl\lib/Test/Builder.pm type=file -c:\perl\lib/Test/Builder/Module.pm type=file -c:\perl\lib/Test/Builder/Tester.pm type=file -c:\perl\lib/Test/Builder/Tester/Color.pm type=file -c:\perl\lib/Test/Harness.pm type=file -c:\perl\lib/Test/More.pm type=file -c:\perl\lib/Test/Simple.pm type=file -c:\perl\lib/Test/Tutorial.pod type=file -c:\perl\lib/Text/Abbrev.pm type=file -c:\perl\lib/Text/Balanced.pm type=file -c:\perl\lib/Text/ParseWords.pm type=file -c:\perl\lib/Text/Soundex.pm type=file -c:\perl\lib/Text/Tabs.pm type=file -c:\perl\lib/Text/Wrap.pm type=file -c:\perl\lib/Thread.pm type=file -c:\perl\lib/Thread/Queue.pm type=file -c:\perl\lib/Thread/Semaphore.pm type=file -c:\perl\lib/Tie/Array.pm type=file -c:\perl\lib/Tie/File.pm type=file -c:\perl\lib/Tie/Handle.pm type=file -c:\perl\lib/Tie/Hash.pm type=file -c:\perl\lib/Tie/Hash/NamedCapture.pm type=file -c:\perl\lib/Tie/Memoize.pm type=file -c:\perl\lib/Tie/RefHash.pm type=file -c:\perl\lib/Tie/Scalar.pm type=file -c:\perl\lib/Tie/StdHandle.pm type=file -c:\perl\lib/Tie/SubstrHash.pm type=file -c:\perl\lib/Time/HiRes.pm type=file -c:\perl\lib/Time/Local.pm type=file -c:\perl\lib/Time/Piece.pm type=file -c:\perl\lib/Time/Seconds.pm type=file -c:\perl\lib/Time/gmtime.pm type=file -c:\perl\lib/Time/localtime.pm type=file -c:\perl\lib/Time/tm.pm type=file -c:\perl\lib/UNIVERSAL.pm type=file -c:\perl\lib/Unicode/Collate.pm type=file -c:\perl\lib/Unicode/Collate/CJK/Big5.pm type=file -c:\perl\lib/Unicode/Collate/CJK/GB2312.pm type=file -c:\perl\lib/Unicode/Collate/CJK/JISX0208.pm type=file -c:\perl\lib/Unicode/Collate/CJK/Korean.pm type=file -c:\perl\lib/Unicode/Collate/CJK/Pinyin.pm type=file -c:\perl\lib/Unicode/Collate/CJK/Stroke.pm type=file -c:\perl\lib/Unicode/Collate/CJK/Zhuyin.pm type=file -c:\perl\lib/Unicode/Collate/Locale.pm type=file -c:\perl\lib/Unicode/Collate/Locale/af.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ar.pl type=file -c:\perl\lib/Unicode/Collate/Locale/as.pl type=file -c:\perl\lib/Unicode/Collate/Locale/az.pl type=file -c:\perl\lib/Unicode/Collate/Locale/be.pl type=file -c:\perl\lib/Unicode/Collate/Locale/bg.pl type=file -c:\perl\lib/Unicode/Collate/Locale/bn.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ca.pl type=file -c:\perl\lib/Unicode/Collate/Locale/cs.pl type=file -c:\perl\lib/Unicode/Collate/Locale/cy.pl type=file -c:\perl\lib/Unicode/Collate/Locale/da.pl type=file -c:\perl\lib/Unicode/Collate/Locale/de_phone.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ee.pl type=file -c:\perl\lib/Unicode/Collate/Locale/eo.pl type=file -c:\perl\lib/Unicode/Collate/Locale/es.pl type=file -c:\perl\lib/Unicode/Collate/Locale/es_trad.pl type=file -c:\perl\lib/Unicode/Collate/Locale/et.pl type=file -c:\perl\lib/Unicode/Collate/Locale/fa.pl type=file -c:\perl\lib/Unicode/Collate/Locale/fi.pl type=file -c:\perl\lib/Unicode/Collate/Locale/fi_phone.pl type=file -c:\perl\lib/Unicode/Collate/Locale/fil.pl type=file -c:\perl\lib/Unicode/Collate/Locale/fo.pl type=file -c:\perl\lib/Unicode/Collate/Locale/fr.pl type=file -c:\perl\lib/Unicode/Collate/Locale/gu.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ha.pl type=file -c:\perl\lib/Unicode/Collate/Locale/haw.pl type=file -c:\perl\lib/Unicode/Collate/Locale/hi.pl type=file -c:\perl\lib/Unicode/Collate/Locale/hr.pl type=file -c:\perl\lib/Unicode/Collate/Locale/hu.pl type=file -c:\perl\lib/Unicode/Collate/Locale/hy.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ig.pl type=file -c:\perl\lib/Unicode/Collate/Locale/is.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ja.pl type=file -c:\perl\lib/Unicode/Collate/Locale/kk.pl type=file -c:\perl\lib/Unicode/Collate/Locale/kl.pl type=file -c:\perl\lib/Unicode/Collate/Locale/kn.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ko.pl type=file -c:\perl\lib/Unicode/Collate/Locale/kok.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ln.pl type=file -c:\perl\lib/Unicode/Collate/Locale/lt.pl type=file -c:\perl\lib/Unicode/Collate/Locale/lv.pl type=file -c:\perl\lib/Unicode/Collate/Locale/mk.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ml.pl type=file -c:\perl\lib/Unicode/Collate/Locale/mr.pl type=file -c:\perl\lib/Unicode/Collate/Locale/mt.pl type=file -c:\perl\lib/Unicode/Collate/Locale/nb.pl type=file -c:\perl\lib/Unicode/Collate/Locale/nn.pl type=file -c:\perl\lib/Unicode/Collate/Locale/nso.pl type=file -c:\perl\lib/Unicode/Collate/Locale/om.pl type=file -c:\perl\lib/Unicode/Collate/Locale/or.pl type=file -c:\perl\lib/Unicode/Collate/Locale/pa.pl type=file -c:\perl\lib/Unicode/Collate/Locale/pl.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ro.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ru.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sa.pl type=file -c:\perl\lib/Unicode/Collate/Locale/se.pl type=file -c:\perl\lib/Unicode/Collate/Locale/si.pl type=file -c:\perl\lib/Unicode/Collate/Locale/si_dict.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sk.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sl.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sq.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sr.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sv.pl type=file -c:\perl\lib/Unicode/Collate/Locale/sv_refo.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ta.pl type=file -c:\perl\lib/Unicode/Collate/Locale/te.pl type=file -c:\perl\lib/Unicode/Collate/Locale/th.pl type=file -c:\perl\lib/Unicode/Collate/Locale/tn.pl type=file -c:\perl\lib/Unicode/Collate/Locale/to.pl type=file -c:\perl\lib/Unicode/Collate/Locale/tr.pl type=file -c:\perl\lib/Unicode/Collate/Locale/uk.pl type=file -c:\perl\lib/Unicode/Collate/Locale/ur.pl type=file -c:\perl\lib/Unicode/Collate/Locale/vi.pl type=file -c:\perl\lib/Unicode/Collate/Locale/wae.pl type=file -c:\perl\lib/Unicode/Collate/Locale/wo.pl type=file -c:\perl\lib/Unicode/Collate/Locale/yo.pl type=file -c:\perl\lib/Unicode/Collate/Locale/zh.pl type=file -c:\perl\lib/Unicode/Collate/Locale/zh_big5.pl type=file -c:\perl\lib/Unicode/Collate/Locale/zh_gb.pl type=file -c:\perl\lib/Unicode/Collate/Locale/zh_pin.pl type=file -c:\perl\lib/Unicode/Collate/Locale/zh_strk.pl type=file -c:\perl\lib/Unicode/Collate/Locale/zh_zhu.pl type=file -c:\perl\lib/Unicode/Collate/allkeys.txt type=file -c:\perl\lib/Unicode/Collate/keys.txt type=file -c:\perl\lib/Unicode/Normalize.pm type=file -c:\perl\lib/Unicode/UCD.pm type=file -c:\perl\lib/User/grent.pm type=file -c:\perl\lib/User/pwent.pm type=file -c:\perl\lib/Win32.pm type=file -c:\perl\lib/Win32API/File.pm type=file -c:\perl\lib/Win32API/File/cFile.pc type=file -c:\perl\lib/Win32CORE.pm type=file -c:\perl\lib/XSLoader.pm type=file -c:\perl\lib/_charnames.pm type=file -c:\perl\lib/arybase.pm type=file -c:\perl\lib/attributes.pm type=file -c:\perl\lib/auto/B/B.bs type=file -c:\perl\lib/auto/B/B.dll type=file -c:\perl\lib/auto/Compress/Raw/Bzip2/Bzip2.bs type=file -c:\perl\lib/auto/Compress/Raw/Bzip2/Bzip2.dll type=file -c:\perl\lib/auto/Compress/Raw/Bzip2/autosplit.ix type=file -c:\perl\lib/auto/Compress/Raw/Zlib/Zlib.bs type=file -c:\perl\lib/auto/Compress/Raw/Zlib/Zlib.dll type=file -c:\perl\lib/auto/Compress/Raw/Zlib/autosplit.ix type=file -c:\perl\lib/auto/Cwd/Cwd.bs type=file -c:\perl\lib/auto/Cwd/Cwd.dll type=file -c:\perl\lib/auto/Data/Dumper/Dumper.bs type=file -c:\perl\lib/auto/Data/Dumper/Dumper.dll type=file -c:\perl\lib/auto/Devel/PPPort/PPPort.bs type=file -c:\perl\lib/auto/Devel/PPPort/PPPort.dll type=file -c:\perl\lib/auto/Devel/Peek/Peek.bs type=file -c:\perl\lib/auto/Devel/Peek/Peek.dll type=file -c:\perl\lib/auto/Digest/MD5/MD5.bs type=file -c:\perl\lib/auto/Digest/MD5/MD5.dll type=file -c:\perl\lib/auto/Digest/SHA/SHA.bs type=file -c:\perl\lib/auto/Digest/SHA/SHA.dll type=file -c:\perl\lib/auto/Encode/Byte/Byte.bs type=file -c:\perl\lib/auto/Encode/Byte/Byte.dll type=file -c:\perl\lib/auto/Encode/CN/CN.bs type=file -c:\perl\lib/auto/Encode/CN/CN.dll type=file -c:\perl\lib/auto/Encode/EBCDIC/EBCDIC.bs type=file -c:\perl\lib/auto/Encode/EBCDIC/EBCDIC.dll type=file -c:\perl\lib/auto/Encode/Encode.bs type=file -c:\perl\lib/auto/Encode/Encode.dll type=file -c:\perl\lib/auto/Encode/JP/JP.bs type=file -c:\perl\lib/auto/Encode/JP/JP.dll type=file -c:\perl\lib/auto/Encode/KR/KR.bs type=file -c:\perl\lib/auto/Encode/KR/KR.dll type=file -c:\perl\lib/auto/Encode/Symbol/Symbol.bs type=file -c:\perl\lib/auto/Encode/Symbol/Symbol.dll type=file -c:\perl\lib/auto/Encode/TW/TW.bs type=file -c:\perl\lib/auto/Encode/TW/TW.dll type=file -c:\perl\lib/auto/Encode/Unicode/Unicode.bs type=file -c:\perl\lib/auto/Encode/Unicode/Unicode.dll type=file -c:\perl\lib/auto/Fcntl/Fcntl.bs type=file -c:\perl\lib/auto/Fcntl/Fcntl.dll type=file -c:\perl\lib/auto/File/DosGlob/DosGlob.bs type=file -c:\perl\lib/auto/File/DosGlob/DosGlob.dll type=file -c:\perl\lib/auto/File/Glob/Glob.bs type=file -c:\perl\lib/auto/File/Glob/Glob.dll type=file -c:\perl\lib/auto/Filter/Util/Call/Call.bs type=file -c:\perl\lib/auto/Filter/Util/Call/Call.dll type=file -c:\perl\lib/auto/Hash/Util/FieldHash/FieldHash.bs type=file -c:\perl\lib/auto/Hash/Util/FieldHash/FieldHash.dll type=file -c:\perl\lib/auto/Hash/Util/Util.bs type=file -c:\perl\lib/auto/Hash/Util/Util.dll type=file -c:\perl\lib/auto/IO/IO.bs type=file -c:\perl\lib/auto/IO/IO.dll type=file -c:\perl\lib/auto/List/Util/Util.bs type=file -c:\perl\lib/auto/List/Util/Util.dll type=file -c:\perl\lib/auto/MIME/Base64/Base64.bs type=file -c:\perl\lib/auto/MIME/Base64/Base64.dll type=file -c:\perl\lib/auto/Math/BigInt/FastCalc/FastCalc.bs type=file -c:\perl\lib/auto/Math/BigInt/FastCalc/FastCalc.dll type=file -c:\perl\lib/auto/Opcode/Opcode.bs type=file -c:\perl\lib/auto/Opcode/Opcode.dll type=file -c:\perl\lib/auto/POSIX/POSIX.bs type=file -c:\perl\lib/auto/POSIX/POSIX.dll type=file -c:\perl\lib/auto/PerlIO/encoding/encoding.bs type=file -c:\perl\lib/auto/PerlIO/encoding/encoding.dll type=file -c:\perl\lib/auto/PerlIO/mmap/mmap.bs type=file -c:\perl\lib/auto/PerlIO/mmap/mmap.dll type=file -c:\perl\lib/auto/PerlIO/scalar/scalar.bs type=file -c:\perl\lib/auto/PerlIO/scalar/scalar.dll type=file -c:\perl\lib/auto/PerlIO/via/via.bs type=file -c:\perl\lib/auto/PerlIO/via/via.dll type=file -c:\perl\lib/auto/SDBM_File/SDBM_File.bs type=file -c:\perl\lib/auto/SDBM_File/SDBM_File.dll type=file -c:\perl\lib/auto/Socket/Socket.bs type=file -c:\perl\lib/auto/Socket/Socket.dll type=file -c:\perl\lib/auto/Storable/Storable.bs type=file -c:\perl\lib/auto/Storable/Storable.dll type=file -c:\perl\lib/auto/Sys/Hostname/Hostname.bs type=file -c:\perl\lib/auto/Sys/Hostname/Hostname.dll type=file -c:\perl\lib/auto/Text/Soundex/Soundex.bs type=file -c:\perl\lib/auto/Text/Soundex/Soundex.dll type=file -c:\perl\lib/auto/Tie/Hash/NamedCapture/NamedCapture.bs type=file -c:\perl\lib/auto/Tie/Hash/NamedCapture/NamedCapture.dll type=file -c:\perl\lib/auto/Time/HiRes/HiRes.bs type=file -c:\perl\lib/auto/Time/HiRes/HiRes.dll type=file -c:\perl\lib/auto/Time/Piece/Piece.bs type=file -c:\perl\lib/auto/Time/Piece/Piece.dll type=file -c:\perl\lib/auto/Unicode/Collate/Collate.bs type=file -c:\perl\lib/auto/Unicode/Collate/Collate.dll type=file -c:\perl\lib/auto/Unicode/Normalize/Normalize.bs type=file -c:\perl\lib/auto/Unicode/Normalize/Normalize.dll type=file -c:\perl\lib/auto/Win32/Win32.bs type=file -c:\perl\lib/auto/Win32/Win32.dll type=file -c:\perl\lib/auto/Win32API/File/File.bs type=file -c:\perl\lib/auto/Win32API/File/File.dll type=file -c:\perl\lib/auto/Win32CORE/extralibs.ld type=file -c:\perl\lib/auto/arybase/arybase.bs type=file -c:\perl\lib/auto/arybase/arybase.dll type=file -c:\perl\lib/auto/attributes/attributes.bs type=file -c:\perl\lib/auto/attributes/attributes.dll type=file -c:\perl\lib/auto/mro/mro.bs type=file -c:\perl\lib/auto/mro/mro.dll type=file -c:\perl\lib/auto/re/re.bs type=file -c:\perl\lib/auto/re/re.dll type=file -c:\perl\lib/auto/sdbm/extralibs.ld type=file -c:\perl\lib/auto/threads/shared/shared.bs type=file -c:\perl\lib/auto/threads/shared/shared.dll type=file -c:\perl\lib/auto/threads/threads.bs type=file -c:\perl\lib/auto/threads/threads.dll type=file -c:\perl\lib/autodie.pm type=file -c:\perl\lib/autodie/exception.pm type=file -c:\perl\lib/autodie/exception/system.pm type=file -c:\perl\lib/autodie/hints.pm type=file -c:\perl\lib/autouse.pm type=file -c:\perl\lib/base.pm type=file -c:\perl\lib/bigint.pm type=file -c:\perl\lib/bignum.pm type=file -c:\perl\lib/bigrat.pm type=file -c:\perl\lib/blib.pm type=file -c:\perl\lib/bytes.pm type=file -c:\perl\lib/bytes_heavy.pl type=file -c:\perl\lib/charnames.pm type=file -c:\perl\lib/constant.pm type=file -c:\perl\lib/deprecate.pm type=file -c:\perl\lib/diagnostics.pm type=file -c:\perl\lib/dumpvar.pl type=file -c:\perl\lib/encoding.pm type=file -c:\perl\lib/encoding/warnings.pm type=file -c:\perl\lib/feature.pm type=file -c:\perl\lib/fields.pm type=file -c:\perl\lib/filetest.pm type=file -c:\perl\lib/if.pm type=file -c:\perl\lib/inc/latest.pm type=file -c:\perl\lib/inc/latest/private.pm type=file -c:\perl\lib/integer.pm type=file -c:\perl\lib/less.pm type=file -c:\perl\lib/lib.pm type=file -c:\perl\lib/locale.pm type=file -c:\perl\lib/mro.pm type=file -c:\perl\lib/open.pm type=file -c:\perl\lib/ops.pm type=file -c:\perl\lib/overload.pm type=file -c:\perl\lib/overload/numbers.pm type=file -c:\perl\lib/overloading.pm type=file -c:\perl\lib/parent.pm type=file -c:\perl\lib/perl5db.pl type=file -c:\perl\lib/perlfaq.pm type=file -c:\perl\lib/pods/a2p.pod type=file -c:\perl\lib/pods/perl.pod type=file -c:\perl\lib/pods/perl5004delta.pod type=file -c:\perl\lib/pods/perl5005delta.pod type=file -c:\perl\lib/pods/perl5100delta.pod type=file -c:\perl\lib/pods/perl5101delta.pod type=file -c:\perl\lib/pods/perl5120delta.pod type=file -c:\perl\lib/pods/perl5121delta.pod type=file -c:\perl\lib/pods/perl5122delta.pod type=file -c:\perl\lib/pods/perl5123delta.pod type=file -c:\perl\lib/pods/perl5124delta.pod type=file -c:\perl\lib/pods/perl5125delta.pod type=file -c:\perl\lib/pods/perl5140delta.pod type=file -c:\perl\lib/pods/perl5141delta.pod type=file -c:\perl\lib/pods/perl5142delta.pod type=file -c:\perl\lib/pods/perl5143delta.pod type=file -c:\perl\lib/pods/perl5144delta.pod type=file -c:\perl\lib/pods/perl5160delta.pod type=file -c:\perl\lib/pods/perl5161delta.pod type=file -c:\perl\lib/pods/perl5162delta.pod type=file -c:\perl\lib/pods/perl5163delta.pod type=file -c:\perl\lib/pods/perl5180delta.pod type=file -c:\perl\lib/pods/perl5181delta.pod type=file -c:\perl\lib/pods/perl5182delta.pod type=file -c:\perl\lib/pods/perl561delta.pod type=file -c:\perl\lib/pods/perl56delta.pod type=file -c:\perl\lib/pods/perl581delta.pod type=file -c:\perl\lib/pods/perl582delta.pod type=file -c:\perl\lib/pods/perl583delta.pod type=file -c:\perl\lib/pods/perl584delta.pod type=file -c:\perl\lib/pods/perl585delta.pod type=file -c:\perl\lib/pods/perl586delta.pod type=file -c:\perl\lib/pods/perl587delta.pod type=file -c:\perl\lib/pods/perl588delta.pod type=file -c:\perl\lib/pods/perl589delta.pod type=file -c:\perl\lib/pods/perl58delta.pod type=file -c:\perl\lib/pods/perlaix.pod type=file -c:\perl\lib/pods/perlamiga.pod type=file -c:\perl\lib/pods/perlapi.pod type=file -c:\perl\lib/pods/perlapio.pod type=file -c:\perl\lib/pods/perlartistic.pod type=file -c:\perl\lib/pods/perlbook.pod type=file -c:\perl\lib/pods/perlboot.pod type=file -c:\perl\lib/pods/perlbot.pod type=file -c:\perl\lib/pods/perlbs2000.pod type=file -c:\perl\lib/pods/perlcall.pod type=file -c:\perl\lib/pods/perlce.pod type=file -c:\perl\lib/pods/perlcheat.pod type=file -c:\perl\lib/pods/perlclib.pod type=file -c:\perl\lib/pods/perlcn.pod type=file -c:\perl\lib/pods/perlcommunity.pod type=file -c:\perl\lib/pods/perlcygwin.pod type=file -c:\perl\lib/pods/perldata.pod type=file -c:\perl\lib/pods/perldbmfilter.pod type=file -c:\perl\lib/pods/perldebguts.pod type=file -c:\perl\lib/pods/perldebtut.pod type=file -c:\perl\lib/pods/perldebug.pod type=file -c:\perl\lib/pods/perldelta.pod type=file -c:\perl\lib/pods/perldgux.pod type=file -c:\perl\lib/pods/perldiag.pod type=file -c:\perl\lib/pods/perldoc.pod type=file -c:\perl\lib/pods/perldos.pod type=file -c:\perl\lib/pods/perldsc.pod type=file -c:\perl\lib/pods/perldtrace.pod type=file -c:\perl\lib/pods/perlebcdic.pod type=file -c:\perl\lib/pods/perlembed.pod type=file -c:\perl\lib/pods/perlexperiment.pod type=file -c:\perl\lib/pods/perlfaq.pod type=file -c:\perl\lib/pods/perlfaq1.pod type=file -c:\perl\lib/pods/perlfaq2.pod type=file -c:\perl\lib/pods/perlfaq3.pod type=file -c:\perl\lib/pods/perlfaq4.pod type=file -c:\perl\lib/pods/perlfaq5.pod type=file -c:\perl\lib/pods/perlfaq6.pod type=file -c:\perl\lib/pods/perlfaq7.pod type=file -c:\perl\lib/pods/perlfaq8.pod type=file -c:\perl\lib/pods/perlfaq9.pod type=file -c:\perl\lib/pods/perlfilter.pod type=file -c:\perl\lib/pods/perlfork.pod type=file -c:\perl\lib/pods/perlform.pod type=file -c:\perl\lib/pods/perlfreebsd.pod type=file -c:\perl\lib/pods/perlfunc.pod type=file -c:\perl\lib/pods/perlgit.pod type=file -c:\perl\lib/pods/perlglossary.pod type=file -c:\perl\lib/pods/perlgpl.pod type=file -c:\perl\lib/pods/perlguts.pod type=file -c:\perl\lib/pods/perlhack.pod type=file -c:\perl\lib/pods/perlhacktips.pod type=file -c:\perl\lib/pods/perlhacktut.pod type=file -c:\perl\lib/pods/perlhaiku.pod type=file -c:\perl\lib/pods/perlhist.pod type=file -c:\perl\lib/pods/perlhpux.pod type=file -c:\perl\lib/pods/perlhurd.pod type=file -c:\perl\lib/pods/perlintern.pod type=file -c:\perl\lib/pods/perlinterp.pod type=file -c:\perl\lib/pods/perlintro.pod type=file -c:\perl\lib/pods/perliol.pod type=file -c:\perl\lib/pods/perlipc.pod type=file -c:\perl\lib/pods/perlirix.pod type=file -c:\perl\lib/pods/perljp.pod type=file -c:\perl\lib/pods/perlko.pod type=file -c:\perl\lib/pods/perllexwarn.pod type=file -c:\perl\lib/pods/perllinux.pod type=file -c:\perl\lib/pods/perllocale.pod type=file -c:\perl\lib/pods/perllol.pod type=file -c:\perl\lib/pods/perlmacos.pod type=file -c:\perl\lib/pods/perlmacosx.pod type=file -c:\perl\lib/pods/perlmod.pod type=file -c:\perl\lib/pods/perlmodinstall.pod type=file -c:\perl\lib/pods/perlmodlib.pod type=file -c:\perl\lib/pods/perlmodstyle.pod type=file -c:\perl\lib/pods/perlmroapi.pod type=file -c:\perl\lib/pods/perlnetware.pod type=file -c:\perl\lib/pods/perlnewmod.pod type=file -c:\perl\lib/pods/perlnumber.pod type=file -c:\perl\lib/pods/perlobj.pod type=file -c:\perl\lib/pods/perlootut.pod type=file -c:\perl\lib/pods/perlop.pod type=file -c:\perl\lib/pods/perlopenbsd.pod type=file -c:\perl\lib/pods/perlopentut.pod type=file -c:\perl\lib/pods/perlos2.pod type=file -c:\perl\lib/pods/perlos390.pod type=file -c:\perl\lib/pods/perlos400.pod type=file -c:\perl\lib/pods/perlpacktut.pod type=file -c:\perl\lib/pods/perlperf.pod type=file -c:\perl\lib/pods/perlplan9.pod type=file -c:\perl\lib/pods/perlpod.pod type=file -c:\perl\lib/pods/perlpodspec.pod type=file -c:\perl\lib/pods/perlpodstyle.pod type=file -c:\perl\lib/pods/perlpolicy.pod type=file -c:\perl\lib/pods/perlport.pod type=file -c:\perl\lib/pods/perlpragma.pod type=file -c:\perl\lib/pods/perlqnx.pod type=file -c:\perl\lib/pods/perlre.pod type=file -c:\perl\lib/pods/perlreapi.pod type=file -c:\perl\lib/pods/perlrebackslash.pod type=file -c:\perl\lib/pods/perlrecharclass.pod type=file -c:\perl\lib/pods/perlref.pod type=file -c:\perl\lib/pods/perlreftut.pod type=file -c:\perl\lib/pods/perlreguts.pod type=file -c:\perl\lib/pods/perlrepository.pod type=file -c:\perl\lib/pods/perlrequick.pod type=file -c:\perl\lib/pods/perlreref.pod type=file -c:\perl\lib/pods/perlretut.pod type=file -c:\perl\lib/pods/perlriscos.pod type=file -c:\perl\lib/pods/perlrun.pod type=file -c:\perl\lib/pods/perlsec.pod type=file -c:\perl\lib/pods/perlsolaris.pod type=file -c:\perl\lib/pods/perlsource.pod type=file -c:\perl\lib/pods/perlstyle.pod type=file -c:\perl\lib/pods/perlsub.pod type=file -c:\perl\lib/pods/perlsymbian.pod type=file -c:\perl\lib/pods/perlsyn.pod type=file -c:\perl\lib/pods/perlthrtut.pod type=file -c:\perl\lib/pods/perltie.pod type=file -c:\perl\lib/pods/perltoc.pod type=file -c:\perl\lib/pods/perltodo.pod type=file -c:\perl\lib/pods/perltooc.pod type=file -c:\perl\lib/pods/perltoot.pod type=file -c:\perl\lib/pods/perltrap.pod type=file -c:\perl\lib/pods/perltru64.pod type=file -c:\perl\lib/pods/perltw.pod type=file -c:\perl\lib/pods/perlunicode.pod type=file -c:\perl\lib/pods/perlunifaq.pod type=file -c:\perl\lib/pods/perluniintro.pod type=file -c:\perl\lib/pods/perluniprops.pod type=file -c:\perl\lib/pods/perlunitut.pod type=file -c:\perl\lib/pods/perlutil.pod type=file -c:\perl\lib/pods/perlvar.pod type=file -c:\perl\lib/pods/perlvms.pod type=file -c:\perl\lib/pods/perlvos.pod type=file -c:\perl\lib/pods/perlwin32.pod type=file -c:\perl\lib/pods/perlxs.pod type=file -c:\perl\lib/pods/perlxstut.pod type=file -c:\perl\lib/pods/perlxstypemap.pod type=file -c:\perl\lib/re.pm type=file -c:\perl\lib/sigtrap.pm type=file -c:\perl\lib/sort.pm type=file -c:\perl\lib/strict.pm type=file -c:\perl\lib/subs.pm type=file -c:\perl\lib/threads.pm type=file -c:\perl\lib/threads/shared.pm type=file -c:\perl\lib/unicore/Blocks.txt type=file -c:\perl\lib/unicore/CombiningClass.pl type=file -c:\perl\lib/unicore/Decomposition.pl type=file -c:\perl\lib/unicore/Heavy.pl type=file -c:\perl\lib/unicore/Name.pl type=file -c:\perl\lib/unicore/Name.pm type=file -c:\perl\lib/unicore/NamedSequences.txt type=file -c:\perl\lib/unicore/SpecialCasing.txt type=file -c:\perl\lib/unicore/To/Age.pl type=file -c:\perl\lib/unicore/To/Bc.pl type=file -c:\perl\lib/unicore/To/Bmg.pl type=file -c:\perl\lib/unicore/To/Cf.pl type=file -c:\perl\lib/unicore/To/Digit.pl type=file -c:\perl\lib/unicore/To/Ea.pl type=file -c:\perl\lib/unicore/To/Fold.pl type=file -c:\perl\lib/unicore/To/GCB.pl type=file -c:\perl\lib/unicore/To/Gc.pl type=file -c:\perl\lib/unicore/To/Hst.pl type=file -c:\perl\lib/unicore/To/Isc.pl type=file -c:\perl\lib/unicore/To/Jg.pl type=file -c:\perl\lib/unicore/To/Jt.pl type=file -c:\perl\lib/unicore/To/Lb.pl type=file -c:\perl\lib/unicore/To/Lc.pl type=file -c:\perl\lib/unicore/To/Lower.pl type=file -c:\perl\lib/unicore/To/NFCQC.pl type=file -c:\perl\lib/unicore/To/NFDQC.pl type=file -c:\perl\lib/unicore/To/NFKCCF.pl type=file -c:\perl\lib/unicore/To/NFKCQC.pl type=file -c:\perl\lib/unicore/To/NFKDQC.pl type=file -c:\perl\lib/unicore/To/Na1.pl type=file -c:\perl\lib/unicore/To/NameAlia.pl type=file -c:\perl\lib/unicore/To/Nt.pl type=file -c:\perl\lib/unicore/To/Nv.pl type=file -c:\perl\lib/unicore/To/PerlDeci.pl type=file -c:\perl\lib/unicore/To/SB.pl type=file -c:\perl\lib/unicore/To/Sc.pl type=file -c:\perl\lib/unicore/To/Scx.pl type=file -c:\perl\lib/unicore/To/Tc.pl type=file -c:\perl\lib/unicore/To/Title.pl type=file -c:\perl\lib/unicore/To/Uc.pl type=file -c:\perl\lib/unicore/To/Upper.pl type=file -c:\perl\lib/unicore/To/WB.pl type=file -c:\perl\lib/unicore/UCD.pl type=file -c:\perl\lib/unicore/lib/AHex/Y.pl type=file -c:\perl\lib/unicore/lib/Age/NA.pl type=file -c:\perl\lib/unicore/lib/Age/V11.pl type=file -c:\perl\lib/unicore/lib/Age/V20.pl type=file -c:\perl\lib/unicore/lib/Age/V21.pl type=file -c:\perl\lib/unicore/lib/Age/V30.pl type=file -c:\perl\lib/unicore/lib/Age/V31.pl type=file -c:\perl\lib/unicore/lib/Age/V32.pl type=file -c:\perl\lib/unicore/lib/Age/V40.pl type=file -c:\perl\lib/unicore/lib/Age/V41.pl type=file -c:\perl\lib/unicore/lib/Age/V50.pl type=file -c:\perl\lib/unicore/lib/Age/V51.pl type=file -c:\perl\lib/unicore/lib/Age/V52.pl type=file -c:\perl\lib/unicore/lib/Age/V60.pl type=file -c:\perl\lib/unicore/lib/Age/V61.pl type=file -c:\perl\lib/unicore/lib/Age/V62.pl type=file -c:\perl\lib/unicore/lib/Alpha/Y.pl type=file -c:\perl\lib/unicore/lib/Bc/AL.pl type=file -c:\perl\lib/unicore/lib/Bc/AN.pl type=file -c:\perl\lib/unicore/lib/Bc/B.pl type=file -c:\perl\lib/unicore/lib/Bc/BN.pl type=file -c:\perl\lib/unicore/lib/Bc/CS.pl type=file -c:\perl\lib/unicore/lib/Bc/EN.pl type=file -c:\perl\lib/unicore/lib/Bc/ES.pl type=file -c:\perl\lib/unicore/lib/Bc/ET.pl type=file -c:\perl\lib/unicore/lib/Bc/L.pl type=file -c:\perl\lib/unicore/lib/Bc/LRE.pl type=file -c:\perl\lib/unicore/lib/Bc/LRO.pl type=file -c:\perl\lib/unicore/lib/Bc/NSM.pl type=file -c:\perl\lib/unicore/lib/Bc/ON.pl type=file -c:\perl\lib/unicore/lib/Bc/PDF.pl type=file -c:\perl\lib/unicore/lib/Bc/R.pl type=file -c:\perl\lib/unicore/lib/Bc/RLE.pl type=file -c:\perl\lib/unicore/lib/Bc/RLO.pl type=file -c:\perl\lib/unicore/lib/Bc/S.pl type=file -c:\perl\lib/unicore/lib/Bc/WS.pl type=file -c:\perl\lib/unicore/lib/BidiC/Y.pl type=file -c:\perl\lib/unicore/lib/BidiM/Y.pl type=file -c:\perl\lib/unicore/lib/Blk/ASCII.pl type=file -c:\perl\lib/unicore/lib/Blk/AegeanNu.pl type=file -c:\perl\lib/unicore/lib/Blk/Alchemic.pl type=file -c:\perl\lib/unicore/lib/Blk/Alphabet.pl type=file -c:\perl\lib/unicore/lib/Blk/Ancient2.pl type=file -c:\perl\lib/unicore/lib/Blk/AncientG.pl type=file -c:\perl\lib/unicore/lib/Blk/AncientS.pl type=file -c:\perl\lib/unicore/lib/Blk/Arabic.pl type=file -c:\perl\lib/unicore/lib/Blk/ArabicEx.pl type=file -c:\perl\lib/unicore/lib/Blk/ArabicMa.pl type=file -c:\perl\lib/unicore/lib/Blk/ArabicP2.pl type=file -c:\perl\lib/unicore/lib/Blk/ArabicPF.pl type=file -c:\perl\lib/unicore/lib/Blk/ArabicSu.pl type=file -c:\perl\lib/unicore/lib/Blk/Armenian.pl type=file -c:\perl\lib/unicore/lib/Blk/Arrows.pl type=file -c:\perl\lib/unicore/lib/Blk/Avestan.pl type=file -c:\perl\lib/unicore/lib/Blk/Balinese.pl type=file -c:\perl\lib/unicore/lib/Blk/Bamum.pl type=file -c:\perl\lib/unicore/lib/Blk/BamumSup.pl type=file -c:\perl\lib/unicore/lib/Blk/Batak.pl type=file -c:\perl\lib/unicore/lib/Blk/Bengali.pl type=file -c:\perl\lib/unicore/lib/Blk/BlockEle.pl type=file -c:\perl\lib/unicore/lib/Blk/Bopomof2.pl type=file -c:\perl\lib/unicore/lib/Blk/Bopomofo.pl type=file -c:\perl\lib/unicore/lib/Blk/BoxDrawi.pl type=file -c:\perl\lib/unicore/lib/Blk/Brahmi.pl type=file -c:\perl\lib/unicore/lib/Blk/Braille.pl type=file -c:\perl\lib/unicore/lib/Blk/Buginese.pl type=file -c:\perl\lib/unicore/lib/Blk/Buhid.pl type=file -c:\perl\lib/unicore/lib/Blk/Byzantin.pl type=file -c:\perl\lib/unicore/lib/Blk/CJK.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKComp2.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKComp3.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKComp4.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKCompa.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKExtA.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKExtB.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKExtC.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKExtD.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKRadic.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKStrok.pl type=file -c:\perl\lib/unicore/lib/Blk/CJKSymbo.pl type=file -c:\perl\lib/unicore/lib/Blk/Carian.pl type=file -c:\perl\lib/unicore/lib/Blk/Chakma.pl type=file -c:\perl\lib/unicore/lib/Blk/Cham.pl type=file -c:\perl\lib/unicore/lib/Blk/Cherokee.pl type=file -c:\perl\lib/unicore/lib/Blk/CompatJa.pl type=file -c:\perl\lib/unicore/lib/Blk/ControlP.pl type=file -c:\perl\lib/unicore/lib/Blk/Coptic.pl type=file -c:\perl\lib/unicore/lib/Blk/Counting.pl type=file -c:\perl\lib/unicore/lib/Blk/Cuneifo2.pl type=file -c:\perl\lib/unicore/lib/Blk/Cuneifor.pl type=file -c:\perl\lib/unicore/lib/Blk/Currency.pl type=file -c:\perl\lib/unicore/lib/Blk/CypriotS.pl type=file -c:\perl\lib/unicore/lib/Blk/Cyrilli2.pl type=file -c:\perl\lib/unicore/lib/Blk/Cyrilli3.pl type=file -c:\perl\lib/unicore/lib/Blk/Cyrilli4.pl type=file -c:\perl\lib/unicore/lib/Blk/Cyrillic.pl type=file -c:\perl\lib/unicore/lib/Blk/Deseret.pl type=file -c:\perl\lib/unicore/lib/Blk/Devanag2.pl type=file -c:\perl\lib/unicore/lib/Blk/Devanaga.pl type=file -c:\perl\lib/unicore/lib/Blk/Diacrit2.pl type=file -c:\perl\lib/unicore/lib/Blk/Diacrit3.pl type=file -c:\perl\lib/unicore/lib/Blk/Diacriti.pl type=file -c:\perl\lib/unicore/lib/Blk/Dingbats.pl type=file -c:\perl\lib/unicore/lib/Blk/Domino.pl type=file -c:\perl\lib/unicore/lib/Blk/Egyptian.pl type=file -c:\perl\lib/unicore/lib/Blk/Emoticon.pl type=file -c:\perl\lib/unicore/lib/Blk/Enclose2.pl type=file -c:\perl\lib/unicore/lib/Blk/Enclose3.pl type=file -c:\perl\lib/unicore/lib/Blk/Enclose4.pl type=file -c:\perl\lib/unicore/lib/Blk/Enclosed.pl type=file -c:\perl\lib/unicore/lib/Blk/Ethiopi2.pl type=file -c:\perl\lib/unicore/lib/Blk/Ethiopi3.pl type=file -c:\perl\lib/unicore/lib/Blk/Ethiopi4.pl type=file -c:\perl\lib/unicore/lib/Blk/Ethiopic.pl type=file -c:\perl\lib/unicore/lib/Blk/Geometri.pl type=file -c:\perl\lib/unicore/lib/Blk/Georgia2.pl type=file -c:\perl\lib/unicore/lib/Blk/Georgian.pl type=file -c:\perl\lib/unicore/lib/Blk/Glagolit.pl type=file -c:\perl\lib/unicore/lib/Blk/Gothic.pl type=file -c:\perl\lib/unicore/lib/Blk/Greek.pl type=file -c:\perl\lib/unicore/lib/Blk/GreekExt.pl type=file -c:\perl\lib/unicore/lib/Blk/Gujarati.pl type=file -c:\perl\lib/unicore/lib/Blk/Gurmukhi.pl type=file -c:\perl\lib/unicore/lib/Blk/HalfAndF.pl type=file -c:\perl\lib/unicore/lib/Blk/HalfMark.pl type=file -c:\perl\lib/unicore/lib/Blk/Hangul.pl type=file -c:\perl\lib/unicore/lib/Blk/Hanunoo.pl type=file -c:\perl\lib/unicore/lib/Blk/Hebrew.pl type=file -c:\perl\lib/unicore/lib/Blk/HighPUSu.pl type=file -c:\perl\lib/unicore/lib/Blk/HighSurr.pl type=file -c:\perl\lib/unicore/lib/Blk/Hiragana.pl type=file -c:\perl\lib/unicore/lib/Blk/IDC.pl type=file -c:\perl\lib/unicore/lib/Blk/IPAExt.pl type=file -c:\perl\lib/unicore/lib/Blk/Imperial.pl type=file -c:\perl\lib/unicore/lib/Blk/IndicNum.pl type=file -c:\perl\lib/unicore/lib/Blk/Inscrip2.pl type=file -c:\perl\lib/unicore/lib/Blk/Inscript.pl type=file -c:\perl\lib/unicore/lib/Blk/Jamo.pl type=file -c:\perl\lib/unicore/lib/Blk/JamoExtA.pl type=file -c:\perl\lib/unicore/lib/Blk/JamoExtB.pl type=file -c:\perl\lib/unicore/lib/Blk/Javanese.pl type=file -c:\perl\lib/unicore/lib/Blk/Kaithi.pl type=file -c:\perl\lib/unicore/lib/Blk/KanaSup.pl type=file -c:\perl\lib/unicore/lib/Blk/Kanbun.pl type=file -c:\perl\lib/unicore/lib/Blk/Kangxi.pl type=file -c:\perl\lib/unicore/lib/Blk/Kannada.pl type=file -c:\perl\lib/unicore/lib/Blk/Katakan2.pl type=file -c:\perl\lib/unicore/lib/Blk/Katakana.pl type=file -c:\perl\lib/unicore/lib/Blk/KayahLi.pl type=file -c:\perl\lib/unicore/lib/Blk/Kharosht.pl type=file -c:\perl\lib/unicore/lib/Blk/Khmer.pl type=file -c:\perl\lib/unicore/lib/Blk/KhmerSym.pl type=file -c:\perl\lib/unicore/lib/Blk/Lao.pl type=file -c:\perl\lib/unicore/lib/Blk/Latin1.pl type=file -c:\perl\lib/unicore/lib/Blk/LatinEx2.pl type=file -c:\perl\lib/unicore/lib/Blk/LatinEx3.pl type=file -c:\perl\lib/unicore/lib/Blk/LatinEx4.pl type=file -c:\perl\lib/unicore/lib/Blk/LatinEx5.pl type=file -c:\perl\lib/unicore/lib/Blk/LatinExt.pl type=file -c:\perl\lib/unicore/lib/Blk/Lepcha.pl type=file -c:\perl\lib/unicore/lib/Blk/Letterli.pl type=file -c:\perl\lib/unicore/lib/Blk/Limbu.pl type=file -c:\perl\lib/unicore/lib/Blk/LinearBI.pl type=file -c:\perl\lib/unicore/lib/Blk/LinearBS.pl type=file -c:\perl\lib/unicore/lib/Blk/Lisu.pl type=file -c:\perl\lib/unicore/lib/Blk/LowSurro.pl type=file -c:\perl\lib/unicore/lib/Blk/Lycian.pl type=file -c:\perl\lib/unicore/lib/Blk/Lydian.pl type=file -c:\perl\lib/unicore/lib/Blk/Mahjong.pl type=file -c:\perl\lib/unicore/lib/Blk/Malayala.pl type=file -c:\perl\lib/unicore/lib/Blk/Mandaic.pl type=file -c:\perl\lib/unicore/lib/Blk/MathAlph.pl type=file -c:\perl\lib/unicore/lib/Blk/MathOper.pl type=file -c:\perl\lib/unicore/lib/Blk/MeeteiM2.pl type=file -c:\perl\lib/unicore/lib/Blk/MeeteiMa.pl type=file -c:\perl\lib/unicore/lib/Blk/Meroiti2.pl type=file -c:\perl\lib/unicore/lib/Blk/Meroitic.pl type=file -c:\perl\lib/unicore/lib/Blk/Miao.pl type=file -c:\perl\lib/unicore/lib/Blk/MiscArro.pl type=file -c:\perl\lib/unicore/lib/Blk/MiscMat2.pl type=file -c:\perl\lib/unicore/lib/Blk/MiscMath.pl type=file -c:\perl\lib/unicore/lib/Blk/MiscPict.pl type=file -c:\perl\lib/unicore/lib/Blk/MiscSymb.pl type=file -c:\perl\lib/unicore/lib/Blk/MiscTech.pl type=file -c:\perl\lib/unicore/lib/Blk/Modifie2.pl type=file -c:\perl\lib/unicore/lib/Blk/Modifier.pl type=file -c:\perl\lib/unicore/lib/Blk/Mongolia.pl type=file -c:\perl\lib/unicore/lib/Blk/Music.pl type=file -c:\perl\lib/unicore/lib/Blk/Myanmar.pl type=file -c:\perl\lib/unicore/lib/Blk/MyanmarE.pl type=file -c:\perl\lib/unicore/lib/Blk/NB.pl type=file -c:\perl\lib/unicore/lib/Blk/NKo.pl type=file -c:\perl\lib/unicore/lib/Blk/NewTaiLu.pl type=file -c:\perl\lib/unicore/lib/Blk/NumberFo.pl type=file -c:\perl\lib/unicore/lib/Blk/OCR.pl type=file -c:\perl\lib/unicore/lib/Blk/Ogham.pl type=file -c:\perl\lib/unicore/lib/Blk/OlChiki.pl type=file -c:\perl\lib/unicore/lib/Blk/OldItali.pl type=file -c:\perl\lib/unicore/lib/Blk/OldPersi.pl type=file -c:\perl\lib/unicore/lib/Blk/OldSouth.pl type=file -c:\perl\lib/unicore/lib/Blk/OldTurki.pl type=file -c:\perl\lib/unicore/lib/Blk/Oriya.pl type=file -c:\perl\lib/unicore/lib/Blk/Osmanya.pl type=file -c:\perl\lib/unicore/lib/Blk/PUA.pl type=file -c:\perl\lib/unicore/lib/Blk/PhagsPa.pl type=file -c:\perl\lib/unicore/lib/Blk/Phaistos.pl type=file -c:\perl\lib/unicore/lib/Blk/Phoenici.pl type=file -c:\perl\lib/unicore/lib/Blk/Phoneti2.pl type=file -c:\perl\lib/unicore/lib/Blk/Phonetic.pl type=file -c:\perl\lib/unicore/lib/Blk/PlayingC.pl type=file -c:\perl\lib/unicore/lib/Blk/Punctuat.pl type=file -c:\perl\lib/unicore/lib/Blk/Rejang.pl type=file -c:\perl\lib/unicore/lib/Blk/Rumi.pl type=file -c:\perl\lib/unicore/lib/Blk/Runic.pl type=file -c:\perl\lib/unicore/lib/Blk/Samarita.pl type=file -c:\perl\lib/unicore/lib/Blk/Saurasht.pl type=file -c:\perl\lib/unicore/lib/Blk/Sharada.pl type=file -c:\perl\lib/unicore/lib/Blk/Shavian.pl type=file -c:\perl\lib/unicore/lib/Blk/Sinhala.pl type=file -c:\perl\lib/unicore/lib/Blk/SmallFor.pl type=file -c:\perl\lib/unicore/lib/Blk/SoraSomp.pl type=file -c:\perl\lib/unicore/lib/Blk/Specials.pl type=file -c:\perl\lib/unicore/lib/Blk/Sundane2.pl type=file -c:\perl\lib/unicore/lib/Blk/Sundanes.pl type=file -c:\perl\lib/unicore/lib/Blk/SupArro2.pl type=file -c:\perl\lib/unicore/lib/Blk/SupArrow.pl type=file -c:\perl\lib/unicore/lib/Blk/SupMathO.pl type=file -c:\perl\lib/unicore/lib/Blk/SupPUAA.pl type=file -c:\perl\lib/unicore/lib/Blk/SupPUAB.pl type=file -c:\perl\lib/unicore/lib/Blk/SupPunct.pl type=file -c:\perl\lib/unicore/lib/Blk/SuperAnd.pl type=file -c:\perl\lib/unicore/lib/Blk/SylotiNa.pl type=file -c:\perl\lib/unicore/lib/Blk/Syriac.pl type=file -c:\perl\lib/unicore/lib/Blk/Tagalog.pl type=file -c:\perl\lib/unicore/lib/Blk/Tagbanwa.pl type=file -c:\perl\lib/unicore/lib/Blk/Tags.pl type=file -c:\perl\lib/unicore/lib/Blk/TaiLe.pl type=file -c:\perl\lib/unicore/lib/Blk/TaiTham.pl type=file -c:\perl\lib/unicore/lib/Blk/TaiViet.pl type=file -c:\perl\lib/unicore/lib/Blk/TaiXuanJ.pl type=file -c:\perl\lib/unicore/lib/Blk/Takri.pl type=file -c:\perl\lib/unicore/lib/Blk/Tamil.pl type=file -c:\perl\lib/unicore/lib/Blk/Telugu.pl type=file -c:\perl\lib/unicore/lib/Blk/Thaana.pl type=file -c:\perl\lib/unicore/lib/Blk/Thai.pl type=file -c:\perl\lib/unicore/lib/Blk/Tibetan.pl type=file -c:\perl\lib/unicore/lib/Blk/Tifinagh.pl type=file -c:\perl\lib/unicore/lib/Blk/Transpor.pl type=file -c:\perl\lib/unicore/lib/Blk/UCAS.pl type=file -c:\perl\lib/unicore/lib/Blk/UCASExt.pl type=file -c:\perl\lib/unicore/lib/Blk/Ugaritic.pl type=file -c:\perl\lib/unicore/lib/Blk/VS.pl type=file -c:\perl\lib/unicore/lib/Blk/VSSup.pl type=file -c:\perl\lib/unicore/lib/Blk/Vai.pl type=file -c:\perl\lib/unicore/lib/Blk/VedicExt.pl type=file -c:\perl\lib/unicore/lib/Blk/Vertical.pl type=file -c:\perl\lib/unicore/lib/Blk/YiRadica.pl type=file -c:\perl\lib/unicore/lib/Blk/YiSyllab.pl type=file -c:\perl\lib/unicore/lib/Blk/Yijing.pl type=file -c:\perl\lib/unicore/lib/CE/Y.pl type=file -c:\perl\lib/unicore/lib/CI/Y.pl type=file -c:\perl\lib/unicore/lib/CWCF/Y.pl type=file -c:\perl\lib/unicore/lib/CWCM/Y.pl type=file -c:\perl\lib/unicore/lib/CWKCF/Y.pl type=file -c:\perl\lib/unicore/lib/CWL/Y.pl type=file -c:\perl\lib/unicore/lib/CWT/Y.pl type=file -c:\perl\lib/unicore/lib/CWU/Y.pl type=file -c:\perl\lib/unicore/lib/Cased/Y.pl type=file -c:\perl\lib/unicore/lib/Ccc/A.pl type=file -c:\perl\lib/unicore/lib/Ccc/AL.pl type=file -c:\perl\lib/unicore/lib/Ccc/AR.pl type=file -c:\perl\lib/unicore/lib/Ccc/ATA.pl type=file -c:\perl\lib/unicore/lib/Ccc/ATAR.pl type=file -c:\perl\lib/unicore/lib/Ccc/ATB.pl type=file -c:\perl\lib/unicore/lib/Ccc/B.pl type=file -c:\perl\lib/unicore/lib/Ccc/BL.pl type=file -c:\perl\lib/unicore/lib/Ccc/BR.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC10.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC103.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC107.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC11.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC118.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC12.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC122.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC129.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC13.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC130.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC132.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC14.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC15.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC16.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC17.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC18.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC19.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC20.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC21.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC22.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC23.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC24.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC25.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC26.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC27.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC28.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC29.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC30.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC31.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC32.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC33.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC34.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC35.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC36.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC84.pl type=file -c:\perl\lib/unicore/lib/Ccc/CCC91.pl type=file -c:\perl\lib/unicore/lib/Ccc/DA.pl type=file -c:\perl\lib/unicore/lib/Ccc/DB.pl type=file -c:\perl\lib/unicore/lib/Ccc/IS.pl type=file -c:\perl\lib/unicore/lib/Ccc/KV.pl type=file -c:\perl\lib/unicore/lib/Ccc/L.pl type=file -c:\perl\lib/unicore/lib/Ccc/NK.pl type=file -c:\perl\lib/unicore/lib/Ccc/NR.pl type=file -c:\perl\lib/unicore/lib/Ccc/OV.pl type=file -c:\perl\lib/unicore/lib/Ccc/R.pl type=file -c:\perl\lib/unicore/lib/Ccc/VR.pl type=file -c:\perl\lib/unicore/lib/CompEx/Y.pl type=file -c:\perl\lib/unicore/lib/DI/Y.pl type=file -c:\perl\lib/unicore/lib/Dash/Y.pl type=file -c:\perl\lib/unicore/lib/Dep/Y.pl type=file -c:\perl\lib/unicore/lib/Dia/Y.pl type=file -c:\perl\lib/unicore/lib/Dt/Com.pl type=file -c:\perl\lib/unicore/lib/Dt/Enc.pl type=file -c:\perl\lib/unicore/lib/Dt/Fin.pl type=file -c:\perl\lib/unicore/lib/Dt/Font.pl type=file -c:\perl\lib/unicore/lib/Dt/Fra.pl type=file -c:\perl\lib/unicore/lib/Dt/Init.pl type=file -c:\perl\lib/unicore/lib/Dt/Iso.pl type=file -c:\perl\lib/unicore/lib/Dt/Med.pl type=file -c:\perl\lib/unicore/lib/Dt/Nar.pl type=file -c:\perl\lib/unicore/lib/Dt/Nb.pl type=file -c:\perl\lib/unicore/lib/Dt/NonCanon.pl type=file -c:\perl\lib/unicore/lib/Dt/Sml.pl type=file -c:\perl\lib/unicore/lib/Dt/Sqr.pl type=file -c:\perl\lib/unicore/lib/Dt/Sub.pl type=file -c:\perl\lib/unicore/lib/Dt/Sup.pl type=file -c:\perl\lib/unicore/lib/Dt/Vert.pl type=file -c:\perl\lib/unicore/lib/Dt/Wide.pl type=file -c:\perl\lib/unicore/lib/Ea/A.pl type=file -c:\perl\lib/unicore/lib/Ea/H.pl type=file -c:\perl\lib/unicore/lib/Ea/N.pl type=file -c:\perl\lib/unicore/lib/Ea/Na.pl type=file -c:\perl\lib/unicore/lib/Ea/W.pl type=file -c:\perl\lib/unicore/lib/Ext/Y.pl type=file -c:\perl\lib/unicore/lib/GCB/CN.pl type=file -c:\perl\lib/unicore/lib/GCB/CR.pl type=file -c:\perl\lib/unicore/lib/GCB/EX.pl type=file -c:\perl\lib/unicore/lib/GCB/LF.pl type=file -c:\perl\lib/unicore/lib/GCB/SM.pl type=file -c:\perl\lib/unicore/lib/GCB/XX.pl type=file -c:\perl\lib/unicore/lib/Gc/C.pl type=file -c:\perl\lib/unicore/lib/Gc/Cc.pl type=file -c:\perl\lib/unicore/lib/Gc/Cf.pl type=file -c:\perl\lib/unicore/lib/Gc/Cn.pl type=file -c:\perl\lib/unicore/lib/Gc/Co.pl type=file -c:\perl\lib/unicore/lib/Gc/Cs.pl type=file -c:\perl\lib/unicore/lib/Gc/L.pl type=file -c:\perl\lib/unicore/lib/Gc/LC.pl type=file -c:\perl\lib/unicore/lib/Gc/Ll.pl type=file -c:\perl\lib/unicore/lib/Gc/Lm.pl type=file -c:\perl\lib/unicore/lib/Gc/Lo.pl type=file -c:\perl\lib/unicore/lib/Gc/Lu.pl type=file -c:\perl\lib/unicore/lib/Gc/M.pl type=file -c:\perl\lib/unicore/lib/Gc/Mc.pl type=file -c:\perl\lib/unicore/lib/Gc/Me.pl type=file -c:\perl\lib/unicore/lib/Gc/Mn.pl type=file -c:\perl\lib/unicore/lib/Gc/N.pl type=file -c:\perl\lib/unicore/lib/Gc/Nd.pl type=file -c:\perl\lib/unicore/lib/Gc/Nl.pl type=file -c:\perl\lib/unicore/lib/Gc/No.pl type=file -c:\perl\lib/unicore/lib/Gc/P.pl type=file -c:\perl\lib/unicore/lib/Gc/Pd.pl type=file -c:\perl\lib/unicore/lib/Gc/Pe.pl type=file -c:\perl\lib/unicore/lib/Gc/Pf.pl type=file -c:\perl\lib/unicore/lib/Gc/Pi.pl type=file -c:\perl\lib/unicore/lib/Gc/Po.pl type=file -c:\perl\lib/unicore/lib/Gc/Ps.pl type=file -c:\perl\lib/unicore/lib/Gc/S.pl type=file -c:\perl\lib/unicore/lib/Gc/Sc.pl type=file -c:\perl\lib/unicore/lib/Gc/Sk.pl type=file -c:\perl\lib/unicore/lib/Gc/Sm.pl type=file -c:\perl\lib/unicore/lib/Gc/So.pl type=file -c:\perl\lib/unicore/lib/Gc/Z.pl type=file -c:\perl\lib/unicore/lib/Gc/Zl.pl type=file -c:\perl\lib/unicore/lib/Gc/Zp.pl type=file -c:\perl\lib/unicore/lib/Gc/Zs.pl type=file -c:\perl\lib/unicore/lib/GrBase/Y.pl type=file -c:\perl\lib/unicore/lib/Hex/Y.pl type=file -c:\perl\lib/unicore/lib/Hst/NA.pl type=file -c:\perl\lib/unicore/lib/Hyphen/Y.pl type=file -c:\perl\lib/unicore/lib/IDC/Y.pl type=file -c:\perl\lib/unicore/lib/IDS/Y.pl type=file -c:\perl\lib/unicore/lib/IDSB/Y.pl type=file -c:\perl\lib/unicore/lib/IDST/Y.pl type=file -c:\perl\lib/unicore/lib/Ideo/Y.pl type=file -c:\perl\lib/unicore/lib/In/2_0.pl type=file -c:\perl\lib/unicore/lib/In/2_1.pl type=file -c:\perl\lib/unicore/lib/In/3_0.pl type=file -c:\perl\lib/unicore/lib/In/3_1.pl type=file -c:\perl\lib/unicore/lib/In/3_2.pl type=file -c:\perl\lib/unicore/lib/In/4_0.pl type=file -c:\perl\lib/unicore/lib/In/4_1.pl type=file -c:\perl\lib/unicore/lib/In/5_0.pl type=file -c:\perl\lib/unicore/lib/In/5_1.pl type=file -c:\perl\lib/unicore/lib/In/5_2.pl type=file -c:\perl\lib/unicore/lib/In/6_0.pl type=file -c:\perl\lib/unicore/lib/In/6_1.pl type=file -c:\perl\lib/unicore/lib/In/6_2.pl type=file -c:\perl\lib/unicore/lib/Jg/Ain.pl type=file -c:\perl\lib/unicore/lib/Jg/Alaph.pl type=file -c:\perl\lib/unicore/lib/Jg/Alef.pl type=file -c:\perl\lib/unicore/lib/Jg/Beh.pl type=file -c:\perl\lib/unicore/lib/Jg/Beth.pl type=file -c:\perl\lib/unicore/lib/Jg/Burushas.pl type=file -c:\perl\lib/unicore/lib/Jg/Dal.pl type=file -c:\perl\lib/unicore/lib/Jg/DalathRi.pl type=file -c:\perl\lib/unicore/lib/Jg/E.pl type=file -c:\perl\lib/unicore/lib/Jg/FarsiYeh.pl type=file -c:\perl\lib/unicore/lib/Jg/Fe.pl type=file -c:\perl\lib/unicore/lib/Jg/Feh.pl type=file -c:\perl\lib/unicore/lib/Jg/FinalSem.pl type=file -c:\perl\lib/unicore/lib/Jg/Gaf.pl type=file -c:\perl\lib/unicore/lib/Jg/Gamal.pl type=file -c:\perl\lib/unicore/lib/Jg/Hah.pl type=file -c:\perl\lib/unicore/lib/Jg/HamzaOnH.pl type=file -c:\perl\lib/unicore/lib/Jg/He.pl type=file -c:\perl\lib/unicore/lib/Jg/Heh.pl type=file -c:\perl\lib/unicore/lib/Jg/HehGoal.pl type=file -c:\perl\lib/unicore/lib/Jg/Heth.pl type=file -c:\perl\lib/unicore/lib/Jg/Kaf.pl type=file -c:\perl\lib/unicore/lib/Jg/Kaph.pl type=file -c:\perl\lib/unicore/lib/Jg/Khaph.pl type=file -c:\perl\lib/unicore/lib/Jg/KnottedH.pl type=file -c:\perl\lib/unicore/lib/Jg/Lam.pl type=file -c:\perl\lib/unicore/lib/Jg/Lamadh.pl type=file -c:\perl\lib/unicore/lib/Jg/Meem.pl type=file -c:\perl\lib/unicore/lib/Jg/Mim.pl type=file -c:\perl\lib/unicore/lib/Jg/NoJoinin.pl type=file -c:\perl\lib/unicore/lib/Jg/Noon.pl type=file -c:\perl\lib/unicore/lib/Jg/Nun.pl type=file -c:\perl\lib/unicore/lib/Jg/Nya.pl type=file -c:\perl\lib/unicore/lib/Jg/Pe.pl type=file -c:\perl\lib/unicore/lib/Jg/Qaf.pl type=file -c:\perl\lib/unicore/lib/Jg/Qaph.pl type=file -c:\perl\lib/unicore/lib/Jg/Reh.pl type=file -c:\perl\lib/unicore/lib/Jg/Reversed.pl type=file -c:\perl\lib/unicore/lib/Jg/Rohingya.pl type=file -c:\perl\lib/unicore/lib/Jg/Sad.pl type=file -c:\perl\lib/unicore/lib/Jg/Sadhe.pl type=file -c:\perl\lib/unicore/lib/Jg/Seen.pl type=file -c:\perl\lib/unicore/lib/Jg/Semkath.pl type=file -c:\perl\lib/unicore/lib/Jg/Shin.pl type=file -c:\perl\lib/unicore/lib/Jg/SwashKaf.pl type=file -c:\perl\lib/unicore/lib/Jg/SyriacWa.pl type=file -c:\perl\lib/unicore/lib/Jg/Tah.pl type=file -c:\perl\lib/unicore/lib/Jg/Taw.pl type=file -c:\perl\lib/unicore/lib/Jg/TehMarbu.pl type=file -c:\perl\lib/unicore/lib/Jg/Teth.pl type=file -c:\perl\lib/unicore/lib/Jg/Waw.pl type=file -c:\perl\lib/unicore/lib/Jg/Yeh.pl type=file -c:\perl\lib/unicore/lib/Jg/YehBarre.pl type=file -c:\perl\lib/unicore/lib/Jg/YehWithT.pl type=file -c:\perl\lib/unicore/lib/Jg/Yudh.pl type=file -c:\perl\lib/unicore/lib/Jg/YudhHe.pl type=file -c:\perl\lib/unicore/lib/Jg/Zain.pl type=file -c:\perl\lib/unicore/lib/Jg/Zhain.pl type=file -c:\perl\lib/unicore/lib/JoinC/Y.pl type=file -c:\perl\lib/unicore/lib/Jt/C.pl type=file -c:\perl\lib/unicore/lib/Jt/D.pl type=file -c:\perl\lib/unicore/lib/Jt/R.pl type=file -c:\perl\lib/unicore/lib/Jt/T.pl type=file -c:\perl\lib/unicore/lib/Jt/U.pl type=file -c:\perl\lib/unicore/lib/LOE/Y.pl type=file -c:\perl\lib/unicore/lib/Lb/AI.pl type=file -c:\perl\lib/unicore/lib/Lb/AL.pl type=file -c:\perl\lib/unicore/lib/Lb/B2.pl type=file -c:\perl\lib/unicore/lib/Lb/BA.pl type=file -c:\perl\lib/unicore/lib/Lb/BB.pl type=file -c:\perl\lib/unicore/lib/Lb/BK.pl type=file -c:\perl\lib/unicore/lib/Lb/CB.pl type=file -c:\perl\lib/unicore/lib/Lb/CJ.pl type=file -c:\perl\lib/unicore/lib/Lb/CL.pl type=file -c:\perl\lib/unicore/lib/Lb/CM.pl type=file -c:\perl\lib/unicore/lib/Lb/CP.pl type=file -c:\perl\lib/unicore/lib/Lb/EX.pl type=file -c:\perl\lib/unicore/lib/Lb/GL.pl type=file -c:\perl\lib/unicore/lib/Lb/HL.pl type=file -c:\perl\lib/unicore/lib/Lb/HY.pl type=file -c:\perl\lib/unicore/lib/Lb/ID.pl type=file -c:\perl\lib/unicore/lib/Lb/IN.pl type=file -c:\perl\lib/unicore/lib/Lb/IS.pl type=file -c:\perl\lib/unicore/lib/Lb/NL.pl type=file -c:\perl\lib/unicore/lib/Lb/NS.pl type=file -c:\perl\lib/unicore/lib/Lb/OP.pl type=file -c:\perl\lib/unicore/lib/Lb/PO.pl type=file -c:\perl\lib/unicore/lib/Lb/PR.pl type=file -c:\perl\lib/unicore/lib/Lb/QU.pl type=file -c:\perl\lib/unicore/lib/Lb/SA.pl type=file -c:\perl\lib/unicore/lib/Lb/SG.pl type=file -c:\perl\lib/unicore/lib/Lb/SP.pl type=file -c:\perl\lib/unicore/lib/Lb/SY.pl type=file -c:\perl\lib/unicore/lib/Lb/WJ.pl type=file -c:\perl\lib/unicore/lib/Lb/XX.pl type=file -c:\perl\lib/unicore/lib/Lb/ZW.pl type=file -c:\perl\lib/unicore/lib/Lower/Y.pl type=file -c:\perl\lib/unicore/lib/Math/Y.pl type=file -c:\perl\lib/unicore/lib/NChar/Y.pl type=file -c:\perl\lib/unicore/lib/NFCQC/M.pl type=file -c:\perl\lib/unicore/lib/NFCQC/Y.pl type=file -c:\perl\lib/unicore/lib/NFDQC/N.pl type=file -c:\perl\lib/unicore/lib/NFDQC/Y.pl type=file -c:\perl\lib/unicore/lib/NFKCQC/N.pl type=file -c:\perl\lib/unicore/lib/NFKCQC/Y.pl type=file -c:\perl\lib/unicore/lib/NFKDQC/N.pl type=file -c:\perl\lib/unicore/lib/NFKDQC/Y.pl type=file -c:\perl\lib/unicore/lib/Nt/Di.pl type=file -c:\perl\lib/unicore/lib/Nt/None.pl type=file -c:\perl\lib/unicore/lib/Nt/Nu.pl type=file -c:\perl\lib/unicore/lib/Nv/0.pl type=file -c:\perl\lib/unicore/lib/Nv/1.pl type=file -c:\perl\lib/unicore/lib/Nv/10.pl type=file -c:\perl\lib/unicore/lib/Nv/100.pl type=file -c:\perl\lib/unicore/lib/Nv/1000.pl type=file -c:\perl\lib/unicore/lib/Nv/10000.pl type=file -c:\perl\lib/unicore/lib/Nv/100000.pl type=file -c:\perl\lib/unicore/lib/Nv/10000000.pl type=file -c:\perl\lib/unicore/lib/Nv/10000002.pl type=file -c:\perl\lib/unicore/lib/Nv/11.pl type=file -c:\perl\lib/unicore/lib/Nv/11_2.pl type=file -c:\perl\lib/unicore/lib/Nv/12.pl type=file -c:\perl\lib/unicore/lib/Nv/13.pl type=file -c:\perl\lib/unicore/lib/Nv/13_2.pl type=file -c:\perl\lib/unicore/lib/Nv/14.pl type=file -c:\perl\lib/unicore/lib/Nv/15.pl type=file -c:\perl\lib/unicore/lib/Nv/15_2.pl type=file -c:\perl\lib/unicore/lib/Nv/16.pl type=file -c:\perl\lib/unicore/lib/Nv/17.pl type=file -c:\perl\lib/unicore/lib/Nv/17_2.pl type=file -c:\perl\lib/unicore/lib/Nv/18.pl type=file -c:\perl\lib/unicore/lib/Nv/19.pl type=file -c:\perl\lib/unicore/lib/Nv/1_10.pl type=file -c:\perl\lib/unicore/lib/Nv/1_16.pl type=file -c:\perl\lib/unicore/lib/Nv/1_2.pl type=file -c:\perl\lib/unicore/lib/Nv/1_3.pl type=file -c:\perl\lib/unicore/lib/Nv/1_4.pl type=file -c:\perl\lib/unicore/lib/Nv/1_5.pl type=file -c:\perl\lib/unicore/lib/Nv/1_6.pl type=file -c:\perl\lib/unicore/lib/Nv/1_7.pl type=file -c:\perl\lib/unicore/lib/Nv/1_8.pl type=file -c:\perl\lib/unicore/lib/Nv/1_9.pl type=file -c:\perl\lib/unicore/lib/Nv/2.pl type=file -c:\perl\lib/unicore/lib/Nv/20.pl type=file -c:\perl\lib/unicore/lib/Nv/200.pl type=file -c:\perl\lib/unicore/lib/Nv/2000.pl type=file -c:\perl\lib/unicore/lib/Nv/20000.pl type=file -c:\perl\lib/unicore/lib/Nv/21.pl type=file -c:\perl\lib/unicore/lib/Nv/216000.pl type=file -c:\perl\lib/unicore/lib/Nv/22.pl type=file -c:\perl\lib/unicore/lib/Nv/23.pl type=file -c:\perl\lib/unicore/lib/Nv/24.pl type=file -c:\perl\lib/unicore/lib/Nv/25.pl type=file -c:\perl\lib/unicore/lib/Nv/26.pl type=file -c:\perl\lib/unicore/lib/Nv/27.pl type=file -c:\perl\lib/unicore/lib/Nv/28.pl type=file -c:\perl\lib/unicore/lib/Nv/29.pl type=file -c:\perl\lib/unicore/lib/Nv/2_3.pl type=file -c:\perl\lib/unicore/lib/Nv/2_5.pl type=file -c:\perl\lib/unicore/lib/Nv/3.pl type=file -c:\perl\lib/unicore/lib/Nv/30.pl type=file -c:\perl\lib/unicore/lib/Nv/300.pl type=file -c:\perl\lib/unicore/lib/Nv/3000.pl type=file -c:\perl\lib/unicore/lib/Nv/30000.pl type=file -c:\perl\lib/unicore/lib/Nv/31.pl type=file -c:\perl\lib/unicore/lib/Nv/32.pl type=file -c:\perl\lib/unicore/lib/Nv/33.pl type=file -c:\perl\lib/unicore/lib/Nv/34.pl type=file -c:\perl\lib/unicore/lib/Nv/35.pl type=file -c:\perl\lib/unicore/lib/Nv/36.pl type=file -c:\perl\lib/unicore/lib/Nv/37.pl type=file -c:\perl\lib/unicore/lib/Nv/38.pl type=file -c:\perl\lib/unicore/lib/Nv/39.pl type=file -c:\perl\lib/unicore/lib/Nv/3_16.pl type=file -c:\perl\lib/unicore/lib/Nv/3_2.pl type=file -c:\perl\lib/unicore/lib/Nv/3_4.pl type=file -c:\perl\lib/unicore/lib/Nv/3_5.pl type=file -c:\perl\lib/unicore/lib/Nv/3_8.pl type=file -c:\perl\lib/unicore/lib/Nv/4.pl type=file -c:\perl\lib/unicore/lib/Nv/40.pl type=file -c:\perl\lib/unicore/lib/Nv/400.pl type=file -c:\perl\lib/unicore/lib/Nv/4000.pl type=file -c:\perl\lib/unicore/lib/Nv/40000.pl type=file -c:\perl\lib/unicore/lib/Nv/41.pl type=file -c:\perl\lib/unicore/lib/Nv/42.pl type=file -c:\perl\lib/unicore/lib/Nv/43.pl type=file -c:\perl\lib/unicore/lib/Nv/432000.pl type=file -c:\perl\lib/unicore/lib/Nv/44.pl type=file -c:\perl\lib/unicore/lib/Nv/45.pl type=file -c:\perl\lib/unicore/lib/Nv/46.pl type=file -c:\perl\lib/unicore/lib/Nv/47.pl type=file -c:\perl\lib/unicore/lib/Nv/48.pl type=file -c:\perl\lib/unicore/lib/Nv/49.pl type=file -c:\perl\lib/unicore/lib/Nv/4_5.pl type=file -c:\perl\lib/unicore/lib/Nv/5.pl type=file -c:\perl\lib/unicore/lib/Nv/50.pl type=file -c:\perl\lib/unicore/lib/Nv/500.pl type=file -c:\perl\lib/unicore/lib/Nv/5000.pl type=file -c:\perl\lib/unicore/lib/Nv/50000.pl type=file -c:\perl\lib/unicore/lib/Nv/5_2.pl type=file -c:\perl\lib/unicore/lib/Nv/5_6.pl type=file -c:\perl\lib/unicore/lib/Nv/5_8.pl type=file -c:\perl\lib/unicore/lib/Nv/6.pl type=file -c:\perl\lib/unicore/lib/Nv/60.pl type=file -c:\perl\lib/unicore/lib/Nv/600.pl type=file -c:\perl\lib/unicore/lib/Nv/6000.pl type=file -c:\perl\lib/unicore/lib/Nv/60000.pl type=file -c:\perl\lib/unicore/lib/Nv/7.pl type=file -c:\perl\lib/unicore/lib/Nv/70.pl type=file -c:\perl\lib/unicore/lib/Nv/700.pl type=file -c:\perl\lib/unicore/lib/Nv/7000.pl type=file -c:\perl\lib/unicore/lib/Nv/70000.pl type=file -c:\perl\lib/unicore/lib/Nv/7_2.pl type=file -c:\perl\lib/unicore/lib/Nv/7_8.pl type=file -c:\perl\lib/unicore/lib/Nv/8.pl type=file -c:\perl\lib/unicore/lib/Nv/80.pl type=file -c:\perl\lib/unicore/lib/Nv/800.pl type=file -c:\perl\lib/unicore/lib/Nv/8000.pl type=file -c:\perl\lib/unicore/lib/Nv/80000.pl type=file -c:\perl\lib/unicore/lib/Nv/9.pl type=file -c:\perl\lib/unicore/lib/Nv/90.pl type=file -c:\perl\lib/unicore/lib/Nv/900.pl type=file -c:\perl\lib/unicore/lib/Nv/9000.pl type=file -c:\perl\lib/unicore/lib/Nv/90000.pl type=file -c:\perl\lib/unicore/lib/Nv/9_2.pl type=file -c:\perl\lib/unicore/lib/Nv/_1.pl type=file -c:\perl\lib/unicore/lib/Nv/_1_2.pl type=file -c:\perl\lib/unicore/lib/PatSyn/Y.pl type=file -c:\perl\lib/unicore/lib/PatWS/Y.pl type=file -c:\perl\lib/unicore/lib/Perl/Alnum.pl type=file -c:\perl\lib/unicore/lib/Perl/Any.pl type=file -c:\perl\lib/unicore/lib/Perl/Assigned.pl type=file -c:\perl\lib/unicore/lib/Perl/Blank.pl type=file -c:\perl\lib/unicore/lib/Perl/Graph.pl type=file -c:\perl\lib/unicore/lib/Perl/PerlSpac.pl type=file -c:\perl\lib/unicore/lib/Perl/PerlWord.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixAln.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixAlp.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixBla.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixCnt.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixDig.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixGra.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixLow.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixPri.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixPun.pl type=file -c:\perl\lib/unicore/lib/Perl/PosixUpp.pl type=file -c:\perl\lib/unicore/lib/Perl/Print.pl type=file -c:\perl\lib/unicore/lib/Perl/SpacePer.pl type=file -c:\perl\lib/unicore/lib/Perl/Title.pl type=file -c:\perl\lib/unicore/lib/Perl/VertSpac.pl type=file -c:\perl\lib/unicore/lib/Perl/Word.pl type=file -c:\perl\lib/unicore/lib/Perl/XPosixPu.pl type=file -c:\perl\lib/unicore/lib/Perl/_PerlAny.pl type=file -c:\perl\lib/unicore/lib/Perl/_PerlCh2.pl type=file -c:\perl\lib/unicore/lib/Perl/_PerlCha.pl type=file -c:\perl\lib/unicore/lib/Perl/_PerlIDC.pl type=file -c:\perl\lib/unicore/lib/Perl/_PerlIDS.pl type=file -c:\perl\lib/unicore/lib/Perl/_PerlQuo.pl type=file -c:\perl\lib/unicore/lib/Perl/_XExtend.pl type=file -c:\perl\lib/unicore/lib/Perl/_XGCBL.pl type=file -c:\perl\lib/unicore/lib/Perl/_XGCBLV.pl type=file -c:\perl\lib/unicore/lib/Perl/_XGCBLVT.pl type=file -c:\perl\lib/unicore/lib/Perl/_XGCBT.pl type=file -c:\perl\lib/unicore/lib/Perl/_XGCBV.pl type=file -c:\perl\lib/unicore/lib/Perl/_XLVLVTV.pl type=file -c:\perl\lib/unicore/lib/Perl/_XRI.pl type=file -c:\perl\lib/unicore/lib/Perl/_XRegula.pl type=file -c:\perl\lib/unicore/lib/Perl/_XSpecia.pl type=file -c:\perl\lib/unicore/lib/QMark/Y.pl type=file -c:\perl\lib/unicore/lib/Radical/Y.pl type=file -c:\perl\lib/unicore/lib/SB/AT.pl type=file -c:\perl\lib/unicore/lib/SB/CL.pl type=file -c:\perl\lib/unicore/lib/SB/EX.pl type=file -c:\perl\lib/unicore/lib/SB/FO.pl type=file -c:\perl\lib/unicore/lib/SB/LE.pl type=file -c:\perl\lib/unicore/lib/SB/LO.pl type=file -c:\perl\lib/unicore/lib/SB/NU.pl type=file -c:\perl\lib/unicore/lib/SB/SC.pl type=file -c:\perl\lib/unicore/lib/SB/SE.pl type=file -c:\perl\lib/unicore/lib/SB/ST.pl type=file -c:\perl\lib/unicore/lib/SB/Sp.pl type=file -c:\perl\lib/unicore/lib/SB/UP.pl type=file -c:\perl\lib/unicore/lib/SB/XX.pl type=file -c:\perl\lib/unicore/lib/SD/Y.pl type=file -c:\perl\lib/unicore/lib/STerm/Y.pl type=file -c:\perl\lib/unicore/lib/Sc/Arab.pl type=file -c:\perl\lib/unicore/lib/Sc/Armi.pl type=file -c:\perl\lib/unicore/lib/Sc/Armn.pl type=file -c:\perl\lib/unicore/lib/Sc/Avst.pl type=file -c:\perl\lib/unicore/lib/Sc/Bali.pl type=file -c:\perl\lib/unicore/lib/Sc/Bamu.pl type=file -c:\perl\lib/unicore/lib/Sc/Batk.pl type=file -c:\perl\lib/unicore/lib/Sc/Beng.pl type=file -c:\perl\lib/unicore/lib/Sc/Bopo.pl type=file -c:\perl\lib/unicore/lib/Sc/Brah.pl type=file -c:\perl\lib/unicore/lib/Sc/Bugi.pl type=file -c:\perl\lib/unicore/lib/Sc/Buhd.pl type=file -c:\perl\lib/unicore/lib/Sc/Cakm.pl type=file -c:\perl\lib/unicore/lib/Sc/Cans.pl type=file -c:\perl\lib/unicore/lib/Sc/Cari.pl type=file -c:\perl\lib/unicore/lib/Sc/Cham.pl type=file -c:\perl\lib/unicore/lib/Sc/Cher.pl type=file -c:\perl\lib/unicore/lib/Sc/Copt.pl type=file -c:\perl\lib/unicore/lib/Sc/Cprt.pl type=file -c:\perl\lib/unicore/lib/Sc/Cyrl.pl type=file -c:\perl\lib/unicore/lib/Sc/Deva.pl type=file -c:\perl\lib/unicore/lib/Sc/Egyp.pl type=file -c:\perl\lib/unicore/lib/Sc/Ethi.pl type=file -c:\perl\lib/unicore/lib/Sc/Geor.pl type=file -c:\perl\lib/unicore/lib/Sc/Glag.pl type=file -c:\perl\lib/unicore/lib/Sc/Goth.pl type=file -c:\perl\lib/unicore/lib/Sc/Grek.pl type=file -c:\perl\lib/unicore/lib/Sc/Gujr.pl type=file -c:\perl\lib/unicore/lib/Sc/Guru.pl type=file -c:\perl\lib/unicore/lib/Sc/Han.pl type=file -c:\perl\lib/unicore/lib/Sc/Hang.pl type=file -c:\perl\lib/unicore/lib/Sc/Hano.pl type=file -c:\perl\lib/unicore/lib/Sc/Hebr.pl type=file -c:\perl\lib/unicore/lib/Sc/Hira.pl type=file -c:\perl\lib/unicore/lib/Sc/Ital.pl type=file -c:\perl\lib/unicore/lib/Sc/Java.pl type=file -c:\perl\lib/unicore/lib/Sc/Kana.pl type=file -c:\perl\lib/unicore/lib/Sc/Khar.pl type=file -c:\perl\lib/unicore/lib/Sc/Khmr.pl type=file -c:\perl\lib/unicore/lib/Sc/Knda.pl type=file -c:\perl\lib/unicore/lib/Sc/Kthi.pl type=file -c:\perl\lib/unicore/lib/Sc/Lana.pl type=file -c:\perl\lib/unicore/lib/Sc/Lao.pl type=file -c:\perl\lib/unicore/lib/Sc/Latn.pl type=file -c:\perl\lib/unicore/lib/Sc/Lepc.pl type=file -c:\perl\lib/unicore/lib/Sc/Limb.pl type=file -c:\perl\lib/unicore/lib/Sc/Linb.pl type=file -c:\perl\lib/unicore/lib/Sc/Lyci.pl type=file -c:\perl\lib/unicore/lib/Sc/Lydi.pl type=file -c:\perl\lib/unicore/lib/Sc/Mand.pl type=file -c:\perl\lib/unicore/lib/Sc/Merc.pl type=file -c:\perl\lib/unicore/lib/Sc/Miao.pl type=file -c:\perl\lib/unicore/lib/Sc/Mlym.pl type=file -c:\perl\lib/unicore/lib/Sc/Mong.pl type=file -c:\perl\lib/unicore/lib/Sc/Mtei.pl type=file -c:\perl\lib/unicore/lib/Sc/Mymr.pl type=file -c:\perl\lib/unicore/lib/Sc/Nko.pl type=file -c:\perl\lib/unicore/lib/Sc/Ogam.pl type=file -c:\perl\lib/unicore/lib/Sc/Orkh.pl type=file -c:\perl\lib/unicore/lib/Sc/Orya.pl type=file -c:\perl\lib/unicore/lib/Sc/Osma.pl type=file -c:\perl\lib/unicore/lib/Sc/Phag.pl type=file -c:\perl\lib/unicore/lib/Sc/Phli.pl type=file -c:\perl\lib/unicore/lib/Sc/Phnx.pl type=file -c:\perl\lib/unicore/lib/Sc/Prti.pl type=file -c:\perl\lib/unicore/lib/Sc/Rjng.pl type=file -c:\perl\lib/unicore/lib/Sc/Runr.pl type=file -c:\perl\lib/unicore/lib/Sc/Samr.pl type=file -c:\perl\lib/unicore/lib/Sc/Saur.pl type=file -c:\perl\lib/unicore/lib/Sc/Shrd.pl type=file -c:\perl\lib/unicore/lib/Sc/Sinh.pl type=file -c:\perl\lib/unicore/lib/Sc/Sora.pl type=file -c:\perl\lib/unicore/lib/Sc/Sund.pl type=file -c:\perl\lib/unicore/lib/Sc/Sylo.pl type=file -c:\perl\lib/unicore/lib/Sc/Syrc.pl type=file -c:\perl\lib/unicore/lib/Sc/Tagb.pl type=file -c:\perl\lib/unicore/lib/Sc/Takr.pl type=file -c:\perl\lib/unicore/lib/Sc/Tale.pl type=file -c:\perl\lib/unicore/lib/Sc/Talu.pl type=file -c:\perl\lib/unicore/lib/Sc/Taml.pl type=file -c:\perl\lib/unicore/lib/Sc/Tavt.pl type=file -c:\perl\lib/unicore/lib/Sc/Telu.pl type=file -c:\perl\lib/unicore/lib/Sc/Tfng.pl type=file -c:\perl\lib/unicore/lib/Sc/Tglg.pl type=file -c:\perl\lib/unicore/lib/Sc/Thaa.pl type=file -c:\perl\lib/unicore/lib/Sc/Thai.pl type=file -c:\perl\lib/unicore/lib/Sc/Tibt.pl type=file -c:\perl\lib/unicore/lib/Sc/Ugar.pl type=file -c:\perl\lib/unicore/lib/Sc/Vai.pl type=file -c:\perl\lib/unicore/lib/Sc/Xpeo.pl type=file -c:\perl\lib/unicore/lib/Sc/Xsux.pl type=file -c:\perl\lib/unicore/lib/Sc/Yi.pl type=file -c:\perl\lib/unicore/lib/Sc/Zinh.pl type=file -c:\perl\lib/unicore/lib/Sc/Zyyy.pl type=file -c:\perl\lib/unicore/lib/Sc/Zzzz.pl type=file -c:\perl\lib/unicore/lib/Scx/Arab.pl type=file -c:\perl\lib/unicore/lib/Scx/Armn.pl type=file -c:\perl\lib/unicore/lib/Scx/Beng.pl type=file -c:\perl\lib/unicore/lib/Scx/Bopo.pl type=file -c:\perl\lib/unicore/lib/Scx/Buhd.pl type=file -c:\perl\lib/unicore/lib/Scx/Cprt.pl type=file -c:\perl\lib/unicore/lib/Scx/Cyrl.pl type=file -c:\perl\lib/unicore/lib/Scx/Deva.pl type=file -c:\perl\lib/unicore/lib/Scx/Geor.pl type=file -c:\perl\lib/unicore/lib/Scx/Grek.pl type=file -c:\perl\lib/unicore/lib/Scx/Gujr.pl type=file -c:\perl\lib/unicore/lib/Scx/Guru.pl type=file -c:\perl\lib/unicore/lib/Scx/Han.pl type=file -c:\perl\lib/unicore/lib/Scx/Hang.pl type=file -c:\perl\lib/unicore/lib/Scx/Hano.pl type=file -c:\perl\lib/unicore/lib/Scx/Hira.pl type=file -c:\perl\lib/unicore/lib/Scx/Kana.pl type=file -c:\perl\lib/unicore/lib/Scx/Kthi.pl type=file -c:\perl\lib/unicore/lib/Scx/Latn.pl type=file -c:\perl\lib/unicore/lib/Scx/Linb.pl type=file -c:\perl\lib/unicore/lib/Scx/Mand.pl type=file -c:\perl\lib/unicore/lib/Scx/Mong.pl type=file -c:\perl\lib/unicore/lib/Scx/Orya.pl type=file -c:\perl\lib/unicore/lib/Scx/Phag.pl type=file -c:\perl\lib/unicore/lib/Scx/Syrc.pl type=file -c:\perl\lib/unicore/lib/Scx/Tagb.pl type=file -c:\perl\lib/unicore/lib/Scx/Takr.pl type=file -c:\perl\lib/unicore/lib/Scx/Tglg.pl type=file -c:\perl\lib/unicore/lib/Scx/Thaa.pl type=file -c:\perl\lib/unicore/lib/Scx/Yi.pl type=file -c:\perl\lib/unicore/lib/Scx/Zinh.pl type=file -c:\perl\lib/unicore/lib/Scx/Zyyy.pl type=file -c:\perl\lib/unicore/lib/Term/Y.pl type=file -c:\perl\lib/unicore/lib/UIdeo/Y.pl type=file -c:\perl\lib/unicore/lib/Upper/Y.pl type=file -c:\perl\lib/unicore/lib/VS/Y.pl type=file -c:\perl\lib/unicore/lib/WB/EX.pl type=file -c:\perl\lib/unicore/lib/WB/FO.pl type=file -c:\perl\lib/unicore/lib/WB/KA.pl type=file -c:\perl\lib/unicore/lib/WB/LE.pl type=file -c:\perl\lib/unicore/lib/WB/MB.pl type=file -c:\perl\lib/unicore/lib/WB/ML.pl type=file -c:\perl\lib/unicore/lib/WB/MN.pl type=file -c:\perl\lib/unicore/lib/WB/NL.pl type=file -c:\perl\lib/unicore/lib/WB/NU.pl type=file -c:\perl\lib/unicore/lib/WB/XX.pl type=file -c:\perl\lib/unicore/lib/XIDC/Y.pl type=file -c:\perl\lib/unicore/lib/XIDS/Y.pl type=file -c:\perl\lib/unicore/version type=file -c:\perl\lib/utf8.pm type=file -c:\perl\lib/utf8_heavy.pl type=file -c:\perl\lib/vars.pm type=file -c:\perl\lib/version.pm type=file -c:\perl\lib/version.pod type=file -c:\perl\lib/version/Internals.pod type=file -c:\perl\lib/vmsish.pm type=file -c:\perl\lib/warnings.pm type=file -c:\perl\lib/warnings/register.pm type=file +c:\tlperl\bin/a2p.exe type=file +c:\tlperl\bin/c2ph.bat type=file +c:\tlperl\bin/config_data.bat type=file +c:\tlperl\bin/corelist.bat type=file +c:\tlperl\bin/cpan.bat type=file +c:\tlperl\bin/enc2xs.bat type=file +c:\tlperl\bin/find2perl.bat type=file +c:\tlperl\bin/h2ph.bat type=file +c:\tlperl\bin/h2xs.bat type=file +c:\tlperl\bin/instmodsh.bat type=file +c:\tlperl\bin/json_pp.bat type=file +c:\tlperl\bin/libnetcfg.bat type=file +c:\tlperl\bin/perl.exe from=c:\tlperl\bin/perl5.20.2.exe type=link +c:\tlperl\bin/perl5.20.2.exe type=file +c:\tlperl\bin/perl520.dll type=file +c:\tlperl\bin/perlbug.bat type=file +c:\tlperl\bin/perldoc.bat type=file +c:\tlperl\bin/perlivp.bat type=file +c:\tlperl\bin/perlthanks.bat from=c:\tlperl\bin/perlbug.bat type=link +c:\tlperl\bin/piconv.bat type=file +c:\tlperl\bin/pl2pm.bat type=file +c:\tlperl\bin/pod2html.bat type=file +c:\tlperl\bin/pod2man.bat type=file +c:\tlperl\bin/pod2text.bat type=file +c:\tlperl\bin/pod2usage.bat type=file +c:\tlperl\bin/podchecker.bat type=file +c:\tlperl\bin/podselect.bat type=file +c:\tlperl\bin/prove.bat type=file +c:\tlperl\bin/psed.bat from=c:\tlperl\bin/s2p.bat type=link +c:\tlperl\bin/pstruct.bat from=c:\tlperl\bin/c2ph.bat type=link +c:\tlperl\bin/ptar.bat type=file +c:\tlperl\bin/ptardiff.bat type=file +c:\tlperl\bin/ptargrep.bat type=file +c:\tlperl\bin/s2p.bat type=file +c:\tlperl\bin/shasum.bat type=file +c:\tlperl\bin/splain.bat type=file +c:\tlperl\bin/xsubpp.bat type=file +c:\tlperl\bin/zipdetails.bat type=file +c:\tlperl\lib/AnyDBM_File.pm type=file +c:\tlperl\lib/App/Cpan.pm type=file +c:\tlperl\lib/App/Prove.pm type=file +c:\tlperl\lib/App/Prove/State.pm type=file +c:\tlperl\lib/App/Prove/State/Result.pm type=file +c:\tlperl\lib/App/Prove/State/Result/Test.pm type=file +c:\tlperl\lib/Archive/Tar.pm type=file +c:\tlperl\lib/Archive/Tar/Constant.pm type=file +c:\tlperl\lib/Archive/Tar/File.pm type=file +c:\tlperl\lib/Attribute/Handlers.pm type=file +c:\tlperl\lib/AutoLoader.pm type=file +c:\tlperl\lib/AutoSplit.pm type=file +c:\tlperl\lib/B.pm type=file +c:\tlperl\lib/B/Concise.pm type=file +c:\tlperl\lib/B/Debug.pm type=file +c:\tlperl\lib/B/Deparse.pm type=file +c:\tlperl\lib/B/Showlex.pm type=file +c:\tlperl\lib/B/Terse.pm type=file +c:\tlperl\lib/B/Xref.pm type=file +c:\tlperl\lib/Benchmark.pm type=file +c:\tlperl\lib/CGI.pm type=file +c:\tlperl\lib/CGI/Apache.pm type=file +c:\tlperl\lib/CGI/Carp.pm type=file +c:\tlperl\lib/CGI/Cookie.pm type=file +c:\tlperl\lib/CGI/Fast.pm type=file +c:\tlperl\lib/CGI/Pretty.pm type=file +c:\tlperl\lib/CGI/Push.pm type=file +c:\tlperl\lib/CGI/Switch.pm type=file +c:\tlperl\lib/CGI/Util.pm type=file +c:\tlperl\lib/CORE.pod type=file +c:\tlperl\lib/CORE/EXTERN.h type=file +c:\tlperl\lib/CORE/INTERN.h type=file +c:\tlperl\lib/CORE/XSUB.h type=file +c:\tlperl\lib/CORE/arpa/inet.h type=file +c:\tlperl\lib/CORE/av.h type=file +c:\tlperl\lib/CORE/bitcount.h type=file +c:\tlperl\lib/CORE/charclass_invlists.h type=file +c:\tlperl\lib/CORE/config.h type=file +c:\tlperl\lib/CORE/cop.h type=file +c:\tlperl\lib/CORE/cv.h type=file +c:\tlperl\lib/CORE/dirent.h type=file +c:\tlperl\lib/CORE/dosish.h type=file +c:\tlperl\lib/CORE/embed.h type=file +c:\tlperl\lib/CORE/embedvar.h type=file +c:\tlperl\lib/CORE/fakesdio.h type=file +c:\tlperl\lib/CORE/feature.h type=file +c:\tlperl\lib/CORE/form.h type=file +c:\tlperl\lib/CORE/git_version.h type=file +c:\tlperl\lib/CORE/gv.h type=file +c:\tlperl\lib/CORE/handy.h type=file +c:\tlperl\lib/CORE/hv.h type=file +c:\tlperl\lib/CORE/hv_func.h type=file +c:\tlperl\lib/CORE/inline.h type=file +c:\tlperl\lib/CORE/intrpvar.h type=file +c:\tlperl\lib/CORE/iperlsys.h type=file +c:\tlperl\lib/CORE/keywords.h type=file +c:\tlperl\lib/CORE/l1_char_class_tab.h type=file +c:\tlperl\lib/CORE/libperl520.a type=file +c:\tlperl\lib/CORE/malloc_ctl.h type=file +c:\tlperl\lib/CORE/metaconfig.h type=file +c:\tlperl\lib/CORE/mg.h type=file +c:\tlperl\lib/CORE/mg_data.h type=file +c:\tlperl\lib/CORE/mg_raw.h type=file +c:\tlperl\lib/CORE/mg_vtable.h type=file +c:\tlperl\lib/CORE/mydtrace.h type=file +c:\tlperl\lib/CORE/netdb.h type=file +c:\tlperl\lib/CORE/nostdio.h type=file +c:\tlperl\lib/CORE/op.h type=file +c:\tlperl\lib/CORE/op_reg_common.h type=file +c:\tlperl\lib/CORE/opcode.h type=file +c:\tlperl\lib/CORE/opnames.h type=file +c:\tlperl\lib/CORE/overload.h type=file +c:\tlperl\lib/CORE/pad.h type=file +c:\tlperl\lib/CORE/parser.h type=file +c:\tlperl\lib/CORE/patchlevel.h type=file +c:\tlperl\lib/CORE/perl.h type=file +c:\tlperl\lib/CORE/perlapi.h type=file +c:\tlperl\lib/CORE/perlhost.h type=file +c:\tlperl\lib/CORE/perlio.h type=file +c:\tlperl\lib/CORE/perliol.h type=file +c:\tlperl\lib/CORE/perlsdio.h type=file +c:\tlperl\lib/CORE/perlvars.h type=file +c:\tlperl\lib/CORE/perly.h type=file +c:\tlperl\lib/CORE/pp.h type=file +c:\tlperl\lib/CORE/pp_proto.h type=file +c:\tlperl\lib/CORE/proto.h type=file +c:\tlperl\lib/CORE/reentr.h type=file +c:\tlperl\lib/CORE/regcharclass.h type=file +c:\tlperl\lib/CORE/regcomp.h type=file +c:\tlperl\lib/CORE/regexp.h type=file +c:\tlperl\lib/CORE/regnodes.h type=file +c:\tlperl\lib/CORE/scope.h type=file +c:\tlperl\lib/CORE/sv.h type=file +c:\tlperl\lib/CORE/sys/errno2.h type=file +c:\tlperl\lib/CORE/sys/socket.h type=file +c:\tlperl\lib/CORE/thread.h type=file +c:\tlperl\lib/CORE/time64.h type=file +c:\tlperl\lib/CORE/time64_config.h type=file +c:\tlperl\lib/CORE/uconfig.h type=file +c:\tlperl\lib/CORE/unicode_constants.h type=file +c:\tlperl\lib/CORE/unixish.h type=file +c:\tlperl\lib/CORE/utf8.h type=file +c:\tlperl\lib/CORE/utfebcdic.h type=file +c:\tlperl\lib/CORE/util.h type=file +c:\tlperl\lib/CORE/uudmap.h type=file +c:\tlperl\lib/CORE/vdir.h type=file +c:\tlperl\lib/CORE/vmem.h type=file +c:\tlperl\lib/CORE/vutil.h type=file +c:\tlperl\lib/CORE/warnings.h type=file +c:\tlperl\lib/CORE/win32.h type=file +c:\tlperl\lib/CORE/win32iop-o.h type=file +c:\tlperl\lib/CORE/win32iop.h type=file +c:\tlperl\lib/CORE/win32thread.h type=file +c:\tlperl\lib/CORE/wince.h type=file +c:\tlperl\lib/CPAN.pm type=file +c:\tlperl\lib/CPAN/API/HOWTO.pod type=file +c:\tlperl\lib/CPAN/Author.pm type=file +c:\tlperl\lib/CPAN/Bundle.pm type=file +c:\tlperl\lib/CPAN/CacheMgr.pm type=file +c:\tlperl\lib/CPAN/Complete.pm type=file +c:\tlperl\lib/CPAN/Debug.pm type=file +c:\tlperl\lib/CPAN/DeferredCode.pm type=file +c:\tlperl\lib/CPAN/Distribution.pm type=file +c:\tlperl\lib/CPAN/Distroprefs.pm type=file +c:\tlperl\lib/CPAN/Distrostatus.pm type=file +c:\tlperl\lib/CPAN/Exception/RecursiveDependency.pm type=file +c:\tlperl\lib/CPAN/Exception/blocked_urllist.pm type=file +c:\tlperl\lib/CPAN/Exception/yaml_not_installed.pm type=file +c:\tlperl\lib/CPAN/Exception/yaml_process_error.pm type=file +c:\tlperl\lib/CPAN/FTP.pm type=file +c:\tlperl\lib/CPAN/FTP/netrc.pm type=file +c:\tlperl\lib/CPAN/FirstTime.pm type=file +c:\tlperl\lib/CPAN/HTTP/Client.pm type=file +c:\tlperl\lib/CPAN/HTTP/Credentials.pm type=file +c:\tlperl\lib/CPAN/HandleConfig.pm type=file +c:\tlperl\lib/CPAN/Index.pm type=file +c:\tlperl\lib/CPAN/InfoObj.pm type=file +c:\tlperl\lib/CPAN/Kwalify.pm type=file +c:\tlperl\lib/CPAN/Kwalify/distroprefs.dd type=file +c:\tlperl\lib/CPAN/Kwalify/distroprefs.yml type=file +c:\tlperl\lib/CPAN/LWP/UserAgent.pm type=file +c:\tlperl\lib/CPAN/Meta.pm type=file +c:\tlperl\lib/CPAN/Meta/Converter.pm type=file +c:\tlperl\lib/CPAN/Meta/Feature.pm type=file +c:\tlperl\lib/CPAN/Meta/History.pm type=file +c:\tlperl\lib/CPAN/Meta/Prereqs.pm type=file +c:\tlperl\lib/CPAN/Meta/Requirements.pm type=file +c:\tlperl\lib/CPAN/Meta/Spec.pm type=file +c:\tlperl\lib/CPAN/Meta/Validator.pm type=file +c:\tlperl\lib/CPAN/Meta/YAML.pm type=file +c:\tlperl\lib/CPAN/Mirrors.pm type=file +c:\tlperl\lib/CPAN/Module.pm type=file +c:\tlperl\lib/CPAN/Nox.pm type=file +c:\tlperl\lib/CPAN/Prompt.pm type=file +c:\tlperl\lib/CPAN/Queue.pm type=file +c:\tlperl\lib/CPAN/Shell.pm type=file +c:\tlperl\lib/CPAN/Tarzip.pm type=file +c:\tlperl\lib/CPAN/URL.pm type=file +c:\tlperl\lib/CPAN/Version.pm type=file +c:\tlperl\lib/Carp.pm type=file +c:\tlperl\lib/Carp/Heavy.pm type=file +c:\tlperl\lib/Class/Struct.pm type=file +c:\tlperl\lib/Compress/Raw/Bzip2.pm type=file +c:\tlperl\lib/Compress/Raw/Zlib.pm type=file +c:\tlperl\lib/Compress/Zlib.pm type=file +c:\tlperl\lib/Config.pm type=file +c:\tlperl\lib/Config.pod type=file +c:\tlperl\lib/Config/Extensions.pm type=file +c:\tlperl\lib/Config/Perl/V.pm type=file +c:\tlperl\lib/Config_git.pl type=file +c:\tlperl\lib/Config_heavy.pl type=file +c:\tlperl\lib/Cwd.pm type=file +c:\tlperl\lib/DB.pm type=file +c:\tlperl\lib/DBM_Filter.pm type=file +c:\tlperl\lib/DBM_Filter/compress.pm type=file +c:\tlperl\lib/DBM_Filter/encode.pm type=file +c:\tlperl\lib/DBM_Filter/int32.pm type=file +c:\tlperl\lib/DBM_Filter/null.pm type=file +c:\tlperl\lib/DBM_Filter/utf8.pm type=file +c:\tlperl\lib/Data/Dumper.pm type=file +c:\tlperl\lib/Devel/PPPort.pm type=file +c:\tlperl\lib/Devel/Peek.pm type=file +c:\tlperl\lib/Devel/SelfStubber.pm type=file +c:\tlperl\lib/Digest.pm type=file +c:\tlperl\lib/Digest/MD5.pm type=file +c:\tlperl\lib/Digest/SHA.pm type=file +c:\tlperl\lib/Digest/base.pm type=file +c:\tlperl\lib/Digest/file.pm type=file +c:\tlperl\lib/DirHandle.pm type=file +c:\tlperl\lib/Dumpvalue.pm type=file +c:\tlperl\lib/DynaLoader.pm type=file +c:\tlperl\lib/Encode.pm type=file +c:\tlperl\lib/Encode/Alias.pm type=file +c:\tlperl\lib/Encode/Byte.pm type=file +c:\tlperl\lib/Encode/CJKConstants.pm type=file +c:\tlperl\lib/Encode/CN.pm type=file +c:\tlperl\lib/Encode/CN/HZ.pm type=file +c:\tlperl\lib/Encode/Changes.e2x type=file +c:\tlperl\lib/Encode/Config.pm type=file +c:\tlperl\lib/Encode/ConfigLocal_PM.e2x type=file +c:\tlperl\lib/Encode/EBCDIC.pm type=file +c:\tlperl\lib/Encode/Encoder.pm type=file +c:\tlperl\lib/Encode/Encoding.pm type=file +c:\tlperl\lib/Encode/GSM0338.pm type=file +c:\tlperl\lib/Encode/Guess.pm type=file +c:\tlperl\lib/Encode/JP.pm type=file +c:\tlperl\lib/Encode/JP/H2Z.pm type=file +c:\tlperl\lib/Encode/JP/JIS7.pm type=file +c:\tlperl\lib/Encode/KR.pm type=file +c:\tlperl\lib/Encode/KR/2022_KR.pm type=file +c:\tlperl\lib/Encode/MIME/Header.pm type=file +c:\tlperl\lib/Encode/MIME/Header/ISO_2022_JP.pm type=file +c:\tlperl\lib/Encode/MIME/Name.pm type=file +c:\tlperl\lib/Encode/Makefile_PL.e2x type=file +c:\tlperl\lib/Encode/PerlIO.pod type=file +c:\tlperl\lib/Encode/README.e2x type=file +c:\tlperl\lib/Encode/Supported.pod type=file +c:\tlperl\lib/Encode/Symbol.pm type=file +c:\tlperl\lib/Encode/TW.pm type=file +c:\tlperl\lib/Encode/Unicode.pm type=file +c:\tlperl\lib/Encode/Unicode/UTF7.pm type=file +c:\tlperl\lib/Encode/_PM.e2x type=file +c:\tlperl\lib/Encode/_T.e2x type=file +c:\tlperl\lib/Encode/encode.h type=file +c:\tlperl\lib/English.pm type=file +c:\tlperl\lib/Env.pm type=file +c:\tlperl\lib/Errno.pm type=file +c:\tlperl\lib/Exporter.pm type=file +c:\tlperl\lib/Exporter/Heavy.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Base.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/Unix.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/VMS.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/Windows.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/aix.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/android.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/cygwin.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/darwin.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/dec_osf.pm type=file +c:\tlperl\lib/ExtUtils/CBuilder/Platform/os2.pm type=file +c:\tlperl\lib/ExtUtils/Command.pm type=file +c:\tlperl\lib/ExtUtils/Command/MM.pm type=file +c:\tlperl\lib/ExtUtils/Constant.pm type=file +c:\tlperl\lib/ExtUtils/Constant/Base.pm type=file +c:\tlperl\lib/ExtUtils/Constant/ProxySubs.pm type=file +c:\tlperl\lib/ExtUtils/Constant/Utils.pm type=file +c:\tlperl\lib/ExtUtils/Constant/XS.pm type=file +c:\tlperl\lib/ExtUtils/Embed.pm type=file +c:\tlperl\lib/ExtUtils/Install.pm type=file +c:\tlperl\lib/ExtUtils/Installed.pm type=file +c:\tlperl\lib/ExtUtils/Liblist.pm type=file +c:\tlperl\lib/ExtUtils/Liblist/Kid.pm type=file +c:\tlperl\lib/ExtUtils/MANIFEST.SKIP type=file +c:\tlperl\lib/ExtUtils/MM.pm type=file +c:\tlperl\lib/ExtUtils/MM_AIX.pm type=file +c:\tlperl\lib/ExtUtils/MM_Any.pm type=file +c:\tlperl\lib/ExtUtils/MM_BeOS.pm type=file +c:\tlperl\lib/ExtUtils/MM_Cygwin.pm type=file +c:\tlperl\lib/ExtUtils/MM_DOS.pm type=file +c:\tlperl\lib/ExtUtils/MM_Darwin.pm type=file +c:\tlperl\lib/ExtUtils/MM_MacOS.pm type=file +c:\tlperl\lib/ExtUtils/MM_NW5.pm type=file +c:\tlperl\lib/ExtUtils/MM_OS2.pm type=file +c:\tlperl\lib/ExtUtils/MM_QNX.pm type=file +c:\tlperl\lib/ExtUtils/MM_UWIN.pm type=file +c:\tlperl\lib/ExtUtils/MM_Unix.pm type=file +c:\tlperl\lib/ExtUtils/MM_VMS.pm type=file +c:\tlperl\lib/ExtUtils/MM_VOS.pm type=file +c:\tlperl\lib/ExtUtils/MM_Win32.pm type=file +c:\tlperl\lib/ExtUtils/MM_Win95.pm type=file +c:\tlperl\lib/ExtUtils/MY.pm type=file +c:\tlperl\lib/ExtUtils/MakeMaker.pm type=file +c:\tlperl\lib/ExtUtils/MakeMaker/Config.pm type=file +c:\tlperl\lib/ExtUtils/MakeMaker/FAQ.pod type=file +c:\tlperl\lib/ExtUtils/MakeMaker/Tutorial.pod type=file +c:\tlperl\lib/ExtUtils/Manifest.pm type=file +c:\tlperl\lib/ExtUtils/Miniperl.pm type=file +c:\tlperl\lib/ExtUtils/Mkbootstrap.pm type=file +c:\tlperl\lib/ExtUtils/Mksymlists.pm type=file +c:\tlperl\lib/ExtUtils/Packlist.pm type=file +c:\tlperl\lib/ExtUtils/ParseXS.pm type=file +c:\tlperl\lib/ExtUtils/ParseXS.pod type=file +c:\tlperl\lib/ExtUtils/ParseXS/Constants.pm type=file +c:\tlperl\lib/ExtUtils/ParseXS/CountLines.pm type=file +c:\tlperl\lib/ExtUtils/ParseXS/Eval.pm type=file +c:\tlperl\lib/ExtUtils/ParseXS/Utilities.pm type=file +c:\tlperl\lib/ExtUtils/Typemaps.pm type=file +c:\tlperl\lib/ExtUtils/Typemaps/Cmd.pm type=file +c:\tlperl\lib/ExtUtils/Typemaps/InputMap.pm type=file +c:\tlperl\lib/ExtUtils/Typemaps/OutputMap.pm type=file +c:\tlperl\lib/ExtUtils/Typemaps/Type.pm type=file +c:\tlperl\lib/ExtUtils/testlib.pm type=file +c:\tlperl\lib/ExtUtils/typemap type=file +c:\tlperl\lib/ExtUtils/xsubpp type=file +c:\tlperl\lib/Fatal.pm type=file +c:\tlperl\lib/Fcntl.pm type=file +c:\tlperl\lib/File/Basename.pm type=file +c:\tlperl\lib/File/Compare.pm type=file +c:\tlperl\lib/File/Copy.pm type=file +c:\tlperl\lib/File/DosGlob.pm type=file +c:\tlperl\lib/File/Fetch.pm type=file +c:\tlperl\lib/File/Find.pm type=file +c:\tlperl\lib/File/Glob.pm type=file +c:\tlperl\lib/File/GlobMapper.pm type=file +c:\tlperl\lib/File/Path.pm type=file +c:\tlperl\lib/File/Spec.pm type=file +c:\tlperl\lib/File/Spec/Cygwin.pm type=file +c:\tlperl\lib/File/Spec/Epoc.pm type=file +c:\tlperl\lib/File/Spec/Functions.pm type=file +c:\tlperl\lib/File/Spec/Mac.pm type=file +c:\tlperl\lib/File/Spec/OS2.pm type=file +c:\tlperl\lib/File/Spec/Unix.pm type=file +c:\tlperl\lib/File/Spec/VMS.pm type=file +c:\tlperl\lib/File/Spec/Win32.pm type=file +c:\tlperl\lib/File/Temp.pm type=file +c:\tlperl\lib/File/stat.pm type=file +c:\tlperl\lib/FileCache.pm type=file +c:\tlperl\lib/FileHandle.pm type=file +c:\tlperl\lib/Filter/Simple.pm type=file +c:\tlperl\lib/Filter/Util/Call.pm type=file +c:\tlperl\lib/FindBin.pm type=file +c:\tlperl\lib/Getopt/Long.pm type=file +c:\tlperl\lib/Getopt/Std.pm type=file +c:\tlperl\lib/HTTP/Tiny.pm type=file +c:\tlperl\lib/Hash/Util.pm type=file +c:\tlperl\lib/Hash/Util/FieldHash.pm type=file +c:\tlperl\lib/I18N/Collate.pm type=file +c:\tlperl\lib/I18N/LangTags.pm type=file +c:\tlperl\lib/I18N/LangTags/Detect.pm type=file +c:\tlperl\lib/I18N/LangTags/List.pm type=file +c:\tlperl\lib/IO.pm type=file +c:\tlperl\lib/IO/Compress/Adapter/Bzip2.pm type=file +c:\tlperl\lib/IO/Compress/Adapter/Deflate.pm type=file +c:\tlperl\lib/IO/Compress/Adapter/Identity.pm type=file +c:\tlperl\lib/IO/Compress/Base.pm type=file +c:\tlperl\lib/IO/Compress/Base/Common.pm type=file +c:\tlperl\lib/IO/Compress/Bzip2.pm type=file +c:\tlperl\lib/IO/Compress/Deflate.pm type=file +c:\tlperl\lib/IO/Compress/FAQ.pod type=file +c:\tlperl\lib/IO/Compress/Gzip.pm type=file +c:\tlperl\lib/IO/Compress/Gzip/Constants.pm type=file +c:\tlperl\lib/IO/Compress/RawDeflate.pm type=file +c:\tlperl\lib/IO/Compress/Zip.pm type=file +c:\tlperl\lib/IO/Compress/Zip/Constants.pm type=file +c:\tlperl\lib/IO/Compress/Zlib/Constants.pm type=file +c:\tlperl\lib/IO/Compress/Zlib/Extra.pm type=file +c:\tlperl\lib/IO/Dir.pm type=file +c:\tlperl\lib/IO/File.pm type=file +c:\tlperl\lib/IO/Handle.pm type=file +c:\tlperl\lib/IO/Pipe.pm type=file +c:\tlperl\lib/IO/Poll.pm type=file +c:\tlperl\lib/IO/Seekable.pm type=file +c:\tlperl\lib/IO/Select.pm type=file +c:\tlperl\lib/IO/Socket.pm type=file +c:\tlperl\lib/IO/Socket/INET.pm type=file +c:\tlperl\lib/IO/Socket/IP.pm type=file +c:\tlperl\lib/IO/Socket/UNIX.pm type=file +c:\tlperl\lib/IO/Uncompress/Adapter/Bunzip2.pm type=file +c:\tlperl\lib/IO/Uncompress/Adapter/Identity.pm type=file +c:\tlperl\lib/IO/Uncompress/Adapter/Inflate.pm type=file +c:\tlperl\lib/IO/Uncompress/AnyInflate.pm type=file +c:\tlperl\lib/IO/Uncompress/AnyUncompress.pm type=file +c:\tlperl\lib/IO/Uncompress/Base.pm type=file +c:\tlperl\lib/IO/Uncompress/Bunzip2.pm type=file +c:\tlperl\lib/IO/Uncompress/Gunzip.pm type=file +c:\tlperl\lib/IO/Uncompress/Inflate.pm type=file +c:\tlperl\lib/IO/Uncompress/RawInflate.pm type=file +c:\tlperl\lib/IO/Uncompress/Unzip.pm type=file +c:\tlperl\lib/IO/Zlib.pm type=file +c:\tlperl\lib/IPC/Cmd.pm type=file +c:\tlperl\lib/IPC/Open2.pm type=file +c:\tlperl\lib/IPC/Open3.pm type=file +c:\tlperl\lib/JSON/PP.pm type=file +c:\tlperl\lib/JSON/PP/Boolean.pm type=file +c:\tlperl\lib/List/Util.pm type=file +c:\tlperl\lib/List/Util/XS.pm type=file +c:\tlperl\lib/Locale/Codes.pm type=file +c:\tlperl\lib/Locale/Codes.pod type=file +c:\tlperl\lib/Locale/Codes/API.pod type=file +c:\tlperl\lib/Locale/Codes/Changes.pod type=file +c:\tlperl\lib/Locale/Codes/Constants.pm type=file +c:\tlperl\lib/Locale/Codes/Constants.pod type=file +c:\tlperl\lib/Locale/Codes/Country.pm type=file +c:\tlperl\lib/Locale/Codes/Country.pod type=file +c:\tlperl\lib/Locale/Codes/Country_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/Country_Retired.pm type=file +c:\tlperl\lib/Locale/Codes/Currency.pm type=file +c:\tlperl\lib/Locale/Codes/Currency.pod type=file +c:\tlperl\lib/Locale/Codes/Currency_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/Currency_Retired.pm type=file +c:\tlperl\lib/Locale/Codes/LangExt.pm type=file +c:\tlperl\lib/Locale/Codes/LangExt.pod type=file +c:\tlperl\lib/Locale/Codes/LangExt_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/LangExt_Retired.pm type=file +c:\tlperl\lib/Locale/Codes/LangFam.pm type=file +c:\tlperl\lib/Locale/Codes/LangFam.pod type=file +c:\tlperl\lib/Locale/Codes/LangFam_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/LangFam_Retired.pm type=file +c:\tlperl\lib/Locale/Codes/LangVar.pm type=file +c:\tlperl\lib/Locale/Codes/LangVar.pod type=file +c:\tlperl\lib/Locale/Codes/LangVar_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/LangVar_Retired.pm type=file +c:\tlperl\lib/Locale/Codes/Language.pm type=file +c:\tlperl\lib/Locale/Codes/Language.pod type=file +c:\tlperl\lib/Locale/Codes/Language_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/Language_Retired.pm type=file +c:\tlperl\lib/Locale/Codes/Script.pm type=file +c:\tlperl\lib/Locale/Codes/Script.pod type=file +c:\tlperl\lib/Locale/Codes/Script_Codes.pm type=file +c:\tlperl\lib/Locale/Codes/Script_Retired.pm type=file +c:\tlperl\lib/Locale/Country.pm type=file +c:\tlperl\lib/Locale/Country.pod type=file +c:\tlperl\lib/Locale/Currency.pm type=file +c:\tlperl\lib/Locale/Currency.pod type=file +c:\tlperl\lib/Locale/Language.pm type=file +c:\tlperl\lib/Locale/Language.pod type=file +c:\tlperl\lib/Locale/Maketext.pm type=file +c:\tlperl\lib/Locale/Maketext.pod type=file +c:\tlperl\lib/Locale/Maketext/Cookbook.pod type=file +c:\tlperl\lib/Locale/Maketext/Guts.pm type=file +c:\tlperl\lib/Locale/Maketext/GutsLoader.pm type=file +c:\tlperl\lib/Locale/Maketext/Simple.pm type=file +c:\tlperl\lib/Locale/Maketext/TPJ13.pod type=file +c:\tlperl\lib/Locale/Script.pm type=file +c:\tlperl\lib/Locale/Script.pod type=file +c:\tlperl\lib/MIME/Base64.pm type=file +c:\tlperl\lib/MIME/QuotedPrint.pm type=file +c:\tlperl\lib/Math/BigFloat.pm type=file +c:\tlperl\lib/Math/BigFloat/Trace.pm type=file +c:\tlperl\lib/Math/BigInt.pm type=file +c:\tlperl\lib/Math/BigInt/Calc.pm type=file +c:\tlperl\lib/Math/BigInt/CalcEmu.pm type=file +c:\tlperl\lib/Math/BigInt/FastCalc.pm type=file +c:\tlperl\lib/Math/BigInt/Trace.pm type=file +c:\tlperl\lib/Math/BigRat.pm type=file +c:\tlperl\lib/Math/Complex.pm type=file +c:\tlperl\lib/Math/Trig.pm type=file +c:\tlperl\lib/Memoize.pm type=file +c:\tlperl\lib/Memoize/AnyDBM_File.pm type=file +c:\tlperl\lib/Memoize/Expire.pm type=file +c:\tlperl\lib/Memoize/ExpireFile.pm type=file +c:\tlperl\lib/Memoize/ExpireTest.pm type=file +c:\tlperl\lib/Memoize/NDBM_File.pm type=file +c:\tlperl\lib/Memoize/SDBM_File.pm type=file +c:\tlperl\lib/Memoize/Storable.pm type=file +c:\tlperl\lib/Module/Build.pm type=file +c:\tlperl\lib/Module/Build/API.pod type=file +c:\tlperl\lib/Module/Build/Authoring.pod type=file +c:\tlperl\lib/Module/Build/Base.pm type=file +c:\tlperl\lib/Module/Build/Bundling.pod type=file +c:\tlperl\lib/Module/Build/Compat.pm type=file +c:\tlperl\lib/Module/Build/Config.pm type=file +c:\tlperl\lib/Module/Build/ConfigData.pm type=file +c:\tlperl\lib/Module/Build/Cookbook.pm type=file +c:\tlperl\lib/Module/Build/Dumper.pm type=file +c:\tlperl\lib/Module/Build/ModuleInfo.pm type=file +c:\tlperl\lib/Module/Build/Notes.pm type=file +c:\tlperl\lib/Module/Build/PPMMaker.pm type=file +c:\tlperl\lib/Module/Build/Platform/Default.pm type=file +c:\tlperl\lib/Module/Build/Platform/MacOS.pm type=file +c:\tlperl\lib/Module/Build/Platform/Unix.pm type=file +c:\tlperl\lib/Module/Build/Platform/VMS.pm type=file +c:\tlperl\lib/Module/Build/Platform/VOS.pm type=file +c:\tlperl\lib/Module/Build/Platform/Windows.pm type=file +c:\tlperl\lib/Module/Build/Platform/aix.pm type=file +c:\tlperl\lib/Module/Build/Platform/cygwin.pm type=file +c:\tlperl\lib/Module/Build/Platform/darwin.pm type=file +c:\tlperl\lib/Module/Build/Platform/os2.pm type=file +c:\tlperl\lib/Module/Build/PodParser.pm type=file +c:\tlperl\lib/Module/Build/Version.pm type=file +c:\tlperl\lib/Module/Build/YAML.pm type=file +c:\tlperl\lib/Module/CoreList.pm type=file +c:\tlperl\lib/Module/CoreList.pod type=file +c:\tlperl\lib/Module/CoreList/TieHashDelta.pm type=file +c:\tlperl\lib/Module/CoreList/Utils.pm type=file +c:\tlperl\lib/Module/Load.pm type=file +c:\tlperl\lib/Module/Load/Conditional.pm type=file +c:\tlperl\lib/Module/Loaded.pm type=file +c:\tlperl\lib/Module/Metadata.pm type=file +c:\tlperl\lib/NEXT.pm type=file +c:\tlperl\lib/Net/Cmd.pm type=file +c:\tlperl\lib/Net/Config.pm type=file +c:\tlperl\lib/Net/Domain.pm type=file +c:\tlperl\lib/Net/FTP.pm type=file +c:\tlperl\lib/Net/FTP/A.pm type=file +c:\tlperl\lib/Net/FTP/E.pm type=file +c:\tlperl\lib/Net/FTP/I.pm type=file +c:\tlperl\lib/Net/FTP/L.pm type=file +c:\tlperl\lib/Net/FTP/dataconn.pm type=file +c:\tlperl\lib/Net/NNTP.pm type=file +c:\tlperl\lib/Net/Netrc.pm type=file +c:\tlperl\lib/Net/POP3.pm type=file +c:\tlperl\lib/Net/Ping.pm type=file +c:\tlperl\lib/Net/SMTP.pm type=file +c:\tlperl\lib/Net/Time.pm type=file +c:\tlperl\lib/Net/hostent.pm type=file +c:\tlperl\lib/Net/libnetFAQ.pod type=file +c:\tlperl\lib/Net/netent.pm type=file +c:\tlperl\lib/Net/protoent.pm type=file +c:\tlperl\lib/Net/servent.pm type=file +c:\tlperl\lib/O.pm type=file +c:\tlperl\lib/Opcode.pm type=file +c:\tlperl\lib/POSIX.pm type=file +c:\tlperl\lib/POSIX.pod type=file +c:\tlperl\lib/Package/Constants.pm type=file +c:\tlperl\lib/Params/Check.pm type=file +c:\tlperl\lib/Parse/CPAN/Meta.pm type=file +c:\tlperl\lib/Perl/OSType.pm type=file +c:\tlperl\lib/PerlIO.pm type=file +c:\tlperl\lib/PerlIO/encoding.pm type=file +c:\tlperl\lib/PerlIO/mmap.pm type=file +c:\tlperl\lib/PerlIO/scalar.pm type=file +c:\tlperl\lib/PerlIO/via.pm type=file +c:\tlperl\lib/PerlIO/via/QuotedPrint.pm type=file +c:\tlperl\lib/Pod/Checker.pm type=file +c:\tlperl\lib/Pod/Escapes.pm type=file +c:\tlperl\lib/Pod/Find.pm type=file +c:\tlperl\lib/Pod/Functions.pm type=file +c:\tlperl\lib/Pod/Html.pm type=file +c:\tlperl\lib/Pod/InputObjects.pm type=file +c:\tlperl\lib/Pod/Man.pm type=file +c:\tlperl\lib/Pod/ParseLink.pm type=file +c:\tlperl\lib/Pod/ParseUtils.pm type=file +c:\tlperl\lib/Pod/Parser.pm type=file +c:\tlperl\lib/Pod/Perldoc.pm type=file +c:\tlperl\lib/Pod/Perldoc/BaseTo.pm type=file +c:\tlperl\lib/Pod/Perldoc/GetOptsOO.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToANSI.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToChecker.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToMan.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToNroff.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToPod.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToRtf.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToTerm.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToText.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToTk.pm type=file +c:\tlperl\lib/Pod/Perldoc/ToXml.pm type=file +c:\tlperl\lib/Pod/PlainText.pm type=file +c:\tlperl\lib/Pod/Select.pm type=file +c:\tlperl\lib/Pod/Simple.pm type=file +c:\tlperl\lib/Pod/Simple.pod type=file +c:\tlperl\lib/Pod/Simple/BlackBox.pm type=file +c:\tlperl\lib/Pod/Simple/Checker.pm type=file +c:\tlperl\lib/Pod/Simple/Debug.pm type=file +c:\tlperl\lib/Pod/Simple/DumpAsText.pm type=file +c:\tlperl\lib/Pod/Simple/DumpAsXML.pm type=file +c:\tlperl\lib/Pod/Simple/HTML.pm type=file +c:\tlperl\lib/Pod/Simple/HTMLBatch.pm type=file +c:\tlperl\lib/Pod/Simple/HTMLLegacy.pm type=file +c:\tlperl\lib/Pod/Simple/LinkSection.pm type=file +c:\tlperl\lib/Pod/Simple/Methody.pm type=file +c:\tlperl\lib/Pod/Simple/Progress.pm type=file +c:\tlperl\lib/Pod/Simple/PullParser.pm type=file +c:\tlperl\lib/Pod/Simple/PullParserEndToken.pm type=file +c:\tlperl\lib/Pod/Simple/PullParserStartToken.pm type=file +c:\tlperl\lib/Pod/Simple/PullParserTextToken.pm type=file +c:\tlperl\lib/Pod/Simple/PullParserToken.pm type=file +c:\tlperl\lib/Pod/Simple/RTF.pm type=file +c:\tlperl\lib/Pod/Simple/Search.pm type=file +c:\tlperl\lib/Pod/Simple/SimpleTree.pm type=file +c:\tlperl\lib/Pod/Simple/Subclassing.pod type=file +c:\tlperl\lib/Pod/Simple/Text.pm type=file +c:\tlperl\lib/Pod/Simple/TextContent.pm type=file +c:\tlperl\lib/Pod/Simple/TiedOutFH.pm type=file +c:\tlperl\lib/Pod/Simple/Transcode.pm type=file +c:\tlperl\lib/Pod/Simple/TranscodeDumb.pm type=file +c:\tlperl\lib/Pod/Simple/TranscodeSmart.pm type=file +c:\tlperl\lib/Pod/Simple/XHTML.pm type=file +c:\tlperl\lib/Pod/Simple/XMLOutStream.pm type=file +c:\tlperl\lib/Pod/Text.pm type=file +c:\tlperl\lib/Pod/Text/Color.pm type=file +c:\tlperl\lib/Pod/Text/Overstrike.pm type=file +c:\tlperl\lib/Pod/Text/Termcap.pm type=file +c:\tlperl\lib/Pod/Usage.pm type=file +c:\tlperl\lib/SDBM_File.pm type=file +c:\tlperl\lib/Safe.pm type=file +c:\tlperl\lib/Scalar/Util.pm type=file +c:\tlperl\lib/Search/Dict.pm type=file +c:\tlperl\lib/SelectSaver.pm type=file +c:\tlperl\lib/SelfLoader.pm type=file +c:\tlperl\lib/Socket.pm type=file +c:\tlperl\lib/Storable.pm type=file +c:\tlperl\lib/Symbol.pm type=file +c:\tlperl\lib/Sys/Hostname.pm type=file +c:\tlperl\lib/TAP/Base.pm type=file +c:\tlperl\lib/TAP/Formatter/Base.pm type=file +c:\tlperl\lib/TAP/Formatter/Color.pm type=file +c:\tlperl\lib/TAP/Formatter/Console.pm type=file +c:\tlperl\lib/TAP/Formatter/Console/ParallelSession.pm type=file +c:\tlperl\lib/TAP/Formatter/Console/Session.pm type=file +c:\tlperl\lib/TAP/Formatter/File.pm type=file +c:\tlperl\lib/TAP/Formatter/File/Session.pm type=file +c:\tlperl\lib/TAP/Formatter/Session.pm type=file +c:\tlperl\lib/TAP/Harness.pm type=file +c:\tlperl\lib/TAP/Harness/Beyond.pod type=file +c:\tlperl\lib/TAP/Harness/Env.pm type=file +c:\tlperl\lib/TAP/Object.pm type=file +c:\tlperl\lib/TAP/Parser.pm type=file +c:\tlperl\lib/TAP/Parser/Aggregator.pm type=file +c:\tlperl\lib/TAP/Parser/Grammar.pm type=file +c:\tlperl\lib/TAP/Parser/Iterator.pm type=file +c:\tlperl\lib/TAP/Parser/Iterator/Array.pm type=file +c:\tlperl\lib/TAP/Parser/Iterator/Process.pm type=file +c:\tlperl\lib/TAP/Parser/Iterator/Stream.pm type=file +c:\tlperl\lib/TAP/Parser/IteratorFactory.pm type=file +c:\tlperl\lib/TAP/Parser/Multiplexer.pm type=file +c:\tlperl\lib/TAP/Parser/Result.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Bailout.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Comment.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Plan.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Pragma.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Test.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Unknown.pm type=file +c:\tlperl\lib/TAP/Parser/Result/Version.pm type=file +c:\tlperl\lib/TAP/Parser/Result/YAML.pm type=file +c:\tlperl\lib/TAP/Parser/ResultFactory.pm type=file +c:\tlperl\lib/TAP/Parser/Scheduler.pm type=file +c:\tlperl\lib/TAP/Parser/Scheduler/Job.pm type=file +c:\tlperl\lib/TAP/Parser/Scheduler/Spinner.pm type=file +c:\tlperl\lib/TAP/Parser/Source.pm type=file +c:\tlperl\lib/TAP/Parser/SourceHandler.pm type=file +c:\tlperl\lib/TAP/Parser/SourceHandler/Executable.pm type=file +c:\tlperl\lib/TAP/Parser/SourceHandler/File.pm type=file +c:\tlperl\lib/TAP/Parser/SourceHandler/Handle.pm type=file +c:\tlperl\lib/TAP/Parser/SourceHandler/Perl.pm type=file +c:\tlperl\lib/TAP/Parser/SourceHandler/RawTAP.pm type=file +c:\tlperl\lib/TAP/Parser/YAMLish/Reader.pm type=file +c:\tlperl\lib/TAP/Parser/YAMLish/Writer.pm type=file +c:\tlperl\lib/Term/ANSIColor.pm type=file +c:\tlperl\lib/Term/Cap.pm type=file +c:\tlperl\lib/Term/Complete.pm type=file +c:\tlperl\lib/Term/ReadLine.pm type=file +c:\tlperl\lib/Test.pm type=file +c:\tlperl\lib/Test/Builder.pm type=file +c:\tlperl\lib/Test/Builder/Module.pm type=file +c:\tlperl\lib/Test/Builder/Tester.pm type=file +c:\tlperl\lib/Test/Builder/Tester/Color.pm type=file +c:\tlperl\lib/Test/Harness.pm type=file +c:\tlperl\lib/Test/More.pm type=file +c:\tlperl\lib/Test/Simple.pm type=file +c:\tlperl\lib/Test/Tutorial.pod type=file +c:\tlperl\lib/Text/Abbrev.pm type=file +c:\tlperl\lib/Text/Balanced.pm type=file +c:\tlperl\lib/Text/ParseWords.pm type=file +c:\tlperl\lib/Text/Tabs.pm type=file +c:\tlperl\lib/Text/Wrap.pm type=file +c:\tlperl\lib/Thread.pm type=file +c:\tlperl\lib/Thread/Queue.pm type=file +c:\tlperl\lib/Thread/Semaphore.pm type=file +c:\tlperl\lib/Tie/Array.pm type=file +c:\tlperl\lib/Tie/File.pm type=file +c:\tlperl\lib/Tie/Handle.pm type=file +c:\tlperl\lib/Tie/Hash.pm type=file +c:\tlperl\lib/Tie/Hash/NamedCapture.pm type=file +c:\tlperl\lib/Tie/Memoize.pm type=file +c:\tlperl\lib/Tie/RefHash.pm type=file +c:\tlperl\lib/Tie/Scalar.pm type=file +c:\tlperl\lib/Tie/StdHandle.pm type=file +c:\tlperl\lib/Tie/SubstrHash.pm type=file +c:\tlperl\lib/Time/HiRes.pm type=file +c:\tlperl\lib/Time/Local.pm type=file +c:\tlperl\lib/Time/Piece.pm type=file +c:\tlperl\lib/Time/Seconds.pm type=file +c:\tlperl\lib/Time/gmtime.pm type=file +c:\tlperl\lib/Time/localtime.pm type=file +c:\tlperl\lib/Time/tm.pm type=file +c:\tlperl\lib/UNIVERSAL.pm type=file +c:\tlperl\lib/Unicode/Collate.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/Big5.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/GB2312.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/JISX0208.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/Korean.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/Pinyin.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/Stroke.pm type=file +c:\tlperl\lib/Unicode/Collate/CJK/Zhuyin.pm type=file +c:\tlperl\lib/Unicode/Collate/Locale.pm type=file +c:\tlperl\lib/Unicode/Collate/Locale/af.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ar.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/as.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/az.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/be.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/bg.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/bn.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ca.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/cs.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/cy.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/da.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/de_phone.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ee.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/eo.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/es.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/es_trad.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/et.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/fa.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/fi.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/fi_phone.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/fil.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/fo.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/fr.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/gu.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ha.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/haw.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/hi.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/hr.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/hu.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/hy.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ig.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/is.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ja.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/kk.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/kl.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/kn.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ko.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/kok.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ln.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/lt.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/lv.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/mk.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ml.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/mr.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/mt.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/nb.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/nn.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/nso.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/om.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/or.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/pa.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/pl.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ro.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ru.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sa.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/se.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/si.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/si_dict.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sk.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sl.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sq.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sr.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sv.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/sv_refo.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ta.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/te.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/th.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/tn.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/to.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/tr.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/uk.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/ur.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/vi.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/wae.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/wo.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/yo.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/zh.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/zh_big5.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/zh_gb.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/zh_pin.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/zh_strk.pl type=file +c:\tlperl\lib/Unicode/Collate/Locale/zh_zhu.pl type=file +c:\tlperl\lib/Unicode/Collate/allkeys.txt type=file +c:\tlperl\lib/Unicode/Collate/keys.txt type=file +c:\tlperl\lib/Unicode/Normalize.pm type=file +c:\tlperl\lib/Unicode/UCD.pm type=file +c:\tlperl\lib/User/grent.pm type=file +c:\tlperl\lib/User/pwent.pm type=file +c:\tlperl\lib/Win32.pm type=file +c:\tlperl\lib/Win32API/File.pm type=file +c:\tlperl\lib/Win32API/File/cFile.pc type=file +c:\tlperl\lib/Win32CORE.pm type=file +c:\tlperl\lib/XSLoader.pm type=file +c:\tlperl\lib/_charnames.pm type=file +c:\tlperl\lib/arybase.pm type=file +c:\tlperl\lib/attributes.pm type=file +c:\tlperl\lib/auto/B/B.dll type=file +c:\tlperl\lib/auto/Compress/Raw/Bzip2/Bzip2.dll type=file +c:\tlperl\lib/auto/Compress/Raw/Zlib/Zlib.dll type=file +c:\tlperl\lib/auto/Cwd/Cwd.dll type=file +c:\tlperl\lib/auto/Data/Dumper/Dumper.dll type=file +c:\tlperl\lib/auto/Devel/PPPort/PPPort.dll type=file +c:\tlperl\lib/auto/Devel/Peek/Peek.dll type=file +c:\tlperl\lib/auto/Digest/MD5/MD5.dll type=file +c:\tlperl\lib/auto/Digest/SHA/SHA.dll type=file +c:\tlperl\lib/auto/Encode/Byte/Byte.dll type=file +c:\tlperl\lib/auto/Encode/CN/CN.dll type=file +c:\tlperl\lib/auto/Encode/EBCDIC/EBCDIC.dll type=file +c:\tlperl\lib/auto/Encode/Encode.dll type=file +c:\tlperl\lib/auto/Encode/JP/JP.dll type=file +c:\tlperl\lib/auto/Encode/KR/KR.dll type=file +c:\tlperl\lib/auto/Encode/Symbol/Symbol.dll type=file +c:\tlperl\lib/auto/Encode/TW/TW.dll type=file +c:\tlperl\lib/auto/Encode/Unicode/Unicode.dll type=file +c:\tlperl\lib/auto/Fcntl/Fcntl.dll type=file +c:\tlperl\lib/auto/File/DosGlob/DosGlob.dll type=file +c:\tlperl\lib/auto/File/Glob/Glob.dll type=file +c:\tlperl\lib/auto/Filter/Util/Call/Call.dll type=file +c:\tlperl\lib/auto/Hash/Util/FieldHash/FieldHash.dll type=file +c:\tlperl\lib/auto/Hash/Util/Util.dll type=file +c:\tlperl\lib/auto/IO/IO.dll type=file +c:\tlperl\lib/auto/List/Util/Util.dll type=file +c:\tlperl\lib/auto/MIME/Base64/Base64.dll type=file +c:\tlperl\lib/auto/Math/BigInt/FastCalc/FastCalc.dll type=file +c:\tlperl\lib/auto/Opcode/Opcode.dll type=file +c:\tlperl\lib/auto/POSIX/POSIX.dll type=file +c:\tlperl\lib/auto/PerlIO/encoding/encoding.dll type=file +c:\tlperl\lib/auto/PerlIO/mmap/mmap.dll type=file +c:\tlperl\lib/auto/PerlIO/scalar/scalar.dll type=file +c:\tlperl\lib/auto/PerlIO/via/via.dll type=file +c:\tlperl\lib/auto/SDBM_File/SDBM_File.dll type=file +c:\tlperl\lib/auto/Socket/Socket.dll type=file +c:\tlperl\lib/auto/Storable/Storable.dll type=file +c:\tlperl\lib/auto/Sys/Hostname/Hostname.dll type=file +c:\tlperl\lib/auto/Tie/Hash/NamedCapture/NamedCapture.dll type=file +c:\tlperl\lib/auto/Time/HiRes/HiRes.dll type=file +c:\tlperl\lib/auto/Time/Piece/Piece.dll type=file +c:\tlperl\lib/auto/Unicode/Collate/Collate.dll type=file +c:\tlperl\lib/auto/Unicode/Normalize/Normalize.dll type=file +c:\tlperl\lib/auto/Win32/Win32.dll type=file +c:\tlperl\lib/auto/Win32API/File/File.dll type=file +c:\tlperl\lib/auto/Win32CORE/extralibs.ld type=file +c:\tlperl\lib/auto/arybase/arybase.dll type=file +c:\tlperl\lib/auto/attributes/attributes.dll type=file +c:\tlperl\lib/auto/mro/mro.dll type=file +c:\tlperl\lib/auto/re/re.dll type=file +c:\tlperl\lib/auto/sdbm/extralibs.ld type=file +c:\tlperl\lib/auto/threads/shared/shared.dll type=file +c:\tlperl\lib/auto/threads/threads.dll type=file +c:\tlperl\lib/autodie.pm type=file +c:\tlperl\lib/autodie/exception.pm type=file +c:\tlperl\lib/autodie/exception/system.pm type=file +c:\tlperl\lib/autodie/hints.pm type=file +c:\tlperl\lib/autodie/skip.pm type=file +c:\tlperl\lib/autouse.pm type=file +c:\tlperl\lib/base.pm type=file +c:\tlperl\lib/bigint.pm type=file +c:\tlperl\lib/bignum.pm type=file +c:\tlperl\lib/bigrat.pm type=file +c:\tlperl\lib/blib.pm type=file +c:\tlperl\lib/bytes.pm type=file +c:\tlperl\lib/bytes_heavy.pl type=file +c:\tlperl\lib/charnames.pm type=file +c:\tlperl\lib/constant.pm type=file +c:\tlperl\lib/deprecate.pm type=file +c:\tlperl\lib/diagnostics.pm type=file +c:\tlperl\lib/dumpvar.pl type=file +c:\tlperl\lib/encoding.pm type=file +c:\tlperl\lib/encoding/warnings.pm type=file +c:\tlperl\lib/experimental.pm type=file +c:\tlperl\lib/feature.pm type=file +c:\tlperl\lib/fields.pm type=file +c:\tlperl\lib/filetest.pm type=file +c:\tlperl\lib/if.pm type=file +c:\tlperl\lib/inc/latest.pm type=file +c:\tlperl\lib/inc/latest/private.pm type=file +c:\tlperl\lib/integer.pm type=file +c:\tlperl\lib/less.pm type=file +c:\tlperl\lib/lib.pm type=file +c:\tlperl\lib/locale.pm type=file +c:\tlperl\lib/mro.pm type=file +c:\tlperl\lib/open.pm type=file +c:\tlperl\lib/ops.pm type=file +c:\tlperl\lib/overload.pm type=file +c:\tlperl\lib/overload/numbers.pm type=file +c:\tlperl\lib/overloading.pm type=file +c:\tlperl\lib/parent.pm type=file +c:\tlperl\lib/perl5db.pl type=file +c:\tlperl\lib/perlfaq.pm type=file +c:\tlperl\lib/pods/a2p.pod type=file +c:\tlperl\lib/pods/perl.pod type=file +c:\tlperl\lib/pods/perl5004delta.pod type=file +c:\tlperl\lib/pods/perl5005delta.pod type=file +c:\tlperl\lib/pods/perl5100delta.pod type=file +c:\tlperl\lib/pods/perl5101delta.pod type=file +c:\tlperl\lib/pods/perl5120delta.pod type=file +c:\tlperl\lib/pods/perl5121delta.pod type=file +c:\tlperl\lib/pods/perl5122delta.pod type=file +c:\tlperl\lib/pods/perl5123delta.pod type=file +c:\tlperl\lib/pods/perl5124delta.pod type=file +c:\tlperl\lib/pods/perl5125delta.pod type=file +c:\tlperl\lib/pods/perl5140delta.pod type=file +c:\tlperl\lib/pods/perl5141delta.pod type=file +c:\tlperl\lib/pods/perl5142delta.pod type=file +c:\tlperl\lib/pods/perl5143delta.pod type=file +c:\tlperl\lib/pods/perl5144delta.pod type=file +c:\tlperl\lib/pods/perl5160delta.pod type=file +c:\tlperl\lib/pods/perl5161delta.pod type=file +c:\tlperl\lib/pods/perl5162delta.pod type=file +c:\tlperl\lib/pods/perl5163delta.pod type=file +c:\tlperl\lib/pods/perl5180delta.pod type=file +c:\tlperl\lib/pods/perl5181delta.pod type=file +c:\tlperl\lib/pods/perl5182delta.pod type=file +c:\tlperl\lib/pods/perl5184delta.pod type=file +c:\tlperl\lib/pods/perl5200delta.pod type=file +c:\tlperl\lib/pods/perl5201delta.pod type=file +c:\tlperl\lib/pods/perl5202delta.pod type=file +c:\tlperl\lib/pods/perl561delta.pod type=file +c:\tlperl\lib/pods/perl56delta.pod type=file +c:\tlperl\lib/pods/perl581delta.pod type=file +c:\tlperl\lib/pods/perl582delta.pod type=file +c:\tlperl\lib/pods/perl583delta.pod type=file +c:\tlperl\lib/pods/perl584delta.pod type=file +c:\tlperl\lib/pods/perl585delta.pod type=file +c:\tlperl\lib/pods/perl586delta.pod type=file +c:\tlperl\lib/pods/perl587delta.pod type=file +c:\tlperl\lib/pods/perl588delta.pod type=file +c:\tlperl\lib/pods/perl589delta.pod type=file +c:\tlperl\lib/pods/perl58delta.pod type=file +c:\tlperl\lib/pods/perlaix.pod type=file +c:\tlperl\lib/pods/perlamiga.pod type=file +c:\tlperl\lib/pods/perlandroid.pod type=file +c:\tlperl\lib/pods/perlapi.pod type=file +c:\tlperl\lib/pods/perlapio.pod type=file +c:\tlperl\lib/pods/perlartistic.pod type=file +c:\tlperl\lib/pods/perlbook.pod type=file +c:\tlperl\lib/pods/perlboot.pod type=file +c:\tlperl\lib/pods/perlbot.pod type=file +c:\tlperl\lib/pods/perlbs2000.pod type=file +c:\tlperl\lib/pods/perlcall.pod type=file +c:\tlperl\lib/pods/perlce.pod type=file +c:\tlperl\lib/pods/perlcheat.pod type=file +c:\tlperl\lib/pods/perlclib.pod type=file +c:\tlperl\lib/pods/perlcn.pod type=file +c:\tlperl\lib/pods/perlcommunity.pod type=file +c:\tlperl\lib/pods/perlcygwin.pod type=file +c:\tlperl\lib/pods/perldata.pod type=file +c:\tlperl\lib/pods/perldbmfilter.pod type=file +c:\tlperl\lib/pods/perldebguts.pod type=file +c:\tlperl\lib/pods/perldebtut.pod type=file +c:\tlperl\lib/pods/perldebug.pod type=file +c:\tlperl\lib/pods/perldelta.pod type=file +c:\tlperl\lib/pods/perldiag.pod type=file +c:\tlperl\lib/pods/perldoc.pod type=file +c:\tlperl\lib/pods/perldos.pod type=file +c:\tlperl\lib/pods/perldsc.pod type=file +c:\tlperl\lib/pods/perldtrace.pod type=file +c:\tlperl\lib/pods/perlebcdic.pod type=file +c:\tlperl\lib/pods/perlembed.pod type=file +c:\tlperl\lib/pods/perlexperiment.pod type=file +c:\tlperl\lib/pods/perlfaq.pod type=file +c:\tlperl\lib/pods/perlfaq1.pod type=file +c:\tlperl\lib/pods/perlfaq2.pod type=file +c:\tlperl\lib/pods/perlfaq3.pod type=file +c:\tlperl\lib/pods/perlfaq4.pod type=file +c:\tlperl\lib/pods/perlfaq5.pod type=file +c:\tlperl\lib/pods/perlfaq6.pod type=file +c:\tlperl\lib/pods/perlfaq7.pod type=file +c:\tlperl\lib/pods/perlfaq8.pod type=file +c:\tlperl\lib/pods/perlfaq9.pod type=file +c:\tlperl\lib/pods/perlfilter.pod type=file +c:\tlperl\lib/pods/perlfork.pod type=file +c:\tlperl\lib/pods/perlform.pod type=file +c:\tlperl\lib/pods/perlfreebsd.pod type=file +c:\tlperl\lib/pods/perlfunc.pod type=file +c:\tlperl\lib/pods/perlgit.pod type=file +c:\tlperl\lib/pods/perlglossary.pod type=file +c:\tlperl\lib/pods/perlgpl.pod type=file +c:\tlperl\lib/pods/perlguts.pod type=file +c:\tlperl\lib/pods/perlhack.pod type=file +c:\tlperl\lib/pods/perlhacktips.pod type=file +c:\tlperl\lib/pods/perlhacktut.pod type=file +c:\tlperl\lib/pods/perlhaiku.pod type=file +c:\tlperl\lib/pods/perlhist.pod type=file +c:\tlperl\lib/pods/perlhpux.pod type=file +c:\tlperl\lib/pods/perlhurd.pod type=file +c:\tlperl\lib/pods/perlintern.pod type=file +c:\tlperl\lib/pods/perlinterp.pod type=file +c:\tlperl\lib/pods/perlintro.pod type=file +c:\tlperl\lib/pods/perliol.pod type=file +c:\tlperl\lib/pods/perlipc.pod type=file +c:\tlperl\lib/pods/perlirix.pod type=file +c:\tlperl\lib/pods/perljp.pod type=file +c:\tlperl\lib/pods/perlko.pod type=file +c:\tlperl\lib/pods/perllexwarn.pod type=file +c:\tlperl\lib/pods/perllinux.pod type=file +c:\tlperl\lib/pods/perllocale.pod type=file +c:\tlperl\lib/pods/perllol.pod type=file +c:\tlperl\lib/pods/perlmacos.pod type=file +c:\tlperl\lib/pods/perlmacosx.pod type=file +c:\tlperl\lib/pods/perlmod.pod type=file +c:\tlperl\lib/pods/perlmodinstall.pod type=file +c:\tlperl\lib/pods/perlmodlib.pod type=file +c:\tlperl\lib/pods/perlmodstyle.pod type=file +c:\tlperl\lib/pods/perlmroapi.pod type=file +c:\tlperl\lib/pods/perlnetware.pod type=file +c:\tlperl\lib/pods/perlnewmod.pod type=file +c:\tlperl\lib/pods/perlnumber.pod type=file +c:\tlperl\lib/pods/perlobj.pod type=file +c:\tlperl\lib/pods/perlootut.pod type=file +c:\tlperl\lib/pods/perlop.pod type=file +c:\tlperl\lib/pods/perlopenbsd.pod type=file +c:\tlperl\lib/pods/perlopentut.pod type=file +c:\tlperl\lib/pods/perlos2.pod type=file +c:\tlperl\lib/pods/perlos390.pod type=file +c:\tlperl\lib/pods/perlos400.pod type=file +c:\tlperl\lib/pods/perlpacktut.pod type=file +c:\tlperl\lib/pods/perlperf.pod type=file +c:\tlperl\lib/pods/perlplan9.pod type=file +c:\tlperl\lib/pods/perlpod.pod type=file +c:\tlperl\lib/pods/perlpodspec.pod type=file +c:\tlperl\lib/pods/perlpodstyle.pod type=file +c:\tlperl\lib/pods/perlpolicy.pod type=file +c:\tlperl\lib/pods/perlport.pod type=file +c:\tlperl\lib/pods/perlpragma.pod type=file +c:\tlperl\lib/pods/perlqnx.pod type=file +c:\tlperl\lib/pods/perlre.pod type=file +c:\tlperl\lib/pods/perlreapi.pod type=file +c:\tlperl\lib/pods/perlrebackslash.pod type=file +c:\tlperl\lib/pods/perlrecharclass.pod type=file +c:\tlperl\lib/pods/perlref.pod type=file +c:\tlperl\lib/pods/perlreftut.pod type=file +c:\tlperl\lib/pods/perlreguts.pod type=file +c:\tlperl\lib/pods/perlrepository.pod type=file +c:\tlperl\lib/pods/perlrequick.pod type=file +c:\tlperl\lib/pods/perlreref.pod type=file +c:\tlperl\lib/pods/perlretut.pod type=file +c:\tlperl\lib/pods/perlriscos.pod type=file +c:\tlperl\lib/pods/perlrun.pod type=file +c:\tlperl\lib/pods/perlsec.pod type=file +c:\tlperl\lib/pods/perlsolaris.pod type=file +c:\tlperl\lib/pods/perlsource.pod type=file +c:\tlperl\lib/pods/perlstyle.pod type=file +c:\tlperl\lib/pods/perlsub.pod type=file +c:\tlperl\lib/pods/perlsymbian.pod type=file +c:\tlperl\lib/pods/perlsyn.pod type=file +c:\tlperl\lib/pods/perlsynology.pod type=file +c:\tlperl\lib/pods/perlthrtut.pod type=file +c:\tlperl\lib/pods/perltie.pod type=file +c:\tlperl\lib/pods/perltoc.pod type=file +c:\tlperl\lib/pods/perltodo.pod type=file +c:\tlperl\lib/pods/perltooc.pod type=file +c:\tlperl\lib/pods/perltoot.pod type=file +c:\tlperl\lib/pods/perltrap.pod type=file +c:\tlperl\lib/pods/perltru64.pod type=file +c:\tlperl\lib/pods/perltw.pod type=file +c:\tlperl\lib/pods/perlunicode.pod type=file +c:\tlperl\lib/pods/perlunicook.pod type=file +c:\tlperl\lib/pods/perlunifaq.pod type=file +c:\tlperl\lib/pods/perluniintro.pod type=file +c:\tlperl\lib/pods/perluniprops.pod type=file +c:\tlperl\lib/pods/perlunitut.pod type=file +c:\tlperl\lib/pods/perlutil.pod type=file +c:\tlperl\lib/pods/perlvar.pod type=file +c:\tlperl\lib/pods/perlvms.pod type=file +c:\tlperl\lib/pods/perlvos.pod type=file +c:\tlperl\lib/pods/perlwin32.pod type=file +c:\tlperl\lib/pods/perlxs.pod type=file +c:\tlperl\lib/pods/perlxstut.pod type=file +c:\tlperl\lib/pods/perlxstypemap.pod type=file +c:\tlperl\lib/re.pm type=file +c:\tlperl\lib/sigtrap.pm type=file +c:\tlperl\lib/sort.pm type=file +c:\tlperl\lib/strict.pm type=file +c:\tlperl\lib/subs.pm type=file +c:\tlperl\lib/threads.pm type=file +c:\tlperl\lib/threads/shared.pm type=file +c:\tlperl\lib/unicore/Blocks.txt type=file +c:\tlperl\lib/unicore/CombiningClass.pl type=file +c:\tlperl\lib/unicore/Decomposition.pl type=file +c:\tlperl\lib/unicore/Heavy.pl type=file +c:\tlperl\lib/unicore/Name.pl type=file +c:\tlperl\lib/unicore/Name.pm type=file +c:\tlperl\lib/unicore/NamedSequences.txt type=file +c:\tlperl\lib/unicore/SpecialCasing.txt type=file +c:\tlperl\lib/unicore/To/Age.pl type=file +c:\tlperl\lib/unicore/To/Bc.pl type=file +c:\tlperl\lib/unicore/To/Bmg.pl type=file +c:\tlperl\lib/unicore/To/Bpb.pl type=file +c:\tlperl\lib/unicore/To/Bpt.pl type=file +c:\tlperl\lib/unicore/To/Cf.pl type=file +c:\tlperl\lib/unicore/To/Digit.pl type=file +c:\tlperl\lib/unicore/To/Ea.pl type=file +c:\tlperl\lib/unicore/To/Fold.pl type=file +c:\tlperl\lib/unicore/To/GCB.pl type=file +c:\tlperl\lib/unicore/To/Gc.pl type=file +c:\tlperl\lib/unicore/To/Hst.pl type=file +c:\tlperl\lib/unicore/To/Isc.pl type=file +c:\tlperl\lib/unicore/To/Jg.pl type=file +c:\tlperl\lib/unicore/To/Jt.pl type=file +c:\tlperl\lib/unicore/To/Lb.pl type=file +c:\tlperl\lib/unicore/To/Lc.pl type=file +c:\tlperl\lib/unicore/To/Lower.pl type=file +c:\tlperl\lib/unicore/To/NFCQC.pl type=file +c:\tlperl\lib/unicore/To/NFDQC.pl type=file +c:\tlperl\lib/unicore/To/NFKCCF.pl type=file +c:\tlperl\lib/unicore/To/NFKCQC.pl type=file +c:\tlperl\lib/unicore/To/NFKDQC.pl type=file +c:\tlperl\lib/unicore/To/Na1.pl type=file +c:\tlperl\lib/unicore/To/NameAlia.pl type=file +c:\tlperl\lib/unicore/To/Nt.pl type=file +c:\tlperl\lib/unicore/To/Nv.pl type=file +c:\tlperl\lib/unicore/To/PerlDeci.pl type=file +c:\tlperl\lib/unicore/To/SB.pl type=file +c:\tlperl\lib/unicore/To/Sc.pl type=file +c:\tlperl\lib/unicore/To/Scx.pl type=file +c:\tlperl\lib/unicore/To/Tc.pl type=file +c:\tlperl\lib/unicore/To/Title.pl type=file +c:\tlperl\lib/unicore/To/Uc.pl type=file +c:\tlperl\lib/unicore/To/Upper.pl type=file +c:\tlperl\lib/unicore/To/WB.pl type=file +c:\tlperl\lib/unicore/UCD.pl type=file +c:\tlperl\lib/unicore/lib/Age/NA.pl type=file +c:\tlperl\lib/unicore/lib/Age/V11.pl type=file +c:\tlperl\lib/unicore/lib/Age/V20.pl type=file +c:\tlperl\lib/unicore/lib/Age/V30.pl type=file +c:\tlperl\lib/unicore/lib/Age/V31.pl type=file +c:\tlperl\lib/unicore/lib/Age/V32.pl type=file +c:\tlperl\lib/unicore/lib/Age/V40.pl type=file +c:\tlperl\lib/unicore/lib/Age/V41.pl type=file +c:\tlperl\lib/unicore/lib/Age/V50.pl type=file +c:\tlperl\lib/unicore/lib/Age/V51.pl type=file +c:\tlperl\lib/unicore/lib/Age/V52.pl type=file +c:\tlperl\lib/unicore/lib/Age/V60.pl type=file +c:\tlperl\lib/unicore/lib/Age/V61.pl type=file +c:\tlperl\lib/unicore/lib/Alpha/Y.pl type=file +c:\tlperl\lib/unicore/lib/Bc/AL.pl type=file +c:\tlperl\lib/unicore/lib/Bc/AN.pl type=file +c:\tlperl\lib/unicore/lib/Bc/B.pl type=file +c:\tlperl\lib/unicore/lib/Bc/BN.pl type=file +c:\tlperl\lib/unicore/lib/Bc/CS.pl type=file +c:\tlperl\lib/unicore/lib/Bc/EN.pl type=file +c:\tlperl\lib/unicore/lib/Bc/ES.pl type=file +c:\tlperl\lib/unicore/lib/Bc/ET.pl type=file +c:\tlperl\lib/unicore/lib/Bc/L.pl type=file +c:\tlperl\lib/unicore/lib/Bc/NSM.pl type=file +c:\tlperl\lib/unicore/lib/Bc/ON.pl type=file +c:\tlperl\lib/unicore/lib/Bc/R.pl type=file +c:\tlperl\lib/unicore/lib/Bc/WS.pl type=file +c:\tlperl\lib/unicore/lib/BidiC/Y.pl type=file +c:\tlperl\lib/unicore/lib/BidiM/Y.pl type=file +c:\tlperl\lib/unicore/lib/Blk/NB.pl type=file +c:\tlperl\lib/unicore/lib/Bpt/C.pl type=file +c:\tlperl\lib/unicore/lib/Bpt/N.pl type=file +c:\tlperl\lib/unicore/lib/Bpt/O.pl type=file +c:\tlperl\lib/unicore/lib/CE/Y.pl type=file +c:\tlperl\lib/unicore/lib/CI/Y.pl type=file +c:\tlperl\lib/unicore/lib/CWCF/Y.pl type=file +c:\tlperl\lib/unicore/lib/CWCM/Y.pl type=file +c:\tlperl\lib/unicore/lib/CWKCF/Y.pl type=file +c:\tlperl\lib/unicore/lib/CWL/Y.pl type=file +c:\tlperl\lib/unicore/lib/CWT/Y.pl type=file +c:\tlperl\lib/unicore/lib/CWU/Y.pl type=file +c:\tlperl\lib/unicore/lib/Cased/Y.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/A.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/AR.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/ATAR.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/B.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/BR.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/DB.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/NK.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/NR.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/OV.pl type=file +c:\tlperl\lib/unicore/lib/Ccc/VR.pl type=file +c:\tlperl\lib/unicore/lib/CompEx/Y.pl type=file +c:\tlperl\lib/unicore/lib/DI/Y.pl type=file +c:\tlperl\lib/unicore/lib/Dash/Y.pl type=file +c:\tlperl\lib/unicore/lib/Dep/Y.pl type=file +c:\tlperl\lib/unicore/lib/Dia/Y.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Com.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Enc.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Fin.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Font.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Init.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Iso.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Med.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Nar.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Nb.pl type=file +c:\tlperl\lib/unicore/lib/Dt/NonCanon.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Sqr.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Sub.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Sup.pl type=file +c:\tlperl\lib/unicore/lib/Dt/Vert.pl type=file +c:\tlperl\lib/unicore/lib/Ea/A.pl type=file +c:\tlperl\lib/unicore/lib/Ea/H.pl type=file +c:\tlperl\lib/unicore/lib/Ea/N.pl type=file +c:\tlperl\lib/unicore/lib/Ea/Na.pl type=file +c:\tlperl\lib/unicore/lib/Ea/W.pl type=file +c:\tlperl\lib/unicore/lib/Ext/Y.pl type=file +c:\tlperl\lib/unicore/lib/GCB/CN.pl type=file +c:\tlperl\lib/unicore/lib/GCB/EX.pl type=file +c:\tlperl\lib/unicore/lib/GCB/LV.pl type=file +c:\tlperl\lib/unicore/lib/GCB/LVT.pl type=file +c:\tlperl\lib/unicore/lib/GCB/SM.pl type=file +c:\tlperl\lib/unicore/lib/GCB/XX.pl type=file +c:\tlperl\lib/unicore/lib/Gc/C.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Cf.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Cn.pl type=file +c:\tlperl\lib/unicore/lib/Gc/L.pl type=file +c:\tlperl\lib/unicore/lib/Gc/LC.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Ll.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Lm.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Lo.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Lt.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Lu.pl type=file +c:\tlperl\lib/unicore/lib/Gc/M.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Mc.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Me.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Mn.pl type=file +c:\tlperl\lib/unicore/lib/Gc/N.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Nd.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Nl.pl type=file +c:\tlperl\lib/unicore/lib/Gc/No.pl type=file +c:\tlperl\lib/unicore/lib/Gc/P.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Pd.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Pe.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Pf.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Pi.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Po.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Ps.pl type=file +c:\tlperl\lib/unicore/lib/Gc/S.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Sc.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Sk.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Sm.pl type=file +c:\tlperl\lib/unicore/lib/Gc/So.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Z.pl type=file +c:\tlperl\lib/unicore/lib/Gc/Zs.pl type=file +c:\tlperl\lib/unicore/lib/GrBase/Y.pl type=file +c:\tlperl\lib/unicore/lib/Hex/Y.pl type=file +c:\tlperl\lib/unicore/lib/Hst/NA.pl type=file +c:\tlperl\lib/unicore/lib/Hyphen/Y.pl type=file +c:\tlperl\lib/unicore/lib/IDC/Y.pl type=file +c:\tlperl\lib/unicore/lib/IDS/Y.pl type=file +c:\tlperl\lib/unicore/lib/Ideo/Y.pl type=file +c:\tlperl\lib/unicore/lib/In/2_0.pl type=file +c:\tlperl\lib/unicore/lib/In/2_1.pl type=file +c:\tlperl\lib/unicore/lib/In/3_0.pl type=file +c:\tlperl\lib/unicore/lib/In/3_1.pl type=file +c:\tlperl\lib/unicore/lib/In/3_2.pl type=file +c:\tlperl\lib/unicore/lib/In/4_0.pl type=file +c:\tlperl\lib/unicore/lib/In/4_1.pl type=file +c:\tlperl\lib/unicore/lib/In/5_0.pl type=file +c:\tlperl\lib/unicore/lib/In/5_1.pl type=file +c:\tlperl\lib/unicore/lib/In/5_2.pl type=file +c:\tlperl\lib/unicore/lib/In/6_0.pl type=file +c:\tlperl\lib/unicore/lib/In/6_1.pl type=file +c:\tlperl\lib/unicore/lib/In/6_2.pl type=file +c:\tlperl\lib/unicore/lib/In/6_3.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Ain.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Alef.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Beh.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Dal.pl type=file +c:\tlperl\lib/unicore/lib/Jg/FarsiYeh.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Feh.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Gaf.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Hah.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Lam.pl type=file +c:\tlperl\lib/unicore/lib/Jg/NoJoinin.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Qaf.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Reh.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Seen.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Waw.pl type=file +c:\tlperl\lib/unicore/lib/Jg/Yeh.pl type=file +c:\tlperl\lib/unicore/lib/Jt/C.pl type=file +c:\tlperl\lib/unicore/lib/Jt/D.pl type=file +c:\tlperl\lib/unicore/lib/Jt/R.pl type=file +c:\tlperl\lib/unicore/lib/Jt/T.pl type=file +c:\tlperl\lib/unicore/lib/Jt/U.pl type=file +c:\tlperl\lib/unicore/lib/LOE/Y.pl type=file +c:\tlperl\lib/unicore/lib/Lb/AI.pl type=file +c:\tlperl\lib/unicore/lib/Lb/AL.pl type=file +c:\tlperl\lib/unicore/lib/Lb/BA.pl type=file +c:\tlperl\lib/unicore/lib/Lb/BB.pl type=file +c:\tlperl\lib/unicore/lib/Lb/CJ.pl type=file +c:\tlperl\lib/unicore/lib/Lb/CL.pl type=file +c:\tlperl\lib/unicore/lib/Lb/CM.pl type=file +c:\tlperl\lib/unicore/lib/Lb/EX.pl type=file +c:\tlperl\lib/unicore/lib/Lb/GL.pl type=file +c:\tlperl\lib/unicore/lib/Lb/ID.pl type=file +c:\tlperl\lib/unicore/lib/Lb/IS.pl type=file +c:\tlperl\lib/unicore/lib/Lb/NS.pl type=file +c:\tlperl\lib/unicore/lib/Lb/OP.pl type=file +c:\tlperl\lib/unicore/lib/Lb/PO.pl type=file +c:\tlperl\lib/unicore/lib/Lb/PR.pl type=file +c:\tlperl\lib/unicore/lib/Lb/QU.pl type=file +c:\tlperl\lib/unicore/lib/Lb/SA.pl type=file +c:\tlperl\lib/unicore/lib/Lb/XX.pl type=file +c:\tlperl\lib/unicore/lib/Lower/Y.pl type=file +c:\tlperl\lib/unicore/lib/Math/Y.pl type=file +c:\tlperl\lib/unicore/lib/NChar/Y.pl type=file +c:\tlperl\lib/unicore/lib/NFCQC/M.pl type=file +c:\tlperl\lib/unicore/lib/NFCQC/Y.pl type=file +c:\tlperl\lib/unicore/lib/NFDQC/N.pl type=file +c:\tlperl\lib/unicore/lib/NFDQC/Y.pl type=file +c:\tlperl\lib/unicore/lib/NFKCQC/N.pl type=file +c:\tlperl\lib/unicore/lib/NFKCQC/Y.pl type=file +c:\tlperl\lib/unicore/lib/NFKDQC/N.pl type=file +c:\tlperl\lib/unicore/lib/NFKDQC/Y.pl type=file +c:\tlperl\lib/unicore/lib/Nt/Di.pl type=file +c:\tlperl\lib/unicore/lib/Nt/None.pl type=file +c:\tlperl\lib/unicore/lib/Nt/Nu.pl type=file +c:\tlperl\lib/unicore/lib/Nv/0.pl type=file +c:\tlperl\lib/unicore/lib/Nv/1.pl type=file +c:\tlperl\lib/unicore/lib/Nv/10.pl type=file +c:\tlperl\lib/unicore/lib/Nv/100.pl type=file +c:\tlperl\lib/unicore/lib/Nv/1000.pl type=file +c:\tlperl\lib/unicore/lib/Nv/10000.pl type=file +c:\tlperl\lib/unicore/lib/Nv/11.pl type=file +c:\tlperl\lib/unicore/lib/Nv/12.pl type=file +c:\tlperl\lib/unicore/lib/Nv/13.pl type=file +c:\tlperl\lib/unicore/lib/Nv/14.pl type=file +c:\tlperl\lib/unicore/lib/Nv/15.pl type=file +c:\tlperl\lib/unicore/lib/Nv/16.pl type=file +c:\tlperl\lib/unicore/lib/Nv/17.pl type=file +c:\tlperl\lib/unicore/lib/Nv/18.pl type=file +c:\tlperl\lib/unicore/lib/Nv/19.pl type=file +c:\tlperl\lib/unicore/lib/Nv/1_2.pl type=file +c:\tlperl\lib/unicore/lib/Nv/1_3.pl type=file +c:\tlperl\lib/unicore/lib/Nv/1_4.pl type=file +c:\tlperl\lib/unicore/lib/Nv/1_8.pl type=file +c:\tlperl\lib/unicore/lib/Nv/2.pl type=file +c:\tlperl\lib/unicore/lib/Nv/20.pl type=file +c:\tlperl\lib/unicore/lib/Nv/2_3.pl type=file +c:\tlperl\lib/unicore/lib/Nv/3.pl type=file +c:\tlperl\lib/unicore/lib/Nv/30.pl type=file +c:\tlperl\lib/unicore/lib/Nv/3_4.pl type=file +c:\tlperl\lib/unicore/lib/Nv/4.pl type=file +c:\tlperl\lib/unicore/lib/Nv/40.pl type=file +c:\tlperl\lib/unicore/lib/Nv/5.pl type=file +c:\tlperl\lib/unicore/lib/Nv/50.pl type=file +c:\tlperl\lib/unicore/lib/Nv/500.pl type=file +c:\tlperl\lib/unicore/lib/Nv/5000.pl type=file +c:\tlperl\lib/unicore/lib/Nv/50000.pl type=file +c:\tlperl\lib/unicore/lib/Nv/6.pl type=file +c:\tlperl\lib/unicore/lib/Nv/60.pl type=file +c:\tlperl\lib/unicore/lib/Nv/7.pl type=file +c:\tlperl\lib/unicore/lib/Nv/70.pl type=file +c:\tlperl\lib/unicore/lib/Nv/8.pl type=file +c:\tlperl\lib/unicore/lib/Nv/80.pl type=file +c:\tlperl\lib/unicore/lib/Nv/9.pl type=file +c:\tlperl\lib/unicore/lib/Nv/90.pl type=file +c:\tlperl\lib/unicore/lib/PatSyn/Y.pl type=file +c:\tlperl\lib/unicore/lib/PatWS/Y.pl type=file +c:\tlperl\lib/unicore/lib/Perl/Alnum.pl type=file +c:\tlperl\lib/unicore/lib/Perl/Assigned.pl type=file +c:\tlperl\lib/unicore/lib/Perl/Blank.pl type=file +c:\tlperl\lib/unicore/lib/Perl/Graph.pl type=file +c:\tlperl\lib/unicore/lib/Perl/PerlWord.pl type=file +c:\tlperl\lib/unicore/lib/Perl/PosixPun.pl type=file +c:\tlperl\lib/unicore/lib/Perl/Print.pl type=file +c:\tlperl\lib/unicore/lib/Perl/Word.pl type=file +c:\tlperl\lib/unicore/lib/Perl/XPosixPu.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlAny.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlCh2.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlCha.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlFol.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlIDC.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlIDS.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlPr2.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlPro.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_PerlQuo.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_XExtend.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_XRegula.pl type=file +c:\tlperl\lib/unicore/lib/Perl/_XSpecia.pl type=file +c:\tlperl\lib/unicore/lib/QMark/Y.pl type=file +c:\tlperl\lib/unicore/lib/SB/AT.pl type=file +c:\tlperl\lib/unicore/lib/SB/CL.pl type=file +c:\tlperl\lib/unicore/lib/SB/EX.pl type=file +c:\tlperl\lib/unicore/lib/SB/FO.pl type=file +c:\tlperl\lib/unicore/lib/SB/LE.pl type=file +c:\tlperl\lib/unicore/lib/SB/LO.pl type=file +c:\tlperl\lib/unicore/lib/SB/NU.pl type=file +c:\tlperl\lib/unicore/lib/SB/SC.pl type=file +c:\tlperl\lib/unicore/lib/SB/ST.pl type=file +c:\tlperl\lib/unicore/lib/SB/Sp.pl type=file +c:\tlperl\lib/unicore/lib/SB/UP.pl type=file +c:\tlperl\lib/unicore/lib/SB/XX.pl type=file +c:\tlperl\lib/unicore/lib/SD/Y.pl type=file +c:\tlperl\lib/unicore/lib/STerm/Y.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Arab.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Armn.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Beng.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Cham.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Cprt.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Cyrl.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Deva.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Ethi.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Geor.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Grek.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Gujr.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Guru.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Han.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Hang.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Hebr.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Hira.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Kana.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Khar.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Khmr.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Knda.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Lana.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Lao.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Latn.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Limb.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Linb.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Mlym.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Mong.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Orya.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Sinh.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Talu.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Taml.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Telu.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Tibt.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Zinh.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Zyyy.pl type=file +c:\tlperl\lib/unicore/lib/Sc/Zzzz.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Arab.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Armn.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Beng.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Bopo.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Cakm.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Cprt.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Cyrl.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Deva.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Geor.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Grek.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Gujr.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Guru.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Han.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Hang.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Hira.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Kana.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Latn.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Linb.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Mong.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Orya.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Syrc.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Tagb.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Takr.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Thaa.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Yi.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Zinh.pl type=file +c:\tlperl\lib/unicore/lib/Scx/Zyyy.pl type=file +c:\tlperl\lib/unicore/lib/Space/Y.pl type=file +c:\tlperl\lib/unicore/lib/Term/Y.pl type=file +c:\tlperl\lib/unicore/lib/UIdeo/Y.pl type=file +c:\tlperl\lib/unicore/lib/Upper/Y.pl type=file +c:\tlperl\lib/unicore/lib/WB/EX.pl type=file +c:\tlperl\lib/unicore/lib/WB/FO.pl type=file +c:\tlperl\lib/unicore/lib/WB/HL.pl type=file +c:\tlperl\lib/unicore/lib/WB/KA.pl type=file +c:\tlperl\lib/unicore/lib/WB/LE.pl type=file +c:\tlperl\lib/unicore/lib/WB/MB.pl type=file +c:\tlperl\lib/unicore/lib/WB/ML.pl type=file +c:\tlperl\lib/unicore/lib/WB/MN.pl type=file +c:\tlperl\lib/unicore/lib/WB/NU.pl type=file +c:\tlperl\lib/unicore/lib/WB/XX.pl type=file +c:\tlperl\lib/unicore/lib/XIDC/Y.pl type=file +c:\tlperl\lib/unicore/lib/XIDS/Y.pl type=file +c:\tlperl\lib/unicore/version type=file +c:\tlperl\lib/utf8.pm type=file +c:\tlperl\lib/utf8_heavy.pl type=file +c:\tlperl\lib/vars.pm type=file +c:\tlperl\lib/version.pm type=file +c:\tlperl\lib/version.pod type=file +c:\tlperl\lib/version/Internals.pod type=file +c:\tlperl\lib/version/regex.pm type=file +c:\tlperl\lib/version/vpp.pm type=file +c:\tlperl\lib/vmsish.pm type=file +c:\tlperl\lib/warnings.pm type=file +c:\tlperl\lib/warnings/register.pm type=file diff --git a/Master/tlpkg/tlperl/lib/App/Cpan.pm b/Master/tlpkg/tlperl/lib/App/Cpan.pm index 6dc24922a78..b548bcc0ae6 100644 --- a/Master/tlpkg/tlperl/lib/App/Cpan.pm +++ b/Master/tlpkg/tlperl/lib/App/Cpan.pm @@ -1,11 +1,12 @@ package App::Cpan; -use 5.008; use strict; use warnings; use vars qw($VERSION); -$VERSION = '1.61'; +use if $] < 5.008 => "IO::Scalar"; + +$VERSION = '1.62'; =head1 NAME @@ -124,7 +125,7 @@ for a new, custom configuration. =item -l -List all installed modules wth their versions +List all installed modules with their versions =item -L author [ author ... ] @@ -396,7 +397,7 @@ sub _process_setup_options Just do it. -The C method returns 0 on success and a postive number on +The C method returns 0 on success and a positive number on failure. See the section on EXIT CODES for details on the values. =cut @@ -579,7 +580,12 @@ my @skip_lines = ( sub _get_cpanpm_last_line { - open my($fh), "<", \ $scalar; + my $fh; + if ($] < 5.008) { + $fh = IO::Scalar->new(\ $scalar); + } else { + eval q{open $fh, "<", \\ $scalar;}; + } my @lines = <$fh>; @@ -959,6 +965,7 @@ sub _dump_config # -J my $fh = $args->[0] || \*STDOUT; + local $Data::Dumper::Sortkeys = 1; my $dd = Data::Dumper->new( [$CPAN::Config], ['$CPAN::Config'] diff --git a/Master/tlpkg/tlperl/lib/App/Prove.pm b/Master/tlpkg/tlperl/lib/App/Prove.pm index 67c691bf93e..44aaf6dda30 100644 --- a/Master/tlpkg/tlperl/lib/App/Prove.pm +++ b/Master/tlpkg/tlperl/lib/App/Prove.pm @@ -1,27 +1,28 @@ package App::Prove; use strict; -use vars qw($VERSION @ISA); +use warnings; -use TAP::Object (); use TAP::Harness; -use TAP::Parser::Utils qw( split_shell ); +use Text::ParseWords qw(shellwords); use File::Spec; use Getopt::Long; use App::Prove::State; use Carp; +use base 'TAP::Object'; + =head1 NAME App::Prove - Implements the C command. =head1 VERSION -Version 3.26 +Version 3.30 =cut -$VERSION = '3.26'; +our $VERSION = '3.30'; =head1 DESCRIPTION @@ -51,8 +52,6 @@ use constant PLUGINS => 'App::Prove::Plugin'; my @ATTR; BEGIN { - @ISA = qw(TAP::Object); - @ATTR = qw( archive argv blib show_count color directives exec failures comments formatter harness includes modules plugins jobs lib merge parse quiet @@ -574,7 +573,7 @@ sub _get_switches { push @switches, '-w'; } - push @switches, split_shell( $ENV{HARNESS_PERL_SWITCHES} ); + push @switches, shellwords( $ENV{HARNESS_PERL_SWITCHES} ) if defined $ENV{HARNESS_PERL_SWITCHES}; return @switches ? \@switches : (); } diff --git a/Master/tlpkg/tlperl/lib/App/Prove/State.pm b/Master/tlpkg/tlperl/lib/App/Prove/State.pm index a9c38de63e9..519ba01d6c7 100644 --- a/Master/tlpkg/tlperl/lib/App/Prove/State.pm +++ b/Master/tlpkg/tlperl/lib/App/Prove/State.pm @@ -1,7 +1,7 @@ package App::Prove::State; use strict; -use vars qw($VERSION @ISA); +use warnings; use File::Find; use File::Spec; @@ -10,10 +10,9 @@ use Carp; use App::Prove::State::Result; use TAP::Parser::YAMLish::Reader (); use TAP::Parser::YAMLish::Writer (); -use TAP::Base; +use base 'TAP::Base'; BEGIN { - @ISA = qw( TAP::Base ); __PACKAGE__->mk_methods('result_class'); } @@ -26,11 +25,11 @@ App::Prove::State - State storage for the C command. =head1 VERSION -Version 3.26 +Version 3.30 =cut -$VERSION = '3.26'; +our $VERSION = '3.30'; =head1 DESCRIPTION @@ -41,7 +40,7 @@ and the operations that may be performed on it. =head1 SYNOPSIS # Re-run failed tests - $ prove --state=fail,save -rbv + $ prove --state=failed,save -rbv =cut diff --git a/Master/tlpkg/tlperl/lib/App/Prove/State/Result.pm b/Master/tlpkg/tlperl/lib/App/Prove/State/Result.pm index 7bb4457efb8..8e44ea3a4b1 100644 --- a/Master/tlpkg/tlperl/lib/App/Prove/State/Result.pm +++ b/Master/tlpkg/tlperl/lib/App/Prove/State/Result.pm @@ -1,10 +1,10 @@ package App::Prove::State::Result; use strict; +use warnings; use Carp 'croak'; use App::Prove::State::Result::Test; -use vars qw($VERSION); use constant STATE_VERSION => 1; @@ -14,11 +14,11 @@ App::Prove::State::Result - Individual test suite results. =head1 VERSION -Version 3.26 +Version 3.30 =cut -$VERSION = '3.26'; +our $VERSION = '3.30'; =head1 DESCRIPTION @@ -29,7 +29,7 @@ single test suite run. =head1 SYNOPSIS # Re-run failed tests - $ prove --state=fail,save -rbv + $ prove --state=failed,save -rbv =cut diff --git a/Master/tlpkg/tlperl/lib/App/Prove/State/Result/Test.pm b/Master/tlpkg/tlperl/lib/App/Prove/State/Result/Test.pm index f626f1da774..21f20a12e61 100644 --- a/Master/tlpkg/tlperl/lib/App/Prove/State/Result/Test.pm +++ b/Master/tlpkg/tlperl/lib/App/Prove/State/Result/Test.pm @@ -1,8 +1,7 @@ package App::Prove::State::Result::Test; use strict; - -use vars qw($VERSION); +use warnings; =head1 NAME @@ -10,11 +9,11 @@ App::Prove::State::Result::Test - Individual test results. =head1 VERSION -Version 3.26 +Version 3.30 =cut -$VERSION = '3.26'; +our $VERSION = '3.30'; =head1 DESCRIPTION @@ -25,7 +24,7 @@ single test. =head1 SYNOPSIS # Re-run failed tests - $ prove --state=fail,save -rbv + $ prove --state=failed,save -rbv =cut diff --git a/Master/tlpkg/tlperl/lib/Archive/Extract.pm b/Master/tlpkg/tlperl/lib/Archive/Extract.pm deleted file mode 100644 index ae3af3edf82..00000000000 --- a/Master/tlpkg/tlperl/lib/Archive/Extract.pm +++ /dev/null @@ -1,1690 +0,0 @@ -package Archive::Extract; -use if $] > 5.017, 'deprecate'; - -use strict; - -use Cwd qw[cwd chdir]; -use Carp qw[carp]; -use IPC::Cmd qw[run can_run]; -use FileHandle; -use File::Path qw[mkpath]; -use File::Spec; -use File::Basename qw[dirname basename]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load check_install]; -use Locale::Maketext::Simple Style => 'gettext'; - -### solaris has silly /bin/tar output ### -use constant ON_SOLARIS => $^O eq 'solaris' ? 1 : 0; -use constant ON_NETBSD => $^O eq 'netbsd' ? 1 : 0; -use constant ON_OPENBSD => $^O eq 'openbsd' ? 1 : 0; -use constant ON_FREEBSD => $^O =~ m!^(free|midnight)bsd$! ? 1 : 0; -use constant ON_LINUX => $^O eq 'linux' ? 1 : 0; -use constant FILE_EXISTS => sub { -e $_[0] ? 1 : 0 }; - -### VMS may require quoting upper case command options -use constant ON_VMS => $^O eq 'VMS' ? 1 : 0; - -### Windows needs special treatment of Tar options -use constant ON_WIN32 => $^O eq 'MSWin32' ? 1 : 0; - -### we can't use this extraction method, because of missing -### modules/binaries: -use constant METHOD_NA => []; - -### If these are changed, update @TYPES and the new() POD -use constant TGZ => 'tgz'; -use constant TAR => 'tar'; -use constant GZ => 'gz'; -use constant ZIP => 'zip'; -use constant BZ2 => 'bz2'; -use constant TBZ => 'tbz'; -use constant Z => 'Z'; -use constant LZMA => 'lzma'; -use constant XZ => 'xz'; -use constant TXZ => 'txz'; - -use vars qw[$VERSION $PREFER_BIN $PROGRAMS $WARN $DEBUG - $_ALLOW_BIN $_ALLOW_PURE_PERL $_ALLOW_TAR_ITER - ]; - -$VERSION = '0.68'; -$PREFER_BIN = 0; -$WARN = 1; -$DEBUG = 0; -$_ALLOW_PURE_PERL = 1; # allow pure perl extractors -$_ALLOW_BIN = 1; # allow binary extractors -$_ALLOW_TAR_ITER = 1; # try to use Archive::Tar->iter if available - -# same as all constants -my @Types = ( TGZ, TAR, GZ, ZIP, BZ2, TBZ, Z, LZMA, XZ, TXZ ); - -local $Params::Check::VERBOSE = $Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -Archive::Extract - A generic archive extracting mechanism - -=head1 SYNOPSIS - - use Archive::Extract; - - ### build an Archive::Extract object ### - my $ae = Archive::Extract->new( archive => 'foo.tgz' ); - - ### extract to cwd() ### - my $ok = $ae->extract; - - ### extract to /tmp ### - my $ok = $ae->extract( to => '/tmp' ); - - ### what if something went wrong? - my $ok = $ae->extract or die $ae->error; - - ### files from the archive ### - my $files = $ae->files; - - ### dir that was extracted to ### - my $outdir = $ae->extract_path; - - - ### quick check methods ### - $ae->is_tar # is it a .tar file? - $ae->is_tgz # is it a .tar.gz or .tgz file? - $ae->is_gz; # is it a .gz file? - $ae->is_zip; # is it a .zip file? - $ae->is_bz2; # is it a .bz2 file? - $ae->is_tbz; # is it a .tar.bz2 or .tbz file? - $ae->is_lzma; # is it a .lzma file? - $ae->is_xz; # is it a .xz file? - $ae->is_txz; # is it a .tar.xz or .txz file? - - ### absolute path to the archive you provided ### - $ae->archive; - - ### commandline tools, if found ### - $ae->bin_tar # path to /bin/tar, if found - $ae->bin_gzip # path to /bin/gzip, if found - $ae->bin_unzip # path to /bin/unzip, if found - $ae->bin_bunzip2 # path to /bin/bunzip2 if found - $ae->bin_unlzma # path to /bin/unlzma if found - $ae->bin_unxz # path to /bin/unxz if found - -=head1 DESCRIPTION - -Archive::Extract is a generic archive extraction mechanism. - -It allows you to extract any archive file of the type .tar, .tar.gz, -.gz, .Z, tar.bz2, .tbz, .bz2, .zip, .xz,, .txz, .tar.xz or .lzma -without having to worry how it -does so, or use different interfaces for each type by using either -perl modules, or commandline tools on your system. - -See the C section further down for details. - -=cut - - -### see what /bin/programs are available ### -$PROGRAMS = {}; -CMD: for my $pgm (qw[tar unzip gzip bunzip2 uncompress unlzma unxz]) { - if ( $pgm eq 'unzip' and ( ON_NETBSD or ON_FREEBSD ) ) { - local $IPC::Cmd::INSTANCES = 1; - ($PROGRAMS->{$pgm}) = grep { ON_NETBSD ? m!/usr/pkg/! : m!/usr/local! } can_run($pgm); - next CMD; - } - if ( $pgm eq 'unzip' and ON_LINUX ) { - # Check if 'unzip' is busybox masquerading - local $IPC::Cmd::INSTANCES = 1; - my $opt = ON_VMS ? '"-Z"' : '-Z'; - ($PROGRAMS->{$pgm}) = grep { scalar run(command=> [ $_, $opt, '-1' ]) } can_run($pgm); - next CMD; - } - if ( $pgm eq 'tar' and ON_OPENBSD || ON_SOLARIS ) { - # try gtar first - next CMD if $PROGRAMS->{$pgm} = can_run('gtar'); - } - $PROGRAMS->{$pgm} = can_run($pgm); -} - -### mapping from types to extractor methods ### -my $Mapping = { # binary program # pure perl module - is_tgz => { bin => '_untar_bin', pp => '_untar_at' }, - is_tar => { bin => '_untar_bin', pp => '_untar_at' }, - is_gz => { bin => '_gunzip_bin', pp => '_gunzip_cz' }, - is_zip => { bin => '_unzip_bin', pp => '_unzip_az' }, - is_tbz => { bin => '_untar_bin', pp => '_untar_at' }, - is_bz2 => { bin => '_bunzip2_bin', pp => '_bunzip2_bz2'}, - is_Z => { bin => '_uncompress_bin', pp => '_gunzip_cz' }, - is_lzma => { bin => '_unlzma_bin', pp => '_unlzma_cz' }, - is_xz => { bin => '_unxz_bin', pp => '_unxz_cz' }, - is_txz => { bin => '_untar_bin', pp => '_untar_at' }, -}; - -{ ### use subs so we re-generate array refs etc for the no-override flags - ### if we don't, then we reuse the same arrayref, meaning objects store - ### previous errors - my $tmpl = { - archive => sub { { required => 1, allow => FILE_EXISTS } }, - type => sub { { default => '', allow => [ @Types ] } }, - _error_msg => sub { { no_override => 1, default => [] } }, - _error_msg_long => sub { { no_override => 1, default => [] } }, - }; - - ### build accessors ### - for my $method( keys %$tmpl, - qw[_extractor _gunzip_to files extract_path], - ) { - no strict 'refs'; - *$method = sub { - my $self = shift; - $self->{$method} = $_[0] if @_; - return $self->{$method}; - } - } - -=head1 METHODS - -=head2 $ae = Archive::Extract->new(archive => '/path/to/archive',[type => TYPE]) - -Creates a new C object based on the archive file you -passed it. Automatically determines the type of archive based on the -extension, but you can override that by explicitly providing the -C argument. - -Valid values for C are: - -=over 4 - -=item tar - -Standard tar files, as produced by, for example, C. -Corresponds to a C<.tar> suffix. - -=item tgz - -Gzip compressed tar files, as produced by, for example C. -Corresponds to a C<.tgz> or C<.tar.gz> suffix. - -=item gz - -Gzip compressed file, as produced by, for example C. -Corresponds to a C<.gz> suffix. - -=item Z - -Lempel-Ziv compressed file, as produced by, for example C. -Corresponds to a C<.Z> suffix. - -=item zip - -Zip compressed file, as produced by, for example C. -Corresponds to a C<.zip>, C<.jar> or C<.par> suffix. - -=item bz2 - -Bzip2 compressed file, as produced by, for example, C. -Corresponds to a C<.bz2> suffix. - -=item tbz - -Bzip2 compressed tar file, as produced by, for example C. -Corresponds to a C<.tbz> or C<.tar.bz2> suffix. - -=item lzma - -Lzma compressed file, as produced by C. -Corresponds to a C<.lzma> suffix. - -=item xz - -Xz compressed file, as produced by C. -Corresponds to a C<.xz> suffix. - -=item txz - -Xz compressed tar file, as produced by, for example C. -Corresponds to a C<.txz> or C<.tar.xz> suffix. - -=back - -Returns a C object on success, or false on failure. - -=cut - - ### constructor ### - sub new { - my $class = shift; - my %hash = @_; - - ### see above why we use subs here and generate the template; - ### it's basically to not re-use arrayrefs - my %utmpl = map { $_ => $tmpl->{$_}->() } keys %$tmpl; - - my $parsed = check( \%utmpl, \%hash ) or return; - - ### make sure we have an absolute path ### - my $ar = $parsed->{archive} = File::Spec->rel2abs( $parsed->{archive} ); - - ### figure out the type, if it wasn't already specified ### - unless ( $parsed->{type} ) { - $parsed->{type} = - $ar =~ /.+?\.(?:tar\.gz|tgz)$/i ? TGZ : - $ar =~ /.+?\.gz$/i ? GZ : - $ar =~ /.+?\.tar$/i ? TAR : - $ar =~ /.+?\.(zip|jar|ear|war|par)$/i ? ZIP : - $ar =~ /.+?\.(?:tbz2?|tar\.bz2?)$/i ? TBZ : - $ar =~ /.+?\.bz2$/i ? BZ2 : - $ar =~ /.+?\.Z$/ ? Z : - $ar =~ /.+?\.lzma$/ ? LZMA : - $ar =~ /.+?\.(?:txz|tar\.xz)$/i ? TXZ : - $ar =~ /.+?\.xz$/ ? XZ : - ''; - - } - - bless $parsed, $class; - - ### don't know what type of file it is - ### XXX this *has* to be an object call, not a package call - return $parsed->_error(loc("Cannot determine file type for '%1'", - $parsed->{archive} )) unless $parsed->{type}; - return $parsed; - } -} - -=head2 $ae->extract( [to => '/output/path'] ) - -Extracts the archive represented by the C object to -the path of your choice as specified by the C argument. Defaults to -C. - -Since C<.gz> files never hold a directory, but only a single file; if -the C argument is an existing directory, the file is extracted -there, with its C<.gz> suffix stripped. -If the C argument is not an existing directory, the C argument -is understood to be a filename, if the archive type is C. -In the case that you did not specify a C argument, the output -file will be the name of the archive file, stripped from its C<.gz> -suffix, in the current working directory. - -C will try a pure perl solution first, and then fall back to -commandline tools if they are available. See the C -section below on how to alter this behaviour. - -It will return true on success, and false on failure. - -On success, it will also set the follow attributes in the object: - -=over 4 - -=item $ae->extract_path - -This is the directory that the files where extracted to. - -=item $ae->files - -This is an array ref with the paths of all the files in the archive, -relative to the C argument you specified. -To get the full path to an extracted file, you would use: - - File::Spec->catfile( $to, $ae->files->[0] ); - -Note that all files from a tar archive will be in unix format, as per -the tar specification. - -=back - -=cut - -sub extract { - my $self = shift; - my %hash = @_; - - ### reset error messages - $self->_error_msg( [] ); - $self->_error_msg_long( [] ); - - my $to; - my $tmpl = { - to => { default => '.', store => \$to } - }; - - check( $tmpl, \%hash ) or return; - - ### so 'to' could be a file or a dir, depending on whether it's a .gz - ### file, or basically anything else. - ### so, check that, then act accordingly. - ### set an accessor specifically so _gunzip can know what file to extract - ### to. - my $dir; - { ### a foo.gz file - if( $self->is_gz or $self->is_bz2 or $self->is_Z or $self->is_lzma or $self->is_xz ) { - - my $cp = $self->archive; $cp =~ s/\.(?:gz|bz2?|Z|lzma|xz)$//i; - - ### to is a dir? - if ( -d $to ) { - $dir = $to; - $self->_gunzip_to( basename($cp) ); - - ### then it's a filename - } else { - $dir = dirname($to); - $self->_gunzip_to( basename($to) ); - } - - ### not a foo.gz file - } else { - $dir = $to; - } - } - - ### make the dir if it doesn't exist ### - unless( -d $dir ) { - eval { mkpath( $dir ) }; - - return $self->_error(loc("Could not create path '%1': %2", $dir, $@)) - if $@; - } - - ### get the current dir, to restore later ### - my $cwd = cwd(); - - my $ok = 1; - EXTRACT: { - - ### chdir to the target dir ### - unless( chdir $dir ) { - $self->_error(loc("Could not chdir to '%1': %2", $dir, $!)); - $ok = 0; last EXTRACT; - } - - ### set files to an empty array ref, so there's always an array - ### ref IN the accessor, to avoid errors like: - ### Can't use an undefined value as an ARRAY reference at - ### ../lib/Archive/Extract.pm line 742. (rt #19815) - $self->files( [] ); - - ### find out the dispatch methods needed for this type of - ### archive. Do a $self->is_XXX to figure out the type, then - ### get the hashref with bin + pure perl dispatchers. - my ($map) = map { $Mapping->{$_} } grep { $self->$_ } keys %$Mapping; - - ### add pure perl extractor if allowed & add bin extractor if allowed - my @methods; - push @methods, $map->{'pp'} if $_ALLOW_PURE_PERL; - push @methods, $map->{'bin'} if $_ALLOW_BIN; - - ### reverse it if we prefer bin extractors - @methods = reverse @methods if $PREFER_BIN; - - my($na, $fail); - for my $method (@methods) { - $self->debug( "# Extracting with ->$method\n" ); - - my $rv = $self->$method; - - ### a positive extraction - if( $rv and $rv ne METHOD_NA ) { - $self->debug( "# Extraction succeeded\n" ); - $self->_extractor($method); - last; - - ### method is not available - } elsif ( $rv and $rv eq METHOD_NA ) { - $self->debug( "# Extraction method not available\n" ); - $na++; - } else { - $self->debug( "# Extraction method failed\n" ); - $fail++; - } - } - - ### warn something went wrong if we didn't get an extractor - unless( $self->_extractor ) { - my $diag = $fail ? loc("Extract failed due to errors") : - $na ? loc("Extract failed; no extractors available") : - ''; - - $self->_error($diag); - $ok = 0; - } - } - - ### and chdir back ### - unless( chdir $cwd ) { - $self->_error(loc("Could not chdir back to start dir '%1': %2'", - $cwd, $!)); - } - - return $ok; -} - -=pod - -=head1 ACCESSORS - -=head2 $ae->error([BOOL]) - -Returns the last encountered error as string. -Pass it a true value to get the C output instead. - -=head2 $ae->extract_path - -This is the directory the archive got extracted to. -See C for details. - -=head2 $ae->files - -This is an array ref holding all the paths from the archive. -See C for details. - -=head2 $ae->archive - -This is the full path to the archive file represented by this -C object. - -=head2 $ae->type - -This is the type of archive represented by this C -object. See accessors below for an easier way to use this. -See the C method for details. - -=head2 $ae->types - -Returns a list of all known C for C's -C method. - -=cut - -sub types { return @Types } - -=head2 $ae->is_tgz - -Returns true if the file is of type C<.tar.gz>. -See the C method for details. - -=head2 $ae->is_tar - -Returns true if the file is of type C<.tar>. -See the C method for details. - -=head2 $ae->is_gz - -Returns true if the file is of type C<.gz>. -See the C method for details. - -=head2 $ae->is_Z - -Returns true if the file is of type C<.Z>. -See the C method for details. - -=head2 $ae->is_zip - -Returns true if the file is of type C<.zip>. -See the C method for details. - -=head2 $ae->is_lzma - -Returns true if the file is of type C<.lzma>. -See the C method for details. - -=head2 $ae->is_xz - -Returns true if the file is of type C<.xz>. -See the C method for details. - -=cut - -### quick check methods ### -sub is_tgz { return $_[0]->type eq TGZ } -sub is_tar { return $_[0]->type eq TAR } -sub is_gz { return $_[0]->type eq GZ } -sub is_zip { return $_[0]->type eq ZIP } -sub is_tbz { return $_[0]->type eq TBZ } -sub is_bz2 { return $_[0]->type eq BZ2 } -sub is_Z { return $_[0]->type eq Z } -sub is_lzma { return $_[0]->type eq LZMA } -sub is_xz { return $_[0]->type eq XZ } -sub is_txz { return $_[0]->type eq TXZ } - -=pod - -=head2 $ae->bin_tar - -Returns the full path to your tar binary, if found. - -=head2 $ae->bin_gzip - -Returns the full path to your gzip binary, if found - -=head2 $ae->bin_unzip - -Returns the full path to your unzip binary, if found - -=head2 $ae->bin_unlzma - -Returns the full path to your unlzma binary, if found - -=head2 $ae->bin_unxz - -Returns the full path to your unxz binary, if found - -=cut - -### paths to commandline tools ### -sub bin_gzip { return $PROGRAMS->{'gzip'} if $PROGRAMS->{'gzip'} } -sub bin_unzip { return $PROGRAMS->{'unzip'} if $PROGRAMS->{'unzip'} } -sub bin_tar { return $PROGRAMS->{'tar'} if $PROGRAMS->{'tar'} } -sub bin_bunzip2 { return $PROGRAMS->{'bunzip2'} if $PROGRAMS->{'bunzip2'} } -sub bin_uncompress { return $PROGRAMS->{'uncompress'} - if $PROGRAMS->{'uncompress'} } -sub bin_unlzma { return $PROGRAMS->{'unlzma'} if $PROGRAMS->{'unlzma'} } -sub bin_unxz { return $PROGRAMS->{'unxz'} if $PROGRAMS->{'unxz'} } - -=head2 $bool = $ae->have_old_bunzip2 - -Older versions of C, from before the C release, -require all archive names to end in C<.bz2> or it will not extract -them. This method checks if you have a recent version of C -that allows any extension, or an older one that doesn't. - -=cut - -sub have_old_bunzip2 { - my $self = shift; - - ### no bunzip2? no old bunzip2 either :) - return unless $self->bin_bunzip2; - - ### if we can't run this, we can't be sure if it's too old or not - ### XXX stupid stupid stupid bunzip2 doesn't understand --version - ### is not a request to extract data: - ### $ bunzip2 --version - ### bzip2, a block-sorting file compressor. Version 1.0.2, 30-Dec-2001. - ### [...] - ### bunzip2: I won't read compressed data from a terminal. - ### bunzip2: For help, type: `bunzip2 --help'. - ### $ echo $? - ### 1 - ### HATEFUL! - - ### double hateful: bunzip2 --version also hangs if input is a pipe - ### See #32370: Archive::Extract will hang if stdin is a pipe [+PATCH] - ### So, we have to provide *another* argument which is a fake filename, - ### just so it wont try to read from stdin to print its version.. - ### *sigh* - ### Even if the file exists, it won't clobber or change it. - my $buffer; - scalar run( - command => [$self->bin_bunzip2, '--version', 'NoSuchFile'], - verbose => 0, - buffer => \$buffer - ); - - ### no output - return unless $buffer; - - my ($version) = $buffer =~ /version \s+ (\d+)/ix; - - return 1 if $version < 1; - return; -} - -################################# -# -# Untar code -# -################################# - -### annoying issue with (gnu) tar on win32, as illustrated by this -### bug: https://rt.cpan.org/Ticket/Display.html?id=40138 -### which shows that (gnu) tar will interpret a file name with a : -### in it as a remote file name, so C:\tmp\foo.txt is interpreted -### as a remote shell, and the extract fails. -{ my @ExtraTarFlags; - if( ON_WIN32 and my $cmd = __PACKAGE__->bin_tar ) { - - ### if this is gnu tar we are running, we need to use --force-local - push @ExtraTarFlags, '--force-local' if `$cmd --version` =~ /gnu tar/i; - } - - - ### use /bin/tar to extract ### - sub _untar_bin { - my $self = shift; - - ### check for /bin/tar ### - ### check for /bin/gzip if we need it ### - ### if any of the binaries are not available, return NA - { my $diag = !$self->bin_tar ? - loc("No '%1' program found", '/bin/tar') : - $self->is_tgz && !$self->bin_gzip ? - loc("No '%1' program found", '/bin/gzip') : - $self->is_tbz && !$self->bin_bunzip2 ? - loc("No '%1' program found", '/bin/bunzip2') : - $self->is_txz && !$self->bin_unxz ? - loc("No '%1' program found", '/bin/unxz') : - ''; - - if( $diag ) { - $self->_error( $diag ); - return METHOD_NA; - } - } - - ### XXX figure out how to make IPC::Run do this in one call -- - ### currently i don't know how to get output of a command after a pipe - ### trapped in a scalar. Mailed barries about this 5th of june 2004. - - ### see what command we should run, based on whether - ### it's a .tgz or .tar - - ### GNU tar can't handled VMS filespecs, but VMSTAR can handle Unix filespecs. - my $archive = $self->archive; - $archive = VMS::Filespec::unixify($archive) if ON_VMS; - - ### XXX solaris tar and bsdtar are having different outputs - ### depending whether you run with -x or -t - ### compensate for this insanity by running -t first, then -x - { my $cmd = - $self->is_tgz ? [$self->bin_gzip, '-cdf', $archive, '|', - $self->bin_tar, '-tf', '-'] : - $self->is_tbz ? [$self->bin_bunzip2, '-cd', $archive, '|', - $self->bin_tar, '-tf', '-'] : - $self->is_txz ? [$self->bin_unxz, '-cd', $archive, '|', - $self->bin_tar, '-tf', '-'] : - [$self->bin_tar, @ExtraTarFlags, '-tf', $archive]; - - ### run the command - ### newer versions of 'tar' (1.21 and up) now print record size - ### to STDERR as well if v OR t is given (used to be both). This - ### is a 'feature' according to the changelog, so we must now only - ### inspect STDOUT, otherwise, failures like these occur: - ### http://www.cpantesters.org/cpan/report/3230366 - my $buffer = ''; - my @out = run( command => $cmd, - buffer => \$buffer, - verbose => $DEBUG ); - - ### command was unsuccessful - unless( $out[0] ) { - return $self->_error(loc( - "Error listing contents of archive '%1': %2", - $archive, $buffer )); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_files( $archive ) ); - - } else { - ### if we're on solaris we /might/ be using /bin/tar, which has - ### a weird output format... we might also be using - ### /usr/local/bin/tar, which is gnu tar, which is perfectly - ### fine... so we have to do some guessing here =/ - my @files = map { chomp; - !ON_SOLARIS ? $_ - : (m|^ x \s+ # 'xtract' -- sigh - (.+?), # the actual file name - \s+ [\d,.]+ \s bytes, - \s+ [\d,.]+ \s tape \s blocks - |x ? $1 : $_); - - ### only STDOUT, see above. Sometimes, extra whitespace - ### is present, so make sure we only pick lines with - ### a length - } grep { length } map { split $/, $_ } join '', @{$out[3]}; - - ### store the files that are in the archive ### - $self->files(\@files); - } - } - - ### now actually extract it ### - { my $cmd = - $self->is_tgz ? [$self->bin_gzip, '-cdf', $archive, '|', - $self->bin_tar, '-xf', '-'] : - $self->is_tbz ? [$self->bin_bunzip2, '-cd', $archive, '|', - $self->bin_tar, '-xf', '-'] : - $self->is_txz ? [$self->bin_unxz, '-cd', $archive, '|', - $self->bin_tar, '-xf', '-'] : - [$self->bin_tar, @ExtraTarFlags, '-xf', $archive]; - - my $buffer = ''; - unless( scalar run( command => $cmd, - buffer => \$buffer, - verbose => $DEBUG ) - ) { - return $self->_error(loc("Error extracting archive '%1': %2", - $archive, $buffer )); - } - - ### we might not have them, due to lack of buffers - if( $self->files ) { - ### now that we've extracted, figure out where we extracted to - my $dir = $self->__get_extract_dir( $self->files ); - - ### store the extraction dir ### - $self->extract_path( $dir ); - } - } - - ### we got here, no error happened - return 1; - } -} - - -### use archive::tar to extract ### -sub _untar_at { - my $self = shift; - - ### Loading Archive::Tar is going to set it to 1, so make it local - ### within this block, starting with its initial value. Whatever - ### Achive::Tar does will be undone when we return. - ### - ### Also, later, set $Archive::Tar::WARN to $Archive::Extract::WARN - ### so users don't have to even think about this variable. If they - ### do, they still get their set value outside of this call. - local $Archive::Tar::WARN = $Archive::Tar::WARN; - - ### we definitely need Archive::Tar, so load that first - { my $use_list = { 'Archive::Tar' => '0.0' }; - - unless( can_load( modules => $use_list ) ) { - - $self->_error(loc("You do not have '%1' installed - " . - "Please install it as soon as possible.", - 'Archive::Tar')); - - return METHOD_NA; - } - } - - ### we might pass it a filehandle if it's a .tbz file.. - my $fh_to_read = $self->archive; - - ### we will need Compress::Zlib too, if it's a tgz... and IO::Zlib - ### if A::T's version is 0.99 or higher - if( $self->is_tgz ) { - my $use_list = { 'Compress::Zlib' => '0.0' }; - $use_list->{ 'IO::Zlib' } = '0.0' - if $Archive::Tar::VERSION >= '0.99'; - - unless( can_load( modules => $use_list ) ) { - my $which = join '/', sort keys %$use_list; - - $self->_error(loc( - "You do not have '%1' installed - Please ". - "install it as soon as possible.", $which) - ); - - return METHOD_NA; - } - - } elsif ( $self->is_tbz ) { - my $use_list = { 'IO::Uncompress::Bunzip2' => '0.0' }; - unless( can_load( modules => $use_list ) ) { - $self->_error(loc( - "You do not have '%1' installed - Please " . - "install it as soon as possible.", - 'IO::Uncompress::Bunzip2') - ); - - return METHOD_NA; - } - - my $bz = IO::Uncompress::Bunzip2->new( $self->archive ) or - return $self->_error(loc("Unable to open '%1': %2", - $self->archive, - $IO::Uncompress::Bunzip2::Bunzip2Error)); - - $fh_to_read = $bz; - } elsif ( $self->is_txz ) { - my $use_list = { 'IO::Uncompress::UnXz' => '0.0' }; - unless( can_load( modules => $use_list ) ) { - $self->_error(loc( - "You do not have '%1' installed - Please " . - "install it as soon as possible.", - 'IO::Uncompress::UnXz') - ); - - return METHOD_NA; - } - - my $xz = IO::Uncompress::UnXz->new( $self->archive ) or - return $self->_error(loc("Unable to open '%1': %2", - $self->archive, - $IO::Uncompress::UnXz::UnXzError)); - - $fh_to_read = $xz; - } - - my @files; - { - ### $Archive::Tar::WARN is 1 by default in Archive::Tar, but we've - ### localized $Archive::Tar::WARN already. - $Archive::Tar::WARN = $Archive::Extract::WARN; - - ### only tell it it's compressed if it's a .tgz, as we give it a file - ### handle if it's a .tbz - my @read = ( $fh_to_read, ( $self->is_tgz ? 1 : 0 ) ); - - ### for version of Archive::Tar > 1.04 - local $Archive::Tar::CHOWN = 0; - - ### use the iterator if we can. it's a feature of A::T 1.40 and up - if ( $_ALLOW_TAR_ITER && Archive::Tar->can( 'iter' ) ) { - - my $next; - unless ( $next = Archive::Tar->iter( @read ) ) { - return $self->_error(loc( - "Unable to read '%1': %2", $self->archive, - $Archive::Tar::error)); - } - - while ( my $file = $next->() ) { - push @files, $file->full_path; - - $file->extract or return $self->_error(loc( - "Unable to read '%1': %2", - $self->archive, - $Archive::Tar::error)); - } - - ### older version, read the archive into memory - } else { - - my $tar = Archive::Tar->new(); - - unless( $tar->read( @read ) ) { - return $self->_error(loc("Unable to read '%1': %2", - $self->archive, $Archive::Tar::error)); - } - - ### workaround to prevent Archive::Tar from setting uid, which - ### is a potential security hole. -autrijus - ### have to do it here, since A::T needs to be /loaded/ first ### - { no strict 'refs'; local $^W; - - ### older versions of archive::tar <= 0.23 - *Archive::Tar::chown = sub {}; - } - - { local $^W; # quell 'splice() offset past end of array' warnings - # on older versions of A::T - - ### older archive::tar always returns $self, return value - ### slightly fux0r3d because of it. - $tar->extract or return $self->_error(loc( - "Unable to extract '%1': %2", - $self->archive, $Archive::Tar::error )); - } - - @files = $tar->list_files; - } - } - - my $dir = $self->__get_extract_dir( \@files ); - - ### store the files that are in the archive ### - $self->files(\@files); - - ### store the extraction dir ### - $self->extract_path( $dir ); - - ### check if the dir actually appeared ### - return 1 if -d $self->extract_path; - - ### no dir, we failed ### - return $self->_error(loc("Unable to extract '%1': %2", - $self->archive, $Archive::Tar::error )); -} - -################################# -# -# Gunzip code -# -################################# - -sub _gunzip_bin { - my $self = shift; - - ### check for /bin/gzip -- we need it ### - unless( $self->bin_gzip ) { - $self->_error(loc("No '%1' program found", '/bin/gzip')); - return METHOD_NA; - } - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - my $cmd = [ $self->bin_gzip, '-cdf', $self->archive ]; - - my $buffer; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to gunzip '%1': %2", - $self->archive, $buffer)); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_content( $self->archive ) ); - } - - $self->_print($fh, $buffer) if defined $buffer; - - close $fh; - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -sub _gunzip_cz { - my $self = shift; - - my $use_list = { 'Compress::Zlib' => '0.0' }; - unless( can_load( modules => $use_list ) ) { - $self->_error(loc("You do not have '%1' installed - Please " . - "install it as soon as possible.", 'Compress::Zlib')); - return METHOD_NA; - } - - my $gz = Compress::Zlib::gzopen( $self->archive, "rb" ) or - return $self->_error(loc("Unable to open '%1': %2", - $self->archive, $Compress::Zlib::gzerrno)); - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - my $buffer; - $self->_print($fh, $buffer) while $gz->gzread($buffer) > 0; - $fh->close; - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -################################# -# -# Uncompress code -# -################################# - -sub _uncompress_bin { - my $self = shift; - - ### check for /bin/gzip -- we need it ### - unless( $self->bin_uncompress ) { - $self->_error(loc("No '%1' program found", '/bin/uncompress')); - return METHOD_NA; - } - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - my $cmd = [ $self->bin_uncompress, '-c', $self->archive ]; - - my $buffer; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to uncompress '%1': %2", - $self->archive, $buffer)); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_content( $self->archive ) ); - } - - $self->_print($fh, $buffer) if defined $buffer; - - close $fh; - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - - -################################# -# -# Unzip code -# -################################# - - -sub _unzip_bin { - my $self = shift; - - ### check for /bin/gzip if we need it ### - unless( $self->bin_unzip ) { - $self->_error(loc("No '%1' program found", '/bin/unzip')); - return METHOD_NA; - } - - ### first, get the files.. it must be 2 different commands with 'unzip' :( - { ### on VMS, capital letter options have to be quoted. This is - ### reported by John Malmberg on P5P Tue 21 Aug 2007 05:05:11 - ### Subject: [patch@31735]Archive Extract fix on VMS. - my $opt = ON_VMS ? '"-Z"' : '-Z'; - my $cmd = [ $self->bin_unzip, $opt, '-1', $self->archive ]; - - my $buffer = ''; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to unzip '%1': %2", - $self->archive, $buffer)); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_files( $self->archive ) ); - - } else { - ### Annoyingly, pesky MSWin32 can either have 'native' tools - ### which have \r\n line endings or Cygwin-based tools which - ### have \n line endings. Jan Dubois suggested using this fix - local $/ = ON_WIN32 ? qr/\r?\n/ : "\n"; - $self->files( [split $/, $buffer] ); - } - } - - ### now, extract the archive ### - { my $cmd = [ $self->bin_unzip, '-qq', '-o', $self->archive ]; - - my $buffer; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to unzip '%1': %2", - $self->archive, $buffer)); - } - - if( scalar @{$self->files} ) { - my $files = $self->files; - my $dir = $self->__get_extract_dir( $files ); - - $self->extract_path( $dir ); - } - } - - return 1; -} - -sub _unzip_az { - my $self = shift; - - my $use_list = { 'Archive::Zip' => '0.0' }; - unless( can_load( modules => $use_list ) ) { - $self->_error(loc("You do not have '%1' installed - Please " . - "install it as soon as possible.", 'Archive::Zip')); - return METHOD_NA; - } - - my $zip = Archive::Zip->new(); - - unless( $zip->read( $self->archive ) == &Archive::Zip::AZ_OK ) { - return $self->_error(loc("Unable to read '%1'", $self->archive)); - } - - my @files; - - - ### Address: #43278: Explicitly tell Archive::Zip where to put the files: - ### "In my BackPAN indexing, Archive::Zip was extracting things - ### in my script's directory instead of the current working directory. - ### I traced this back through Archive::Zip::_asLocalName which - ### eventually calls File::Spec::Win32::rel2abs which on Windows might - ### call Cwd::getdcwd. getdcwd returns the wrong directory in my - ### case, even though I think I'm on the same drive. - ### - ### To fix this, I pass the optional second argument to - ### extractMember using the cwd from Archive::Extract." --bdfoy - - ## store cwd() before looping; calls to cwd() can be expensive, and - ### it won't change during the loop - my $extract_dir = cwd(); - - ### have to extract every member individually ### - for my $member ($zip->members) { - push @files, $member->{fileName}; - - ### file to extract to, to avoid the above problem - my $to = File::Spec->catfile( $extract_dir, $member->{fileName} ); - - unless( $zip->extractMember($member, $to) == &Archive::Zip::AZ_OK ) { - return $self->_error(loc("Extraction of '%1' from '%2' failed", - $member->{fileName}, $self->archive )); - } - } - - my $dir = $self->__get_extract_dir( \@files ); - - ### set what files where extract, and where they went ### - $self->files( \@files ); - $self->extract_path( File::Spec->rel2abs($dir) ); - - return 1; -} - -sub __get_extract_dir { - my $self = shift; - my $files = shift || []; - - return unless scalar @$files; - - my($dir1, $dir2); - for my $aref ( [ \$dir1, 0 ], [ \$dir2, -1 ] ) { - my($dir,$pos) = @$aref; - - ### add a catdir(), so that any trailing slashes get - ### take care of (removed) - ### also, a catdir() normalises './dir/foo' to 'dir/foo'; - ### which was the problem in bug #23999 - my $res = -d $files->[$pos] - ? File::Spec->catdir( $files->[$pos], '' ) - : File::Spec->catdir( dirname( $files->[$pos] ) ); - - $$dir = $res; - } - - ### if the first and last dir don't match, make sure the - ### dirname is not set wrongly - my $dir; - - ### dirs are the same, so we know for sure what the extract dir is - if( $dir1 eq $dir2 ) { - $dir = $dir1; - - ### dirs are different.. do they share the base dir? - ### if so, use that, if not, fall back to '.' - } else { - my $base1 = [ File::Spec->splitdir( $dir1 ) ]->[0]; - my $base2 = [ File::Spec->splitdir( $dir2 ) ]->[0]; - - $dir = File::Spec->rel2abs( $base1 eq $base2 ? $base1 : '.' ); - } - - return File::Spec->rel2abs( $dir ); -} - -################################# -# -# Bunzip2 code -# -################################# - -sub _bunzip2_bin { - my $self = shift; - - ### check for /bin/gzip -- we need it ### - unless( $self->bin_bunzip2 ) { - $self->_error(loc("No '%1' program found", '/bin/bunzip2')); - return METHOD_NA; - } - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - ### guard against broken bunzip2. See ->have_old_bunzip2() - ### for details - if( $self->have_old_bunzip2 and $self->archive !~ /\.bz2$/i ) { - return $self->_error(loc("Your bunzip2 version is too old and ". - "can only extract files ending in '%1'", - '.bz2')); - } - - my $cmd = [ $self->bin_bunzip2, '-cd', $self->archive ]; - - my $buffer; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to bunzip2 '%1': %2", - $self->archive, $buffer)); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_content( $self->archive ) ); - } - - $self->_print($fh, $buffer) if defined $buffer; - - close $fh; - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -### using cz2, the compact versions... this we use mainly in archive::tar -### extractor.. -# sub _bunzip2_cz1 { -# my $self = shift; -# -# my $use_list = { 'IO::Uncompress::Bunzip2' => '0.0' }; -# unless( can_load( modules => $use_list ) ) { -# return $self->_error(loc("You do not have '%1' installed - Please " . -# "install it as soon as possible.", -# 'IO::Uncompress::Bunzip2')); -# } -# -# my $bz = IO::Uncompress::Bunzip2->new( $self->archive ) or -# return $self->_error(loc("Unable to open '%1': %2", -# $self->archive, -# $IO::Uncompress::Bunzip2::Bunzip2Error)); -# -# my $fh = FileHandle->new('>'. $self->_gunzip_to) or -# return $self->_error(loc("Could not open '%1' for writing: %2", -# $self->_gunzip_to, $! )); -# -# my $buffer; -# $fh->print($buffer) while $bz->read($buffer) > 0; -# $fh->close; -# -# ### set what files where extract, and where they went ### -# $self->files( [$self->_gunzip_to] ); -# $self->extract_path( File::Spec->rel2abs(cwd()) ); -# -# return 1; -# } - -sub _bunzip2_bz2 { - my $self = shift; - - my $use_list = { 'IO::Uncompress::Bunzip2' => '0.0' }; - unless( can_load( modules => $use_list ) ) { - $self->_error(loc("You do not have '%1' installed - Please " . - "install it as soon as possible.", - 'IO::Uncompress::Bunzip2')); - return METHOD_NA; - } - - IO::Uncompress::Bunzip2::bunzip2($self->archive => $self->_gunzip_to) - or return $self->_error(loc("Unable to uncompress '%1': %2", - $self->archive, - $IO::Uncompress::Bunzip2::Bunzip2Error)); - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -################################# -# -# UnXz code -# -################################# - -sub _unxz_bin { - my $self = shift; - - ### check for /bin/unxz -- we need it ### - unless( $self->bin_unxz ) { - $self->_error(loc("No '%1' program found", '/bin/unxz')); - return METHOD_NA; - } - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - my $cmd = [ $self->bin_unxz, '-cdf', $self->archive ]; - - my $buffer; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to unxz '%1': %2", - $self->archive, $buffer)); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_content( $self->archive ) ); - } - - $self->_print($fh, $buffer) if defined $buffer; - - close $fh; - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -sub _unxz_cz { - my $self = shift; - - my $use_list = { 'IO::Uncompress::UnXz' => '0.0' }; - unless( can_load( modules => $use_list ) ) { - $self->_error(loc("You do not have '%1' installed - Please " . - "install it as soon as possible.", - 'IO::Uncompress::UnXz')); - return METHOD_NA; - } - - IO::Uncompress::UnXz::unxz($self->archive => $self->_gunzip_to) - or return $self->_error(loc("Unable to uncompress '%1': %2", - $self->archive, - $IO::Uncompress::UnXz::UnXzError)); - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - - -################################# -# -# unlzma code -# -################################# - -sub _unlzma_bin { - my $self = shift; - - ### check for /bin/unlzma -- we need it ### - unless( $self->bin_unlzma ) { - $self->_error(loc("No '%1' program found", '/bin/unlzma')); - return METHOD_NA; - } - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - my $cmd = [ $self->bin_unlzma, '-c', $self->archive ]; - - my $buffer; - unless( scalar run( command => $cmd, - verbose => $DEBUG, - buffer => \$buffer ) - ) { - return $self->_error(loc("Unable to unlzma '%1': %2", - $self->archive, $buffer)); - } - - ### no buffers available? - if( !IPC::Cmd->can_capture_buffer and !$buffer ) { - $self->_error( $self->_no_buffer_content( $self->archive ) ); - } - - $self->_print($fh, $buffer) if defined $buffer; - - close $fh; - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -sub _unlzma_cz { - my $self = shift; - - my $use_list1 = { 'IO::Uncompress::UnLzma' => '0.0' }; - my $use_list2 = { 'Compress::unLZMA' => '0.0' }; - - if (can_load( modules => $use_list1 ) ) { - IO::Uncompress::UnLzma::unlzma($self->archive => $self->_gunzip_to) - or return $self->_error(loc("Unable to uncompress '%1': %2", - $self->archive, - $IO::Uncompress::UnLzma::UnLzmaError)); - } - elsif (can_load( modules => $use_list2 ) ) { - - my $fh = FileHandle->new('>'. $self->_gunzip_to) or - return $self->_error(loc("Could not open '%1' for writing: %2", - $self->_gunzip_to, $! )); - - my $buffer; - $buffer = Compress::unLZMA::uncompressfile( $self->archive ); - unless ( defined $buffer ) { - return $self->_error(loc("Could not unlzma '%1': %2", - $self->archive, $@)); - } - - $self->_print($fh, $buffer) if defined $buffer; - - close $fh; - } - else { - $self->_error(loc("You do not have '%1' or '%2' installed - Please " . - "install it as soon as possible.", 'Compress::unLZMA', 'IO::Uncompress::UnLzma')); - return METHOD_NA; - } - - ### set what files where extract, and where they went ### - $self->files( [$self->_gunzip_to] ); - $self->extract_path( File::Spec->rel2abs(cwd()) ); - - return 1; -} - -################################# -# -# Error code -# -################################# - -# For printing binaries that avoids interfering globals -sub _print { - my $self = shift; - my $fh = shift; - - local( $\, $", $, ) = ( undef, ' ', '' ); - return print $fh @_; -} - -sub _error { - my $self = shift; - my $error = shift; - my $lerror = Carp::longmess($error); - - push @{$self->_error_msg}, $error; - push @{$self->_error_msg_long}, $lerror; - - ### set $Archive::Extract::WARN to 0 to disable printing - ### of errors - if( $WARN ) { - carp $DEBUG ? $lerror : $error; - } - - return; -} - -sub error { - my $self = shift; - - ### make sure we have a fallback aref - my $aref = do { - shift() - ? $self->_error_msg_long - : $self->_error_msg - } || []; - - return join $/, @$aref; -} - -=head2 debug( MESSAGE ) - -This method outputs MESSAGE to the default filehandle if C<$DEBUG> is -true. It's a small method, but it's here if you'd like to subclass it -so you can so something else with any debugging output. - -=cut - -### this is really a stub for subclassing -sub debug { - return unless $DEBUG; - - print $_[1]; -} - -sub _no_buffer_files { - my $self = shift; - my $file = shift or return; - return loc("No buffer captured, unable to tell ". - "extracted files or extraction dir for '%1'", $file); -} - -sub _no_buffer_content { - my $self = shift; - my $file = shift or return; - return loc("No buffer captured, unable to get content for '%1'", $file); -} -1; - -=pod - -=head1 HOW IT WORKS - -C tries first to determine what type of archive you -are passing it, by inspecting its suffix. It does not do this by using -Mime magic, or something related. See C below. - -Once it has determined the file type, it knows which extraction methods -it can use on the archive. It will try a perl solution first, then fall -back to a commandline tool if that fails. If that also fails, it will -return false, indicating it was unable to extract the archive. -See the section on C to see how to alter this order. - -=head1 CAVEATS - -=head2 File Extensions - -C trusts on the extension of the archive to determine -what type it is, and what extractor methods therefore can be used. If -your archives do not have any of the extensions as described in the -C method, you will have to specify the type explicitly, or -C will not be able to extract the archive for you. - -=head2 Supporting Very Large Files - -C can use either pure perl modules or command line -programs under the hood. Some of the pure perl modules (like -C and Compress::unLZMA) take the entire contents of the archive into memory, -which may not be feasible on your system. Consider setting the global -variable C<$Archive::Extract::PREFER_BIN> to C<1>, which will prefer -the use of command line programs and won't consume so much memory. - -See the C section below for details. - -=head2 Bunzip2 support of arbitrary extensions. - -Older versions of C do not support arbitrary file -extensions and insist on a C<.bz2> suffix. Although we do our best -to guard against this, if you experience a bunzip2 error, it may -be related to this. For details, please see the C -method. - -=head1 GLOBAL VARIABLES - -=head2 $Archive::Extract::DEBUG - -Set this variable to C to have all calls to command line tools -be printed out, including all their output. -This also enables C errors, instead of the regular -C errors. - -Good for tracking down why things don't work with your particular -setup. - -Defaults to C. - -=head2 $Archive::Extract::WARN - -This variable controls whether errors encountered internally by -C should be C'd or not. - -Set to false to silence warnings. Inspect the output of the C -method manually to see what went wrong. - -Defaults to C. - -=head2 $Archive::Extract::PREFER_BIN - -This variables controls whether C should prefer the -use of perl modules, or commandline tools to extract archives. - -Set to C to have C prefer commandline tools. - -Defaults to C. - -=head1 TODO / CAVEATS - -=over 4 - -=item Mime magic support - -Maybe this module should use something like C to determine -the type, rather than blindly trust the suffix. - -=item Thread safety - -Currently, C does a C to the extraction dir before -extraction, and a C back again after. This is not necessarily -thread safe. See C bug C<#45671> for details. - -=back - -=head1 BUG REPORTS - -Please report bugs or other issues to Ebug-archive-extract@rt.cpan.orgE. - -=head1 AUTHOR - -This module by Jos Boumans Ekane@cpan.orgE. - -=head1 COPYRIGHT - -This library is free software; you may redistribute and/or modify it -under the same terms as Perl itself. - -=cut - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: - diff --git a/Master/tlpkg/tlperl/lib/Archive/Tar.pm b/Master/tlpkg/tlperl/lib/Archive/Tar.pm index dd4b968acd3..50afbb334b9 100644 --- a/Master/tlpkg/tlperl/lib/Archive/Tar.pm +++ b/Master/tlpkg/tlperl/lib/Archive/Tar.pm @@ -23,7 +23,7 @@ require Exporter; use strict; use vars qw[$DEBUG $error $VERSION $WARN $FOLLOW_SYMLINK $CHOWN $CHMOD $DO_NOT_USE_PREFIX $HAS_PERLIO $HAS_IO_STRING $SAME_PERMISSIONS - $INSECURE_EXTRACT_MODE $ZERO_PAD_NUMBERS @ISA @EXPORT + $INSECURE_EXTRACT_MODE $ZERO_PAD_NUMBERS @ISA @EXPORT $RESOLVE_SYMLINK ]; @ISA = qw[Exporter]; @@ -31,13 +31,14 @@ use vars qw[$DEBUG $error $VERSION $WARN $FOLLOW_SYMLINK $CHOWN $CHMOD $DEBUG = 0; $WARN = 1; $FOLLOW_SYMLINK = 0; -$VERSION = "1.90"; +$VERSION = "1.96"; $CHOWN = 1; $CHMOD = 1; $SAME_PERMISSIONS = $> == 0 ? 1 : 0; $DO_NOT_USE_PREFIX = 0; $INSECURE_EXTRACT_MODE = 0; $ZERO_PAD_NUMBERS = 0; +$RESOLVE_SYMLINK = $ENV{'PERL5_AT_RESOLVE_SYMLINK'} || 'speed'; BEGIN { use Config; @@ -485,7 +486,7 @@ sub _read_tar { ### but that doesn't *always* happen.. so check if the last ### character is a control character, and if so remove it ### at any rate, we better remove that character here, or tests - ### like 'eq' and hashlook ups based on names will SO not work + ### like 'eq' and hash lookups based on names will SO not work ### remove it by calculating the proper size, and then ### tossing out everything that's longer than that size. @@ -956,7 +957,7 @@ sub _extract_special_file_as_plain_file { my $err; TRY: { - my $orig = $self->_find_entry( $entry->linkname ); + my $orig = $self->_find_entry( $entry->linkname, $entry ); unless( $orig ) { $err = qq[Could not find file '] . $entry->linkname . @@ -965,7 +966,7 @@ sub _extract_special_file_as_plain_file { } ### clone the entry, make it appear as a normal file ### - my $clone = $entry->clone; + my $clone = $orig->clone; $clone->_downgrade_to_plainfile; $self->_extract_file( $clone, $file ) or last TRY; @@ -1030,10 +1031,46 @@ sub _find_entry { ### it's an object already return $file if UNIVERSAL::isa( $file, 'Archive::Tar::File' ); - for my $entry ( @{$self->_data} ) { - my $path = $entry->full_path; - return $entry if $path eq $file; - } +seach_entry: + if($self->_data){ + for my $entry ( @{$self->_data} ) { + my $path = $entry->full_path; + return $entry if $path eq $file; + } + } + + if($Archive::Tar::RESOLVE_SYMLINK!~/none/){ + if(my $link_entry = shift()){#fallback mode when symlinks are using relative notations ( ../a/./b/text.bin ) + $file = _symlinks_resolver( $link_entry->name, $file ); + goto seach_entry if $self->_data; + + #this will be slower than never, but won't failed! + + my $iterargs = $link_entry->{'_archive'}; + if($Archive::Tar::RESOLVE_SYMLINK=~/speed/ && @$iterargs==3){ + #faster but whole archive will be read in memory + #read whole archive and share data + my $archive = Archive::Tar->new; + $archive->read( @$iterargs ); + push @$iterargs, $archive; #take a trace for destruction + if($archive->_data){ + $self->_data( $archive->_data ); + goto seach_entry; + } + }#faster + + {#slower but lower memory usage + # $iterargs = [$filename, $compressed, $opts]; + my $next = Archive::Tar->iter( @$iterargs ); + while(my $e = $next->()){ + if($e->full_path eq $file){ + undef $next; + return $e; + } + } + }#slower + } + } $self->_error( qq[No such file in archive: '$file'] ); return; @@ -1553,7 +1590,7 @@ sub add_data { =head2 $tar->error( [$BOOL] ) -Returns the current errorstring (usually, the last error reported). +Returns the current error string (usually, the last error reported). If a true value was specified, it will give the C equivalent of the error, in effect giving you a stacktrace. @@ -1729,6 +1766,7 @@ sub iter { ) or return; my @data; + my $CONSTRUCT_ARGS = [ $filename, $compressed, $opts ]; return sub { return shift(@data) if @data; # more than one file returned? return unless $handle; # handle exhausted? @@ -1736,12 +1774,25 @@ sub iter { ### read data, should only return file my $tarfile = $class->_read_tar($handle, { %$opts, limit => 1 }); @data = @$tarfile if ref $tarfile && ref $tarfile eq 'ARRAY'; + if($Archive::Tar::RESOLVE_SYMLINK!~/none/){ + foreach(@data){ + #may refine this heuristic for ON_UNIX? + if($_->linkname){ + #is there a better slot to store/share it ? + $_->{'_archive'} = $CONSTRUCT_ARGS; + } + } + } ### return one piece of data return shift(@data) if @data; ### data is exhausted, free the filehandle undef $handle; + if(@$CONSTRUCT_ARGS == 4){ + #free archive in memory + undef $CONSTRUCT_ARGS->[-1]; + } return; }; } @@ -1865,6 +1916,32 @@ sub no_string_support { croak("You have to install IO::String to support writing archives to strings"); } +sub _symlinks_resolver{ + my ($src, $trg) = @_; + my @src = split /[\/\\]/, $src; + my @trg = split /[\/\\]/, $trg; + pop @src; #strip out current object name + if(@trg and $trg[0] eq ''){ + shift @trg; + #restart path from scratch + @src = ( ); + } + foreach my $part ( @trg ){ + next if $part eq '.'; #ignore current + if($part eq '..'){ + #got to parent + pop @src; + } + else{ + #append it + push @src, $part; + } + } + my $path = join('/', @src); + warn "_symlinks_resolver('$src','$trg') = $path" if $DEBUG; + return $path; +} + 1; __END__ @@ -2007,6 +2084,30 @@ zero padded numbers for C, C and C. The default is C<0>, indicating that we will create space padded numbers. Added for compatibility with C implementations. +=head2 Tuning the way RESOLVE_SYMLINK will works + + You can tune the behaviour by setting the $Archive::Tar::RESOLVE_SYMLINK variable, + or $ENV{PERL5_AT_RESOLVE_SYMLINK} before loading the module Archive::Tar. + + Values can be one of the following: + + none + Disable this mechanism and failed as it was in previous version (<1.88) + + speed (default) + If you prefer speed + this will read again the whole archive using read() so all entries + will be available + + memory + If you prefer memory + + Limitation + + It won't work for terminal, pipe or sockets or every non seekable source. + +=cut + =head1 FAQ =over 4 diff --git a/Master/tlpkg/tlperl/lib/Archive/Tar/Constant.pm b/Master/tlpkg/tlperl/lib/Archive/Tar/Constant.pm index 7839c6dc5cb..957ac278adc 100644 --- a/Master/tlpkg/tlperl/lib/Archive/Tar/Constant.pm +++ b/Master/tlpkg/tlperl/lib/Archive/Tar/Constant.pm @@ -3,14 +3,13 @@ package Archive::Tar::Constant; BEGIN { require Exporter; - $VERSION = '1.90'; + $VERSION = '1.96'; @ISA = qw[Exporter]; require Time::Local if $^O eq "MacOS"; } -use Package::Constants; -@EXPORT = Package::Constants->list( __PACKAGE__ ); +@EXPORT = Archive::Tar::Constant->_list_consts( __PACKAGE__ ); use constant FILE => 0; use constant HARDLINK => 1; @@ -83,4 +82,29 @@ use constant CAN_READLINK => ($^O ne 'MSWin32' and $^O !~ /RISC(?:[ _])?OS/i a use constant ON_UNIX => ($^O ne 'MSWin32' and $^O ne 'MacOS' and $^O ne 'VMS'); use constant ON_VMS => $^O eq 'VMS'; +sub _list_consts { + my $class = shift; + my $pkg = shift; + return unless defined $pkg; # some joker might use '0' as a pkg... + + my @rv; + { no strict 'refs'; + my $stash = $pkg . '::'; + + for my $name (sort keys %$stash ) { + + ### is it a subentry? + my $sub = $pkg->can( $name ); + next unless defined $sub; + + next unless defined prototype($sub) and + not length prototype($sub); + + push @rv, $name; + } + } + + return sort @rv; +} + 1; diff --git a/Master/tlpkg/tlperl/lib/Archive/Tar/File.pm b/Master/tlpkg/tlperl/lib/Archive/Tar/File.pm index de01e0513d4..39fca623fab 100644 --- a/Master/tlpkg/tlperl/lib/Archive/Tar/File.pm +++ b/Master/tlpkg/tlperl/lib/Archive/Tar/File.pm @@ -13,7 +13,7 @@ use Archive::Tar::Constant; use vars qw[@ISA $VERSION]; #@ISA = qw[Archive::Tar]; -$VERSION = '1.90'; +$VERSION = '1.96'; ### set value to 1 to oct() it during the unpack ### @@ -224,7 +224,7 @@ sub _new_from_chunk { if(substr($entry{'size'}, 0, 1) eq "\x80") { # binary size extension for files >8gigs (> octal 77777777777777) # cdrake - my @sz=unpack("aCSNN",$entry{'size'}); $entry{'size'}=$sz[4]+(2**32)*$sz[3]+$sz[2]*(2**64); # Use the low 80 bits (should use the upper 15 as well, but as at year 2011, that seems unlikley to ever be needed - the numbers are just too big...) # cdrake + my @sz=unpack("aCSNN",$entry{'size'}); $entry{'size'}=$sz[4]+(2**32)*$sz[3]+$sz[2]*(2**64); # Use the low 80 bits (should use the upper 15 as well, but as at year 2011, that seems unlikely to ever be needed - the numbers are just too big...) # cdrake } else { # cdrake ($entry{'size'})=($entry{'size'}=~/^([^\0]*)/); $entry{'size'}=oct $entry{'size'}; # cdrake } # cdrake @@ -481,7 +481,7 @@ concatenation of the C and C fields. sub full_path { my $self = shift; - ### if prefix field is emtpy + ### if prefix field is empty return $self->name unless defined $self->prefix and length $self->prefix; ### or otherwise, catfile'd diff --git a/Master/tlpkg/tlperl/lib/Attribute/Handlers.pm b/Master/tlpkg/tlperl/lib/Attribute/Handlers.pm index 60ee32a59c0..4ae65d9edb0 100644 --- a/Master/tlpkg/tlperl/lib/Attribute/Handlers.pm +++ b/Master/tlpkg/tlperl/lib/Attribute/Handlers.pm @@ -4,7 +4,7 @@ use Carp; use warnings; use strict; use vars qw($VERSION $AUTOLOAD); -$VERSION = '0.94'; # remember to update version in POD! +$VERSION = '0.96'; # remember to update version in POD! # $DB::single=1; my %symcache; @@ -266,8 +266,7 @@ Attribute::Handlers - Simpler definition of attribute handlers =head1 VERSION -This document describes version 0.93 of Attribute::Handlers, -released July 20, 2011. +This document describes version 0.96 of Attribute::Handlers. =head1 SYNOPSIS @@ -878,7 +877,7 @@ C, C, C, C, or C. =item C A handler for attributes of the specified name I defined, but not -for the specified type of declaration. Typically encountered whe trying +for the specified type of declaration. Typically encountered when trying to apply a C attribute handler to a subroutine, or a C attribute handler to some other type of variable. @@ -931,6 +930,6 @@ Bug reports and other feedback are most welcome. =head1 COPYRIGHT AND LICENSE - Copyright (c) 2001-2009, Damian Conway. All Rights Reserved. + Copyright (c) 2001-2014, Damian Conway. All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself. diff --git a/Master/tlpkg/tlperl/lib/AutoLoader.pm b/Master/tlpkg/tlperl/lib/AutoLoader.pm index 955f852cbf3..5546f9e9953 100644 --- a/Master/tlpkg/tlperl/lib/AutoLoader.pm +++ b/Master/tlpkg/tlperl/lib/AutoLoader.pm @@ -15,7 +15,7 @@ BEGIN { $is_epoc = $^O eq 'epoc'; $is_vms = $^O eq 'VMS'; $is_macos = $^O eq 'MacOS'; - $VERSION = '5.73'; + $VERSION = '5.74'; } AUTOLOAD { @@ -400,7 +400,7 @@ This package has the same copyright and license as the perl core: Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2011, 2012 + 2011, 2012, 2013 by Larry Wall and others All rights reserved. diff --git a/Master/tlpkg/tlperl/lib/B.pm b/Master/tlpkg/tlperl/lib/B.pm index 881b68b4e0e..952475db2c2 100644 --- a/Master/tlpkg/tlperl/lib/B.pm +++ b/Master/tlpkg/tlperl/lib/B.pm @@ -15,7 +15,7 @@ require Exporter; # walkoptree comes from B.xs BEGIN { - $B::VERSION = '1.42_02'; + $B::VERSION = '1.48'; @B::EXPORT_OK = (); # Our BOOT code needs $VERSION set, and will append to @EXPORT_OK. @@ -48,6 +48,7 @@ push @B::EXPORT_OK, (qw(minus_c ppname save_BEGINs @B::PVNV::ISA = qw(B::PVIV B::NV); @B::PVMG::ISA = 'B::PVNV'; @B::REGEXP::ISA = 'B::PVMG' if $] >= 5.011; +@B::INVLIST::ISA = 'B::PV' if $] >= 5.019; @B::PVLV::ISA = 'B::GV'; @B::BM::ISA = 'B::GV'; @B::AV::ISA = 'B::PVMG'; @@ -89,11 +90,13 @@ sub B::GV::SAFENAME { # The regex below corresponds to the isCONTROLVAR macro # from toke.c - $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^". - chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e; + $name =~ s/^\c?/^?/ + or $name =~ s/^([\cA-\cZ\c\\c[\c]\c_\c^])/ + "^" . chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e; # When we say unicode_to_native we really mean ascii_to_native, - # which matters iff this is a non-ASCII platform (EBCDIC). + # which matters iff this is a non-ASCII platform (EBCDIC). '\c?' would + # not have to be special cased, except for non-ASCII. return $name; } @@ -428,7 +431,9 @@ Returns the AV object (i.e. in class B::AV) representing END blocks. =item comppadlist -Returns the AV object (i.e. in class B::AV) of the global comppadlist. +Returns the PADLIST object (i.e. in class B::PADLIST) of the global +comppadlist. In Perl 5.16 and earlier it returns an AV object (class +B::AV). =item regex_padav @@ -1000,6 +1005,9 @@ in with the main SV flags, so this method is no longer present. =item PADLIST +Returns a B::PADLIST object under Perl 5.18 or higher, or a B::AV in +earlier versions. + =item OUTSIDE =item OUTSIDE_SEQ @@ -1067,7 +1075,7 @@ underlying C "inheritance": / \ B::LOOP B::PMOP -Access methods correspond to the underlying C structre field names, +Access methods correspond to the underlying C structure field names, with the leading "class indication" prefix (C<"op_">) removed. =head2 B::OP Methods @@ -1239,6 +1247,30 @@ Since perl 5.17.1 =back +=head2 OTHER CLASSES + +Perl 5.18 introduces a new class, B::PADLIST, returned by B::CV's +C method. + +=head2 B::PADLIST Methods + +=over 4 + +=item MAX + +=item ARRAY + +A list of pads. The first one contains the names. These are currently +B::AV objects, but that is likely to change in future versions. + +=item ARRAYelt + +Like C, but takes an index as an argument to get only one element, +rather than a list of all of them. + +=item REFCNT + +=back =head2 $B::overlay diff --git a/Master/tlpkg/tlperl/lib/B/Concise.pm b/Master/tlpkg/tlperl/lib/B/Concise.pm index 59d11272a13..6c818a4e463 100644 --- a/Master/tlpkg/tlperl/lib/B/Concise.pm +++ b/Master/tlpkg/tlperl/lib/B/Concise.pm @@ -14,7 +14,7 @@ use warnings; # uses #3 and #4, since warnings uses Carp use Exporter (); # use #5 -our $VERSION = "0.95_01"; +our $VERSION = "0.992"; our @ISA = qw(Exporter); our @EXPORT_OK = qw( set_style set_style_standard add_callback concise_subref concise_cv concise_main @@ -46,7 +46,8 @@ my %style = "gt_#seq ", "(?(#seq)?)#noise#arg(?([#targarg])?)"], "debug" => - ["#class (#addr)\n\top_next\t\t#nextaddr\n\top_sibling\t#sibaddr\n\t" + ["#class (#addr)\n\top_next\t\t#nextaddr\n\t(?(op_other\t#otheraddr\n\t)?)" + . "op_sibling\t#sibaddr\n\t" . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n" . "\top_flags\t#flagval\n\top_private\t#privval\t#hintsval\n" . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)" @@ -594,75 +595,70 @@ sub fmt_line { # generate text-line for op. our %priv; # used to display each opcode's BASEOP.op_private values $priv{$_}{128} = "LVINTRO" - for ("pos", "substr", "vec", "threadsv", "gvsv", "rv2sv", "rv2hv", "rv2gv", - "rv2av", "rv2arylen", "aelem", "helem", "aslice", "hslice", "padsv", - "padav", "padhv", "enteriter", "entersub", "padrange", "pushmark"); -$priv{$_}{64} = "REFC" for ("leave", "leavesub", "leavesublv", "leavewrite"); -$priv{"aassign"}{64} = "COMMON"; -$priv{"aassign"}{32} = "STATE"; -$priv{"sassign"}{32} = "STATE"; -$priv{"sassign"}{64} = "BKWARD"; -$priv{"sassign"}{128}= "CV2GV"; -$priv{$_}{64} = "RTIME" for ("match", "subst", "substcont", "qr"); -@{$priv{"trans"}}{1,2,4,8,16,64} = ("UTF", "IDENT", "SQUASH", "DEL", - "COMPL", "GROWS"); -$priv{transr} = $priv{trans}; -$priv{"repeat"}{64} = "DOLIST"; -$priv{"leaveloop"}{64} = "CONT"; -$priv{$_}{4} = "DREFed" for (qw(rv2sv rv2av rv2hv)); -@{$priv{$_}}{32,64,96} = ("DREFAV", "DREFHV", "DREFSV") - for (qw(rv2gv rv2sv padsv aelem helem)); -$priv{$_}{16} = "STATE" for ("padav", "padhv", "padsv"); -@{$priv{rv2gv}}{4,16} = qw "NOINIT FAKE"; -@{$priv{"entersub"}}{1,4,16,32,64} = qw( INARGS TARG DBG DEREF ); -@{$priv{rv2cv}}{1,8,128} = ("CONST","AMPER","NO()"); -$priv{"gv"}{32} = "EARLYCV"; -$priv{"aelem"}{16} = $priv{"helem"}{16} = "LVDEFER"; -$priv{$_}{16} = "OURINTR" for ("gvsv", "rv2sv", "rv2av", "rv2hv", "r2gv", - "enteriter"); -$priv{$_}{8} = 'LVSUB' for qw(rv2av rv2gv rv2hv padav padhv aelem helem - aslice hslice av2arylen keys rkeys substr pos vec); -@{$priv{$_}}{32,64} = ('BOOL','BOOL?') for 'rv2hv', 'padhv'; -$priv{substr}{16} = 'REPL1ST'; + for qw(pos substr vec threadsv gvsv rv2sv rv2hv rv2gv rv2av rv2arylen + aelem helem aslice hslice padsv padav padhv enteriter entersub + padrange pushmark); +$priv{$_}{64} = "REFC" for qw(leave leavesub leavesublv leavewrite); +$priv{$_}{128} = "LV" for qw(leave leaveloop); +@{$priv{aassign}}{32,64} = qw(STATE COMMON); +@{$priv{sassign}}{32,64,128} = qw(STATE BKWARD CV2GV); +$priv{$_}{64} = "RTIME" for qw(match subst substcont qr); +@{$priv{$_}}{1,2,4,8,16,64} = qw(UTF IDENT SQUASH DEL COMPL GROWS) + for qw(trans transr); +$priv{repeat}{64} = "DOLIST"; +$priv{leaveloop}{64} = "CONT"; +@{$priv{$_}}{32,64,96} = qw(DREFAV DREFHV DREFSV) + for qw(rv2gv rv2sv padsv aelem helem); +$priv{$_}{16} = "STATE" for qw(padav padhv padsv); +@{$priv{rv2gv}}{4,16} = qw(NOINIT FAKE); +@{$priv{entersub}}{1,4,16,32,64} = qw(INARGS TARG DBG DEREF); +@{$priv{rv2cv}}{1,8,128} = qw(CONST AMPER NO()); +$priv{gv}{32} = "EARLYCV"; +$priv{$_}{16} = "LVDEFER" for qw(aelem helem); +$priv{$_}{16} = "OURINTR" for qw(gvsv rv2sv rv2av rv2hv r2gv enteriter); +$priv{$_}{8} = "LVSUB" + for qw(rv2av rv2gv rv2hv padav padhv aelem helem aslice hslice + av2arylen keys rkeys substr pos vec); +$priv{$_}{4} = "SLICEWARN" + for qw(rv2hv rv2av padav padhv hslice aslice); +@{$priv{$_}}{32,64} = qw(BOOL BOOL?) for qw(rv2hv padhv); +$priv{substr}{16} = "REPL1ST"; $priv{$_}{16} = "TARGMY" - for (map(($_,"s$_"),"chop", "chomp"), - map(($_,"i_$_"), "postinc", "postdec", "multiply", "divide", "modulo", - "add", "subtract", "negate"), "pow", "concat", "stringify", - "left_shift", "right_shift", "bit_and", "bit_xor", "bit_or", - "complement", "atan2", "sin", "cos", "rand", "exp", "log", "sqrt", - "int", "hex", "oct", "abs", "length", "index", "rindex", "sprintf", - "ord", "chr", "crypt", "quotemeta", "join", "push", "unshift", "flock", - "chdir", "chown", "chroot", "unlink", "chmod", "utime", "rename", - "link", "symlink", "mkdir", "rmdir", "wait", "waitpid", "system", - "exec", "kill", "getppid", "getpgrp", "setpgrp", "getpriority", - "setpriority", "time", "sleep"); -$priv{$_}{4} = "REVERSED" for ("enteriter", "iter"); -@{$priv{"const"}}{2,4,8,16,64,128} = - ("NOVER","SHORT","STRICT","ENTERED","BARE","FOLD"); -$priv{"flip"}{64} = $priv{"flop"}{64} = "LINENUM"; -$priv{"list"}{64} = "GUESSED"; -$priv{"delete"}{64} = "SLICE"; -$priv{"exists"}{64} = "SUB"; -@{$priv{"sort"}}{1,2,4,8,16,32,64} = ("NUM", "INT", "REV", "INPLACE","DESC","QSORT","STABLE"); -$priv{"reverse"}{8} = "INPLACE"; -$priv{"threadsv"}{64} = "SVREFd"; -@{$priv{$_}}{16,32,64,128} = ("INBIN","INCR","OUTBIN","OUTCR") - for ("open", "backtick"); -$priv{"exit"}{128} = "VMS"; + for map(($_,"s$_"), qw(chop chomp)), + map(($_,"i_$_"), qw(postinc postdec multiply divide modulo add + subtract negate)), + qw(pow concat stringify left_shift right_shift bit_and bit_xor + bit_or complement atan2 sin cos rand exp log sqrt int hex oct + abs length index rindex sprintf ord chr crypt quotemeta join + push unshift flock chdir chown chroot unlink chmod utime rename + link symlink mkdir rmdir wait waitpid system exec kill getppid + getpgrp setpgrp getpriority setpriority time sleep); +$priv{$_}{4} = "REVERSED" for qw(enteriter iter); +@{$priv{const}}{2,4,8,16,64} = qw(NOVER SHORT STRICT ENTERED BARE); +$priv{$_}{64} = "LINENUM" for qw(flip flop); +$priv{list}{64} = "GUESSED"; +$priv{delete}{64} = "SLICE"; +$priv{exists}{64} = "SUB"; +@{$priv{sort}}{1,2,4,8,16,32,64} = qw(NUM INT REV INPLACE DESC QSORT STABLE); +$priv{reverse}{8} = "INPLACE"; +$priv{threadsv}{64} = "SVREFd"; +@{$priv{$_}}{16,32,64,128} = qw(INBIN INCR OUTBIN OUTCR) + for qw(open backtick); +$priv{$_}{32} = "HUSH" for qw(nextstate dbstate); $priv{$_}{2} = "FTACCESS" - for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec"); -@{$priv{"entereval"}}{2,4,8,16} = qw "HAS_HH UNI BYTES COPHH"; -@{$priv{$_}}{4,8,16} = ("FTSTACKED","FTSTACKING","FTAFTERt") -for ("ftrread", "ftrwrite", "ftrexec", "fteread", "ftewrite", "fteexec", - "ftis", "fteowned", "ftrowned", "ftzero", "ftsize", "ftmtime", - "ftatime", "ftctime", "ftsock", "ftchr", "ftblk", "ftfile", "ftdir", - "ftpipe", "ftlink", "ftsuid", "ftsgid", "ftsvtx", "fttty", "fttext", - "ftbinary"); + for qw(ftrread ftrwrite ftrexec fteread ftewrite fteexec); +@{$priv{entereval}}{2,4,8,16} = qw(HAS_HH UNI BYTES COPHH); +@{$priv{$_}}{4,8,16} = qw(FTSTACKED FTSTACKING FTAFTERt) + for qw(ftrread ftrwrite ftrexec fteread ftewrite fteexec ftis fteowned + ftrowned ftzero ftsize ftmtime ftatime ftctime ftsock ftchr + ftblk ftfile ftdir ftpipe ftlink ftsuid ftsgid ftsvtx fttty + fttext ftbinary); $priv{$_}{2} = "GREPLEX" -for ("mapwhile", "mapstart", "grepwhile", "grepstart"); -$priv{$_}{128} = '+1' for qw "caller wantarray runcv"; -@{$priv{coreargs}}{1,2,64,128} = ('DREF1','DREF2','$MOD','MARK'); -$priv{$_}{128} = 'UTF' for qw "last redo next goto dump"; + for qw(mapwhile mapstart grepwhile grepstart); +$priv{$_}{128} = "+1" for qw(caller wantarray runcv); +@{$priv{coreargs}}{1,2,64,128} = qw(DREF1 DREF2 $MOD MARK); +$priv{$_}{128} = "UTF" for qw(last redo next goto dump); +$priv{split}{128} = "IMPLIM"; our %hints; # used to display each COP's op_hints values @@ -891,6 +887,7 @@ sub concise_op { } elsif ($h{class} eq "LOGOP") { undef $lastnext; $h{arg} = "(other->" . seq($op->other) . ")"; + $h{otheraddr} = sprintf("%#x", $ {$op->other}); } elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") { unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) { @@ -921,6 +918,10 @@ sub concise_op { $h{flags} = op_flags($op->flags); $h{privval} = $op->private; $h{private} = private_flags($h{name}, $op->private); + if ($op->folded) { + $h{private} &&= "$h{private},"; + $h{private} .= "FOLD"; + } if ($op->can("hints")) { $h{hintsval} = $op->hints; $h{hints} = hints_flags($h{hintsval}); @@ -1643,7 +1644,7 @@ your program is). =item B<#opt> -Whether or not the op has been optimised by the peephole optimiser. +Whether or not the op has been optimized by the peephole optimizer. Only available in 5.9 and later. @@ -1810,13 +1811,13 @@ B lets you change the print destination from STDOUT to another open filehandle, or into a string passed as a ref (unless you've built perl with -Uuseperlio). - my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1 - walk_output(\my $buf); - $walker->(); # 1 renders -terse - set_style_standard('concise'); # 2 - $walker->(); # 2 renders -concise - $walker->(@new); # 3 renders whatever - print "3 different renderings: terse, concise, and @new: $buf\n"; + my $walker = B::Concise::compile('-terse','aFuncName', \&aSubRef); # 1 + walk_output(\my $buf); + $walker->(); # 1 renders -terse + set_style_standard('concise'); # 2 + $walker->(); # 2 renders -concise + $walker->(@new); # 3 renders whatever + print "3 different renderings: terse, concise, and @new: $buf\n"; When $walker is called, it traverses the subroutines supplied when it was created, and renders them using the current style. You can change diff --git a/Master/tlpkg/tlperl/lib/B/Debug.pm b/Master/tlpkg/tlperl/lib/B/Debug.pm index 31b0e2834be..c4a1a33afa6 100644 --- a/Master/tlpkg/tlperl/lib/B/Debug.pm +++ b/Master/tlpkg/tlperl/lib/B/Debug.pm @@ -1,6 +1,6 @@ package B::Debug; -our $VERSION = '1.18'; +our $VERSION = '1.19'; use strict; require 5.006; @@ -181,7 +181,6 @@ sub B::SV::debug { printf <<'EOT', class($sv), $$sv, $sv->REFCNT; %s (0x%x) REFCNT %d - FLAGS 0x%x EOT printf "\tFLAGS\t\t0x%x", $sv->FLAGS; if ($have_B_Flags) { @@ -203,9 +202,10 @@ sub B::PV::debug { my ($sv) = @_; $sv->B::SV::debug(); my $pv = $sv->PV(); - printf <<'EOT', cstring($pv), length($pv); + printf <<'EOT', cstring($pv), $sv->CUR, $sv->LEN; xpv_pv %s xpv_cur %d + xpv_len %d EOT } @@ -258,17 +258,23 @@ sub B::CV::debug { my ($padlist) = $sv->PADLIST; my ($file) = $sv->FILE; my ($gv) = $sv->GV; - printf <<'EOT', $$stash, $$start, $$root, $$gv, $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}; + printf <<'EOT', $$stash, $$start, $$root; STASH 0x%x START 0x%x ROOT 0x%x - GV 0x%x +EOT + if ( $]>5.017 && ($sv->FLAGS & 0x40000)) { #lexsub + printf("\tNAME\t%%s\n", $sv->NAME); + } else { + printf("\tGV\t%0x%x\t%s\n", $$gv, $gv->SAFENAME); + } + printf <<'EOT', $file, $sv->DEPTH, $padlist, ${$sv->OUTSIDE}; FILE %s DEPTH %d PADLIST 0x%x OUTSIDE 0x%x EOT - printf("\tOUTSIDE_SEQ\t%d\n", , $sv->OUTSIDE_SEQ) if $] > 5.007; + printf("\tOUTSIDE_SEQ\t%d\n", $sv->OUTSIDE_SEQ) if $] > 5.007; if ($have_B_Flags) { my $SVt_PVCV = $] < 5.010 ? 12 : 13; printf("\tCvFLAGS\t0x%x\t%s\n", $sv->CvFLAGS, @@ -407,7 +413,7 @@ Reini Urban C =head1 LICENSE Copyright (c) 1996, 1997 Malcolm Beattie -Copyright (c) 2008, 2010 Reini Urban +Copyright (c) 2008, 2010, 2013 Reini Urban This program is free software; you can redistribute it and/or modify it under the terms of either: diff --git a/Master/tlpkg/tlperl/lib/B/Deparse.pm b/Master/tlpkg/tlperl/lib/B/Deparse.pm index d62fe3bc5fe..e7eb8cf90d3 100644 --- a/Master/tlpkg/tlperl/lib/B/Deparse.pm +++ b/Master/tlpkg/tlperl/lib/B/Deparse.pm @@ -20,7 +20,7 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring CVf_METHOD CVf_LVALUE PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED); -$VERSION = '1.20'; +$VERSION = '1.26'; use strict; use vars qw/$AUTOLOAD/; use warnings (); @@ -249,6 +249,9 @@ BEGIN { # subs_deparsed # Keeps track of fully qualified names of all deparsed subs. # +# in_subst_repl +# True when deparsing the replacement part of a substitution. +# # parens: -p # linenums: -l # unquote: -q @@ -313,6 +316,9 @@ BEGIN { +BEGIN { for (qw[ const stringify rv2sv list glob pushmark null]) { + eval "sub OP_\U$_ () { " . opnumber($_) . "}" +}} # _pessimise_walk(): recursively walk the optree of a sub, # possibly undoing optimisations along the way. @@ -342,6 +348,7 @@ sub _pessimise_walk { # the original gv[_]. $B::overlay->{$$op} = { + type => OP_PUSHMARK, name => 'pushmark', private => ($op->private & OPpLVAL_INTRO), next => ($op->flags & OPf_SPECIAL) @@ -401,7 +408,7 @@ sub _pessimise_walk_exe { } } -# Go through an optree and and "remove" some optimisations by using an +# Go through an optree and "remove" some optimisations by using an # overlay to selectively modify or un-null some ops. Deparsing in the # absence of those optimisations is then easier. # @@ -972,6 +979,9 @@ sub indent { } $line = substr($line, 1); } + if (index($line, "\f") > 0) { + $line =~ s/\f/\n/; + } if (substr($line, 0, 1) eq "\f") { $line = substr($line, 1); # no indent } else { @@ -1226,12 +1236,12 @@ sub padname_sv { sub maybe_my { my $self = shift; - my($op, $cx, $text) = @_; + my($op, $cx, $text, $forbid_parens) = @_; if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) { my $my = $op->private & OPpPAD_STATE ? $self->keyword("state") : "my"; - if (want_scalar($op)) { + if ($forbid_parens || want_scalar($op)) { return "$my $text"; } else { return $self->maybe_parens_func($my, $text, $cx, 16); @@ -1805,7 +1815,6 @@ my %feature_keywords = ( # keywords that are strong and also have a prototype # my %strong_proto_keywords = map { $_ => 1 } qw( - glob pos prototype scalar @@ -2659,7 +2668,6 @@ sub listop { : $self->keyword($name) . '()' x (7 < $cx); } my $first; - $name = "socketpair" if $name eq "sockpair"; my $fullname = $self->keyword($name); my $proto = prototype("CORE::$name"); if ( @@ -2758,7 +2766,7 @@ sub pp_fcntl { listop(@_, "fcntl") } sub pp_ioctl { listop(@_, "ioctl") } sub pp_flock { maybe_targmy(@_, \&listop, "flock") } sub pp_socket { listop(@_, "socket") } -sub pp_sockpair { listop(@_, "sockpair") } +sub pp_sockpair { listop(@_, "socketpair") } sub pp_bind { listop(@_, "bind") } sub pp_connect { listop(@_, "connect") } sub pp_listen { listop(@_, "listen") } @@ -2804,13 +2812,19 @@ sub pp_syscall { listop(@_, "syscall") } sub pp_glob { my $self = shift; my($op, $cx) = @_; - my $text = $self->dq($op->first->sibling); # skip pushmark + my $kid = $op->first->sibling; # skip pushmark my $keyword = $op->flags & OPf_SPECIAL ? 'glob' : $self->keyword('glob'); - if ($text =~ /^\$?(\w|::|\`)+$/ # could look like a readline - or $keyword =~ /^CORE::/ + my $text; + if ($keyword =~ /^CORE::/ + or $kid->name ne 'const' + or ($text = $self->dq($kid)) + =~ /^\$?(\w|::|\`)+$/ # could look like a readline or $text =~ /[<>]/) { - return "$keyword(" . single_delim('qq', '"', $text) . ')'; + $text = $self->deparse($kid); + return $cx >= 5 || $self->{'parens'} + ? "$keyword($text)" + : "$keyword $text"; } else { return '<' . $text . '>'; } @@ -2954,14 +2968,14 @@ sub pp_list { # OPs that store things other than flags in their op_private, # like OP_AELEMFAST, won't be immediate children of a list. # - # OP_ENTERSUB can break this logic, so check for it. + # OP_ENTERSUB and OP_SPLIT can break this logic, so check for them. # I suspect that open and exit can too. + # XXX This really needs to be rewritten to accept only those ops + # known to take the OPpLVAL_INTRO flag. if (!($lop->private & (OPpLVAL_INTRO|OPpOUR_INTRO) or $lop->name eq "undef") - or $lop->name eq "entersub" - or $lop->name eq "exit" - or $lop->name eq "open") + or $lop->name =~ /^(?:entersub|exit|open|split)\z/) { $local = ""; # or not last; @@ -3111,7 +3125,7 @@ sub loop_common { # thread special var, under 5005threads $var = $self->pp_threadsv($enter, 1); } else { # regular my() variable - $var = $self->pp_padsv($enter, 1); + $var = $self->pp_padsv($enter, 1, 1); } } elsif ($var->name eq "rv2gv") { $var = $self->pp_rv2sv($var, 1); @@ -3198,9 +3212,12 @@ sub pp_leavetry { return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}"; } -BEGIN { for (qw[ const stringify rv2sv list glob ]) { - eval "sub OP_\U$_ () { " . opnumber($_) . "}" -}} +sub _op_is_or_was { + my ($op, $expect_type) = @_; + my $type = $op->type; + return($type == $expect_type + || ($type == OP_NULL && $op->targ == $expect_type)); +} sub pp_null { my $self = shift; @@ -3208,7 +3225,10 @@ sub pp_null { if (class($op) eq "OP") { # old value is lost return $self->{'ex_const'} if $op->targ == OP_CONST; - } elsif ($op->first->name eq "pushmark") { + } elsif ($op->first->name eq 'pushmark' + or $op->first->name eq 'null' + && $op->first->targ == OP_PUSHMARK + && _op_is_or_was($op, OP_LIST)) { return $self->pp_list($op, $cx); } elsif ($op->first->name eq "enter") { return $self->pp_leave($op, $cx); @@ -3267,8 +3287,9 @@ sub padany { sub pp_padsv { my $self = shift; - my($op, $cx) = @_; - return $self->maybe_my($op, $cx, $self->padname($op->targ)); + my($op, $cx, $forbid_parens) = @_; + return $self->maybe_my($op, $cx, $self->padname($op->targ), + $forbid_parens); } sub pp_padav { pp_padsv(@_) } @@ -3311,7 +3332,9 @@ sub pp_aelemfast_lex { my($op, $cx) = @_; my $name = $self->padname($op->targ); $name =~ s/^@/\$/; - return $name . "[" . ($op->private + $self->{'arybase'}) . "]"; + my $i = $op->private; + $i -= 256 if $i > 127; + return $name . "[" . ($i + $self->{'arybase'}) . "]"; } sub pp_aelemfast { @@ -3323,7 +3346,9 @@ sub pp_aelemfast { my $gv = $self->gv_or_padgv($op); my($name,$quoted) = $self->stash_variable_name('@',$gv); $name = $quoted ? "$name->" : '$' . $name; - return $name . "[" . ($op->private + $self->{'arybase'}) . "]"; + my $i = $op->private; + $i -= 256 if $i > 127; + return $name . "[" . ($i + $self->{'arybase'}) . "]"; } sub rv2x { @@ -3377,7 +3402,7 @@ sub pp_av2arylen { sub pp_rv2cv { my ($self, $op, $cx) = @_; if (!null($op->first) && $op->first->name eq 'null' && - $op->first->targ eq OP_LIST) + $op->first->targ == OP_LIST) { return $self->rv2x($op->first->first->sibling, $cx, "&") } @@ -3511,7 +3536,9 @@ sub elem { } if (my $array_name=$self->elem_or_slice_array_name ($array, $left, $padname, 1)) { - return ($array_name =~ /->\z/ ? $array_name : "\$" . $array_name) + return ($array_name =~ /->\z/ + ? $array_name + : $array_name eq '#' ? '${#}' : "\$" . $array_name) . $left . $idx . $right; } else { # $x[20][3]{hi} or expr->[20] @@ -3561,11 +3588,15 @@ sub slice { } else { $list = $self->elem_or_slice_single_index($kid); } - return "\@" . $array . $left . $list . $right; + my $lead = '@'; + $lead = '%' if $op->name =~ /^kv/i; + return $lead . $array . $left . $list . $right; } -sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) } -sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) } +sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) } +sub pp_kvaslice { slice(@_, "[", "]", "rv2av", "padav") } +sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) } +sub pp_kvhslice { slice(@_, "{", "}", "rv2hv", "padhv") } sub pp_lslice { my $self = shift; @@ -3681,8 +3712,9 @@ sub check_proto { my @reals; # An unbackslashed @ or % gobbles up the rest of the args 1 while $proto =~ s/(? '\c@', # unused "\cA" => '\cA', @@ -4188,7 +4220,11 @@ sub const { } } - return $self->maybe_parens("\\" . $self->const($ref, 20), $cx, 20); + my $const = $self->const($ref, 20); + if ($self->{in_subst_repl} && $const =~ /^[0-9]/) { + $const = "($const)"; + } + return $self->maybe_parens("\\$const", $cx, 20); } elsif ($sv->FLAGS & SVf_POK) { my $str = $sv->PV; if ($str =~ /[[:^print:]]/) { @@ -4612,7 +4648,7 @@ sub pure_string { } elsif ($type eq 'join') { my $join_op = $op->first->sibling; # Skip pushmark - return 0 unless $join_op->name eq 'null' && $join_op->targ eq OP_RV2SV; + return 0 unless $join_op->name eq 'null' && $join_op->targ == OP_RV2SV; my $gvop = $join_op->first; return 0 unless $gvop->name eq 'gvsv'; @@ -4859,10 +4895,13 @@ sub pp_subst { $repl = $repl->first; $flags .= "e"; } - if ($pmflags & PMf_EVAL) { + { + local $self->{in_subst_repl} = 1; + if ($pmflags & PMf_EVAL) { $repl = $self->deparse($repl->first, 0); - } else { + } else { $repl = $self->dq($repl); + } } my $extended = ($pmflags & PMf_EXTENDED); if (null $kid) { @@ -5297,7 +5336,7 @@ parameter twice: warnings => [FATAL => qw/void io/], ); -See L for more information about lexical warnings. +See L for more information about lexical warnings. =item hint_bits diff --git a/Master/tlpkg/tlperl/lib/B/Lint.pm b/Master/tlpkg/tlperl/lib/B/Lint.pm deleted file mode 100644 index fd8d75e53ac..00000000000 --- a/Master/tlpkg/tlperl/lib/B/Lint.pm +++ /dev/null @@ -1,793 +0,0 @@ -package B::Lint; -use if $] > 5.017, 'deprecate'; - -our $VERSION = '1.17'; ## no critic - -=head1 NAME - -B::Lint - Perl lint - -=head1 SYNOPSIS - -perl -MO=Lint[,OPTIONS] foo.pl - -=head1 DESCRIPTION - -The B::Lint module is equivalent to an extended version of the B<-w> -option of B. It is named after the program F which carries -out a similar process for C programs. - -=head1 OPTIONS AND LINT CHECKS - -Option words are separated by commas (not whitespace) and follow the -usual conventions of compiler backend options. Following any options -(indicated by a leading B<->) come lint check arguments. Each such -argument (apart from the special B and B options) is a -word representing one possible lint check (turning on that check) or -is B (turning off that check). Before processing the check -arguments, a standard list of checks is turned on. Later options -override earlier ones. Available options are: - -=over 8 - -=item B - -Produces a warning whenever the magic CE> readline is -used. Internally it uses perl's two-argument open which itself treats -filenames with special characters specially. This could allow -interestingly named files to have unexpected effects when reading. - - % touch 'rm *|' - % perl -pe 1 - -The above creates a file named C. When perl opens it with -CE> it actually executes the shell program C. This -makes CE> dangerous to use carelessly. - -=item B - -Produces a warning whenever an array is used in an implicit scalar -context. For example, both of the lines - - $foo = length(@bar); - $foo = @bar; - -will elicit a warning. Using an explicit B silences the -warning. For example, - - $foo = scalar(@bar); - -=item B and B - -These options produce a warning whenever an operation implicitly -reads or (respectively) writes to one of Perl's special variables. -For example, B will warn about these: - - /foo/; - -and B will warn about these: - - s/foo/bar/; - -Both B and B warn about this: - - for (@a) { ... } - -=item B - -This option warns whenever a bareword is implicitly quoted, but is also -the name of a subroutine in the current package. Typical mistakes that it will -trap are: - - use constant foo => 'bar'; - @a = ( foo => 1 ); - $b{foo} = 2; - -Neither of these will do what a naive user would expect. - -=item B - -This option warns whenever C<$_> is used either explicitly anywhere or -as the implicit argument of a B statement. - -=item B - -This option warns on each use of any variable, subroutine or -method name that lives in a non-current package but begins with -an underscore ("_"). Warnings aren't issued for the special case -of the single character name "_" by itself (e.g. C<$_> and C<@_>). - -=item B - -This option warns whenever an undefined subroutine is invoked. -This option will only catch explicitly invoked subroutines such -as C and not indirect invocations such as C<&$subref()> -or C<$obj-Emeth()>. Note that some programs or modules delay -definition of subs until runtime by means of the AUTOLOAD -mechanism. - -=item B - -This option warns whenever one of the regexp variables C<$`>, C<$&> or C<$'> -is used. Any occurrence of any of these variables in your -program can slow your whole program down. See L for -details. - -=item B - -Turn all warnings on. - -=item B - -Turn all warnings off. - -=back - -=head1 NON LINT-CHECK OPTIONS - -=over 8 - -=item B<-u Package> - -Normally, Lint only checks the main code of the program together -with all subs defined in package main. The B<-u> option lets you -include other package names whose subs are then checked by Lint. - -=back - -=head1 EXTENDING LINT - -Lint can be extended by with plugins. Lint uses L -to find available plugins. Plugins are expected but not required to -inform Lint of which checks they are adding. - -The C<< B::Lint->register_plugin( MyPlugin => \@new_checks ) >> method -adds the list of C<@new_checks> to the list of valid checks. If your -module wasn't loaded by L then your class name is -added to the list of plugins. - -You must create a C method in your plugin class or one -of its parents. It will be called on every op as a regular method call -with a hash ref of checks as its parameter. - -The class methods C<< B::Lint->file >> and C<< B::Lint->line >> contain -the current filename and line number. - - package Sample; - use B::Lint; - B::Lint->register_plugin( Sample => [ 'good_taste' ] ); - - sub match { - my ( $op, $checks_href ) = shift @_; - if ( $checks_href->{good_taste} ) { - ... - } - } - -=head1 TODO - -=over - -=item while() stomps $_ - -=item strict oo - -=item unchecked system calls - -=item more tests, validate against older perls - -=back - -=head1 BUGS - -This is only a very preliminary version. - -=head1 AUTHOR - -Malcolm Beattie, mbeattie@sable.ox.ac.uk. - -=head1 ACKNOWLEDGEMENTS - -Sebastien Aperghis-Tramoni - bug fixes - -=cut - -use strict; -use B qw( walkoptree_slow - main_root main_cv walksymtable parents - OPpOUR_INTRO - OPf_WANT_VOID OPf_WANT_LIST OPf_WANT OPf_STACKED SVf_POK ); -use Carp 'carp'; - -# The current M::P doesn't know about .pmc files. -use Module::Pluggable ( require => 1 ); - -use List::Util 'first'; -## no critic Prototypes -sub any (&@) { my $test = shift @_; $test->() and return 1 for @_; return 0 } - -BEGIN { - - # Import or create some constants from B. B doesn't provide - # everything I need so some things like OPpCONST_BARE are defined - # here. - for my $sym ( qw( begin_av check_av init_av end_av ), - [ 'OPpCONST_BARE' => 64 ] ) - { - my $val; - ( $sym, $val ) = @$sym if ref $sym; - - if ( any { $sym eq $_ } @B::EXPORT_OK, @B::EXPORT ) { - B->import($sym); - } - else { - require constant; - constant->import( $sym => $val ); - } - } -} - -my $file = "unknown"; # shadows current filename -my $line = 0; # shadows current line number -my $curstash = "main"; # shadows current stash -my $curcv; # shadows current B::CV for pad lookups - -sub file {$file} -sub line {$line} -sub curstash {$curstash} -sub curcv {$curcv} - -# Lint checks -my %check; -my %implies_ok_context; - -map( $implies_ok_context{$_}++, - qw(scalar av2arylen aelem aslice helem hslice - keys values hslice defined undef delete) ); - -# Lint checks turned on by default -my @default_checks - = qw(context magic_diamond undefined_subs regexp_variables); - -my %valid_check; - -# All valid checks -for my $check ( - qw(context implicit_read implicit_write dollar_underscore - private_names bare_subs undefined_subs regexp_variables - magic_diamond ) - ) -{ - $valid_check{$check} = __PACKAGE__; -} - -# Debugging options -my ($debug_op); - -my %done_cv; # used to mark which subs have already been linted -my @extra_packages; # Lint checks mainline code and all subs which are - # in main:: or in one of these packages. - -sub warning { - my $format = ( @_ < 2 ) ? "%s" : shift @_; - warn sprintf( "$format at %s line %d\n", @_, $file, $line ); - return undef; ## no critic undef -} - -# This gimme can't cope with context that's only determined -# at runtime via dowantarray(). -sub gimme { - my $op = shift @_; - my $flags = $op->flags; - if ( $flags & OPf_WANT ) { - return ( ( $flags & OPf_WANT ) == OPf_WANT_LIST ? 1 : 0 ); - } - return undef; ## no critic undef -} - -my @plugins = __PACKAGE__->plugins; - -sub inside_grepmap { - - # A boolean function to be used while inside a B::walkoptree_slow - # call. If we are in the EXPR part of C or C, this returns true. - return any { $_->name =~ m/\A(?:grep|map)/xms } @{ parents() }; -} - -sub inside_foreach_modifier { - - # TODO: use any() - - # A boolean function to be used while inside a B::walkoptree_slow - # call. If we are in the EXPR part of C this - # returns true. - for my $ancestor ( @{ parents() } ) { - next unless $ancestor->name eq 'leaveloop'; - - my $first = $ancestor->first; - next unless $first->name eq 'enteriter'; - - next if $first->redoop->name =~ m/\A(?:next|db|set)state\z/xms; - - return 1; - } - return 0; -} - -for ( - [qw[ B::PADOP::gv_harder gv padix]], - [qw[ B::SVOP::sv_harder sv targ]], - [qw[ B::SVOP::gv_harder gv padix]] - ) -{ - - # I'm generating some functions here because they're mostly - # similar. It's all for compatibility with threaded - # perl. Perhaps... this code should inspect $Config{usethreads} - # and generate a *specific* function. I'm leaving it generic for - # the moment. - # - # In threaded perl SVs and GVs aren't used directly in the optrees - # like they are in non-threaded perls. The ops that would use a SV - # or GV keep an index into the subroutine's scratchpad. I'm - # currently ignoring $cv->DEPTH and that might be at my peril. - - my ( $subname, $attr, $pad_attr ) = @$_; - my $target = do { ## no critic strict - no strict 'refs'; - \*$subname; - }; - *$target = sub { - my ($op) = @_; - - my $elt; - if ( not $op->isa('B::PADOP') ) { - $elt = $op->$attr; - } - return $elt if eval { $elt->isa('B::SV') }; - - my $ix = $op->$pad_attr; - my @entire_pad = $curcv->PADLIST->ARRAY; - my @elts = map +( $_->ARRAY )[$ix], @entire_pad; - ($elt) = first { - eval { $_->isa('B::SV') } ? $_ : (); - } - @elts[ 0, reverse 1 .. $#elts ]; - return $elt; - }; -} - -sub B::OP::lint { - my ($op) = @_; - - # This is a fallback ->lint for all the ops where I haven't - # defined something more specific. Nothing happens here. - - # Call all registered plugins - my $m; - $m = $_->can('match'), $op->$m( \%check ) for @plugins; - return; -} - -sub B::COP::lint { - my ($op) = @_; - - # nextstate ops sit between statements. Whenever I see one I - # update the current info on file, line, and stash. This code also - # updates it when it sees a dbstate or setstate op. I have no idea - # what those are but having seen them mentioned together in other - # parts of the perl I think they're kind of equivalent. - if ( $op->name =~ m/\A(?:next|db|set)state\z/ ) { - $file = $op->file; - $line = $op->line; - $curstash = $op->stash->NAME; - } - - # Call all registered plugins - my $m; - $m = $_->can('match'), $op->$m( \%check ) for @plugins; - return; -} - -sub B::UNOP::lint { - my ($op) = @_; - - my $opname = $op->name; - -CONTEXT: { - - # Check arrays and hashes in scalar or void context where - # scalar() hasn't been used. - - next - unless $check{context} - and $opname =~ m/\Arv2[ah]v\z/xms - and not gimme($op); - - my ( $parent, $gparent ) = @{ parents() }[ 0, 1 ]; - my $pname = $parent->name; - - next if $implies_ok_context{$pname}; - - # Three special cases to deal with: "foreach (@foo)", "delete - # $a{$b}", and "exists $a{$b}" null out the parent so we have to - # check for a parent of pp_null and a grandparent of - # pp_enteriter, pp_delete, pp_exists - - next - if $pname eq "null" - and $gparent->name =~ m/\A(?:delete|enteriter|exists)\z/xms; - - # our( @bar ); would also trigger this error so I exclude - # that. - next - if $op->private & OPpOUR_INTRO - and ( $op->flags & OPf_WANT ) == OPf_WANT_VOID; - - warning 'Implicit scalar context for %s in %s', - $opname eq "rv2av" ? "array" : "hash", $parent->desc; - } - -PRIVATE_NAMES: { - - # Looks for calls to methods with names that begin with _ and - # that aren't visible within the current package. Maybe this - # should look at @ISA. - next - unless $check{private_names} - and $opname =~ m/\Amethod/xms; - - my $methop = $op->first; - next unless $methop->name eq "const"; - - my $method = $methop->sv_harder->PV; - next - unless $method =~ m/\A_/xms - and not defined &{"$curstash\::$method"}; - - warning q[Illegal reference to private method name '%s'], $method; - } - - # Call all registered plugins - my $m; - $m = $_->can('match'), $op->$m( \%check ) for @plugins; - return; -} - -sub B::PMOP::lint { - my ($op) = @_; - -IMPLICIT_READ: { - - # Look for /.../ that doesn't use =~ to bind to something. - next - unless $check{implicit_read} - and $op->name eq "match" - and not( $op->flags & OPf_STACKED - or inside_grepmap() ); - warning 'Implicit match on $_'; - } - -IMPLICIT_WRITE: { - - # Look for s/.../.../ that doesn't use =~ to bind to - # something. - next - unless $check{implicit_write} - and $op->name eq "subst" - and not $op->flags & OPf_STACKED; - warning 'Implicit substitution on $_'; - } - - # Call all registered plugins - my $m; - $m = $_->can('match'), $op->$m( \%check ) for @plugins; - return; -} - -sub B::LOOP::lint { - my ($op) = @_; - -IMPLICIT_FOO: { - - # Look for C. - next - unless ( $check{implicit_read} or $check{implicit_write} ) - and $op->name eq "enteriter"; - - my $last = $op->last; - next - unless $last->name eq "gv" - and $last->gv_harder->NAME eq "_" - and $op->redoop->name =~ m/\A(?:next|db|set)state\z/xms; - - warning 'Implicit use of $_ in foreach'; - } - - # Call all registered plugins - my $m; - $m = $_->can('match'), $op->$m( \%check ) for @plugins; - return; -} - -# In threaded vs non-threaded perls you'll find that threaded perls -# use PADOP in place of SVOPs so they can do lookups into the -# scratchpad to find things. I suppose this is so a optree can be -# shared between threads and all symbol table muckery will just get -# written to a scratchpad. -*B::PADOP::lint = *B::PADOP::lint = \&B::SVOP::lint; - -sub B::SVOP::lint { - my ($op) = @_; - -MAGIC_DIAMOND: { - next - unless $check{magic_diamond} - and parents()->[0]->name eq 'readline' - and $op->gv_harder->NAME eq 'ARGV'; - - warning 'Use of <>'; - } - -BARE_SUBS: { - next - unless $check{bare_subs} - and $op->name eq 'const' - and $op->private & OPpCONST_BARE; - - my $sv = $op->sv_harder; - next unless $sv->FLAGS & SVf_POK; - - my $sub = $sv->PV; - my $subname = "$curstash\::$sub"; - - # I want to skip over things that were declared with the - # constant pragma. Well... sometimes. Hmm. I want to ignore - # C< ...>> but warn on C< ...>> - # later. The former is typical declaration syntax and the - # latter would be an error. - # - # Skipping over both could be handled by looking if - # $constant::declared{$subname} is true. - - # Check that it's a function. - next - unless exists &{"$curstash\::$sub"}; - - warning q[Bare sub name '%s' interpreted as string], $sub; - } - -PRIVATE_NAMES: { - next unless $check{private_names}; - - my $opname = $op->name; - if ( $opname =~ m/\Agv(?:sv)?\z/xms ) { - - # Looks for uses of variables and stuff that are named - # private and we're not in the same package. - my $gv = $op->gv_harder; - my $name = $gv->NAME; - next - unless $name =~ m/\A_./xms - and $gv->STASH->NAME ne $curstash; - - warning q[Illegal reference to private name '%s'], $name; - } - elsif ( $opname eq "method_named" ) { - my $method = $op->sv_harder->PV; - next unless $method =~ m/\A_./xms; - - warning q[Illegal reference to private method name '%s'], $method; - } - } - -DOLLAR_UNDERSCORE: { - - # Warn on uses of $_ with a few exceptions. I'm not warning on - # $_ inside grep, map, or statement modifier foreach because - # they localize $_ and it'd be impossible to use these - # features without getting warnings. - - next - unless $check{dollar_underscore} - and $op->name eq "gvsv" - and $op->gv_harder->NAME eq "_" - and not( inside_grepmap - or inside_foreach_modifier ); - - warning 'Use of $_'; - } - -REGEXP_VARIABLES: { - - # Look for any uses of $`, $&, or $'. - next - unless $check{regexp_variables} - and $op->name eq "gvsv"; - - my $name = $op->gv_harder->NAME; - next unless $name =~ m/\A[\&\'\`]\z/xms; - - warning 'Use of regexp variable $%s', $name; - } - -UNDEFINED_SUBS: { - - # Look for calls to functions that either don't exist or don't - # have a definition. - next - unless $check{undefined_subs} - and $op->name eq "gv" - and $op->next->name eq "entersub"; - - my $gv = $op->gv_harder; - my $subname = $gv->STASH->NAME . "::" . $gv->NAME; - - no strict 'refs'; ## no critic strict - if ( not exists &$subname ) { - $subname =~ s/\Amain:://; - warning q[Nonexistent subroutine '%s' called], $subname; - } - elsif ( not defined &$subname ) { - $subname =~ s/\A\&?main:://; - warning q[Undefined subroutine '%s' called], $subname; - } - } - - # Call all registered plugins - my $m; - $m = $_->can('match'), $op->$m( \%check ) for @plugins; - return; -} - -sub B::GV::lintcv { - - # Example: B::svref_2object( \ *A::Glob )->lintcv - - my $gv = shift @_; - my $cv = $gv->CV; - return unless $cv->can('lintcv'); - $cv->lintcv; - return; -} - -sub B::CV::lintcv { - - # Example: B::svref_2object( \ &foo )->lintcv - - # Write to the *global* $ - $curcv = shift @_; - - #warn sprintf("lintcv: %s::%s (done=%d)\n", - # $gv->STASH->NAME, $gv->NAME, $done_cv{$$curcv});#debug - return unless ref($curcv) and $$curcv and not $done_cv{$$curcv}++; - my $root = $curcv->ROOT; - - #warn " root = $root (0x$$root)\n";#debug - walkoptree_slow( $root, "lint" ) if $$root; - return; -} - -sub do_lint { - my %search_pack; - - # Copy to the global $curcv for use in pad lookups. - $curcv = main_cv; - walkoptree_slow( main_root, "lint" ) if ${ main_root() }; - - # Do all the miscellaneous non-sub blocks. - for my $av ( begin_av, init_av, check_av, end_av ) { - next unless eval { $av->isa('B::AV') }; - for my $cv ( $av->ARRAY ) { - next unless ref($cv) and $cv->FILE eq $0; - $cv->lintcv; - } - } - - walksymtable( - \%main::, - sub { - if ( $_[0]->FILE eq $0 ) { $_[0]->lintcv } - }, - sub {1} - ); - return; -} - -sub compile { - my @options = @_; - - # Turn on default lint checks - for my $opt (@default_checks) { - $check{$opt} = 1; - } - -OPTION: - while ( my $option = shift @options ) { - my ( $opt, $arg ); - unless ( ( $opt, $arg ) = $option =~ m/\A-(.)(.*)/xms ) { - unshift @options, $option; - last OPTION; - } - - if ( $opt eq "-" && $arg eq "-" ) { - shift @options; - last OPTION; - } - elsif ( $opt eq "D" ) { - $arg ||= shift @options; - foreach my $arg ( split //, $arg ) { - if ( $arg eq "o" ) { - B->debug(1); - } - elsif ( $arg eq "O" ) { - $debug_op = 1; - } - } - } - elsif ( $opt eq "u" ) { - $arg ||= shift @options; - push @extra_packages, $arg; - } - } - - foreach my $opt ( @default_checks, @options ) { - $opt =~ tr/-/_/; - if ( $opt eq "all" ) { - %check = %valid_check; - } - elsif ( $opt eq "none" ) { - %check = (); - } - else { - if ( $opt =~ s/\Ano_//xms ) { - $check{$opt} = 0; - } - else { - $check{$opt} = 1; - } - carp "No such check: $opt" - unless defined $valid_check{$opt}; - } - } - - # Remaining arguments are things to check. So why aren't I - # capturing them or something? I don't know. - - return \&do_lint; -} - -sub register_plugin { - my ( undef, $plugin, $new_checks ) = @_; - - # Allow the user to be lazy and not give us a name. - $plugin = caller unless defined $plugin; - - # Register the plugin's named checks, if any. - for my $check ( eval {@$new_checks} ) { - if ( not defined $check ) { - carp 'Undefined value in checks.'; - next; - } - if ( exists $valid_check{$check} ) { - carp - "$check is already registered as a $valid_check{$check} feature."; - next; - } - - $valid_check{$check} = $plugin; - } - - # Register a non-Module::Pluggable loaded module. @plugins already - # contains whatever M::P found on disk. The user might load a - # plugin manually from some arbitrary namespace and ask for it to - # be registered. - if ( not any { $_ eq $plugin } @plugins ) { - push @plugins, $plugin; - } - - return; -} - -1; diff --git a/Master/tlpkg/tlperl/lib/B/Lint/Debug.pm b/Master/tlpkg/tlperl/lib/B/Lint/Debug.pm deleted file mode 100644 index 7dea1b57b24..00000000000 --- a/Master/tlpkg/tlperl/lib/B/Lint/Debug.pm +++ /dev/null @@ -1,73 +0,0 @@ -package B::Lint::Debug; -use if $] > 5.017, 'deprecate'; - -our $VERSION = '1.17'; - -=head1 NAME - -B::Lint::Debug - Adds debugging stringification to B:: - -=head1 DESCRIPTION - -This module injects stringification to a B::OP*/B::SPECIAL. This -should not be loaded unless you're debugging. - -=cut - -package # hide from PAUSE - B::SPECIAL; -use overload '""' => sub { - my $self = shift @_; - "SPECIAL($$self)"; -}; - -package # hide from PAUSE - B::OP; -use overload '""' => sub { - my $self = shift @_; - my $class = ref $self; - $class =~ s/\AB:://xms; - my $name = $self->name; - "$class($name)"; -}; - -package # hide from PAUSE - B::SVOP; -use overload '""' => sub { - my $self = shift @_; - my $class = ref $self; - $class =~ s/\AB:://xms; - my $name = $self->name; - "$class($name," . $self->sv . "," . $self->gv . ")"; -}; - -package # hide from PAUSE - B::SPECIAL; -sub DESTROY { } -our $AUTOLOAD; - -sub AUTOLOAD { - my $cx = 0; - print "AUTOLOAD $AUTOLOAD\n"; - - package # hide from PAUSE - DB; - while ( my @stuff = caller $cx ) { - - print "$cx: [@DB::args] [@stuff]\n"; - if ( ref $DB::args[0] ) { - if ( $DB::args[0]->can('padix') ) { - print " PADIX: " . $DB::args[0]->padix . "\n"; - } - if ( $DB::args[0]->can('targ') ) { - print " TARG: " . $DB::args[0]->targ . "\n"; - for ( B::Lint::cv()->PADLIST->ARRAY ) { - print +( $_->ARRAY )[ $DB::args[0]->targ ] . "\n"; - } - } - } - ++$cx; - } -} - -1; diff --git a/Master/tlpkg/tlperl/lib/B/Showlex.pm b/Master/tlpkg/tlperl/lib/B/Showlex.pm index 2de8aa49b28..ab684516100 100644 --- a/Master/tlpkg/tlperl/lib/B/Showlex.pm +++ b/Master/tlpkg/tlperl/lib/B/Showlex.pm @@ -1,6 +1,6 @@ package B::Showlex; -our $VERSION = '1.03'; +our $VERSION = '1.04'; use strict; use B qw(svref_2object comppadlist class); @@ -196,7 +196,7 @@ example. See L for a fuller explanation of reasons. Some of the reported info, such as hex addresses, is not particularly valuable. Other information would be more useful for the typical programmer, such as line-numbers, pad-slot reuses, etc.. Given this, --newlex isnt a particularly good flag-name. +-newlex is not a particularly good flag-name. =head1 AUTHOR diff --git a/Master/tlpkg/tlperl/lib/Benchmark.pm b/Master/tlpkg/tlperl/lib/Benchmark.pm index 1fa187ee1d7..9a43a2bc60e 100644 --- a/Master/tlpkg/tlperl/lib/Benchmark.pm +++ b/Master/tlpkg/tlperl/lib/Benchmark.pm @@ -37,7 +37,7 @@ Benchmark - benchmark running times of Perl code }); # ...or in two stages - $results = timethese($count, + $results = timethese($count, { 'Name1' => sub { ...code1... }, 'Name2' => sub { ...code2... }, @@ -221,7 +221,8 @@ difference between each pair of tests. C can also be passed the data structure that timethese() returns: - $results = timethese( -1, { a => "++\$i", b => "\$i *= 2" } ) ; + $results = timethese( -1, + { a => "++\$i", b => "\$i *= 2" } ) ; cmpthese( $results ); in case you want to see both sets of results. @@ -231,7 +232,8 @@ that is RESULTSHASHREF; otherwise that is COUNT. Returns a reference to an ARRAY of rows, each row is an ARRAY of cells from the above chart, including labels. This: - my $rows = cmpthese( -1, { a => '++$i', b => '$i *= 2' }, "none" ); + my $rows = cmpthese( -1, + { a => '++$i', b => '$i *= 2' }, "none" ); returns a data structure like: @@ -290,6 +292,46 @@ wallclock time to be measured in microseconds, instead of integer seconds. Note though that the speed computations are still conducted in CPU time, not wallclock time. +=head1 Benchmark Object + +Many of the functions in this module return a Benchmark object, +or in the case of C, a reference to a hash, the values of +which are Benchmark objects. This is useful if you want to store or +further process results from Benchmark functions. + +Internally the Benchmark object holds timing values, +described in L below. +The following methods can be used to access them: + +=over 4 + +=item cpu_p + +Total CPU (User + System) of the main (parent) process. + +=item cpu_c + +Total CPU (User + System) of any children processes. + +=item cpu_a + +Total CPU of parent and any children processes. + +=item real + +Real elapsed time "wallclock seconds". + +=item iters + +Number of iterations run. + +=back + +The following illustrates use of the Benchmark object: + + $result = timethis(100000, sub { ... }); + print "total CPU = ", $result->cpu_a, "\n"; + =head1 NOTES The data is stored as a list of values from the time and times @@ -339,7 +381,7 @@ outputs something like this: a 4152037/s 166% -- -while +while use Benchmark qw( timethese cmpthese ) ; $x = 3; @@ -402,8 +444,8 @@ documentation. April 04-07th, 1997: by Jarkko Hietaniemi, added the run-for-some-time functionality. -September, 1999; by Barrie Slaymaker: math fixes and accuracy and -efficiency tweaks. Added cmpthese(). A result is now returned from +September, 1999; by Barrie Slaymaker: math fixes and accuracy and +efficiency tweaks. Added cmpthese(). A result is now returned from timethese(). Exposed countit() (was runfor()). December, 2001; by Nicholas Clark: make timestr() recognise the style 'none' @@ -440,7 +482,7 @@ our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); clearcache clearallcache disablecache enablecache); %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ; -$VERSION = 1.15; +$VERSION = 1.18; # --- ':hireswallclock' special handling @@ -485,7 +527,7 @@ sub init { sub debug { $Debug = ($_[1] != 0); } -sub usage { +sub usage { my $calling_sub = (caller(1))[3]; $calling_sub =~ s/^Benchmark:://; return $_Usage{$calling_sub} || ''; @@ -498,18 +540,18 @@ $_Usage{clearcache} = <<'USAGE'; usage: clearcache($count); USAGE -sub clearcache { +sub clearcache { die usage unless @_ == 1; - delete $Cache{"$_[0]c"}; delete $Cache{"$_[0]s"}; + delete $Cache{"$_[0]c"}; delete $Cache{"$_[0]s"}; } $_Usage{clearallcache} = <<'USAGE'; usage: clearallcache(); USAGE -sub clearallcache { +sub clearallcache { die usage if @_; - %Cache = (); + %Cache = (); } $_Usage{enablecache} = <<'USAGE'; @@ -518,7 +560,7 @@ USAGE sub enablecache { die usage if @_; - $Do_Cache = 1; + $Do_Cache = 1; } $_Usage{disablecache} = <<'USAGE'; @@ -527,7 +569,7 @@ USAGE sub disablecache { die usage if @_; - $Do_Cache = 0; + $Do_Cache = 0; } @@ -652,7 +694,7 @@ sub runloop { croak "runloop unable to compile '$c': $@\ncode: $subcode\n" if $@; print STDERR "runloop $n '$subcode'\n" if $Debug; - # Wait for the user timer to tick. This makes the error range more like + # Wait for the user timer to tick. This makes the error range more like # -0.01, +0. If we don't wait, then it's more like -0.01, +0.01. This # may not seem important, but it significantly reduces the chances of # getting a too low initial $n in the initial, 'find the minimum' loop @@ -730,11 +772,23 @@ sub countit { # First find the minimum $n that gives a significant timing. my $zeros=0; for ($n = 1; ; $n *= 2 ) { + my $t0 = Benchmark->new(0); my $td = timeit($n, $code); + my $t1 = Benchmark->new(0); $tc = $td->[1] + $td->[2]; if ( $tc <= 0 and $n > 1024 ) { - ++$zeros > 16 - and die "Timing is consistently zero in estimation loop, cannot benchmark. N=$n\n"; + my $d = timediff($t1, $t0); + # note that $d is the total CPU time taken to call timeit(), + # while $tc is is difference in CPU secs between the empty run + # and the code run. If the code is trivial, its possible + # for $d to get large while $tc is still zero (or slightly + # negative). Bail out once timeit() starts taking more than a + # few seconds without noticeable difference. + if ($d->[1] + $d->[2] > 8 + || ++$zeros > 16) + { + die "Timing is consistently zero in estimation loop, cannot benchmark. N=$n\n"; + } } else { $zeros = 0; } @@ -748,7 +802,7 @@ sub countit { while ( $tc < $tpra ) { # The 5% fudge is to keep us from iterating again all # that often (this speeds overall responsiveness when $tmax is big - # and we guess a little low). This does not noticably affect + # and we guess a little low). This does not noticeably affect # accuracy since we're not counting these times. $n = int( $tpra * 1.05 * $n / $tc ); # Linear approximation. my $td = timeit($n, $code); @@ -929,10 +983,10 @@ sub cmpthese{ my @rows; my @col_widths; - my @top_row = ( - '', - $display_as_rate ? 'Rate' : 's/iter', - map { $_->[0] } @vals + my @top_row = ( + '', + $display_as_rate ? 'Rate' : 's/iter', + map { $_->[0] } @vals ); push @rows, \@top_row; @@ -958,9 +1012,9 @@ sub cmpthese{ # Only give a few decimal places before switching to sci. notation, # since the results aren't usually that accurate anyway. - my $format = - $rate >= 100 ? - "%0.0f" : + my $format = + $rate >= 100 ? + "%0.0f" : $rate >= 10 ? "%0.1f" : $rate >= 1 ? @@ -997,7 +1051,7 @@ sub cmpthese{ $col_widths[$col_num+2] = length( $out ) if length( $out ) > $col_widths[$col_num+2]; - # A little wierdness to set the first column width properly + # A little weirdness to set the first column width properly $col_widths[$col_num+2] = length( $col_val->[0] ) if length( $col_val->[0] ) > $col_widths[$col_num+2]; } @@ -1008,7 +1062,7 @@ sub cmpthese{ # Equalize column widths in the chart as much as possible without # exceeding 80 characters. This does not use or affect cols 0 or 1. - my @sorted_width_refs = + my @sorted_width_refs = sort { $$a <=> $$b } map { \$_ } @col_widths[2..$#col_widths]; my $max_width = ${$sorted_width_refs[-1]}; @@ -1021,7 +1075,7 @@ sub cmpthese{ last if $min_width == $max_width; for ( @sorted_width_refs ) { - last + last if $$_ > $min_width; ++$$_; ++$total; diff --git a/Master/tlpkg/tlperl/lib/CGI.pm b/Master/tlpkg/tlperl/lib/CGI.pm index df63490129c..bcee2b1134d 100644 --- a/Master/tlpkg/tlperl/lib/CGI.pm +++ b/Master/tlpkg/tlperl/lib/CGI.pm @@ -1,5 +1,6 @@ package CGI; require 5.008001; +use if $] >= 5.019, 'deprecate'; use Carp 'croak'; # See the bottom of this file for the POD documentation. Search for the @@ -18,9 +19,9 @@ use Carp 'croak'; # The most recent version and complete docs are available at: # http://search.cpan.org/dist/CGI.pm -# The revision is no longer being updated since moving to git. +# The revision is no longer being updated since moving to git. $CGI::revision = '$Id: CGI.pm,v 1.266 2009/07/30 16:32:34 lstein Exp $'; -$CGI::VERSION='3.63'; +$CGI::VERSION='3.65'; # HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES. # UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING. @@ -171,7 +172,7 @@ $DefaultClass = 'CGI' unless defined $CGI::DefaultClass; $AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass; # The path separator is a slash, backslash or semicolon, depending -# on the paltform. +# on the platform. $SL = { UNIX => '/', OS2 => '\\', EPOC => '/', CYGWIN => '/', NETWARE => '/', WINDOWS => '\\', DOS => '\\', MACINTOSH => ':', VMS => '/' @@ -3131,7 +3132,7 @@ END_OF_FUNC sub user_agent { my($self,$match)=self_or_CGI(@_); my $user_agent = $self->http('user_agent'); - return $user_agent unless $match && $user_agent; + return $user_agent unless defined $match && $match && $user_agent; return $user_agent =~ /$match/i; } END_OF_FUNC @@ -4320,7 +4321,7 @@ submissions, file uploads, reading and writing cookies, query string generation and manipulation, and processing and preparing HTTP headers. Some HTML generation utilities are included as well. -CGI.pm performs very well in in a vanilla CGI.pm environment and also comes +CGI.pm performs very well in a vanilla CGI.pm environment and also comes with built-in support for mod_perl and mod_perl2 as well as FastCGI. It has the benefit of having developed and refined over 10 years with input @@ -5506,9 +5507,9 @@ backwards compatibility. The old-style positional parameters are as follows: -=over 4 +B -=item B +=over 4 =item 1. @@ -5524,13 +5525,12 @@ A 'true' flag if you want to include a tag in the header. This helps resolve relative addresses to absolute ones when the document is moved, but makes the document hierarchy non-portable. Use with care! -=item 4, 5, 6... - -Any other parameters you want to include in the tag. This is a good -place to put HTML extensions, such as colors and wallpaper patterns. - =back +Other parameters you want to include in the tag may be appended +to these. This is a good place to put HTML extensions, such as colors and +wallpaper patterns. + =head2 ENDING THE HTML DOCUMENT: print $q->end_html; @@ -6076,9 +6076,9 @@ supported. textfield() will return a text input field. -=over 4 +B -=item B +=over 4 =item 1. @@ -6159,9 +6159,9 @@ by calling B with an encoding type of B<&CGI::MULTIPART>, or by calling the new method B instead of vanilla B. -=over 4 +B -=item B +=over 4 =item 1. @@ -6514,9 +6514,9 @@ attribute's value as the value. scrolling_list() creates a scrolling list. -=over 4 +B -=item B +=over 4 =item 1. @@ -6590,9 +6590,9 @@ selected items can be retrieved with: checkbox_group() creates a list of checkboxes that are related by the same name. -=over 4 +B -=item B +=over 4 =item 1. @@ -6617,7 +6617,6 @@ list. Otherwise, they will be strung together on a horizontal line. =back - The optional B<-labels> argument is a pointer to a hash relating the checkbox values to the user-visible labels that will be printed next to them. If not provided, the values will be used as the @@ -6683,9 +6682,9 @@ or in other creative ways: checkbox() is used to create an isolated checkbox that isn't logically related to any others. -=over 4 +B -=item B +=over 4 =item 1. @@ -6740,9 +6739,9 @@ The value of the checkbox can be retrieved using: radio_group() creates a set of logically-related radio buttons (turning one member of the group on turns the others off) -=over 4 +B -=item B +=over 4 =item 1. @@ -6777,7 +6776,6 @@ displayed. =back - All modern browsers can take advantage of the optional parameters B<-rows>, and B<-columns>. These parameters cause radio_group() to return an HTML3 compatible table containing the radio group formatted @@ -6840,9 +6838,9 @@ or in other creative ways: submit() will create the query submission button. Every form should have one of these. -=over 4 +B -=item B +=over 4 =item 1. @@ -6901,9 +6899,9 @@ hidden() produces a text field that can't be seen by the user. It is useful for passing state variable information from one invocation of the script to the next. -=over 4 +B -=item B +=over 4 =item 1. @@ -6944,9 +6942,9 @@ position of the click is returned to your script as "button_name.x" and "button_name.y", where "button_name" is the name you've assigned to it. -=over 4 +B -=item B +=over 4 =item 1. @@ -6958,6 +6956,7 @@ field. The second argument (-src) is also required and specifies the URL =item 3. + The third option (-align, optional) is an alignment type, and may be TOP, BOTTOM or MIDDLE diff --git a/Master/tlpkg/tlperl/lib/CGI/Apache.pm b/Master/tlpkg/tlperl/lib/CGI/Apache.pm index e055e305551..bde3ad971fd 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Apache.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Apache.pm @@ -1,7 +1,8 @@ package CGI::Apache; use CGI; +use if $] >= 5.019, 'deprecate'; -$VERSION = '1.01'; +$VERSION = '1.02'; 1; __END__ diff --git a/Master/tlpkg/tlperl/lib/CGI/Carp.pm b/Master/tlpkg/tlperl/lib/CGI/Carp.pm index c2145cafa42..806f05db138 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Carp.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Carp.pm @@ -1,4 +1,5 @@ package CGI::Carp; +use if $] >= 5.019, 'deprecate'; =head1 NAME @@ -191,13 +192,13 @@ when a C is done inside an C body or expression. Even though the fatalsToBrower support takes precautions to avoid this, you still may get the error message printed to STDOUT. -This may have some undesireable effects when the purpose of doing the +This may have some undesirable effects when the purpose of doing the eval is to determine which of several algorithms is to be used. By setting C<$CGI::Carp::TO_BROWSER> to 0 you can suppress printing the C messages but without all of the complexity of using C. You can localize this effect to inside C -bodies if this is desireable: For example: +bodies if this is desirable: For example: eval { local $CGI::Carp::TO_BROWSER = 0; @@ -344,7 +345,7 @@ use File::Spec; $main::SIG{__WARN__}=\&CGI::Carp::warn; -$CGI::Carp::VERSION = '3.51'; +$CGI::Carp::VERSION = '3.64'; $CGI::Carp::CUSTOM_MSG = undef; $CGI::Carp::DIE_HANDLER = undef; $CGI::Carp::TO_BROWSER = 1; diff --git a/Master/tlpkg/tlperl/lib/CGI/Cookie.pm b/Master/tlpkg/tlperl/lib/CGI/Cookie.pm index da916aca652..5cc2dc20038 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Cookie.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Cookie.pm @@ -3,6 +3,8 @@ package CGI::Cookie; use strict; use warnings; +use if $] >= 5.019, 'deprecate'; + # See the bottom of this file for the POD documentation. Search for the # string '=head'. @@ -16,7 +18,7 @@ use warnings; # wish, but if you redistribute a modified version, please attach a note # listing the modifications you have made. -our $VERSION='1.30'; +our $VERSION='1.31'; use CGI::Util qw(rearrange unescape escape); use overload '""' => \&as_string, 'cmp' => \&compare, 'fallback' => 1; @@ -334,13 +336,12 @@ If the "httponly" attribute is set, the cookie will only be accessible through HTTP Requests. This cookie will be inaccessible via JavaScript (to prevent XSS attacks). -This feature is only supported by recent browsers like Internet Explorer -6 Service Pack 1, Firefox 3.0 and Opera 9.5 (and later of course). +This feature is supported by nearly all modern browsers. See these URLs for more information: http://msdn.microsoft.com/en-us/library/ms533046.aspx - http://www.owasp.org/index.php/HTTPOnly#Browsers_Supporting_HTTPOnly + http://www.browserscope.org/?category=security&v=top =back diff --git a/Master/tlpkg/tlperl/lib/CGI/Fast.pm b/Master/tlpkg/tlperl/lib/CGI/Fast.pm index 288d854a9d5..01f7359c1c2 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Fast.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Fast.pm @@ -1,5 +1,6 @@ package CGI::Fast; use strict; +use if $] >= 5.019, 'deprecate'; # A way to say "use warnings" that's compatible with even older perls. # making it local will not affect the code that loads this module @@ -19,7 +20,7 @@ local $^W = 1; # wish, but if you redistribute a modified version, please attach a note # listing the modifications you have made. -$CGI::Fast::VERSION='1.09'; +$CGI::Fast::VERSION='1.10'; use CGI; use FCGI; diff --git a/Master/tlpkg/tlperl/lib/CGI/Pretty.pm b/Master/tlpkg/tlperl/lib/CGI/Pretty.pm index 869fe0cdf2e..acded21e6d8 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Pretty.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Pretty.pm @@ -8,9 +8,10 @@ package CGI::Pretty; # Perl 5 distribution). use strict; +use if $] >= 5.019, 'deprecate'; use CGI (); -$CGI::Pretty::VERSION = '3.46'; +$CGI::Pretty::VERSION = '3.64'; $CGI::DefaultClass = __PACKAGE__; $CGI::Pretty::AutoloadClass = 'CGI'; @CGI::Pretty::ISA = qw( CGI ); @@ -168,7 +169,7 @@ 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 + # This is the string used for separation between tags $CGI::Pretty::LINEBREAK = $/; # These tags are not prettify'd. diff --git a/Master/tlpkg/tlperl/lib/CGI/Push.pm b/Master/tlpkg/tlperl/lib/CGI/Push.pm index 2af7d794da1..3353efcbcaf 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Push.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Push.pm @@ -1,4 +1,5 @@ package CGI::Push; +use if $] >= 5.019, 'deprecate'; # See the bottom of this file for the POD documentation. Search for the # string '=head'. @@ -16,7 +17,7 @@ package CGI::Push; # The most recent version and complete docs are available at: # http://stein.cshl.org/WWW/software/CGI/ -$CGI::Push::VERSION='1.05'; +$CGI::Push::VERSION='1.06'; use CGI; use CGI::Util 'rearrange'; @ISA = ('CGI'); diff --git a/Master/tlpkg/tlperl/lib/CGI/Switch.pm b/Master/tlpkg/tlperl/lib/CGI/Switch.pm index a311080e49f..ec21fe2f065 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Switch.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Switch.pm @@ -1,7 +1,8 @@ package CGI::Switch; +use if $] >= 5.019, 'deprecate'; use CGI; -$VERSION = '1.01'; +$VERSION = '1.02'; 1; diff --git a/Master/tlpkg/tlperl/lib/CGI/Util.pm b/Master/tlpkg/tlperl/lib/CGI/Util.pm index 494560e1292..4a1f28f1a7d 100644 --- a/Master/tlpkg/tlperl/lib/CGI/Util.pm +++ b/Master/tlpkg/tlperl/lib/CGI/Util.pm @@ -2,10 +2,11 @@ package CGI::Util; use base 'Exporter'; require 5.008001; use strict; +use if $] >= 5.019, 'deprecate'; our @EXPORT_OK = qw(rearrange rearrange_header make_attributes unescape escape expires ebcdic2ascii ascii2ebcdic); -our $VERSION = '3.62'; +our $VERSION = '3.64'; use constant EBCDIC => "\t" ne "\011"; @@ -210,7 +211,7 @@ sub unescape { # Byte strings were traditionally used directly as a sequence of octets. # This worked if they actually represented binary data (i.e. in CGI::Compress). # This also worked if these byte strings were actually utf-8 encoded; e.g., -# when the source file used utf-8 without the apropriate "use utf8;". +# when the source file used utf-8 without the appropriate "use utf8;". # This fails if the byte string is actually a Latin 1 encoded string, but it # was always so and cannot be fixed without breaking the binary data case. # -- Stepan Kasal diff --git a/Master/tlpkg/tlperl/lib/CORE.pod b/Master/tlpkg/tlperl/lib/CORE.pod new file mode 100644 index 00000000000..ce5feb5908a --- /dev/null +++ b/Master/tlpkg/tlperl/lib/CORE.pod @@ -0,0 +1,96 @@ +=head1 NAME + +CORE - Namespace for Perl's core routines + +=head1 SYNOPSIS + + BEGIN { + *CORE::GLOBAL::hex = sub { 1; }; + } + + print hex("0x50"),"\n"; # prints 1 + print CORE::hex("0x50"),"\n"; # prints 80 + CORE::say "yes"; # prints yes + + BEGIN { *shove = \&CORE::push; } + shove @array, 1,2,3; # pushes on to @array + +=head1 DESCRIPTION + +The C namespace gives access to the original built-in functions of +Perl. The C package is built into +Perl, and therefore you do not need to use or +require a hypothetical "CORE" module prior to accessing routines in this +namespace. + +A list of the built-in functions in Perl can be found in L. + +For all Perl keywords, a C prefix will force the built-in function +to be used, even if it has been overridden or would normally require the +L pragma. Despite appearances, this has nothing to do with the +CORE package, but is part of Perl's syntax. + +For many Perl functions, the CORE package contains real subroutines. This +feature is new in Perl 5.16. You can take references to these and make +aliases. However, some can only be called as barewords; i.e., you cannot +use ampersand syntax (C<&foo>) or call them through references. See the +C example above. These subroutines exist for all keywords except the following: + +C<__DATA__>, C<__END__>, C, C, C, C, C, +C, C, C, C, C, C, C, C, +C, C, C, C, C, C, C, C, C, +C, C, C, C, C, C, C, C, C, +C, C, C, C, C, C, C, C, C, +C, C, C, C, C, C, C, C, +C, C, C, C, C, C, C + +Calling with +ampersand syntax and through references does not work for the following +functions, as they have special syntax that cannot always be translated +into a simple list (e.g., C vs C): + +C, C, C, C, C, C, +C, C, C, C, C, C, C, +C, C, C, C, C, C, +C, C, C + +=head1 OVERRIDING CORE FUNCTIONS + +To override a Perl built-in routine with your own version, you need to +import it at compile-time. This can be conveniently achieved with the +C pragma. This will affect only the package in which you've imported +the said subroutine: + + use subs 'chdir'; + sub chdir { ... } + chdir $somewhere; + +To override a built-in globally (that is, in all namespaces), you need to +import your function into the C pseudo-namespace at compile +time: + + BEGIN { + *CORE::GLOBAL::hex = sub { + # ... your code here + }; + } + +The new routine will be called whenever a built-in function is called +without a qualifying package: + + print hex("0x50"),"\n"; # prints 1 + +In both cases, if you want access to the original, unaltered routine, use +the C prefix: + + print CORE::hex("0x50"),"\n"; # prints 80 + +=head1 AUTHOR + +This documentation provided by Tels 2007. + +=head1 SEE ALSO + +L, L. + +=cut diff --git a/Master/tlpkg/tlperl/lib/CORE/XSUB.h b/Master/tlpkg/tlperl/lib/CORE/XSUB.h index e5614fb8457..187919158cc 100644 --- a/Master/tlpkg/tlperl/lib/CORE/XSUB.h +++ b/Master/tlpkg/tlperl/lib/CORE/XSUB.h @@ -22,7 +22,7 @@ class name for a C++ XS constructor. This is always a C. See C. =for apidoc Amn|(whatever)|RETVAL Variable which is setup by C to hold the return value for an -XSUB. This is always the proper type for the XSUB. See +XSUB. This is always the proper type for the XSUB. See L. =for apidoc Amn|(whatever)|THIS @@ -48,7 +48,7 @@ Used to access elements on the XSUB's stack. =for apidoc AmU||XS Macro to declare an XSUB and its C parameter list. This is handled by -C. It is the same as using the more explicit XS_EXTERNAL macro. +C. It is the same as using the more explicit XS_EXTERNAL macro. =for apidoc AmU||XS_INTERNAL Macro to declare an XSUB and its C parameter list without exporting the symbols. @@ -80,12 +80,12 @@ Sets up the C variable for an XSUB which has aliases. This is usually handled automatically by C. =for apidoc Ams||dUNDERBAR -Sets up any variable needed by the C macro. It used to define -C, but it is currently a noop. However, it is strongly advised +Sets up any variable needed by the C macro. It used to define +C, but it is currently a noop. However, it is strongly advised to still use it for ensuring past and future compatibility. =for apidoc AmU||UNDERBAR -The SV* corresponding to the $_ variable. Works even if there +The SV* corresponding to the $_ variable. Works even if there is a lexical $_ in scope. =cut diff --git a/Master/tlpkg/tlperl/lib/CORE/av.h b/Master/tlpkg/tlperl/lib/CORE/av.h index 391ae36d742..e15ebe69e43 100644 --- a/Master/tlpkg/tlperl/lib/CORE/av.h +++ b/Master/tlpkg/tlperl/lib/CORE/av.h @@ -73,6 +73,9 @@ Same as C. #define AvREIFY_on(av) (SvFLAGS(av) |= SVpav_REIFY) #define AvREIFY_off(av) (SvFLAGS(av) &= ~SVpav_REIFY) #define AvREIFY_only(av) (AvREAL_off(av), SvFLAGS(av) |= SVpav_REIFY) +#define AvPAD_NAMELIST(av) (SvFLAGS(av) & SVpad_NAMELIST) +#define AvPAD_NAMELIST_on(av) (SvFLAGS(av) |= SVpad_NAMELIST) + #define AvREALISH(av) (SvFLAGS(av) & (SVpav_REAL|SVpav_REIFY)) diff --git a/Master/tlpkg/tlperl/lib/CORE/charclass_invlists.h b/Master/tlpkg/tlperl/lib/CORE/charclass_invlists.h index b5d71afb16d..7bc14d88d0f 100644 --- a/Master/tlpkg/tlperl/lib/CORE/charclass_invlists.h +++ b/Master/tlpkg/tlperl/lib/CORE/charclass_invlists.h @@ -9,28 +9,25 @@ #ifndef PERL_IN_XSUB_RE -static UV Latin1_invlist[] = { +static const UV Latin1_invlist[] = { 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 0, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 256, - 0 + 148565664, /* Version and data structure type */ + 0, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, + 256 }; #endif #ifndef PERL_IN_XSUB_RE -static UV AboveLatin1_invlist[] = { - 1, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV AboveLatin1_invlist[] = { + 2, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 256 }; @@ -38,28 +35,25 @@ static UV AboveLatin1_invlist[] = { #ifndef PERL_IN_XSUB_RE -static UV ASCII_invlist[] = { +static const UV ASCII_invlist[] = { 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 0, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 128, - 0 + 148565664, /* Version and data structure type */ + 0, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, + 128 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1Cased_invlist[] = { - 16, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV Cased_invlist[] = { + 239, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 65, 91, 97, @@ -75,20 +69,241 @@ static UV L1Cased_invlist[] = { 216, 247, 248, - 443 + 443, + 444, + 448, + 452, + 660, + 661, + 697, + 704, + 706, + 736, + 741, + 837, + 838, + 880, + 884, + 886, + 888, + 890, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 1014, + 1015, + 1154, + 1162, + 1320, + 1329, + 1367, + 1377, + 1416, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 7424, + 7616, + 7680, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8450, + 8451, + 8455, + 8456, + 8458, + 8468, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8495, + 8501, + 8505, + 8506, + 8508, + 8512, + 8517, + 8522, + 8526, + 8527, + 8544, + 8576, + 8579, + 8581, + 9398, + 9450, + 11264, + 11311, + 11312, + 11359, + 11360, + 11493, + 11499, + 11503, + 11506, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 42560, + 42606, + 42624, + 42648, + 42786, + 42888, + 42891, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43003, + 64256, + 64263, + 64275, + 64280, + 65313, + 65339, + 65345, + 65371, + 66560, + 66640, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120513, + 120514, + 120539, + 120540, + 120571, + 120572, + 120597, + 120598, + 120629, + 120630, + 120655, + 120656, + 120687, + 120688, + 120713, + 120714, + 120745, + 120746, + 120771, + 120772, + 120780 }; #endif #ifndef PERL_IN_XSUB_RE -static UV VertSpace_invlist[] = { - 6, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV VertSpace_invlist[] = { + 7, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 10, 14, 133, @@ -101,30 +316,12 @@ static UV VertSpace_invlist[] = { #ifndef PERL_IN_XSUB_RE -static UV PerlSpace_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 9, - 14, - 32, - 33 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV XPerlSpace_invlist[] = { - 22, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPerlSpace_invlist[] = { + 21, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 9, 14, 32, @@ -135,8 +332,6 @@ static UV XPerlSpace_invlist[] = { 161, 5760, 5761, - 6158, - 6159, 8192, 8203, 8232, @@ -153,32 +348,12 @@ static UV XPerlSpace_invlist[] = { #ifndef PERL_IN_XSUB_RE -static UV PosixAlnum_invlist[] = { - 6, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 48, - 58, - 65, - 91, - 97, - 123 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV L1PosixAlnum_invlist[] = { - 18, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixAlnum_invlist[] = { + 1133, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 48, 58, 65, @@ -196,37 +371,1133 @@ static UV L1PosixAlnum_invlist[] = { 216, 247, 248, - 706 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixAlpha_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 65, - 91, - 97, - 123 + 706, + 710, + 722, + 736, + 741, + 748, + 749, + 750, + 751, + 837, + 838, + 880, + 885, + 886, + 888, + 890, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 1014, + 1015, + 1154, + 1162, + 1320, + 1329, + 1367, + 1369, + 1370, + 1377, + 1416, + 1456, + 1470, + 1471, + 1472, + 1473, + 1475, + 1476, + 1478, + 1479, + 1480, + 1488, + 1515, + 1520, + 1523, + 1552, + 1563, + 1568, + 1624, + 1625, + 1642, + 1646, + 1748, + 1749, + 1757, + 1761, + 1769, + 1773, + 1789, + 1791, + 1792, + 1808, + 1856, + 1869, + 1970, + 1984, + 2027, + 2036, + 2038, + 2042, + 2043, + 2048, + 2072, + 2074, + 2093, + 2112, + 2137, + 2208, + 2209, + 2210, + 2221, + 2276, + 2282, + 2288, + 2303, + 2304, + 2364, + 2365, + 2381, + 2382, + 2385, + 2389, + 2404, + 2406, + 2416, + 2417, + 2424, + 2425, + 2432, + 2433, + 2436, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2493, + 2501, + 2503, + 2505, + 2507, + 2509, + 2510, + 2511, + 2519, + 2520, + 2524, + 2526, + 2527, + 2532, + 2534, + 2546, + 2561, + 2564, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2622, + 2627, + 2631, + 2633, + 2635, + 2637, + 2641, + 2642, + 2649, + 2653, + 2654, + 2655, + 2662, + 2678, + 2689, + 2692, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2749, + 2758, + 2759, + 2762, + 2763, + 2765, + 2768, + 2769, + 2784, + 2788, + 2790, + 2800, + 2817, + 2820, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2877, + 2885, + 2887, + 2889, + 2891, + 2893, + 2902, + 2904, + 2908, + 2910, + 2911, + 2916, + 2918, + 2928, + 2929, + 2930, + 2946, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3006, + 3011, + 3014, + 3017, + 3018, + 3021, + 3024, + 3025, + 3031, + 3032, + 3046, + 3056, + 3073, + 3076, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3141, + 3142, + 3145, + 3146, + 3149, + 3157, + 3159, + 3160, + 3162, + 3168, + 3172, + 3174, + 3184, + 3202, + 3204, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3261, + 3269, + 3270, + 3273, + 3274, + 3277, + 3285, + 3287, + 3294, + 3295, + 3296, + 3300, + 3302, + 3312, + 3313, + 3315, + 3330, + 3332, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3397, + 3398, + 3401, + 3402, + 3405, + 3406, + 3407, + 3415, + 3416, + 3424, + 3428, + 3430, + 3440, + 3450, + 3456, + 3458, + 3460, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3535, + 3541, + 3542, + 3543, + 3544, + 3552, + 3570, + 3572, + 3585, + 3643, + 3648, + 3655, + 3661, + 3662, + 3664, + 3674, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3770, + 3771, + 3774, + 3776, + 3781, + 3782, + 3783, + 3789, + 3790, + 3792, + 3802, + 3804, + 3808, + 3840, + 3841, + 3872, + 3882, + 3904, + 3912, + 3913, + 3949, + 3953, + 3970, + 3976, + 3992, + 3993, + 4029, + 4096, + 4151, + 4152, + 4153, + 4155, + 4170, + 4176, + 4195, + 4197, + 4201, + 4206, + 4231, + 4238, + 4239, + 4240, + 4250, + 4252, + 4254, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4347, + 4348, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4959, + 4960, + 4992, + 5008, + 5024, + 5109, + 5121, + 5741, + 5743, + 5760, + 5761, + 5787, + 5792, + 5867, + 5870, + 5873, + 5888, + 5901, + 5902, + 5908, + 5920, + 5940, + 5952, + 5972, + 5984, + 5997, + 5998, + 6001, + 6002, + 6004, + 6016, + 6068, + 6070, + 6089, + 6103, + 6104, + 6108, + 6109, + 6112, + 6122, + 6160, + 6170, + 6176, + 6264, + 6272, + 6315, + 6320, + 6390, + 6400, + 6429, + 6432, + 6444, + 6448, + 6457, + 6470, + 6510, + 6512, + 6517, + 6528, + 6572, + 6576, + 6602, + 6608, + 6618, + 6656, + 6684, + 6688, + 6751, + 6753, + 6773, + 6784, + 6794, + 6800, + 6810, + 6823, + 6824, + 6912, + 6964, + 6965, + 6980, + 6981, + 6988, + 6992, + 7002, + 7040, + 7082, + 7084, + 7142, + 7143, + 7154, + 7168, + 7222, + 7232, + 7242, + 7245, + 7294, + 7401, + 7405, + 7406, + 7412, + 7413, + 7415, + 7424, + 7616, + 7680, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8450, + 8451, + 8455, + 8456, + 8458, + 8468, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8495, + 8506, + 8508, + 8512, + 8517, + 8522, + 8526, + 8527, + 8544, + 8585, + 9398, + 9450, + 11264, + 11311, + 11312, + 11359, + 11360, + 11493, + 11499, + 11503, + 11506, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11632, + 11648, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 11744, + 11776, + 11823, + 11824, + 12293, + 12296, + 12321, + 12330, + 12337, + 12342, + 12344, + 12349, + 12353, + 12439, + 12445, + 12448, + 12449, + 12539, + 12540, + 12544, + 12549, + 12590, + 12593, + 12687, + 12704, + 12731, + 12784, + 12800, + 13312, + 19894, + 19968, + 40909, + 40960, + 42125, + 42192, + 42238, + 42240, + 42509, + 42512, + 42540, + 42560, + 42607, + 42612, + 42620, + 42623, + 42648, + 42655, + 42736, + 42775, + 42784, + 42786, + 42889, + 42891, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43010, + 43011, + 43014, + 43015, + 43019, + 43020, + 43048, + 43072, + 43124, + 43136, + 43204, + 43216, + 43226, + 43250, + 43256, + 43259, + 43260, + 43264, + 43307, + 43312, + 43347, + 43360, + 43389, + 43392, + 43443, + 43444, + 43456, + 43471, + 43482, + 43520, + 43575, + 43584, + 43598, + 43600, + 43610, + 43616, + 43639, + 43642, + 43643, + 43648, + 43711, + 43712, + 43713, + 43714, + 43715, + 43739, + 43742, + 43744, + 43760, + 43762, + 43766, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44011, + 44016, + 44026, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 63744, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64297, + 64298, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64434, + 64467, + 64830, + 64848, + 64912, + 64914, + 64968, + 65008, + 65020, + 65136, + 65141, + 65142, + 65277, + 65296, + 65306, + 65313, + 65339, + 65345, + 65371, + 65382, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65856, + 65909, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66352, + 66379, + 66432, + 66462, + 66464, + 66500, + 66504, + 66512, + 66513, + 66518, + 66560, + 66718, + 66720, + 66730, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67840, + 67862, + 67872, + 67898, + 67968, + 68024, + 68030, + 68032, + 68096, + 68100, + 68101, + 68103, + 68108, + 68116, + 68117, + 68120, + 68121, + 68148, + 68192, + 68221, + 68352, + 68406, + 68416, + 68438, + 68448, + 68467, + 68608, + 68681, + 69632, + 69702, + 69734, + 69744, + 69762, + 69817, + 69840, + 69865, + 69872, + 69882, + 69888, + 69939, + 69942, + 69952, + 70016, + 70080, + 70081, + 70085, + 70096, + 70106, + 71296, + 71350, + 71360, + 71370, + 73728, + 74607, + 74752, + 74851, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94079, + 94099, + 94112, + 110592, + 110594, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120513, + 120514, + 120539, + 120540, + 120571, + 120572, + 120597, + 120598, + 120629, + 120630, + 120655, + 120656, + 120687, + 120688, + 120713, + 120714, + 120745, + 120746, + 120771, + 120772, + 120780, + 120782, + 120832, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1PosixAlpha_invlist[] = { - 16, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixAlpha_invlist[] = { + 1081, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 65, 91, 97, @@ -242,37 +1513,1083 @@ static UV L1PosixAlpha_invlist[] = { 216, 247, 248, - 706 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixBlank_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 9, - 10, - 32, - 33 + 706, + 710, + 722, + 736, + 741, + 748, + 749, + 750, + 751, + 837, + 838, + 880, + 885, + 886, + 888, + 890, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 1014, + 1015, + 1154, + 1162, + 1320, + 1329, + 1367, + 1369, + 1370, + 1377, + 1416, + 1456, + 1470, + 1471, + 1472, + 1473, + 1475, + 1476, + 1478, + 1479, + 1480, + 1488, + 1515, + 1520, + 1523, + 1552, + 1563, + 1568, + 1624, + 1625, + 1632, + 1646, + 1748, + 1749, + 1757, + 1761, + 1769, + 1773, + 1776, + 1786, + 1789, + 1791, + 1792, + 1808, + 1856, + 1869, + 1970, + 1994, + 2027, + 2036, + 2038, + 2042, + 2043, + 2048, + 2072, + 2074, + 2093, + 2112, + 2137, + 2208, + 2209, + 2210, + 2221, + 2276, + 2282, + 2288, + 2303, + 2304, + 2364, + 2365, + 2381, + 2382, + 2385, + 2389, + 2404, + 2417, + 2424, + 2425, + 2432, + 2433, + 2436, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2493, + 2501, + 2503, + 2505, + 2507, + 2509, + 2510, + 2511, + 2519, + 2520, + 2524, + 2526, + 2527, + 2532, + 2544, + 2546, + 2561, + 2564, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2622, + 2627, + 2631, + 2633, + 2635, + 2637, + 2641, + 2642, + 2649, + 2653, + 2654, + 2655, + 2672, + 2678, + 2689, + 2692, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2749, + 2758, + 2759, + 2762, + 2763, + 2765, + 2768, + 2769, + 2784, + 2788, + 2817, + 2820, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2877, + 2885, + 2887, + 2889, + 2891, + 2893, + 2902, + 2904, + 2908, + 2910, + 2911, + 2916, + 2929, + 2930, + 2946, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3006, + 3011, + 3014, + 3017, + 3018, + 3021, + 3024, + 3025, + 3031, + 3032, + 3073, + 3076, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3141, + 3142, + 3145, + 3146, + 3149, + 3157, + 3159, + 3160, + 3162, + 3168, + 3172, + 3202, + 3204, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3261, + 3269, + 3270, + 3273, + 3274, + 3277, + 3285, + 3287, + 3294, + 3295, + 3296, + 3300, + 3313, + 3315, + 3330, + 3332, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3397, + 3398, + 3401, + 3402, + 3405, + 3406, + 3407, + 3415, + 3416, + 3424, + 3428, + 3450, + 3456, + 3458, + 3460, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3535, + 3541, + 3542, + 3543, + 3544, + 3552, + 3570, + 3572, + 3585, + 3643, + 3648, + 3655, + 3661, + 3662, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3770, + 3771, + 3774, + 3776, + 3781, + 3782, + 3783, + 3789, + 3790, + 3804, + 3808, + 3840, + 3841, + 3904, + 3912, + 3913, + 3949, + 3953, + 3970, + 3976, + 3992, + 3993, + 4029, + 4096, + 4151, + 4152, + 4153, + 4155, + 4160, + 4176, + 4195, + 4197, + 4201, + 4206, + 4231, + 4238, + 4239, + 4252, + 4254, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4347, + 4348, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4959, + 4960, + 4992, + 5008, + 5024, + 5109, + 5121, + 5741, + 5743, + 5760, + 5761, + 5787, + 5792, + 5867, + 5870, + 5873, + 5888, + 5901, + 5902, + 5908, + 5920, + 5940, + 5952, + 5972, + 5984, + 5997, + 5998, + 6001, + 6002, + 6004, + 6016, + 6068, + 6070, + 6089, + 6103, + 6104, + 6108, + 6109, + 6176, + 6264, + 6272, + 6315, + 6320, + 6390, + 6400, + 6429, + 6432, + 6444, + 6448, + 6457, + 6480, + 6510, + 6512, + 6517, + 6528, + 6572, + 6576, + 6602, + 6656, + 6684, + 6688, + 6751, + 6753, + 6773, + 6823, + 6824, + 6912, + 6964, + 6965, + 6980, + 6981, + 6988, + 7040, + 7082, + 7084, + 7088, + 7098, + 7142, + 7143, + 7154, + 7168, + 7222, + 7245, + 7248, + 7258, + 7294, + 7401, + 7405, + 7406, + 7412, + 7413, + 7415, + 7424, + 7616, + 7680, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8450, + 8451, + 8455, + 8456, + 8458, + 8468, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8495, + 8506, + 8508, + 8512, + 8517, + 8522, + 8526, + 8527, + 8544, + 8585, + 9398, + 9450, + 11264, + 11311, + 11312, + 11359, + 11360, + 11493, + 11499, + 11503, + 11506, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11632, + 11648, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 11744, + 11776, + 11823, + 11824, + 12293, + 12296, + 12321, + 12330, + 12337, + 12342, + 12344, + 12349, + 12353, + 12439, + 12445, + 12448, + 12449, + 12539, + 12540, + 12544, + 12549, + 12590, + 12593, + 12687, + 12704, + 12731, + 12784, + 12800, + 13312, + 19894, + 19968, + 40909, + 40960, + 42125, + 42192, + 42238, + 42240, + 42509, + 42512, + 42528, + 42538, + 42540, + 42560, + 42607, + 42612, + 42620, + 42623, + 42648, + 42655, + 42736, + 42775, + 42784, + 42786, + 42889, + 42891, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43010, + 43011, + 43014, + 43015, + 43019, + 43020, + 43048, + 43072, + 43124, + 43136, + 43204, + 43250, + 43256, + 43259, + 43260, + 43274, + 43307, + 43312, + 43347, + 43360, + 43389, + 43392, + 43443, + 43444, + 43456, + 43471, + 43472, + 43520, + 43575, + 43584, + 43598, + 43616, + 43639, + 43642, + 43643, + 43648, + 43711, + 43712, + 43713, + 43714, + 43715, + 43739, + 43742, + 43744, + 43760, + 43762, + 43766, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44011, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 63744, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64297, + 64298, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64434, + 64467, + 64830, + 64848, + 64912, + 64914, + 64968, + 65008, + 65020, + 65136, + 65141, + 65142, + 65277, + 65313, + 65339, + 65345, + 65371, + 65382, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65856, + 65909, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66352, + 66379, + 66432, + 66462, + 66464, + 66500, + 66504, + 66512, + 66513, + 66518, + 66560, + 66718, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67840, + 67862, + 67872, + 67898, + 67968, + 68024, + 68030, + 68032, + 68096, + 68100, + 68101, + 68103, + 68108, + 68116, + 68117, + 68120, + 68121, + 68148, + 68192, + 68221, + 68352, + 68406, + 68416, + 68438, + 68448, + 68467, + 68608, + 68681, + 69632, + 69702, + 69762, + 69817, + 69840, + 69865, + 69888, + 69939, + 70016, + 70080, + 70081, + 70085, + 71296, + 71350, + 73728, + 74607, + 74752, + 74851, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94079, + 94099, + 94112, + 110592, + 110594, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120513, + 120514, + 120539, + 120540, + 120571, + 120572, + 120597, + 120598, + 120629, + 120630, + 120655, + 120656, + 120687, + 120688, + 120713, + 120714, + 120745, + 120746, + 120771, + 120772, + 120780, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102 }; #endif #ifndef PERL_IN_XSUB_RE -static UV XPosixBlank_invlist[] = { - 18, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixBlank_invlist[] = { + 17, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 9, 10, 32, @@ -281,8 +2598,6 @@ static UV XPosixBlank_invlist[] = { 161, 5760, 5761, - 6158, - 6159, 8192, 8203, 8239, @@ -297,109 +2612,1223 @@ static UV XPosixBlank_invlist[] = { #ifndef PERL_IN_XSUB_RE -static UV PosixCntrl_invlist[] = { +static const UV XPosixCntrl_invlist[] = { 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 0, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ + 148565664, /* Version and data structure type */ + 0, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 32, 127, - 128, - 0 + 160 }; #endif #ifndef PERL_IN_XSUB_RE -static UV XPosixCntrl_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 0, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 32, - 127, - 160, - 0 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixDigit_invlist[] = { - 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixDigit_invlist[] = { + 85, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 48, - 58 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixGraph_invlist[] = { - 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 33, - 127 + 58, + 1632, + 1642, + 1776, + 1786, + 1984, + 1994, + 2406, + 2416, + 2534, + 2544, + 2662, + 2672, + 2790, + 2800, + 2918, + 2928, + 3046, + 3056, + 3174, + 3184, + 3302, + 3312, + 3430, + 3440, + 3664, + 3674, + 3792, + 3802, + 3872, + 3882, + 4160, + 4170, + 4240, + 4250, + 6112, + 6122, + 6160, + 6170, + 6470, + 6480, + 6608, + 6618, + 6784, + 6794, + 6800, + 6810, + 6992, + 7002, + 7088, + 7098, + 7232, + 7242, + 7248, + 7258, + 42528, + 42538, + 43216, + 43226, + 43264, + 43274, + 43472, + 43482, + 43600, + 43610, + 44016, + 44026, + 65296, + 65306, + 66720, + 66730, + 69734, + 69744, + 69872, + 69882, + 69942, + 69952, + 70096, + 70106, + 71360, + 71370, + 120782, + 120832 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1PosixGraph_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixGraph_invlist[] = { + 1089, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 33, 127, 161, - 888 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixLower_invlist[] = { - 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 97, - 123 + 888, + 890, + 895, + 900, + 907, + 908, + 909, + 910, + 930, + 931, + 1320, + 1329, + 1367, + 1369, + 1376, + 1377, + 1416, + 1417, + 1419, + 1423, + 1424, + 1425, + 1480, + 1488, + 1515, + 1520, + 1525, + 1536, + 1541, + 1542, + 1565, + 1566, + 1806, + 1807, + 1867, + 1869, + 1970, + 1984, + 2043, + 2048, + 2094, + 2096, + 2111, + 2112, + 2140, + 2142, + 2143, + 2208, + 2209, + 2210, + 2221, + 2276, + 2303, + 2304, + 2424, + 2425, + 2432, + 2433, + 2436, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2492, + 2501, + 2503, + 2505, + 2507, + 2511, + 2519, + 2520, + 2524, + 2526, + 2527, + 2532, + 2534, + 2556, + 2561, + 2564, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2620, + 2621, + 2622, + 2627, + 2631, + 2633, + 2635, + 2638, + 2641, + 2642, + 2649, + 2653, + 2654, + 2655, + 2662, + 2678, + 2689, + 2692, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2748, + 2758, + 2759, + 2762, + 2763, + 2766, + 2768, + 2769, + 2784, + 2788, + 2790, + 2802, + 2817, + 2820, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2876, + 2885, + 2887, + 2889, + 2891, + 2894, + 2902, + 2904, + 2908, + 2910, + 2911, + 2916, + 2918, + 2936, + 2946, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3006, + 3011, + 3014, + 3017, + 3018, + 3022, + 3024, + 3025, + 3031, + 3032, + 3046, + 3067, + 3073, + 3076, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3141, + 3142, + 3145, + 3146, + 3150, + 3157, + 3159, + 3160, + 3162, + 3168, + 3172, + 3174, + 3184, + 3192, + 3200, + 3202, + 3204, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3260, + 3269, + 3270, + 3273, + 3274, + 3278, + 3285, + 3287, + 3294, + 3295, + 3296, + 3300, + 3302, + 3312, + 3313, + 3315, + 3330, + 3332, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3397, + 3398, + 3401, + 3402, + 3407, + 3415, + 3416, + 3424, + 3428, + 3430, + 3446, + 3449, + 3456, + 3458, + 3460, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3530, + 3531, + 3535, + 3541, + 3542, + 3543, + 3544, + 3552, + 3570, + 3573, + 3585, + 3643, + 3647, + 3676, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3770, + 3771, + 3774, + 3776, + 3781, + 3782, + 3783, + 3784, + 3790, + 3792, + 3802, + 3804, + 3808, + 3840, + 3912, + 3913, + 3949, + 3953, + 3992, + 3993, + 4029, + 4030, + 4045, + 4046, + 4059, + 4096, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4957, + 4989, + 4992, + 5018, + 5024, + 5109, + 5120, + 5760, + 5761, + 5789, + 5792, + 5873, + 5888, + 5901, + 5902, + 5909, + 5920, + 5943, + 5952, + 5972, + 5984, + 5997, + 5998, + 6001, + 6002, + 6004, + 6016, + 6110, + 6112, + 6122, + 6128, + 6138, + 6144, + 6159, + 6160, + 6170, + 6176, + 6264, + 6272, + 6315, + 6320, + 6390, + 6400, + 6429, + 6432, + 6444, + 6448, + 6460, + 6464, + 6465, + 6468, + 6510, + 6512, + 6517, + 6528, + 6572, + 6576, + 6602, + 6608, + 6619, + 6622, + 6684, + 6686, + 6751, + 6752, + 6781, + 6783, + 6794, + 6800, + 6810, + 6816, + 6830, + 6912, + 6988, + 6992, + 7037, + 7040, + 7156, + 7164, + 7224, + 7227, + 7242, + 7245, + 7296, + 7360, + 7368, + 7376, + 7415, + 7424, + 7655, + 7676, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8133, + 8134, + 8148, + 8150, + 8156, + 8157, + 8176, + 8178, + 8181, + 8182, + 8191, + 8203, + 8232, + 8234, + 8239, + 8240, + 8287, + 8288, + 8293, + 8294, + 8306, + 8308, + 8335, + 8336, + 8349, + 8352, + 8379, + 8400, + 8433, + 8448, + 8586, + 8592, + 9204, + 9216, + 9255, + 9280, + 9291, + 9312, + 9984, + 9985, + 11085, + 11088, + 11098, + 11264, + 11311, + 11312, + 11359, + 11360, + 11508, + 11513, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11633, + 11647, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 11744, + 11836, + 11904, + 11930, + 11931, + 12020, + 12032, + 12246, + 12272, + 12284, + 12289, + 12352, + 12353, + 12439, + 12441, + 12544, + 12549, + 12590, + 12593, + 12687, + 12688, + 12731, + 12736, + 12772, + 12784, + 12831, + 12832, + 13055, + 13056, + 19894, + 19904, + 40909, + 40960, + 42125, + 42128, + 42183, + 42192, + 42540, + 42560, + 42648, + 42655, + 42744, + 42752, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43052, + 43056, + 43066, + 43072, + 43128, + 43136, + 43205, + 43214, + 43226, + 43232, + 43260, + 43264, + 43348, + 43359, + 43389, + 43392, + 43470, + 43471, + 43482, + 43486, + 43488, + 43520, + 43575, + 43584, + 43598, + 43600, + 43610, + 43612, + 43644, + 43648, + 43715, + 43739, + 43767, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44014, + 44016, + 44026, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 57344, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64450, + 64467, + 64832, + 64848, + 64912, + 64914, + 64968, + 65008, + 65022, + 65024, + 65050, + 65056, + 65063, + 65072, + 65107, + 65108, + 65127, + 65128, + 65132, + 65136, + 65141, + 65142, + 65277, + 65279, + 65280, + 65281, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65504, + 65511, + 65512, + 65519, + 65529, + 65534, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65792, + 65795, + 65799, + 65844, + 65847, + 65931, + 65936, + 65948, + 66000, + 66046, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66336, + 66340, + 66352, + 66379, + 66432, + 66462, + 66463, + 66500, + 66504, + 66518, + 66560, + 66718, + 66720, + 66730, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67671, + 67680, + 67840, + 67868, + 67871, + 67898, + 67903, + 67904, + 67968, + 68024, + 68030, + 68032, + 68096, + 68100, + 68101, + 68103, + 68108, + 68116, + 68117, + 68120, + 68121, + 68148, + 68152, + 68155, + 68159, + 68168, + 68176, + 68185, + 68192, + 68224, + 68352, + 68406, + 68409, + 68438, + 68440, + 68467, + 68472, + 68480, + 68608, + 68681, + 69216, + 69247, + 69632, + 69710, + 69714, + 69744, + 69760, + 69826, + 69840, + 69865, + 69872, + 69882, + 69888, + 69941, + 69942, + 69956, + 70016, + 70089, + 70096, + 70106, + 71296, + 71352, + 71360, + 71370, + 73728, + 74607, + 74752, + 74851, + 74864, + 74868, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94079, + 94095, + 94112, + 110592, + 110594, + 118784, + 119030, + 119040, + 119079, + 119081, + 119262, + 119296, + 119366, + 119552, + 119639, + 119648, + 119666, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120780, + 120782, + 120832, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 126704, + 126706, + 126976, + 127020, + 127024, + 127124, + 127136, + 127151, + 127153, + 127167, + 127169, + 127184, + 127185, + 127200, + 127232, + 127243, + 127248, + 127279, + 127280, + 127340, + 127344, + 127387, + 127462, + 127491, + 127504, + 127547, + 127552, + 127561, + 127568, + 127570, + 127744, + 127777, + 127792, + 127798, + 127799, + 127869, + 127872, + 127892, + 127904, + 127941, + 127942, + 127947, + 127968, + 127985, + 128000, + 128063, + 128064, + 128065, + 128066, + 128248, + 128249, + 128253, + 128256, + 128318, + 128320, + 128324, + 128336, + 128360, + 128507, + 128577, + 128581, + 128592, + 128640, + 128710, + 128768, + 128884, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102, + 917505, + 917506, + 917536, + 917632, + 917760, + 918000, + 983040, + 1048574, + 1048576, + 1114110 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1PosixLower_invlist[] = { - 12, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixLower_invlist[] = { + 1237, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 97, 123, 170, @@ -411,73 +3840,2337 @@ static UV L1PosixLower_invlist[] = { 223, 247, 248, - 256 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixPrint_invlist[] = { - 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 32, - 127 + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 378, + 379, + 380, + 381, + 382, + 385, + 387, + 388, + 389, + 390, + 392, + 393, + 396, + 398, + 402, + 403, + 405, + 406, + 409, + 412, + 414, + 415, + 417, + 418, + 419, + 420, + 421, + 422, + 424, + 425, + 426, + 428, + 429, + 430, + 432, + 433, + 436, + 437, + 438, + 439, + 441, + 443, + 445, + 448, + 454, + 455, + 457, + 458, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 497, + 499, + 500, + 501, + 502, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 570, + 572, + 573, + 575, + 577, + 578, + 579, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 660, + 661, + 697, + 704, + 706, + 736, + 741, + 837, + 838, + 881, + 882, + 883, + 884, + 887, + 888, + 890, + 894, + 912, + 913, + 940, + 975, + 976, + 978, + 981, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1012, + 1013, + 1014, + 1016, + 1017, + 1019, + 1021, + 1072, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1377, + 1416, + 7424, + 7616, + 7681, + 7682, + 7683, + 7684, + 7685, + 7686, + 7687, + 7688, + 7689, + 7690, + 7691, + 7692, + 7693, + 7694, + 7695, + 7696, + 7697, + 7698, + 7699, + 7700, + 7701, + 7702, + 7703, + 7704, + 7705, + 7706, + 7707, + 7708, + 7709, + 7710, + 7711, + 7712, + 7713, + 7714, + 7715, + 7716, + 7717, + 7718, + 7719, + 7720, + 7721, + 7722, + 7723, + 7724, + 7725, + 7726, + 7727, + 7728, + 7729, + 7730, + 7731, + 7732, + 7733, + 7734, + 7735, + 7736, + 7737, + 7738, + 7739, + 7740, + 7741, + 7742, + 7743, + 7744, + 7745, + 7746, + 7747, + 7748, + 7749, + 7750, + 7751, + 7752, + 7753, + 7754, + 7755, + 7756, + 7757, + 7758, + 7759, + 7760, + 7761, + 7762, + 7763, + 7764, + 7765, + 7766, + 7767, + 7768, + 7769, + 7770, + 7771, + 7772, + 7773, + 7774, + 7775, + 7776, + 7777, + 7778, + 7779, + 7780, + 7781, + 7782, + 7783, + 7784, + 7785, + 7786, + 7787, + 7788, + 7789, + 7790, + 7791, + 7792, + 7793, + 7794, + 7795, + 7796, + 7797, + 7798, + 7799, + 7800, + 7801, + 7802, + 7803, + 7804, + 7805, + 7806, + 7807, + 7808, + 7809, + 7810, + 7811, + 7812, + 7813, + 7814, + 7815, + 7816, + 7817, + 7818, + 7819, + 7820, + 7821, + 7822, + 7823, + 7824, + 7825, + 7826, + 7827, + 7828, + 7829, + 7838, + 7839, + 7840, + 7841, + 7842, + 7843, + 7844, + 7845, + 7846, + 7847, + 7848, + 7849, + 7850, + 7851, + 7852, + 7853, + 7854, + 7855, + 7856, + 7857, + 7858, + 7859, + 7860, + 7861, + 7862, + 7863, + 7864, + 7865, + 7866, + 7867, + 7868, + 7869, + 7870, + 7871, + 7872, + 7873, + 7874, + 7875, + 7876, + 7877, + 7878, + 7879, + 7880, + 7881, + 7882, + 7883, + 7884, + 7885, + 7886, + 7887, + 7888, + 7889, + 7890, + 7891, + 7892, + 7893, + 7894, + 7895, + 7896, + 7897, + 7898, + 7899, + 7900, + 7901, + 7902, + 7903, + 7904, + 7905, + 7906, + 7907, + 7908, + 7909, + 7910, + 7911, + 7912, + 7913, + 7914, + 7915, + 7916, + 7917, + 7918, + 7919, + 7920, + 7921, + 7922, + 7923, + 7924, + 7925, + 7926, + 7927, + 7928, + 7929, + 7930, + 7931, + 7932, + 7933, + 7934, + 7935, + 7944, + 7952, + 7958, + 7968, + 7976, + 7984, + 7992, + 8000, + 8006, + 8016, + 8024, + 8032, + 8040, + 8048, + 8062, + 8064, + 8072, + 8080, + 8088, + 8096, + 8104, + 8112, + 8117, + 8118, + 8120, + 8126, + 8127, + 8130, + 8133, + 8134, + 8136, + 8144, + 8148, + 8150, + 8152, + 8160, + 8168, + 8178, + 8181, + 8182, + 8184, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8458, + 8459, + 8462, + 8464, + 8467, + 8468, + 8495, + 8496, + 8500, + 8501, + 8505, + 8506, + 8508, + 8510, + 8518, + 8522, + 8526, + 8527, + 8560, + 8576, + 8580, + 8581, + 9424, + 9450, + 11312, + 11359, + 11361, + 11362, + 11365, + 11367, + 11368, + 11369, + 11370, + 11371, + 11372, + 11373, + 11377, + 11378, + 11379, + 11381, + 11382, + 11390, + 11393, + 11394, + 11395, + 11396, + 11397, + 11398, + 11399, + 11400, + 11401, + 11402, + 11403, + 11404, + 11405, + 11406, + 11407, + 11408, + 11409, + 11410, + 11411, + 11412, + 11413, + 11414, + 11415, + 11416, + 11417, + 11418, + 11419, + 11420, + 11421, + 11422, + 11423, + 11424, + 11425, + 11426, + 11427, + 11428, + 11429, + 11430, + 11431, + 11432, + 11433, + 11434, + 11435, + 11436, + 11437, + 11438, + 11439, + 11440, + 11441, + 11442, + 11443, + 11444, + 11445, + 11446, + 11447, + 11448, + 11449, + 11450, + 11451, + 11452, + 11453, + 11454, + 11455, + 11456, + 11457, + 11458, + 11459, + 11460, + 11461, + 11462, + 11463, + 11464, + 11465, + 11466, + 11467, + 11468, + 11469, + 11470, + 11471, + 11472, + 11473, + 11474, + 11475, + 11476, + 11477, + 11478, + 11479, + 11480, + 11481, + 11482, + 11483, + 11484, + 11485, + 11486, + 11487, + 11488, + 11489, + 11490, + 11491, + 11493, + 11500, + 11501, + 11502, + 11503, + 11507, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 42561, + 42562, + 42563, + 42564, + 42565, + 42566, + 42567, + 42568, + 42569, + 42570, + 42571, + 42572, + 42573, + 42574, + 42575, + 42576, + 42577, + 42578, + 42579, + 42580, + 42581, + 42582, + 42583, + 42584, + 42585, + 42586, + 42587, + 42588, + 42589, + 42590, + 42591, + 42592, + 42593, + 42594, + 42595, + 42596, + 42597, + 42598, + 42599, + 42600, + 42601, + 42602, + 42603, + 42604, + 42605, + 42606, + 42625, + 42626, + 42627, + 42628, + 42629, + 42630, + 42631, + 42632, + 42633, + 42634, + 42635, + 42636, + 42637, + 42638, + 42639, + 42640, + 42641, + 42642, + 42643, + 42644, + 42645, + 42646, + 42647, + 42648, + 42787, + 42788, + 42789, + 42790, + 42791, + 42792, + 42793, + 42794, + 42795, + 42796, + 42797, + 42798, + 42799, + 42802, + 42803, + 42804, + 42805, + 42806, + 42807, + 42808, + 42809, + 42810, + 42811, + 42812, + 42813, + 42814, + 42815, + 42816, + 42817, + 42818, + 42819, + 42820, + 42821, + 42822, + 42823, + 42824, + 42825, + 42826, + 42827, + 42828, + 42829, + 42830, + 42831, + 42832, + 42833, + 42834, + 42835, + 42836, + 42837, + 42838, + 42839, + 42840, + 42841, + 42842, + 42843, + 42844, + 42845, + 42846, + 42847, + 42848, + 42849, + 42850, + 42851, + 42852, + 42853, + 42854, + 42855, + 42856, + 42857, + 42858, + 42859, + 42860, + 42861, + 42862, + 42863, + 42873, + 42874, + 42875, + 42876, + 42877, + 42879, + 42880, + 42881, + 42882, + 42883, + 42884, + 42885, + 42886, + 42887, + 42888, + 42892, + 42893, + 42894, + 42895, + 42897, + 42898, + 42899, + 42900, + 42913, + 42914, + 42915, + 42916, + 42917, + 42918, + 42919, + 42920, + 42921, + 42922, + 43000, + 43003, + 64256, + 64263, + 64275, + 64280, + 65345, + 65371, + 66600, + 66640, + 119834, + 119860, + 119886, + 119893, + 119894, + 119912, + 119938, + 119964, + 119990, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120016, + 120042, + 120068, + 120094, + 120120, + 120146, + 120172, + 120198, + 120224, + 120250, + 120276, + 120302, + 120328, + 120354, + 120380, + 120406, + 120432, + 120458, + 120486, + 120514, + 120539, + 120540, + 120546, + 120572, + 120597, + 120598, + 120604, + 120630, + 120655, + 120656, + 120662, + 120688, + 120713, + 120714, + 120720, + 120746, + 120771, + 120772, + 120778, + 120779, + 120780 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1PosixPrint_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixPrint_invlist[] = { + 1083, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 32, 127, 160, - 888 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixPunct_invlist[] = { - 8, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 33, - 48, - 58, - 65, - 91, - 97, - 123, - 127 + 888, + 890, + 895, + 900, + 907, + 908, + 909, + 910, + 930, + 931, + 1320, + 1329, + 1367, + 1369, + 1376, + 1377, + 1416, + 1417, + 1419, + 1423, + 1424, + 1425, + 1480, + 1488, + 1515, + 1520, + 1525, + 1536, + 1541, + 1542, + 1565, + 1566, + 1806, + 1807, + 1867, + 1869, + 1970, + 1984, + 2043, + 2048, + 2094, + 2096, + 2111, + 2112, + 2140, + 2142, + 2143, + 2208, + 2209, + 2210, + 2221, + 2276, + 2303, + 2304, + 2424, + 2425, + 2432, + 2433, + 2436, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2492, + 2501, + 2503, + 2505, + 2507, + 2511, + 2519, + 2520, + 2524, + 2526, + 2527, + 2532, + 2534, + 2556, + 2561, + 2564, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2620, + 2621, + 2622, + 2627, + 2631, + 2633, + 2635, + 2638, + 2641, + 2642, + 2649, + 2653, + 2654, + 2655, + 2662, + 2678, + 2689, + 2692, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2748, + 2758, + 2759, + 2762, + 2763, + 2766, + 2768, + 2769, + 2784, + 2788, + 2790, + 2802, + 2817, + 2820, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2876, + 2885, + 2887, + 2889, + 2891, + 2894, + 2902, + 2904, + 2908, + 2910, + 2911, + 2916, + 2918, + 2936, + 2946, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3006, + 3011, + 3014, + 3017, + 3018, + 3022, + 3024, + 3025, + 3031, + 3032, + 3046, + 3067, + 3073, + 3076, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3141, + 3142, + 3145, + 3146, + 3150, + 3157, + 3159, + 3160, + 3162, + 3168, + 3172, + 3174, + 3184, + 3192, + 3200, + 3202, + 3204, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3260, + 3269, + 3270, + 3273, + 3274, + 3278, + 3285, + 3287, + 3294, + 3295, + 3296, + 3300, + 3302, + 3312, + 3313, + 3315, + 3330, + 3332, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3397, + 3398, + 3401, + 3402, + 3407, + 3415, + 3416, + 3424, + 3428, + 3430, + 3446, + 3449, + 3456, + 3458, + 3460, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3530, + 3531, + 3535, + 3541, + 3542, + 3543, + 3544, + 3552, + 3570, + 3573, + 3585, + 3643, + 3647, + 3676, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3770, + 3771, + 3774, + 3776, + 3781, + 3782, + 3783, + 3784, + 3790, + 3792, + 3802, + 3804, + 3808, + 3840, + 3912, + 3913, + 3949, + 3953, + 3992, + 3993, + 4029, + 4030, + 4045, + 4046, + 4059, + 4096, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4957, + 4989, + 4992, + 5018, + 5024, + 5109, + 5120, + 5789, + 5792, + 5873, + 5888, + 5901, + 5902, + 5909, + 5920, + 5943, + 5952, + 5972, + 5984, + 5997, + 5998, + 6001, + 6002, + 6004, + 6016, + 6110, + 6112, + 6122, + 6128, + 6138, + 6144, + 6159, + 6160, + 6170, + 6176, + 6264, + 6272, + 6315, + 6320, + 6390, + 6400, + 6429, + 6432, + 6444, + 6448, + 6460, + 6464, + 6465, + 6468, + 6510, + 6512, + 6517, + 6528, + 6572, + 6576, + 6602, + 6608, + 6619, + 6622, + 6684, + 6686, + 6751, + 6752, + 6781, + 6783, + 6794, + 6800, + 6810, + 6816, + 6830, + 6912, + 6988, + 6992, + 7037, + 7040, + 7156, + 7164, + 7224, + 7227, + 7242, + 7245, + 7296, + 7360, + 7368, + 7376, + 7415, + 7424, + 7655, + 7676, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8133, + 8134, + 8148, + 8150, + 8156, + 8157, + 8176, + 8178, + 8181, + 8182, + 8191, + 8192, + 8232, + 8234, + 8293, + 8294, + 8306, + 8308, + 8335, + 8336, + 8349, + 8352, + 8379, + 8400, + 8433, + 8448, + 8586, + 8592, + 9204, + 9216, + 9255, + 9280, + 9291, + 9312, + 9984, + 9985, + 11085, + 11088, + 11098, + 11264, + 11311, + 11312, + 11359, + 11360, + 11508, + 11513, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11633, + 11647, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 11744, + 11836, + 11904, + 11930, + 11931, + 12020, + 12032, + 12246, + 12272, + 12284, + 12288, + 12352, + 12353, + 12439, + 12441, + 12544, + 12549, + 12590, + 12593, + 12687, + 12688, + 12731, + 12736, + 12772, + 12784, + 12831, + 12832, + 13055, + 13056, + 19894, + 19904, + 40909, + 40960, + 42125, + 42128, + 42183, + 42192, + 42540, + 42560, + 42648, + 42655, + 42744, + 42752, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43052, + 43056, + 43066, + 43072, + 43128, + 43136, + 43205, + 43214, + 43226, + 43232, + 43260, + 43264, + 43348, + 43359, + 43389, + 43392, + 43470, + 43471, + 43482, + 43486, + 43488, + 43520, + 43575, + 43584, + 43598, + 43600, + 43610, + 43612, + 43644, + 43648, + 43715, + 43739, + 43767, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44014, + 44016, + 44026, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 57344, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64450, + 64467, + 64832, + 64848, + 64912, + 64914, + 64968, + 65008, + 65022, + 65024, + 65050, + 65056, + 65063, + 65072, + 65107, + 65108, + 65127, + 65128, + 65132, + 65136, + 65141, + 65142, + 65277, + 65279, + 65280, + 65281, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65504, + 65511, + 65512, + 65519, + 65529, + 65534, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65792, + 65795, + 65799, + 65844, + 65847, + 65931, + 65936, + 65948, + 66000, + 66046, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66336, + 66340, + 66352, + 66379, + 66432, + 66462, + 66463, + 66500, + 66504, + 66518, + 66560, + 66718, + 66720, + 66730, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67671, + 67680, + 67840, + 67868, + 67871, + 67898, + 67903, + 67904, + 67968, + 68024, + 68030, + 68032, + 68096, + 68100, + 68101, + 68103, + 68108, + 68116, + 68117, + 68120, + 68121, + 68148, + 68152, + 68155, + 68159, + 68168, + 68176, + 68185, + 68192, + 68224, + 68352, + 68406, + 68409, + 68438, + 68440, + 68467, + 68472, + 68480, + 68608, + 68681, + 69216, + 69247, + 69632, + 69710, + 69714, + 69744, + 69760, + 69826, + 69840, + 69865, + 69872, + 69882, + 69888, + 69941, + 69942, + 69956, + 70016, + 70089, + 70096, + 70106, + 71296, + 71352, + 71360, + 71370, + 73728, + 74607, + 74752, + 74851, + 74864, + 74868, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94079, + 94095, + 94112, + 110592, + 110594, + 118784, + 119030, + 119040, + 119079, + 119081, + 119262, + 119296, + 119366, + 119552, + 119639, + 119648, + 119666, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120780, + 120782, + 120832, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 126704, + 126706, + 126976, + 127020, + 127024, + 127124, + 127136, + 127151, + 127153, + 127167, + 127169, + 127184, + 127185, + 127200, + 127232, + 127243, + 127248, + 127279, + 127280, + 127340, + 127344, + 127387, + 127462, + 127491, + 127504, + 127547, + 127552, + 127561, + 127568, + 127570, + 127744, + 127777, + 127792, + 127798, + 127799, + 127869, + 127872, + 127892, + 127904, + 127941, + 127942, + 127947, + 127968, + 127985, + 128000, + 128063, + 128064, + 128065, + 128066, + 128248, + 128249, + 128253, + 128256, + 128318, + 128320, + 128324, + 128336, + 128360, + 128507, + 128577, + 128581, + 128592, + 128640, + 128710, + 128768, + 128884, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102, + 917505, + 917506, + 917536, + 917632, + 917760, + 918000, + 983040, + 1048574, + 1048576, + 1114110 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1PosixPunct_invlist[] = { - 20, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixPunct_invlist[] = { + 273, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 33, 48, 58, @@ -497,37 +6190,271 @@ static UV L1PosixPunct_invlist[] = { 187, 188, 191, - 192 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixSpace_invlist[] = { - 4, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 9, - 14, - 32, - 33 + 192, + 894, + 895, + 903, + 904, + 1370, + 1376, + 1417, + 1419, + 1470, + 1471, + 1472, + 1473, + 1475, + 1476, + 1478, + 1479, + 1523, + 1525, + 1545, + 1547, + 1548, + 1550, + 1563, + 1564, + 1566, + 1568, + 1642, + 1646, + 1748, + 1749, + 1792, + 1806, + 2039, + 2042, + 2096, + 2111, + 2142, + 2143, + 2404, + 2406, + 2416, + 2417, + 2800, + 2801, + 3572, + 3573, + 3663, + 3664, + 3674, + 3676, + 3844, + 3859, + 3860, + 3861, + 3898, + 3902, + 3973, + 3974, + 4048, + 4053, + 4057, + 4059, + 4170, + 4176, + 4347, + 4348, + 4960, + 4969, + 5120, + 5121, + 5741, + 5743, + 5787, + 5789, + 5867, + 5870, + 5941, + 5943, + 6100, + 6103, + 6104, + 6107, + 6144, + 6155, + 6468, + 6470, + 6686, + 6688, + 6816, + 6823, + 6824, + 6830, + 7002, + 7009, + 7164, + 7168, + 7227, + 7232, + 7294, + 7296, + 7360, + 7368, + 7379, + 7380, + 8208, + 8232, + 8240, + 8260, + 8261, + 8274, + 8275, + 8287, + 8317, + 8319, + 8333, + 8335, + 8968, + 8972, + 9001, + 9003, + 10088, + 10102, + 10181, + 10183, + 10214, + 10224, + 10627, + 10649, + 10712, + 10716, + 10748, + 10750, + 11513, + 11517, + 11518, + 11520, + 11632, + 11633, + 11776, + 11823, + 11824, + 11836, + 12289, + 12292, + 12296, + 12306, + 12308, + 12320, + 12336, + 12337, + 12349, + 12350, + 12448, + 12449, + 12539, + 12540, + 42238, + 42240, + 42509, + 42512, + 42611, + 42612, + 42622, + 42623, + 42738, + 42744, + 43124, + 43128, + 43214, + 43216, + 43256, + 43259, + 43310, + 43312, + 43359, + 43360, + 43457, + 43470, + 43486, + 43488, + 43612, + 43616, + 43742, + 43744, + 43760, + 43762, + 44011, + 44012, + 64830, + 64832, + 65040, + 65050, + 65072, + 65107, + 65108, + 65122, + 65123, + 65124, + 65128, + 65129, + 65130, + 65132, + 65281, + 65284, + 65285, + 65291, + 65292, + 65296, + 65306, + 65308, + 65311, + 65313, + 65339, + 65342, + 65343, + 65344, + 65371, + 65372, + 65373, + 65374, + 65375, + 65382, + 65792, + 65795, + 66463, + 66464, + 66512, + 66513, + 67671, + 67672, + 67871, + 67872, + 67903, + 67904, + 68176, + 68185, + 68223, + 68224, + 68409, + 68416, + 69703, + 69710, + 69819, + 69821, + 69822, + 69826, + 69952, + 69956, + 70085, + 70089, + 74864, + 74868 }; #endif #ifndef PERL_IN_XSUB_RE -static UV XPosixSpace_invlist[] = { - 22, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixSpace_invlist[] = { + 21, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 9, 14, 32, @@ -538,8 +6465,6 @@ static UV XPosixSpace_invlist[] = { 161, 5760, 5761, - 6158, - 6159, 8192, 8203, 8232, @@ -556,68 +6481,1244 @@ static UV XPosixSpace_invlist[] = { #ifndef PERL_IN_XSUB_RE -static UV PosixUpper_invlist[] = { - 2, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 65, - 91 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV L1PosixUpper_invlist[] = { - 6, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixUpper_invlist[] = { + 1221, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 65, 91, 192, 215, 216, - 223 -}; - -#endif - -#ifndef PERL_IN_XSUB_RE - -static UV PosixWord_invlist[] = { - 8, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 48, - 58, - 65, - 91, - 95, - 96, - 97, - 123 + 223, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 378, + 379, + 380, + 381, + 382, + 385, + 387, + 388, + 389, + 390, + 392, + 393, + 396, + 398, + 402, + 403, + 405, + 406, + 409, + 412, + 414, + 415, + 417, + 418, + 419, + 420, + 421, + 422, + 424, + 425, + 426, + 428, + 429, + 430, + 432, + 433, + 436, + 437, + 438, + 439, + 441, + 444, + 445, + 452, + 453, + 455, + 456, + 458, + 459, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 497, + 498, + 500, + 501, + 502, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 570, + 572, + 573, + 575, + 577, + 578, + 579, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 880, + 881, + 882, + 883, + 886, + 887, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 912, + 913, + 930, + 931, + 940, + 975, + 976, + 978, + 981, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1012, + 1013, + 1015, + 1016, + 1017, + 1019, + 1021, + 1072, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1329, + 1367, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 7680, + 7681, + 7682, + 7683, + 7684, + 7685, + 7686, + 7687, + 7688, + 7689, + 7690, + 7691, + 7692, + 7693, + 7694, + 7695, + 7696, + 7697, + 7698, + 7699, + 7700, + 7701, + 7702, + 7703, + 7704, + 7705, + 7706, + 7707, + 7708, + 7709, + 7710, + 7711, + 7712, + 7713, + 7714, + 7715, + 7716, + 7717, + 7718, + 7719, + 7720, + 7721, + 7722, + 7723, + 7724, + 7725, + 7726, + 7727, + 7728, + 7729, + 7730, + 7731, + 7732, + 7733, + 7734, + 7735, + 7736, + 7737, + 7738, + 7739, + 7740, + 7741, + 7742, + 7743, + 7744, + 7745, + 7746, + 7747, + 7748, + 7749, + 7750, + 7751, + 7752, + 7753, + 7754, + 7755, + 7756, + 7757, + 7758, + 7759, + 7760, + 7761, + 7762, + 7763, + 7764, + 7765, + 7766, + 7767, + 7768, + 7769, + 7770, + 7771, + 7772, + 7773, + 7774, + 7775, + 7776, + 7777, + 7778, + 7779, + 7780, + 7781, + 7782, + 7783, + 7784, + 7785, + 7786, + 7787, + 7788, + 7789, + 7790, + 7791, + 7792, + 7793, + 7794, + 7795, + 7796, + 7797, + 7798, + 7799, + 7800, + 7801, + 7802, + 7803, + 7804, + 7805, + 7806, + 7807, + 7808, + 7809, + 7810, + 7811, + 7812, + 7813, + 7814, + 7815, + 7816, + 7817, + 7818, + 7819, + 7820, + 7821, + 7822, + 7823, + 7824, + 7825, + 7826, + 7827, + 7828, + 7829, + 7838, + 7839, + 7840, + 7841, + 7842, + 7843, + 7844, + 7845, + 7846, + 7847, + 7848, + 7849, + 7850, + 7851, + 7852, + 7853, + 7854, + 7855, + 7856, + 7857, + 7858, + 7859, + 7860, + 7861, + 7862, + 7863, + 7864, + 7865, + 7866, + 7867, + 7868, + 7869, + 7870, + 7871, + 7872, + 7873, + 7874, + 7875, + 7876, + 7877, + 7878, + 7879, + 7880, + 7881, + 7882, + 7883, + 7884, + 7885, + 7886, + 7887, + 7888, + 7889, + 7890, + 7891, + 7892, + 7893, + 7894, + 7895, + 7896, + 7897, + 7898, + 7899, + 7900, + 7901, + 7902, + 7903, + 7904, + 7905, + 7906, + 7907, + 7908, + 7909, + 7910, + 7911, + 7912, + 7913, + 7914, + 7915, + 7916, + 7917, + 7918, + 7919, + 7920, + 7921, + 7922, + 7923, + 7924, + 7925, + 7926, + 7927, + 7928, + 7929, + 7930, + 7931, + 7932, + 7933, + 7934, + 7935, + 7944, + 7952, + 7960, + 7966, + 7976, + 7984, + 7992, + 8000, + 8008, + 8014, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8032, + 8040, + 8048, + 8120, + 8124, + 8136, + 8140, + 8152, + 8156, + 8168, + 8173, + 8184, + 8188, + 8450, + 8451, + 8455, + 8456, + 8459, + 8462, + 8464, + 8467, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8496, + 8500, + 8510, + 8512, + 8517, + 8518, + 8544, + 8560, + 8579, + 8580, + 9398, + 9424, + 11264, + 11311, + 11360, + 11361, + 11362, + 11365, + 11367, + 11368, + 11369, + 11370, + 11371, + 11372, + 11373, + 11377, + 11378, + 11379, + 11381, + 11382, + 11390, + 11393, + 11394, + 11395, + 11396, + 11397, + 11398, + 11399, + 11400, + 11401, + 11402, + 11403, + 11404, + 11405, + 11406, + 11407, + 11408, + 11409, + 11410, + 11411, + 11412, + 11413, + 11414, + 11415, + 11416, + 11417, + 11418, + 11419, + 11420, + 11421, + 11422, + 11423, + 11424, + 11425, + 11426, + 11427, + 11428, + 11429, + 11430, + 11431, + 11432, + 11433, + 11434, + 11435, + 11436, + 11437, + 11438, + 11439, + 11440, + 11441, + 11442, + 11443, + 11444, + 11445, + 11446, + 11447, + 11448, + 11449, + 11450, + 11451, + 11452, + 11453, + 11454, + 11455, + 11456, + 11457, + 11458, + 11459, + 11460, + 11461, + 11462, + 11463, + 11464, + 11465, + 11466, + 11467, + 11468, + 11469, + 11470, + 11471, + 11472, + 11473, + 11474, + 11475, + 11476, + 11477, + 11478, + 11479, + 11480, + 11481, + 11482, + 11483, + 11484, + 11485, + 11486, + 11487, + 11488, + 11489, + 11490, + 11491, + 11499, + 11500, + 11501, + 11502, + 11506, + 11507, + 42560, + 42561, + 42562, + 42563, + 42564, + 42565, + 42566, + 42567, + 42568, + 42569, + 42570, + 42571, + 42572, + 42573, + 42574, + 42575, + 42576, + 42577, + 42578, + 42579, + 42580, + 42581, + 42582, + 42583, + 42584, + 42585, + 42586, + 42587, + 42588, + 42589, + 42590, + 42591, + 42592, + 42593, + 42594, + 42595, + 42596, + 42597, + 42598, + 42599, + 42600, + 42601, + 42602, + 42603, + 42604, + 42605, + 42624, + 42625, + 42626, + 42627, + 42628, + 42629, + 42630, + 42631, + 42632, + 42633, + 42634, + 42635, + 42636, + 42637, + 42638, + 42639, + 42640, + 42641, + 42642, + 42643, + 42644, + 42645, + 42646, + 42647, + 42786, + 42787, + 42788, + 42789, + 42790, + 42791, + 42792, + 42793, + 42794, + 42795, + 42796, + 42797, + 42798, + 42799, + 42802, + 42803, + 42804, + 42805, + 42806, + 42807, + 42808, + 42809, + 42810, + 42811, + 42812, + 42813, + 42814, + 42815, + 42816, + 42817, + 42818, + 42819, + 42820, + 42821, + 42822, + 42823, + 42824, + 42825, + 42826, + 42827, + 42828, + 42829, + 42830, + 42831, + 42832, + 42833, + 42834, + 42835, + 42836, + 42837, + 42838, + 42839, + 42840, + 42841, + 42842, + 42843, + 42844, + 42845, + 42846, + 42847, + 42848, + 42849, + 42850, + 42851, + 42852, + 42853, + 42854, + 42855, + 42856, + 42857, + 42858, + 42859, + 42860, + 42861, + 42862, + 42863, + 42873, + 42874, + 42875, + 42876, + 42877, + 42879, + 42880, + 42881, + 42882, + 42883, + 42884, + 42885, + 42886, + 42887, + 42891, + 42892, + 42893, + 42894, + 42896, + 42897, + 42898, + 42899, + 42912, + 42913, + 42914, + 42915, + 42916, + 42917, + 42918, + 42919, + 42920, + 42921, + 42922, + 42923, + 65313, + 65339, + 66560, + 66600, + 119808, + 119834, + 119860, + 119886, + 119912, + 119938, + 119964, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119990, + 120016, + 120042, + 120068, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120120, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120172, + 120198, + 120224, + 120250, + 120276, + 120302, + 120328, + 120354, + 120380, + 120406, + 120432, + 120458, + 120488, + 120513, + 120546, + 120571, + 120604, + 120629, + 120662, + 120687, + 120720, + 120745, + 120778, + 120779 }; #endif #ifndef PERL_IN_XSUB_RE -static UV L1PosixWord_invlist[] = { - 20, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixWord_invlist[] = { + 1131, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 48, 58, 65, @@ -637,62 +7738,1391 @@ static UV L1PosixWord_invlist[] = { 216, 247, 248, - 706 + 706, + 710, + 722, + 736, + 741, + 748, + 749, + 750, + 751, + 768, + 885, + 886, + 888, + 890, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 1014, + 1015, + 1154, + 1155, + 1320, + 1329, + 1367, + 1369, + 1370, + 1377, + 1416, + 1425, + 1470, + 1471, + 1472, + 1473, + 1475, + 1476, + 1478, + 1479, + 1480, + 1488, + 1515, + 1520, + 1523, + 1552, + 1563, + 1568, + 1642, + 1646, + 1748, + 1749, + 1757, + 1759, + 1769, + 1770, + 1789, + 1791, + 1792, + 1808, + 1867, + 1869, + 1970, + 1984, + 2038, + 2042, + 2043, + 2048, + 2094, + 2112, + 2140, + 2208, + 2209, + 2210, + 2221, + 2276, + 2303, + 2304, + 2404, + 2406, + 2416, + 2417, + 2424, + 2425, + 2432, + 2433, + 2436, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2492, + 2501, + 2503, + 2505, + 2507, + 2511, + 2519, + 2520, + 2524, + 2526, + 2527, + 2532, + 2534, + 2546, + 2561, + 2564, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2620, + 2621, + 2622, + 2627, + 2631, + 2633, + 2635, + 2638, + 2641, + 2642, + 2649, + 2653, + 2654, + 2655, + 2662, + 2678, + 2689, + 2692, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2748, + 2758, + 2759, + 2762, + 2763, + 2766, + 2768, + 2769, + 2784, + 2788, + 2790, + 2800, + 2817, + 2820, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2876, + 2885, + 2887, + 2889, + 2891, + 2894, + 2902, + 2904, + 2908, + 2910, + 2911, + 2916, + 2918, + 2928, + 2929, + 2930, + 2946, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3006, + 3011, + 3014, + 3017, + 3018, + 3022, + 3024, + 3025, + 3031, + 3032, + 3046, + 3056, + 3073, + 3076, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3141, + 3142, + 3145, + 3146, + 3150, + 3157, + 3159, + 3160, + 3162, + 3168, + 3172, + 3174, + 3184, + 3202, + 3204, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3260, + 3269, + 3270, + 3273, + 3274, + 3278, + 3285, + 3287, + 3294, + 3295, + 3296, + 3300, + 3302, + 3312, + 3313, + 3315, + 3330, + 3332, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3397, + 3398, + 3401, + 3402, + 3407, + 3415, + 3416, + 3424, + 3428, + 3430, + 3440, + 3450, + 3456, + 3458, + 3460, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3530, + 3531, + 3535, + 3541, + 3542, + 3543, + 3544, + 3552, + 3570, + 3572, + 3585, + 3643, + 3648, + 3663, + 3664, + 3674, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3770, + 3771, + 3774, + 3776, + 3781, + 3782, + 3783, + 3784, + 3790, + 3792, + 3802, + 3804, + 3808, + 3840, + 3841, + 3864, + 3866, + 3872, + 3882, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3902, + 3912, + 3913, + 3949, + 3953, + 3973, + 3974, + 3992, + 3993, + 4029, + 4038, + 4039, + 4096, + 4170, + 4176, + 4254, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4347, + 4348, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4957, + 4960, + 4992, + 5008, + 5024, + 5109, + 5121, + 5741, + 5743, + 5760, + 5761, + 5787, + 5792, + 5867, + 5870, + 5873, + 5888, + 5901, + 5902, + 5909, + 5920, + 5941, + 5952, + 5972, + 5984, + 5997, + 5998, + 6001, + 6002, + 6004, + 6016, + 6100, + 6103, + 6104, + 6108, + 6110, + 6112, + 6122, + 6155, + 6158, + 6160, + 6170, + 6176, + 6264, + 6272, + 6315, + 6320, + 6390, + 6400, + 6429, + 6432, + 6444, + 6448, + 6460, + 6470, + 6510, + 6512, + 6517, + 6528, + 6572, + 6576, + 6602, + 6608, + 6618, + 6656, + 6684, + 6688, + 6751, + 6752, + 6781, + 6783, + 6794, + 6800, + 6810, + 6823, + 6824, + 6912, + 6988, + 6992, + 7002, + 7019, + 7028, + 7040, + 7156, + 7168, + 7224, + 7232, + 7242, + 7245, + 7294, + 7376, + 7379, + 7380, + 7415, + 7424, + 7655, + 7676, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8204, + 8206, + 8255, + 8257, + 8276, + 8277, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8400, + 8433, + 8450, + 8451, + 8455, + 8456, + 8458, + 8468, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8495, + 8506, + 8508, + 8512, + 8517, + 8522, + 8526, + 8527, + 8544, + 8585, + 9398, + 9450, + 11264, + 11311, + 11312, + 11359, + 11360, + 11493, + 11499, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11632, + 11647, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 11744, + 11776, + 11823, + 11824, + 12293, + 12296, + 12321, + 12336, + 12337, + 12342, + 12344, + 12349, + 12353, + 12439, + 12441, + 12443, + 12445, + 12448, + 12449, + 12539, + 12540, + 12544, + 12549, + 12590, + 12593, + 12687, + 12704, + 12731, + 12784, + 12800, + 13312, + 19894, + 19968, + 40909, + 40960, + 42125, + 42192, + 42238, + 42240, + 42509, + 42512, + 42540, + 42560, + 42611, + 42612, + 42622, + 42623, + 42648, + 42655, + 42738, + 42775, + 42784, + 42786, + 42889, + 42891, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43048, + 43072, + 43124, + 43136, + 43205, + 43216, + 43226, + 43232, + 43256, + 43259, + 43260, + 43264, + 43310, + 43312, + 43348, + 43360, + 43389, + 43392, + 43457, + 43471, + 43482, + 43520, + 43575, + 43584, + 43598, + 43600, + 43610, + 43616, + 43639, + 43642, + 43644, + 43648, + 43715, + 43739, + 43742, + 43744, + 43760, + 43762, + 43767, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44011, + 44012, + 44014, + 44016, + 44026, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 63744, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64297, + 64298, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64434, + 64467, + 64830, + 64848, + 64912, + 64914, + 64968, + 65008, + 65020, + 65024, + 65040, + 65056, + 65063, + 65075, + 65077, + 65101, + 65104, + 65136, + 65141, + 65142, + 65277, + 65296, + 65306, + 65313, + 65339, + 65343, + 65344, + 65345, + 65371, + 65382, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65856, + 65909, + 66045, + 66046, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66352, + 66379, + 66432, + 66462, + 66464, + 66500, + 66504, + 66512, + 66513, + 66518, + 66560, + 66718, + 66720, + 66730, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67840, + 67862, + 67872, + 67898, + 67968, + 68024, + 68030, + 68032, + 68096, + 68100, + 68101, + 68103, + 68108, + 68116, + 68117, + 68120, + 68121, + 68148, + 68152, + 68155, + 68159, + 68160, + 68192, + 68221, + 68352, + 68406, + 68416, + 68438, + 68448, + 68467, + 68608, + 68681, + 69632, + 69703, + 69734, + 69744, + 69760, + 69819, + 69840, + 69865, + 69872, + 69882, + 69888, + 69941, + 69942, + 69952, + 70016, + 70085, + 70096, + 70106, + 71296, + 71352, + 71360, + 71370, + 73728, + 74607, + 74752, + 74851, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94079, + 94095, + 94112, + 110592, + 110594, + 119141, + 119146, + 119149, + 119155, + 119163, + 119171, + 119173, + 119180, + 119210, + 119214, + 119362, + 119365, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120513, + 120514, + 120539, + 120540, + 120571, + 120572, + 120597, + 120598, + 120629, + 120630, + 120655, + 120656, + 120687, + 120688, + 120713, + 120714, + 120745, + 120746, + 120771, + 120772, + 120780, + 120782, + 120832, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102, + 917760, + 918000 }; #endif #ifndef PERL_IN_XSUB_RE -static UV PosixXDigit_invlist[] = { - 6, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV XPosixXDigit_invlist[] = { + 13, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 48, 58, 65, 71, 97, - 103 + 103, + 65296, + 65306, + 65313, + 65319, + 65345, + 65351 }; #endif #ifndef PERL_IN_XSUB_RE -static UV XPosixXDigit_invlist[] = { - 12, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ - 48, - 58, +static const UV _Perl_Any_Folds_invlist[] = { + 229, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 65, - 71, + 91, 97, - 103, - 65296, - 65306, + 123, + 181, + 182, + 192, + 215, + 216, + 247, + 248, + 305, + 306, + 312, + 313, + 397, + 398, + 411, + 412, + 426, + 428, + 442, + 444, + 446, + 447, + 448, + 452, + 545, + 546, + 564, + 570, + 597, + 598, + 600, + 601, + 602, + 603, + 604, + 608, + 609, + 611, + 612, + 613, + 615, + 616, + 618, + 619, + 620, + 623, + 624, + 625, + 627, + 629, + 630, + 637, + 638, + 640, + 641, + 643, + 644, + 648, + 653, + 658, + 659, + 700, + 701, + 702, + 703, + 768, + 770, + 775, + 777, + 778, + 779, + 780, + 781, + 787, + 788, + 817, + 818, + 834, + 835, + 837, + 838, + 880, + 884, + 886, + 888, + 891, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 978, + 981, + 1011, + 1012, + 1014, + 1015, + 1020, + 1021, + 1154, + 1162, + 1320, + 1329, + 1367, + 1377, + 1416, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 7545, + 7546, + 7549, + 7550, + 7680, + 7836, + 7838, + 7839, + 7840, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8486, + 8487, + 8490, + 8492, + 8498, + 8499, + 8526, + 8527, + 8544, + 8576, + 8579, + 8581, + 9398, + 9450, + 11264, + 11311, + 11312, + 11359, + 11360, + 11377, + 11378, + 11380, + 11381, + 11383, + 11390, + 11492, + 11499, + 11503, + 11506, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 42560, + 42606, + 42624, + 42648, + 42786, + 42800, + 42802, + 42864, + 42873, + 42888, + 42891, + 42894, + 42896, + 42900, + 42912, + 42923, + 64256, + 64263, + 64275, + 64280, 65313, - 65319, + 65339, 65345, - 65351 + 65371, + 66560, + 66640 }; #endif -static UV NonL1_Perl_Non_Final_Folds_invlist[] = { - 44, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV NonL1_Perl_Non_Final_Folds_invlist[] = { + 45, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 700, 701, 776, @@ -741,13 +9171,12 @@ static UV NonL1_Perl_Non_Final_Folds_invlist[] = { #ifndef PERL_IN_XSUB_RE -static UV _Perl_Multi_Char_Folds_invlist[] = { - 58, /* Number of elements */ - 0, /* Current iteration position */ - 0, /* Cache of previous search index result */ - 290655244, /* Version and data structure type */ - 1, /* 0 if this is the first element of the list proper; - 1 if the next element is the first */ +static const UV _Perl_Folds_To_Multi_Char_invlist[] = { + 59, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, 223, 224, 304, @@ -810,4 +9239,2178 @@ static UV _Perl_Multi_Char_Folds_invlist[] = { #endif +#ifndef PERL_IN_XSUB_RE + +static const UV UpperLatin1_invlist[] = { + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, + 128, + 256 +}; + +#endif + +#ifndef PERL_IN_XSUB_RE + +static const UV _Perl_IDStart_invlist[] = { + 995, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, + 65, + 91, + 95, + 96, + 97, + 123, + 170, + 171, + 181, + 182, + 186, + 187, + 192, + 215, + 216, + 247, + 248, + 706, + 710, + 722, + 736, + 741, + 748, + 749, + 750, + 751, + 880, + 885, + 886, + 888, + 891, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 1014, + 1015, + 1154, + 1162, + 1320, + 1329, + 1367, + 1369, + 1370, + 1377, + 1416, + 1488, + 1515, + 1520, + 1523, + 1568, + 1611, + 1646, + 1648, + 1649, + 1748, + 1749, + 1750, + 1765, + 1767, + 1774, + 1776, + 1786, + 1789, + 1791, + 1792, + 1808, + 1809, + 1810, + 1840, + 1869, + 1958, + 1969, + 1970, + 1994, + 2027, + 2036, + 2038, + 2042, + 2043, + 2048, + 2070, + 2074, + 2075, + 2084, + 2085, + 2088, + 2089, + 2112, + 2137, + 2208, + 2209, + 2210, + 2221, + 2308, + 2362, + 2365, + 2366, + 2384, + 2385, + 2392, + 2402, + 2417, + 2424, + 2425, + 2432, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2493, + 2494, + 2510, + 2511, + 2524, + 2526, + 2527, + 2530, + 2544, + 2546, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2649, + 2653, + 2654, + 2655, + 2674, + 2677, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2749, + 2750, + 2768, + 2769, + 2784, + 2786, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2877, + 2878, + 2908, + 2910, + 2911, + 2914, + 2929, + 2930, + 2947, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3024, + 3025, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3134, + 3160, + 3162, + 3168, + 3170, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3261, + 3262, + 3294, + 3295, + 3296, + 3298, + 3313, + 3315, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3390, + 3406, + 3407, + 3424, + 3426, + 3450, + 3456, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3585, + 3633, + 3634, + 3635, + 3648, + 3655, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3761, + 3762, + 3763, + 3773, + 3774, + 3776, + 3781, + 3782, + 3783, + 3804, + 3808, + 3840, + 3841, + 3904, + 3912, + 3913, + 3949, + 3976, + 3981, + 4096, + 4139, + 4159, + 4160, + 4176, + 4182, + 4186, + 4190, + 4193, + 4194, + 4197, + 4199, + 4206, + 4209, + 4213, + 4226, + 4238, + 4239, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4347, + 4348, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4992, + 5008, + 5024, + 5109, + 5121, + 5741, + 5743, + 5760, + 5761, + 5787, + 5792, + 5867, + 5870, + 5873, + 5888, + 5901, + 5902, + 5906, + 5920, + 5938, + 5952, + 5970, + 5984, + 5997, + 5998, + 6001, + 6016, + 6068, + 6103, + 6104, + 6108, + 6109, + 6176, + 6264, + 6272, + 6313, + 6314, + 6315, + 6320, + 6390, + 6400, + 6429, + 6480, + 6510, + 6512, + 6517, + 6528, + 6572, + 6593, + 6600, + 6656, + 6679, + 6688, + 6741, + 6823, + 6824, + 6917, + 6964, + 6981, + 6988, + 7043, + 7073, + 7086, + 7088, + 7098, + 7142, + 7168, + 7204, + 7245, + 7248, + 7258, + 7294, + 7401, + 7405, + 7406, + 7410, + 7413, + 7415, + 7424, + 7616, + 7680, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8450, + 8451, + 8455, + 8456, + 8458, + 8468, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8495, + 8506, + 8508, + 8512, + 8517, + 8522, + 8526, + 8527, + 8544, + 8585, + 11264, + 11311, + 11312, + 11359, + 11360, + 11493, + 11499, + 11503, + 11506, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11632, + 11648, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 12293, + 12296, + 12321, + 12330, + 12337, + 12342, + 12344, + 12349, + 12353, + 12439, + 12445, + 12448, + 12449, + 12539, + 12540, + 12544, + 12549, + 12590, + 12593, + 12687, + 12704, + 12731, + 12784, + 12800, + 13312, + 19894, + 19968, + 40909, + 40960, + 42125, + 42192, + 42238, + 42240, + 42509, + 42512, + 42528, + 42538, + 42540, + 42560, + 42607, + 42623, + 42648, + 42656, + 42736, + 42775, + 42784, + 42786, + 42889, + 42891, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43010, + 43011, + 43014, + 43015, + 43019, + 43020, + 43043, + 43072, + 43124, + 43138, + 43188, + 43250, + 43256, + 43259, + 43260, + 43274, + 43302, + 43312, + 43335, + 43360, + 43389, + 43396, + 43443, + 43471, + 43472, + 43520, + 43561, + 43584, + 43587, + 43588, + 43596, + 43616, + 43639, + 43642, + 43643, + 43648, + 43696, + 43697, + 43698, + 43701, + 43703, + 43705, + 43710, + 43712, + 43713, + 43714, + 43715, + 43739, + 43742, + 43744, + 43755, + 43762, + 43765, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44003, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 63744, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64286, + 64287, + 64297, + 64298, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64434, + 64467, + 64606, + 64612, + 64830, + 64848, + 64912, + 64914, + 64968, + 65008, + 65018, + 65137, + 65138, + 65139, + 65140, + 65143, + 65144, + 65145, + 65146, + 65147, + 65148, + 65149, + 65150, + 65151, + 65277, + 65313, + 65339, + 65345, + 65371, + 65382, + 65438, + 65440, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65856, + 65909, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66352, + 66379, + 66432, + 66462, + 66464, + 66500, + 66504, + 66512, + 66513, + 66518, + 66560, + 66718, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67840, + 67862, + 67872, + 67898, + 67968, + 68024, + 68030, + 68032, + 68096, + 68097, + 68112, + 68116, + 68117, + 68120, + 68121, + 68148, + 68192, + 68221, + 68352, + 68406, + 68416, + 68438, + 68448, + 68467, + 68608, + 68681, + 69635, + 69688, + 69763, + 69808, + 69840, + 69865, + 69891, + 69927, + 70019, + 70067, + 70081, + 70085, + 71296, + 71339, + 73728, + 74607, + 74752, + 74851, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94033, + 94099, + 94112, + 110592, + 110594, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120513, + 120514, + 120539, + 120540, + 120571, + 120572, + 120597, + 120598, + 120629, + 120630, + 120655, + 120656, + 120687, + 120688, + 120713, + 120714, + 120745, + 120746, + 120771, + 120772, + 120780, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102 +}; + +#endif + +#ifndef PERL_IN_XSUB_RE + +static const UV _Perl_IDCont_invlist[] = { + 1143, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0, + 48, + 58, + 65, + 91, + 95, + 96, + 97, + 123, + 170, + 171, + 181, + 182, + 186, + 187, + 192, + 215, + 216, + 247, + 248, + 706, + 710, + 722, + 736, + 741, + 748, + 749, + 750, + 751, + 768, + 885, + 886, + 888, + 891, + 894, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 930, + 931, + 1014, + 1015, + 1154, + 1155, + 1160, + 1162, + 1320, + 1329, + 1367, + 1369, + 1370, + 1377, + 1416, + 1425, + 1470, + 1471, + 1472, + 1473, + 1475, + 1476, + 1478, + 1479, + 1480, + 1488, + 1515, + 1520, + 1523, + 1552, + 1563, + 1568, + 1642, + 1646, + 1748, + 1749, + 1757, + 1759, + 1769, + 1770, + 1789, + 1791, + 1792, + 1808, + 1867, + 1869, + 1970, + 1984, + 2038, + 2042, + 2043, + 2048, + 2094, + 2112, + 2140, + 2208, + 2209, + 2210, + 2221, + 2276, + 2303, + 2304, + 2404, + 2406, + 2416, + 2417, + 2424, + 2425, + 2432, + 2433, + 2436, + 2437, + 2445, + 2447, + 2449, + 2451, + 2473, + 2474, + 2481, + 2482, + 2483, + 2486, + 2490, + 2492, + 2501, + 2503, + 2505, + 2507, + 2511, + 2519, + 2520, + 2524, + 2526, + 2527, + 2532, + 2534, + 2546, + 2561, + 2564, + 2565, + 2571, + 2575, + 2577, + 2579, + 2601, + 2602, + 2609, + 2610, + 2612, + 2613, + 2615, + 2616, + 2618, + 2620, + 2621, + 2622, + 2627, + 2631, + 2633, + 2635, + 2638, + 2641, + 2642, + 2649, + 2653, + 2654, + 2655, + 2662, + 2678, + 2689, + 2692, + 2693, + 2702, + 2703, + 2706, + 2707, + 2729, + 2730, + 2737, + 2738, + 2740, + 2741, + 2746, + 2748, + 2758, + 2759, + 2762, + 2763, + 2766, + 2768, + 2769, + 2784, + 2788, + 2790, + 2800, + 2817, + 2820, + 2821, + 2829, + 2831, + 2833, + 2835, + 2857, + 2858, + 2865, + 2866, + 2868, + 2869, + 2874, + 2876, + 2885, + 2887, + 2889, + 2891, + 2894, + 2902, + 2904, + 2908, + 2910, + 2911, + 2916, + 2918, + 2928, + 2929, + 2930, + 2946, + 2948, + 2949, + 2955, + 2958, + 2961, + 2962, + 2966, + 2969, + 2971, + 2972, + 2973, + 2974, + 2976, + 2979, + 2981, + 2984, + 2987, + 2990, + 3002, + 3006, + 3011, + 3014, + 3017, + 3018, + 3022, + 3024, + 3025, + 3031, + 3032, + 3046, + 3056, + 3073, + 3076, + 3077, + 3085, + 3086, + 3089, + 3090, + 3113, + 3114, + 3124, + 3125, + 3130, + 3133, + 3141, + 3142, + 3145, + 3146, + 3150, + 3157, + 3159, + 3160, + 3162, + 3168, + 3172, + 3174, + 3184, + 3202, + 3204, + 3205, + 3213, + 3214, + 3217, + 3218, + 3241, + 3242, + 3252, + 3253, + 3258, + 3260, + 3269, + 3270, + 3273, + 3274, + 3278, + 3285, + 3287, + 3294, + 3295, + 3296, + 3300, + 3302, + 3312, + 3313, + 3315, + 3330, + 3332, + 3333, + 3341, + 3342, + 3345, + 3346, + 3387, + 3389, + 3397, + 3398, + 3401, + 3402, + 3407, + 3415, + 3416, + 3424, + 3428, + 3430, + 3440, + 3450, + 3456, + 3458, + 3460, + 3461, + 3479, + 3482, + 3506, + 3507, + 3516, + 3517, + 3518, + 3520, + 3527, + 3530, + 3531, + 3535, + 3541, + 3542, + 3543, + 3544, + 3552, + 3570, + 3572, + 3585, + 3643, + 3648, + 3663, + 3664, + 3674, + 3713, + 3715, + 3716, + 3717, + 3719, + 3721, + 3722, + 3723, + 3725, + 3726, + 3732, + 3736, + 3737, + 3744, + 3745, + 3748, + 3749, + 3750, + 3751, + 3752, + 3754, + 3756, + 3757, + 3770, + 3771, + 3774, + 3776, + 3781, + 3782, + 3783, + 3784, + 3790, + 3792, + 3802, + 3804, + 3808, + 3840, + 3841, + 3864, + 3866, + 3872, + 3882, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3902, + 3912, + 3913, + 3949, + 3953, + 3973, + 3974, + 3992, + 3993, + 4029, + 4038, + 4039, + 4096, + 4170, + 4176, + 4254, + 4256, + 4294, + 4295, + 4296, + 4301, + 4302, + 4304, + 4347, + 4348, + 4681, + 4682, + 4686, + 4688, + 4695, + 4696, + 4697, + 4698, + 4702, + 4704, + 4745, + 4746, + 4750, + 4752, + 4785, + 4786, + 4790, + 4792, + 4799, + 4800, + 4801, + 4802, + 4806, + 4808, + 4823, + 4824, + 4881, + 4882, + 4886, + 4888, + 4955, + 4957, + 4960, + 4992, + 5008, + 5024, + 5109, + 5121, + 5741, + 5743, + 5760, + 5761, + 5787, + 5792, + 5867, + 5870, + 5873, + 5888, + 5901, + 5902, + 5909, + 5920, + 5941, + 5952, + 5972, + 5984, + 5997, + 5998, + 6001, + 6002, + 6004, + 6016, + 6100, + 6103, + 6104, + 6108, + 6110, + 6112, + 6122, + 6155, + 6158, + 6160, + 6170, + 6176, + 6264, + 6272, + 6315, + 6320, + 6390, + 6400, + 6429, + 6432, + 6444, + 6448, + 6460, + 6470, + 6510, + 6512, + 6517, + 6528, + 6572, + 6576, + 6602, + 6608, + 6618, + 6656, + 6684, + 6688, + 6751, + 6752, + 6781, + 6783, + 6794, + 6800, + 6810, + 6823, + 6824, + 6912, + 6988, + 6992, + 7002, + 7019, + 7028, + 7040, + 7156, + 7168, + 7224, + 7232, + 7242, + 7245, + 7294, + 7376, + 7379, + 7380, + 7415, + 7424, + 7655, + 7676, + 7958, + 7960, + 7966, + 7968, + 8006, + 8008, + 8014, + 8016, + 8024, + 8025, + 8026, + 8027, + 8028, + 8029, + 8030, + 8031, + 8062, + 8064, + 8117, + 8118, + 8125, + 8126, + 8127, + 8130, + 8133, + 8134, + 8141, + 8144, + 8148, + 8150, + 8156, + 8160, + 8173, + 8178, + 8181, + 8182, + 8189, + 8255, + 8257, + 8276, + 8277, + 8305, + 8306, + 8319, + 8320, + 8336, + 8349, + 8400, + 8413, + 8417, + 8418, + 8421, + 8433, + 8450, + 8451, + 8455, + 8456, + 8458, + 8468, + 8469, + 8470, + 8473, + 8478, + 8484, + 8485, + 8486, + 8487, + 8488, + 8489, + 8490, + 8494, + 8495, + 8506, + 8508, + 8512, + 8517, + 8522, + 8526, + 8527, + 8544, + 8585, + 11264, + 11311, + 11312, + 11359, + 11360, + 11493, + 11499, + 11508, + 11520, + 11558, + 11559, + 11560, + 11565, + 11566, + 11568, + 11624, + 11631, + 11632, + 11647, + 11671, + 11680, + 11687, + 11688, + 11695, + 11696, + 11703, + 11704, + 11711, + 11712, + 11719, + 11720, + 11727, + 11728, + 11735, + 11736, + 11743, + 11744, + 11776, + 12293, + 12296, + 12321, + 12336, + 12337, + 12342, + 12344, + 12349, + 12353, + 12439, + 12441, + 12443, + 12445, + 12448, + 12449, + 12539, + 12540, + 12544, + 12549, + 12590, + 12593, + 12687, + 12704, + 12731, + 12784, + 12800, + 13312, + 19894, + 19968, + 40909, + 40960, + 42125, + 42192, + 42238, + 42240, + 42509, + 42512, + 42540, + 42560, + 42608, + 42612, + 42622, + 42623, + 42648, + 42655, + 42738, + 42775, + 42784, + 42786, + 42889, + 42891, + 42895, + 42896, + 42900, + 42912, + 42923, + 43000, + 43048, + 43072, + 43124, + 43136, + 43205, + 43216, + 43226, + 43232, + 43256, + 43259, + 43260, + 43264, + 43310, + 43312, + 43348, + 43360, + 43389, + 43392, + 43457, + 43471, + 43482, + 43520, + 43575, + 43584, + 43598, + 43600, + 43610, + 43616, + 43639, + 43642, + 43644, + 43648, + 43715, + 43739, + 43742, + 43744, + 43760, + 43762, + 43767, + 43777, + 43783, + 43785, + 43791, + 43793, + 43799, + 43808, + 43815, + 43816, + 43823, + 43968, + 44011, + 44012, + 44014, + 44016, + 44026, + 44032, + 55204, + 55216, + 55239, + 55243, + 55292, + 63744, + 64110, + 64112, + 64218, + 64256, + 64263, + 64275, + 64280, + 64285, + 64297, + 64298, + 64311, + 64312, + 64317, + 64318, + 64319, + 64320, + 64322, + 64323, + 64325, + 64326, + 64434, + 64467, + 64606, + 64612, + 64830, + 64848, + 64912, + 64914, + 64968, + 65008, + 65018, + 65024, + 65040, + 65056, + 65063, + 65075, + 65077, + 65101, + 65104, + 65137, + 65138, + 65139, + 65140, + 65143, + 65144, + 65145, + 65146, + 65147, + 65148, + 65149, + 65150, + 65151, + 65277, + 65296, + 65306, + 65313, + 65339, + 65343, + 65344, + 65345, + 65371, + 65382, + 65471, + 65474, + 65480, + 65482, + 65488, + 65490, + 65496, + 65498, + 65501, + 65536, + 65548, + 65549, + 65575, + 65576, + 65595, + 65596, + 65598, + 65599, + 65614, + 65616, + 65630, + 65664, + 65787, + 65856, + 65909, + 66045, + 66046, + 66176, + 66205, + 66208, + 66257, + 66304, + 66335, + 66352, + 66379, + 66432, + 66462, + 66464, + 66500, + 66504, + 66512, + 66513, + 66518, + 66560, + 66718, + 66720, + 66730, + 67584, + 67590, + 67592, + 67593, + 67594, + 67638, + 67639, + 67641, + 67644, + 67645, + 67647, + 67670, + 67840, + 67862, + 67872, + 67898, + 67968, + 68024, + 68030, + 68032, + 68096, + 68100, + 68101, + 68103, + 68108, + 68116, + 68117, + 68120, + 68121, + 68148, + 68152, + 68155, + 68159, + 68160, + 68192, + 68221, + 68352, + 68406, + 68416, + 68438, + 68448, + 68467, + 68608, + 68681, + 69632, + 69703, + 69734, + 69744, + 69760, + 69819, + 69840, + 69865, + 69872, + 69882, + 69888, + 69941, + 69942, + 69952, + 70016, + 70085, + 70096, + 70106, + 71296, + 71352, + 71360, + 71370, + 73728, + 74607, + 74752, + 74851, + 77824, + 78895, + 92160, + 92729, + 93952, + 94021, + 94032, + 94079, + 94095, + 94112, + 110592, + 110594, + 119141, + 119146, + 119149, + 119155, + 119163, + 119171, + 119173, + 119180, + 119210, + 119214, + 119362, + 119365, + 119808, + 119893, + 119894, + 119965, + 119966, + 119968, + 119970, + 119971, + 119973, + 119975, + 119977, + 119981, + 119982, + 119994, + 119995, + 119996, + 119997, + 120004, + 120005, + 120070, + 120071, + 120075, + 120077, + 120085, + 120086, + 120093, + 120094, + 120122, + 120123, + 120127, + 120128, + 120133, + 120134, + 120135, + 120138, + 120145, + 120146, + 120486, + 120488, + 120513, + 120514, + 120539, + 120540, + 120571, + 120572, + 120597, + 120598, + 120629, + 120630, + 120655, + 120656, + 120687, + 120688, + 120713, + 120714, + 120745, + 120746, + 120771, + 120772, + 120780, + 120782, + 120832, + 126464, + 126468, + 126469, + 126496, + 126497, + 126499, + 126500, + 126501, + 126503, + 126504, + 126505, + 126515, + 126516, + 126520, + 126521, + 126522, + 126523, + 126524, + 126530, + 126531, + 126535, + 126536, + 126537, + 126538, + 126539, + 126540, + 126541, + 126544, + 126545, + 126547, + 126548, + 126549, + 126551, + 126552, + 126553, + 126554, + 126555, + 126556, + 126557, + 126558, + 126559, + 126560, + 126561, + 126563, + 126564, + 126565, + 126567, + 126571, + 126572, + 126579, + 126580, + 126584, + 126585, + 126589, + 126590, + 126591, + 126592, + 126602, + 126603, + 126620, + 126625, + 126628, + 126629, + 126634, + 126635, + 126652, + 131072, + 173783, + 173824, + 177973, + 177984, + 178206, + 194560, + 195102, + 917760, + 918000 +}; + +#endif + /* ex: set ro: */ diff --git a/Master/tlpkg/tlperl/lib/CORE/config.h b/Master/tlpkg/tlperl/lib/CORE/config.h index 8353e950f34..cd9bfd51d2c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/config.h +++ b/Master/tlpkg/tlperl/lib/CORE/config.h @@ -9,7 +9,7 @@ /* Package name : perl5 * Source directory : - * Configuration time: Tue Apr 22 14:55:05 2014 + * Configuration time: Fri Apr 24 15:37:17 2015 * Configured by : siepo * Target system : */ @@ -646,7 +646,7 @@ * should be included. */ /*#define I_DBM / **/ -#define I_RPCSVC_DBM /**/ +/*#define I_RPCSVC_DBM / **/ /* I_DLFCN: * This symbol, if defined, indicates that exists and should @@ -703,12 +703,6 @@ */ /*#define I_NETINET_IN / **/ -/* I_SFIO: - * This symbol, if defined, indicates to the C program that it should - * include . - */ -/*#define I_SFIO / **/ - /* I_STDDEF: * This symbol, if defined, indicates that exists and should * be included. @@ -811,26 +805,6 @@ */ /*#define I_SYS_WAIT / **/ -/* I_TERMIO: - * This symbol, if defined, indicates that the program should include - * rather than . There are also differences in - * the ioctl() calls that depend on the value of this symbol. - */ -/* I_TERMIOS: - * This symbol, if defined, indicates that the program should include - * the POSIX termios.h rather than sgtty.h or termio.h. - * There are also differences in the ioctl() calls that depend on the - * value of this symbol. - */ -/* I_SGTTY: - * This symbol, if defined, indicates that the program should include - * rather than . There are also differences in - * the ioctl() calls that depend on the value of this symbol. - */ -/*#define I_TERMIO / **/ -/*#define I_TERMIOS / **/ -/*#define I_SGTTY / **/ - /* I_UNISTD: * This symbol, if defined, indicates to the C program that it should * include . @@ -892,18 +866,6 @@ #define OSNAME "MSWin32" /**/ #define OSVERS "4.0" /**/ -/* USE_CROSS_COMPILE: - * This symbol, if defined, indicates that Perl is being cross-compiled. - */ -/* PERL_TARGETARCH: - * This symbol, if defined, indicates the target architecture - * Perl has been cross-compiled to. Undefined if not a cross-compile. - */ -#ifndef USE_CROSS_COMPILE -/*#define USE_CROSS_COMPILE / **/ -#define PERL_TARGETARCH "" /**/ -#endif - /* MULTIARCH: * This symbol, if defined, signifies that the build * process will produce some binary files that are going to be @@ -934,7 +896,7 @@ * This symbol contains the ~name expanded version of ARCHLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define ARCHLIB "c:\\perl\\lib" /**/ +#define ARCHLIB "c:\\tlperl\\lib" /**/ /*#define ARCHLIB_EXP "" / **/ /* ARCHNAME: @@ -957,8 +919,8 @@ * This symbol, if defined, indicates that we'd like to relocate entries * in @INC at run time based on the location of the perl binary. */ -#define BIN "c:\\perl\\bin" /**/ -#define BIN_EXP "c:\\perl\\bin" /**/ +#define BIN "c:\\tlperl\\bin" /**/ +#define BIN_EXP "c:\\tlperl\\bin" /**/ #define PERL_RELOCATABLE_INC "undef" /**/ /* INTSIZE: @@ -993,7 +955,7 @@ * so the default case (for NeXT) is big endian to catch them. * This might matter for NeXT 3.0. */ -#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH) +#if defined(MULTIARCH) # ifdef __LITTLE_ENDIAN__ # if LONGSIZE == 4 # define BYTEORDER 0x1234 @@ -3045,7 +3007,7 @@ * This symbol contains the ~name expanded version of PRIVLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define PRIVLIB "c:\\perl\\lib" /**/ +#define PRIVLIB "c:\\tlperl\\lib" /**/ #define PRIVLIB_EXP (win32_get_privlib(PERL_VERSION_STRING, NULL)) /**/ /* CAN_PROTOTYPE: @@ -3112,10 +3074,10 @@ * function used to generate normalized random numbers. * Values include 15, 16, 31, and 48. */ -#define Drand01() (rand()/(double)((unsigned)1< rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/* I_TERMIOS: + * This symbol, if defined, indicates that the program should include + * the POSIX termios.h rather than sgtty.h or termio.h. + * There are also differences in the ioctl() calls that depend on the + * value of this symbol. + */ +/* I_SGTTY: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/*#define I_TERMIO / **/ +/*#define I_TERMIOS / **/ +/*#define I_SGTTY / **/ + +/* USE_CROSS_COMPILE: + * This symbol, if defined, indicates that Perl is being cross-compiled. + */ +/* PERL_TARGETARCH: + * This symbol, if defined, indicates the target architecture + * Perl has been cross-compiled to. Undefined if not a cross-compile. + */ +#ifndef USE_CROSS_COMPILE +/*#define USE_CROSS_COMPILE / **/ +#define PERL_TARGETARCH "" /**/ #endif /* PERL_USE_DEVEL: @@ -3917,12 +3886,6 @@ */ /*#define HAS_SETPROCTITLE / **/ -/* USE_SFIO: - * This symbol, if defined, indicates that sfio should - * be used. - */ -/*#define USE_SFIO / **/ - /* HAS_SIGNBIT: * This symbol, if defined, indicates that the signbit routine is * available to check if the given number has the sign bit set. @@ -4188,8 +4151,10 @@ #define USE_DYNAMIC_LOADING /**/ /* FFLUSH_NULL: - * This symbol, if defined, tells that fflush(NULL) does flush - * all pending stdio output. + * This symbol, if defined, tells that fflush(NULL) correctly + * flushes all pending stdio output without side effects. In + * particular, on some platforms calling fflush(NULL) *still* + * corrupts STDIN if it is a pipe. */ /* FFLUSH_ALL: * This symbol, if defined, tells that to flush @@ -4325,7 +4290,7 @@ * This symbol, if defined, indicates that exists and * can be included. */ -/*#define I_STDBOOL / **/ +#define I_STDBOOL /**/ /* I_SUNMATH: * This symbol, if defined, indicates that exists and diff --git a/Master/tlpkg/tlperl/lib/CORE/cop.h b/Master/tlpkg/tlperl/lib/CORE/cop.h index 122e2d75e01..37980f04bdd 100644 --- a/Master/tlpkg/tlperl/lib/CORE/cop.h +++ b/Master/tlpkg/tlperl/lib/CORE/cop.h @@ -31,21 +31,13 @@ struct jmpenv { struct jmpenv * je_prev; - Sigjmp_buf je_buf; /* only for use if !je_throw */ + Sigjmp_buf je_buf; /* uninit if je_prev is NULL */ int je_ret; /* last exception thrown */ bool je_mustcatch; /* need to call longjmp()? */ }; typedef struct jmpenv JMPENV; -#ifdef OP_IN_REGISTER -#define OP_REG_TO_MEM PL_opsave = op -#define OP_MEM_TO_REG op = PL_opsave -#else -#define OP_REG_TO_MEM NOOP -#define OP_MEM_TO_REG NOOP -#endif - /* * How to build the first jmpenv. * @@ -58,10 +50,11 @@ typedef struct jmpenv JMPENV; #define JMPENV_BOOTSTRAP \ STMT_START { \ - Zero(&PL_start_env, 1, JMPENV); \ + PERL_POISON_EXPR(PoisonNew(&PL_start_env, 1, JMPENV));\ + PL_top_env = &PL_start_env; \ + PL_start_env.je_prev = NULL; \ PL_start_env.je_ret = -1; \ PL_start_env.je_mustcatch = TRUE; \ - PL_top_env = &PL_start_env; \ } STMT_END /* @@ -107,9 +100,7 @@ typedef struct jmpenv JMPENV; Perl_deb(aTHX_ "JUMPENV_PUSH level=%d at %s:%d\n", \ i, __FILE__, __LINE__);}) \ cur_env.je_prev = PL_top_env; \ - OP_REG_TO_MEM; \ cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK); \ - OP_MEM_TO_REG; \ PL_top_env = &cur_env; \ cur_env.je_mustcatch = FALSE; \ (v) = cur_env.je_ret; \ @@ -133,7 +124,6 @@ typedef struct jmpenv JMPENV; while (p) { i++; p = p->je_prev; } \ Perl_deb(aTHX_ "JUMPENV_JUMP(%d) level=%d at %s:%d\n", \ (int)v, i, __FILE__, __LINE__);}) \ - OP_REG_TO_MEM; \ if (PL_top_env->je_prev) \ PerlProc_longjmp(PL_top_env->je_buf, (v)); \ if ((v) == 2) \ @@ -410,7 +400,7 @@ struct cop { # ifdef NETWARE # define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) -# define CopFILE_setn(c,pv,l) ((c)->cop_file = savepv((pv),(l))) +# define CopFILE_setn(c,pv,l) ((c)->cop_file = savepvn((pv),(l))) # else # define CopFILE_set(c,pv) ((c)->cop_file = savesharedpv(pv)) # define CopFILE_setn(c,pv,l) ((c)->cop_file = savesharedpvn((pv),(l))) @@ -444,8 +434,8 @@ struct cop { # else # define CopFILEAVx(c) (GvAV(CopFILEGV(c))) # endif -# define CopFILE(c) (CopFILEGV(c) && GvSV(CopFILEGV(c)) \ - ? SvPVX(GvSV(CopFILEGV(c))) : NULL) +# define CopFILE(c) (CopFILEGV(c) \ + ? GvNAME(CopFILEGV(c))+2 : NULL) # define CopSTASH(c) ((c)->cop_stash) # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) # define CopFILE_free(c) (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL)) @@ -648,6 +638,7 @@ struct block_format { #define POPSUB(cx,sv) \ STMT_START { \ + const I32 olddepth = cx->blk_sub.olddepth; \ RETURN_PROBE(CvNAMED(cx->blk_sub.cv) \ ? HEK_KEY(CvNAME_HEK(cx->blk_sub.cv)) \ : GvENAME(CvGV(cx->blk_sub.cv)), \ @@ -671,7 +662,8 @@ struct block_format { } \ } \ sv = MUTABLE_SV(cx->blk_sub.cv); \ - if (sv && (CvDEPTH((const CV*)sv) = cx->blk_sub.olddepth)) \ + LEAVE_SCOPE(PL_scopestack[cx->blk_oldscopesp-1]); \ + if (sv && (CvDEPTH((const CV*)sv) = olddepth)) \ sv = NULL; \ } STMT_END @@ -681,11 +673,15 @@ struct block_format { } STMT_END #define POPFORMAT(cx) \ - setdefout(cx->blk_format.dfoutgv); \ - CvDEPTH(cx->blk_format.cv)--; \ - if (!CvDEPTH(cx->blk_format.cv)) \ + STMT_START { \ + CV * const cv = cx->blk_format.cv; \ + GV * const dfuot = cx->blk_format.dfoutgv; \ + setdefout(dfuot); \ + LEAVE_SCOPE(PL_scopestack[cx->blk_oldscopesp-1]); \ + if (!--CvDEPTH(cv)) \ SvREFCNT_dec_NN(cx->blk_format.cv); \ - SvREFCNT_dec_NN(cx->blk_format.dfoutgv); + SvREFCNT_dec_NN(dfuot); \ + } STMT_END /* eval context */ struct block_eval { @@ -1058,6 +1054,7 @@ L. #define G_WRITING_TO_STDERR 1024 /* Perl_write_to_stderr() is calling Perl_magic_methcall(). */ #define G_RE_REPARSING 0x800 /* compiling a run-time /(?{..})/ */ +#define G_METHOD_NAMED 4096 /* calling named method, eg without :: or ' */ /* flag bits for PL_in_eval */ #define EVAL_NULL 0 /* not in an eval */ @@ -1166,14 +1163,14 @@ typedef struct stackinfo PERL_SI; =head1 Multicall Functions =for apidoc Ams||dMULTICALL -Declare local variables for a multicall. See L. +Declare local variables for a multicall. See L. =for apidoc Ams||PUSH_MULTICALL Opening bracket for a lightweight callback. See L. =for apidoc Ams||MULTICALL -Make a lightweight callback. See L. +Make a lightweight callback. See L. =for apidoc Ams||POP_MULTICALL Closing bracket for a lightweight callback. diff --git a/Master/tlpkg/tlperl/lib/CORE/cv.h b/Master/tlpkg/tlperl/lib/CORE/cv.h index 5da9a502f53..36afba7ee80 100644 --- a/Master/tlpkg/tlperl/lib/CORE/cv.h +++ b/Master/tlpkg/tlperl/lib/CORE/cv.h @@ -26,10 +26,10 @@ Null CV pointer. =head1 CV Manipulation Functions This section documents functions to manipulate CVs which are code-values, -or subroutines. For more information, see L. +or subroutines. For more information, see L. =for apidoc Am|HV*|CvSTASH|CV* cv -Returns the stash of the CV. A stash is the symbol table hash, containing +Returns the stash of the CV. A stash is the symbol table hash, containing the package-scoped variables in the package where the subroutine was defined. For more information, see L. @@ -49,7 +49,7 @@ See L. #define CvROOT(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root #define CvXSUB(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub #define CvXSUBANY(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany -#define CvGV(sv) S_CvGV((CV *)(sv)) +#define CvGV(sv) S_CvGV((const CV *)(sv)) #define CvGV_set(cv,gv) Perl_cvgv_set(aTHX_ cv, gv) #define CvFILE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file #ifdef USE_ITHREADS @@ -189,7 +189,7 @@ See L. #define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */ PERL_STATIC_INLINE GV * -S_CvGV(CV *sv) +S_CvGV(const CV *sv) { return CvNAMED(sv) ? 0 @@ -218,19 +218,19 @@ CvNAME_HEK(CV *sv) =for apidoc m|bool|CvWEAKOUTSIDE|CV *cv Each CV has a pointer, C, to its lexically enclosing -CV (if any). Because pointers to anonymous sub prototypes are +CV (if any). Because pointers to anonymous sub prototypes are stored in C<&> pad slots, it is a possible to get a circular reference, -with the parent pointing to the child and vice-versa. To avoid the +with the parent pointing to the child and vice-versa. To avoid the ensuing memory leak, we do not increment the reference count of the CV pointed to by C in the I that the parent -has a C<&> pad slot pointing back to us. In this case, we set the -C flag in the child. This allows us to determine under what +has a C<&> pad slot pointing back to us. In this case, we set the +C flag in the child. This allows us to determine under what circumstances we should decrement the refcount of the parent when freeing the child. There is a further complication with non-closure anonymous subs (i.e. those -that do not refer to any lexicals outside that sub). In this case, the -anonymous prototype is shared rather than being cloned. This has the +that do not refer to any lexicals outside that sub). In this case, the +anonymous prototype is shared rather than being cloned. This has the consequence that the parent may be freed while there are still active children, eg @@ -246,16 +246,16 @@ and the freed BEGIN is accessed. To avoid this, whenever a CV and its associated pad is freed, any C<&> entries in the pad are explicitly removed from the pad, and if the refcount of the pointed-to anon sub is still positive, then that -child's C is set to point to its grandparent. This will only +child's C is set to point to its grandparent. This will only occur in the single specific case of a non-closure anon prototype having one or more active references (such as C<$a> above). One other thing to consider is that a CV may be merely undefined -rather than freed, eg C. In this case, its refcount may +rather than freed, eg C. In this case, its refcount may not have reached zero, but we still delete its pad and its C etc. Since various children may still have their C pointing at this undefined CV, we keep its own C for the time being, so that -the chain of lexical scopes is unbroken. For example, the following +the chain of lexical scopes is unbroken. For example, the following should print 123: my $x = 123; diff --git a/Master/tlpkg/tlperl/lib/CORE/dosish.h b/Master/tlpkg/tlperl/lib/CORE/dosish.h index 8c3917b510d..8b34369ab5c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/dosish.h +++ b/Master/tlpkg/tlperl/lib/CORE/dosish.h @@ -58,23 +58,6 @@ #endif #define dXSUB_SYS -/* - * 5.003_07 and earlier keyed on #ifdef MSDOS for determining if we were - * running on DOS, *and* if we had to cope with 16 bit memory addressing - * constraints, *and* we need to have memory allocated as unsigned long. - * - * with the advent of *real* compilers for DOS, they are not locked together. - * MSDOS means "I am running on MSDOS". HAS_64K_LIMIT means "I have - * 16 bit memory addressing constraints". - * - * if you need the last, try #DEFINE MEM_SIZE unsigned long. - */ -#ifdef MSDOS -# ifndef DJGPP -# define HAS_64K_LIMIT -# endif -#endif - /* USEMYBINMODE * This symbol, if defined, indicates that the program should * use the routine my_binmode(FILE *fp, char iotype, int mode) to insure diff --git a/Master/tlpkg/tlperl/lib/CORE/embed.h b/Master/tlpkg/tlperl/lib/CORE/embed.h index 71456cbe205..a6e3b9d1820 100644 --- a/Master/tlpkg/tlperl/lib/CORE/embed.h +++ b/Master/tlpkg/tlperl/lib/CORE/embed.h @@ -35,12 +35,13 @@ #define _is_utf8_perl_idcont(a) Perl__is_utf8_perl_idcont(aTHX_ a) #define _is_utf8_perl_idstart(a) Perl__is_utf8_perl_idstart(aTHX_ a) #define _to_uni_fold_flags(a,b,c,d) Perl__to_uni_fold_flags(aTHX_ a,b,c,d) -#define _to_utf8_fold_flags(a,b,c,d,e) Perl__to_utf8_fold_flags(aTHX_ a,b,c,d,e) -#define _to_utf8_lower_flags(a,b,c,d,e) Perl__to_utf8_lower_flags(aTHX_ a,b,c,d,e) -#define _to_utf8_title_flags(a,b,c,d,e) Perl__to_utf8_title_flags(aTHX_ a,b,c,d,e) -#define _to_utf8_upper_flags(a,b,c,d,e) Perl__to_utf8_upper_flags(aTHX_ a,b,c,d,e) +#define _to_utf8_fold_flags(a,b,c,d) Perl__to_utf8_fold_flags(aTHX_ a,b,c,d) +#define _to_utf8_lower_flags(a,b,c,d) Perl__to_utf8_lower_flags(aTHX_ a,b,c,d) +#define _to_utf8_title_flags(a,b,c,d) Perl__to_utf8_title_flags(aTHX_ a,b,c,d) +#define _to_utf8_upper_flags(a,b,c,d) Perl__to_utf8_upper_flags(aTHX_ a,b,c,d) #define amagic_call(a,b,c,d) Perl_amagic_call(aTHX_ a,b,c,d) #define amagic_deref_call(a,b) Perl_amagic_deref_call(aTHX_ a,b) +#define append_utf8_from_native_byte S_append_utf8_from_native_byte #define apply_attrs_string(a,b,c,d) Perl_apply_attrs_string(aTHX_ a,b,c,d) #define atfork_lock Perl_atfork_lock #define atfork_unlock Perl_atfork_unlock @@ -84,6 +85,7 @@ #ifndef PERL_IMPLICIT_CONTEXT #define croak Perl_croak #endif +#define croak_memory_wrap S_croak_memory_wrap #define croak_no_modify Perl_croak_no_modify #define croak_sv(a) Perl_croak_sv(aTHX_ a) #define croak_xs_usage Perl_croak_xs_usage @@ -229,6 +231,7 @@ #define instr Perl_instr #define is_ascii_string Perl_is_ascii_string #define is_lvalue_sub() Perl_is_lvalue_sub(aTHX) +#define is_safe_syscall(a,b,c,d) S_is_safe_syscall(aTHX_ a,b,c,d) #define is_uni_alnum(a) Perl_is_uni_alnum(aTHX_ a) #define is_uni_alnum_lc(a) Perl_is_uni_alnum_lc(aTHX_ a) #define is_uni_alnumc(a) Perl_is_uni_alnumc(aTHX_ a) @@ -340,7 +343,6 @@ #define newANONLIST(a) Perl_newANONLIST(aTHX_ a) #define newANONSUB(a,b,c) Perl_newANONSUB(aTHX_ a,b,c) #define newASSIGNOP(a,b,c,d) Perl_newASSIGNOP(aTHX_ a,b,c,d) -#define newATTRSUB(a,b,c,d,e) Perl_newATTRSUB(aTHX_ a,b,c,d,e) #define newAVREF(a) Perl_newAVREF(aTHX_ a) #define newBINOP(a,b,c,d) Perl_newBINOP(aTHX_ a,b,c,d) #define newCONDOP(a,b,c,d) Perl_newCONDOP(aTHX_ a,b,c,d) @@ -451,7 +453,7 @@ #define pv_pretty(a,b,c,d,e,f,g) Perl_pv_pretty(aTHX_ a,b,c,d,e,f,g) #define pv_uni_display(a,b,c,d,e) Perl_pv_uni_display(aTHX_ a,b,c,d,e) #define re_compile(a,b) Perl_re_compile(aTHX_ a,b) -#define re_intuit_start(a,b,c,d,e,f) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f) +#define re_intuit_start(a,b,c,d,e,f,g) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f,g) #define re_intuit_string(a) Perl_re_intuit_string(aTHX_ a) #define reentrant_free() Perl_reentrant_free(aTHX) #define reentrant_init() Perl_reentrant_init(aTHX) @@ -607,6 +609,7 @@ #define sv_nv(a) Perl_sv_nv(aTHX_ a) #define sv_peek(a) Perl_sv_peek(aTHX_ a) #define sv_pos_b2u(a,b) Perl_sv_pos_b2u(aTHX_ a,b) +#define sv_pos_b2u_flags(a,b,c) Perl_sv_pos_b2u_flags(aTHX_ a,b,c) #define sv_pos_u2b(a,b,c) Perl_sv_pos_u2b(aTHX_ a,b,c) #define sv_pos_u2b_flags(a,b,c,d) Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d) #define sv_pvbyten(a,b) Perl_sv_pvbyten(aTHX_ a,b) @@ -689,12 +692,14 @@ #define utf8_length(a,b) Perl_utf8_length(aTHX_ a,b) #define utf8_to_bytes(a,b) Perl_utf8_to_bytes(aTHX_ a,b) #define utf8_to_uvchr(a,b) Perl_utf8_to_uvchr(aTHX_ a,b) -#define utf8_to_uvchr_buf(a,b,c) Perl_utf8_to_uvchr_buf(aTHX_ a,b,c) #define utf8_to_uvuni(a,b) Perl_utf8_to_uvuni(aTHX_ a,b) #define utf8_to_uvuni_buf(a,b,c) Perl_utf8_to_uvuni_buf(aTHX_ a,b,c) +#define utf8n_to_uvchr(a,b,c,d) Perl_utf8n_to_uvchr(aTHX_ a,b,c,d) #define utf8n_to_uvuni(a,b,c,d) Perl_utf8n_to_uvuni(aTHX_ a,b,c,d) -#define uvchr_to_utf8_flags(a,b,c) Perl_uvchr_to_utf8_flags(aTHX_ a,b,c) +#define uvoffuni_to_utf8_flags(a,b,c) Perl_uvoffuni_to_utf8_flags(aTHX_ a,b,c) +#define uvuni_to_utf8(a,b) Perl_uvuni_to_utf8(aTHX_ a,b) #define uvuni_to_utf8_flags(a,b,c) Perl_uvuni_to_utf8_flags(aTHX_ a,b,c) +#define valid_utf8_to_uvchr(a,b) Perl_valid_utf8_to_uvchr(aTHX_ a,b) #define valid_utf8_to_uvuni(a,b) Perl_valid_utf8_to_uvuni(aTHX_ a,b) #define vcmp(a,b) Perl_vcmp(aTHX_ a,b) #define vcroak(a,b) Perl_vcroak(aTHX_ a,b) @@ -752,14 +757,6 @@ #define pad_setsv(a,b) Perl_pad_setsv(aTHX_ a,b) #define pad_sv(a) Perl_pad_sv(aTHX_ a) #endif -#if defined(DUMP_FDS) -#define dump_fds(a) Perl_dump_fds(aTHX_ a) -#endif -#if defined(EBCDIC) -#define utf8n_to_uvchr(a,b,c,d) Perl_utf8n_to_uvchr(aTHX_ a,b,c,d) -#define uvchr_to_utf8(a,b) Perl_uvchr_to_utf8(aTHX_ a,b) -#define valid_utf8_to_uvchr(a,b) Perl_valid_utf8_to_uvchr(aTHX_ a,b) -#endif #if defined(HAS_SIGACTION) && defined(SA_SIGINFO) #define csighandler Perl_csighandler #endif @@ -774,11 +771,6 @@ #define dump_mstats(a) Perl_dump_mstats(aTHX_ a) #define get_mstats(a,b,c) Perl_get_mstats(aTHX_ a,b,c) #endif -#if defined(MYSWAP) -#define my_htonl(a) Perl_my_htonl(aTHX_ a) -#define my_ntohl(a) Perl_my_ntohl(aTHX_ a) -#define my_swap(a) Perl_my_swap(aTHX_ a) -#endif #if defined(PERL_GLOBAL_STRUCT) #define GetVars() Perl_GetVars(aTHX) #define free_global_struct(a) Perl_free_global_struct(aTHX_ a) @@ -801,6 +793,12 @@ #define warn_nocontext Perl_warn_nocontext #define warner_nocontext Perl_warner_nocontext #endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C) +#define _new_invlist_C_array(a) Perl__new_invlist_C_array(aTHX_ a) +#endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) +#define _get_regclass_nonbitmap_data(a,b,c,d,e) Perl__get_regclass_nonbitmap_data(aTHX_ a,b,c,d,e) +#endif #if defined(PERL_MAD) #define newFORM(a,b,c) Perl_newFORM(aTHX_ a,b,c) #endif @@ -830,7 +828,7 @@ #if defined(USE_LOCALE_COLLATE) #define sv_collxfrm_flags(a,b,c) Perl_sv_collxfrm_flags(aTHX_ a,b,c) #endif -#if defined(USE_PERLIO) && !defined(USE_SFIO) +#if defined(USE_PERLIO) #define PerlIO_clearerr(a) Perl_PerlIO_clearerr(aTHX_ a) #define PerlIO_close(a) Perl_PerlIO_close(aTHX_ a) #define PerlIO_eof(a) Perl_PerlIO_eof(aTHX_ a) @@ -854,6 +852,9 @@ #define PerlIO_unread(a,b,c) Perl_PerlIO_unread(aTHX_ a,b,c) #define PerlIO_write(a,b,c) Perl_PerlIO_write(aTHX_ a,b,c) #endif +#if defined(WIN32) +#define my_setlocale(a,b) Perl_my_setlocale(aTHX_ a,b) +#endif #if defined(WIN32) || defined(__SYMBIAN32__) || defined(VMS) #define do_aspawn(a,b,c) Perl_do_aspawn(aTHX_ a,b,c) #define do_spawn(a) Perl_do_spawn(aTHX_ a) @@ -862,6 +863,8 @@ #if defined(PERL_CORE) || defined(PERL_EXT) #define av_reify(a) Perl_av_reify(aTHX_ a) #define current_re_engine() Perl_current_re_engine(aTHX) +#define cv_ckproto_len_flags(a,b,c,d,e) Perl_cv_ckproto_len_flags(aTHX_ a,b,c,d,e) +#define mg_find_mglob(a) Perl_mg_find_mglob(aTHX_ a) #define op_clear(a) Perl_op_clear(aTHX_ a) #define qerror(a) Perl_qerror(aTHX_ a) #define reg_named_buff(a,b,c,d) Perl_reg_named_buff(aTHX_ a,b,c,d) @@ -871,8 +874,10 @@ #define reg_numbered_buff_store(a,b,c) Perl_reg_numbered_buff_store(aTHX_ a,b,c) #define reg_qr_package(a) Perl_reg_qr_package(aTHX_ a) #define reg_temp_copy(a,b) Perl_reg_temp_copy(aTHX_ a,b) -#define regprop(a,b,c) Perl_regprop(aTHX_ a,b,c) +#define regprop(a,b,c,d) Perl_regprop(aTHX_ a,b,c,d) #define report_uninit(a) Perl_report_uninit(aTHX_ a) +#define sv_magicext_mglob(a) Perl_sv_magicext_mglob(aTHX_ a) +#define validate_proto(a,b,c) Perl_validate_proto(aTHX_ a,b,c) #define vivify_defelem(a) Perl_vivify_defelem(aTHX_ a) #define yylex() Perl_yylex(aTHX) # if defined(DEBUGGING) @@ -882,7 +887,10 @@ #define dump_trie_interim_table(a,b,c,d,e) S_dump_trie_interim_table(aTHX_ a,b,c,d,e) #define dumpuntil(a,b,c,d,e,f,g,h) S_dumpuntil(aTHX_ a,b,c,d,e,f,g,h) #define put_byte(a,b) S_put_byte(aTHX_ a,b) +#define put_latin1_charclass_innards(a,b) S_put_latin1_charclass_innards(aTHX_ a,b) +#define put_range(a,b,c) S_put_range(aTHX_ a,b,c) #define regdump_extflags(a,b) S_regdump_extflags(aTHX_ a,b) +#define regdump_intflags(a,b) S_regdump_intflags(aTHX_ a,b) #define regtail_study(a,b,c,d) S_regtail_study(aTHX_ a,b,c,d) # endif # if defined(PERL_IN_REGEXEC_C) @@ -893,24 +901,20 @@ # if defined(PERL_ANY_COW) #define sv_setsv_cow(a,b) Perl_sv_setsv_cow(aTHX_ a,b) # endif +# if defined(PERL_CORE) || defined (PERL_EXT) +#define sv_or_pv_pos_u2b(a,b,c,d) S_sv_or_pv_pos_u2b(aTHX_ a,b,c,d) +# endif # if defined(PERL_IN_REGCOMP_C) #define _append_range_to_invlist(a,b,c) S__append_range_to_invlist(aTHX_ a,b,c) #define _invlist_array_init(a,b) S__invlist_array_init(aTHX_ a,b) -#define _new_invlist_C_array(a) S__new_invlist_C_array(aTHX_ a) #define add_cp_to_invlist(a,b) S_add_cp_to_invlist(aTHX_ a,b) #define add_data S_add_data -#define alloc_maybe_populate_EXACT(a,b,c,d,e) S_alloc_maybe_populate_EXACT(aTHX_ a,b,c,d,e) -#define cl_and S_cl_and -#define cl_anything S_cl_anything -#define cl_init S_cl_init -#define cl_is_anything S_cl_is_anything -#define cl_or S_cl_or +#define alloc_maybe_populate_EXACT(a,b,c,d,e,f) S_alloc_maybe_populate_EXACT(aTHX_ a,b,c,d,e,f) #define compute_EXACTish(a) S_compute_EXACTish(aTHX_ a) #define could_it_be_a_POSIX_class(a) S_could_it_be_a_POSIX_class(aTHX_ a) +#define get_ANYOF_cp_list_for_ssc(a,b) S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b) #define get_invlist_iter_addr(a) S_get_invlist_iter_addr(aTHX_ a) #define get_invlist_previous_index_addr(a) S_get_invlist_previous_index_addr(aTHX_ a) -#define get_invlist_version_id_addr(a) S_get_invlist_version_id_addr(aTHX_ a) -#define get_invlist_zero_addr(a) S_get_invlist_zero_addr(aTHX_ a) #define grok_bslash_N(a,b,c,d,e,f,g) S_grok_bslash_N(aTHX_ a,b,c,d,e,f,g) #define handle_regex_sets(a,b,c,d,e) S_handle_regex_sets(aTHX_ a,b,c,d,e) #define invlist_array(a) S_invlist_array(aTHX_ a) @@ -923,7 +927,7 @@ #define invlist_iternext(a,b,c) S_invlist_iternext(aTHX_ a,b,c) #define invlist_max(a) S_invlist_max(aTHX_ a) #define invlist_previous_index(a) S_invlist_previous_index(aTHX_ a) -#define invlist_set_len(a,b) S_invlist_set_len(aTHX_ a,b) +#define invlist_set_len(a,b,c) S_invlist_set_len(aTHX_ a,b,c) #define invlist_set_previous_index(a,b) S_invlist_set_previous_index(aTHX_ a,b) #define invlist_trim(a) S_invlist_trim(aTHX_ a) #define join_exact(a,b,c,d,e,f,g) S_join_exact(aTHX_ a,b,c,d,e,f,g) @@ -931,6 +935,7 @@ #define make_trie_failtable(a,b,c,d) S_make_trie_failtable(aTHX_ a,b,c,d) #define nextchar(a) S_nextchar(aTHX_ a) #define parse_lparen_question_flags(a) S_parse_lparen_question_flags(aTHX_ a) +#define populate_ANYOF_from_invlist(a,b) S_populate_ANYOF_from_invlist(aTHX_ a,b) #define reg(a,b,c,d) S_reg(aTHX_ a,b,c,d) #define reg_node(a,b) S_reg_node(aTHX_ a,b) #define reg_recode(a,b) S_reg_recode(aTHX_ a,b) @@ -948,23 +953,39 @@ #define reguni(a,b,c) S_reguni(aTHX_ a,b,c) #define regwhite S_regwhite #define scan_commit(a,b,c,d) S_scan_commit(aTHX_ a,b,c,d) +#define set_ANYOF_arg(a,b,c,d,e,f,g) S_set_ANYOF_arg(aTHX_ a,b,c,d,e,f,g) +#define ssc_add_range(a,b,c) S_ssc_add_range(aTHX_ a,b,c) +#define ssc_and(a,b,c) S_ssc_and(aTHX_ a,b,c) +#define ssc_anything(a) S_ssc_anything(aTHX_ a) +#define ssc_clear_locale(a) S_ssc_clear_locale(aTHX_ a) +#define ssc_cp_and(a,b) S_ssc_cp_and(aTHX_ a,b) +#define ssc_finalize(a,b) S_ssc_finalize(aTHX_ a,b) +#define ssc_init(a,b) S_ssc_init(aTHX_ a,b) +#define ssc_intersection(a,b,c) S_ssc_intersection(aTHX_ a,b,c) +#define ssc_is_anything(a) S_ssc_is_anything(aTHX_ a) +#define ssc_is_cp_posixl_init(a,b) S_ssc_is_cp_posixl_init(aTHX_ a,b) +#define ssc_or(a,b,c) S_ssc_or(aTHX_ a,b,c) +#define ssc_union(a,b,c) S_ssc_union(aTHX_ a,b,c) #define study_chunk(a,b,c,d,e,f,g,h,i,j,k) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k) # endif +# if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) +#define _invlist_dump(a,b,c,d) Perl__invlist_dump(aTHX_ a,b,c,d) +# endif # if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) -#define _get_invlist_len_addr(a) S__get_invlist_len_addr(aTHX_ a) #define _get_swash_invlist(a) Perl__get_swash_invlist(aTHX_ a) #define _invlist_contains_cp(a,b) S__invlist_contains_cp(aTHX_ a,b) #define _invlist_contents(a) Perl__invlist_contents(aTHX_ a) #define _invlist_len(a) S__invlist_len(aTHX_ a) #define _invlist_search(a,b) Perl__invlist_search(aTHX_ a,b) #define _swash_inversion_hash(a) Perl__swash_inversion_hash(aTHX_ a) +#define get_invlist_offset_addr(a) S_get_invlist_offset_addr(aTHX_ a) # endif # if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_TOKE_C) #define _core_swash_init(a,b,c,d,e,f,g) Perl__core_swash_init(aTHX_ a,b,c,d,e,f,g) # endif # if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) #define form_short_octal_warning(a,b) S_form_short_octal_warning(aTHX_ a,b) -#define grok_bslash_c(a,b,c) S_grok_bslash_c(aTHX_ a,b,c) +#define grok_bslash_c(a,b) S_grok_bslash_c(aTHX_ a,b) #define grok_bslash_o(a,b,c,d,e,f,g) S_grok_bslash_o(aTHX_ a,b,c,d,e,f,g) #define grok_bslash_x(a,b,c,d,e,f,g) S_grok_bslash_x(aTHX_ a,b,c,d,e,f,g) #define regcurly(a,b) S_regcurly(aTHX_ a,b) @@ -973,31 +994,28 @@ #define _add_range_to_invlist(a,b,c) Perl__add_range_to_invlist(aTHX_ a,b,c) #define _invlist_intersection_maybe_complement_2nd(a,b,c,d) Perl__invlist_intersection_maybe_complement_2nd(aTHX_ a,b,c,d) #define _invlist_invert(a) Perl__invlist_invert(aTHX_ a) -#define _invlist_invert_prop(a) Perl__invlist_invert_prop(aTHX_ a) #define _invlist_populate_swatch(a,b,c,d) Perl__invlist_populate_swatch(aTHX_ a,b,c,d) #define _invlist_union_maybe_complement_2nd(a,b,c,d) Perl__invlist_union_maybe_complement_2nd(aTHX_ a,b,c,d) #define _new_invlist(a) Perl__new_invlist(aTHX_ a) +#define _setup_canned_invlist(a,b,c) Perl__setup_canned_invlist(aTHX_ a,b,c) #define _swash_to_invlist(a) Perl__swash_to_invlist(aTHX_ a) # endif # if defined(PERL_IN_REGEXEC_C) -#define core_regclass_swash(a,b,c,d) S_core_regclass_swash(aTHX_ a,b,c,d) -#define find_byclass(a,b,c,d,e,f) S_find_byclass(aTHX_ a,b,c,d,e,f) +#define find_byclass(a,b,c,d,e) S_find_byclass(aTHX_ a,b,c,d,e) #define isFOO_lc(a,b) S_isFOO_lc(aTHX_ a,b) #define isFOO_utf8_lc(a,b) S_isFOO_utf8_lc(aTHX_ a,b) #define reg_check_named_buff_matched(a,b) S_reg_check_named_buff_matched(aTHX_ a,b) #define regcppop(a,b) S_regcppop(aTHX_ a,b) #define regcppush(a,b,c) S_regcppush(aTHX_ a,b,c) #define reghop3 S_reghop3 +#define reghop4 S_reghop4 #define reghopmaybe3 S_reghopmaybe3 -#define reginclass(a,b,c,d) S_reginclass(aTHX_ a,b,c,d) +#define reginclass(a,b,c,d,e) S_reginclass(aTHX_ a,b,c,d,e) #define regmatch(a,b,c) S_regmatch(aTHX_ a,b,c) #define regrepeat(a,b,c,d,e,f) S_regrepeat(aTHX_ a,b,c,d,e,f) #define regtry(a,b) S_regtry(aTHX_ a,b) #define to_byte_substr(a) S_to_byte_substr(aTHX_ a) #define to_utf8_substr(a) S_to_utf8_substr(aTHX_ a) -# if defined(XXX_dmq) -#define reghop4 S_reghop4 -# endif # endif # if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) #define _to_fold_latin1(a,b,c,d) Perl__to_fold_latin1(aTHX_ a,b,c,d) @@ -1019,18 +1037,17 @@ #define cando(a,b,c) Perl_cando(aTHX_ a,b,c) #define check_utf8_print(a,b) Perl_check_utf8_print(aTHX_ a,b) #define ck_anoncode(a) Perl_ck_anoncode(aTHX_ a) +#define ck_backtick(a) Perl_ck_backtick(aTHX_ a) #define ck_bitop(a) Perl_ck_bitop(aTHX_ a) #define ck_cmp(a) Perl_ck_cmp(aTHX_ a) #define ck_concat(a) Perl_ck_concat(aTHX_ a) #define ck_defined(a) Perl_ck_defined(aTHX_ a) #define ck_delete(a) Perl_ck_delete(aTHX_ a) -#define ck_die(a) Perl_ck_die(aTHX_ a) #define ck_each(a) Perl_ck_each(aTHX_ a) #define ck_eof(a) Perl_ck_eof(aTHX_ a) #define ck_eval(a) Perl_ck_eval(aTHX_ a) #define ck_exec(a) Perl_ck_exec(aTHX_ a) #define ck_exists(a) Perl_ck_exists(aTHX_ a) -#define ck_exit(a) Perl_ck_exit(aTHX_ a) #define ck_ftst(a) Perl_ck_ftst(aTHX_ a) #define ck_fun(a) Perl_ck_fun(aTHX_ a) #define ck_glob(a) Perl_ck_glob(aTHX_ a) @@ -1062,18 +1079,21 @@ #define ck_svconst(a) Perl_ck_svconst(aTHX_ a) #define ck_tell(a) Perl_ck_tell(aTHX_ a) #define ck_trunc(a) Perl_ck_trunc(aTHX_ a) +#define closest_cop(a,b,c,d) Perl_closest_cop(aTHX_ a,b,c,d) #define convert(a,b,c) Perl_convert(aTHX_ a,b,c) #define core_prototype(a,b,c,d) Perl_core_prototype(aTHX_ a,b,c,d) #define coresub_op(a,b,c) Perl_coresub_op(aTHX_ a,b,c) #define create_eval_scope(a) Perl_create_eval_scope(aTHX_ a) #define croak_no_mem Perl_croak_no_mem #define croak_popstack Perl_croak_popstack -#define cv_ckproto_len_flags(a,b,c,d,e) Perl_cv_ckproto_len_flags(aTHX_ a,b,c,d,e) +#define custom_op_get_field(a,b) Perl_custom_op_get_field(aTHX_ a,b) #define cv_clone_into(a,b) Perl_cv_clone_into(aTHX_ a,b) +#define cv_const_sv_or_av(a) Perl_cv_const_sv_or_av(aTHX_ a) #define cv_forget_slab(a) Perl_cv_forget_slab(aTHX_ a) #define cvgv_set(a,b) Perl_cvgv_set(aTHX_ a,b) #define cvstash_set(a,b) Perl_cvstash_set(aTHX_ a,b) #define deb_stack_all() Perl_deb_stack_all(aTHX) +#define defelem_target(a,b) Perl_defelem_target(aTHX_ a,b) #define delete_eval_scope() Perl_delete_eval_scope(aTHX) #define die_unwind(a) Perl_die_unwind(aTHX_ a) #define do_aexec5(a,b,c,d,e) Perl_do_aexec5(aTHX_ a,b,c,d,e) @@ -1081,6 +1101,8 @@ #define do_eof(a) Perl_do_eof(aTHX_ a) #define do_execfree() Perl_do_execfree(aTHX) #define do_ncmp(a,b) Perl_do_ncmp(aTHX_ a,b) +#define do_open6(a,b,c,d,e,f) Perl_do_open6(aTHX_ a,b,c,d,e,f) +#define do_open_raw(a,b,c,d,e) Perl_do_open_raw(aTHX_ a,b,c,d,e) #define do_print(a,b) Perl_do_print(aTHX_ a,b) #define do_readline() Perl_do_readline(aTHX) #define do_seek(a,b,c) Perl_do_seek(aTHX_ a,b,c) @@ -1103,6 +1125,7 @@ #define get_hash_seed(a) Perl_get_hash_seed(aTHX_ a) #define get_no_modify() Perl_get_no_modify(aTHX) #define get_opargs() Perl_get_opargs(aTHX) +#define gv_override(a,b) Perl_gv_override(aTHX_ a,b) #define gv_try_downgrade(a) Perl_gv_try_downgrade(aTHX_ a) #define hv_ename_add(a,b,c,d) Perl_hv_ename_add(aTHX_ a,b,c,d) #define hv_ename_delete(a,b,c,d) Perl_hv_ename_delete(aTHX_ a,b,c,d) @@ -1175,10 +1198,10 @@ #define my_clearenv() Perl_my_clearenv(aTHX) #define my_lstat_flags(a) Perl_my_lstat_flags(aTHX_ a) #define my_stat_flags(a) Perl_my_stat_flags(aTHX_ a) -#define my_swabn Perl_my_swabn #define my_unexec() Perl_my_unexec(aTHX) -#define newATTRSUB_flags(a,b,c,d,e,f) Perl_newATTRSUB_flags(aTHX_ a,b,c,d,e,f) +#define newATTRSUB_x(a,b,c,d,e,f) Perl_newATTRSUB_x(aTHX_ a,b,c,d,e,f) #define newSTUB(a,b) Perl_newSTUB(aTHX_ a,b) +#define newSVavdefelem(a,b,c) Perl_newSVavdefelem(aTHX_ a,b,c) #define newXS_len_flags(a,b,c,d,e,f,g) Perl_newXS_len_flags(aTHX_ a,b,c,d,e,f,g) #define nextargv(a) Perl_nextargv(aTHX_ a) #define oopsAV(a) Perl_oopsAV(aTHX_ a) @@ -1193,6 +1216,7 @@ #define pad_push(a,b) Perl_pad_push(aTHX_ a,b) #define pad_swipe(a,b) Perl_pad_swipe(aTHX_ a,b) #define padlist_store(a,b,c) Perl_padlist_store(aTHX_ a,b,c) +#define parse_subsignature() Perl_parse_subsignature(aTHX) #define parse_unicode_opts(a) Perl_parse_unicode_opts(aTHX_ a) #define parser_free(a) Perl_parser_free(aTHX_ a) #define peep(a) Perl_peep(aTHX_ a) @@ -1213,9 +1237,11 @@ #define rsignal_restore(a,b) Perl_rsignal_restore(aTHX_ a,b) #define rsignal_save(a,b,c) Perl_rsignal_save(aTHX_ a,b,c) #define rxres_save(a,b) Perl_rxres_save(aTHX_ a,b) +#define save_strlen(a) Perl_save_strlen(aTHX_ a) #define sawparens(a) Perl_sawparens(aTHX_ a) #define scalar(a) Perl_scalar(aTHX_ a) #define scalarvoid(a) Perl_scalarvoid(aTHX_ a) +#define set_caret_X() Perl_set_caret_X(aTHX) #define sub_crush_depth(a) Perl_sub_crush_depth(aTHX_ a) #define sv_2num(a) Perl_sv_2num(aTHX_ a) #define sv_clean_all() Perl_sv_clean_all(aTHX) @@ -1344,6 +1370,12 @@ #define strip_return(a) S_strip_return(aTHX_ a) # endif # endif +# if defined(PERL_DEBUG_READONLY_COW) +#define sv_buf_to_ro(a) Perl_sv_buf_to_ro(aTHX_ a) +# if defined(PERL_IN_SV_C) +#define sv_buf_to_rw(a) S_sv_buf_to_rw(aTHX_ a) +# endif +# endif # if defined(PERL_IN_AV_C) #define get_aux_mg(a) S_get_aux_mg(aTHX_ a) # endif @@ -1353,6 +1385,8 @@ # if defined(PERL_IN_DOIO_C) #define exec_failed(a,b,c) S_exec_failed(aTHX_ a,b,c) #define ingroup(a,b) S_ingroup(aTHX_ a,b) +#define openn_cleanup(a,b,c,d,e,f,g,h,i,j,k,l) S_openn_cleanup(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l) +#define openn_setup(a,b,c,d,e,f) S_openn_setup(aTHX_ a,b,c,d,e,f) # endif # if defined(PERL_IN_DOOP_C) #define do_trans_complex(a) S_do_trans_complex(aTHX_ a) @@ -1369,8 +1403,13 @@ #define sequence_num(a) S_sequence_num(aTHX_ a) # endif # if defined(PERL_IN_GV_C) +#define find_default_stash(a,b,c,d,e,f) S_find_default_stash(aTHX_ a,b,c,d,e,f) #define gv_init_svtype(a,b) S_gv_init_svtype(aTHX_ a,b) +#define gv_is_in_main(a,b,c) S_gv_is_in_main(aTHX_ a,b,c) +#define gv_magicalize(a,b,c,d,e,f) S_gv_magicalize(aTHX_ a,b,c,d,e,f) #define gv_magicalize_isa(a) S_gv_magicalize_isa(aTHX_ a) +#define maybe_multimagic_gv(a,b,c) S_maybe_multimagic_gv(aTHX_ a,b,c) +#define parse_gv_stash_name(a,b,c,d,e,f,g,h) S_parse_gv_stash_name(aTHX_ a,b,c,d,e,f,g,h) #define require_tie_mod(a,b,c,d,e) S_require_tie_mod(aTHX_ a,b,c,d,e) # endif # if defined(PERL_IN_HV_C) @@ -1378,6 +1417,7 @@ #define hfreeentries(a) S_hfreeentries(aTHX_ a) #define hsplit(a,b,c) S_hsplit(aTHX_ a,b,c) #define hv_auxinit(a) S_hv_auxinit(aTHX_ a) +#define hv_auxinit_internal S_hv_auxinit_internal #define hv_delete_common(a,b,c,d,e,f,g) S_hv_delete_common(aTHX_ a,b,c,d,e,f,g) #define hv_free_ent_ret(a,b) S_hv_free_ent_ret(aTHX_ a,b) #define hv_magic_check S_hv_magic_check @@ -1389,23 +1429,26 @@ #define share_hek_flags(a,b,c,d) S_share_hek_flags(aTHX_ a,b,c,d) #define unshare_hek_or_pvn(a,b,c,d) S_unshare_hek_or_pvn(aTHX_ a,b,c,d) # endif -# if defined(PERL_IN_LOCALE_C) -# if defined(USE_LOCALE_NUMERIC) || defined(USE_LOCALE_COLLATE) +# if defined(PERL_IN_LOCALE_C) && defined(USE_LOCALE) +#define is_cur_LC_category_utf8(a) S_is_cur_LC_category_utf8(aTHX_ a) #define stdize_locale(a) S_stdize_locale(aTHX_ a) -# endif +# endif +# if defined(PERL_IN_MALLOC_C) +#define adjust_size_and_find_bucket S_adjust_size_and_find_bucket # endif # if defined(PERL_IN_MG_C) +#define fixup_errno_string(a) S_fixup_errno_string(aTHX_ a) #define magic_methcall1(a,b,c,d,e,f) S_magic_methcall1(aTHX_ a,b,c,d,e,f) #define magic_methpack(a,b,c) S_magic_methpack(aTHX_ a,b,c) #define restore_magic(a) S_restore_magic(aTHX_ a) -#define save_magic(a,b) S_save_magic(aTHX_ a,b) +#define save_magic_flags(a,b,c) S_save_magic_flags(aTHX_ a,b,c) #define unwind_handler_stack(a) S_unwind_handler_stack(aTHX_ a) # endif # if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C) #define translate_substr_offsets(a,b,c,d,e,f,g) Perl_translate_substr_offsets(aTHX_ a,b,c,d,e,f,g) # endif # if defined(PERL_IN_MRO_C) -#define mro_clean_isarev(a,b,c,d,e) S_mro_clean_isarev(aTHX_ a,b,c,d,e) +#define mro_clean_isarev(a,b,c,d,e,f) S_mro_clean_isarev(aTHX_ a,b,c,d,e,f) #define mro_gather_and_rename(a,b,c,d,e) S_mro_gather_and_rename(aTHX_ a,b,c,d,e) #define mro_get_linear_isa_dfs(a,b) S_mro_get_linear_isa_dfs(aTHX_ a,b) # endif @@ -1416,8 +1459,8 @@ #define aassign_common_vars(a) S_aassign_common_vars(aTHX_ a) #define apply_attrs(a,b,c) S_apply_attrs(aTHX_ a,b,c) #define apply_attrs_my(a,b,c,d) S_apply_attrs_my(aTHX_ a,b,c,d) +#define bad_type_gv(a,b,c,d,e) S_bad_type_gv(aTHX_ a,b,c,d,e) #define bad_type_pv(a,b,c,d,e) S_bad_type_pv(aTHX_ a,b,c,d,e) -#define bad_type_sv(a,b,c,d,e) S_bad_type_sv(aTHX_ a,b,c,d,e) #define cop_free(a) S_cop_free(aTHX_ a) #define dup_attrlist(a) S_dup_attrlist(aTHX_ a) #define finalize_op(a) S_finalize_op(aTHX_ a) @@ -1433,12 +1476,14 @@ #define listkids(a) S_listkids(aTHX_ a) #define looks_like_bool(a) S_looks_like_bool(aTHX_ a) #define modkids(a,b) S_modkids(aTHX_ a,b) +#define move_proto_attr(a,b,c) S_move_proto_attr(aTHX_ a,b,c) #define my_kid(a,b,c) S_my_kid(aTHX_ a,b,c) #define newDEFSVOP() S_newDEFSVOP(aTHX) #define newGIVWHENOP(a,b,c,d,e) S_newGIVWHENOP(aTHX_ a,b,c,d,e) #define new_logop(a,b,c,d) S_new_logop(aTHX_ a,b,c,d) #define no_bareword_allowed(a) S_no_bareword_allowed(aTHX_ a) #define no_fh_allowed(a) S_no_fh_allowed(aTHX_ a) +#define null_listop_in_list_context(a) S_null_listop_in_list_context(aTHX_ a) #define op_integerize(a) S_op_integerize(aTHX_ a) #define op_std_init(a) S_op_std_init(aTHX_ a) #define pmtrans(a,b,c) S_pmtrans(aTHX_ a,b,c) @@ -1491,7 +1536,7 @@ #define refto(a) S_refto(aTHX_ a) # endif # if defined(PERL_IN_PP_CTL_C) -#define adjust_stack_on_leave(a,b,c,d,e) S_adjust_stack_on_leave(aTHX_ a,b,c,d,e) +#define adjust_stack_on_leave(a,b,c,d,e,f) S_adjust_stack_on_leave(aTHX_ a,b,c,d,e,f) #define check_type_and_open(a) S_check_type_and_open(aTHX_ a) #define destroy_matcher(a) S_destroy_matcher(aTHX_ a) #define do_smartmatch(a,b,c) S_do_smartmatch(aTHX_ a,b,c) @@ -1508,7 +1553,7 @@ #define make_matcher(a) S_make_matcher(aTHX_ a) #define matcher_matches_sv(a,b) S_matcher_matches_sv(aTHX_ a,b) #define num_overflow S_num_overflow -#define path_is_absolute S_path_is_absolute +#define path_is_searchable S_path_is_searchable #define run_user_filter(a,b,c) S_run_user_filter(aTHX_ a,b,c) #define rxres_free(a) S_rxres_free(aTHX_ a) #define rxres_restore(a,b) S_rxres_restore(aTHX_ a,b) @@ -1603,7 +1648,7 @@ #define force_next(a) S_force_next(aTHX_ a) #define force_strict_version(a) S_force_strict_version(aTHX_ a) #define force_version(a,b) S_force_version(aTHX_ a,b) -#define force_word(a,b,c,d,e) S_force_word(aTHX_ a,b,c,d,e) +#define force_word(a,b,c,d) S_force_word(aTHX_ a,b,c,d) #define get_and_check_backslash_N_name(a,b) S_get_and_check_backslash_N_name(aTHX_ a,b) #define incline(a) S_incline(aTHX_ a) #define intuit_method(a,b,c) S_intuit_method(aTHX_ a,b,c) @@ -1613,18 +1658,17 @@ #define no_op(a,b) S_no_op(aTHX_ a,b) #define parse_ident(a,b,c,d,e) S_parse_ident(aTHX_ a,b,c,d,e) #define pending_ident() S_pending_ident(aTHX) -#define readpipe_override() S_readpipe_override(aTHX) #define scan_const(a) S_scan_const(aTHX_ a) #define scan_formline(a) S_scan_formline(aTHX_ a) #define scan_heredoc(a) S_scan_heredoc(aTHX_ a) -#define scan_ident(a,b,c,d,e) S_scan_ident(aTHX_ a,b,c,d,e) +#define scan_ident(a,b,c,d) S_scan_ident(aTHX_ a,b,c,d) #define scan_inputsymbol(a) S_scan_inputsymbol(aTHX_ a) #define scan_pat(a,b) S_scan_pat(aTHX_ a,b) -#define scan_str(a,b,c,d,e) S_scan_str(aTHX_ a,b,c,d,e) +#define scan_str(a,b,c,d,e,f) S_scan_str(aTHX_ a,b,c,d,e,f) #define scan_subst(a) S_scan_subst(aTHX_ a) #define scan_trans(a) S_scan_trans(aTHX_ a) #define scan_word(a,b,c,d,e) S_scan_word(aTHX_ a,b,c,d,e) -#define skipspace(a) S_skipspace(aTHX_ a) +#define skipspace_flags(a,b) S_skipspace_flags(aTHX_ a,b) #define sublex_done() S_sublex_done(aTHX) #define sublex_push() S_sublex_push(aTHX) #define sublex_start() S_sublex_start(aTHX) @@ -1647,7 +1691,7 @@ # if defined(PERL_IN_UTF8_C) #define check_locale_boundary_crossing(a,b,c,d) S_check_locale_boundary_crossing(aTHX_ a,b,c,d) #define is_utf8_char_slow S_is_utf8_char_slow -#define is_utf8_common(a,b,c) S_is_utf8_common(aTHX_ a,b,c) +#define is_utf8_common(a,b,c,d) S_is_utf8_common(aTHX_ a,b,c,d) #define swatch_get(a,b,c) S_swatch_get(aTHX_ a,b,c) #define to_lower_latin1(a,b,c) S_to_lower_latin1(aTHX_ a,b,c) # endif @@ -1656,7 +1700,6 @@ # endif # if defined(PERL_IN_UTIL_C) #define ckwarn_common(a) S_ckwarn_common(aTHX_ a) -#define closest_cop(a,b) S_closest_cop(aTHX_ a,b) #define invoke_exception_hook(a,b) S_invoke_exception_hook(aTHX_ a,b) #define mess_alloc() S_mess_alloc(aTHX) #define with_queued_errors(a) S_with_queued_errors(aTHX_ a) @@ -1702,78 +1745,6 @@ #define xmldump_sub_perl(a,b) Perl_xmldump_sub_perl(aTHX_ a,b) #define xmldump_vindent(a,b,c,d) Perl_xmldump_vindent(aTHX_ a,b,c,d) # endif -# if defined(PERL_NEED_MY_BETOH16) -#define my_betoh16 Perl_my_betoh16 -# endif -# if defined(PERL_NEED_MY_BETOH32) -#define my_betoh32 Perl_my_betoh32 -# endif -# if defined(PERL_NEED_MY_BETOH64) -#define my_betoh64 Perl_my_betoh64 -# endif -# if defined(PERL_NEED_MY_BETOHI) -#define my_betohi Perl_my_betohi -# endif -# if defined(PERL_NEED_MY_BETOHL) -#define my_betohl Perl_my_betohl -# endif -# if defined(PERL_NEED_MY_BETOHS) -#define my_betohs Perl_my_betohs -# endif -# if defined(PERL_NEED_MY_HTOBE16) -#define my_htobe16 Perl_my_htobe16 -# endif -# if defined(PERL_NEED_MY_HTOBE32) -#define my_htobe32 Perl_my_htobe32 -# endif -# if defined(PERL_NEED_MY_HTOBE64) -#define my_htobe64 Perl_my_htobe64 -# endif -# if defined(PERL_NEED_MY_HTOBEI) -#define my_htobei Perl_my_htobei -# endif -# if defined(PERL_NEED_MY_HTOBEL) -#define my_htobel Perl_my_htobel -# endif -# if defined(PERL_NEED_MY_HTOBES) -#define my_htobes Perl_my_htobes -# endif -# if defined(PERL_NEED_MY_HTOLE16) -#define my_htole16 Perl_my_htole16 -# endif -# if defined(PERL_NEED_MY_HTOLE32) -#define my_htole32 Perl_my_htole32 -# endif -# if defined(PERL_NEED_MY_HTOLE64) -#define my_htole64 Perl_my_htole64 -# endif -# if defined(PERL_NEED_MY_HTOLEI) -#define my_htolei Perl_my_htolei -# endif -# if defined(PERL_NEED_MY_HTOLEL) -#define my_htolel Perl_my_htolel -# endif -# if defined(PERL_NEED_MY_HTOLES) -#define my_htoles Perl_my_htoles -# endif -# if defined(PERL_NEED_MY_LETOH16) -#define my_letoh16 Perl_my_letoh16 -# endif -# if defined(PERL_NEED_MY_LETOH32) -#define my_letoh32 Perl_my_letoh32 -# endif -# if defined(PERL_NEED_MY_LETOH64) -#define my_letoh64 Perl_my_letoh64 -# endif -# if defined(PERL_NEED_MY_LETOHI) -#define my_letohi Perl_my_letohi -# endif -# if defined(PERL_NEED_MY_LETOHL) -#define my_letohl Perl_my_letohl -# endif -# if defined(PERL_NEED_MY_LETOHS) -#define my_letohs Perl_my_letohs -# endif # if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C) #define pidgone(a,b) S_pidgone(aTHX_ a,b) # endif diff --git a/Master/tlpkg/tlperl/lib/CORE/embedvar.h b/Master/tlpkg/tlperl/lib/CORE/embedvar.h index e689c5e4fbd..5ae8d051b17 100644 --- a/Master/tlpkg/tlperl/lib/CORE/embedvar.h +++ b/Master/tlpkg/tlperl/lib/CORE/embedvar.h @@ -40,7 +40,6 @@ # define vTHX PERL_GET_INTERP # endif -#define PL_ASCII (vTHX->IASCII) #define PL_AboveLatin1 (vTHX->IAboveLatin1) #define PL_Argv (vTHX->IArgv) #define PL_Cmd (vTHX->ICmd) @@ -54,7 +53,6 @@ #define PL_Dir (vTHX->IDir) #define PL_Env (vTHX->IEnv) #define PL_HasMultiCharFold (vTHX->IHasMultiCharFold) -#define PL_L1Posix_ptrs (vTHX->IL1Posix_ptrs) #define PL_LIO (vTHX->ILIO) #define PL_Latin1 (vTHX->ILatin1) #define PL_Mem (vTHX->IMem) @@ -66,6 +64,7 @@ #define PL_Sock (vTHX->ISock) #define PL_StdIO (vTHX->IStdIO) #define PL_Sv (vTHX->ISv) +#define PL_UpperLatin1 (vTHX->IUpperLatin1) #define PL_XPosix_ptrs (vTHX->IXPosix_ptrs) #define PL_Xpv (vTHX->IXpv) #define PL_an (vTHX->Ian) @@ -157,12 +156,12 @@ #define PL_hash_rand_bits (vTHX->Ihash_rand_bits) #define PL_hash_rand_bits_enabled (vTHX->Ihash_rand_bits_enabled) #define PL_hintgv (vTHX->Ihintgv) -#define PL_hints (vTHX->Ihints) #define PL_hv_fetch_ent_mh (vTHX->Ihv_fetch_ent_mh) #define PL_in_clean_all (vTHX->Iin_clean_all) #define PL_in_clean_objs (vTHX->Iin_clean_objs) #define PL_in_eval (vTHX->Iin_eval) #define PL_in_load_module (vTHX->Iin_load_module) +#define PL_in_utf8_CTYPE_locale (vTHX->Iin_utf8_CTYPE_locale) #define PL_incgv (vTHX->Iincgv) #define PL_initav (vTHX->Iinitav) #define PL_inplace (vTHX->Iinplace) @@ -216,9 +215,9 @@ #define PL_ofsgv (vTHX->Iofsgv) #define PL_oldname (vTHX->Ioldname) #define PL_op (vTHX->Iop) +#define PL_op_exec_cnt (vTHX->Iop_exec_cnt) #define PL_op_mask (vTHX->Iop_mask) #define PL_opfreehook (vTHX->Iopfreehook) -#define PL_opsave (vTHX->Iopsave) #define PL_origalen (vTHX->Iorigalen) #define PL_origargc (vTHX->Iorigargc) #define PL_origargv (vTHX->Iorigargv) @@ -243,10 +242,10 @@ #define PL_psig_pend (vTHX->Ipsig_pend) #define PL_psig_ptr (vTHX->Ipsig_ptr) #define PL_ptr_table (vTHX->Iptr_table) +#define PL_random_state (vTHX->Irandom_state) #define PL_reentrant_buffer (vTHX->Ireentrant_buffer) #define PL_reentrant_retint (vTHX->Ireentrant_retint) -#define PL_reg_state (vTHX->Ireg_state) -#define PL_regdummy (vTHX->Iregdummy) +#define PL_reg_curpm (vTHX->Ireg_curpm) #define PL_regex_pad (vTHX->Iregex_pad) #define PL_regex_padav (vTHX->Iregex_padav) #define PL_registered_mros (vTHX->Iregistered_mros) @@ -302,6 +301,7 @@ #define PL_subline (vTHX->Isubline) #define PL_subname (vTHX->Isubname) #define PL_sv_arenaroot (vTHX->Isv_arenaroot) +#define PL_sv_consts (vTHX->Isv_consts) #define PL_sv_count (vTHX->Isv_count) #define PL_sv_no (vTHX->Isv_no) #define PL_sv_objcount (vTHX->Isv_objcount) diff --git a/Master/tlpkg/tlperl/lib/CORE/fakethr.h b/Master/tlpkg/tlperl/lib/CORE/fakethr.h deleted file mode 100644 index 643806de26f..00000000000 --- a/Master/tlpkg/tlperl/lib/CORE/fakethr.h +++ /dev/null @@ -1,75 +0,0 @@ -/* fakethr.h - * - * Copyright (C) 1999, 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. - * - */ - -typedef int perl_mutex; -typedef int perl_key; - -typedef struct perl_thread *perl_os_thread; -/* With fake threads, thr is global(ish) so we don't need dTHR */ -#define dTHR extern int errno - -struct perl_wait_queue { - struct perl_thread * thread; - struct perl_wait_queue * next; -}; -typedef struct perl_wait_queue *perl_cond; - -/* Ask thread.h to include our per-thread extras */ -#define HAVE_THREAD_INTERN -struct thread_intern { - perl_os_thread next_run, prev_run; /* Linked list of runnable threads */ - perl_cond wait_queue; /* Wait queue that we are waiting on */ - IV private; /* Holds data across time slices */ - I32 savemark; /* Holds MARK for thread join values */ -}; - -#define init_thread_intern(t) \ - STMT_START { \ - t->self = (t); \ - (t)->i.next_run = (t)->i.prev_run = (t); \ - (t)->i.wait_queue = 0; \ - (t)->i.private = 0; \ - } STMT_END - -/* - * Note that SCHEDULE() is only callable from pp code (which - * must be expecting to be restarted). We'll have to do - * something a bit different for XS code. - */ - -#define SCHEDULE() return schedule(), PL_op - -#define MUTEX_LOCK(m) -#define MUTEX_UNLOCK(m) -#define MUTEX_INIT(m) -#define MUTEX_DESTROY(m) -#define COND_INIT(c) perl_cond_init(c) -#define COND_SIGNAL(c) perl_cond_signal(c) -#define COND_BROADCAST(c) perl_cond_broadcast(c) -#define COND_WAIT(c, m) \ - STMT_START { \ - perl_cond_wait(c); \ - SCHEDULE(); \ - } STMT_END -#define COND_DESTROY(c) - -#define THREAD_CREATE(t, f) f((t)) -#define THREAD_POST_CREATE(t) NOOP - -#define YIELD NOOP - -/* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - * - * ex: set ts=8 sts=4 sw=4 et: - */ diff --git a/Master/tlpkg/tlperl/lib/CORE/feature.h b/Master/tlpkg/tlperl/lib/CORE/feature.h index 215a4d50465..698302c43f8 100644 --- a/Master/tlpkg/tlperl/lib/CORE/feature.h +++ b/Master/tlpkg/tlperl/lib/CORE/feature.h @@ -27,7 +27,7 @@ & HINT_LOCALIZE_HH) \ ? Perl_feature_is_enabled(aTHX_ STR_WITH_LEN(name)) : FALSE) /* The longest string we pass in. */ -#define MAX_FEATURE_LEN (sizeof("evalbytes")-1) +#define MAX_FEATURE_LEN (sizeof("postderef_qq")-1) #define FEATURE_FC_IS_ENABLED \ ( \ @@ -67,6 +67,12 @@ FEATURE_IS_ENABLED("evalbytes")) \ ) +#define FEATURE_POSTDEREF_IS_ENABLED \ + ( \ + CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ + FEATURE_IS_ENABLED("postderef") \ + ) + #define FEATURE_ARYBASE_IS_ENABLED \ ( \ CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_511 \ @@ -74,6 +80,12 @@ FEATURE_IS_ENABLED("arybase")) \ ) +#define FEATURE_SIGNATURES_IS_ENABLED \ + ( \ + CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ + FEATURE_IS_ENABLED("signatures") \ + ) + #define FEATURE___SUB___IS_ENABLED \ ( \ CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_515 \ @@ -87,6 +99,12 @@ FEATURE_IS_ENABLED("lexsubs") \ ) +#define FEATURE_POSTDEREF_QQ_IS_ENABLED \ + ( \ + CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ + FEATURE_IS_ENABLED("postderef_qq") \ + ) + #define FEATURE_UNIEVAL_IS_ENABLED \ ( \ CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_515 \ diff --git a/Master/tlpkg/tlperl/lib/CORE/gv.h b/Master/tlpkg/tlperl/lib/CORE/gv.h index 1e17f35d463..d7ca92fb58c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/gv.h +++ b/Master/tlpkg/tlperl/lib/CORE/gv.h @@ -141,8 +141,9 @@ Return the CV from the GV. #define GvLINE(gv) (GvGP(gv)->gp_line) #define GvFILE_HEK(gv) (GvGP(gv)->gp_file_hek) -#define GvFILE(gv) (GvFILE_HEK(gv) ? HEK_KEY(GvFILE_HEK(gv)) : NULL) -#define GvFILEGV(gv) (gv_fetchfile(GvFILE(gv))) +#define GvFILEx(gv) HEK_KEY(GvFILE_HEK(gv)) +#define GvFILE(gv) (GvFILE_HEK(gv) ? GvFILEx(gv) : NULL) +#define GvFILEGV(gv) (GvFILE_HEK(gv) ? gv_fetchfile(GvFILEx(gv)) : NULL) #define GvEGV(gv) (GvGP(gv)->gp_egv) #define GvEGVx(gv) (isGV_with_GP(gv) ? GvEGV(gv) : NULL) diff --git a/Master/tlpkg/tlperl/lib/CORE/handy.h b/Master/tlpkg/tlperl/lib/CORE/handy.h index 582cea638c9..8e79a15e431 100644 --- a/Master/tlpkg/tlperl/lib/CORE/handy.h +++ b/Master/tlpkg/tlperl/lib/CORE/handy.h @@ -8,6 +8,9 @@ * */ +/* IMPORTANT NOTE: Everything whose name begins with an underscore is for + * internal core Perl use only. */ + #ifndef HANDY_H /* Guard against nested #inclusion */ #define HANDY_H @@ -25,10 +28,11 @@ =head1 Handy Values =for apidoc AmU||Nullch -Null character pointer. (No longer available when C is defined.) +Null character pointer. (No longer available when C is +defined.) =for apidoc AmU||Nullsv -Null SV pointer. (No longer available when C is defined.) +Null SV pointer. (No longer available when C is defined.) =cut */ @@ -69,7 +73,7 @@ Null SV pointer. (No longer available when C is defined.) #define MUTABLE_IO(p) ((IO *)MUTABLE_PTR(p)) #define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) -#ifdef I_STDBOOL +#if defined(I_STDBOOL) && !defined(PERL_BOOL_AS_CHAR) # include # ifndef HAS_BOOL # define HAS_BOOL 1 @@ -85,9 +89,11 @@ Null SV pointer. (No longer available when C is defined.) Andy Dougherty February 2000 */ #ifdef __GNUG__ /* GNU g++ has bool built-in */ +# ifndef PERL_BOOL_AS_CHAR # ifndef HAS_BOOL # define HAS_BOOL 1 # endif +# endif #endif /* The NeXT dynamic loader headers will not build with the bool macro @@ -104,19 +110,17 @@ Null SV pointer. (No longer available when C is defined.) #endif /* NeXT || __NeXT__ */ #ifndef HAS_BOOL -# if defined(VMS) -# define bool int -# else -# define bool char +# ifdef bool +# undef bool # endif +# define bool char # define HAS_BOOL 1 #endif -/* a simple (bool) cast may not do the right thing: if bool is defined - * as char for example, then the cast from int is implementation-defined - * (bool)!!(cbool) in a ternary triggers a bug in xlc on AIX - */ - +/* cast-to-bool. A simple (bool) cast may not do the right thing: if bool is + * defined as char for example, then the cast from int is + * implementation-defined (bool)!!(cbool) in a ternary triggers a bug in xlc on + * AIX */ #define cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0) /* Try to figure out __func__ or __FUNCTION__ equivalent, if any. @@ -126,7 +130,7 @@ Null SV pointer. (No longer available when C is defined.) #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__SUNPRO_C)) /* C99 or close enough. */ # define FUNCTION__ __func__ #else -# if (defined(_MSC_VER) && _MSC_VER < 1300) || /* MSVC6 has neither __func__ nor __FUNCTION and no good workarounds, either. */ \ +# if (defined(USING_MSVC6)) || /* MSVC6 has neither __func__ nor __FUNCTION and no good workarounds, either. */ \ (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tur64, -c99 not known, only -std1). */ # define FUNCTION__ "" # else @@ -269,23 +273,34 @@ typedef U64TYPE U64; #define Ctl(ch) ((ch) & 037) +/* This is a helper macro to avoid preprocessor issues, replaced by nothing + * unless under DEBUGGING, where it expands to an assert of its argument, + * followed by a comma (hence the comma operator). If we just used a straight + * assert(), we would get a comma with nothing before it when not DEBUGGING */ +#ifdef DEBUGGING +# define __ASSERT_(statement) assert(statement), +#else +# define __ASSERT_(statement) +#endif + /* =head1 SV-Body Allocation =for apidoc Ama|SV*|newSVpvs|const char* s -Like C, but takes a literal string instead of a string/length pair. +Like C, but takes a literal C-terminated string instead of a +string/length pair. =for apidoc Ama|SV*|newSVpvs_flags|const char* s|U32 flags -Like C, but takes a literal string instead of a string/length -pair. +Like C, but takes a literal C-terminated string instead of +a string/length pair. =for apidoc Ama|SV*|newSVpvs_share|const char* s -Like C, but takes a literal string instead of a string/length -pair and omits the hash parameter. +Like C, but takes a literal C-terminated string instead of +a string/length pair and omits the hash parameter. =for apidoc Am|void|sv_catpvs_flags|SV* sv|const char* s|I32 flags -Like C, but takes a literal string instead of a -string/length pair. +Like C, but takes a literal C-terminated string instead +of a string/length pair. =for apidoc Am|void|sv_catpvs_nomg|SV* sv|const char* s Like C, but takes a literal string instead of a @@ -312,7 +327,8 @@ string/length pair. =head1 Memory Management =for apidoc Ama|char*|savepvs|const char* s -Like C, but takes a literal string instead of a string/length pair. +Like C, but takes a literal C-terminated string instead of a +string/length pair. =for apidoc Ama|char*|savesharedpvs|const char* s A version of C which allocates the duplicate string in memory @@ -420,12 +436,12 @@ the second, C. Returns true or false. =for apidoc Am|bool|strnNE|char* s1|char* s2|STRLEN len Test two strings to see if they are different. The C parameter -indicates the number of bytes to compare. Returns true or false. (A +indicates the number of bytes to compare. Returns true or false. (A wrapper for C). =for apidoc Am|bool|strnEQ|char* s1|char* s2|STRLEN len Test two strings to see if they are equal. The C parameter indicates -the number of bytes to compare. Returns true or false. (A wrapper for +the number of bytes to compare. Returns true or false. (A wrapper for C). =cut @@ -496,7 +512,7 @@ onto the platform. That is, the code points that are ASCII are unaffected, since ASCII is a subset of Latin-1. But the non-ASCII code points are treated as if they are Latin-1 characters. For example, C will return true when called with the code point 0xDF, which is a word character in both -ASCII and EBCDIC (though it represent different characters in each). +ASCII and EBCDIC (though it represents different characters in each). Variant C is like the C variant, but accepts any UV code point as input. If the code point is larger than 255, Unicode rules are used @@ -509,12 +525,13 @@ Variant C is like C, but the input is a pointer to a classification of just the first (possibly multi-byte) character in the string is tested. -Variant C is like the C and C variants, but uses -the C library function that gives the named classification instead of -hard-coded rules. For example, C returns the result of calling -C. This means that the result is based on the current locale, which -is what C in the name stands for. FALSE is always returned if the input -won't fit into an octet. +Variant C is like the C and C variants, but the +result is based on the current locale, which is what C in the name stands +for. If Perl can determine that the current locale is a UTF-8 locale, it uses +the published Unicode rules; otherwise, it uses the C library function that +gives the named classification. For example, C when not in a +UTF-8 locale returns the result of calling C. FALSE is always +returned if the input won't fit into an octet. Variant C is like C, but is defined on any UV. It returns the same as C for input code points less than 256, and @@ -552,6 +569,12 @@ C. Note, however, that some platforms do not have the C library routine C. In these cases, the variants whose names contain C are the same as the corresponding ones without. +Also note, that because all ASCII characters are UTF-8 invariant (meaning they +have the exact same representation (always a single byte) whether encoded in +UTF-8 or not), C will give the correct results when called with any +byte in any string encoded or not in UTF-8. And similarly C will +work properly on any string encoded or not in UTF-8. + =for apidoc Am|bool|isBLANK|char ch Returns a boolean indicating whether the specified character is a character considered to be a blank, analogous to C. @@ -613,7 +636,7 @@ Returns a boolean indicating whether the specified character is a whitespace character. This is analogous to what C matches in a regular expression. Starting in Perl 5.18 (experimentally), this also matches what C does. -("Experimentally" means that this change may be backed out in 5.20 or 5.22 if +("Experimentally" means that this change may be backed out in 5.22 if field experience indicates that it was unwise.) Prior to 5.18, only the locale forms of this macro (the ones with C in their names) matched precisely what C does. In those releases, the only difference, @@ -627,7 +650,7 @@ C, and C. (short for Posix Space) Starting in 5.18, this is identical (experimentally) in all its forms to the corresponding C macros. ("Experimentally" means that this change -may be backed out in 5.20 or 5.22 if field experience indicates that it +may be backed out in 5.22 if field experience indicates that it was unwise.) The locale forms of this macro are identical to their corresponding C forms in all Perl releases. In releases prior to 5.18, the @@ -701,17 +724,125 @@ Behaviour is only well defined when isXDIGIT(*str) is true. =head1 Character case changing -=for apidoc Am|char|toUPPER|char ch -Converts the specified character to uppercase, if possible; otherwise returns -the input character itself. +=for apidoc Am|U8|toUPPER|U8 ch +Converts the specified character to uppercase. If the input is anything but an +ASCII lowercase character, that input character itself is returned. Variant +C is equivalent. + +=for apidoc Am|UV|toUPPER_uni|UV cp|U8* s|STRLEN* lenp +Converts the Unicode code point C to its uppercase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the uppercase version may be longer than the original character. + +The first code point of the uppercased version is returned +(but note, as explained just above, that there may be more.) + +=for apidoc Am|UV|toUPPER_utf8|U8* p|U8* s|STRLEN* lenp +Converts the UTF-8 encoded character at C

to its uppercase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the uppercase version may be longer than the original character. + +The first code point of the uppercased version is returned +(but note, as explained just above, that there may be more.) + +The input character at C

is assumed to be well-formed. + +=for apidoc Am|U8|toFOLD|U8 ch +Converts the specified character to foldcase. If the input is anything but an +ASCII uppercase character, that input character itself is returned. Variant +C is equivalent. (There is no equivalent C for the full +Latin1 range, as the full generality of L is needed there.) + +=for apidoc Am|UV|toFOLD_uni|UV cp|U8* s|STRLEN* lenp +Converts the Unicode code point C to its foldcase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the foldcase version may be longer than the original character. + +The first code point of the foldcased version is returned +(but note, as explained just above, that there may be more.) + +=for apidoc Am|UV|toFOLD_utf8|U8* p|U8* s|STRLEN* lenp +Converts the UTF-8 encoded character at C

to its foldcase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the foldcase version may be longer than the original character. + +The first code point of the foldcased version is returned +(but note, as explained just above, that there may be more.) + +The input character at C

is assumed to be well-formed. + +=for apidoc Am|U8|toLOWER|U8 ch +Converts the specified character to lowercase. If the input is anything but an +ASCII uppercase character, that input character itself is returned. Variant +C is equivalent. + +=for apidoc Am|U8|toLOWER_L1|U8 ch +Converts the specified Latin1 character to lowercase. The results are undefined if +the input doesn't fit in a byte. + +=for apidoc Am|U8|toLOWER_LC|U8 ch +Converts the specified character to lowercase using the current locale's rules, +if possible; otherwise returns the input character itself. + +=for apidoc Am|UV|toLOWER_uni|UV cp|U8* s|STRLEN* lenp +Converts the Unicode code point C to its lowercase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the lowercase version may be longer than the original character. + +The first code point of the lowercased version is returned +(but note, as explained just above, that there may be more.) + +=for apidoc Am|UV|toLOWER_utf8|U8* p|U8* s|STRLEN* lenp +Converts the UTF-8 encoded character at C

to its lowercase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the lowercase version may be longer than the original character. + +The first code point of the lowercased version is returned +(but note, as explained just above, that there may be more.) + +The input character at C

is assumed to be well-formed. + +=for apidoc Am|U8|toLOWER_LC|U8 ch +Converts the specified character to lowercase using the current locale's rules, +if possible; otherwise returns the input character itself. + +=for apidoc Am|U8|toTITLE|U8 ch +Converts the specified character to titlecase. If the input is anything but an +ASCII lowercase character, that input character itself is returned. Variant +C is equivalent. (There is no C for the full Latin1 range, +as the full generality of L is needed there. Titlecase is not a +concept used in locale handling, so there is no functionality for that.) + +=for apidoc Am|UV|toTITLE_uni|UV cp|U8* s|STRLEN* lenp +Converts the Unicode code point C to its titlecase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the titlecase version may be longer than the original character. + +The first code point of the titlecased version is returned +(but note, as explained just above, that there may be more.) + +=for apidoc Am|UV|toTITLE_utf8|U8* p|U8* s|STRLEN* lenp +Converts the UTF-8 encoded character at C

to its titlecase version, and +stores that in UTF-8 in C, and its length in bytes in C. Note +that the buffer pointed to by C needs to be at least C +bytes since the titlecase version may be longer than the original character. -=for apidoc Am|char|toLOWER|char ch -Converts the specified character to lowercase, if possible; otherwise returns -the input character itself. +The first code point of the titlecased version is returned +(but note, as explained just above, that there may be more.) + +The input character at C

is assumed to be well-formed. =cut -XXX Still undocumented isVERTWS_uni and _utf8, and the other toUPPER etc functions +XXX Still undocumented isVERTWS_uni and _utf8; it's unclear what their names +really should be. Also toUPPER_LC and toFOLD_LC, which are subject to change. Note that these macros are repeated in Devel::PPPort, so should also be patched there. The file as of this writing is cpan/Devel-PPPort/parts/inc/misc @@ -737,7 +868,15 @@ patched there. The file as of this writing is cpan/Devel-PPPort/parts/inc/misc #define FITS_IN_8_BITS(c) ((sizeof(c) == 1) || !(((WIDEST_UTYPE)(c)) & ~0xFF)) #ifdef EBCDIC -# define isASCII(c) (FITS_IN_8_BITS(c) && (NATIVE_TO_UNI((U8) (c)) < 128)) +# ifndef _ALL_SOURCE + /* This returns the wrong results on at least z/OS unless this is + * defined. */ +# error _ALL_SOURCE should probably be defined +# endif + + /* We could be called without perl.h, in which case NATIVE_TO_ASCII() is + * likely not defined, and so we use the native function */ +# define isASCII(c) cBOOL(isascii(c)) #else # define isASCII(c) ((WIDEST_UTYPE)(c) < 128) #endif @@ -795,7 +934,8 @@ patched there. The file as of this writing is cpan/Devel-PPPort/parts/inc/misc # define _HIGHEST_REGCOMP_DOT_H_SYNC _CC_VERTSPACE /* The members of the third group below do not need to be coordinated with data - * structures in regcomp.[ch] and regexec.c */ + * structures in regcomp.[ch] and regexec.c. But they should be added to + * bootstrap_ctype() */ # define _CC_IDFIRST 17 # define _CC_CHARNAME_CONT 18 # define _CC_NONLATIN1_FOLD 19 @@ -872,20 +1012,27 @@ EXTCONST U32 PL_charclass[] = { # else /* ! DOINIT */ EXTCONST U32 PL_charclass[]; # endif +#endif /* Has perl.h */ + +#if defined(H_PERL) && ! defined(BOOTSTRAP_CHARSET) /* The 1U keeps Solaris from griping when shifting sets the uppermost bit */ # define _CC_mask(classnum) (1U << (classnum)) + + /* For internal core Perl use only: the base macro for defining macros like + * isALPHA */ # define _generic_isCC(c, classnum) cBOOL(FITS_IN_8_BITS(c) \ - && (PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_mask(classnum))) + && (PL_charclass[(U8) (c)] & _CC_mask(classnum))) /* The mask for the _A versions of the macros; it just adds in the bit for * ASCII. */ # define _CC_mask_A(classnum) (_CC_mask(classnum) | _CC_mask(_CC_ASCII)) - /* The _A version makes sure that both the desired bit and the ASCII bit - * are present */ -# define _generic_isCC_A(c, classnum) (FITS_IN_8_BITS(c) \ - && ((PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_mask_A(classnum)) \ + /* For internal core Perl use only: the base macro for defining macros like + * isALPHA_A. The foo_A version makes sure that both the desired bit and + * the ASCII bit are present */ +# define _generic_isCC_A(c, classnum) (FITS_IN_8_BITS(c) \ + && ((PL_charclass[(U8) (c)] & _CC_mask_A(classnum)) \ == _CC_mask_A(classnum))) # define isALPHA_A(c) _generic_isCC_A(c, _CC_ALPHA) @@ -902,231 +1049,341 @@ EXTCONST U32 PL_charclass[]; # define isUPPER_A(c) _generic_isCC_A(c, _CC_UPPER) # define isWORDCHAR_A(c) _generic_isCC_A(c, _CC_WORDCHAR) # define isXDIGIT_A(c) _generic_isCC(c, _CC_XDIGIT) -# define isIDFIRST_A(c) _generic_isCC_A(c, ( _CC_IDFIRST)) +# define isIDFIRST_A(c) _generic_isCC_A(c, _CC_IDFIRST) +# define isALPHA_L1(c) _generic_isCC(c, _CC_ALPHA) +# define isALPHANUMERIC_L1(c) _generic_isCC(c, _CC_ALPHANUMERIC) +# define isBLANK_L1(c) _generic_isCC(c, _CC_BLANK) + + /* continuation character for legal NAME in \N{NAME} */ +# define isCHARNAME_CONT(c) _generic_isCC(c, _CC_CHARNAME_CONT) + +# define isCNTRL_L1(c) _generic_isCC(c, _CC_CNTRL) +# define isGRAPH_L1(c) _generic_isCC(c, _CC_GRAPH) +# define isLOWER_L1(c) _generic_isCC(c, _CC_LOWER) +# define isPRINT_L1(c) _generic_isCC(c, _CC_PRINT) +# define isPSXSPC_L1(c) _generic_isCC(c, _CC_PSXSPC) +# define isPUNCT_L1(c) _generic_isCC(c, _CC_PUNCT) +# define isSPACE_L1(c) _generic_isCC(c, _CC_SPACE) +# define isUPPER_L1(c) _generic_isCC(c, _CC_UPPER) +# define isWORDCHAR_L1(c) _generic_isCC(c, _CC_WORDCHAR) +# define isIDFIRST_L1(c) _generic_isCC(c, _CC_IDFIRST) /* Either participates in a fold with a character above 255, or is a * multi-char fold */ -# define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) ((! cBOOL(FITS_IN_8_BITS(c))) || (PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_mask(_CC_NONLATIN1_FOLD))) +# define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) ((! cBOOL(FITS_IN_8_BITS(c))) || (PL_charclass[(U8) (c)] & _CC_mask(_CC_NONLATIN1_FOLD))) # define _isQUOTEMETA(c) _generic_isCC(c, _CC_QUOTEMETA) # define _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) \ _generic_isCC(c, _CC_NON_FINAL_FOLD) # define _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) \ _generic_isCC(c, _CC_IS_IN_SOME_FOLD) -#else /* No perl.h. */ +#else /* Either don't have perl.h or don't want to use char_class_tab.h */ + + /* If we don't have perl.h, we are compiling a utility program. Below we + * hard-code various macro definitions that wouldn't otherwise be available + * to it. We can also get here if we are configured to bootstrap up Perl + * on a non-ASCII platform that doesn't have a working Perl (currently only + * EBCDIC). For these we currently use the native definitions to get + * things going. (It should also be possible to use the translation + * function NATIVE_TO_LATIN1(), but that is an extra layer of dependence on + * Perl, so it is currently avoided for the macros where it's possible to + * do so.) */ # ifdef EBCDIC -# define isALPHA_A(c) (isASCII(c) && isALPHA(c)) -# define isALPHANUMERIC_A(c) (isASCII(c) && isALPHANUMERIC(c)) -# define isBLANK_A(c) (isASCII(c) && isBLANK(c)) -# define isCNTRL_A(c) (isASCII(c) && isCNTRL(c)) -# define isDIGIT_A(c) (isASCII(c) && isDIGIT(c)) -# define isGRAPH_A(c) (isASCII(c) && isGRAPH(c)) -# define isIDFIRST_A(c) (isASCII(c) && isIDFIRST(c)) -# define isLOWER_A(c) (isASCII(c) && isLOWER(c)) -# define isPRINT_A(c) (isASCII(c) && isPRINT(c)) -# define isPSXSPC_A(c) (isASCII(c) && isPSXSPC(c)) -# define isPUNCT_A(c) (isASCII(c) && isPUNCT(c)) -# define isSPACE_A(c) (isASCII(c) && isSPACE(c)) -# define isUPPER_A(c) (isASCII(c) && isUPPER(c)) -# define isWORDCHAR_A(c) (isASCII(c) && isWORDCHAR(c)) -# define isXDIGIT_A(c) (isASCII(c) && isXDIGIT(c)) -# else /* ASCII platform, no perl.h */ + /* Use the native functions. They likely will return false for all + * non-ASCII values, but this makes sure */ +# define isALPHA_A(c) (isASCII(c) && isalpha(c)) +# define isALPHANUMERIC_A(c) (isASCII(c) && isalnum(c)) +# define isCNTRL_A(c) (isASCII(c) && iscntrl(c)) +# define isDIGIT_A(c) (isASCII(c) && isdigit(c)) +# define isGRAPH_A(c) (isASCII(c) && isgraph(c)) +# define isLOWER_A(c) (isASCII(c) && islower(c)) +# define isPRINT_A(c) (isASCII(c) && isprint(c)) +# define isPUNCT_A(c) (isASCII(c) && ispunct(c)) +# define isSPACE_A(c) (isASCII(c) && isspace(c)) +# define isUPPER_A(c) (isASCII(c) && isupper(c)) +# define isXDIGIT_A(c) (isASCII(c) && isxdigit(c)) +# else /* ASCII platform. These are coded based on first principals */ # define isALPHA_A(c) (isUPPER_A(c) || isLOWER_A(c)) # define isALPHANUMERIC_A(c) (isALPHA_A(c) || isDIGIT_A(c)) -# define isBLANK_A(c) ((c) == ' ' || (c) == '\t') -# define isCNTRL_A(c) (FITS_IN_8_BITS(c) && ((U8) (c) < ' ' || (c) == 127)) +# define isCNTRL_A(c) (isASCII(c) && (! isPRINT_A(c))) # define isDIGIT_A(c) ((c) <= '9' && (c) >= '0') -# define isGRAPH_A(c) (isWORDCHAR_A(c) || isPUNCT_A(c)) -# define isIDFIRST_A(c) (isALPHA_A(c) || (c) == '_') +# define isGRAPH_A(c) (isPRINT_A(c) && (c) != ' ') # define isLOWER_A(c) ((c) >= 'a' && (c) <= 'z') # define isPRINT_A(c) (((c) >= 32 && (c) < 127)) -# define isPSXSPC_A(c) (isSPACE_A(c) || (c) == '\v') -# define isPUNCT_A(c) (((c) >= 33 && (c) <= 47) \ - || ((c) >= 58 && (c) <= 64) \ - || ((c) >= 91 && (c) <= 96) \ - || ((c) >= 123 && (c) <= 126)) -# define isSPACE_A(c) ((c) == ' ' \ - || (c) == '\t' \ - || (c) == '\n' \ - || (c) =='\r' \ +# define isPUNCT_A(c) (isGRAPH_A(c) && (! isALPHANUMERIC_A(c))) +# define isSPACE_A(c) ((c) == ' ' \ + || (c) == '\t' \ + || (c) == '\n' \ + || (c) == '\r' \ + || (c) =='\v' \ || (c) == '\f') # define isUPPER_A(c) ((c) <= 'Z' && (c) >= 'A') -# define isWORDCHAR_A(c) (isALPHA_A(c) || isDIGIT_A(c) || (c) == '_') -# define isXDIGIT_A(c) (isDIGIT_A(c) \ - || ((c) >= 'a' && (c) <= 'f') \ - || ((c) <= 'F' && (c) >= 'A')) -# endif -#endif /* ASCII range definitions */ +# define isXDIGIT_A(c) (isDIGIT_A(c) \ + || ((c) >= 'a' && (c) <= 'f') \ + || ((c) <= 'F' && (c) >= 'A')) +# endif /* Below are common definitions for ASCII and non-ASCII */ +# define isBLANK_A(c) ((c) == ' ' || (c) == '\t') +# define isIDFIRST_A(c) (isALPHA_A(c) || (c) == '_') +# define isWORDCHAR_A(c) (isALPHANUMERIC_A(c) || (c) == '_') + + /* The _L1 macros may be unnecessary for both the utilities and for + * bootstrapping; I (khw) added them during debugging of bootstrapping, and + * it seems best to keep them. */ +# define isPSXSPC_A(c) isSPACE_A(c) /* XXX Assumes SPACE matches '\v' */ +# define isALPHA_L1(c) (isUPPER_L1(c) || isLOWER_L1(c)) +# define isALPHANUMERIC_L1(c) (isALPHA_L1(c) || isDIGIT_A(c)) +# define isBLANK_L1(c) (isBLANK_A(c) \ + || (FITS_IN_8_BITS(c) \ + && NATIVE_TO_LATIN1((U8) c) == 0xA0)) +# define isCNTRL_L1(c) (FITS_IN_8_BITS(c) && (! isPRINT_L1(c))) +# define isGRAPH_L1(c) (isPRINT_L1(c) && (! isBLANK_L1(c))) +# define isLOWER_L1(c) (isLOWER_A(c) \ + || (FITS_IN_8_BITS(c) \ + && ((NATIVE_TO_LATIN1((U8) c) >= 0xDF \ + && NATIVE_TO_LATIN1((U8) c) != 0xF7) \ + || NATIVE_TO_LATIN1((U8) c) == 0xAA \ + || NATIVE_TO_LATIN1((U8) c) == 0xBA \ + || NATIVE_TO_LATIN1((U8) c) == 0xB5))) +# define isPRINT_L1(c) (isPRINT_A(c) \ + || (FITS_IN_8_BITS(c) \ + && NATIVE_TO_LATIN1((U8) c) >= 0xA0)) +# define isPSXSPC_L1(c) isSPACE_L1(c) +# define isPUNCT_L1(c) (isPUNCT_A(c) \ + || (FITS_IN_8_BITS(c) \ + && (NATIVE_TO_LATIN1((U8) c) == 0xA1 \ + || NATIVE_TO_LATIN1((U8) c) == 0xA7 \ + || NATIVE_TO_LATIN1((U8) c) == 0xAB \ + || NATIVE_TO_LATIN1((U8) c) == 0xB6 \ + || NATIVE_TO_LATIN1((U8) c) == 0xB7 \ + || NATIVE_TO_LATIN1((U8) c) == 0xBB \ + || NATIVE_TO_LATIN1((U8) c) == 0xBF))) +# define isSPACE_L1(c) (isSPACE_A(c) \ + || (FITS_IN_8_BITS(c) \ + && (NATIVE_TO_LATIN1((U8) c) == 0x85 \ + || NATIVE_TO_LATIN1((U8) c) == 0xA0))) +# define isUPPER_L1(c) (isUPPER_A(c) \ + || (FITS_IN_8_BITS(c) \ + && (NATIVE_TO_LATIN1((U8) c) >= 0xC0 \ + && NATIVE_TO_LATIN1((U8) c) <= 0xDE \ + && NATIVE_TO_LATIN1((U8) c) != 0xD7))) +# define isWORDCHAR_L1(c) (isIDFIRST_L1(c) || isDIGIT_A(c)) +# define isIDFIRST_L1(c) (isALPHA_L1(c) || NATIVE_TO_LATIN1(c) == '_') +# define isCHARNAME_CONT(c) (isWORDCHAR_L1(c) \ + || isBLANK_L1(c) \ + || (c) == '-' \ + || (c) == '(' \ + || (c) == ')') + /* The following are not fully accurate in the above-ASCII range. I (khw) + * don't think it's necessary to be so for the purposes where this gets + * compiled */ +# define _isQUOTEMETA(c) (FITS_IN_8_BITS(c) && ! isWORDCHAR_L1(c)) +# define _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) isALPHA_L1(c) + + /* And these aren't accurate at all. They are useful only for above + * Latin1, which utilities and bootstrapping don't deal with */ +# define _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) 0 +# define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) 0 + + /* Many of the macros later in this file are defined in terms of these. By + * implementing them with a function, which converts the class number into + * a call to the desired macro, all of the later ones work. However, that + * function won't be actually defined when building a utility program (no + * perl.h), and so a compiler error will be generated if one is attempted + * to be used. And the above-Latin1 code points require Unicode tables to + * be present, something unlikely to be the case when bootstrapping */ +# define _generic_isCC(c, classnum) \ + (FITS_IN_8_BITS(c) && S_bootstrap_ctype((U8) (c), (classnum), TRUE)) +# define _generic_isCC_A(c, classnum) \ + (FITS_IN_8_BITS(c) && S_bootstrap_ctype((U8) (c), (classnum), FALSE)) +#endif /* End of no perl.h or have BOOTSTRAP_CHARSET */ + +#define isALPHANUMERIC(c) isALPHANUMERIC_A(c) +#define isALPHA(c) isALPHA_A(c) +#define isBLANK(c) isBLANK_A(c) +#define isCNTRL(c) isCNTRL_A(c) +#define isDIGIT(c) isDIGIT_A(c) +#define isGRAPH(c) isGRAPH_A(c) +#define isIDFIRST(c) isIDFIRST_A(c) +#define isLOWER(c) isLOWER_A(c) +#define isPRINT(c) isPRINT_A(c) +#define isPSXSPC(c) isPSXSPC_A(c) +#define isPUNCT(c) isPUNCT_A(c) +#define isSPACE(c) isSPACE_A(c) +#define isUPPER(c) isUPPER_A(c) +#define isWORDCHAR(c) isWORDCHAR_A(c) +#define isXDIGIT(c) isXDIGIT_A(c) + +/* ASCII casing. These could also be written as + #define toLOWER(c) (isASCII(c) ? toLOWER_LATIN1(c) : (c)) + #define toUPPER(c) (isASCII(c) ? toUPPER_LATIN1_MOD(c) : (c)) + which uses table lookup and mask instead of subtraction. (This would + work because the _MOD does not apply in the ASCII range) */ +#define toLOWER(c) (isUPPER(c) ? (U8)((c) + ('a' - 'A')) : (c)) +#define toUPPER(c) (isLOWER(c) ? (U8)((c) - ('a' - 'A')) : (c)) + +/* In the ASCII range, these are equivalent to what they're here defined to be. + * But by creating these definitions, other code doesn't have to be aware of + * this detail */ +#define toFOLD(c) toLOWER(c) +#define toTITLE(c) toUPPER(c) + +#define toLOWER_A(c) toLOWER(c) +#define toUPPER_A(c) toUPPER(c) +#define toFOLD_A(c) toFOLD(c) +#define toTITLE_A(c) toTITLE(c) + +/* Use table lookup for speed; returns the input itself if is out-of-range */ +#define toLOWER_LATIN1(c) ((! FITS_IN_8_BITS(c)) \ + ? (c) \ + : PL_latin1_lc[ (U8) (c) ]) +#define toLOWER_L1(c) toLOWER_LATIN1(c) /* Synonym for consistency */ -/* Latin1 definitions */ -#ifdef H_PERL -# define isALPHA_L1(c) _generic_isCC(c, _CC_ALPHA) -# define isALPHANUMERIC_L1(c) _generic_isCC(c, _CC_ALPHANUMERIC) -# define isBLANK_L1(c) _generic_isCC(c, _CC_BLANK) +/* Modified uc. Is correct uc except for three non-ascii chars which are + * all mapped to one of them, and these need special handling; returns the + * input itself if is out-of-range */ +#define toUPPER_LATIN1_MOD(c) ((! FITS_IN_8_BITS(c)) \ + ? (c) \ + : PL_mod_latin1_uc[ (U8) (c) ]) +#define IN_UTF8_CTYPE_LOCALE PL_in_utf8_CTYPE_locale -/* continuation character for legal NAME in \N{NAME} */ -# define isCHARNAME_CONT(c) _generic_isCC(c, _CC_CHARNAME_CONT) +/* Use foo_LC_uvchr() instead of these for beyond the Latin1 range */ -# define isCNTRL_L1(c) _generic_isCC(c, _CC_CNTRL) -# define isGRAPH_L1(c) _generic_isCC(c, _CC_GRAPH) -# define isLOWER_L1(c) _generic_isCC(c, _CC_LOWER) -# define isPRINT_L1(c) _generic_isCC(c, _CC_PRINT) -# define isPSXSPC_L1(c) _generic_isCC(c, _CC_PSXSPC) -# define isPUNCT_L1(c) _generic_isCC(c, _CC_PUNCT) -# define isSPACE_L1(c) _generic_isCC(c, _CC_SPACE) -# define isUPPER_L1(c) _generic_isCC(c, _CC_UPPER) -# define isWORDCHAR_L1(c) _generic_isCC(c, _CC_WORDCHAR) -# define isIDFIRST_L1(c) _generic_isCC(c, _CC_IDFIRST) -#else /* No access to perl.h. Only a few provided here, just in case needed - * for backwards compatibility */ - /* ALPHAU includes Unicode semantics for latin1 characters. It has an extra - * >= AA test to speed up ASCII-only tests at the expense of the others */ -# define isALPHA_L1(c) (isALPHA(c) || (NATIVE_TO_UNI((U8) c) >= 0xAA \ - && ((NATIVE_TO_UNI((U8) c) >= 0xC0 \ - && NATIVE_TO_UNI((U8) c) != 0xD7 && NATIVE_TO_UNI((U8) c) != 0xF7) \ - || NATIVE_TO_UNI((U8) c) == 0xAA \ - || NATIVE_TO_UNI((U8) c) == 0xB5 \ - || NATIVE_TO_UNI((U8) c) == 0xBA))) -# define isCHARNAME_CONT(c) (isWORDCHAR_L1(c) \ - || (c) == ' ' \ - || (c) == '-' \ - || (c) == '(' \ - || (c) == ')' \ - || (c) == ':' \ - || NATIVE_TO_UNI((U8) c) == 0xA0) +/* For internal core Perl use only: the base macro for defining macros like + * isALPHA_LC, which uses the current LC_CTYPE locale. 'c' is the code point + * (0-255) to check. In a UTF-8 locale, the result is the same as calling + * isFOO_L1(); the 'utf8_locale_classnum' parameter is something like + * _CC_UPPER, which gives the class number for doing this. For non-UTF-8 + * locales, the code to actually do the test this is passed in 'non_utf8'. If + * 'c' is above 255, 0 is returned. For accessing the full range of possible + * code points under locale rules, use the macros based on _generic_LC_uvchr + * instead of this. */ +#define _generic_LC_base(c, utf8_locale_classnum, non_utf8) \ + (! FITS_IN_8_BITS(c) \ + ? 0 \ + : IN_UTF8_CTYPE_LOCALE \ + ? cBOOL(PL_charclass[(U8) (c)] & _CC_mask(utf8_locale_classnum)) \ + : cBOOL(non_utf8)) + +/* For internal core Perl use only: a helper macro for defining macros like + * isALPHA_LC. 'c' is the code point (0-255) to check. The function name to + * actually do this test is passed in 'non_utf8_func', which is called on 'c', + * casting 'c' to the macro _LC_CAST, which should not be parenthesized. See + * _generic_LC_base for more info */ +#define _generic_LC(c, utf8_locale_classnum, non_utf8_func) \ + _generic_LC_base(c,utf8_locale_classnum, \ + non_utf8_func( (_LC_CAST) (c))) + +/* For internal core Perl use only: like _generic_LC, but also returns TRUE if + * 'c' is the platform's native underscore character */ +#define _generic_LC_underscore(c,utf8_locale_classnum,non_utf8_func) \ + _generic_LC_base(c, utf8_locale_classnum, \ + (non_utf8_func( (_LC_CAST) (c)) \ + || (char)(c) == '_')) + +/* These next three are also for internal core Perl use only: case-change + * helper macros */ +#define _generic_toLOWER_LC(c, function, cast) (! FITS_IN_8_BITS(c) \ + ? (c) \ + : (IN_UTF8_CTYPE_LOCALE) \ + ? PL_latin1_lc[ (U8) (c) ] \ + : function((cast)(c))) + +/* Note that the result can be larger than a byte in a UTF-8 locale. It + * returns a single value, so can't adequately return the upper case of LATIN + * SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of two + * values "SS"); instead it asserts against that under DEBUGGING, and + * otherwise returns its input */ +#define _generic_toUPPER_LC(c, function, cast) \ + (! FITS_IN_8_BITS(c) \ + ? (c) \ + : ((! IN_UTF8_CTYPE_LOCALE) \ + ? function((cast)(c)) \ + : ((((U8)(c)) == MICRO_SIGN) \ + ? GREEK_CAPITAL_LETTER_MU \ + : ((((U8)(c)) == LATIN_SMALL_LETTER_Y_WITH_DIAERESIS) \ + ? LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS \ + : ((((U8)(c)) == LATIN_SMALL_LETTER_SHARP_S) \ + ? (__ASSERT_(0) (c)) \ + : PL_mod_latin1_uc[ (U8) (c) ]))))) + +/* Note that the result can be larger than a byte in a UTF-8 locale. It + * returns a single value, so can't adequately return the fold case of LATIN + * SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of two + * values "ss"); instead it asserts against that under DEBUGGING, and + * otherwise returns its input */ +#define _generic_toFOLD_LC(c, function, cast) \ + ((UNLIKELY((c) == MICRO_SIGN) && IN_UTF8_CTYPE_LOCALE) \ + ? GREEK_SMALL_LETTER_MU \ + : (__ASSERT_(! IN_UTF8_CTYPE_LOCALE \ + || (c) != LATIN_SMALL_LETTER_SHARP_S) \ + _generic_toLOWER_LC(c, function, cast))) + +/* Use the libc versions for these if available. */ +#if defined(HAS_ISASCII) && ! defined(USE_NEXT_CTYPE) +# define isASCII_LC(c) (FITS_IN_8_BITS(c) && isascii( (U8) (c))) +#else +# define isASCII_LC(c) isASCII(c) #endif -/* Macros that differ between EBCDIC and ASCII. Where C89 defines a function, - * that is used in the EBCDIC form, because in EBCDIC we do not do locales: - * therefore can use native functions. For those where C89 doesn't define a - * function, use our function, assuming that the EBCDIC code page is isomorphic - * with Latin1, which the three currently recognized by Perl are. Some libc's - * have an isblank(), but it's not guaranteed. */ -#ifdef EBCDIC -# define isALPHA(c) isalpha(c) -# define isALPHANUMERIC(c) isalnum(c) -# define isBLANK(c) ((c) == ' ' || (c) == '\t' || NATIVE_TO_UNI(c) == 0xA0) -# define isCNTRL(c) iscntrl(c) -# define isDIGIT(c) isdigit(c) -# define isGRAPH(c) isgraph(c) -# define isIDFIRST(c) (isALPHA(c) || (c) == '_') -# define isLOWER(c) islower(c) -# define isPRINT(c) isprint(c) -# define isPSXSPC(c) isspace(c) -# define isPUNCT(c) ispunct(c) -# define isSPACE(c) (isPSXSPC(c) /* && (c) != '\v' (Experimentally making - these macros identical) */) -# define isUPPER(c) isupper(c) -# define isXDIGIT(c) isxdigit(c) -# define isWORDCHAR(c) (isalnum(c) || (c) == '_') -# define toLOWER(c) tolower(c) -# define toUPPER(c) toupper(c) -#else /* Not EBCDIC: ASCII-only matching */ -# define isALPHANUMERIC(c) isALPHANUMERIC_A(c) -# define isALPHA(c) isALPHA_A(c) -# define isBLANK(c) isBLANK_A(c) -# define isCNTRL(c) isCNTRL_A(c) -# define isDIGIT(c) isDIGIT_A(c) -# define isGRAPH(c) isGRAPH_A(c) -# define isIDFIRST(c) isIDFIRST_A(c) -# define isLOWER(c) isLOWER_A(c) -# define isPRINT(c) isPRINT_A(c) -# define isPSXSPC(c) isPSXSPC_A(c) -# define isPUNCT(c) isPUNCT_A(c) -# define isSPACE(c) isSPACE_A(c) -# define isUPPER(c) isUPPER_A(c) -# define isWORDCHAR(c) isWORDCHAR_A(c) -# define isXDIGIT(c) isXDIGIT_A(c) - - /* ASCII casing. These could also be written as - #define toLOWER(c) (isASCII(c) ? toLOWER_LATIN1(c) : (c)) - #define toUPPER(c) (isASCII(c) ? toUPPER_LATIN1_MOD(c) : (c)) - which uses table lookup and mask instead of subtraction. (This would - work because the _MOD does not apply in the ASCII range) */ -# define toLOWER(c) (isUPPER(c) ? (c) + ('a' - 'A') : (c)) -# define toUPPER(c) (isLOWER(c) ? (c) - ('a' - 'A') : (c)) +#if defined(HAS_ISBLANK) && ! defined(USE_NEXT_CTYPE) +# define isBLANK_LC(c) _generic_LC(c, _CC_BLANK, isblank) +#else /* Unlike isASCII, varies if in a UTF-8 locale */ +# define isBLANK_LC(c) (IN_UTF8_CTYPE_LOCALE) ? isBLANK_L1(c) : isBLANK(c) #endif - -/* Use table lookup for speed; return error character for input - * out-of-range */ -#define toLOWER_LATIN1(c) (FITS_IN_8_BITS(c) \ - ? UNI_TO_NATIVE(PL_latin1_lc[ \ - NATIVE_TO_UNI( (U8) (c)) ]) \ - : UNICODE_REPLACEMENT) -/* Modified uc. Is correct uc except for three non-ascii chars which are - * all mapped to one of them, and these need special handling; error - * character for input out-of-range */ -#define toUPPER_LATIN1_MOD(c) (FITS_IN_8_BITS(c) \ - ? UNI_TO_NATIVE(PL_mod_latin1_uc[ \ - NATIVE_TO_UNI( (U8) (c)) ]) \ - : UNICODE_REPLACEMENT) - -#ifdef USE_NEXT_CTYPE - -# define isALPHANUMERIC_LC(c) NXIsAlNum((unsigned int)(c)) -# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) -# define isASCII_LC(c) isASCII((unsigned int)(c)) -# define isBLANK_LC(c) isBLANK((unsigned int)(c)) -# define isCNTRL_LC(c) NXIsCntrl((unsigned int)(c)) -# define isDIGIT_LC(c) NXIsDigit((unsigned int)(c)) -# define isGRAPH_LC(c) NXIsGraph((unsigned int)(c)) -# define isIDFIRST_LC(c) (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_') -# define isLOWER_LC(c) NXIsLower((unsigned int)(c)) -# define isPRINT_LC(c) NXIsPrint((unsigned int)(c)) -# define isPUNCT_LC(c) NXIsPunct((unsigned int)(c)) -# define isSPACE_LC(c) NXIsSpace((unsigned int)(c)) -# define isUPPER_LC(c) NXIsUpper((unsigned int)(c)) -# define isWORDCHAR_LC(c) (NXIsAlNum((unsigned int)(c)) || (char)(c) == '_') -# define isXDIGIT_LC(c) NXIsXDigit((unsigned int)(c)) -# define toLOWER_LC(c) NXToLower((unsigned int)(c)) -# define toUPPER_LC(c) NXToUpper((unsigned int)(c)) +#ifdef USE_NEXT_CTYPE /* NeXT computers */ + +# define _LC_CAST unsigned int /* Needed by _generic_LC. NeXT functions + use this as their input type */ + +# define isALPHA_LC(c) _generic_LC(c, _CC_ALPHA, NXIsAlpha) +# define isALPHANUMERIC_LC(c) _generic_LC(c, _CC_ALPHANUMERIC, NXIsAlNum) +# define isCNTRL_LC(c) _generic_LC(c, _CC_CNTRL, NXIsCntrl) +# define isDIGIT_LC(c) _generic_LC(c, _CC_DIGIT, NXIsDigit) +# define isGRAPH_LC(c) _generic_LC(c, _CC_GRAPH, NXIsGraph) +# define isIDFIRST_LC(c) _generic_LC_underscore(c, _CC_IDFIRST, NXIsAlpha) +# define isLOWER_LC(c) _generic_LC(c, _CC_LOWER, NXIsLower) +# define isPRINT_LC(c) _generic_LC(c, _CC_PRINT, NXIsPrint) +# define isPUNCT_LC(c) _generic_LC(c, _CC_PUNCT, NXIsPunct) +# define isSPACE_LC(c) _generic_LC(c, _CC_SPACE, NXIsSpace) +# define isUPPER_LC(c) _generic_LC(c, _CC_UPPER, NXIsUpper) +# define isWORDCHAR_LC(c) _generic_LC_underscore(c, _CC_WORDCHAR, NXIsAlNum) +# define isXDIGIT_LC(c) _generic_LC(c, _CC_XDIGIT, NXIsXdigit) + +# define toLOWER_LC(c) _generic_toLOWER_LC((c), NXToLower, unsigned int) +# define toUPPER_LC(c) _generic_toUPPER_LC((c), NXToUpper, unsigned int) +# define toFOLD_LC(c) _generic_toFOLD_LC((c), NXToLower, unsigned int) #else /* !USE_NEXT_CTYPE */ +# define _LC_CAST U8 + # if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII)) + /* For most other platforms */ -/* Use foo_LC_uvchr() instead of these for beyond the Latin1 range */ +# define isALPHA_LC(c) _generic_LC(c, _CC_ALPHA, isalpha) +# define isALPHANUMERIC_LC(c) _generic_LC(c, _CC_ALPHANUMERIC, isalnum) +# define isCNTRL_LC(c) _generic_LC(c, _CC_CNTRL, iscntrl) +# define isDIGIT_LC(c) _generic_LC(c, _CC_DIGIT, isdigit) +# define isGRAPH_LC(c) _generic_LC(c, _CC_GRAPH, isgraph) +# define isIDFIRST_LC(c) _generic_LC_underscore(c, _CC_IDFIRST, isalpha) +# define isLOWER_LC(c) _generic_LC(c, _CC_LOWER, islower) +# define isPRINT_LC(c) _generic_LC(c, _CC_PRINT, isprint) +# define isPUNCT_LC(c) _generic_LC(c, _CC_PUNCT, ispunct) +# define isSPACE_LC(c) _generic_LC(c, _CC_SPACE, isspace) +# define isUPPER_LC(c) _generic_LC(c, _CC_UPPER, isupper) +# define isWORDCHAR_LC(c) _generic_LC_underscore(c, _CC_WORDCHAR, isalnum) +# define isXDIGIT_LC(c) _generic_LC(c, _CC_XDIGIT, isxdigit) -# define isALPHA_LC(c) (FITS_IN_8_BITS(c) && isalpha((unsigned char)(c))) -# define isALPHANUMERIC_LC(c) (FITS_IN_8_BITS(c) \ - && isalnum((unsigned char)(c))) -# ifdef HAS_ISASCII -# define isASCII_LC(c) (FITS_IN_8_BITS(c) && isascii((unsigned char)(c))) -# else -# define isASCII_LC(c) (FITS_IN_8_BITS(c) && isASCII((unsigned char)(c))) -# endif -# ifdef HAS_ISBLANK -# define isBLANK_LC(c) (FITS_IN_8_BITS(c) && isblank((unsigned char)(c))) -# else -# define isBLANK_LC(c) (FITS_IN_8_BITS(c) && isBLANK((unsigned char)(c))) -# endif -# define isCNTRL_LC(c) (FITS_IN_8_BITS(c) && iscntrl((unsigned char)(c))) -# define isDIGIT_LC(c) (FITS_IN_8_BITS(c) && isdigit((unsigned char)(c))) -# define isGRAPH_LC(c) (FITS_IN_8_BITS(c) && isgraph((unsigned char)(c))) -# define isIDFIRST_LC(c) (FITS_IN_8_BITS(c) \ - && (isalpha((unsigned char)(c)) || (char)(c) == '_')) -# define isLOWER_LC(c) (FITS_IN_8_BITS(c) && islower((unsigned char)(c))) -# define isPRINT_LC(c) (FITS_IN_8_BITS(c) && isprint((unsigned char)(c))) -# define isPUNCT_LC(c) (FITS_IN_8_BITS(c) && ispunct((unsigned char)(c))) -# define isSPACE_LC(c) (FITS_IN_8_BITS(c) && isspace((unsigned char)(c))) -# define isUPPER_LC(c) (FITS_IN_8_BITS(c) && isupper((unsigned char)(c))) -# define isWORDCHAR_LC(c) (FITS_IN_8_BITS(c) \ - && (isalnum((unsigned char)(c)) || (char)(c) == '_')) -# define isXDIGIT_LC(c) (FITS_IN_8_BITS(c) && isxdigit((unsigned char)(c))) -# define toLOWER_LC(c) (FITS_IN_8_BITS(c) ? tolower((unsigned char)(c)) : (c)) -# define toUPPER_LC(c) (FITS_IN_8_BITS(c) ? toupper((unsigned char)(c)) : (c)) -# else +# define toLOWER_LC(c) _generic_toLOWER_LC((c), tolower, U8) +# define toUPPER_LC(c) _generic_toUPPER_LC((c), toupper, U8) +# define toFOLD_LC(c) _generic_toFOLD_LC((c), tolower, U8) + +# else /* The final fallback position */ # define isALPHA_LC(c) (isascii(c) && isalpha(c)) # define isALPHANUMERIC_LC(c) (isascii(c) && isalnum(c)) -# define isASCII_LC(c) isascii(c) -# ifdef HAS_ISBLANK -# define isBLANK_LC(c) (isascii(c) && isblank(c)) -# else -# define isBLANK_LC(c) isBLANK_A(c) -# endif # define isCNTRL_LC(c) (isascii(c) && iscntrl(c)) # define isDIGIT_LC(c) (isascii(c) && isdigit(c)) # define isGRAPH_LC(c) (isascii(c) && isgraph(c)) @@ -1138,8 +1395,10 @@ EXTCONST U32 PL_charclass[]; # define isUPPER_LC(c) (isascii(c) && isupper(c)) # define isWORDCHAR_LC(c) (isascii(c) && (isalnum(c) || (c) == '_')) # define isXDIGIT_LC(c) (isascii(c) && isxdigit(c)) + # define toLOWER_LC(c) (isascii(c) ? tolower(c) : (c)) # define toUPPER_LC(c) (isascii(c) ? toupper(c) : (c)) +# define toFOLD_LC(c) (isascii(c) ? tolower(c) : (c)) # endif #endif /* USE_NEXT_CTYPE */ @@ -1150,11 +1409,18 @@ EXTCONST U32 PL_charclass[]; #define isIDCONT_LC(c) isWORDCHAR_LC(c) #define isPSXSPC_LC(c) isSPACE_LC(c) -/* For internal core Perl use only. If the input is Latin1, use the Latin1 - * macro; otherwise use the function 'above_latin1'. Won't compile if 'c' isn't unsigned, as - * won't match above_latin1 prototype. The macros do bounds checking, so have - * duplicate checks here, so could create versions of the macros that don't, - * but experiments show that gcc optimizes them out anyway. */ +/* For internal core Perl use only: the base macros for defining macros like + * isALPHA_uni. 'c' is the code point to check. 'classnum' is the POSIX class + * number defined earlier in this file. _generic_uni() is used for POSIX + * classes where there is a macro or function 'above_latin1' that takes the + * single argument 'c' and returns the desired value. These exist for those + * classes which have simple definitions, avoiding the overhead of a hash + * lookup or inversion list binary search. _generic_swash_uni() can be used + * for classes where that overhead is faster than a direct lookup. + * _generic_uni() won't compile if 'c' isn't unsigned, as it won't match the + * 'above_latin1' prototype. _generic_isCC() macro does bounds checking, so + * have duplicate checks here, so could create versions of the macros that + * don't, but experiments show that gcc optimizes them out anyway. */ /* Note that all ignore 'use bytes' */ #define _generic_uni(classnum, above_latin1, c) ((c) < 256 \ @@ -1190,6 +1456,11 @@ EXTCONST U32 PL_charclass[]; #define toTITLE_uni(c,s,l) to_uni_title(c,s,l) #define toUPPER_uni(c,s,l) to_uni_upper(c,s,l) +/* For internal core Perl use only: the base macros for defining macros like + * isALPHA_LC_uvchr. These are like isALPHA_LC, but the input can be any code + * point, not just 0-255. Like _generic_uni, there are two versions, one for + * simple class definitions; the other for more complex. These are like + * _generic_uni, so see it for more info. */ #define _generic_LC_uvchr(latin1, above_latin1, c) \ (c < 256 ? latin1(c) : above_latin1(c)) #define _generic_LC_swash_uvchr(latin1, classnum, c) \ @@ -1219,31 +1490,28 @@ EXTCONST U32 PL_charclass[]; _CC_WORDCHAR, c) #define isXDIGIT_LC_uvchr(c) _generic_LC_uvchr(isXDIGIT_LC, is_XDIGIT_cp_high, c) - #define isBLANK_LC_uni(c) isBLANK_LC_uvchr(UNI_TO_NATIVE(c)) -/* Everything whose name begins with an underscore is for internal core Perl - * use only. */ - -/* If the input is in the Latin1 range, use - * the Latin1 macro 'classnum' on 'p' which is a pointer to a UTF-8 string. - * Otherwise use the value given by the 'utf8' parameter. This relies on the - * fact that ASCII characters have the same representation whether utf8 or not. - * Note that it assumes that the utf8 has been validated, and ignores 'use - * bytes' */ +/* For internal core Perl use only: the base macros for defining macros like + * isALPHA_utf8. These are like the earlier defined macros, but take an input + * UTF-8 encoded string 'p'. If the input is in the Latin1 range, use + * the Latin1 macro 'classnum' on 'p'. Otherwise use the value given by the + * 'utf8' parameter. This relies on the fact that ASCII characters have the + * same representation whether utf8 or not. Note that it assumes that the utf8 + * has been validated, and ignores 'use bytes' */ #define _generic_utf8(classnum, p, utf8) (UTF8_IS_INVARIANT(*(p)) \ ? _generic_isCC(*(p), classnum) \ : (UTF8_IS_DOWNGRADEABLE_START(*(p))) \ ? _generic_isCC( \ - TWO_BYTE_UTF8_TO_UNI(*(p), \ + TWO_BYTE_UTF8_TO_NATIVE(*(p), \ *((p)+1 )), \ - classnum) \ + classnum) \ : utf8) /* Like the above, but calls 'above_latin1(p)' to get the utf8 value. 'above_latin1' * can be a macro */ #define _generic_func_utf8(classnum, above_latin1, p) \ _generic_utf8(classnum, p, above_latin1(p)) -/* Like the above, but passes classnum to _isFOO_utf8(), instead of having a +/* Like the above, but passes classnum to _isFOO_utf8(), instead of having an * 'above_latin1' parameter */ #define _generic_swash_utf8(classnum, p) \ _generic_utf8(classnum, p, _is_utf8_FOO(classnum, p)) @@ -1251,11 +1519,11 @@ EXTCONST U32 PL_charclass[]; /* Like the above, but should be used only when it is known that there are no * characters in the range 128-255 which the class is TRUE for. Hence it can * skip the tests for this range. 'above_latin1' should include its arguments */ -#define _generic_utf8_no_upper_latin1(classnum, p, above_latin1) \ +#define _generic_utf8_no_upper_latin1(classnum, p, above_latin1) \ (UTF8_IS_INVARIANT(*(p)) \ ? _generic_isCC(*(p), classnum) \ : (UTF8_IS_ABOVE_LATIN1(*(p))) \ - ? above_latin1 \ + ? above_latin1 \ : 0) /* NOTE that some of these macros have very similar ones in regcharclass.h. @@ -1302,26 +1570,26 @@ EXTCONST U32 PL_charclass[]; #define isXDIGIT_utf8(p) _generic_utf8_no_upper_latin1(_CC_XDIGIT, p, \ is_XDIGIT_high(p)) +#define toFOLD_utf8(p,s,l) to_utf8_fold(p,s,l) #define toLOWER_utf8(p,s,l) to_utf8_lower(p,s,l) #define toTITLE_utf8(p,s,l) to_utf8_title(p,s,l) #define toUPPER_utf8(p,s,l) to_utf8_upper(p,s,l) -/* For internal core Perl use only. If the input is in the Latin1 range, use - * the macro 'macro' on 'p' which is a pointer to a UTF-8 string. Otherwise - * use the value given by the 'utf8' parameter. This relies on the fact that - * ASCII characters have the same representation whether utf8 or not. Note - * that it assumes that the utf8 has been validated, and ignores 'use bytes' */ -#define _generic_LC_utf8(macro, p, utf8) \ - (UTF8_IS_INVARIANT(*(p)) \ - ? macro(*(p)) \ - : (UTF8_IS_DOWNGRADEABLE_START(*(p))) \ - ? macro(TWO_BYTE_UTF8_TO_UNI(*(p), *((p)+1))) \ +/* For internal core Perl use only: the base macros for defining macros like + * isALPHA_LC_utf8. These are like _generic_utf8, but if the first code point + * in 'p' is within the 0-255 range, it uses locale rules from the passed-in + * 'macro' parameter */ +#define _generic_LC_utf8(macro, p, utf8) \ + (UTF8_IS_INVARIANT(*(p)) \ + ? macro(*(p)) \ + : (UTF8_IS_DOWNGRADEABLE_START(*(p))) \ + ? macro(TWO_BYTE_UTF8_TO_NATIVE(*(p), *((p)+1))) \ : utf8) #define _generic_LC_swash_utf8(macro, classnum, p) \ _generic_LC_utf8(macro, p, _is_utf8_FOO(classnum, p)) #define _generic_LC_func_utf8(macro, above_latin1, p) \ - _generic_LC_utf8(macro, p, above_latin1(p)) + _generic_LC_utf8(macro, p, above_latin1(p)) #define isALPHANUMERIC_LC_utf8(p) _generic_LC_swash_utf8(isALPHANUMERIC_LC, \ _CC_ALPHANUMERIC, p) @@ -1367,11 +1635,23 @@ EXTCONST U32 PL_charclass[]; #define isALNUMC_utf8(p) isALPHANUMERIC_utf8(p) #define isALNUMC_LC_utf8(p) isALPHANUMERIC_LC_utf8(p) -/* This conversion works both ways, strangely enough. On EBCDIC platforms, - * CTRL-@ is 0, CTRL-A is 1, etc, just like on ASCII, except that they don't - * necessarily mean the same characters, e.g. CTRL-D is 4 on both systems, but - * that is EOT on ASCII; ST on EBCDIC */ -# define toCTRL(c) (toUPPER(NATIVE_TO_UNI(c)) ^ 64) +/* On EBCDIC platforms, CTRL-@ is 0, CTRL-A is 1, etc, just like on ASCII, + * except that they don't necessarily mean the same characters, e.g. CTRL-D is + * 4 on both systems, but that is EOT on ASCII; ST on EBCDIC. + * '?' is special-cased on EBCDIC to APC, which is the control there that is + * the outlier from the block that contains the other controls, just like + * toCTRL('?') on ASCII yields DEL, the control that is the outlier from the C0 + * block. If it weren't special cased, it would yield a non-control. + * The conversion works both ways, so CTRL('D') is 4, and CTRL(4) is D, etc. */ +#ifndef EBCDIC +# define toCTRL(c) (toUPPER(c) ^ 64) +#else +# define toCTRL(c) ((c) == '?' \ + ? LATIN1_TO_NATIVE(0x9F) \ + : (c) == LATIN1_TO_NATIVE(0x9F) \ + ? '?' \ + : (NATIVE_TO_LATIN1(toUPPER(c)) ^ 64)) +#endif /* Line numbers are unsigned, 32 bits. */ typedef U32 line_t; @@ -1390,7 +1670,22 @@ typedef U32 line_t; } \ return a; -#define READ_XDIGIT(s) (isALPHA(*(s)) ? ((*(s)++ + 9) & 0xf) : (*(s)++ & 0xf)) +/* Converts a character known to represent a hexadecimal digit (0-9, A-F, or + * a-f) to its numeric value. READ_XDIGIT's argument is a string pointer, + * which is advanced. The input is validated only by an assert() in DEBUGGING + * builds. In both ASCII and EBCDIC the last 4 bits of the digits are 0-9; and + * the last 4 bits of A-F and a-f are 1-6, so adding 9 yields 10-15 */ +#define XDIGIT_VALUE(c) (__ASSERT_(isXDIGIT(c)) (0xf & (isDIGIT(c) \ + ? (c) \ + : ((c) + 9)))) +#define READ_XDIGIT(s) (__ASSERT_(isXDIGIT(*s)) (0xf & (isDIGIT(*(s)) \ + ? (*(s)++) \ + : (*(s)++ + 9)))) + +/* Converts a character known to represent an octal digit (0-7) to its numeric + * value. The input is validated only by an assert() in DEBUGGING builds. In + * both ASCII and EBCDIC the last 3 bits of the octal digits range from 0-7. */ +#define OCTAL_VALUE(c) (__ASSERT_(isOCTAL(c)) (7 & (c))) /* =head1 Memory Management @@ -1398,6 +1693,8 @@ typedef U32 line_t; =for apidoc Am|void|Newx|void* ptr|int nitems|type The XSUB-writer's interface to the C C function. +Memory obtained by this should B be freed with L<"Safefree">. + In 5.9.3, Newx() and friends replace the older New() API, and drops the first parameter, I, a debug aid which allowed callers to identify themselves. This aid has been superseded by a new build option, @@ -1408,27 +1705,38 @@ there for use in XS modules supporting older perls. The XSUB-writer's interface to the C C function, with cast. See also C. +Memory obtained by this should B be freed with L<"Safefree">. + =for apidoc Am|void|Newxz|void* ptr|int nitems|type The XSUB-writer's interface to the C C function. The allocated memory is zeroed with C. See also C. +Memory obtained by this should B be freed with L<"Safefree">. + =for apidoc Am|void|Renew|void* ptr|int nitems|type The XSUB-writer's interface to the C C function. +Memory obtained by this should B be freed with L<"Safefree">. + =for apidoc Am|void|Renewc|void* ptr|int nitems|type|cast The XSUB-writer's interface to the C C function, with cast. +Memory obtained by this should B be freed with L<"Safefree">. + =for apidoc Am|void|Safefree|void* ptr The XSUB-writer's interface to the C C function. +This should B be used on memory obtained using L<"Newx"> and friends. + =for apidoc Am|void|Move|void* src|void* dest|int nitems|type The XSUB-writer's interface to the C C function. The C is the source, C is the destination, C is the number of items, and C is the type. Can do overlapping moves. See also C. =for apidoc Am|void *|MoveD|void* src|void* dest|int nitems|type -Like C but returns dest. Useful for encouraging compilers to tail-call +Like C but returns dest. Useful +for encouraging compilers to tail-call optimise. =for apidoc Am|void|Copy|void* src|void* dest|int nitems|type @@ -1438,7 +1746,8 @@ C is the type. May fail on overlapping copies. See also C. =for apidoc Am|void *|CopyD|void* src|void* dest|int nitems|type -Like C but returns dest. Useful for encouraging compilers to tail-call +Like C but returns dest. Useful +for encouraging compilers to tail-call optimise. =for apidoc Am|void|Zero|void* dest|int nitems|type @@ -1448,7 +1757,8 @@ destination, C is the number of items, and C is the type. =for apidoc Am|void *|ZeroD|void* dest|int nitems|type -Like C but returns dest. Useful for encouraging compilers to tail-call +Like C but returns dest. Useful +for encouraging compilers to tail-call optimise. =for apidoc Am|void|StructCopy|type *src|type *dest|type @@ -1485,12 +1795,12 @@ PoisonWith(0xEF) for catching access to freed memory. * (U16)n > (size_t)~0/sizeof(U16) always being false. */ #ifdef PERL_MALLOC_WRAP #define MEM_WRAP_CHECK(n,t) \ - (void)(sizeof(t) > 1 && ((MEM_SIZE)(n)+0.0) > MEM_SIZE_MAX/sizeof(t) && (Perl_croak_memory_wrap(),0)) + (void)(UNLIKELY(sizeof(t) > 1 && ((MEM_SIZE)(n)+0.0) > MEM_SIZE_MAX/sizeof(t)) && (croak_memory_wrap(),0)) #define MEM_WRAP_CHECK_1(n,t,a) \ - (void)(sizeof(t) > 1 && ((MEM_SIZE)(n)+0.0) > MEM_SIZE_MAX/sizeof(t) && (Perl_croak_nocontext("%s",(a)),0)) + (void)(UNLIKELY(sizeof(t) > 1 && ((MEM_SIZE)(n)+0.0) > MEM_SIZE_MAX/sizeof(t)) && (Perl_croak_nocontext("%s",(a)),0)) #define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t), -#define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (Perl_croak_memory_wrap(),0):0),((n-1+PERL_STRLEN_ROUNDUP_QUANTUM)&~((MEM_SIZE)PERL_STRLEN_ROUNDUP_QUANTUM-1))) +#define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (croak_memory_wrap(),0):0),((n-1+PERL_STRLEN_ROUNDUP_QUANTUM)&~((MEM_SIZE)PERL_STRLEN_ROUNDUP_QUANTUM-1))) #else #define MEM_WRAP_CHECK(n,t) @@ -1616,14 +1926,25 @@ void Perl_mem_log_del_sv(const SV *sv, const char *filename, const int linenumbe #define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) #define Poison(d,n,t) PoisonFree(d,n,t) +#ifdef PERL_POISON +# define PERL_POISON_EXPR(x) x +#else +# define PERL_POISON_EXPR(x) +#endif + #ifdef USE_STRUCT_COPY #define StructCopy(s,d,t) (*((t*)(d)) = *((t*)(s))) #else #define StructCopy(s,d,t) Copy(s,d,1,t) #endif +/* C_ARRAY_LENGTH is the number of elements in the C array (so you + * want your zero-based indices to be less than but not equal to). + * + * C_ARRAY_END is one past the last: half-open/half-closed range, + * not last-inclusive range. */ #define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0])) -#define C_ARRAY_END(a) (a) + (sizeof(a)/sizeof((a)[0])) +#define C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a)) #ifdef NEED_VA_COPY # ifdef va_copy @@ -1661,6 +1982,37 @@ void Perl_mem_log_del_sv(const SV *sv, const char *filename, const int linenumbe # define deprecate(s) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), "Use of " s " is deprecated") #endif +/* Internal macros to deal with gids and uids */ +#ifdef PERL_CORE + +# if Uid_t_size > IVSIZE +# define sv_setuid(sv, uid) sv_setnv((sv), (NV)(uid)) +# define SvUID(sv) SvNV(sv) +# else +# if Uid_t_sign <= 0 +# define sv_setuid(sv, uid) sv_setiv((sv), (IV)(uid)) +# define SvUID(sv) SvIV(sv) +# else +# define sv_setuid(sv, uid) sv_setuv((sv), (UV)(uid)) +# define SvUID(sv) SvUV(sv) +# endif +# endif /* Uid_t_size */ + +# if Gid_t_size > IVSIZE +# define sv_setgid(sv, gid) sv_setnv((sv), (NV)(gid)) +# define SvGID(sv) SvNV(sv) +# else +# if Gid_t_sign <= 0 +# define sv_setgid(sv, gid) sv_setiv((sv), (IV)(gid)) +# define SvGID(sv) SvIV(sv) +# else +# define sv_setgid(sv, gid) sv_setuv((sv), (UV)(gid)) +# define SvGID(sv) SvUV(sv) +# endif +# endif /* Gid_t_size */ + +#endif + #endif /* HANDY_H */ /* diff --git a/Master/tlpkg/tlperl/lib/CORE/hv.h b/Master/tlpkg/tlperl/lib/CORE/hv.h index be7717d3d59..95dde4681ed 100644 --- a/Master/tlpkg/tlperl/lib/CORE/hv.h +++ b/Master/tlpkg/tlperl/lib/CORE/hv.h @@ -81,6 +81,7 @@ struct mro_meta { U32 pkg_gen; /* Bumps when local methods/@ISA change */ const struct mro_alg *mro_which; /* which mro alg is in use? */ HV *isa; /* Everything this class @ISA */ + HV *super; /* SUPER method cache */ U32 destroy_gen; /* Generation number of DESTROY cache */ }; @@ -112,14 +113,18 @@ struct xpvhv_aux { */ I32 xhv_name_count; struct mro_meta *xhv_mro_meta; - HV * xhv_super; /* SUPER method cache */ #ifdef PERL_HASH_RANDOMIZE_KEYS U32 xhv_rand; /* random value for hash traversal */ U32 xhv_last_rand; /* last random value for hash traversal, used to detect each() after insert for warnings */ #endif + U32 xhv_fill_lazy; + U32 xhv_aux_flags; /* assorted extra flags */ }; +#define HvAUXf_SCAN_STASH 0x1 /* stash is being scanned by gv_check */ +#define HvAUXf_NO_DEREF 0x2 /* @{}, %{} etc (and nomethod) not present */ + /* hash structure: */ /* This structure must match the beginning of struct xpvmg in sv.h. */ struct xpvhv { @@ -135,7 +140,7 @@ struct xpvhv { =for apidoc AmU||HEf_SVKEY This flag, used in the length slot of hash entries and magic structures, specifies the structure contains an C pointer where a C pointer -is to be expected. (For information only--not to be used). +is to be expected. (For information only--not to be used). =head1 Handy Values @@ -157,10 +162,10 @@ Returns the length of the stash's name. Returns true if the name is in UTF8 encoding. =for apidoc Am|char*|HvENAME|HV* stash -Returns the effective name of a stash, or NULL if there is none. The +Returns the effective name of a stash, or NULL if there is none. The effective name represents a location in the symbol table where this stash -resides. It is updated automatically when packages are aliased or deleted. -A stash that is no longer in the symbol table has no effective name. This +resides. It is updated automatically when packages are aliased or deleted. +A stash that is no longer in the symbol table has no effective name. This name is preferable to C for use in MRO linearisations and isa caches. @@ -171,7 +176,7 @@ Returns the length of the stash's effective name. Returns true if the effective name is in UTF8 encoding. =for apidoc Am|void*|HeKEY|HE* he -Returns the actual pointer stored in the key slot of the hash entry. The +Returns the actual pointer stored in the key slot of the hash entry. The pointer may be either C or C, depending on the value of C. Can be assigned to. The C or C macros are usually preferable for finding the value of a key. @@ -179,11 +184,12 @@ usually preferable for finding the value of a key. =for apidoc Am|STRLEN|HeKLEN|HE* he If this is negative, and amounts to C, it indicates the entry holds an C key. Otherwise, holds the actual length of the key. Can -be assigned to. The C macro is usually preferable for finding key +be assigned to. The C macro is usually preferable for finding key lengths. =for apidoc Am|SV*|HeVAL|HE* he -Returns the value slot (type C) stored in the hash entry. Can be assigned +Returns the value slot (type C) +stored in the hash entry. Can be assigned to. SV *foo= HeVAL(hv); @@ -201,14 +207,14 @@ not care about what the length of the key is, you may use the global variable C, though this is rather less efficient than using a local variable. Remember though, that hash keys in perl are free to contain embedded nulls, so using C or similar is not a good way to find -the length of hash keys. This is very similar to the C macro -described elsewhere in this document. See also C. +the length of hash keys. This is very similar to the C macro +described elsewhere in this document. See also C. If you are using C to get values to pass to C to create a new SV, you should consider using C as it is more efficient. -=for apidoc Am|char*|HeUTF8|HE* he +=for apidoc Am|U32|HeUTF8|HE* he Returns whether the C value returned by C is encoded in UTF-8, doing any necessary dereferencing of possibly C keys. The value returned will be 0 or non-0, not necessarily 1 (or even a value with any low bits set), @@ -233,6 +239,18 @@ C. #define PERL_HASH_DEFAULT_HvMAX 7 +/* During hsplit(), if HvMAX(hv)+1 (the new bucket count) is >= this value, + * we preallocate the HvAUX() struct. + * The assumption being that we are using so much space anyway we might + * as well allocate the extra bytes and speed up later keys() + * or each() operations. We don't do this to small hashes as we assume + * that a) it will be easy/fast to resize them to add the iterator, and b) that + * many of them will be objects which won't be traversed. Larger hashes however + * will take longer to extend, and the size of the aux struct is swamped by the + * overall length of the bucket array. + * */ +#define PERL_HV_ALLOC_AUX_SIZE (1 << 9) + /* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */ #define HEf_SVKEY -2 /* hent_key is an SV* */ @@ -240,7 +258,7 @@ C. # define Nullhv Null(HV*) #endif #define HvARRAY(hv) ((hv)->sv_u.svu_hash) -#define HvFILL(hv) Perl_hv_fill(aTHX_ (const HV *)(hv)) +#define HvFILL(hv) Perl_hv_fill(aTHX_ MUTABLE_HV(hv)) #define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max /* This quite intentionally does no flag checking first. That's your responsibility. */ @@ -366,7 +384,9 @@ C. ((HeKLEN(he) == HEf_SVKEY) ? \ HeKEY_sv(he) : \ newSVpvn_flags(HeKEY(he), \ - HeKLEN(he), SVs_TEMP)) : \ + HeKLEN(he), \ + SVs_TEMP | \ + ( HeKUTF8(he) ? SVf_UTF8 : 0 ))) : \ &PL_sv_undef) #define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv)) @@ -467,6 +487,22 @@ C. (MUTABLE_SV(hv_common_key_len((hv), (key), (klen), \ (flags) | HV_DELETE, NULL, 0))) +#ifdef PERL_CORE +# define hv_storehek(hv, hek, val) \ + hv_common((hv), NULL, HEK_KEY(hek), HEK_LEN(hek), HEK_UTF8(hek), \ + HV_FETCH_ISSTORE|HV_FETCH_JUST_SV, (val), HEK_HASH(hek)) +# define hv_fetchhek(hv, hek, lval) \ + ((SV **) \ + hv_common((hv), NULL, HEK_KEY(hek), HEK_LEN(hek), HEK_UTF8(hek), \ + (lval) \ + ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \ + : HV_FETCH_JUST_SV, \ + NULL, HEK_HASH(hek))) +# define hv_deletehek(hv, hek, flags) \ + hv_common((hv), NULL, HEK_KEY(hek), HEK_LEN(hek), HEK_UTF8(hek), \ + (flags)|HV_DELETE, NULL, HEK_HASH(hek)) +#endif + /* This refcounted he structure is used for storing the hints used for lexical pragmas. Without threads, it's basically struct he + refcount. With threads, life gets more complex as the structure needs to be shared diff --git a/Master/tlpkg/tlperl/lib/CORE/hv_func.h b/Master/tlpkg/tlperl/lib/CORE/hv_func.h index 7678807d883..191912a6cc7 100755 --- a/Master/tlpkg/tlperl/lib/CORE/hv_func.h +++ b/Master/tlpkg/tlperl/lib/CORE/hv_func.h @@ -93,7 +93,7 @@ */ #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ - || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) + || defined(_MSC_VER) || defined (__TURBOC__) #define U8TO16_LE(d) (*((const U16 *) (d))) #endif @@ -472,6 +472,16 @@ S_perl_hash_sdbm(const unsigned char * const seed, const unsigned char *str, con return hash; } +/* - ONE_AT_A_TIME_HARD is the 5.17+ recommend ONE_AT_A_TIME algorithm + * - ONE_AT_A_TIME_OLD is the unmodified 5.16 and older algorithm + * - ONE_AT_A_TIME is a 5.17+ tweak of ONE_AT_A_TIME_OLD to + * prevent strings of only \0 but different lengths from colliding + * + * Security-wise, from best to worst, + * ONE_AT_A_TIME_HARD > ONE_AT_A_TIME > ONE_AT_A_TIME_OLD + * There is a big drop-off in security between ONE_AT_A_TIME_HARD and + * ONE_AT_A_TIME + * */ /* This is the "One-at-a-Time" algorithm by Bob Jenkins * from requirements by Colin Plumb. diff --git a/Master/tlpkg/tlperl/lib/CORE/inline.h b/Master/tlpkg/tlperl/lib/CORE/inline.h index 953bb33cffb..0fe8a0eee1a 100755 --- a/Master/tlpkg/tlperl/lib/CORE/inline.h +++ b/Master/tlpkg/tlperl/lib/CORE/inline.h @@ -14,7 +14,7 @@ /* ------------------------------- av.h ------------------------------- */ -PERL_STATIC_INLINE I32 +PERL_STATIC_INLINE SSize_t S_av_top_index(pTHX_ AV *av) { PERL_ARGS_ASSERT_AV_TOP_INDEX; @@ -32,6 +32,56 @@ S_CvDEPTHp(const CV * const sv) return &((XPVCV*)SvANY(sv))->xcv_depth; } +/* + CvPROTO returns the prototype as stored, which is not necessarily what + the interpreter should be using. Specifically, the interpreter assumes + that spaces have been stripped, which has been the case if the prototype + was added by toke.c, but is generally not the case if it was added elsewhere. + Since we can't enforce the spacelessness at assignment time, this routine + provides a temporary copy at parse time with spaces removed. + I is the start of the original buffer, I is the length of the + prototype and will be updated when this returns. + */ + +#ifdef PERL_CORE +PERL_STATIC_INLINE char * +S_strip_spaces(pTHX_ const char * orig, STRLEN * const len) +{ + SV * tmpsv; + char * tmps; + tmpsv = newSVpvn_flags(orig, *len, SVs_TEMP); + tmps = SvPVX(tmpsv); + while ((*len)--) { + if (!isSPACE(*orig)) + *tmps++ = *orig; + orig++; + } + *tmps = '\0'; + *len = tmps - SvPVX(tmpsv); + return SvPVX(tmpsv); +} +#endif + +/* ------------------------------- mg.h ------------------------------- */ + +#if defined(PERL_CORE) || defined(PERL_EXT) +/* assumes get-magic and stringification have already occurred */ +PERL_STATIC_INLINE STRLEN +S_MgBYTEPOS(pTHX_ MAGIC *mg, SV *sv, const char *s, STRLEN len) +{ + assert(mg->mg_type == PERL_MAGIC_regex_global); + assert(mg->mg_len != -1); + if (mg->mg_flags & MGf_BYTES || !DO_UTF8(sv)) + return (STRLEN)mg->mg_len; + else { + const STRLEN pos = (STRLEN)mg->mg_len; + /* Without this check, we may read past the end of the buffer: */ + if (pos > sv_or_pv_len_utf8(sv, s, len)) return len+1; + return sv_or_pv_pos_u2b(sv, s, pos, NULL); + } +} +#endif + /* ----------------------------- regexp.h ----------------------------- */ PERL_STATIC_INLINE struct regexp * @@ -67,7 +117,7 @@ S_SvREFCNT_dec(pTHX_ SV *sv) { if (LIKELY(sv != NULL)) { U32 rc = SvREFCNT(sv); - if (rc > 1) + if (LIKELY(rc > 1)) SvREFCNT(sv) = rc - 1; else Perl_sv_free2(aTHX_ sv, rc); @@ -78,7 +128,7 @@ PERL_STATIC_INLINE void S_SvREFCNT_dec_NN(pTHX_ SV *sv) { U32 rc = SvREFCNT(sv); - if (rc > 1) + if (LIKELY(rc > 1)) SvREFCNT(sv) = rc - 1; else Perl_sv_free2(aTHX_ sv, rc); @@ -121,10 +171,11 @@ S_SvPADSTALE_off(SV *sv) assert(SvFLAGS(sv) & SVs_PADMY); return SvFLAGS(sv) &= ~SVs_PADSTALE; } -#ifdef PERL_CORE +#if defined(PERL_CORE) || defined (PERL_EXT) PERL_STATIC_INLINE STRLEN S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) { + PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B; if (SvGAMAGIC(sv)) { U8 *hopped = utf8_hop((U8 *)pv, pos); if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped); @@ -134,10 +185,89 @@ S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) } #endif +/* ------------------------------- handy.h ------------------------------- */ + +/* saves machine code for a common noreturn idiom typically used in Newx*() */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#endif +static void +S_croak_memory_wrap(void) +{ + Perl_croak_nocontext("%s",PL_memory_wrap); +} +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#ifdef BOOTSTRAP_CHARSET +static bool +S_bootstrap_ctype(U8 character, UV classnum, bool full_Latin1) +{ + /* See comments in handy.h. This is placed in this file primarily to avoid + * having to have an entry for it in embed.fnc */ + + dTHX; + + if (! full_Latin1 && ! isASCII(character)) { + return FALSE; + } + + switch (classnum) { + case _CC_ALPHANUMERIC: return isALPHANUMERIC_L1(character); + case _CC_ALPHA: return isALPHA_L1(character); + case _CC_ASCII: return isASCII_L1(character); + case _CC_BLANK: return isBLANK_L1(character); + case _CC_CASED: return isLOWER_L1(character) + || isUPPER_L1(character); + case _CC_CNTRL: return isCNTRL_L1(character); + case _CC_DIGIT: return isDIGIT_L1(character); + case _CC_GRAPH: return isGRAPH_L1(character); + case _CC_LOWER: return isLOWER_L1(character); + case _CC_PRINT: return isPRINT_L1(character); + case _CC_PSXSPC: return isPSXSPC_L1(character); + case _CC_PUNCT: return isPUNCT_L1(character); + case _CC_SPACE: return isSPACE_L1(character); + case _CC_UPPER: return isUPPER_L1(character); + case _CC_WORDCHAR: return isWORDCHAR_L1(character); + case _CC_XDIGIT: return isXDIGIT_L1(character); + case _CC_VERTSPACE: return isSPACE_L1(character) && ! isBLANK_L1(character); + case _CC_IDFIRST: return isIDFIRST_L1(character); + case _CC_QUOTEMETA: return _isQUOTEMETA(character); + case _CC_CHARNAME_CONT: return isCHARNAME_CONT(character); + case _CC_NONLATIN1_FOLD: return _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(character); + case _CC_NON_FINAL_FOLD: return _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(character); + case _CC_IS_IN_SOME_FOLD: return _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(character); + case _CC_BACKSLASH_FOO_LBRACE_IS_META: return 0; + + + default: break; + } + Perl_croak(aTHX_ "panic: bootstrap_ctype() has an unexpected character class '%" UVxf "'", classnum); +} +#endif + /* ------------------------------- utf8.h ------------------------------- */ -/* These exist only to replace the macros they formerly were so that their use - * can be deprecated */ +PERL_STATIC_INLINE void +S_append_utf8_from_native_byte(const U8 byte, U8** dest) +{ + /* Takes an input 'byte' (Latin1 or EBCDIC) and appends it to the UTF-8 + * encoded string at '*dest', updating '*dest' to include it */ + + PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE; + + if (NATIVE_BYTE_IS_INVARIANT(byte)) + *(*dest)++ = byte; + else { + *(*dest)++ = UTF8_EIGHT_BIT_HI(byte); + *(*dest)++ = UTF8_EIGHT_BIT_LO(byte); + } +} + +/* These two exist only to replace the macros they formerly were so that their + * use can be deprecated */ PERL_STATIC_INLINE bool S_isIDFIRST_lazy(pTHX_ const char* p) @@ -154,3 +284,50 @@ S_isALNUM_lazy(pTHX_ const char* p) return isALNUM_lazy_if(p,1); } + +/* ------------------------------- perl.h ----------------------------- */ + +/* +=for apidoc AiR|bool|is_safe_syscall|const char *pv|STRLEN len|const char *what|const char *op_name + +Test that the given C doesn't contain any internal C characters. +If it does, set C to ENOENT, optionally warn, and return FALSE. + +Return TRUE if the name is safe. + +Used by the IS_SAFE_SYSCALL() macro. + +=cut +*/ + +PERL_STATIC_INLINE bool +S_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name) { + /* While the Windows CE API provides only UCS-16 (or UTF-16) APIs + * perl itself uses xce*() functions which accept 8-bit strings. + */ + + PERL_ARGS_ASSERT_IS_SAFE_SYSCALL; + + if (pv && len > 1) { + char *null_at; + if (UNLIKELY((null_at = (char *)memchr(pv, 0, len-1)) != NULL)) { + SETERRNO(ENOENT, LIB_INVARG); + Perl_ck_warner(aTHX_ packWARN(WARN_SYSCALLS), + "Invalid \\0 character in %s for %s: %s\\0%s", + what, op_name, pv, null_at+1); + return FALSE; + } + } + + return TRUE; +} + +/* + * Local variables: + * c-indentation-style: bsd + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * + * ex: set ts=8 sts=4 sw=4 et: + */ diff --git a/Master/tlpkg/tlperl/lib/CORE/intrpvar.h b/Master/tlpkg/tlperl/lib/CORE/intrpvar.h index d31b15e0aeb..08c4a382224 100644 --- a/Master/tlpkg/tlperl/lib/CORE/intrpvar.h +++ b/Master/tlpkg/tlperl/lib/CORE/intrpvar.h @@ -33,11 +33,7 @@ * Important ones in the first cache line (if alignment is done right) */ PERLVAR(I, stack_sp, SV **) /* top of the stack */ -#ifdef OP_IN_REGISTER -PERLVAR(I, opsave, OP *) -#else PERLVAR(I, op, OP *) /* currently executing op */ -#endif PERLVAR(I, curpad, SV **) /* active pad (lexicals+tmps) */ PERLVAR(I, stack_base, SV **) @@ -53,9 +49,9 @@ PERLVAR(I, scopestack_ix, I32) PERLVAR(I, scopestack_max, I32) PERLVAR(I, tmps_stack, SV **) /* mortals we've made */ -PERLVARI(I, tmps_ix, I32, -1) -PERLVARI(I, tmps_floor, I32, -1) -PERLVAR(I, tmps_max, I32) +PERLVARI(I, tmps_ix, SSize_t, -1) +PERLVARI(I, tmps_floor, SSize_t, -1) +PERLVAR(I, tmps_max, SSize_t) PERLVARI(I, sub_generation, U32, 1) /* incr to invalidate method cache */ @@ -80,6 +76,7 @@ PERLVAR(I, tainted, bool) /* using variables controlled by $< */ PERLVAR(I, delaymagic, U16) /* ($<,$>) = ... */ PERLVAR(I, localizing, U8) /* are we processing a local() list? */ PERLVAR(I, in_eval, U8) /* trap "fatal" errors? */ +PERLVAR(I, defgv, GV *) /* the *_ glob */ /* =for apidoc mn|bool|PL_dowarn @@ -113,16 +110,18 @@ PERLVAR(I, mainstack, AV *) /* the stack when nothing funny is /* memory management */ PERLVAR(I, sv_count, IV) /* how many SV* are currently allocated */ PERLVAR(I, sv_objcount, IV) /* DEPRECATED AND UNMAINTAINED. - * Will be removed in Perl 5.20. + * Will be removed in Perl 5.22. * Used to be: how many objects are currently allocated. */ PERLVAR(I, sv_root, SV *) /* storage for SVs belonging to interp */ PERLVAR(I, sv_arenaroot, SV *) /* list of areas for garbage collection */ -PERLVAR(I, reg_state, struct re_save_state) +/* fake PMOP that PL_curpm points to while in (?{}) so $1 et al are visible */ +PERLVARI(I, reg_curpm, PMOP*, NULL) /* the currently active slab in a chain of slabs of regmatch states, - * and the currently active state within that slab */ + * and the currently active state within that slab. This stack of states + * is shared amongst re-entrant calls to the regex engine */ PERLVARI(I, regmatch_slab, regmatch_slab *, NULL) PERLVAR(I, regmatch_state, regmatch_state *) @@ -175,6 +174,7 @@ PERLVAR(I, statgv, GV *) PERLVARI(I, statname, SV *, NULL) #ifdef HAS_TIMES +/* Will be removed soon after v5.21.0. See RT #121351 */ PERLVAR(I, timesbuf, struct tms) #endif @@ -185,7 +185,7 @@ The input record separator - C<$/> in Perl space. =for apidoc mn|GV*|PL_last_in_gv -The GV which was last used for a filehandle input operation. (C<< >>) +The GV which was last used for a filehandle input operation. (C<< >>) =for apidoc mn|GV*|PL_ofsgv @@ -226,16 +226,15 @@ PERLVAR(I, secondgv, GV *) /* $b */ PERLVAR(I, efloatbuf, char *) PERLVAR(I, efloatsize, STRLEN) -PERLVAR(I, regdummy, regnode) /* from regcomp.c */ - PERLVARI(I, dumpindent, U16, 4) /* number of blanks per dump indentation level */ PERLVAR(I, exit_flags, U8) /* was exit() unexpected, etc. */ PERLVAR(I, utf8locale, bool) /* utf8 locale detected */ +PERLVAR(I, in_utf8_CTYPE_locale, bool) -PERLVARA(I, colors,6, char *) /* from regcomp.c */ +PERLVARA(I, colors,6, char *) /* values from PERL_RE_COLORS env var */ /* =for apidoc Amn|peep_t|PL_peepp @@ -352,7 +351,6 @@ PERLVAR(I, psig_pend, int *) /* per-signal "count" of pending */ /* shortcuts to various I/O objects */ PERLVAR(I, stdingv, GV *) /* *STDIN */ PERLVAR(I, stderrgv, GV *) /* *STDERR */ -PERLVAR(I, defgv, GV *) PERLVAR(I, argvgv, GV *) /* *ARGV */ PERLVAR(I, argvoutgv, GV *) /* *ARGVOUT */ PERLVAR(I, argvout_stack, AV *) @@ -540,8 +538,6 @@ PERLVAR(I, padix, I32) /* max used index in current "register" pad */ PERLVAR(I, padix_floor, I32) /* how low may inner block reset padix */ -PERLVAR(I, hints, U32) /* pragma-tic compile-time flags */ - #ifdef USE_LOCALE_COLLATE PERLVAR(I, collation_name, char *) /* Name of current collation */ PERLVAR(I, collxfrm_base, Size_t) /* Basic overhead in *xfrm() */ @@ -556,7 +552,7 @@ PERLVAR(I, sawampersand, U8) /* must save all match strings */ #endif PERLVAR(I, unsafe, bool) -PERLVAR(I, colorset, bool) /* from regcomp.c */ +PERLVAR(I, colorset, bool) /* PERL_RE_COLORS env var is in use */ /* current phase the interpreter is in for ordering this structure to remove holes, we're assuming that this is 4 @@ -582,8 +578,8 @@ PERLVAR(I, numeric_radix_sv, SV *) /* The radix separator if not '.' */ #endif /* !USE_LOCALE_NUMERIC */ /* Unicode inversion lists */ -PERLVAR(I, ASCII, SV *) PERLVAR(I, Latin1, SV *) +PERLVAR(I, UpperLatin1, SV *) /* Code points 128 - 255 */ PERLVAR(I, AboveLatin1, SV *) PERLVAR(I, NonL1NonFinalFold, SV *) @@ -602,7 +598,6 @@ PERLVAR(I, utf8_charname_continue, SV *) PERLVARA(I, utf8_swash_ptrs, POSIX_SWASH_COUNT, SV *) PERLVARA(I, Posix_ptrs, POSIX_CC_COUNT, SV *) -PERLVARA(I, L1Posix_ptrs, POSIX_CC_COUNT, SV *) PERLVARA(I, XPosix_ptrs, POSIX_CC_COUNT, SV *) PERLVAR(I, last_swash_hv, HV *) @@ -741,7 +736,7 @@ PERLVAR(I, debug_pad, struct perl_debug_pad) /* always needed because of the re /* Hook for File::Glob */ PERLVARI(I, globhook, globhook_t, NULL) -/* The last unconditional member of the interpreter structure when 5.18.2 was +/* The last unconditional member of the interpreter structure when 5.20.2 was released. The offset of the end of this is baked into a global variable in any shared perl library which will allow a sanity test in future perl releases. */ @@ -775,6 +770,19 @@ PERLVARI(I, xmlfp, PerlIO *, NULL) PERLVARI(I, sv_serial, U32, 0) /* SV serial number, used in sv.c */ #endif +PERLVARA(I, sv_consts, SV_CONSTS_COUNT, SV*) /* constant SVs with precomputed hash value */ + +#ifdef PERL_TRACE_OPS +PERLVARA(I, op_exec_cnt, OP_max+2, UV) /* Counts of executed OPs of the given type. + If PERL_TRACE_OPS is enabled, we'll dump + a summary count of all ops executed in the + program at perl_destruct time. For + profiling/debugging only. Works only if + DEBUGGING is enabled, too. */ +#endif + +PERLVAR(I, random_state, PL_RANDOM_STATE_TYPE) + /* If you are adding a U8 or U16, check to see if there are 'Space' comments * above on where there are gaps which currently will be structure padding. */ diff --git a/Master/tlpkg/tlperl/lib/CORE/iperlsys.h b/Master/tlpkg/tlperl/lib/CORE/iperlsys.h index b23f4d3eb29..003405f690f 100644 --- a/Master/tlpkg/tlperl/lib/CORE/iperlsys.h +++ b/Master/tlpkg/tlperl/lib/CORE/iperlsys.h @@ -933,10 +933,10 @@ typedef int (*LPProcExecv)(struct IPerlProc*, const char*, const char*const*); typedef int (*LPProcExecvp)(struct IPerlProc*, const char*, const char*const*); -typedef uid_t (*LPProcGetuid)(struct IPerlProc*); -typedef uid_t (*LPProcGeteuid)(struct IPerlProc*); -typedef gid_t (*LPProcGetgid)(struct IPerlProc*); -typedef gid_t (*LPProcGetegid)(struct IPerlProc*); +typedef Uid_t (*LPProcGetuid)(struct IPerlProc*); +typedef Uid_t (*LPProcGeteuid)(struct IPerlProc*); +typedef Gid_t (*LPProcGetgid)(struct IPerlProc*); +typedef Gid_t (*LPProcGetegid)(struct IPerlProc*); typedef char* (*LPProcGetlogin)(struct IPerlProc*); typedef int (*LPProcKill)(struct IPerlProc*, int, int); typedef int (*LPProcKillpg)(struct IPerlProc*, int, int); diff --git a/Master/tlpkg/tlperl/lib/CORE/keywords.h b/Master/tlpkg/tlperl/lib/CORE/keywords.h index 5ebde874ff7..f23896c4106 100644 --- a/Master/tlpkg/tlperl/lib/CORE/keywords.h +++ b/Master/tlpkg/tlperl/lib/CORE/keywords.h @@ -23,253 +23,252 @@ #define KEY_AUTOLOAD 7 #define KEY_BEGIN 8 #define KEY_UNITCHECK 9 -#define KEY_CORE 10 -#define KEY_DESTROY 11 -#define KEY_END 12 -#define KEY_INIT 13 -#define KEY_CHECK 14 -#define KEY_abs 15 -#define KEY_accept 16 -#define KEY_alarm 17 -#define KEY_and 18 -#define KEY_atan2 19 -#define KEY_bind 20 -#define KEY_binmode 21 -#define KEY_bless 22 -#define KEY_break 23 -#define KEY_caller 24 -#define KEY_chdir 25 -#define KEY_chmod 26 -#define KEY_chomp 27 -#define KEY_chop 28 -#define KEY_chown 29 -#define KEY_chr 30 -#define KEY_chroot 31 -#define KEY_close 32 -#define KEY_closedir 33 -#define KEY_cmp 34 -#define KEY_connect 35 -#define KEY_continue 36 -#define KEY_cos 37 -#define KEY_crypt 38 -#define KEY_dbmclose 39 -#define KEY_dbmopen 40 -#define KEY_default 41 -#define KEY_defined 42 -#define KEY_delete 43 -#define KEY_die 44 -#define KEY_do 45 -#define KEY_dump 46 -#define KEY_each 47 -#define KEY_else 48 -#define KEY_elsif 49 -#define KEY_endgrent 50 -#define KEY_endhostent 51 -#define KEY_endnetent 52 -#define KEY_endprotoent 53 -#define KEY_endpwent 54 -#define KEY_endservent 55 -#define KEY_eof 56 -#define KEY_eq 57 -#define KEY_eval 58 -#define KEY_evalbytes 59 -#define KEY_exec 60 -#define KEY_exists 61 -#define KEY_exit 62 -#define KEY_exp 63 -#define KEY_fc 64 -#define KEY_fcntl 65 -#define KEY_fileno 66 -#define KEY_flock 67 -#define KEY_for 68 -#define KEY_foreach 69 -#define KEY_fork 70 -#define KEY_format 71 -#define KEY_formline 72 -#define KEY_ge 73 -#define KEY_getc 74 -#define KEY_getgrent 75 -#define KEY_getgrgid 76 -#define KEY_getgrnam 77 -#define KEY_gethostbyaddr 78 -#define KEY_gethostbyname 79 -#define KEY_gethostent 80 -#define KEY_getlogin 81 -#define KEY_getnetbyaddr 82 -#define KEY_getnetbyname 83 -#define KEY_getnetent 84 -#define KEY_getpeername 85 -#define KEY_getpgrp 86 -#define KEY_getppid 87 -#define KEY_getpriority 88 -#define KEY_getprotobyname 89 -#define KEY_getprotobynumber 90 -#define KEY_getprotoent 91 -#define KEY_getpwent 92 -#define KEY_getpwnam 93 -#define KEY_getpwuid 94 -#define KEY_getservbyname 95 -#define KEY_getservbyport 96 -#define KEY_getservent 97 -#define KEY_getsockname 98 -#define KEY_getsockopt 99 -#define KEY_given 100 -#define KEY_glob 101 -#define KEY_gmtime 102 -#define KEY_goto 103 -#define KEY_grep 104 -#define KEY_gt 105 -#define KEY_hex 106 -#define KEY_if 107 -#define KEY_index 108 -#define KEY_int 109 -#define KEY_ioctl 110 -#define KEY_join 111 -#define KEY_keys 112 -#define KEY_kill 113 -#define KEY_last 114 -#define KEY_lc 115 -#define KEY_lcfirst 116 -#define KEY_le 117 -#define KEY_length 118 -#define KEY_link 119 -#define KEY_listen 120 -#define KEY_local 121 -#define KEY_localtime 122 -#define KEY_lock 123 -#define KEY_log 124 -#define KEY_lstat 125 -#define KEY_lt 126 -#define KEY_m 127 -#define KEY_map 128 -#define KEY_mkdir 129 -#define KEY_msgctl 130 -#define KEY_msgget 131 -#define KEY_msgrcv 132 -#define KEY_msgsnd 133 -#define KEY_my 134 -#define KEY_ne 135 -#define KEY_next 136 -#define KEY_no 137 -#define KEY_not 138 -#define KEY_oct 139 -#define KEY_open 140 -#define KEY_opendir 141 -#define KEY_or 142 -#define KEY_ord 143 -#define KEY_our 144 -#define KEY_pack 145 -#define KEY_package 146 -#define KEY_pipe 147 -#define KEY_pop 148 -#define KEY_pos 149 -#define KEY_print 150 -#define KEY_printf 151 -#define KEY_prototype 152 -#define KEY_push 153 -#define KEY_q 154 -#define KEY_qq 155 -#define KEY_qr 156 -#define KEY_quotemeta 157 -#define KEY_qw 158 -#define KEY_qx 159 -#define KEY_rand 160 -#define KEY_read 161 -#define KEY_readdir 162 -#define KEY_readline 163 -#define KEY_readlink 164 -#define KEY_readpipe 165 -#define KEY_recv 166 -#define KEY_redo 167 -#define KEY_ref 168 -#define KEY_rename 169 -#define KEY_require 170 -#define KEY_reset 171 -#define KEY_return 172 -#define KEY_reverse 173 -#define KEY_rewinddir 174 -#define KEY_rindex 175 -#define KEY_rmdir 176 -#define KEY_s 177 -#define KEY_say 178 -#define KEY_scalar 179 -#define KEY_seek 180 -#define KEY_seekdir 181 -#define KEY_select 182 -#define KEY_semctl 183 -#define KEY_semget 184 -#define KEY_semop 185 -#define KEY_send 186 -#define KEY_setgrent 187 -#define KEY_sethostent 188 -#define KEY_setnetent 189 -#define KEY_setpgrp 190 -#define KEY_setpriority 191 -#define KEY_setprotoent 192 -#define KEY_setpwent 193 -#define KEY_setservent 194 -#define KEY_setsockopt 195 -#define KEY_shift 196 -#define KEY_shmctl 197 -#define KEY_shmget 198 -#define KEY_shmread 199 -#define KEY_shmwrite 200 -#define KEY_shutdown 201 -#define KEY_sin 202 -#define KEY_sleep 203 -#define KEY_socket 204 -#define KEY_socketpair 205 -#define KEY_sort 206 -#define KEY_splice 207 -#define KEY_split 208 -#define KEY_sprintf 209 -#define KEY_sqrt 210 -#define KEY_srand 211 -#define KEY_stat 212 -#define KEY_state 213 -#define KEY_study 214 -#define KEY_sub 215 -#define KEY_substr 216 -#define KEY_symlink 217 -#define KEY_syscall 218 -#define KEY_sysopen 219 -#define KEY_sysread 220 -#define KEY_sysseek 221 -#define KEY_system 222 -#define KEY_syswrite 223 -#define KEY_tell 224 -#define KEY_telldir 225 -#define KEY_tie 226 -#define KEY_tied 227 -#define KEY_time 228 -#define KEY_times 229 -#define KEY_tr 230 -#define KEY_truncate 231 -#define KEY_uc 232 -#define KEY_ucfirst 233 -#define KEY_umask 234 -#define KEY_undef 235 -#define KEY_unless 236 -#define KEY_unlink 237 -#define KEY_unpack 238 -#define KEY_unshift 239 -#define KEY_untie 240 -#define KEY_until 241 -#define KEY_use 242 -#define KEY_utime 243 -#define KEY_values 244 -#define KEY_vec 245 -#define KEY_wait 246 -#define KEY_waitpid 247 -#define KEY_wantarray 248 -#define KEY_warn 249 -#define KEY_when 250 -#define KEY_while 251 -#define KEY_write 252 -#define KEY_x 253 -#define KEY_xor 254 -#define KEY_y 255 +#define KEY_DESTROY 10 +#define KEY_END 11 +#define KEY_INIT 12 +#define KEY_CHECK 13 +#define KEY_abs 14 +#define KEY_accept 15 +#define KEY_alarm 16 +#define KEY_and 17 +#define KEY_atan2 18 +#define KEY_bind 19 +#define KEY_binmode 20 +#define KEY_bless 21 +#define KEY_break 22 +#define KEY_caller 23 +#define KEY_chdir 24 +#define KEY_chmod 25 +#define KEY_chomp 26 +#define KEY_chop 27 +#define KEY_chown 28 +#define KEY_chr 29 +#define KEY_chroot 30 +#define KEY_close 31 +#define KEY_closedir 32 +#define KEY_cmp 33 +#define KEY_connect 34 +#define KEY_continue 35 +#define KEY_cos 36 +#define KEY_crypt 37 +#define KEY_dbmclose 38 +#define KEY_dbmopen 39 +#define KEY_default 40 +#define KEY_defined 41 +#define KEY_delete 42 +#define KEY_die 43 +#define KEY_do 44 +#define KEY_dump 45 +#define KEY_each 46 +#define KEY_else 47 +#define KEY_elsif 48 +#define KEY_endgrent 49 +#define KEY_endhostent 50 +#define KEY_endnetent 51 +#define KEY_endprotoent 52 +#define KEY_endpwent 53 +#define KEY_endservent 54 +#define KEY_eof 55 +#define KEY_eq 56 +#define KEY_eval 57 +#define KEY_evalbytes 58 +#define KEY_exec 59 +#define KEY_exists 60 +#define KEY_exit 61 +#define KEY_exp 62 +#define KEY_fc 63 +#define KEY_fcntl 64 +#define KEY_fileno 65 +#define KEY_flock 66 +#define KEY_for 67 +#define KEY_foreach 68 +#define KEY_fork 69 +#define KEY_format 70 +#define KEY_formline 71 +#define KEY_ge 72 +#define KEY_getc 73 +#define KEY_getgrent 74 +#define KEY_getgrgid 75 +#define KEY_getgrnam 76 +#define KEY_gethostbyaddr 77 +#define KEY_gethostbyname 78 +#define KEY_gethostent 79 +#define KEY_getlogin 80 +#define KEY_getnetbyaddr 81 +#define KEY_getnetbyname 82 +#define KEY_getnetent 83 +#define KEY_getpeername 84 +#define KEY_getpgrp 85 +#define KEY_getppid 86 +#define KEY_getpriority 87 +#define KEY_getprotobyname 88 +#define KEY_getprotobynumber 89 +#define KEY_getprotoent 90 +#define KEY_getpwent 91 +#define KEY_getpwnam 92 +#define KEY_getpwuid 93 +#define KEY_getservbyname 94 +#define KEY_getservbyport 95 +#define KEY_getservent 96 +#define KEY_getsockname 97 +#define KEY_getsockopt 98 +#define KEY_given 99 +#define KEY_glob 100 +#define KEY_gmtime 101 +#define KEY_goto 102 +#define KEY_grep 103 +#define KEY_gt 104 +#define KEY_hex 105 +#define KEY_if 106 +#define KEY_index 107 +#define KEY_int 108 +#define KEY_ioctl 109 +#define KEY_join 110 +#define KEY_keys 111 +#define KEY_kill 112 +#define KEY_last 113 +#define KEY_lc 114 +#define KEY_lcfirst 115 +#define KEY_le 116 +#define KEY_length 117 +#define KEY_link 118 +#define KEY_listen 119 +#define KEY_local 120 +#define KEY_localtime 121 +#define KEY_lock 122 +#define KEY_log 123 +#define KEY_lstat 124 +#define KEY_lt 125 +#define KEY_m 126 +#define KEY_map 127 +#define KEY_mkdir 128 +#define KEY_msgctl 129 +#define KEY_msgget 130 +#define KEY_msgrcv 131 +#define KEY_msgsnd 132 +#define KEY_my 133 +#define KEY_ne 134 +#define KEY_next 135 +#define KEY_no 136 +#define KEY_not 137 +#define KEY_oct 138 +#define KEY_open 139 +#define KEY_opendir 140 +#define KEY_or 141 +#define KEY_ord 142 +#define KEY_our 143 +#define KEY_pack 144 +#define KEY_package 145 +#define KEY_pipe 146 +#define KEY_pop 147 +#define KEY_pos 148 +#define KEY_print 149 +#define KEY_printf 150 +#define KEY_prototype 151 +#define KEY_push 152 +#define KEY_q 153 +#define KEY_qq 154 +#define KEY_qr 155 +#define KEY_quotemeta 156 +#define KEY_qw 157 +#define KEY_qx 158 +#define KEY_rand 159 +#define KEY_read 160 +#define KEY_readdir 161 +#define KEY_readline 162 +#define KEY_readlink 163 +#define KEY_readpipe 164 +#define KEY_recv 165 +#define KEY_redo 166 +#define KEY_ref 167 +#define KEY_rename 168 +#define KEY_require 169 +#define KEY_reset 170 +#define KEY_return 171 +#define KEY_reverse 172 +#define KEY_rewinddir 173 +#define KEY_rindex 174 +#define KEY_rmdir 175 +#define KEY_s 176 +#define KEY_say 177 +#define KEY_scalar 178 +#define KEY_seek 179 +#define KEY_seekdir 180 +#define KEY_select 181 +#define KEY_semctl 182 +#define KEY_semget 183 +#define KEY_semop 184 +#define KEY_send 185 +#define KEY_setgrent 186 +#define KEY_sethostent 187 +#define KEY_setnetent 188 +#define KEY_setpgrp 189 +#define KEY_setpriority 190 +#define KEY_setprotoent 191 +#define KEY_setpwent 192 +#define KEY_setservent 193 +#define KEY_setsockopt 194 +#define KEY_shift 195 +#define KEY_shmctl 196 +#define KEY_shmget 197 +#define KEY_shmread 198 +#define KEY_shmwrite 199 +#define KEY_shutdown 200 +#define KEY_sin 201 +#define KEY_sleep 202 +#define KEY_socket 203 +#define KEY_socketpair 204 +#define KEY_sort 205 +#define KEY_splice 206 +#define KEY_split 207 +#define KEY_sprintf 208 +#define KEY_sqrt 209 +#define KEY_srand 210 +#define KEY_stat 211 +#define KEY_state 212 +#define KEY_study 213 +#define KEY_sub 214 +#define KEY_substr 215 +#define KEY_symlink 216 +#define KEY_syscall 217 +#define KEY_sysopen 218 +#define KEY_sysread 219 +#define KEY_sysseek 220 +#define KEY_system 221 +#define KEY_syswrite 222 +#define KEY_tell 223 +#define KEY_telldir 224 +#define KEY_tie 225 +#define KEY_tied 226 +#define KEY_time 227 +#define KEY_times 228 +#define KEY_tr 229 +#define KEY_truncate 230 +#define KEY_uc 231 +#define KEY_ucfirst 232 +#define KEY_umask 233 +#define KEY_undef 234 +#define KEY_unless 235 +#define KEY_unlink 236 +#define KEY_unpack 237 +#define KEY_unshift 238 +#define KEY_untie 239 +#define KEY_until 240 +#define KEY_use 241 +#define KEY_utime 242 +#define KEY_values 243 +#define KEY_vec 244 +#define KEY_wait 245 +#define KEY_waitpid 246 +#define KEY_wantarray 247 +#define KEY_warn 248 +#define KEY_when 249 +#define KEY_while 250 +#define KEY_write 251 +#define KEY_x 252 +#define KEY_xor 253 +#define KEY_y 254 /* Generated from: - * e5a540774760ea54c761ef17ee4a153cc264e9a700b817d561e390730c457406 regen/keywords.pl + * 7c6d47fd2890b2422a40331ec90eac08f9808209b01f2b9c113141410fea91b5 regen/keywords.pl * ex: set ro: */ diff --git a/Master/tlpkg/tlperl/lib/CORE/libperl518.a b/Master/tlpkg/tlperl/lib/CORE/libperl518.a deleted file mode 100755 index ad9154cfd61..00000000000 Binary files a/Master/tlpkg/tlperl/lib/CORE/libperl518.a and /dev/null differ diff --git a/Master/tlpkg/tlperl/lib/CORE/libperl520.a b/Master/tlpkg/tlperl/lib/CORE/libperl520.a new file mode 100644 index 00000000000..7ceb92ba676 Binary files /dev/null and b/Master/tlpkg/tlperl/lib/CORE/libperl520.a differ diff --git a/Master/tlpkg/tlperl/lib/CORE/mg.h b/Master/tlpkg/tlperl/lib/CORE/mg.h index 995bc5eb1ab..81ed296f8a2 100644 --- a/Master/tlpkg/tlperl/lib/CORE/mg.h +++ b/Master/tlpkg/tlperl/lib/CORE/mg.h @@ -8,9 +8,6 @@ * */ -#ifdef STRUCT_MGVTBL_DEFINITION -STRUCT_MGVTBL_DEFINITION; -#else struct mgvtbl { int (*svt_get) (pTHX_ SV *sv, MAGIC* mg); int (*svt_set) (pTHX_ SV *sv, MAGIC* mg); @@ -22,7 +19,6 @@ struct mgvtbl { int (*svt_dup) (pTHX_ MAGIC *mg, CLONE_PARAMS *param); int (*svt_local)(pTHX_ SV *nsv, MAGIC *mg); }; -#endif struct magic { MAGIC* mg_moremagic; @@ -30,7 +26,7 @@ struct magic { U16 mg_private; char mg_type; U8 mg_flags; - I32 mg_len; + SSize_t mg_len; SV* mg_obj; char* mg_ptr; }; @@ -42,6 +38,7 @@ struct magic { #define MGf_COPY 8 /* has an svt_copy MGVTBL entry */ #define MGf_DUP 0x10 /* has an svt_dup MGVTBL entry */ #define MGf_LOCAL 0x20 /* has an svt_local MGVTBL entry */ +#define MGf_BYTES 0x40 /* PERL_MAGIC_regex_global only */ #define MgTAINTEDDIR(mg) (mg->mg_flags & MGf_TAINTEDDIR) #define MgTAINTEDDIR_on(mg) (mg->mg_flags |= MGf_TAINTEDDIR) @@ -61,6 +58,19 @@ struct magic { #define SvTIED_obj(sv,mg) \ ((mg)->mg_obj ? (mg)->mg_obj : sv_2mortal(newRV(sv))) +#if defined(PERL_CORE) || defined(PERL_EXT) +# define MgBYTEPOS(mg,sv,pv,len) S_MgBYTEPOS(aTHX_ mg,sv,pv,len) +/* assumes get-magic and stringification have already occurred */ +# define MgBYTEPOS_set(mg,sv,pv,off) ( \ + assert_((mg)->mg_type == PERL_MAGIC_regex_global) \ + SvPOK(sv) && !SvGMAGICAL(sv) \ + ? (mg)->mg_len = (off), (mg)->mg_flags |= MGf_BYTES \ + : ((mg)->mg_len = DO_UTF8(sv) \ + ? (SSize_t)utf8_length((U8 *)(pv), (U8 *)(pv)+(off)) \ + : (SSize_t)(off), \ + (mg)->mg_flags &= ~MGf_BYTES)) +#endif + #define whichsig(pv) whichsig_pv(pv) /* diff --git a/Master/tlpkg/tlperl/lib/CORE/mg_data.h b/Master/tlpkg/tlperl/lib/CORE/mg_data.h index 23645abef46..1a7670bc6cd 100644 --- a/Master/tlpkg/tlperl/lib/CORE/mg_data.h +++ b/Master/tlpkg/tlperl/lib/CORE/mg_data.h @@ -145,7 +145,7 @@ /* tiedscalar 'q' Tied scalar or handle */ want_vtbl_packelem, /* qr 'r' precompiled qr// regex */ - want_vtbl_regexp | PERL_MAGIC_VALUE_MAGIC, + want_vtbl_regexp | PERL_MAGIC_READONLY_ACCEPTABLE | PERL_MAGIC_VALUE_MAGIC, /* sigelem 's' %SIG hash element */ want_vtbl_sigelem, /* taint 't' Taintedness */ diff --git a/Master/tlpkg/tlperl/lib/CORE/mg_raw.h b/Master/tlpkg/tlperl/lib/CORE/mg_raw.h index 487e209da1f..f508ad0e572 100644 --- a/Master/tlpkg/tlperl/lib/CORE/mg_raw.h +++ b/Master/tlpkg/tlperl/lib/CORE/mg_raw.h @@ -60,7 +60,7 @@ "/* tiedelem 'p' Tied array or hash element */" }, { 'q', "want_vtbl_packelem", "/* tiedscalar 'q' Tied scalar or handle */" }, - { 'r', "want_vtbl_regexp | PERL_MAGIC_VALUE_MAGIC", + { 'r', "want_vtbl_regexp | PERL_MAGIC_READONLY_ACCEPTABLE | PERL_MAGIC_VALUE_MAGIC", "/* qr 'r' precompiled qr// regex */" }, { 'S', "magic_vtable_max", "/* sig 'S' %SIG hash */" }, diff --git a/Master/tlpkg/tlperl/lib/CORE/op.h b/Master/tlpkg/tlperl/lib/CORE/op.h index 7c5030dde70..9d9dd58d8fa 100644 --- a/Master/tlpkg/tlperl/lib/CORE/op.h +++ b/Master/tlpkg/tlperl/lib/CORE/op.h @@ -23,7 +23,8 @@ * op_static tell op_free() to skip PerlMemShared_free(), when * !op_slabbed. * op_savefree on savestack via SAVEFREEOP - * op_spare Three spare bits + * op_folded Result/remainder of a constant fold operation. + * op_spare Two spare bits * op_flags Flags common to all operations. See OPf_* below. * op_private Flags peculiar to a particular operation (BUT, * by default, set to the number of children until @@ -56,7 +57,8 @@ typedef PERL_BITFIELD16 Optype; PERL_BITFIELD16 op_slabbed:1; \ PERL_BITFIELD16 op_savefree:1; \ PERL_BITFIELD16 op_static:1; \ - PERL_BITFIELD16 op_spare:3; \ + PERL_BITFIELD16 op_folded:1; \ + PERL_BITFIELD16 op_spare:2; \ U8 op_flags; \ U8 op_private; #endif @@ -78,7 +80,7 @@ typedef PERL_BITFIELD16 Optype; =for apidoc Amn|U32|GIMME_V The XSUB-writer's equivalent to Perl's C. Returns C, C or C for void, scalar or list context, -respectively. See L for a usage example. +respectively. See L for a usage example. =for apidoc Amn|U32|GIMME A backward-compatible version of C which can only return @@ -141,6 +143,7 @@ Deprecated. Use C instead. - After ck_glob, use Perl glob function */ /* On OP_PADRANGE, push @_ */ + /* On OP_DUMP, has no label */ /* old names; don't use in new code, but don't break them, either */ #define OPf_LIST OPf_WANT_LIST @@ -169,6 +172,9 @@ Deprecated. Use C instead. /* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */ #define OPpREFCOUNTED 64 /* op_targ carries a refcount */ +/* Private for OP_LEAVE and OP_LEAVELOOP */ +#define OPpLVALUE 128 /* Do not copy return value */ + /* Private for OP_AASSIGN */ #define OPpASSIGN_COMMON 64 /* Left & right have syms in common. */ @@ -199,12 +205,38 @@ Deprecated. Use C instead. #define OPpDEREF_HV 64 /* Want ref to HV. */ #define OPpDEREF_SV (32|64) /* Want ref to SV. */ +/* OP_ENTERSUB and OP_RV2CV flags + +Flags are set on entersub and rv2cv in three phases: + parser - the parser passes the flag to the op constructor + check - the check routine called by the op constructor sets the flag + context - application of scalar/ref/lvalue context applies the flag + +In the third stage, an entersub op might turn into an rv2cv op (undef &foo, +\&foo, lock &foo, exists &foo, defined &foo). The two places where that +happens (op_lvalue_flags and doref in op.c) need to make sure the flags do +not conflict. Flags applied in the context phase are only set when there +is no conversion of op type. + + bit entersub flag phase rv2cv flag phase + --- ------------- ----- ---------- ----- + 1 OPpENTERSUB_INARGS context OPpMAY_RETURN_CONSTANT context + 2 HINT_STRICT_REFS check HINT_STRICT_REFS check + 4 OPpENTERSUB_HASTARG check + 8 OPpENTERSUB_AMPER parser + 16 OPpENTERSUB_DB check + 32 OPpDEREF_AV context + 64 OPpDEREF_HV context + 128 OPpLVAL_INTRO context OPpENTERSUB_NOPAREN parser + +*/ + /* OP_ENTERSUB only */ #define OPpENTERSUB_DB 16 /* Debug subroutine. */ #define OPpENTERSUB_HASTARG 4 /* Called from OP tree. */ #define OPpENTERSUB_INARGS 1 /* Lval used as arg to a sub. */ /* used by OPpDEREF (32|64) */ -/* used by HINT_STRICT_SUBS 2 */ +/* used by HINT_STRICT_REFS 2 */ /* Mask for OP_ENTERSUB flags, the absence of which must be propagated in dynamic context */ #define OPpENTERSUB_LVAL_MASK (OPpLVAL_INTRO|OPpENTERSUB_INARGS) @@ -218,6 +250,8 @@ Deprecated. Use C instead. #define OPpEARLY_CV 32 /* foo() called before sub foo was parsed */ /* OP_?ELEM only */ #define OPpLVAL_DEFER 16 /* Defer creation of array/hash elem */ + /* OP_RV2[AH]V OP_[AH]SLICE */ +#define OPpSLICEWARNING 4 /* warn about @hash{$scalar} */ /* OP_RV2[SAH]V, OP_GVSV, OP_ENTERITER only */ #define OPpOUR_INTRO 16 /* Variable was in an our() */ /* OP_RV2[AGH]V, OP_PAD[AH]V, OP_[AH]ELEM, OP_[AH]SLICE OP_AV2ARYLEN, @@ -257,7 +291,6 @@ Deprecated. Use C instead. #define OPpCONST_STRICT 8 /* bareword subject to strict 'subs' */ #define OPpCONST_ENTERED 16 /* Has been entered as symbol. */ #define OPpCONST_BARE 64 /* Was a bare word (filehandle?). */ -#define OPpCONST_FOLDED 128 /* Result of constant folding */ /* Private for OP_FLIP/FLOP */ #define OPpFLIP_LINENUM 64 /* Range arg potentially a line num. */ @@ -290,9 +323,13 @@ Deprecated. Use C instead. #define OPpOPEN_OUT_RAW 64 /* binmode(F,":raw") on output fh */ #define OPpOPEN_OUT_CRLF 128 /* binmode(F,":crlf") on output fh */ -/* Private for OP_EXIT, HUSH also for OP_DIE */ -#define OPpHUSH_VMSISH 64 /* hush DCL exit msg vmsish mode*/ -#define OPpEXIT_VMSISH 128 /* exit(0) vs. exit(1) vmsish mode*/ +/* Private for COPs */ +#define OPpHUSH_VMSISH 32 /* hush DCL exit msg vmsish mode*/ +/* Note: Used for NATIVE_HINTS (shifted from the values in PL_hints), + currently defined by vms/vmsish.h: + 64 + 128 + */ /* Private for OP_FTXXX */ #define OPpFT_ACCESS 2 /* use filetest 'access' */ @@ -324,6 +361,9 @@ Deprecated. Use C instead. /* Private for OP_(LAST|REDO|NEXT|GOTO|DUMP) */ #define OPpPV_IS_UTF8 128 /* label is in UTF8 */ +/* Private for OP_SPLIT */ +#define OPpSPLIT_IMPLIM 128 /* implicit limit */ + struct op { BASEOP }; @@ -356,7 +396,7 @@ struct pmop { OP * op_first; OP * op_last; #ifdef USE_ITHREADS - IV op_pmoffset; + PADOFFSET op_pmoffset; #else REGEXP * op_pmregexp; /* compiled expression */ #endif @@ -655,7 +695,7 @@ struct loop { #define PERL_LOADMOD_NOIMPORT 0x2 /* use Module () */ #define PERL_LOADMOD_IMPORT_OPS 0x4 /* use Module (...) */ -#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) +#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C) #define ref(o, type) doref(o, type, TRUE) #endif @@ -664,9 +704,9 @@ struct loop { =for apidoc Am|OP*|LINKLIST|OP *o Given the root of an optree, link the tree in execution order using the -C pointers and return the first op executed. If this has +C pointers and return the first op executed. If this has already been done, it will not be redone, and C<< o->op_next >> will be -returned. If C<< o->op_next >> is not already set, I should be at +returned. If C<< o->op_next >> is not already set, I should be at least an C. =cut @@ -765,29 +805,29 @@ struct block_hooks { Return the BHK's flags. =for apidoc mx|void *|BhkENTRY|BHK *hk|which -Return an entry from the BHK structure. I is a preprocessor token -indicating which entry to return. If the appropriate flag is not set -this will return NULL. The type of the return value depends on which +Return an entry from the BHK structure. I is a preprocessor token +indicating which entry to return. If the appropriate flag is not set +this will return NULL. The type of the return value depends on which entry you ask for. =for apidoc Amx|void|BhkENTRY_set|BHK *hk|which|void *ptr Set an entry in the BHK structure, and set the flags to indicate it is -valid. I is a preprocessing token indicating which entry to set. +valid. I is a preprocessing token indicating which entry to set. The type of I depends on the entry. =for apidoc Amx|void|BhkDISABLE|BHK *hk|which Temporarily disable an entry in this BHK structure, by clearing the -appropriate flag. I is a preprocessor token indicating which +appropriate flag. I is a preprocessor token indicating which entry to disable. =for apidoc Amx|void|BhkENABLE|BHK *hk|which Re-enable an entry in this BHK structure, by setting the appropriate -flag. I is a preprocessor token indicating which entry to enable. +flag. I is a preprocessor token indicating which entry to enable. This will assert (under -DDEBUGGING) if the entry doesn't contain a valid pointer. =for apidoc mx|void|CALL_BLOCK_HOOKS|which|arg -Call all the registered block hooks for type I. I is a +Call all the registered block hooks for type I. I is a preprocessing token; the type of I depends on I. =cut @@ -823,8 +863,8 @@ preprocessing token; the type of I depends on I. #define CALL_BLOCK_HOOKS(which, arg) \ STMT_START { \ if (PL_blockhooks) { \ - I32 i; \ - for (i = av_len(PL_blockhooks); i >= 0; i--) { \ + SSize_t i; \ + for (i = av_tindex(PL_blockhooks); i >= 0; i--) { \ SV *sv = AvARRAY(PL_blockhooks)[i]; \ BHK *hk; \ \ @@ -858,14 +898,23 @@ preprocessing token; the type of I depends on I. Return the XOP's flags. =for apidoc Am||XopENTRY|XOP *xop|which -Return a member of the XOP structure. I is a cpp token indicating -which entry to return. If the member is not set this will return a -default value. The return type depends on I. +Return a member of the XOP structure. I is a cpp token +indicating which entry to return. If the member is not set +this will return a default value. The return type depends +on I. This macro evaluates its arguments more than +once. If you are using C to retreive a +C from a C, use the more efficient L instead. + +=for apidoc Am||XopENTRYCUSTOM|const OP *o|which +Exactly like C but more +efficient. The I parameter is identical to L. =for apidoc Am|void|XopENTRY_set|XOP *xop|which|value -Set a member of the XOP structure. I is a cpp token indicating -which entry to set. See L for details about -the available members and how they are used. +Set a member of the XOP structure. I is a cpp token +indicating which entry to set. See L +for details about the available members and how +they are used. This macro evaluates its argument +more than once. =for apidoc Am|void|XopDISABLE|XOP *xop|which Temporarily disable a member of the XOP, by clearing the appropriate flag. @@ -884,6 +933,17 @@ struct custom_op { void (*xop_peep)(pTHX_ OP *o, OP *oldop); }; +/* return value of Perl_custom_op_get_field, similar to void * then casting but + the U32 doesn't need truncation on 64 bit platforms in the caller, also + for easier macro writing */ +typedef union { + const char *xop_name; + const char *xop_desc; + U32 xop_class; + void (*xop_peep)(pTHX_ OP *o, OP *oldop); + XOP *xop_ptr; +} XOPRETANY; + #define XopFLAGS(xop) ((xop)->xop_flags) #define XOPf_xop_name 0x01 @@ -891,6 +951,15 @@ struct custom_op { #define XOPf_xop_class 0x04 #define XOPf_xop_peep 0x08 +/* used by Perl_custom_op_get_field for option checking */ +typedef enum { + XOPe_xop_ptr = 0, /* just get the XOP *, don't look inside it */ + XOPe_xop_name = XOPf_xop_name, + XOPe_xop_desc = XOPf_xop_desc, + XOPe_xop_class = XOPf_xop_class, + XOPe_xop_peep = XOPf_xop_peep +} xop_flags_enum; + #define XOPd_xop_name PL_op_name[OP_CUSTOM] #define XOPd_xop_desc PL_op_desc[OP_CUSTOM] #define XOPd_xop_class OA_BASEOP @@ -905,6 +974,9 @@ struct custom_op { #define XopENTRY(xop, which) \ ((XopFLAGS(xop) & XOPf_ ## which) ? (xop)->which : XOPd_ ## which) +#define XopENTRYCUSTOM(o, which) \ + (Perl_custom_op_get_field(aTHX_ o, XOPe_ ## which).which) + #define XopDISABLE(xop, which) ((xop)->xop_flags &= ~XOPf_ ## which) #define XopENABLE(xop, which) \ STMT_START { \ @@ -912,11 +984,14 @@ struct custom_op { assert(XopENTRY(xop, which)); \ } STMT_END +#define Perl_custom_op_xop(x) \ + (Perl_custom_op_get_field(x, XOPe_xop_ptr).xop_ptr) + /* =head1 Optree Manipulation Functions =for apidoc Am|const char *|OP_NAME|OP *o -Return the name of the provided OP. For core ops this looks up the name +Return the name of the provided OP. For core ops this looks up the name from the op_type; for custom ops from the op_ppaddr. =for apidoc Am|const char *|OP_DESC|OP *o @@ -924,26 +999,68 @@ Return a short description of the provided OP. =for apidoc Am|U32|OP_CLASS|OP *o Return the class of the provided OP: that is, which of the *OP -structures it uses. For core ops this currently gets the information out +structures it uses. For core ops this currently gets the information out of PL_opargs, which does not always accurately reflect the type used. For custom ops the type is returned from the registration, and it is up -to the registree to ensure it is accurate. The value returned will be +to the registree to ensure it is accurate. The value returned will be one of the OA_* constants from op.h. +=for apidoc Am|bool|OP_TYPE_IS|OP *o, Optype type +Returns true if the given OP is not a NULL pointer +and if it is of the given type. + +The negation of this macro, C is also available +as well as C and C which elide +the NULL pointer check. + +=for apidoc Am|bool|OP_TYPE_IS_OR_WAS|OP *o, Optype type +Returns true if the given OP is not a NULL pointer and +if it is of the given type or used to be before being +replaced by an OP of type OP_NULL. + +The negation of this macro, C +is also available as well as C +and C which elide +the NULL pointer check. + =cut */ #define OP_NAME(o) ((o)->op_type == OP_CUSTOM \ - ? XopENTRY(Perl_custom_op_xop(aTHX_ o), xop_name) \ + ? XopENTRYCUSTOM(o, xop_name) \ : PL_op_name[(o)->op_type]) #define OP_DESC(o) ((o)->op_type == OP_CUSTOM \ - ? XopENTRY(Perl_custom_op_xop(aTHX_ o), xop_desc) \ + ? XopENTRYCUSTOM(o, xop_desc) \ : PL_op_desc[(o)->op_type]) #define OP_CLASS(o) ((o)->op_type == OP_CUSTOM \ - ? XopENTRY(Perl_custom_op_xop(aTHX_ o), xop_class) \ + ? XopENTRYCUSTOM(o, xop_class) \ : (PL_opargs[(o)->op_type] & OA_CLASS_MASK)) -#define newSUB(f, o, p, b) Perl_newATTRSUB(aTHX_ (f), (o), (p), NULL, (b)) +#define OP_TYPE_IS(o, type) ((o) && (o)->op_type == (type)) +#define OP_TYPE_IS_NN(o, type) ((o)->op_type == (type)) +#define OP_TYPE_ISNT(o, type) ((o) && (o)->op_type != (type)) +#define OP_TYPE_ISNT_NN(o, type) ((o)->op_type != (type)) + +#define OP_TYPE_IS_OR_WAS_NN(o, type) \ + ( ((o)->op_type == OP_NULL \ + ? (o)->op_targ \ + : (o)->op_type) \ + == (type) ) + +#define OP_TYPE_IS_OR_WAS(o, type) \ + ( (o) && OP_TYPE_IS_OR_WAS_NN(o, type) ) + +#define OP_TYPE_ISNT_AND_WASNT_NN(o, type) \ + ( ((o)->op_type == OP_NULL \ + ? (o)->op_targ \ + : (o)->op_type) \ + != (type) ) + +#define OP_TYPE_ISNT_AND_WASNT(o, type) \ + ( (o) && OP_TYPE_ISNT_AND_WASNT_NN(o, type) ) + +#define newATTRSUB(f, o, p, a, b) Perl_newATTRSUB_x(aTHX_ f, o, p, a, b, FALSE) +#define newSUB(f, o, p, b) newATTRSUB((f), (o), (p), NULL, (b)) #ifdef PERL_MAD # define MAD_NULL 1 diff --git a/Master/tlpkg/tlperl/lib/CORE/opcode.h b/Master/tlpkg/tlperl/lib/CORE/opcode.h index 540dc0ba974..fbc3fe12ee8 100644 --- a/Master/tlpkg/tlperl/lib/CORE/opcode.h +++ b/Master/tlpkg/tlperl/lib/CORE/opcode.h @@ -280,6 +280,7 @@ EXTCONST char* const PL_op_name[] = { "aelemfast_lex", "aelem", "aslice", + "kvaslice", "aeach", "akeys", "avalues", @@ -291,6 +292,7 @@ EXTCONST char* const PL_op_name[] = { "rv2hv", "helem", "hslice", + "kvhslice", "unpack", "pack", "split", @@ -665,6 +667,7 @@ EXTCONST char* const PL_op_desc[] = { "constant lexical array element", "array element", "array slice", + "index/value array slice", "each on array", "keys on array", "values on array", @@ -676,6 +679,7 @@ EXTCONST char* const PL_op_desc[] = { "hash dereference", "hash element", "hash slice", + "key/value hash slice", "unpack", "pack", "split", @@ -1064,6 +1068,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */ Perl_pp_aelemfast_lex, /* implemented by Perl_pp_aelemfast */ Perl_pp_aelem, Perl_pp_aslice, + Perl_pp_kvaslice, Perl_pp_aeach, Perl_pp_akeys, Perl_pp_avalues, /* implemented by Perl_pp_akeys */ @@ -1075,6 +1080,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */ Perl_pp_rv2hv, /* implemented by Perl_pp_rv2av */ Perl_pp_helem, Perl_pp_hslice, + Perl_pp_kvhslice, Perl_pp_unpack, Perl_pp_pack, Perl_pp_split, @@ -1351,7 +1357,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ Perl_ck_null, /* srefgen */ Perl_ck_fun, /* ref */ Perl_ck_fun, /* bless */ - Perl_ck_open, /* backtick */ + Perl_ck_backtick, /* backtick */ Perl_ck_glob, /* glob */ Perl_ck_readline, /* readline */ Perl_ck_null, /* rcatline */ @@ -1459,6 +1465,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ Perl_ck_null, /* aelemfast_lex */ Perl_ck_null, /* aelem */ Perl_ck_null, /* aslice */ + Perl_ck_null, /* kvaslice */ Perl_ck_each, /* aeach */ Perl_ck_each, /* akeys */ Perl_ck_each, /* avalues */ @@ -1470,6 +1477,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ Perl_ck_rvconst, /* rv2hv */ Perl_ck_null, /* helem */ Perl_ck_null, /* hslice */ + Perl_ck_null, /* kvhslice */ Perl_ck_fun, /* unpack */ Perl_ck_fun, /* pack */ Perl_ck_split, /* split */ @@ -1506,7 +1514,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ Perl_ck_null, /* leavesublv */ Perl_ck_fun, /* caller */ Perl_ck_fun, /* warn */ - Perl_ck_die, /* die */ + Perl_ck_fun, /* die */ Perl_ck_fun, /* reset */ Perl_ck_null, /* lineseq */ Perl_ck_null, /* nextstate */ @@ -1525,7 +1533,7 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ Perl_ck_null, /* redo */ Perl_ck_null, /* dump */ Perl_ck_null, /* goto */ - Perl_ck_exit, /* exit */ + Perl_ck_fun, /* exit */ Perl_ck_null, /* method_named */ Perl_ck_null, /* entergiven */ Perl_ck_null, /* leavegiven */ @@ -1848,6 +1856,7 @@ EXTCONST U32 PL_opargs[] = { 0x00013040, /* aelemfast_lex */ 0x00013204, /* aelem */ 0x00023401, /* aslice */ + 0x00023401, /* kvaslice */ 0x00003b00, /* aeach */ 0x00003b08, /* akeys */ 0x00003b08, /* avalues */ @@ -1856,9 +1865,10 @@ EXTCONST U32 PL_opargs[] = { 0x00004b08, /* keys */ 0x00001b00, /* delete */ 0x00001b04, /* exists */ - 0x00000148, /* rv2hv */ + 0x00000140, /* rv2hv */ 0x00014204, /* helem */ 0x00024401, /* hslice */ + 0x00024401, /* kvhslice */ 0x00091480, /* unpack */ 0x0002140f, /* pack */ 0x00111408, /* split */ diff --git a/Master/tlpkg/tlperl/lib/CORE/opnames.h b/Master/tlpkg/tlperl/lib/CORE/opnames.h index 5502ba4d15d..68ce927cd9e 100644 --- a/Master/tlpkg/tlperl/lib/CORE/opnames.h +++ b/Master/tlpkg/tlperl/lib/CORE/opnames.h @@ -146,255 +146,257 @@ typedef enum opcode { OP_AELEMFAST_LEX = 129, OP_AELEM = 130, OP_ASLICE = 131, - OP_AEACH = 132, - OP_AKEYS = 133, - OP_AVALUES = 134, - OP_EACH = 135, - OP_VALUES = 136, - OP_KEYS = 137, - OP_DELETE = 138, - OP_EXISTS = 139, - OP_RV2HV = 140, - OP_HELEM = 141, - OP_HSLICE = 142, - OP_UNPACK = 143, - OP_PACK = 144, - OP_SPLIT = 145, - OP_JOIN = 146, - OP_LIST = 147, - OP_LSLICE = 148, - OP_ANONLIST = 149, - OP_ANONHASH = 150, - OP_SPLICE = 151, - OP_PUSH = 152, - OP_POP = 153, - OP_SHIFT = 154, - OP_UNSHIFT = 155, - OP_SORT = 156, - OP_REVERSE = 157, - OP_GREPSTART = 158, - OP_GREPWHILE = 159, - OP_MAPSTART = 160, - OP_MAPWHILE = 161, - OP_RANGE = 162, - OP_FLIP = 163, - OP_FLOP = 164, - OP_AND = 165, - OP_OR = 166, - OP_XOR = 167, - OP_DOR = 168, - OP_COND_EXPR = 169, - OP_ANDASSIGN = 170, - OP_ORASSIGN = 171, - OP_DORASSIGN = 172, - OP_METHOD = 173, - OP_ENTERSUB = 174, - OP_LEAVESUB = 175, - OP_LEAVESUBLV = 176, - OP_CALLER = 177, - OP_WARN = 178, - OP_DIE = 179, - OP_RESET = 180, - OP_LINESEQ = 181, - OP_NEXTSTATE = 182, - OP_DBSTATE = 183, - OP_UNSTACK = 184, - OP_ENTER = 185, - OP_LEAVE = 186, - OP_SCOPE = 187, - OP_ENTERITER = 188, - OP_ITER = 189, - OP_ENTERLOOP = 190, - OP_LEAVELOOP = 191, - OP_RETURN = 192, - OP_LAST = 193, - OP_NEXT = 194, - OP_REDO = 195, - OP_DUMP = 196, - OP_GOTO = 197, - OP_EXIT = 198, - OP_METHOD_NAMED = 199, - OP_ENTERGIVEN = 200, - OP_LEAVEGIVEN = 201, - OP_ENTERWHEN = 202, - OP_LEAVEWHEN = 203, - OP_BREAK = 204, - OP_CONTINUE = 205, - OP_OPEN = 206, - OP_CLOSE = 207, - OP_PIPE_OP = 208, - OP_FILENO = 209, - OP_UMASK = 210, - OP_BINMODE = 211, - OP_TIE = 212, - OP_UNTIE = 213, - OP_TIED = 214, - OP_DBMOPEN = 215, - OP_DBMCLOSE = 216, - OP_SSELECT = 217, - OP_SELECT = 218, - OP_GETC = 219, - OP_READ = 220, - OP_ENTERWRITE = 221, - OP_LEAVEWRITE = 222, - OP_PRTF = 223, - OP_PRINT = 224, - OP_SAY = 225, - OP_SYSOPEN = 226, - OP_SYSSEEK = 227, - OP_SYSREAD = 228, - OP_SYSWRITE = 229, - OP_EOF = 230, - OP_TELL = 231, - OP_SEEK = 232, - OP_TRUNCATE = 233, - OP_FCNTL = 234, - OP_IOCTL = 235, - OP_FLOCK = 236, - OP_SEND = 237, - OP_RECV = 238, - OP_SOCKET = 239, - OP_SOCKPAIR = 240, - OP_BIND = 241, - OP_CONNECT = 242, - OP_LISTEN = 243, - OP_ACCEPT = 244, - OP_SHUTDOWN = 245, - OP_GSOCKOPT = 246, - OP_SSOCKOPT = 247, - OP_GETSOCKNAME = 248, - OP_GETPEERNAME = 249, - OP_LSTAT = 250, - OP_STAT = 251, - OP_FTRREAD = 252, - OP_FTRWRITE = 253, - OP_FTREXEC = 254, - OP_FTEREAD = 255, - OP_FTEWRITE = 256, - OP_FTEEXEC = 257, - OP_FTIS = 258, - OP_FTSIZE = 259, - OP_FTMTIME = 260, - OP_FTATIME = 261, - OP_FTCTIME = 262, - OP_FTROWNED = 263, - OP_FTEOWNED = 264, - OP_FTZERO = 265, - OP_FTSOCK = 266, - OP_FTCHR = 267, - OP_FTBLK = 268, - OP_FTFILE = 269, - OP_FTDIR = 270, - OP_FTPIPE = 271, - OP_FTSUID = 272, - OP_FTSGID = 273, - OP_FTSVTX = 274, - OP_FTLINK = 275, - OP_FTTTY = 276, - OP_FTTEXT = 277, - OP_FTBINARY = 278, - OP_CHDIR = 279, - OP_CHOWN = 280, - OP_CHROOT = 281, - OP_UNLINK = 282, - OP_CHMOD = 283, - OP_UTIME = 284, - OP_RENAME = 285, - OP_LINK = 286, - OP_SYMLINK = 287, - OP_READLINK = 288, - OP_MKDIR = 289, - OP_RMDIR = 290, - OP_OPEN_DIR = 291, - OP_READDIR = 292, - OP_TELLDIR = 293, - OP_SEEKDIR = 294, - OP_REWINDDIR = 295, - OP_CLOSEDIR = 296, - OP_FORK = 297, - OP_WAIT = 298, - OP_WAITPID = 299, - OP_SYSTEM = 300, - OP_EXEC = 301, - OP_KILL = 302, - OP_GETPPID = 303, - OP_GETPGRP = 304, - OP_SETPGRP = 305, - OP_GETPRIORITY = 306, - OP_SETPRIORITY = 307, - OP_TIME = 308, - OP_TMS = 309, - OP_LOCALTIME = 310, - OP_GMTIME = 311, - OP_ALARM = 312, - OP_SLEEP = 313, - OP_SHMGET = 314, - OP_SHMCTL = 315, - OP_SHMREAD = 316, - OP_SHMWRITE = 317, - OP_MSGGET = 318, - OP_MSGCTL = 319, - OP_MSGSND = 320, - OP_MSGRCV = 321, - OP_SEMOP = 322, - OP_SEMGET = 323, - OP_SEMCTL = 324, - OP_REQUIRE = 325, - OP_DOFILE = 326, - OP_HINTSEVAL = 327, - OP_ENTEREVAL = 328, - OP_LEAVEEVAL = 329, - OP_ENTERTRY = 330, - OP_LEAVETRY = 331, - OP_GHBYNAME = 332, - OP_GHBYADDR = 333, - OP_GHOSTENT = 334, - OP_GNBYNAME = 335, - OP_GNBYADDR = 336, - OP_GNETENT = 337, - OP_GPBYNAME = 338, - OP_GPBYNUMBER = 339, - OP_GPROTOENT = 340, - OP_GSBYNAME = 341, - OP_GSBYPORT = 342, - OP_GSERVENT = 343, - OP_SHOSTENT = 344, - OP_SNETENT = 345, - OP_SPROTOENT = 346, - OP_SSERVENT = 347, - OP_EHOSTENT = 348, - OP_ENETENT = 349, - OP_EPROTOENT = 350, - OP_ESERVENT = 351, - OP_GPWNAM = 352, - OP_GPWUID = 353, - OP_GPWENT = 354, - OP_SPWENT = 355, - OP_EPWENT = 356, - OP_GGRNAM = 357, - OP_GGRGID = 358, - OP_GGRENT = 359, - OP_SGRENT = 360, - OP_EGRENT = 361, - OP_GETLOGIN = 362, - OP_SYSCALL = 363, - OP_LOCK = 364, - OP_ONCE = 365, - OP_CUSTOM = 366, - OP_REACH = 367, - OP_RKEYS = 368, - OP_RVALUES = 369, - OP_COREARGS = 370, - OP_RUNCV = 371, - OP_FC = 372, - OP_PADCV = 373, - OP_INTROCV = 374, - OP_CLONECV = 375, - OP_PADRANGE = 376, + OP_KVASLICE = 132, + OP_AEACH = 133, + OP_AKEYS = 134, + OP_AVALUES = 135, + OP_EACH = 136, + OP_VALUES = 137, + OP_KEYS = 138, + OP_DELETE = 139, + OP_EXISTS = 140, + OP_RV2HV = 141, + OP_HELEM = 142, + OP_HSLICE = 143, + OP_KVHSLICE = 144, + OP_UNPACK = 145, + OP_PACK = 146, + OP_SPLIT = 147, + OP_JOIN = 148, + OP_LIST = 149, + OP_LSLICE = 150, + OP_ANONLIST = 151, + OP_ANONHASH = 152, + OP_SPLICE = 153, + OP_PUSH = 154, + OP_POP = 155, + OP_SHIFT = 156, + OP_UNSHIFT = 157, + OP_SORT = 158, + OP_REVERSE = 159, + OP_GREPSTART = 160, + OP_GREPWHILE = 161, + OP_MAPSTART = 162, + OP_MAPWHILE = 163, + OP_RANGE = 164, + OP_FLIP = 165, + OP_FLOP = 166, + OP_AND = 167, + OP_OR = 168, + OP_XOR = 169, + OP_DOR = 170, + OP_COND_EXPR = 171, + OP_ANDASSIGN = 172, + OP_ORASSIGN = 173, + OP_DORASSIGN = 174, + OP_METHOD = 175, + OP_ENTERSUB = 176, + OP_LEAVESUB = 177, + OP_LEAVESUBLV = 178, + OP_CALLER = 179, + OP_WARN = 180, + OP_DIE = 181, + OP_RESET = 182, + OP_LINESEQ = 183, + OP_NEXTSTATE = 184, + OP_DBSTATE = 185, + OP_UNSTACK = 186, + OP_ENTER = 187, + OP_LEAVE = 188, + OP_SCOPE = 189, + OP_ENTERITER = 190, + OP_ITER = 191, + OP_ENTERLOOP = 192, + OP_LEAVELOOP = 193, + OP_RETURN = 194, + OP_LAST = 195, + OP_NEXT = 196, + OP_REDO = 197, + OP_DUMP = 198, + OP_GOTO = 199, + OP_EXIT = 200, + OP_METHOD_NAMED = 201, + OP_ENTERGIVEN = 202, + OP_LEAVEGIVEN = 203, + OP_ENTERWHEN = 204, + OP_LEAVEWHEN = 205, + OP_BREAK = 206, + OP_CONTINUE = 207, + OP_OPEN = 208, + OP_CLOSE = 209, + OP_PIPE_OP = 210, + OP_FILENO = 211, + OP_UMASK = 212, + OP_BINMODE = 213, + OP_TIE = 214, + OP_UNTIE = 215, + OP_TIED = 216, + OP_DBMOPEN = 217, + OP_DBMCLOSE = 218, + OP_SSELECT = 219, + OP_SELECT = 220, + OP_GETC = 221, + OP_READ = 222, + OP_ENTERWRITE = 223, + OP_LEAVEWRITE = 224, + OP_PRTF = 225, + OP_PRINT = 226, + OP_SAY = 227, + OP_SYSOPEN = 228, + OP_SYSSEEK = 229, + OP_SYSREAD = 230, + OP_SYSWRITE = 231, + OP_EOF = 232, + OP_TELL = 233, + OP_SEEK = 234, + OP_TRUNCATE = 235, + OP_FCNTL = 236, + OP_IOCTL = 237, + OP_FLOCK = 238, + OP_SEND = 239, + OP_RECV = 240, + OP_SOCKET = 241, + OP_SOCKPAIR = 242, + OP_BIND = 243, + OP_CONNECT = 244, + OP_LISTEN = 245, + OP_ACCEPT = 246, + OP_SHUTDOWN = 247, + OP_GSOCKOPT = 248, + OP_SSOCKOPT = 249, + OP_GETSOCKNAME = 250, + OP_GETPEERNAME = 251, + OP_LSTAT = 252, + OP_STAT = 253, + OP_FTRREAD = 254, + OP_FTRWRITE = 255, + OP_FTREXEC = 256, + OP_FTEREAD = 257, + OP_FTEWRITE = 258, + OP_FTEEXEC = 259, + OP_FTIS = 260, + OP_FTSIZE = 261, + OP_FTMTIME = 262, + OP_FTATIME = 263, + OP_FTCTIME = 264, + OP_FTROWNED = 265, + OP_FTEOWNED = 266, + OP_FTZERO = 267, + OP_FTSOCK = 268, + OP_FTCHR = 269, + OP_FTBLK = 270, + OP_FTFILE = 271, + OP_FTDIR = 272, + OP_FTPIPE = 273, + OP_FTSUID = 274, + OP_FTSGID = 275, + OP_FTSVTX = 276, + OP_FTLINK = 277, + OP_FTTTY = 278, + OP_FTTEXT = 279, + OP_FTBINARY = 280, + OP_CHDIR = 281, + OP_CHOWN = 282, + OP_CHROOT = 283, + OP_UNLINK = 284, + OP_CHMOD = 285, + OP_UTIME = 286, + OP_RENAME = 287, + OP_LINK = 288, + OP_SYMLINK = 289, + OP_READLINK = 290, + OP_MKDIR = 291, + OP_RMDIR = 292, + OP_OPEN_DIR = 293, + OP_READDIR = 294, + OP_TELLDIR = 295, + OP_SEEKDIR = 296, + OP_REWINDDIR = 297, + OP_CLOSEDIR = 298, + OP_FORK = 299, + OP_WAIT = 300, + OP_WAITPID = 301, + OP_SYSTEM = 302, + OP_EXEC = 303, + OP_KILL = 304, + OP_GETPPID = 305, + OP_GETPGRP = 306, + OP_SETPGRP = 307, + OP_GETPRIORITY = 308, + OP_SETPRIORITY = 309, + OP_TIME = 310, + OP_TMS = 311, + OP_LOCALTIME = 312, + OP_GMTIME = 313, + OP_ALARM = 314, + OP_SLEEP = 315, + OP_SHMGET = 316, + OP_SHMCTL = 317, + OP_SHMREAD = 318, + OP_SHMWRITE = 319, + OP_MSGGET = 320, + OP_MSGCTL = 321, + OP_MSGSND = 322, + OP_MSGRCV = 323, + OP_SEMOP = 324, + OP_SEMGET = 325, + OP_SEMCTL = 326, + OP_REQUIRE = 327, + OP_DOFILE = 328, + OP_HINTSEVAL = 329, + OP_ENTEREVAL = 330, + OP_LEAVEEVAL = 331, + OP_ENTERTRY = 332, + OP_LEAVETRY = 333, + OP_GHBYNAME = 334, + OP_GHBYADDR = 335, + OP_GHOSTENT = 336, + OP_GNBYNAME = 337, + OP_GNBYADDR = 338, + OP_GNETENT = 339, + OP_GPBYNAME = 340, + OP_GPBYNUMBER = 341, + OP_GPROTOENT = 342, + OP_GSBYNAME = 343, + OP_GSBYPORT = 344, + OP_GSERVENT = 345, + OP_SHOSTENT = 346, + OP_SNETENT = 347, + OP_SPROTOENT = 348, + OP_SSERVENT = 349, + OP_EHOSTENT = 350, + OP_ENETENT = 351, + OP_EPROTOENT = 352, + OP_ESERVENT = 353, + OP_GPWNAM = 354, + OP_GPWUID = 355, + OP_GPWENT = 356, + OP_SPWENT = 357, + OP_EPWENT = 358, + OP_GGRNAM = 359, + OP_GGRGID = 360, + OP_GGRENT = 361, + OP_SGRENT = 362, + OP_EGRENT = 363, + OP_GETLOGIN = 364, + OP_SYSCALL = 365, + OP_LOCK = 366, + OP_ONCE = 367, + OP_CUSTOM = 368, + OP_REACH = 369, + OP_RKEYS = 370, + OP_RVALUES = 371, + OP_COREARGS = 372, + OP_RUNCV = 373, + OP_FC = 374, + OP_PADCV = 375, + OP_INTROCV = 376, + OP_CLONECV = 377, + OP_PADRANGE = 378, OP_max } opcode; -#define MAXO 377 +#define MAXO 379 #define OP_FREED MAXO /* the OP_IS_* macros are optimized to a simple range check because diff --git a/Master/tlpkg/tlperl/lib/CORE/pad.h b/Master/tlpkg/tlperl/lib/CORE/pad.h index 26e183ccd83..90517c65df8 100644 --- a/Master/tlpkg/tlperl/lib/CORE/pad.h +++ b/Master/tlpkg/tlperl/lib/CORE/pad.h @@ -143,14 +143,14 @@ typedef enum { # define ASSERT_CURPAD_LEGAL(label) \ pad_peg(label); \ if (PL_comppad ? (AvARRAY(PL_comppad) != PL_curpad) : (PL_curpad != 0)) \ - Perl_croak(aTHX_ "panic: illegal pad in %s: 0x%"UVxf"[0x%"UVxf"]",\ + Perl_croak(aTHX_ "panic: illegal pad in %s: 0x%" UVxf "[0x%" UVxf "]",\ label, PTR2UV(PL_comppad), PTR2UV(PL_curpad)); # define ASSERT_CURPAD_ACTIVE(label) \ pad_peg(label); \ if (!PL_comppad || (AvARRAY(PL_comppad) != PL_curpad)) \ - Perl_croak(aTHX_ "panic: invalid pad in %s: 0x%"UVxf"[0x%"UVxf"]",\ + Perl_croak(aTHX_ "panic: invalid pad in %s: 0x%" UVxf "[0x%" UVxf "]",\ label, PTR2UV(PL_comppad), PTR2UV(PL_curpad)); #else # define ASSERT_CURPAD_LEGAL(label) @@ -168,7 +168,8 @@ Save a pad slot (used to restore after an iteration) XXX DAPM it would make more sense to make the arg a PADOFFSET =for apidoc m|void|SAVECLEARSV |SV **svp -Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my') +Clear the pointed to pad value on scope exit. (i.e. the runtime action of +'my') =for apidoc m|void|SAVECOMPPAD save PL_comppad and PL_curpad @@ -179,7 +180,9 @@ The C array of a padlist, containing the pads. Only subscript it with numbers >= 1, as the 0th entry is not guaranteed to remain usable. =for apidoc Amx|SSize_t|PadlistMAX|PADLIST padlist -The index of the last pad in the padlist. +The index of the last allocated space in the padlist. Note that the last +pad may be in an earlier slot. Any entries following it will be NULL in +that case. =for apidoc Amx|PADNAMELIST *|PadlistNAMES|PADLIST padlist The names associated with pad entries. @@ -239,7 +242,7 @@ for C. =for apidoc m|SV *|PAD_SETSV |PADOFFSET po|SV* sv Set the slot at offset C in the current pad to C -=for apidoc m|void|PAD_SV |PADOFFSET po +=for apidoc m|SV *|PAD_SV |PADOFFSET po Get the value at offset C in the current pad =for apidoc m|SV *|PAD_SVl |PADOFFSET po @@ -253,7 +256,7 @@ Get the value from slot C in the base (DEPTH=1) pad of a padlist =for apidoc m|void|PAD_SET_CUR |PADLIST padlist|I32 n Set the current pad to be pad C in the padlist, saving -the previous current pad. NB currently this macro expands to a string too +the previous current pad. NB currently this macro expands to a string too long for some compilers, so it's best to replace it with SAVECOMPPAD(); @@ -285,12 +288,14 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL() #define PadnamelistARRAY(pnl) AvARRAY(pnl) #define PadnamelistMAX(pnl) AvFILLp(pnl) +#define PadnamelistMAXNAMED(pnl) \ + ((XPVAV*) SvANY(pnl))->xmg_u.xmg_hash_index #define PadARRAY(pad) AvARRAY(pad) #define PadMAX(pad) AvFILLp(pad) #define PadnamePV(pn) (SvPOKp(pn) ? SvPVX(pn) : NULL) -#define PadnameLEN(pn) SvCUR(pn) +#define PadnameLEN(pn) ((pn) == &PL_sv_undef ? 0 : SvCUR(pn)) #define PadnameUTF8(pn) !!SvUTF8(pn) #define PadnameSV(pn) pn #define PadnameIsOUR(pn) !!SvPAD_OUR(pn) @@ -320,7 +325,7 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL() PL_comppad = (PAD*) (PadlistARRAY(padlist)[nth]); \ PL_curpad = AvARRAY(PL_comppad); \ DEBUG_Xv(PerlIO_printf(Perl_debug_log, \ - "Pad 0x%"UVxf"[0x%"UVxf"] set_cur depth=%d\n", \ + "Pad 0x%" UVxf "[0x%" UVxf "] set_cur depth=%d\n", \ PTR2UV(PL_comppad), PTR2UV(PL_curpad), (int)(nth))); @@ -338,7 +343,7 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL() PL_comppad = (npad); \ PL_curpad = PL_comppad ? AvARRAY(PL_comppad) : NULL; \ DEBUG_Xv(PerlIO_printf(Perl_debug_log, \ - "Pad 0x%"UVxf"[0x%"UVxf"] save_local\n", \ + "Pad 0x%" UVxf "[0x%" UVxf "] save_local\n", \ PTR2UV(PL_comppad), PTR2UV(PL_curpad))); #define PAD_RESTORE_LOCAL(opad) \ @@ -346,7 +351,7 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL() PL_comppad = opad; \ PL_curpad = PL_comppad ? AvARRAY(PL_comppad) : NULL; \ DEBUG_Xv(PerlIO_printf(Perl_debug_log, \ - "Pad 0x%"UVxf"[0x%"UVxf"] restore_local\n", \ + "Pad 0x%" UVxf "[0x%" UVxf "] restore_local\n", \ PTR2UV(PL_comppad), PTR2UV(PL_curpad))); @@ -368,15 +373,15 @@ context block structure (can be used as an lvalue). /* =for apidoc m|U32|PAD_COMPNAME_FLAGS|PADOFFSET po Return the flags for the current compiling pad name -at offset C. Assumes a valid slot entry. +at offset C. Assumes a valid slot entry. =for apidoc m|char *|PAD_COMPNAME_PV|PADOFFSET po Return the name of the current compiling pad name -at offset C. Assumes a valid slot entry. +at offset C. Assumes a valid slot entry. =for apidoc m|HV *|PAD_COMPNAME_TYPE|PADOFFSET po Return the type (stash) of the current compiling pad name at offset -C. Must be a valid name. Returns null if not typed. +C. Must be a valid name. Returns null if not typed. =for apidoc m|HV *|PAD_COMPNAME_OURSTASH|PADOFFSET po Return the stash associated with an C variable. @@ -384,7 +389,7 @@ Assumes the slot entry is a valid C lexical. =for apidoc m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po The generation number of the name at offset C in the current -compiling pad (lvalue). Note that C is hijacked for this purpose. +compiling pad (lvalue). Note that C is hijacked for this purpose. =for apidoc m|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen Sets the generation number of the name at offset C in the current diff --git a/Master/tlpkg/tlperl/lib/CORE/parser.h b/Master/tlpkg/tlperl/lib/CORE/parser.h index e7b887ec3b4..ff5867e4427 100644 --- a/Master/tlpkg/tlperl/lib/CORE/parser.h +++ b/Master/tlpkg/tlperl/lib/CORE/parser.h @@ -29,7 +29,6 @@ typedef struct yy_lexshared { char *ls_bufptr; /* mirrors PL_parser->bufptr */ char *re_eval_start; /* start of "(?{..." text */ SV *re_eval_str; /* "(?{...})" text */ - line_t herelines; /* number of lines in here-doc */ } LEXSHARED; typedef struct yy_parser { @@ -55,7 +54,8 @@ typedef struct yy_parser { char *lex_brackstack;/* what kind of brackets to pop */ char *lex_casestack; /* what kind of case mods in effect */ U8 lex_defer; /* state after determined token */ - bool lex_dojoin; /* doing an array interpolation */ + U8 lex_dojoin; /* doing an array interpolation + 1 = @{...} 2 = ->@ */ U8 lex_expect; /* expect after determined token */ U8 expect; /* how to interpret ambiguous tokens */ I32 lex_formbrack; /* bracket count at outer format level */ @@ -123,11 +123,13 @@ typedef struct yy_parser { COP *saved_curcop; /* the previous PL_curcop */ char tokenbuf[256]; - + line_t herelines; /* number of lines in here-doc */ + line_t preambling; /* line # when processing $ENV{PERL5DB} */ U8 lex_fakeeof; /* precedence at which to fake EOF */ U8 lex_flags; PERL_BITFIELD16 in_pod:1; /* lexer is within a =pod section */ PERL_BITFIELD16 filtered:1; /* source filters in evalbytes */ + PERL_BITFIELD16 saw_infix_sigil:1; /* saw & or * or % operator */ } yy_parser; /* flags for lexer API */ diff --git a/Master/tlpkg/tlperl/lib/CORE/patchlevel.h b/Master/tlpkg/tlperl/lib/CORE/patchlevel.h index 9f85e9452ad..07e1217e991 100644 --- a/Master/tlpkg/tlperl/lib/CORE/patchlevel.h +++ b/Master/tlpkg/tlperl/lib/CORE/patchlevel.h @@ -14,7 +14,7 @@ * exactly on the third column */ #define PERL_REVISION 5 /* age */ -#define PERL_VERSION 18 /* epoch */ +#define PERL_VERSION 20 /* epoch */ #define PERL_SUBVERSION 2 /* generation */ /* The following numbers describe the earliest compatible version of @@ -35,7 +35,7 @@ changing them should not be necessary. */ #define PERL_API_REVISION 5 -#define PERL_API_VERSION 18 +#define PERL_API_VERSION 20 #define PERL_API_SUBVERSION 0 /* XXX Note: The selection of non-default Configure options, such @@ -144,7 +144,7 @@ static const char * const local_patches[] = { /* Initial space prevents this variable from being inserted in config.sh */ # define LOCAL_PATCH_COUNT \ - ((int)(sizeof(local_patches)/sizeof(local_patches[0])-2)) + ((int)(C_ARRAY_LENGTH(local_patches)-2)) /* the old terms of reference, add them only when explicitly included */ #define PATCHLEVEL PERL_VERSION diff --git a/Master/tlpkg/tlperl/lib/CORE/perl.h b/Master/tlpkg/tlperl/lib/CORE/perl.h index 89f4c98904f..1325de9b9d0 100644 --- a/Master/tlpkg/tlperl/lib/CORE/perl.h +++ b/Master/tlpkg/tlperl/lib/CORE/perl.h @@ -22,23 +22,10 @@ #define USE_STDIO #endif /* PERL_FOR_X2P */ -#if defined(DGUX) -#include -#endif - -#ifdef VOIDUSED -# undef VOIDUSED -#endif -#define VOIDUSED 1 - #ifdef PERL_MICRO # include "uconfig.h" #else -# ifndef USE_CROSS_COMPILE -# include "config.h" -# else -# include "xconfig.h" -# endif +# include "config.h" #endif /* See L for detailed notes on @@ -99,7 +86,7 @@ # define USE_HEAP_INSTEAD_OF_STACK #endif -#/* Use the reentrant APIs like localtime_r and getpwent_r */ +/* Use the reentrant APIs like localtime_r and getpwent_r */ /* Win32 has naturally threadsafe libraries, no need to use any _r variants. */ #if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(NETWARE) && !defined(WIN32) && !defined(PERL_DARWIN) # define USE_REENTRANT_API @@ -107,15 +94,9 @@ /* <--- here ends the logic shared by perl.h and makedef.pl */ -/* - * PERL_DARWIN for MacOSX (__APPLE__ exists but is not officially sanctioned) - * (The -DPERL_DARWIN comes from the hints/darwin.sh.) - * __bsdi__ for BSD/OS - */ -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(PERL_DARWIN) || defined(__bsdi__) || defined(BSD41) || defined(BSD42) || defined(BSD43) || defined(BSD44) -# ifndef BSDish -# define BSDish -# endif +/* Microsoft Visual C++ 6.0 needs special treatment in numerous places */ +#if defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1300 +# define USING_MSVC6 #endif #undef START_EXTERN_C @@ -194,6 +175,7 @@ # define pTHX_7 8 # define pTHX_8 9 # define pTHX_9 10 +# define pTHX_12 13 # if defined(DEBUGGING) && !defined(PERL_TRACK_MEMPOOL) # define PERL_TRACK_MEMPOOL # endif @@ -225,11 +207,11 @@ #define CALLREGCOMP(sv, flags) Perl_pregcomp(aTHX_ (sv),(flags)) #define CALLREGCOMP_ENG(prog, sv, flags) (prog)->comp(aTHX_ sv, flags) -#define CALLREGEXEC(prog,stringarg,strend,strbeg,minend,screamer,data,flags) \ +#define CALLREGEXEC(prog,stringarg,strend,strbeg,minend,sv,data,flags) \ RX_ENGINE(prog)->exec(aTHX_ (prog),(stringarg),(strend), \ - (strbeg),(minend),(screamer),(data),(flags)) -#define CALLREG_INTUIT_START(prog,sv,strpos,strend,flags,data) \ - RX_ENGINE(prog)->intuit(aTHX_ (prog), (sv), (strpos), \ + (strbeg),(minend),(sv),(data),(flags)) +#define CALLREG_INTUIT_START(prog,sv,strbeg,strpos,strend,flags,data) \ + RX_ENGINE(prog)->intuit(aTHX_ (prog), (sv), (strbeg), (strpos), \ (strend),(flags),(data)) #define CALLREG_INTUIT_STRING(prog) \ RX_ENGINE(prog)->checkstr(aTHX_ (prog)) @@ -345,6 +327,78 @@ # define PERL_UNUSED_CONTEXT #endif +/* gcc (-ansi) -pedantic doesn't allow gcc statement expressions, + * g++ allows them but seems to have problems with them + * (insane errors ensue). + * g++ does not give insane errors now (RMB 2008-01-30, gcc 4.2.2). + */ +#if defined(PERL_GCC_PEDANTIC) || \ + (defined(__GNUC__) && defined(__cplusplus) && \ + ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 2)))) +# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN +# define PERL_GCC_BRACE_GROUPS_FORBIDDEN +# endif +#endif + +/* Use PERL_UNUSED_RESULT() to suppress the warnings about unused results + * of function calls, e.g. PERL_UNUSED_RESULT(foo(a, b)). + * + * The main reason for this is that the combination of gcc -Wunused-result + * (part of -Wall) and the __attribute__((warn_unused_result)) cannot + * be silenced with casting to void. This causes trouble when the system + * header files use the attribute. + * + * Use PERL_UNUSED_RESULT sparingly, though, since usually the warning + * is there for a good reason: you might lose success/failure information, + * or leak resources, or changes in resources. + * + * But sometimes you just want to ignore the return value, e.g. on + * codepaths soon ending up in abort, or in "best effort" attempts, + * or in situations where there is no good way to handle failures. + * + * Sometimes PERL_UNUSED_RESULT might not be the most natural way: + * another possibility is that you can capture the return value + * and use PERL_UNUSED_VAR on that. + * + * The __typeof__() is used instead of typeof() since typeof() is not + * available under strict C89, and because of compilers masquerading + * as gcc (clang and icc), we want exactly the gcc extension + * __typeof__ and nothing else. + */ +#ifndef PERL_UNUSED_RESULT +# if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT) +# define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END +# else +# define PERL_UNUSED_RESULT(v) ((void)(v)) +# endif +#endif + +/* on gcc (and clang), specify that a warning should be temporarily + * ignored; e.g. + * + * GCC_DIAG_IGNORE(-Wmultichar); + * char b = 'ab'; + * GCC_DIAG_RESTORE; + * + * based on http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html + * + * Note that "pragma GCC diagnostic push/pop" was added in GCC 4.6, Mar 2011; + * clang only pretends to be GCC 4.2, but still supports push/pop. + */ + +#if defined(__clang) || \ + (defined( __GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406) +# define GCC_DIAG_DO_PRAGMA_(x) _Pragma (#x) + +# define GCC_DIAG_IGNORE(x) _Pragma("GCC diagnostic push") \ + GCC_DIAG_DO_PRAGMA_(GCC diagnostic ignored #x) +# define GCC_DIAG_RESTORE _Pragma("GCC diagnostic pop") +#else +# define GCC_DIAG_IGNORE(w) +# define GCC_DIAG_RESTORE +#endif + + #define NOOP /*EMPTY*/(void)0 /* cea2e8a9dd23747f accidentally lost the comment originally from the first check in of thread.h, explaining why we need dNOOP at all: */ @@ -358,7 +412,7 @@ #endif #ifndef pTHX -/* Don't bother defining tTHX and sTHX; using them outside +/* Don't bother defining tTHX ; using it outside * code guarded by PERL_IMPLICIT_CONTEXT is an error. */ # define pTHX void @@ -377,6 +431,7 @@ # define pTHX_7 7 # define pTHX_8 8 # define pTHX_9 9 +# define pTHX_12 12 #endif #ifndef dVAR @@ -438,27 +493,6 @@ # endif #endif -#ifdef OP_IN_REGISTER -# ifdef __GNUC__ -# define stringify_immed(s) #s -# define stringify(s) stringify_immed(s) -struct op *Perl_op asm(stringify(OP_IN_REGISTER)); -# endif -#endif - -/* gcc (-ansi) -pedantic doesn't allow gcc statement expressions, - * g++ allows them but seems to have problems with them - * (insane errors ensue). - * g++ does not give insane errors now (RMB 2008-01-30, gcc 4.2.2). - */ -#if defined(PERL_GCC_PEDANTIC) || \ - (defined(__GNUC__) && defined(__cplusplus) && \ - ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 2)))) -# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN -# define PERL_GCC_BRACE_GROUPS_FORBIDDEN -# endif -#endif - #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) # ifndef PERL_USE_GCC_BRACE_GROUPS # define PERL_USE_GCC_BRACE_GROUPS @@ -477,14 +511,8 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # define STMT_START (void)( /* gcc supports "({ STATEMENTS; })" */ # define STMT_END ) # else - /* Now which other defined()s do we need here ??? */ -# if (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) -# define STMT_START if (1) -# define STMT_END else (void)0 -# else # define STMT_START do # define STMT_END while (0) -# endif # endif #endif @@ -520,7 +548,7 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # define STANDARD_C 1 #endif -#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(__EMX__) || defined(__DGUX) || defined(__QNX__) || defined(NETWARE) || defined(PERL_MICRO) +#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(__EMX__) || defined(__QNX__) || defined(NETWARE) || defined(PERL_MICRO) # define DONT_DECLARE_STD 1 #endif @@ -545,7 +573,7 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); * DANGER! Using NO_TAINT_SUPPORT or SILENT_NO_TAINT_SUPPORT * voids your nonexistent warranty! */ -#if SILENT_NO_TAINT_SUPPORT && !defined(NO_TAINT_SUPPORT) +#if defined(SILENT_NO_TAINT_SUPPORT) && !defined(NO_TAINT_SUPPORT) # define NO_TAINT_SUPPORT 1 #endif @@ -553,7 +581,7 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); * operations into no-ops for a very modest speed-up. Enable only if you * know what you're doing: tests and CPAN modules' tests are bound to fail. */ -#if NO_TAINT_SUPPORT +#ifdef NO_TAINT_SUPPORT # define TAINT NOOP # define TAINT_NOT NOOP # define TAINT_IF(c) NOOP @@ -645,11 +673,7 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif -#ifndef _TYPES_ /* If types.h defines this it's easy. */ -# ifndef major /* Does everyone's types.h define this? */ -# include -# endif -#endif +#include #ifdef __cplusplus # ifndef I_STDARG @@ -657,6 +681,15 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # endif #endif +/* EVC 4 SDK headers includes a bad definition of MB_CUR_MAX in stdlib.h + which is included from stdarg.h. Bad definition not present in SD 2008 + SDK headers. wince.h is not yet included, so we cant fix this from there + since by then MB_CUR_MAX will be defined from stdlib.h. + cewchar.h includes a correct definition of MB_CUR_MAX and it is copied here + since cewchar.h can't be included this early */ +#if defined(UNDER_CE) && (_MSC_VER < 1300) +# define MB_CUR_MAX 1 +#endif #ifdef I_STDARG # include #else @@ -695,6 +728,8 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); #if !defined(NO_LOCALE) && defined(HAS_SETLOCALE) # define USE_LOCALE +# define HAS_SKIP_LOCALE_INIT /* Solely for XS code to test for this + capability */ # if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \ && defined(HAS_STRXFRM) # define USE_LOCALE_COLLATE @@ -705,6 +740,15 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC) # define USE_LOCALE_NUMERIC # endif +# if !defined(NO_LOCALE_MESSAGES) && defined(LC_MESSAGES) +# define USE_LOCALE_MESSAGES +# endif +# if !defined(NO_LOCALE_MONETARY) && defined(LC_MONETARY) +# define USE_LOCALE_MONETARY +# endif +# ifndef WIN32 /* No wrapper except on Windows */ +# define my_setlocale(a,b) setlocale(a,b) +# endif #endif /* !NO_LOCALE && HAS_SETLOCALE */ #include @@ -716,6 +760,16 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif +/* On BSD-derived systems, defines BSD to a year-month + value something like 199306. This may be useful if no more-specific + feature test is available. +*/ +#if defined(BSD) +# ifndef BSDish +# define BSDish +# endif +#endif + /* Use all the "standard" definitions? */ #if defined(STANDARD_C) && defined(I_STDLIB) # include @@ -735,23 +789,14 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # undef _SC_ARG_MAX /* Symbian has _SC_ARG_MAX but no sysconf() */ #endif -#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO) +#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) EXTERN_C int syscall(int, ...); #endif -#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO) +#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) EXTERN_C int usleep(unsigned int); #endif -/* Funky places that do not have socket stuff. */ -#if defined(__LIBCATAMOUNT__) -# define MYSWAP -#endif - -#ifdef PERL_MICRO /* Last chance to export Perl_my_swap */ -# define MYSWAP -#endif - #ifdef PERL_CORE /* macros for correct constant construction */ @@ -804,189 +849,6 @@ EXTERN_C int usleep(unsigned int); (((U64)(x) & U64_CONST(0xff00000000000000)) >> 56) )) # endif -/*----------------------------------------------------------------------------*/ -# if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 /* little-endian */ -/*----------------------------------------------------------------------------*/ -# define my_htole16(x) (x) -# define my_letoh16(x) (x) -# define my_htole32(x) (x) -# define my_letoh32(x) (x) -# define my_htobe16(x) _swab_16_(x) -# define my_betoh16(x) _swab_16_(x) -# define my_htobe32(x) _swab_32_(x) -# define my_betoh32(x) _swab_32_(x) -# ifdef HAS_QUAD -# define my_htole64(x) (x) -# define my_letoh64(x) (x) -# define my_htobe64(x) _swab_64_(x) -# define my_betoh64(x) _swab_64_(x) -# endif -# define my_htoles(x) (x) -# define my_letohs(x) (x) -# define my_htolei(x) (x) -# define my_letohi(x) (x) -# define my_htolel(x) (x) -# define my_letohl(x) (x) -# if SHORTSIZE == 1 -# define my_htobes(x) (x) -# define my_betohs(x) (x) -# elif SHORTSIZE == 2 -# define my_htobes(x) _swab_16_(x) -# define my_betohs(x) _swab_16_(x) -# elif SHORTSIZE == 4 -# define my_htobes(x) _swab_32_(x) -# define my_betohs(x) _swab_32_(x) -# elif SHORTSIZE == 8 -# define my_htobes(x) _swab_64_(x) -# define my_betohs(x) _swab_64_(x) -# else -# define PERL_NEED_MY_HTOBES -# define PERL_NEED_MY_BETOHS -# endif -# if INTSIZE == 1 -# define my_htobei(x) (x) -# define my_betohi(x) (x) -# elif INTSIZE == 2 -# define my_htobei(x) _swab_16_(x) -# define my_betohi(x) _swab_16_(x) -# elif INTSIZE == 4 -# define my_htobei(x) _swab_32_(x) -# define my_betohi(x) _swab_32_(x) -# elif INTSIZE == 8 -# define my_htobei(x) _swab_64_(x) -# define my_betohi(x) _swab_64_(x) -# else -# define PERL_NEED_MY_HTOBEI -# define PERL_NEED_MY_BETOHI -# endif -# if LONGSIZE == 1 -# define my_htobel(x) (x) -# define my_betohl(x) (x) -# elif LONGSIZE == 2 -# define my_htobel(x) _swab_16_(x) -# define my_betohl(x) _swab_16_(x) -# elif LONGSIZE == 4 -# define my_htobel(x) _swab_32_(x) -# define my_betohl(x) _swab_32_(x) -# elif LONGSIZE == 8 -# define my_htobel(x) _swab_64_(x) -# define my_betohl(x) _swab_64_(x) -# else -# define PERL_NEED_MY_HTOBEL -# define PERL_NEED_MY_BETOHL -# endif -# define my_htolen(p,n) NOOP -# define my_letohn(p,n) NOOP -# define my_htoben(p,n) my_swabn(p,n) -# define my_betohn(p,n) my_swabn(p,n) -/*----------------------------------------------------------------------------*/ -# elif BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 /* big-endian */ -/*----------------------------------------------------------------------------*/ -# define my_htobe16(x) (x) -# define my_betoh16(x) (x) -# define my_htobe32(x) (x) -# define my_betoh32(x) (x) -# define my_htole16(x) _swab_16_(x) -# define my_letoh16(x) _swab_16_(x) -# define my_htole32(x) _swab_32_(x) -# define my_letoh32(x) _swab_32_(x) -# ifdef HAS_QUAD -# define my_htobe64(x) (x) -# define my_betoh64(x) (x) -# define my_htole64(x) _swab_64_(x) -# define my_letoh64(x) _swab_64_(x) -# endif -# define my_htobes(x) (x) -# define my_betohs(x) (x) -# define my_htobei(x) (x) -# define my_betohi(x) (x) -# define my_htobel(x) (x) -# define my_betohl(x) (x) -# if SHORTSIZE == 1 -# define my_htoles(x) (x) -# define my_letohs(x) (x) -# elif SHORTSIZE == 2 -# define my_htoles(x) _swab_16_(x) -# define my_letohs(x) _swab_16_(x) -# elif SHORTSIZE == 4 -# define my_htoles(x) _swab_32_(x) -# define my_letohs(x) _swab_32_(x) -# elif SHORTSIZE == 8 -# define my_htoles(x) _swab_64_(x) -# define my_letohs(x) _swab_64_(x) -# else -# define PERL_NEED_MY_HTOLES -# define PERL_NEED_MY_LETOHS -# endif -# if INTSIZE == 1 -# define my_htolei(x) (x) -# define my_letohi(x) (x) -# elif INTSIZE == 2 -# define my_htolei(x) _swab_16_(x) -# define my_letohi(x) _swab_16_(x) -# elif INTSIZE == 4 -# define my_htolei(x) _swab_32_(x) -# define my_letohi(x) _swab_32_(x) -# elif INTSIZE == 8 -# define my_htolei(x) _swab_64_(x) -# define my_letohi(x) _swab_64_(x) -# else -# define PERL_NEED_MY_HTOLEI -# define PERL_NEED_MY_LETOHI -# endif -# if LONGSIZE == 1 -# define my_htolel(x) (x) -# define my_letohl(x) (x) -# elif LONGSIZE == 2 -# define my_htolel(x) _swab_16_(x) -# define my_letohl(x) _swab_16_(x) -# elif LONGSIZE == 4 -# define my_htolel(x) _swab_32_(x) -# define my_letohl(x) _swab_32_(x) -# elif LONGSIZE == 8 -# define my_htolel(x) _swab_64_(x) -# define my_letohl(x) _swab_64_(x) -# else -# define PERL_NEED_MY_HTOLEL -# define PERL_NEED_MY_LETOHL -# endif -# define my_htolen(p,n) my_swabn(p,n) -# define my_letohn(p,n) my_swabn(p,n) -# define my_htoben(p,n) NOOP -# define my_betohn(p,n) NOOP -/*----------------------------------------------------------------------------*/ -# else /* all other byte-orders */ -/*----------------------------------------------------------------------------*/ -# define PERL_NEED_MY_HTOLE16 -# define PERL_NEED_MY_LETOH16 -# define PERL_NEED_MY_HTOBE16 -# define PERL_NEED_MY_BETOH16 -# define PERL_NEED_MY_HTOLE32 -# define PERL_NEED_MY_LETOH32 -# define PERL_NEED_MY_HTOBE32 -# define PERL_NEED_MY_BETOH32 -# ifdef HAS_QUAD -# define PERL_NEED_MY_HTOLE64 -# define PERL_NEED_MY_LETOH64 -# define PERL_NEED_MY_HTOBE64 -# define PERL_NEED_MY_BETOH64 -# endif -# define PERL_NEED_MY_HTOLES -# define PERL_NEED_MY_LETOHS -# define PERL_NEED_MY_HTOBES -# define PERL_NEED_MY_BETOHS -# define PERL_NEED_MY_HTOLEI -# define PERL_NEED_MY_LETOHI -# define PERL_NEED_MY_HTOBEI -# define PERL_NEED_MY_BETOHI -# define PERL_NEED_MY_HTOLEL -# define PERL_NEED_MY_LETOHL -# define PERL_NEED_MY_HTOBEL -# define PERL_NEED_MY_BETOHL -/*----------------------------------------------------------------------------*/ -# endif /* end of byte-order macros */ -/*----------------------------------------------------------------------------*/ - /* The old value was hard coded at 1008. (4096-16) seems to be a bit faster, at least on FreeBSD. YMMV, so experiment. */ #ifndef PERL_ARENA_SIZE @@ -1157,9 +1019,6 @@ EXTERN_C int usleep(unsigned int); extern int memcmp (char*, char*, int); # endif # endif -# ifdef BUGGY_MSC -# pragma function(memcmp) -# endif #else # ifndef memcmp # define memcmp my_memcmp @@ -1200,12 +1059,6 @@ EXTERN_C int usleep(unsigned int); # include #endif -#if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO) -/* defines SF_APPEND and might define SF_APPEND - * (the neo-BSD seem to do this). */ -# undef SF_APPEND -#endif - #ifdef I_SYS_STAT # include #endif @@ -1263,14 +1116,6 @@ EXTERN_C int usleep(unsigned int); # define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */ #endif -/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one. - * This is important for using IPv6. - * For OSF/1 3.2, however, defining _SOCKADDR_LEN would be - * a bad idea since it breaks send() and recv(). */ -#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN) && !defined(DEC_OSF1_3_X) -# define _SOCKADDR_LEN -#endif - #if defined(HAS_SOCKET) && !defined(WIN32) /* WIN32 handles sockets via win32.h */ # include # if defined(USE_SOCKS) && defined(I_SOCKS) @@ -1321,7 +1166,7 @@ EXTERN_C char **environ; #endif #if defined(__cplusplus) -# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) +# if defined(BSDish) EXTERN_C char **environ; # elif defined(__CYGWIN__) EXTERN_C char *crypt(const char *, const char *); @@ -1356,12 +1201,6 @@ EXTERN_C char *crypt(const char *, const char *); # define SS_IVCHAN SS$_IVCHAN # define SS_NORMAL SS$_NORMAL #else -# define SETERRNO(errcode,vmserrcode) (errno = (errcode)) -# define dSAVEDERRNO int saved_errno -# define dSAVE_ERRNO int saved_errno = errno -# define SAVE_ERRNO (saved_errno = errno) -# define RESTORE_ERRNO (errno = saved_errno) - # define LIB_INVARG 0 # define RMS_DIR 0 # define RMS_FAC 0 @@ -1376,6 +1215,31 @@ EXTERN_C char *crypt(const char *, const char *); # define SS_NORMAL 0 #endif +#ifdef WIN32 +# define dSAVEDERRNO int saved_errno; DWORD saved_win32_errno +# define dSAVE_ERRNO int saved_errno = errno; DWORD saved_win32_errno = GetLastError() +# define SAVE_ERRNO ( saved_errno = errno, saved_win32_errno = GetLastError() ) +# define RESTORE_ERRNO ( errno = saved_errno, SetLastError(saved_win32_errno) ) +#endif + +#ifdef OS2 +# define dSAVEDERRNO int saved_errno; unsigned long saved_os2_errno +# define dSAVE_ERRNO int saved_errno = errno; unsigned long saved_os2_errno = Perl_rc +# define SAVE_ERRNO ( saved_errno = errno, saved_os2_errno = Perl_rc ) +# define RESTORE_ERRNO ( errno = saved_errno, Perl_rc = saved_os2_errno ) +#endif + +#ifndef SETERRNO +# define SETERRNO(errcode,vmserrcode) (errno = (errcode)) +#endif + +#ifndef dSAVEDERRNO +# define dSAVEDERRNO int saved_errno +# define dSAVE_ERRNO int saved_errno = errno +# define SAVE_ERRNO (saved_errno = errno) +# define RESTORE_ERRNO (errno = saved_errno) +#endif + #define ERRSV GvSVn(PL_errgv) #define CLEAR_ERRSV() STMT_START { \ @@ -1412,8 +1276,6 @@ EXTERN_C char *crypt(const char *, const char *); # define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) #endif -#define ERRHV GvHV(PL_errgv) /* XXX unused, here for compatibility */ - #ifndef errno extern int errno; /* ANSI allows errno to be an lvalue expr. * For example in multithreaded environments @@ -1422,24 +1284,26 @@ EXTERN_C char *crypt(const char *, const char *); * #define errno (*_errno()) */ #endif +#define UNKNOWN_ERRNO_MSG "(unknown)" + #ifdef HAS_STRERROR -#ifndef DONT_DECLARE_STD +# ifndef DONT_DECLARE_STD # ifdef VMS char *strerror (int,...); # else char *strerror (int); # endif -#endif -# ifndef Strerror -# define Strerror strerror -# endif +# endif +# ifndef Strerror +# define Strerror strerror +# endif #else # ifdef HAS_SYS_ERRLIST extern int sys_nerr; extern char *sys_errlist[]; # ifndef Strerror # define Strerror(e) \ - ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e]) + ((e) < 0 || (e) >= sys_nerr ? UNKNOWN_ERRNO_MSG : sys_errlist[e]) # endif # endif #endif @@ -1494,26 +1358,13 @@ EXTERN_C char *crypt(const char *, const char *); # endif #endif -#ifdef PERL_MICRO -# ifndef DIR -# define DIR void -# endif -#endif - -#ifdef FPUTS_BOTCH -/* work around botch in SunOS 4.0.1 and 4.0.2 */ -# ifndef fputs -# define fputs(sv,fp) fprintf(fp,"%s",sv) -# endif -#endif - /* * The following gobbledygook brought to you on behalf of __STDC__. * (I could just use #ifndef __STDC__, but this is more bulletproof * in the face of half-implementations.) */ -#if defined(I_SYSMODE) && !defined(PERL_MICRO) +#if defined(I_SYSMODE) #include #endif @@ -1657,10 +1508,6 @@ EXTERN_C char *crypt(const char *, const char *); # define S_IEXEC S_IXUSR #endif -#ifdef ff_next -# undef ff_next -#endif - #if defined(cray) || defined(gould) || defined(i860) || defined(pyr) # define SLOPPYDIVIDE #endif @@ -1785,16 +1632,17 @@ typedef UVTYPE UV; # else # undef IV_IS_QUAD # undef UV_IS_QUAD +#if !defined(PERL_CORE) || defined(USING_MSVC6) +/* We think that removing this decade-old undef this will cause too much + breakage on CPAN for too little gain. (See RT #119753) + However, we do need HAS_QUAD in the core for use by the drand48 code, + but not for Win32 VC6 because it has poor __int64 support. */ # undef HAS_QUAD +#endif # endif #endif -#ifndef HAS_QUAD -# undef PERL_NEED_MY_HTOLE64 -# undef PERL_NEED_MY_LETOH64 -# undef PERL_NEED_MY_HTOBE64 -# undef PERL_NEED_MY_BETOH64 -#endif +#define SSize_t_MAX (SSize_t)(~(size_t)0 >> 1) #define IV_DIG (BIT_DIGITS(IVSIZE * 8)) #define UV_DIG (BIT_DIGITS(UVSIZE * 8)) @@ -1950,6 +1798,16 @@ typedef NVTYPE NV; # include #endif +#ifdef USING_MSVC6 +/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false, + * and for example NaN < IV_MIN. */ +# define NAN_COMPARE_BROKEN +#endif +#if defined(__DECC) && defined(__osf__) +/* Also Tru64 cc has broken NaN comparisons. */ +# define NAN_COMPARE_BROKEN +#endif + #ifdef USE_LONG_DOUBLE # ifdef I_SUNMATH # include @@ -2109,7 +1967,7 @@ EXTERN_C long double modfl(long double, long double *); # define Perl_fp_class_zero(x) (Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO) #endif -#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) && !defined(PERL_MICRO) +#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) # include # if !defined(FP_SNAN) && defined(I_FP_CLASS) # include @@ -2418,9 +2276,6 @@ int isnan(double d); #endif -struct RExC_state_t; -struct _reg_trie_data; - typedef MEM_SIZE STRLEN; #ifdef PERL_MAD @@ -2474,6 +2329,7 @@ typedef struct xpvuv XPVUV; typedef struct xpvnv XPVNV; typedef struct xpvmg XPVMG; typedef struct xpvlv XPVLV; +typedef struct xpvinvlist XINVLIST; typedef struct xpvav XPVAV; typedef struct xpvhv XPVHV; typedef struct xpvgv XPVGV; @@ -2494,11 +2350,10 @@ typedef AV PAD; typedef AV PADNAMELIST; typedef SV PADNAME; -/* XXX for 5.18, disable the COW by default - * #if !defined(PERL_OLD_COPY_ON_WRITE) && !defined(PERL_NEW_COPY_ON_WRITE) && !defined(PERL_NO_COW) - * # define PERL_NEW_COPY_ON_WRITE - * #endif - */ +/* enable PERL_NEW_COPY_ON_WRITE by default */ +#if !defined(PERL_OLD_COPY_ON_WRITE) && !defined(PERL_NEW_COPY_ON_WRITE) && !defined(PERL_NO_COW) +# define PERL_NEW_COPY_ON_WRITE +#endif #if defined(PERL_OLD_COPY_ON_WRITE) || defined(PERL_NEW_COPY_ON_WRITE) # if defined(PERL_OLD_COPY_ON_WRITE) && defined(PERL_NEW_COPY_ON_WRITE) @@ -2622,42 +2477,22 @@ typedef SV PADNAME; # else # include "dosish.h" # endif -# define ISHISH "dos" -#endif - -#if defined(VMS) +#elif defined(VMS) # include "vmsish.h" -# define ISHISH "vms" -#endif - -#if defined(PLAN9) +#elif defined(PLAN9) # include "./plan9/plan9ish.h" -# define ISHISH "plan9" -#endif - -#if defined(__VOS__) +#elif defined(__VOS__) # ifdef __GNUC__ # include "./vos/vosish.h" # else # include "vos/vosish.h" # endif -# define ISHISH "vos" -#endif - -#ifdef __SYMBIAN32__ +#elif defined(__SYMBIAN32__) # include "symbian/symbianish.h" -# define ISHISH "symbian" -#endif - - -#if defined(__HAIKU__) +#elif defined(__HAIKU__) # include "haiku/haikuish.h" -# define ISHISH "haiku" -#endif - -#ifndef ISHISH +#else # include "unixish.h" -# define ISHISH "unix" #endif /* NSIG logic from Configure --> */ @@ -2758,17 +2593,17 @@ typedef SV PADNAME; /* =for apidoc Am|void|PERL_SYS_INIT|int *argc|char*** argv Provides system-specific tune up of the C runtime environment necessary to -run Perl interpreters. This should be called only once, before creating +run Perl interpreters. This should be called only once, before creating any Perl interpreters. =for apidoc Am|void|PERL_SYS_INIT3|int *argc|char*** argv|char*** env Provides system-specific tune up of the C runtime environment necessary to -run Perl interpreters. This should be called only once, before creating +run Perl interpreters. This should be called only once, before creating any Perl interpreters. =for apidoc Am|void|PERL_SYS_TERM| Provides system-specific clean up of the C runtime environment after -running Perl interpreters. This should be called only once, after +running Perl interpreters. This should be called only once, after freeing any remaining Perl interpreters. =cut @@ -2862,9 +2697,6 @@ freeing any remaining Perl interpreters. # ifdef NETWARE # include # else -# ifdef FAKE_THREADS -# include "fakethr.h" -# else # ifdef WIN32 # include # else @@ -2891,8 +2723,7 @@ typedef pthread_key_t perl_key; # endif /* I_MACH_CTHREADS */ # endif /* OS2 */ # endif /* WIN32 */ -# endif /* FAKE_THREADS */ -#endif /* NETWARE */ +# endif /* NETWARE */ #endif /* USE_ITHREADS */ #if defined(WIN32) @@ -3145,6 +2976,8 @@ typedef pthread_key_t perl_key; /* flags in PL_exit_flags for nature of exit() */ #define PERL_EXIT_EXPECTED 0x01 #define PERL_EXIT_DESTRUCT_END 0x02 /* Run END in perl_destruct */ +#define PERL_EXIT_WARN 0x04 /* Warn if Perl_my_exit() or Perl_my_failure_exit() called */ +#define PERL_EXIT_ABORT 0x08 /* Call abort() if Perl_my_exit() or Perl_my_failure_exit() called */ #ifndef PERL_CORE /* format to use for version numbers in file/directory names */ @@ -3166,7 +2999,7 @@ typedef pthread_key_t perl_key; * out there, Solaris being the most prominent. */ #ifndef PERL_FLUSHALL_FOR_CHILD -# if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO) +# if defined(USE_PERLIO) || defined(FFLUSH_NULL) # define PERL_FLUSHALL_FOR_CHILD PerlIO_flush((PerlIO*)NULL) # else # ifdef FFLUSH_ALL @@ -3239,14 +3072,11 @@ typedef pthread_key_t perl_key; #define HEKfARG(p) ((void*)(p)) -#ifdef PERL_CORE -/* not used; but needed for backward compatibility with XS code? - RMB */ -# undef VDf -#else -# ifndef VDf -# define VDf "vd" -# endif +/* Takes three arguments: is_utf8, length, str */ +#ifndef UTF8f +# define UTF8f "d%" UVuf "%4p" #endif +#define UTF8fARG(u,l,p) (int)cBOOL(u), (UV)(l), (void*)(p) #ifdef PERL_CORE /* not used; but needed for backward compatibility with XS code? - RMB */ @@ -3312,9 +3142,9 @@ typedef pthread_key_t perl_key; appropriate to call return. In either case, include the lint directive. */ #ifdef HASATTRIBUTE_NORETURN -# define NORETURN_FUNCTION_END assert(0); /* NOTREACHED */ +# define NORETURN_FUNCTION_END NOT_REACHED; /* NOTREACHED */ #else -# define NORETURN_FUNCTION_END assert(0); /* NOTREACHED */ return 0 +# define NORETURN_FUNCTION_END NOT_REACHED; /* NOTREACHED */ return 0 #endif /* Some OS warn on NULL format to printf */ @@ -3329,12 +3159,45 @@ typedef pthread_key_t perl_key; #else # define EXPECT(expr,val) (expr) #endif -#define LIKELY(cond) EXPECT(cond,1) -#define UNLIKELY(cond) EXPECT(cond,0) +#define LIKELY(cond) EXPECT(cBOOL(cond),TRUE) +#define UNLIKELY(cond) EXPECT(cBOOL(cond),FALSE) #ifdef HAS_BUILTIN_CHOOSE_EXPR /* placeholder */ #endif + +#ifndef __has_builtin +# define __has_builtin(x) 0 /* not a clang style compiler */ +#endif + +/* ASSUME is like assert(), but it has a benefit in a release build. It is a + hint to a compiler about a statement of fact in a function call free + expression, which allows the compiler to generate better machine code. + In a debug build, ASSUME(x) is a synonym for assert(x). ASSUME(0) means + the control path is unreachable. In a for loop, ASSUME can be used to hint + that a loop will run atleast X times. ASSUME is based off MSVC's __assume + intrinsic function, see its documents for more details. +*/ + +#ifndef DEBUGGING +# if __has_builtin(__builtin_unreachable) \ + || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5 || __GNUC__ > 5) /* 4.5 -> */ +# define ASSUME(x) ((x) ? (void) 0 : __builtin_unreachable()) +# elif defined(_MSC_VER) +# define ASSUME(x) __assume(x) +# elif defined(__ARMCC_VERSION) /* untested */ +# define ASSUME(x) __promise(x) +# else +/* a random compiler might define assert to its own special optimization token + so pass it through to C lib as a last resort */ +# define ASSUME(x) assert(x) +# endif +#else +# define ASSUME(x) assert(x) +#endif + +#define NOT_REACHED ASSUME(0) + /* Some unistd.h's give a prototype for pause() even though HAS_PAUSE ends up undefined. This causes the #define below to be rejected by the compiler. Sigh. @@ -3383,6 +3246,7 @@ UNION_ANY_DEFINITION; union any { void* any_ptr; I32 any_i32; + U32 any_u32; IV any_iv; UV any_uv; long any_long; @@ -3402,7 +3266,7 @@ typedef I32 (*filter_t) (pTHX_ int, SV *, int); && idx >= AvFILLp(PL_parser->rsfp_filters)) #define PERL_FILTER_EXISTS(i) \ (PL_parser && PL_parser->rsfp_filters \ - && (i) <= av_len(PL_parser->rsfp_filters)) + && (i) <= av_tindex(PL_parser->rsfp_filters)) #if defined(_AIX) && !defined(_AIX43) #if defined(USE_REENTRANT) || defined(_REENTRANT) || defined(_THREAD_SAFE) @@ -3506,8 +3370,25 @@ struct _sublex_info { typedef struct magic_state MGS; /* struct magic_state defined in mg.c */ -struct scan_data_t; /* Used in S_* functions in regcomp.c */ -struct regnode_charclass_class; /* Used in S_* functions in regcomp.c */ +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) + +/* These have to be predeclared, as they are used in proto.h which is #included + * before their definitions in regcomp.h. */ + +struct scan_data_t; +typedef struct regnode_charclass regnode_charclass; + +struct regnode_charclass_class; + +/* A hopefully less confusing name. The sub-classes are all Posix classes only + * used under /l matching */ +typedef struct regnode_charclass_class regnode_charclass_posixl; + +typedef struct regnode_ssc regnode_ssc; +typedef struct RExC_state_t RExC_state_t; +struct _reg_trie_data; + +#endif struct ptr_tbl_ent { struct ptr_tbl_ent* next; @@ -3537,36 +3418,70 @@ struct ptr_tbl { #define HAS_NTOHS #endif #ifndef HAS_HTONL -#if (BYTEORDER & 0xffff) != 0x4321 #define HAS_HTONS #define HAS_HTONL #define HAS_NTOHS #define HAS_NTOHL -#define MYSWAP -#define htons my_swap -#define htonl my_htonl -#define ntohs my_swap -#define ntohl my_ntohl -#endif -#else -#if (BYTEORDER & 0xffff) == 0x4321 -#undef HAS_HTONS -#undef HAS_HTONL -#undef HAS_NTOHS -#undef HAS_NTOHL -#endif +# if (BYTEORDER & 0xffff) == 0x4321 +/* Big endian system, so ntohl, ntohs, htonl and htons do not need to + re-order their values. However, to behave identically to the alternative + implementations, they should truncate to the correct size. */ +# define ntohl(x) ((x)&0xFFFFFFFF) +# define htonl(x) ntohl(x) +# define ntohs(x) ((x)&0xFFFF) +# define htons(x) ntohs(x) +# elif BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 + +/* Note that we can't straight out declare our own htonl and htons because + the Win32 build process forcibly undefines HAS_HTONL etc for its miniperl, + to avoid the overhead of initialising the socket subsystem, but the headers + that *declare* the various functions are still seen. If we declare our own + htonl etc they will clash with the declarations in the Win32 headers. */ + +PERL_STATIC_INLINE U32 +my_swap32(const U32 x) { + return ((x & 0xFF) << 24) | ((x >> 24) & 0xFF) + | ((x & 0x0000FF00) << 8) | ((x & 0x00FF0000) >> 8); +} + +PERL_STATIC_INLINE U16 +my_swap16(const U16 x) { + return ((x & 0xFF) << 8) | ((x >> 8) & 0xFF); +} + +# define htonl(x) my_swap32(x) +# define ntohl(x) my_swap32(x) +# define ntohs(x) my_swap16(x) +# define htons(x) my_swap16(x) +# else +# error "Unsupported byteorder" +/* The C pre-processor doesn't let us return the value of BYTEORDER as part of + the error message. Please check the value of the macro BYTEORDER, as defined + in config.h. The values of BYTEORDER we expect are + + big endian little endian + 32 bit 0x4321 0x1234 + 64 bit 0x87654321 0x12345678 + + If you have a system with a different byte order, please see + pod/perlhack.pod for how to submit a patch to add supporting code. +*/ +# endif #endif /* * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'. * -DWS */ -#if BYTEORDER != 0x1234 -# define HAS_VTOHL -# define HAS_VTOHS -# define HAS_HTOVL -# define HAS_HTOVS -# if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 +#if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 +/* Little endian system, so vtohl, vtohs, htovl and htovs do not need to + re-order their values. However, to behave identically to the alternative + implementations, they should truncate to the correct size. */ +# define vtohl(x) ((x)&0xFFFFFFFF) +# define vtohs(x) ((x)&0xFFFF) +# define htovl(x) vtohl(x) +# define htovs(x) vtohs(x) +#elif BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 # define vtohl(x) ((((x)&0xFF)<<24) \ +(((x)>>24)&0xFF) \ +(((x)&0x0000FF00)<<8) \ @@ -3574,14 +3489,11 @@ struct ptr_tbl { # define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF)) # define htovl(x) vtohl(x) # define htovs(x) vtohs(x) -# endif - /* otherwise default to functions in util.c */ -#ifndef htovs -short htovs(short n); -short vtohs(short n); -long htovl(long n); -long vtohl(long n); -#endif +#else +# error "Unsupported byteorder" +/* If you have need for current perl on PDP-11 or similar, and can help test + that blead keeps working on a mixed-endian system, then see + pod/perlhack.pod for how to submit patches to things working again. */ #endif /* *MAX Plus 1. A floating point value. @@ -3619,11 +3531,11 @@ long vtohl(long n); #define U_32(n) ((n) < 0.0 ? ((n) < I32_MIN ? (UV) I32_MIN : (U32)(I32) (n)) \ : ((n) < U32_MAX_P1 ? (U32) (n) \ : ((n) > 0 ? U32_MAX : 0 /* NaN */))) -#define I_V(n) ((n) < IV_MAX_P1 ? ((n) < IV_MIN ? IV_MIN : (IV) (n)) \ - : ((n) < UV_MAX_P1 ? (IV)(UV) (n) \ +#define I_V(n) (LIKELY((n) < IV_MAX_P1) ? (UNLIKELY((n) < IV_MIN) ? IV_MIN : (IV) (n)) \ + : (LIKELY((n) < UV_MAX_P1) ? (IV)(UV) (n) \ : ((n) > 0 ? (IV)UV_MAX : 0 /* NaN */))) -#define U_V(n) ((n) < 0.0 ? ((n) < IV_MIN ? (UV) IV_MIN : (UV)(IV) (n)) \ - : ((n) < UV_MAX_P1 ? (UV) (n) \ +#define U_V(n) ((n) < 0.0 ? (UNLIKELY((n) < IV_MIN) ? (UV) IV_MIN : (UV)(IV) (n)) \ + : (LIKELY((n) < UV_MAX_P1) ? (UV) (n) \ : ((n) > 0 ? UV_MAX : 0 /* NaN */))) #endif @@ -3698,7 +3610,8 @@ Gid_t getegid (void); #define DEBUG_q_FLAG 0x00800000 /*8388608 */ #define DEBUG_M_FLAG 0x01000000 /*16777216*/ #define DEBUG_B_FLAG 0x02000000 /*33554432*/ -#define DEBUG_MASK 0x03FFEFFF /* mask of all the standard flags */ +#define DEBUG_L_FLAG 0x04000000 /*67108864*/ +#define DEBUG_MASK 0x07FFEFFF /* mask of all the standard flags */ #define DEBUG_DB_RECURSE_FLAG 0x40000000 #define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? Signal @@ -3730,6 +3643,7 @@ Gid_t getegid (void); # define DEBUG_q_TEST_ (PL_debug & DEBUG_q_FLAG) # define DEBUG_M_TEST_ (PL_debug & DEBUG_M_FLAG) # define DEBUG_B_TEST_ (PL_debug & DEBUG_B_FLAG) +# define DEBUG_L_TEST_ (PL_debug & DEBUG_L_FLAG) # define DEBUG_Xv_TEST_ (DEBUG_X_TEST_ && DEBUG_v_TEST_) # define DEBUG_Uv_TEST_ (DEBUG_U_TEST_ && DEBUG_v_TEST_) # define DEBUG_Pv_TEST_ (DEBUG_P_TEST_ && DEBUG_v_TEST_) @@ -3762,6 +3676,7 @@ Gid_t getegid (void); # define DEBUG_q_TEST DEBUG_q_TEST_ # define DEBUG_M_TEST DEBUG_M_TEST_ # define DEBUG_B_TEST DEBUG_B_TEST_ +# define DEBUG_L_TEST DEBUG_L_TEST_ # define DEBUG_Xv_TEST DEBUG_Xv_TEST_ # define DEBUG_Uv_TEST DEBUG_Uv_TEST_ # define DEBUG_Pv_TEST DEBUG_Pv_TEST_ @@ -3813,6 +3728,7 @@ Gid_t getegid (void); # define DEBUG_q(a) DEBUG__(DEBUG_q_TEST, a) # define DEBUG_M(a) DEBUG__(DEBUG_M_TEST, a) # define DEBUG_B(a) DEBUG__(DEBUG_B_TEST, a) +# define DEBUG_L(a) DEBUG__(DEBUG_L_TEST, a) #else /* DEBUGGING */ @@ -3842,6 +3758,7 @@ Gid_t getegid (void); # define DEBUG_q_TEST (0) # define DEBUG_M_TEST (0) # define DEBUG_B_TEST (0) +# define DEBUG_L_TEST (0) # define DEBUG_Xv_TEST (0) # define DEBUG_Uv_TEST (0) # define DEBUG_Pv_TEST (0) @@ -3873,6 +3790,7 @@ Gid_t getegid (void); # define DEBUG_q(a) # define DEBUG_M(a) # define DEBUG_B(a) +# define DEBUG_L(a) # define DEBUG_Xv(a) # define DEBUG_Uv(a) # define DEBUG_Pv(a) @@ -4105,7 +4023,7 @@ typedef Sighandler_t Sigsave_t; # define RUNOPS_DEFAULT Perl_runops_standard #endif -#ifdef USE_PERLIO +#if defined(USE_PERLIO) EXTERN_C void PerlIO_teardown(void); # ifdef USE_ITHREADS # define PERLIO_INIT MUTEX_INIT(&PL_perlio_mutex) @@ -4150,28 +4068,52 @@ EXTERN_C void PerlIO_teardown(void); struct perl_memory_debug_header; struct perl_memory_debug_header { tTHX interpreter; -# ifdef PERL_POISON +# if defined(PERL_POISON) || defined(PERL_DEBUG_READONLY_COW) MEM_SIZE size; # endif struct perl_memory_debug_header *prev; struct perl_memory_debug_header *next; +# ifdef PERL_DEBUG_READONLY_COW + bool readonly; +# endif +}; + +#elif defined(PERL_DEBUG_READONLY_COW) + +struct perl_memory_debug_header; +struct perl_memory_debug_header { + MEM_SIZE size; }; -# define sTHX (sizeof(struct perl_memory_debug_header) + \ +#endif + +#if defined (PERL_TRACK_MEMPOOL) || defined (PERL_DEBUG_READONLY_COW) + +# define PERL_MEMORY_DEBUG_HEADER_SIZE \ + (sizeof(struct perl_memory_debug_header) + \ (MEM_ALIGNBYTES - sizeof(struct perl_memory_debug_header) \ %MEM_ALIGNBYTES) % MEM_ALIGNBYTES) #else -# define sTHX 0 +# define PERL_MEMORY_DEBUG_HEADER_SIZE 0 #endif #ifdef PERL_TRACK_MEMPOOL +# ifdef PERL_DEBUG_READONLY_COW # define INIT_TRACK_MEMPOOL(header, interp) \ STMT_START { \ (header).interpreter = (interp); \ (header).prev = (header).next = &(header); \ + (header).readonly = 0; \ } STMT_END -# else +# else +# define INIT_TRACK_MEMPOOL(header, interp) \ + STMT_START { \ + (header).interpreter = (interp); \ + (header).prev = (header).next = &(header); \ + } STMT_END +# endif +# else # define INIT_TRACK_MEMPOOL(header, interp) #endif @@ -4183,10 +4125,10 @@ struct perl_memory_debug_header { #ifdef MYMALLOC # define Perl_safesysmalloc_size(where) Perl_malloced_size(where) #else -# ifdef HAS_MALLOC_SIZE +# if defined(HAS_MALLOC_SIZE) && !defined(PERL_DEBUG_READONLY_COW) # ifdef PERL_TRACK_MEMPOOL # define Perl_safesysmalloc_size(where) \ - (malloc_size(((char *)(where)) - sTHX) - sTHX) + (malloc_size(((char *)(where)) - PERL_MEMORY_DEBUG_HEADER_SIZE) - PERL_MEMORY_DEBUG_HEADER_SIZE) # else # define Perl_safesysmalloc_size(where) malloc_size(where) # endif @@ -4194,7 +4136,7 @@ struct perl_memory_debug_header { # ifdef HAS_MALLOC_GOOD_SIZE # ifdef PERL_TRACK_MEMPOOL # define Perl_malloc_good_size(how_much) \ - (malloc_good_size((how_much) + sTHX) - sTHX) + (malloc_good_size((how_much) + PERL_MEMORY_DEBUG_HEADER_SIZE) - PERL_MEMORY_DEBUG_HEADER_SIZE) # else # define Perl_malloc_good_size(how_much) malloc_good_size(how_much) # endif @@ -4228,9 +4170,8 @@ EXT char *** environ_pointer; /* VMS and some other platforms don't use the environ array */ # ifdef USE_ENVIRON_ARRAY # if !defined(DONT_DECLARE_STD) || \ - (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \ - defined(__sgi) || \ - defined(__DGUX) + (defined(__svr4__) && defined(__GNUC__) && defined(__sun)) || \ + defined(__sgi) extern char ** environ; /* environment variables supplied via exec */ # endif # endif @@ -4254,7 +4195,7 @@ START_EXTERN_C EXTCONST char PL_warn_uninit[] INIT("Use of uninitialized value%s%s%s"); EXTCONST char PL_warn_uninit_sv[] - INIT("Use of uninitialized value%"SVf"%s%s"); + INIT("Use of uninitialized value%" SVf "%s%s"); EXTCONST char PL_warn_nosemi[] INIT("Semicolon seems to be missing"); EXTCONST char PL_warn_reserved[] @@ -4274,7 +4215,7 @@ EXTCONST char PL_no_usym[] EXTCONST char PL_no_aelem[] INIT("Modification of non-creatable array value attempted, subscript %d"); EXTCONST char PL_no_helem_sv[] - INIT("Modification of non-creatable hash value attempted, subscript \"%"SVf"\""); + INIT("Modification of non-creatable hash value attempted, subscript \"%" SVf "\""); EXTCONST char PL_no_modify[] INIT("Modification of a read-only value attempted"); EXTCONST char PL_no_mem[sizeof("Out of memory!\n")] @@ -4438,7 +4379,6 @@ EXTCONST unsigned char PL_fold_latin1[] = { 248-32, 249-32, 250-32, 251-32, 252-32, 253-32, 254-32, 255 /* y with diaeresis */ }; -#endif /* !EBCDIC, but still in DOINIT */ /* If these tables are accessed through ebcdic, the access will be converted to * latin1 first */ @@ -4513,13 +4453,14 @@ EXTCONST unsigned char PL_mod_latin1_uc[] = { 240-32, 241-32, 242-32, 243-32, 244-32, 245-32, 246-32, 247, 248-32, 249-32, 250-32, 251-32, 252-32, 253-32, 254-32, 255 }; +#endif /* !EBCDIC, but still in DOINIT */ #else /* ! DOINIT */ -#ifndef EBCDIC +# ifndef EBCDIC EXTCONST unsigned char PL_fold[]; EXTCONST unsigned char PL_fold_latin1[]; -#endif EXTCONST unsigned char PL_mod_latin1_uc[]; EXTCONST unsigned char PL_latin1_lc[]; +# endif #endif #ifndef PERL_GLOBAL_STRUCT /* or perlvars.h */ @@ -4674,9 +4615,6 @@ EXTCONST char PL_bincompat_options[] = # ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP " DEBUG_LEAKING_SCALARS_FORK_DUMP" # endif -# ifdef FAKE_THREADS - " FAKE_THREADS" -# endif # ifdef FCRYPT " FCRYPT" # endif @@ -4695,12 +4633,18 @@ EXTCONST char PL_bincompat_options[] = # ifdef PERLIO_LAYERS " PERLIO_LAYERS" # endif +# ifdef PERL_DEBUG_READONLY_COW + " PERL_DEBUG_READONLY_COW" +# endif # ifdef PERL_DEBUG_READONLY_OPS " PERL_DEBUG_READONLY_OPS" # endif # ifdef PERL_GLOBAL_STRUCT " PERL_GLOBAL_STRUCT" # endif +# ifdef PERL_GLOBAL_STRUCT_PRIVATE + " PERL_GLOBAL_STRUCT_PRIVATE" +# endif # ifdef PERL_IMPLICIT_CONTEXT " PERL_IMPLICIT_CONTEXT" # endif @@ -4722,9 +4666,6 @@ EXTCONST char PL_bincompat_options[] = # ifdef PERL_OLD_COPY_ON_WRITE " PERL_OLD_COPY_ON_WRITE" # endif -# ifdef PERL_NEW_COPY_ON_WRITE - " PERL_NEW_COPY_ON_WRITE" -# endif # ifdef PERL_POISON " PERL_POISON" # endif @@ -4767,9 +4708,6 @@ EXTCONST char PL_bincompat_options[] = # ifdef USE_REENTRANT_API " USE_REENTRANT_API" # endif -# ifdef USE_SFIO - " USE_SFIO" -# endif # ifdef USE_SOCKS " USE_SOCKS" # endif @@ -4828,6 +4766,8 @@ EXTCONST char *const PL_phase_names[]; # define PL_amagic_generation PL_na #endif /* !PERL_CORE */ +#define PL_hints PL_compiling.cop_hints + END_EXTERN_C /*****************************************************************************/ @@ -4856,13 +4796,17 @@ typedef enum { XATTRBLOCK, XATTRTERM, XTERMBLOCK, + XPOSTDEREF, XTERMORDORDOR /* evil hack */ /* update exp_name[] in toke.c if adding to this enum */ } expectation; /* Hints are now stored in a dedicated U32, so the bottom 8 bits are no longer special and there is no need for HINT_PRIVATE_MASK for COPs - However, bitops store HINT_INTEGER in their op_private. */ + However, bitops store HINT_INTEGER in their op_private. + + NOTE: The typical module using these has the bit value hard-coded, so don't + blindly change the values of these */ #define HINT_INTEGER 0x00000001 /* integer pragma */ #define HINT_STRICT_REFS 0x00000002 /* strict pragma */ #define HINT_LOCALE 0x00000004 /* locale pragma */ @@ -5214,19 +5158,19 @@ EXTCONST U8 PL_magic_data[256]; #endif #ifdef DOINIT - /* NL BD IV NV PV PI PN MG RX GV LV AV HV CV FM IO */ + /* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO */ EXTCONST bool -PL_valid_types_IVX[] = { 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_IVX[] = { 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; EXTCONST bool -PL_valid_types_NVX[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_NVX[] = { 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; EXTCONST bool -PL_valid_types_PVX[] = { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1 }; +PL_valid_types_PVX[] = { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1 }; EXTCONST bool -PL_valid_types_RV[] = { 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }; +PL_valid_types_RV[] = { 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }; EXTCONST bool -PL_valid_types_IV_set[] = { 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }; +PL_valid_types_IV_set[] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }; EXTCONST bool -PL_valid_types_NV_set[] = { 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_NV_set[] = { 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; #else @@ -5352,25 +5296,39 @@ typedef struct am_table_short AMTS; #define PERLDB_SAVESRC_NOSUBS (PL_perldb && (PL_perldb & PERLDBf_SAVESRC_NOSUBS)) #define PERLDB_SAVESRC_INVALID (PL_perldb && (PL_perldb & PERLDBf_SAVESRC_INVALID)) -#ifdef USE_LOCALE_NUMERIC +/* -#define SET_NUMERIC_STANDARD() \ - set_numeric_standard(); +=head1 Locale-related functions and macros -#define SET_NUMERIC_LOCAL() \ - set_numeric_local(); +=for apidoc sync_locale + +Changing the program's locale should be avoided by XS code. Nevertheless, +certain non-Perl libraries called from XS, such as C do so. When this +happens, Perl needs to be told that the locale has changed. Use this macro +to do so, before returning to Perl code. + +=cut +*/ -/* Returns non-zero If the plain locale pragma without a parameter is in effect +/* Temporary for maint. Is a function in 5.21 */ +#define sync_locale() (new_ctype(setlocale(LC_CTYPE, NULL)), \ + new_collate(setlocale(LC_COLLATE, NULL)), \ + set_numeric_local(), \ + new_numeric(setlocale(LC_NUMERIC, NULL))) + +#ifdef USE_LOCALE_NUMERIC + +/* Returns TRUE if the plain locale pragma without a parameter is in effect */ -#define IN_LOCALE_RUNTIME (CopHINTS_get(PL_curcop) & HINT_LOCALE) +#define IN_LOCALE_RUNTIME cBOOL(CopHINTS_get(PL_curcop) & HINT_LOCALE) -/* Returns non-zero If either form of the locale pragma is in effect */ +/* Returns TRUE if either form of the locale pragma is in effect */ #define IN_SOME_LOCALE_FORM_RUNTIME \ - (CopHINTS_get(PL_curcop) & (HINT_LOCALE|HINT_LOCALE_NOT_CHARS)) + cBOOL(CopHINTS_get(PL_curcop) & (HINT_LOCALE|HINT_LOCALE_NOT_CHARS)) -#define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#define IN_LOCALE_COMPILETIME cBOOL(PL_hints & HINT_LOCALE) #define IN_SOME_LOCALE_FORM_COMPILETIME \ - (PL_hints & (HINT_LOCALE|HINT_LOCALE_NOT_CHARS)) + cBOOL(PL_hints & (HINT_LOCALE|HINT_LOCALE_NOT_CHARS)) #define IN_LOCALE \ (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) @@ -5378,12 +5336,68 @@ typedef struct am_table_short AMTS; (IN_PERL_COMPILETIME ? IN_SOME_LOCALE_FORM_COMPILETIME \ : IN_SOME_LOCALE_FORM_RUNTIME) +/* These macros are for toggling between the underlying locale (LOCAL) and the + * C locale. */ + +/* The first set makes sure that the locale is set to C unless within a 'use + * locale's scope; otherwise to the default locale. A function pointer is + * used, which can be declared separately by + * DECLARATION_FOR_STORE_LC_NUMERIC_SET_TO_NEEDED, followed by the actual + * setting (using STORE_LC_NUMERIC_SET_TO_NEEDED()), or the two can be combined + * into one call DECLARE_STORE_LC_NUMERIC_SET_TO_NEEDED(). + * RESTORE_LC_NUMERIC() in all cases restores the locale to what it was before + * these were called */ + +#define DECLARATION_FOR_STORE_LC_NUMERIC_SET_TO_NEEDED \ + void (*_restore_LC_NUMERIC_function)(pTHX) = NULL; + +#define STORE_LC_NUMERIC_SET_TO_NEEDED() \ + if (IN_SOME_LOCALE_FORM) { \ + if (! PL_numeric_local) { \ + SET_NUMERIC_LOCAL(); \ + _restore_LC_NUMERIC_function = &Perl_set_numeric_standard; \ + } \ + } \ + else { \ + if (! PL_numeric_standard) { \ + SET_NUMERIC_STANDARD(); \ + _restore_LC_NUMERIC_function = &Perl_set_numeric_local; \ + } \ + } + +#define DECLARE_STORE_LC_NUMERIC_SET_TO_NEEDED() \ + DECLARATION_FOR_STORE_LC_NUMERIC_SET_TO_NEEDED; \ + STORE_LC_NUMERIC_SET_TO_NEEDED(); + +#define RESTORE_LC_NUMERIC() \ + if (_restore_LC_NUMERIC_function) { \ + _restore_LC_NUMERIC_function(aTHX); \ + } + +/* The next two macros set unconditionally. These should be rarely used, and + * only after being sure that this is what is needed */ +#define SET_NUMERIC_STANDARD() \ + set_numeric_standard(); + +#define SET_NUMERIC_LOCAL() \ + set_numeric_local(); + +/* The rest of these LC_NUMERIC macros toggle to one or the other state, with + * the RESTORE_foo ones called to switch back, but only if need be */ #define STORE_NUMERIC_LOCAL_SET_STANDARD() \ - bool was_local = PL_numeric_local && IN_LOCALE; \ + bool was_local = PL_numeric_local; \ if (was_local) SET_NUMERIC_STANDARD(); +/* Doesn't change to underlying locale unless within the scope of some form of + * 'use locale'. This is the usual desired behavior. */ #define STORE_NUMERIC_STANDARD_SET_LOCAL() \ - bool was_standard = PL_numeric_standard && IN_LOCALE; \ + bool was_standard = PL_numeric_standard && IN_SOME_LOCALE_FORM; \ + if (was_standard) SET_NUMERIC_LOCAL(); + +/* Rarely, we want to change to the underlying locale even outside of 'use + * locale'. This is principally in the POSIX:: functions */ +#define STORE_NUMERIC_STANDARD_FORCE_LOCAL() \ + bool was_standard = PL_numeric_standard; \ if (was_standard) SET_NUMERIC_LOCAL(); #define RESTORE_NUMERIC_LOCAL() \ @@ -5401,8 +5415,14 @@ typedef struct am_table_short AMTS; #define IS_NUMERIC_RADIX(a, b) (0) #define STORE_NUMERIC_LOCAL_SET_STANDARD() /**/ #define STORE_NUMERIC_STANDARD_SET_LOCAL() /**/ +#define STORE_NUMERIC_STANDARD_FORCE_LOCAL() #define RESTORE_NUMERIC_LOCAL() /**/ #define RESTORE_NUMERIC_STANDARD() /**/ +#define DECLARATION_FOR_STORE_LC_NUMERIC_SET_TO_NEEDED +#define STORE_LC_NUMERIC_SET_TO_NEEDED() +#define DECLARE_STORE_LC_NUMERIC_SET_TO_NEEDED() +#define RESTORE_LC_NUMERIC() + #define Atof my_atof #define IN_LOCALE_RUNTIME 0 #define IN_LOCALE_COMPILETIME 0 @@ -5508,7 +5528,7 @@ typedef struct am_table_short AMTS; #ifndef PERL_MICRO # ifndef PERL_ASYNC_CHECK -# define PERL_ASYNC_CHECK() if (PL_sig_pending) PL_signalhook(aTHX) +# define PERL_ASYNC_CHECK() if (UNLIKELY(PL_sig_pending)) PL_signalhook(aTHX) # endif #endif @@ -5827,6 +5847,12 @@ extern void moncontrol(int); # define do_aexec(really, mark,sp) do_aexec5(really, mark, sp, 0, 0) #endif +/* check embedded \0 characters in pathnames passed to syscalls, + but allow one ending \0 */ +#define IS_SAFE_SYSCALL(p, len, what, op_name) (S_is_safe_syscall(aTHX_ (p), (len), (what), (op_name))) + +#define IS_SAFE_PATHNAME(p, len, op_name) IS_SAFE_SYSCALL((p), (len), "pathname", (op_name)) + #if defined(OEMVS) #define NO_ENV_ARRAY_IN_MAIN #endif @@ -5855,6 +5881,8 @@ extern void moncontrol(int); #define PERL_PV_ESCAPE_NOCLEAR 0x4000 #define PERL_PV_ESCAPE_RE 0x8000 +#define PERL_PV_ESCAPE_DWIM 0x10000 + #define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR /* used by pv_display in dump.c*/ diff --git a/Master/tlpkg/tlperl/lib/CORE/perlio.h b/Master/tlpkg/tlperl/lib/CORE/perlio.h index 7b5adbd3458..777c886f3f3 100644 --- a/Master/tlpkg/tlperl/lib/CORE/perlio.h +++ b/Master/tlpkg/tlperl/lib/CORE/perlio.h @@ -21,13 +21,7 @@ USE_PERLIO - The primary Configure variable that enables PerlIO. If USE_PERLIO is _NOT_ set then USE_STDIO above will be set to be conservative. - If USE_PERLIO is set - then there are two modes determined by USE_SFIO: - - USE_SFIO - If set causes PerlIO_xxx() to be #define-d onto sfio functions. - A backward compatibility mode for some specialist applications. - - If USE_SFIO is not set then PerlIO_xxx() are real functions + PerlIO_xxx() are real functions defined in perlio.c which implement extra functionality required for utf8 support. @@ -80,11 +74,6 @@ #ifdef PERLIO_IS_STDIO /* #define PerlIO_xxxx() as equivalent stdio function */ #include "perlsdio.h" -#else /* PERLIO_IS_STDIO */ -#ifdef USE_SFIO -/* #define PerlIO_xxxx() as equivalent sfio function */ -#include "perlsfio.h" -#endif /* USE_SFIO */ #endif /* PERLIO_IS_STDIO */ #ifndef PerlIO @@ -132,19 +121,19 @@ PERL_EXPORT_C void PerlIO_clone(pTHX_ PerlInterpreter *proto, * can set how it wants. */ -#ifdef PERL_CORE +# ifdef PERL_CORE /* Make a choice for perl core code - currently this is set to try and catch lingering raw stdio calls. This is a known issue with some non UNIX ports which still use "native" stdio features. */ -#ifndef PERLIO_NOT_STDIO -#define PERLIO_NOT_STDIO 1 -#endif -#else -#ifndef PERLIO_NOT_STDIO -#define PERLIO_NOT_STDIO 0 -#endif +# ifndef PERLIO_NOT_STDIO +# define PERLIO_NOT_STDIO 1 +# endif + #else +# ifndef PERLIO_NOT_STDIO +# define PERLIO_NOT_STDIO 0 +# endif #endif #ifdef PERLIO_NOT_STDIO @@ -281,10 +270,6 @@ PERL_EXPORT_C void PerlIO_setlinebuf(PerlIO *); PERL_EXPORT_C int PerlIO_printf(PerlIO *, const char *, ...) __attribute__format__(__printf__, 2, 3); #endif -#ifndef PerlIO_sprintf -PERL_EXPORT_C int PerlIO_sprintf(char *, int, const char *, ...) - __attribute__format__(__printf__, 3, 4); -#endif #ifndef PerlIO_vprintf PERL_EXPORT_C int PerlIO_vprintf(PerlIO *, const char *, va_list); #endif @@ -313,19 +298,19 @@ PERL_EXPORT_C int PerlIO_canset_cnt(PerlIO *); PERL_EXPORT_C STDCHAR *PerlIO_get_ptr(PerlIO *); #endif #ifndef PerlIO_get_cnt -PERL_EXPORT_C int PerlIO_get_cnt(PerlIO *); +PERL_EXPORT_C SSize_t PerlIO_get_cnt(PerlIO *); #endif #ifndef PerlIO_set_cnt -PERL_EXPORT_C void PerlIO_set_cnt(PerlIO *, int); +PERL_EXPORT_C void PerlIO_set_cnt(PerlIO *, SSize_t); #endif #ifndef PerlIO_set_ptrcnt -PERL_EXPORT_C void PerlIO_set_ptrcnt(PerlIO *, STDCHAR *, int); +PERL_EXPORT_C void PerlIO_set_ptrcnt(PerlIO *, STDCHAR *, SSize_t); #endif #ifndef PerlIO_get_base PERL_EXPORT_C STDCHAR *PerlIO_get_base(PerlIO *); #endif #ifndef PerlIO_get_bufsiz -PERL_EXPORT_C int PerlIO_get_bufsiz(PerlIO *); +PERL_EXPORT_C SSize_t PerlIO_get_bufsiz(PerlIO *); #endif #ifndef PerlIO_tmpfile PERL_EXPORT_C PerlIO *PerlIO_tmpfile(void); diff --git a/Master/tlpkg/tlperl/lib/CORE/perliol.h b/Master/tlpkg/tlperl/lib/CORE/perliol.h index c667f1f5ebc..236932616df 100644 --- a/Master/tlpkg/tlperl/lib/CORE/perliol.h +++ b/Master/tlpkg/tlperl/lib/CORE/perliol.h @@ -158,8 +158,6 @@ PERL_EXPORT_C PerlIO_list_t * PerlIO_resolve_layers(pTHX_ const char *layers, co PERL_EXPORT_C PerlIO_funcs * PerlIO_default_layer(pTHX_ I32 n); PERL_EXPORT_C PerlIO_list_t * PerlIO_default_layers(pTHX); PERL_EXPORT_C PerlIO * PerlIO_reopen(const char *path, const char *mode, PerlIO *f); -PERL_EXPORT_C int PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap) - __attribute__format__(__printf__,3,0); PERL_EXPORT_C PerlIO_list_t *PerlIO_list_alloc(pTHX); PERL_EXPORT_C PerlIO_list_t *PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param); @@ -217,7 +215,6 @@ PERL_EXPORT_C SSize_t PerlIOCrlf_get_cnt(pTHX_ PerlIO *f); PERL_EXPORT_C IV PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab); PERL_EXPORT_C void PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt); PERL_EXPORT_C SSize_t PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count); -PERL_EXPORT_C SSize_t PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count); PERL_EXPORT_C SSize_t PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count); /* Pending */ @@ -242,9 +239,17 @@ PERL_EXPORT_C PerlIO * PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS PERL_EXPORT_C IV PerlIOStdio_eof(pTHX_ PerlIO *f); PERL_EXPORT_C IV PerlIOStdio_error(pTHX_ PerlIO *f); PERL_EXPORT_C IV PerlIOStdio_fileno(pTHX_ PerlIO *f); +#ifdef USE_STDIO_PTR +PERL_EXPORT_C STDCHAR * PerlIOStdio_get_ptr(pTHX_ PerlIO *f); +PERL_EXPORT_C SSize_t PerlIOStdio_get_cnt(pTHX_ PerlIO *f); +PERL_EXPORT_C void PerlIOStdio_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt); +#endif PERL_EXPORT_C IV PerlIOStdio_fill(pTHX_ PerlIO *f); PERL_EXPORT_C IV PerlIOStdio_flush(pTHX_ PerlIO *f); +#ifdef FILE_base PERL_EXPORT_C STDCHAR * PerlIOStdio_get_base(pTHX_ PerlIO *f); +PERL_EXPORT_C Size_t PerlIOStdio_get_bufsiz(pTHX_ PerlIO *f); +#endif PERL_EXPORT_C char * PerlIOStdio_mode(const char *mode, char *tmode); PERL_EXPORT_C PerlIO * PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args); PERL_EXPORT_C IV PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab); diff --git a/Master/tlpkg/tlperl/lib/CORE/perlsfio.h b/Master/tlpkg/tlperl/lib/CORE/perlsfio.h deleted file mode 100644 index 66ec10fdbd7..00000000000 --- a/Master/tlpkg/tlperl/lib/CORE/perlsfio.h +++ /dev/null @@ -1,84 +0,0 @@ -/* perlsfio.h - * - * Copyright (C) 1996, 1999, 2000, 2001, 2002, 2003, 2005, 2007, - * 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 next #ifdef should be redundant if Configure behaves ... */ -#ifndef FILE -#define FILE FILE -#endif -#ifdef I_SFIO -#include -#endif - -/* sfio 2000 changed _stdopen to _stdfdopen */ -#if SFIO_VERSION >= 20000101L -#define _stdopen _stdfdopen -#endif - -extern Sfio_t* _stdopen _ARG_((int, const char*)); -extern int _stdprintf _ARG_((const char*, ...)); - -#define PerlIO Sfio_t -#define PerlIO_stderr() sfstderr -#define PerlIO_stdout() sfstdout -#define PerlIO_stdin() sfstdin - -#define PerlIO_isutf8(f) 0 - -#define PerlIO_printf sfprintf -#define PerlIO_stdoutf _stdprintf -#define PerlIO_vprintf(f,fmt,a) sfvprintf(f,fmt,a) -#define PerlIO_read(f,buf,count) sfread(f,buf,count) -#define PerlIO_write(f,buf,count) sfwrite(f,buf,count) -#define PerlIO_open(path,mode) sfopen(NULL,path,mode) -#define PerlIO_fdopen(fd,mode) _stdopen(fd,mode) -#define PerlIO_reopen(path,mode,f) sfopen(f,path,mode) -#define PerlIO_close(f) sfclose(f) -#define PerlIO_puts(f,s) sfputr(f,s,-1) -#define PerlIO_putc(f,c) sfputc(f,c) -#define PerlIO_ungetc(f,c) sfungetc(f,c) -#define PerlIO_sprintf sfsprintf -#define PerlIO_getc(f) sfgetc(f) -#define PerlIO_eof(f) sfeof(f) -#define PerlIO_error(f) sferror(f) -#define PerlIO_fileno(f) sffileno(f) -#define PerlIO_clearerr(f) sfclrerr(f) -#define PerlIO_flush(f) sfsync(f) -#define PerlIO_tell(f) sftell(f) -#define PerlIO_seek(f,o,w) sfseek(f,o,w) -#define PerlIO_rewind(f) (void) sfseek((f),0L,0) -#define PerlIO_tmpfile() sftmp(0) -#define PerlIO_exportFILE(f,fl) Perl_croak(aTHX_ "Export to FILE * unimplemented") -#define PerlIO_releaseFILE(p,f) Perl_croak(aTHX_ "Release of FILE * unimplemented") - -#define PerlIO_setlinebuf(f) sfset(f,SF_LINE,1) - -/* Now our interface to equivalent of Configure's FILE_xxx macros */ - -#define PerlIO_has_cntptr(f) 1 -#define PerlIO_get_ptr(f) ((f)->next) -#define PerlIO_get_cnt(f) ((f)->endr - (f)->next) -#define PerlIO_canset_cnt(f) 1 -#define PerlIO_fast_gets(f) 1 -#define PerlIO_set_ptrcnt(f,p,c) STMT_START {(f)->next = (unsigned char *)(p); assert(PerlIO_get_cnt(f) == (c));} STMT_END -#define PerlIO_set_cnt(f,c) STMT_START {(f)->next = (f)->endr - (c);} STMT_END - -#define PerlIO_has_base(f) 1 -#define PerlIO_get_base(f) ((f)->data) -#define PerlIO_get_bufsiz(f) ((f)->endr - (f)->data) - -/* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: nil - * End: - * - * ex: set ts=8 sts=4 sw=4 et: - */ diff --git a/Master/tlpkg/tlperl/lib/CORE/perlvars.h b/Master/tlpkg/tlperl/lib/CORE/perlvars.h index 96dfe04c26a..7bafa40882f 100644 --- a/Master/tlpkg/tlperl/lib/CORE/perlvars.h +++ b/Master/tlpkg/tlperl/lib/CORE/perlvars.h @@ -32,7 +32,7 @@ all interpreters and all threads in a process. #if defined(USE_ITHREADS) PERLVAR(G, op_mutex, perl_mutex) /* Mutex for op refcounting */ #endif -PERLVAR(G, curinterp, PerlInterpreter *) +PERLVARI(G, curinterp, PerlInterpreter *, NULL) /* currently running interpreter * (initial parent interpreter under * useithreads) */ @@ -97,7 +97,7 @@ PERLVAR(G, hints_mutex, perl_mutex) /* Mutex for refcounted he refcounting */ #endif #ifdef DEBUGGING -PERLVAR(G, watch_pvx, char *) +PERLVARI(G, watch_pvx, char *, NULL) #endif /* @@ -217,7 +217,7 @@ the Perl core) will normally return C. PERLVARI(G, keyword_plugin, Perl_keyword_plugin_t, Perl_keyword_plugin_standard) -PERLVAR(G, op_sequence, HV *) /* dump.c */ +PERLVARI(G, op_sequence, HV *, NULL) /* dump.c */ PERLVARI(G, op_seq, UV, 0) /* dump.c */ #ifdef USE_ITHREADS @@ -225,7 +225,10 @@ PERLVAR(G, dollarzero_mutex, perl_mutex) /* Modifying $0 */ #endif /* Restricted hashes placeholder value. - * The contents are never used, only the address. */ + In theory, the contents are never used, only the address. + In practice, &PL_sv_placeholder is returned by some APIs, and the calling + code is checking SvOK(). */ + PERLVAR(G, sv_placeholder, SV) #if defined(MYMALLOC) && defined(USE_ITHREADS) diff --git a/Master/tlpkg/tlperl/lib/CORE/perly.h b/Master/tlpkg/tlperl/lib/CORE/perly.h index 6f1d6b95db5..e6426df92ad 100644 --- a/Master/tlpkg/tlperl/lib/CORE/perly.h +++ b/Master/tlpkg/tlperl/lib/CORE/perly.h @@ -5,11 +5,11 @@ */ #ifdef PERL_CORE -/* A Bison parser, made by GNU Bison 2.6.1. */ +/* A Bison parser, made by GNU Bison 2.5. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,13 +37,6 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int yydebug; -#endif /* Tokens. */ #ifndef YYTOKENTYPE @@ -125,12 +118,13 @@ extern int yydebug; REFGEN = 329, UMINUS = 330, POWOP = 331, - POSTDEC = 332, - POSTINC = 333, - PREDEC = 334, - PREINC = 335, - ARROW = 336, - PEG = 337 + POSTJOIN = 332, + POSTDEC = 333, + POSTINC = 334, + PREDEC = 335, + PREINC = 336, + ARROW = 337, + PEG = 338 }; #endif @@ -209,12 +203,14 @@ extern int yydebug; #define REFGEN 329 #define UMINUS 330 #define POWOP 331 -#define POSTDEC 332 -#define POSTINC 333 -#define PREDEC 334 -#define PREINC 335 -#define ARROW 336 -#define PEG 337 +#define POSTJOIN 332 +#define POSTDEC 333 +#define POSTINC 334 +#define PREDEC 335 +#define PREINC 336 +#define ARROW 337 +#define PEG 338 + #ifdef PERL_IN_TOKE_C @@ -243,7 +239,8 @@ S_is_opval_token(int type) { #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { -/* Line 2049 of yacc.c */ + +/* Line 2068 of yacc.c */ I32 ival; /* __DEFAULT__ (marker for regen_perly.pl; must always be 1st union member) */ @@ -262,7 +259,8 @@ typedef union YYSTYPE #endif -/* Line 2049 of yacc.c */ + +/* Line 2068 of yacc.c */ } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -270,22 +268,10 @@ typedef union YYSTYPE #endif -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ + /* Generated from: - * 28c2c7738eefc00762e227af0363c729186c992e9127e0c935684cccbf3a3b4f perly.y + * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl * ex: set ro: */ diff --git a/Master/tlpkg/tlperl/lib/CORE/pp.h b/Master/tlpkg/tlperl/lib/CORE/pp.h index cb6a0668f94..97738c2d8d4 100644 --- a/Master/tlpkg/tlperl/lib/CORE/pp.h +++ b/Master/tlpkg/tlperl/lib/CORE/pp.h @@ -30,7 +30,7 @@ the C macro. See C. =for apidoc ms||djSP -Declare Just C. This is actually identical to C, and declares +Declare Just C. This is actually identical to C, and declares a local copy of perl's stack pointer, available via the C macro. See C. (Available for backward source code compatibility with the old (Perl 5.005) thread model.) @@ -57,7 +57,7 @@ Refetch the stack pointer. Used after a callback. See L. #define PUSHMARK(p) \ STMT_START { \ - if (++PL_markstack_ptr == PL_markstack_max) \ + if (UNLIKELY(++PL_markstack_ptr == PL_markstack_max)) \ markstack_grow(); \ *PL_markstack_ptr = (I32)((p) - PL_stack_base);\ } STMT_END @@ -133,10 +133,6 @@ Pops a long off the stack. #define POPu ((UV)SvUVx(POPs)) #define POPl ((long)SvIVx(POPs)) #define POPul ((unsigned long)SvIVx(POPs)) -#ifdef HAS_QUAD -#define POPq ((Quad_t)SvIVx(POPs)) -#define POPuq ((Uquad_t)SvUVx(POPs)) -#endif #define TOPs (*sp) #define TOPm1s (*(sp-1)) @@ -148,16 +144,12 @@ Pops a long off the stack. #define TOPu ((UV)SvUV(TOPs)) #define TOPl ((long)SvIV(TOPs)) #define TOPul ((unsigned long)SvUV(TOPs)) -#ifdef HAS_QUAD -#define TOPq ((Quad_t)SvIV(TOPs)) -#define TOPuq ((Uquad_t)SvUV(TOPs)) -#endif /* Go to some pains in the rare event that we must extend the stack. */ /* -=for apidoc Am|void|EXTEND|SP|int nitems -Used to extend the argument stack for an XSUB's return values. Once +=for apidoc Am|void|EXTEND|SP|SSize_t nitems +Used to extend the argument stack for an XSUB's return values. Once used, guarantees that there is room for at least C to be pushed onto the stack. @@ -278,15 +270,25 @@ Does not use C. See also C, C and C. =cut */ -#define EXTEND(p,n) (void)(UNLIKELY(PL_stack_max - p < (int)(n)) && \ - (sp = stack_grow(sp,p, (int) (n)))) +#ifdef STRESS_REALLOC +# define EXTEND(p,n) (void)(sp = stack_grow(sp,p, (SSize_t)(n))) +/* Same thing, but update mark register too. */ +# define MEXTEND(p,n) STMT_START { \ + const int markoff = mark - PL_stack_base; \ + sp = stack_grow(sp,p,(SSize_t) (n)); \ + mark = PL_stack_base + markoff; \ + } STMT_END +#else +# define EXTEND(p,n) (void)(UNLIKELY(PL_stack_max - p < (SSize_t)(n)) && \ + (sp = stack_grow(sp,p, (SSize_t) (n)))) /* Same thing, but update mark register too. */ -#define MEXTEND(p,n) STMT_START {if (UNLIKELY(PL_stack_max - p < (int)(n))) {\ +# define MEXTEND(p,n) STMT_START {if (UNLIKELY(PL_stack_max - p < (int)(n))) {\ const int markoff = mark - PL_stack_base; \ - sp = stack_grow(sp,p,(int) (n)); \ + sp = stack_grow(sp,p,(SSize_t) (n)); \ mark = PL_stack_base + markoff; \ } } STMT_END +#endif #define PUSHs(s) (*++sp = (s)) #define PUSHTARG STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END @@ -333,12 +335,6 @@ Does not use C. See also C, C and C. #define dPOPiv IV value = POPi #define dTOPuv UV value = TOPu #define dPOPuv UV value = POPu -#ifdef HAS_QUAD -#define dTOPqv Quad_t value = TOPu -#define dPOPqv Quad_t value = POPu -#define dTOPuqv Uquad_t value = TOPuq -#define dPOPuqv Uquad_t value = POPuq -#endif #define dPOPXssrl(X) SV *right = POPs; SV *left = CAT2(X,s) #define dPOPXnnrl(X) NV right = POPn; NV left = CAT2(X,n) @@ -404,12 +400,12 @@ Does not use C. See also C, C and C. /* do SvGETMAGIC on the stack args before checking for overload */ #define tryAMAGICun_MG(method, flags) STMT_START { \ - if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \ + if ( UNLIKELY((SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG))) \ && Perl_try_amagic_un(aTHX_ method, flags)) \ return NORMAL; \ } STMT_END #define tryAMAGICbin_MG(method, flags) STMT_START { \ - if ( ((SvFLAGS(TOPm1s)|SvFLAGS(TOPs)) & (SVf_ROK|SVs_GMG)) \ + if ( UNLIKELY(((SvFLAGS(TOPm1s)|SvFLAGS(TOPs)) & (SVf_ROK|SVs_GMG))) \ && Perl_try_amagic_bin(aTHX_ method, flags)) \ return NORMAL; \ } STMT_END @@ -426,19 +422,20 @@ Does not use C. See also C, C and C. SV *tmpsv; \ SV *arg= *sp; \ int gimme = GIMME_V; \ - if (SvAMAGIC(arg) && \ + if (UNLIKELY(SvAMAGIC(arg) && \ (tmpsv = amagic_call(arg, &PL_sv_undef, meth, \ AMGf_want_list | AMGf_noright \ - |AMGf_unary))) { \ + |AMGf_unary)))) \ + { \ SPAGAIN; \ if (gimme == G_VOID) { \ (void)POPs; /* XXX ??? */ \ } \ else if (gimme == G_ARRAY) { \ - int i; \ - I32 len; \ + SSize_t i; \ + SSize_t len; \ assert(SvTYPE(tmpsv) == SVt_PVAV); \ - len = av_len((AV *)tmpsv) + 1; \ + len = av_tindex((AV *)tmpsv) + 1; \ (void)POPs; /* get rid of the arg */ \ EXTEND(sp, len); \ for (i = 0; i < len; ++i) \ diff --git a/Master/tlpkg/tlperl/lib/CORE/pp_proto.h b/Master/tlpkg/tlperl/lib/CORE/pp_proto.h index a4dd46d5cc0..73ff532b5c8 100644 --- a/Master/tlpkg/tlperl/lib/CORE/pp_proto.h +++ b/Master/tlpkg/tlperl/lib/CORE/pp_proto.h @@ -123,6 +123,8 @@ PERL_CALLCONV OP *Perl_pp_introcv(pTHX); PERL_CALLCONV OP *Perl_pp_ioctl(pTHX); PERL_CALLCONV OP *Perl_pp_iter(pTHX); PERL_CALLCONV OP *Perl_pp_join(pTHX); +PERL_CALLCONV OP *Perl_pp_kvaslice(pTHX); +PERL_CALLCONV OP *Perl_pp_kvhslice(pTHX); PERL_CALLCONV OP *Perl_pp_last(pTHX); PERL_CALLCONV OP *Perl_pp_lc(pTHX); PERL_CALLCONV OP *Perl_pp_le(pTHX); diff --git a/Master/tlpkg/tlperl/lib/CORE/proto.h b/Master/tlpkg/tlperl/lib/CORE/proto.h index 607eef8cbac..6532ba8afa2 100644 --- a/Master/tlpkg/tlperl/lib/CORE/proto.h +++ b/Master/tlpkg/tlperl/lib/CORE/proto.h @@ -17,15 +17,22 @@ */ START_EXTERN_C +PERL_CALLCONV UV ASCII_TO_NEED(const UV enc, const UV ch) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__; + PERL_CALLCONV int Perl_Gv_AMupdate(pTHX_ HV* stash, bool destructing) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_GV_AMUPDATE \ assert(stash) -PERL_CALLCONV const char * Perl_PerlIO_context_layers(pTHX_ const char *mode); -PERL_CALLCONV_NO_RET void Perl_croak_memory_wrap(void) - __attribute__noreturn__; +PERL_CALLCONV UV NATIVE_TO_NEED(const UV enc, const UV ch) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__; +PERL_CALLCONV const char * Perl_PerlIO_context_layers(pTHX_ const char *mode); PERL_CALLCONV void* Perl_Slab_Alloc(pTHX_ size_t sz) __attribute__malloc__ __attribute__warn_unused_result__; @@ -68,31 +75,31 @@ PERL_CALLCONV bool Perl__is_utf8_perl_idstart(pTHX_ const U8 *p) #define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDSTART \ assert(p) -PERL_CALLCONV UV Perl__to_uni_fold_flags(pTHX_ UV c, U8 *p, STRLEN *lenp, const U8 flags) +PERL_CALLCONV UV Perl__to_uni_fold_flags(pTHX_ UV c, U8 *p, STRLEN *lenp, U8 flags) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS \ assert(p); assert(lenp) -PERL_CALLCONV UV Perl__to_utf8_fold_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, U8 flags, bool* tainted_ptr) +PERL_CALLCONV UV Perl__to_utf8_fold_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, U8 flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS \ assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__to_utf8_lower_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, const bool flags, bool* tainted_ptr) +PERL_CALLCONV UV Perl__to_utf8_lower_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, bool flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS \ assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__to_utf8_title_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, const bool flags, bool* tainted_ptr) +PERL_CALLCONV UV Perl__to_utf8_title_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, bool flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS \ assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__to_utf8_upper_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, const bool flags, bool* tainted_ptr) +PERL_CALLCONV UV Perl__to_utf8_upper_flags(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, bool flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS \ @@ -115,6 +122,11 @@ PERL_CALLCONV SV * Perl_amagic_deref_call(pTHX_ SV *ref, int method) assert(ref) PERL_CALLCONV bool Perl_amagic_is_enabled(pTHX_ int method); +PERL_STATIC_INLINE void S_append_utf8_from_native_byte(const U8 byte, U8** dest) + __attribute__nonnull__(2); +#define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE \ + assert(dest) + PERL_CALLCONV I32 Perl_apply(pTHX_ I32 type, SV** mark, SV** sp) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); @@ -152,36 +164,36 @@ PERL_CALLCONV SV** Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *cons #define PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE \ assert(avp); assert(val) -PERL_CALLCONV SV* Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags) +PERL_CALLCONV SV* Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_DELETE \ assert(av) -PERL_CALLCONV bool Perl_av_exists(pTHX_ AV *av, I32 key) +PERL_CALLCONV bool Perl_av_exists(pTHX_ AV *av, SSize_t key) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_EXISTS \ assert(av) -PERL_CALLCONV void Perl_av_extend(pTHX_ AV *av, I32 key) +PERL_CALLCONV void Perl_av_extend(pTHX_ AV *av, SSize_t key) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_EXTEND \ assert(av) -PERL_CALLCONV void Perl_av_extend_guts(pTHX_ AV *av, I32 key, SSize_t *maxp, SV ***allocp, SV ***arrayp) +PERL_CALLCONV void Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp, SV ***arrayp) __attribute__nonnull__(pTHX_3) __attribute__nonnull__(pTHX_4) __attribute__nonnull__(pTHX_5); #define PERL_ARGS_ASSERT_AV_EXTEND_GUTS \ assert(maxp); assert(allocp); assert(arrayp) -PERL_CALLCONV SV** Perl_av_fetch(pTHX_ AV *av, I32 key, I32 lval) +PERL_CALLCONV SV** Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_FETCH \ assert(av) -PERL_CALLCONV void Perl_av_fill(pTHX_ AV *av, I32 fill) +PERL_CALLCONV void Perl_av_fill(pTHX_ AV *av, SSize_t fill) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_FILL \ assert(av) @@ -191,13 +203,13 @@ PERL_CALLCONV IV* Perl_av_iter_p(pTHX_ AV *av) #define PERL_ARGS_ASSERT_AV_ITER_P \ assert(av) -PERL_CALLCONV I32 Perl_av_len(pTHX_ AV *av) +PERL_CALLCONV SSize_t Perl_av_len(pTHX_ AV *av) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_LEN \ assert(av) -PERL_CALLCONV AV* Perl_av_make(pTHX_ I32 size, SV **strp) +PERL_CALLCONV AV* Perl_av_make(pTHX_ SSize_t size, SV **strp) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_AV_MAKE \ @@ -225,16 +237,16 @@ PERL_CALLCONV SV* Perl_av_shift(pTHX_ AV *av) #define PERL_ARGS_ASSERT_AV_SHIFT \ assert(av) -PERL_CALLCONV SV** Perl_av_store(pTHX_ AV *av, I32 key, SV *val) +PERL_CALLCONV SV** Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_STORE \ assert(av) -/* PERL_CALLCONV I32 Perl_av_tindex(pTHX_ AV *av) +/* PERL_CALLCONV SSize_t Perl_av_tindex(pTHX_ AV *av) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); */ -PERL_STATIC_INLINE I32 S_av_top_index(pTHX_ AV *av) +PERL_STATIC_INLINE SSize_t S_av_top_index(pTHX_ AV *av) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_TOP_INDEX \ @@ -245,7 +257,7 @@ PERL_CALLCONV void Perl_av_undef(pTHX_ AV *av) #define PERL_ARGS_ASSERT_AV_UNDEF \ assert(av) -PERL_CALLCONV void Perl_av_unshift(pTHX_ AV *av, I32 num) +PERL_CALLCONV void Perl_av_unshift(pTHX_ AV *av, SSize_t num) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_AV_UNSHIFT \ assert(av) @@ -353,6 +365,12 @@ PERL_CALLCONV OP * Perl_ck_anoncode(pTHX_ OP *o) #define PERL_ARGS_ASSERT_CK_ANONCODE \ assert(o) +PERL_CALLCONV OP * Perl_ck_backtick(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_CK_BACKTICK \ + assert(o) + PERL_CALLCONV OP * Perl_ck_bitop(pTHX_ OP *o) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -383,12 +401,6 @@ PERL_CALLCONV OP * Perl_ck_delete(pTHX_ OP *o) #define PERL_ARGS_ASSERT_CK_DELETE \ assert(o) -PERL_CALLCONV OP * Perl_ck_die(pTHX_ OP *o) - __attribute__warn_unused_result__ - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_CK_DIE \ - assert(o) - PERL_CALLCONV OP * Perl_ck_each(pTHX_ OP *o) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -445,12 +457,6 @@ PERL_CALLCONV OP * Perl_ck_exists(pTHX_ OP *o) #define PERL_ARGS_ASSERT_CK_EXISTS \ assert(o) -PERL_CALLCONV OP * Perl_ck_exit(pTHX_ OP *o) - __attribute__warn_unused_result__ - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_CK_EXIT \ - assert(o) - PERL_CALLCONV OP * Perl_ck_ftst(pTHX_ OP *o) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -651,6 +657,11 @@ PERL_CALLCONV void Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...) PERL_CALLCONV bool Perl_ckwarn(pTHX_ U32 w); PERL_CALLCONV bool Perl_ckwarn_d(pTHX_ U32 w); +PERL_CALLCONV const COP* Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop, bool opnext) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_CLOSEST_COP \ + assert(cop) + PERL_CALLCONV OP* Perl_convert(pTHX_ I32 optype, I32 flags, OP* o) __attribute__warn_unused_result__; @@ -680,6 +691,9 @@ PERL_CALLCONV_NO_RET void Perl_croak(pTHX_ const char* pat, ...) __attribute__noreturn__ __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2); +PERL_STATIC_NO_RET void S_croak_memory_wrap(void) + __attribute__noreturn__; + PERL_CALLCONV_NO_RET void Perl_croak_no_mem(void) __attribute__noreturn__; @@ -709,6 +723,12 @@ PERL_CALLCONV const char * Perl_custom_op_desc(pTHX_ const OP *o) #define PERL_ARGS_ASSERT_CUSTOM_OP_DESC \ assert(o) +PERL_CALLCONV XOPRETANY Perl_custom_op_get_field(pTHX_ const OP *o, const xop_flags_enum field) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD \ + assert(o) + PERL_CALLCONV const char * Perl_custom_op_name(pTHX_ const OP *o) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -721,11 +741,9 @@ PERL_CALLCONV void Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP #define PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER \ assert(ppaddr); assert(xop) -PERL_CALLCONV const XOP * Perl_custom_op_xop(pTHX_ const OP *o) +/* PERL_CALLCONV const XOP * Perl_custom_op_xop(pTHX_ const OP *o) __attribute__pure__ - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_CUSTOM_OP_XOP \ - assert(o) + __attribute__nonnull__(pTHX_1); */ PERL_CALLCONV void Perl_cv_ckproto_len_flags(pTHX_ const CV* cv, const GV* gv, const char* p, const STRLEN len, const U32 flags) __attribute__nonnull__(pTHX_1); @@ -746,6 +764,9 @@ PERL_CALLCONV CV* Perl_cv_clone_into(pTHX_ CV* proto, CV *target) PERL_CALLCONV SV* Perl_cv_const_sv(pTHX_ const CV *const cv) __attribute__warn_unused_result__; +PERL_CALLCONV SV* Perl_cv_const_sv_or_av(pTHX_ const CV *const cv) + __attribute__warn_unused_result__; + PERL_CALLCONV void Perl_cv_forget_slab(pTHX_ CV *cv) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_CV_FORGET_SLAB \ @@ -803,6 +824,12 @@ PERL_CALLCONV I32 Perl_debop(pTHX_ const OP* o) PERL_CALLCONV void Perl_debprofdump(pTHX); PERL_CALLCONV I32 Perl_debstack(pTHX); PERL_CALLCONV I32 Perl_debstackptrs(pTHX); +PERL_CALLCONV SV * Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_DEFELEM_TARGET \ + assert(sv) + PERL_CALLCONV void Perl_delete_eval_scope(pTHX); PERL_CALLCONV char* Perl_delimcpy(char* to, const char* toend, const char* from, const char* fromend, int delim, I32* retlen) __attribute__nonnull__(1) @@ -907,6 +934,12 @@ PERL_CALLCONV void Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o) #define PERL_ARGS_ASSERT_DO_OPEN \ assert(gv); assert(name) +PERL_CALLCONV bool Perl_do_open6(pTHX_ GV *gv, const char *oname, STRLEN len, PerlIO *supplied_fp, SV **svp, U32 num) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_DO_OPEN6 \ + assert(gv); assert(oname) + PERL_CALLCONV bool Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) @@ -914,6 +947,12 @@ PERL_CALLCONV bool Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int as #define PERL_ARGS_ASSERT_DO_OPEN9 \ assert(gv); assert(name); assert(svs) +PERL_CALLCONV bool Perl_do_open_raw(pTHX_ GV *gv, const char *oname, STRLEN len, int rawmode, int rawperm) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_DO_OPEN_RAW \ + assert(gv); assert(oname) + PERL_CALLCONV bool Perl_do_openn(pTHX_ GV *gv, const char *oname, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); @@ -995,6 +1034,16 @@ PERL_CALLCONV void Perl_dounwind(pTHX_ I32 cxix); PERL_CALLCONV I32 Perl_dowantarray(pTHX) __attribute__warn_unused_result__; +PERL_CALLCONV void Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed) + __attribute__nonnull__(1); +#define PERL_ARGS_ASSERT_DRAND48_INIT_R \ + assert(random_state) + +PERL_CALLCONV double Perl_drand48_r(perl_drand48_t *random_state) + __attribute__nonnull__(1); +#define PERL_ARGS_ASSERT_DRAND48_R \ + assert(random_state) + PERL_CALLCONV void Perl_dump_all(pTHX); PERL_CALLCONV void Perl_dump_all_perl(pTHX_ bool justperl); PERL_CALLCONV void Perl_dump_eval(pTHX); @@ -1275,7 +1324,7 @@ PERL_CALLCONV GV* Perl_gv_autoload_sv(pTHX_ HV* stash, SV* namesv, U32 flags) #define PERL_ARGS_ASSERT_GV_AUTOLOAD_SV \ assert(namesv) -PERL_CALLCONV void Perl_gv_check(pTHX_ const HV* stash) +PERL_CALLCONV void Perl_gv_check(pTHX_ HV* stash) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_GV_CHECK \ assert(stash) @@ -1449,6 +1498,11 @@ PERL_CALLCONV void Perl_gv_name_set(pTHX_ GV* gv, const char *name, U32 len, U32 #define PERL_ARGS_ASSERT_GV_NAME_SET \ assert(gv); assert(name) +PERL_CALLCONV GV * Perl_gv_override(pTHX_ const char * const name, const STRLEN len) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_GV_OVERRIDE \ + assert(name) + PERL_CALLCONV HV* Perl_gv_stashpv(pTHX_ const char* name, I32 flags) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_GV_STASHPV \ @@ -1549,7 +1603,7 @@ PERL_CALLCONV void Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, #define PERL_ARGS_ASSERT_HV_FETCH_ENT \ assert(keysv) -PERL_CALLCONV STRLEN Perl_hv_fill(pTHX_ HV const *const hv) +PERL_CALLCONV STRLEN Perl_hv_fill(pTHX_ HV *const hv) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_HV_FILL \ assert(hv) @@ -1625,7 +1679,7 @@ PERL_CALLCONV I32 Perl_hv_placeholders_get(pTHX_ const HV *hv) #define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET \ assert(hv) -PERL_CALLCONV I32* Perl_hv_placeholders_p(pTHX_ HV *hv) +PERL_CALLCONV SSize_t* Perl_hv_placeholders_p(pTHX_ HV *hv) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P \ @@ -1732,6 +1786,14 @@ PERL_CALLCONV bool Perl_is_ascii_string(const U8 *s, STRLEN len) PERL_CALLCONV I32 Perl_is_lvalue_sub(pTHX) __attribute__warn_unused_result__; +PERL_STATIC_INLINE bool S_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_3) + __attribute__nonnull__(pTHX_4); +#define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL \ + assert(pv); assert(what); assert(op_name) + PERL_CALLCONV bool Perl_is_uni_alnum(pTHX_ UV c) __attribute__deprecated__ __attribute__warn_unused_result__ @@ -2280,7 +2342,7 @@ PERL_CALLCONV int Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg) #define PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS \ assert(sv); assert(mg) -PERL_CALLCONV SV* Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, U32 flags, U32 argc, ...) +PERL_CALLCONV SV* Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, U32 argc, ...) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); @@ -2468,6 +2530,12 @@ PERL_CALLCONV int Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen) PERL_CALLCONV MAGIC* Perl_mg_find(pTHX_ const SV* sv, int type) __attribute__warn_unused_result__; +PERL_CALLCONV MAGIC* Perl_mg_find_mglob(pTHX_ SV* sv) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_MG_FIND_MGLOB \ + assert(sv) + PERL_CALLCONV MAGIC* Perl_mg_findext(pTHX_ const SV* sv, int type, const MGVTBL *vtbl) __attribute__warn_unused_result__; @@ -2625,15 +2693,11 @@ PERL_CALLCONV int Perl_my_socketpair(int family, int type, int protocol, int fd[ /* PERL_CALLCONV I32 Perl_my_stat(pTHX); */ PERL_CALLCONV I32 Perl_my_stat_flags(pTHX_ const U32 flags); PERL_CALLCONV char * Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) + __attribute__format__(__strftime__,pTHX_1,0) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_MY_STRFTIME \ assert(fmt) -PERL_CALLCONV void Perl_my_swabn(void* ptr, int n) - __attribute__nonnull__(1); -#define PERL_ARGS_ASSERT_MY_SWABN \ - assert(ptr) - PERL_CALLCONV void Perl_my_unexec(pTHX); PERL_CALLCONV int Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap) __attribute__nonnull__(1) @@ -2655,8 +2719,8 @@ PERL_CALLCONV OP* Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* ri __attribute__malloc__ __attribute__warn_unused_result__; -PERL_CALLCONV CV* Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); -PERL_CALLCONV CV* Perl_newATTRSUB_flags(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, U32 flags); +/* PERL_CALLCONV CV* newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); */ +PERL_CALLCONV CV* Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv); /* PERL_CALLCONV AV* Perl_newAV(pTHX) __attribute__warn_unused_result__; */ @@ -2850,6 +2914,13 @@ PERL_CALLCONV SV* Perl_newSV_type(pTHX_ const svtype type) __attribute__malloc__ __attribute__warn_unused_result__; +PERL_CALLCONV SV* Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible) + __attribute__malloc__ + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_NEWSVAVDEFELEM \ + assert(av) + PERL_CALLCONV SV* Perl_newSVhek(pTHX_ const HEK *const hek) __attribute__malloc__ __attribute__warn_unused_result__; @@ -3121,6 +3192,9 @@ PERL_CALLCONV OP* Perl_parse_fullstmt(pTHX_ U32 flags); PERL_CALLCONV SV* Perl_parse_label(pTHX_ U32 flags); PERL_CALLCONV OP* Perl_parse_listexpr(pTHX_ U32 flags); PERL_CALLCONV OP* Perl_parse_stmtseq(pTHX_ U32 flags); +PERL_CALLCONV OP * Perl_parse_subsignature(pTHX) + __attribute__warn_unused_result__; + PERL_CALLCONV OP* Perl_parse_termexpr(pTHX_ U32 flags); PERL_CALLCONV U32 Perl_parse_unicode_opts(pTHX_ const char **popt) __attribute__nonnull__(pTHX_1); @@ -3177,7 +3251,7 @@ PERL_CALLCONV REGEXP* Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags) #define PERL_ARGS_ASSERT_PREGCOMP \ assert(pattern) -PERL_CALLCONV I32 Perl_pregexec(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave) +PERL_CALLCONV I32 Perl_pregexec(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, SSize_t minend, SV* screamer, U32 nosave) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) @@ -3257,12 +3331,13 @@ PERL_CALLCONV REGEXP* Perl_re_compile(pTHX_ SV * const pattern, U32 orig_rx_flag #define PERL_ARGS_ASSERT_RE_COMPILE \ assert(pattern) -PERL_CALLCONV char* Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV* sv, char* strpos, char* strend, const U32 flags, re_scream_pos_data *data) +PERL_CALLCONV char* Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV* sv, const char* const strbeg, char* strpos, char* strend, const U32 flags, re_scream_pos_data *data) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3) - __attribute__nonnull__(pTHX_4); + __attribute__nonnull__(pTHX_4) + __attribute__nonnull__(pTHX_5); #define PERL_ARGS_ASSERT_RE_INTUIT_START \ - assert(rx); assert(strpos); assert(strend) + assert(rx); assert(strbeg); assert(strpos); assert(strend) PERL_CALLCONV SV* Perl_re_intuit_string(pTHX_ REGEXP *const r) __attribute__nonnull__(pTHX_1); @@ -3398,7 +3473,7 @@ PERL_CALLCONV void Perl_regdump(pTHX_ const regexp* r) #define PERL_ARGS_ASSERT_REGDUMP \ assert(r) -PERL_CALLCONV I32 Perl_regexec_flags(pTHX_ REGEXP *const rx, char *stringarg, char *strend, char *strbeg, I32 minend, SV *sv, void *data, U32 flags) +PERL_CALLCONV I32 Perl_regexec_flags(pTHX_ REGEXP *const rx, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *sv, void *data, U32 flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) @@ -3416,7 +3491,7 @@ PERL_CALLCONV void Perl_reginitcolors(pTHX); PERL_CALLCONV regnode* Perl_regnext(pTHX_ regnode* p) __attribute__warn_unused_result__; -PERL_CALLCONV void Perl_regprop(pTHX_ const regexp *prog, SV* sv, const regnode* o) +PERL_CALLCONV void Perl_regprop(pTHX_ const regexp *prog, SV* sv, const regnode* o, const regmatch_info *reginfo) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_REGPROP \ @@ -3495,16 +3570,16 @@ PERL_CALLCONV void Perl_save_I8(pTHX_ I8* bytep) #define PERL_ARGS_ASSERT_SAVE_I8 \ assert(bytep) -PERL_CALLCONV void Perl_save_adelete(pTHX_ AV *av, I32 key) +PERL_CALLCONV void Perl_save_adelete(pTHX_ AV *av, SSize_t key) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SAVE_ADELETE \ assert(av) -/* PERL_CALLCONV void Perl_save_aelem(pTHX_ AV* av, I32 idx, SV **sptr) +/* PERL_CALLCONV void Perl_save_aelem(pTHX_ AV* av, SSize_t idx, SV **sptr) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3); */ -PERL_CALLCONV void Perl_save_aelem_flags(pTHX_ AV* av, I32 idx, SV **sptr, const U32 flags) +PERL_CALLCONV void Perl_save_aelem_flags(pTHX_ AV* av, SSize_t idx, SV **sptr, const U32 flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS \ @@ -3656,6 +3731,11 @@ PERL_CALLCONV void Perl_save_sptr(pTHX_ SV** sptr) #define PERL_ARGS_ASSERT_SAVE_SPTR \ assert(sptr) +PERL_CALLCONV void Perl_save_strlen(pTHX_ STRLEN* ptr) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SAVE_STRLEN \ + assert(ptr) + PERL_CALLCONV SV* Perl_save_svref(pTHX_ SV** sptr) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SAVE_SVREF \ @@ -3750,6 +3830,7 @@ PERL_CALLCONV char* Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_ assert(bigstr); assert(littlestr); assert(old_posp) PERL_CALLCONV U32 Perl_seed(pTHX); +PERL_CALLCONV void Perl_set_caret_X(pTHX); PERL_CALLCONV void Perl_set_context(void *t) __attribute__nonnull__(1); #define PERL_ARGS_ASSERT_SET_CONTEXT \ @@ -3778,7 +3859,7 @@ PERL_CALLCONV void Perl_sortsv_flags(pTHX_ SV** array, size_t num_elts, SVCOMPAR #define PERL_ARGS_ASSERT_SORTSV_FLAGS \ assert(cmp) -PERL_CALLCONV SV** Perl_stack_grow(pTHX_ SV** sp, SV** p, int n) +PERL_CALLCONV SV** Perl_stack_grow(pTHX_ SV** sp, SV** p, SSize_t n) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_STACK_GROW \ @@ -3805,7 +3886,7 @@ PERL_CALLCONV void Perl_sub_crush_depth(pTHX_ CV* cv) /* PERL_CALLCONV bool sv_2bool(pTHX_ SV *const sv) __attribute__nonnull__(pTHX_1); */ -PERL_CALLCONV bool Perl_sv_2bool_flags(pTHX_ SV *const sv, const I32 flags) +PERL_CALLCONV bool Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SV_2BOOL_FLAGS \ assert(sv) @@ -3821,17 +3902,37 @@ PERL_CALLCONV IO* Perl_sv_2io(pTHX_ SV *const sv) #define PERL_ARGS_ASSERT_SV_2IO \ assert(sv) -/* PERL_CALLCONV IV Perl_sv_2iv(pTHX_ SV *sv); */ -PERL_CALLCONV IV Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags); +/* PERL_CALLCONV IV Perl_sv_2iv(pTHX_ SV *sv) + __attribute__nonnull__(pTHX_1); */ +#define PERL_ARGS_ASSERT_SV_2IV \ + assert(sv) + +PERL_CALLCONV IV Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_2IV_FLAGS \ + assert(sv) + PERL_CALLCONV SV* Perl_sv_2mortal(pTHX_ SV *const sv); PERL_CALLCONV SV* Perl_sv_2num(pTHX_ SV *const sv) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SV_2NUM \ assert(sv) -PERL_CALLCONV NV Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags); -/* PERL_CALLCONV char* Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp); */ -PERL_CALLCONV char* Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags); +PERL_CALLCONV NV Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_2NV_FLAGS \ + assert(sv) + +/* PERL_CALLCONV char* Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp) + __attribute__nonnull__(pTHX_1); */ +#define PERL_ARGS_ASSERT_SV_2PV \ + assert(sv) + +PERL_CALLCONV char* Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_2PV_FLAGS \ + assert(sv) + /* PERL_CALLCONV char* Perl_sv_2pv_nolen(pTHX_ SV* sv) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); */ @@ -3860,8 +3961,16 @@ PERL_CALLCONV char* Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN *const lp) #define PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN \ assert(sv) -/* PERL_CALLCONV UV Perl_sv_2uv(pTHX_ SV *sv); */ -PERL_CALLCONV UV Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags); +/* PERL_CALLCONV UV Perl_sv_2uv(pTHX_ SV *sv) + __attribute__nonnull__(pTHX_1); */ +#define PERL_ARGS_ASSERT_SV_2UV \ + assert(sv) + +PERL_CALLCONV UV Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_2UV_FLAGS \ + assert(sv) + PERL_CALLCONV int Perl_sv_backoff(pTHX_ SV *const sv) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SV_BACKOFF \ @@ -4119,6 +4228,11 @@ PERL_CALLCONV MAGIC * Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const #define PERL_ARGS_ASSERT_SV_MAGICEXT \ assert(sv) +PERL_CALLCONV MAGIC * Perl_sv_magicext_mglob(pTHX_ SV *sv) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB \ + assert(sv) + /* PERL_CALLCONV SV* Perl_sv_mortalcopy(pTHX_ SV *const oldsv) __attribute__malloc__ __attribute__warn_unused_result__; */ @@ -4144,6 +4258,11 @@ PERL_CALLCONV void Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp) #define PERL_ARGS_ASSERT_SV_POS_B2U \ assert(offsetp) +PERL_CALLCONV STRLEN Perl_sv_pos_b2u_flags(pTHX_ SV *const sv, STRLEN const offset, U32 flags) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS \ + assert(sv) + PERL_CALLCONV void Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_SV_POS_U2B \ @@ -4527,6 +4646,7 @@ PERL_CALLCONV SV* Perl_swash_init(pTHX_ const char* pkg, const char* name, SV* l #define PERL_ARGS_ASSERT_SWASH_INIT \ assert(pkg); assert(name); assert(listsv) +/* PERL_CALLCONV void sync_locale(void); */ PERL_CALLCONV void Perl_sys_init(int* argc, char*** argv) __attribute__nonnull__(1) __attribute__nonnull__(2); @@ -4547,7 +4667,7 @@ PERL_CALLCONV void Perl_taint_proper(pTHX_ const char* f, const char *const s) #define PERL_ARGS_ASSERT_TAINT_PROPER \ assert(s) -PERL_CALLCONV OP * Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv, const MAGIC *const mg, const U32 flags, U32 argc, ...) +PERL_CALLCONV OP * Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv, const MAGIC *const mg, const U32 flags, U32 argc, ...) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) @@ -4555,7 +4675,7 @@ PERL_CALLCONV OP * Perl_tied_method(pTHX_ const char *const methname, SV **sp, S #define PERL_ARGS_ASSERT_TIED_METHOD \ assert(methname); assert(sp); assert(sv); assert(mg) -PERL_CALLCONV void Perl_tmps_grow(pTHX_ I32 n); +PERL_CALLCONV void Perl_tmps_grow(pTHX_ SSize_t n); /* PERL_CALLCONV UV Perl_to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); */ @@ -4699,11 +4819,9 @@ PERL_CALLCONV UV Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen) #define PERL_ARGS_ASSERT_UTF8_TO_UVCHR \ assert(s) -PERL_CALLCONV UV Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) +/* PERL_CALLCONV UV utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) __attribute__nonnull__(pTHX_1) - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF \ - assert(s); assert(send) + __attribute__nonnull__(pTHX_2); */ PERL_CALLCONV UV Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) __attribute__deprecated__ @@ -4712,23 +4830,35 @@ PERL_CALLCONV UV Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) assert(s) PERL_CALLCONV UV Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) + __attribute__deprecated__ __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF \ assert(s); assert(send) +PERL_CALLCONV UV Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \ + assert(s) + PERL_CALLCONV UV Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI \ assert(s) -PERL_CALLCONV U8* Perl_uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags) +/* PERL_CALLCONV U8* uvchr_to_utf8(pTHX_ U8 *d, UV uv) + __attribute__nonnull__(pTHX_1); */ + +/* PERL_CALLCONV U8* uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags) + __attribute__nonnull__(pTHX_1); */ + +PERL_CALLCONV U8* Perl_uvoffuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags) __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS \ +#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS \ assert(d) -/* PERL_CALLCONV U8* Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv) - __attribute__nonnull__(pTHX_1); */ +PERL_CALLCONV U8* Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv) + __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_UVUNI_TO_UTF8 \ assert(d) @@ -4737,11 +4867,22 @@ PERL_CALLCONV U8* Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags) #define PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS \ assert(d) +PERL_CALLCONV UV Perl_valid_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR \ + assert(s) + PERL_CALLCONV UV Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) + __attribute__deprecated__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI \ assert(s) +PERL_CALLCONV bool Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_VALIDATE_PROTO \ + assert(name) + PERL_CALLCONV int Perl_vcmp(pTHX_ SV *lhv, SV *rhv) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); @@ -4917,23 +5058,6 @@ STATIC int S_sv_2iuv_non_preserve(pTHX_ SV *const sv) # endif # endif -#endif -#if !(defined(EBCDIC)) -/* PERL_CALLCONV UV Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) - __attribute__nonnull__(pTHX_1); */ -#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \ - assert(s) - -/* PERL_CALLCONV U8* Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv) - __attribute__nonnull__(pTHX_1); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8 \ - assert(d) - -/* PERL_CALLCONV UV Perl_valid_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen) - __attribute__nonnull__(pTHX_1); */ -#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR \ - assert(s) - #endif #if !(defined(HAS_SIGACTION) && defined(SA_SIGINFO)) PERL_CALLCONV Signal_t Perl_csighandler(int sig); @@ -4970,6 +5094,11 @@ PERL_CALLCONV void Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop #define PERL_ARGS_ASSERT_UTILIZE \ assert(idop) +#endif +#if !(defined(WIN32)) +/* PERL_CALLCONV char* my_setlocale(pTHX_ int category, const char* locale) + __attribute__pure__; */ + #endif #if !(defined(_MSC_VER)) PERL_CALLCONV_NO_RET int Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg) @@ -5191,8 +5320,20 @@ STATIC void S_put_byte(pTHX_ SV* sv, int c) #define PERL_ARGS_ASSERT_PUT_BYTE \ assert(sv) +STATIC bool S_put_latin1_charclass_innards(pTHX_ SV* sv, char* bitmap) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_PUT_LATIN1_CHARCLASS_INNARDS \ + assert(sv); assert(bitmap) + +STATIC void S_put_range(pTHX_ SV* sv, UV start, UV end) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_PUT_RANGE \ + assert(sv) + STATIC void S_regdump_extflags(pTHX_ const char *lead, const U32 flags); -STATIC U8 S_regtail_study(pTHX_ struct RExC_state_t *pRExC_state, regnode *p, const regnode *val, U32 depth) +STATIC void S_regdump_intflags(pTHX_ const char *lead, const U32 flags); +STATIC U8 S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); @@ -5228,6 +5369,7 @@ STATIC void S_del_sv(pTHX_ SV *p) # endif # if defined(PERL_IN_TOKE_C) STATIC void S_printbuf(pTHX_ const char *const fmt, const char *const s) + __attribute__format__(__printf__,pTHX_1,0) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_PRINTBUF \ @@ -5246,30 +5388,6 @@ PERL_CALLCONV void Perl_dump_sv_child(pTHX_ SV *sv) #define PERL_ARGS_ASSERT_DUMP_SV_CHILD \ assert(sv) -#endif -#if defined(DUMP_FDS) -PERL_CALLCONV void Perl_dump_fds(pTHX_ char* s) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_DUMP_FDS \ - assert(s) - -#endif -#if defined(EBCDIC) -PERL_CALLCONV UV Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \ - assert(s) - -PERL_CALLCONV U8* Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8 \ - assert(d) - -PERL_CALLCONV UV Perl_valid_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR \ - assert(s) - #endif #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) PERL_CALLCONV I32 Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp) @@ -5345,20 +5463,6 @@ PERL_CALLCONV MEM_SIZE Perl_malloced_size(void *p) #define PERL_ARGS_ASSERT_MALLOCED_SIZE \ assert(p) -#endif -#if defined(MYSWAP) -PERL_CALLCONV long Perl_my_htonl(pTHX_ long l) - __attribute__warn_unused_result__ - __attribute__pure__; - -PERL_CALLCONV long Perl_my_ntohl(pTHX_ long l) - __attribute__warn_unused_result__ - __attribute__pure__; - -PERL_CALLCONV short Perl_my_swap(pTHX_ short s) - __attribute__warn_unused_result__ - __attribute__pure__; - #endif #if defined(NO_MATHOMS) /* PERL_CALLCONV void Perl_sv_nounlocking(pTHX_ SV *sv); */ @@ -5404,6 +5508,14 @@ PERL_CALLCONV void Perl_Slab_to_rw(pTHX_ OPSLAB *const slab) assert(slab) # endif +#endif +#if defined(PERL_CORE) || defined (PERL_EXT) +PERL_STATIC_INLINE STRLEN S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B \ + assert(sv); assert(pv) + #endif #if defined(PERL_CR_FILTER) # if defined(PERL_IN_TOKE_C) @@ -5413,6 +5525,20 @@ STATIC void S_strip_return(pTHX_ SV *sv) #define PERL_ARGS_ASSERT_STRIP_RETURN \ assert(sv) +# endif +#endif +#if defined(PERL_DEBUG_READONLY_COW) +PERL_CALLCONV void Perl_sv_buf_to_ro(pTHX_ SV *sv) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_BUF_TO_RO \ + assert(sv) + +# if defined(PERL_IN_SV_C) +STATIC void S_sv_buf_to_rw(pTHX_ SV *sv) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SV_BUF_TO_RW \ + assert(sv) + # endif #endif #if defined(PERL_DEBUG_READONLY_OPS) @@ -5599,6 +5725,24 @@ STATIC void S_exec_failed(pTHX_ const char *cmd, int fd, int do_report) STATIC bool S_ingroup(pTHX_ Gid_t testgid, bool effective) __attribute__warn_unused_result__; +STATIC bool S_openn_cleanup(pTHX_ GV *gv, IO *io, PerlIO *fp, char *mode, const char *oname, PerlIO *saveifp, PerlIO *saveofp, int savefd, char savetype, int writing, bool was_fdopen, const char *type) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_4) + __attribute__nonnull__(pTHX_5); +#define PERL_ARGS_ASSERT_OPENN_CLEANUP \ + assert(gv); assert(io); assert(mode); assert(oname) + +STATIC IO * S_openn_setup(pTHX_ GV *gv, char *mode, PerlIO **saveifp, PerlIO **saveofp, int *savefd, char *savetype) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3) + __attribute__nonnull__(pTHX_4) + __attribute__nonnull__(pTHX_5) + __attribute__nonnull__(pTHX_6); +#define PERL_ARGS_ASSERT_OPENN_SETUP \ + assert(gv); assert(mode); assert(saveifp); assert(saveofp); assert(savefd); assert(savetype) + #endif #if defined(PERL_IN_DOOP_C) STATIC I32 S_do_trans_complex(pTHX_ SV * const sv) @@ -5669,16 +5813,49 @@ PERL_CALLCONV void Perl_hv_kill_backrefs(pTHX_ HV *hv) #endif #if defined(PERL_IN_GV_C) +STATIC bool S_find_default_stash(pTHX_ HV **stash, const char *name, STRLEN len, const U32 is_utf8, const I32 add, svtype sv_type) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_FIND_DEFAULT_STASH \ + assert(stash); assert(name) + STATIC void S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_GV_INIT_SVTYPE \ assert(gv) +STATIC bool S_gv_is_in_main(pTHX_ const char *name, STRLEN len, const U32 is_utf8) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_GV_IS_IN_MAIN \ + assert(name) + +STATIC bool S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, bool addmg, svtype sv_type) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3); +#define PERL_ARGS_ASSERT_GV_MAGICALIZE \ + assert(gv); assert(stash); assert(name) + STATIC void S_gv_magicalize_isa(pTHX_ GV *gv) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA \ assert(gv) +STATIC void S_maybe_multimagic_gv(pTHX_ GV *gv, const char *name, const svtype sv_type) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_MAYBE_MULTIMAGIC_GV \ + assert(gv); assert(name) + +STATIC bool S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name, STRLEN *len, const char *nambeg, STRLEN full_len, const U32 is_utf8, const I32 add) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3) + __attribute__nonnull__(pTHX_4) + __attribute__nonnull__(pTHX_5); +#define PERL_ARGS_ASSERT_PARSE_GV_STASH_NAME \ + assert(stash); assert(gv); assert(name); assert(len); assert(nambeg) + STATIC HV* S_require_tie_mod(pTHX_ GV *gv, const char *varpv, SV* namesv, const char *methpv, const U32 flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) @@ -5717,6 +5894,11 @@ STATIC struct xpvhv_aux* S_hv_auxinit(pTHX_ HV *hv) #define PERL_ARGS_ASSERT_HV_AUXINIT \ assert(hv) +STATIC struct xpvhv_aux* S_hv_auxinit_internal(struct xpvhv_aux *iter) + __attribute__nonnull__(1); +#define PERL_ARGS_ASSERT_HV_AUXINIT_INTERNAL \ + assert(iter) + STATIC SV* S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int k_flags, I32 d_flags, U32 hash); STATIC SV* S_hv_free_ent_ret(pTHX_ HV *hv, HE *entry) __attribute__nonnull__(pTHX_1) @@ -5742,7 +5924,7 @@ STATIC HE* S_new_he(pTHX) __attribute__malloc__ __attribute__warn_unused_result__; -STATIC U32 S_ptr_hash(PTRV u); +PERL_STATIC_INLINE U32 S_ptr_hash(PTRV u); STATIC SV * S_refcounted_he_value(pTHX_ const struct refcounted_he *he) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE \ @@ -5778,24 +5960,35 @@ PERL_CALLCONV SV* Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp) assert(hv); assert(indexp) #endif -#if defined(PERL_IN_LOCALE_C) -# if defined(USE_LOCALE_NUMERIC) || defined(USE_LOCALE_COLLATE) +#if defined(PERL_IN_LOCALE_C) && defined(USE_LOCALE) +STATIC bool S_is_cur_LC_category_utf8(pTHX_ int category); STATIC char* S_stdize_locale(pTHX_ char* locs) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_STDIZE_LOCALE \ assert(locs) -# endif +#endif +#if defined(PERL_IN_MALLOC_C) +STATIC int S_adjust_size_and_find_bucket(size_t *nbytes_p) + __attribute__nonnull__(1); +#define PERL_ARGS_ASSERT_ADJUST_SIZE_AND_FIND_BUCKET \ + assert(nbytes_p) + #endif #if defined(PERL_IN_MG_C) -STATIC SV* S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, const char *meth, U32 flags, int n, SV *val) +STATIC void S_fixup_errno_string(pTHX_ SV* sv) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING \ + assert(sv) + +STATIC SV* S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, int n, SV *val) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_MAGIC_METHCALL1 \ assert(sv); assert(mg); assert(meth) -STATIC int S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth) +STATIC int S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); @@ -5803,9 +5996,9 @@ STATIC int S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth) assert(sv); assert(mg); assert(meth) STATIC void S_restore_magic(pTHX_ const void *p); -STATIC void S_save_magic(pTHX_ I32 mgs_ix, SV *sv) +STATIC void S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags) __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_SAVE_MAGIC \ +#define PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS \ assert(sv) STATIC void S_unwind_handler_stack(pTHX_ const void *p); @@ -5819,7 +6012,7 @@ PERL_CALLCONV bool Perl_translate_substr_offsets(pTHX_ STRLEN curlen, IV pos1_iv #endif #if defined(PERL_IN_MRO_C) -STATIC void S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 flags) +STATIC void S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 hash, U32 flags) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV \ @@ -5856,19 +6049,19 @@ STATIC void S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp #define PERL_ARGS_ASSERT_APPLY_ATTRS_MY \ assert(stash); assert(target); assert(imopsp) -STATIC void S_bad_type_pv(pTHX_ I32 n, const char *t, const char *name, U32 flags, const OP *kid) +STATIC void S_bad_type_gv(pTHX_ I32 n, const char *t, GV *gv, U32 flags, const OP *kid) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) __attribute__nonnull__(pTHX_5); -#define PERL_ARGS_ASSERT_BAD_TYPE_PV \ - assert(t); assert(name); assert(kid) +#define PERL_ARGS_ASSERT_BAD_TYPE_GV \ + assert(t); assert(gv); assert(kid) -STATIC void S_bad_type_sv(pTHX_ I32 n, const char *t, SV *namesv, U32 flags, const OP *kid) +STATIC void S_bad_type_pv(pTHX_ I32 n, const char *t, const char *name, U32 flags, const OP *kid) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) __attribute__nonnull__(pTHX_5); -#define PERL_ARGS_ASSERT_BAD_TYPE_SV \ - assert(t); assert(namesv); assert(kid) +#define PERL_ARGS_ASSERT_BAD_TYPE_PV \ + assert(t); assert(name); assert(kid) STATIC void S_cop_free(pTHX_ COP *cop) __attribute__nonnull__(pTHX_1); @@ -5928,6 +6121,13 @@ STATIC bool S_looks_like_bool(pTHX_ const OP* o) assert(o) STATIC OP* S_modkids(pTHX_ OP *o, I32 type); +STATIC void S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV *name) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3); +#define PERL_ARGS_ASSERT_MOVE_PROTO_ATTR \ + assert(proto); assert(attrs); assert(name) + STATIC OP * S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_MY_KID \ @@ -5959,6 +6159,11 @@ STATIC OP* S_no_fh_allowed(pTHX_ OP *o) #define PERL_ARGS_ASSERT_NO_FH_ALLOWED \ assert(o) +STATIC void S_null_listop_in_list_context(pTHX_ OP* o) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_NULL_LISTOP_IN_LIST_CONTEXT \ + assert(o) + PERL_STATIC_INLINE OP* S_op_integerize(pTHX_ OP *o) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_OP_INTEGERIZE \ @@ -6143,7 +6348,7 @@ PERL_CALLCONV GV* Perl_softref2xv(pTHX_ SV *const sv, const char *const what, co #endif #if defined(PERL_IN_PP_CTL_C) -STATIC SV ** S_adjust_stack_on_leave(pTHX_ SV **newsp, SV **sp, SV **mark, I32 gimme, U32 flags) +STATIC SV ** S_adjust_stack_on_leave(pTHX_ SV **newsp, SV **sp, SV **mark, I32 gimme, U32 flags, bool lvalue) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); @@ -6220,10 +6425,10 @@ STATIC bool S_matcher_matches_sv(pTHX_ PMOP* matcher, SV* sv) STATIC bool S_num_overflow(NV value, I32 fldsize, I32 frcsize) __attribute__warn_unused_result__; -STATIC bool S_path_is_absolute(const char *name) +PERL_STATIC_INLINE bool S_path_is_searchable(const char *name) __attribute__warn_unused_result__ __attribute__nonnull__(1); -#define PERL_ARGS_ASSERT_PATH_IS_ABSOLUTE \ +#define PERL_ARGS_ASSERT_PATH_IS_SEARCHABLE \ assert(name) STATIC I32 S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen) @@ -6264,7 +6469,7 @@ STATIC SV* S_method_common(pTHX_ SV* meth, U32* hashp) #endif #if defined(PERL_IN_PP_PACK_C) -STATIC char * S_bytes_to_uni(const U8 *start, STRLEN len, char *dest) +STATIC char * S_bytes_to_uni(const U8 *start, STRLEN len, char *dest, const bool needs_swap) __attribute__warn_unused_result__ __attribute__nonnull__(1) __attribute__nonnull__(3); @@ -6410,10 +6615,9 @@ STATIC I32 S_sv_ncmp(pTHX_ SV *const a, SV *const b) #if defined(PERL_IN_PP_SYS_C) STATIC OP* S_doform(pTHX_ CV *cv, GV *gv, OP *retop) __attribute__nonnull__(pTHX_1) - __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); + __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_DOFORM \ - assert(cv); assert(gv); assert(retop) + assert(cv); assert(gv) STATIC SV * S_space_join_names_mortal(pTHX_ char *const *array) __attribute__nonnull__(pTHX_1); @@ -6433,71 +6637,40 @@ PERL_STATIC_INLINE UV* S__invlist_array_init(pTHX_ SV* const invlist, const bool #define PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT \ assert(invlist) -STATIC SV* S__new_invlist_C_array(pTHX_ UV* list) - __attribute__warn_unused_result__ - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY \ - assert(list) - PERL_STATIC_INLINE SV* S_add_cp_to_invlist(pTHX_ SV* invlist, const UV cp) __attribute__warn_unused_result__; -STATIC U32 S_add_data(struct RExC_state_t *pRExC_state, U32 n, const char *s) +STATIC U32 S_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n) __attribute__warn_unused_result__ __attribute__nonnull__(1) - __attribute__nonnull__(3); + __attribute__nonnull__(2); #define PERL_ARGS_ASSERT_ADD_DATA \ assert(pRExC_state); assert(s) -PERL_STATIC_INLINE void S_alloc_maybe_populate_EXACT(pTHX_ struct RExC_state_t *pRExC_state, regnode *node, I32 *flagp, STRLEN len, UV code_point) +PERL_STATIC_INLINE void S_alloc_maybe_populate_EXACT(pTHX_ RExC_state_t *pRExC_state, regnode *node, I32 *flagp, STRLEN len, UV code_point, bool downgradable) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_ALLOC_MAYBE_POPULATE_EXACT \ assert(pRExC_state); assert(node); assert(flagp) -STATIC void S_cl_and(struct regnode_charclass_class *cl, const struct regnode_charclass_class *and_with) - __attribute__nonnull__(1) - __attribute__nonnull__(2); -#define PERL_ARGS_ASSERT_CL_AND \ - assert(cl); assert(and_with) - -STATIC void S_cl_anything(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl) - __attribute__nonnull__(1) - __attribute__nonnull__(2); -#define PERL_ARGS_ASSERT_CL_ANYTHING \ - assert(pRExC_state); assert(cl) - -STATIC void S_cl_init(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl) - __attribute__nonnull__(1) - __attribute__nonnull__(2); -#define PERL_ARGS_ASSERT_CL_INIT \ - assert(pRExC_state); assert(cl) - -STATIC int S_cl_is_anything(const struct regnode_charclass_class *cl) - __attribute__warn_unused_result__ - __attribute__nonnull__(1); -#define PERL_ARGS_ASSERT_CL_IS_ANYTHING \ - assert(cl) - -STATIC void S_cl_or(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl, const struct regnode_charclass_class *or_with) - __attribute__nonnull__(1) - __attribute__nonnull__(2) - __attribute__nonnull__(3); -#define PERL_ARGS_ASSERT_CL_OR \ - assert(pRExC_state); assert(cl); assert(or_with) - -PERL_STATIC_INLINE U8 S_compute_EXACTish(pTHX_ struct RExC_state_t *pRExC_state) +PERL_STATIC_INLINE U8 S_compute_EXACTish(pTHX_ RExC_state_t *pRExC_state) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_COMPUTE_EXACTISH \ assert(pRExC_state) -STATIC bool S_could_it_be_a_POSIX_class(pTHX_ struct RExC_state_t *pRExC_state) +STATIC bool S_could_it_be_a_POSIX_class(pTHX_ RExC_state_t *pRExC_state) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_COULD_IT_BE_A_POSIX_CLASS \ assert(pRExC_state) -PERL_STATIC_INLINE UV* S_get_invlist_iter_addr(pTHX_ SV* invlist) +STATIC SV* S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, const regnode_charclass* const node) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC \ + assert(pRExC_state); assert(node) + +PERL_STATIC_INLINE STRLEN* S_get_invlist_iter_addr(pTHX_ SV* invlist) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \ @@ -6509,25 +6682,13 @@ PERL_STATIC_INLINE IV* S_get_invlist_previous_index_addr(pTHX_ SV* invlist) #define PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR \ assert(invlist) -PERL_STATIC_INLINE UV* S_get_invlist_version_id_addr(pTHX_ SV* invlist) - __attribute__warn_unused_result__ - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_GET_INVLIST_VERSION_ID_ADDR \ - assert(invlist) - -PERL_STATIC_INLINE UV* S_get_invlist_zero_addr(pTHX_ SV* invlist) - __attribute__warn_unused_result__ - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_GET_INVLIST_ZERO_ADDR \ - assert(invlist) - -STATIC bool S_grok_bslash_N(pTHX_ struct RExC_state_t *pRExC_state, regnode** nodep, UV *valuep, I32 *flagp, U32 depth, bool in_char_class, const bool strict) +STATIC bool S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode** nodep, UV *valuep, I32 *flagp, U32 depth, bool in_char_class, const bool strict) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_4); #define PERL_ARGS_ASSERT_GROK_BSLASH_N \ assert(pRExC_state); assert(flagp) -STATIC regnode* S_handle_regex_sets(pTHX_ struct RExC_state_t *pRExC_state, SV ** return_invlist, I32 *flagp, U32 depth, char * const oregcomp_parse) +STATIC regnode* S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV ** return_invlist, I32 *flagp, U32 depth, char * const oregcomp_parse) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3) __attribute__nonnull__(pTHX_5); @@ -6593,7 +6754,7 @@ PERL_STATIC_INLINE IV S_invlist_previous_index(pTHX_ SV* const invlist) #define PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX \ assert(invlist) -PERL_STATIC_INLINE void S_invlist_set_len(pTHX_ SV* const invlist, const UV len) +PERL_STATIC_INLINE void S_invlist_set_len(pTHX_ SV* const invlist, const UV len, const bool offset) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_INVLIST_SET_LEN \ assert(invlist) @@ -6608,15 +6769,15 @@ PERL_STATIC_INLINE void S_invlist_trim(pTHX_ SV* const invlist) #define PERL_ARGS_ASSERT_INVLIST_TRIM \ assert(invlist) -STATIC U32 S_join_exact(pTHX_ struct RExC_state_t *pRExC_state, regnode *scan, UV *min_subtract, bool *has_exactf_sharp_s, U32 flags, regnode *val, U32 depth) +STATIC U32 S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, UV *min_subtract, bool *unfolded_multi_char, U32 flags, regnode *val, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) __attribute__nonnull__(pTHX_4); #define PERL_ARGS_ASSERT_JOIN_EXACT \ - assert(pRExC_state); assert(scan); assert(min_subtract); assert(has_exactf_sharp_s) + assert(pRExC_state); assert(scan); assert(min_subtract); assert(unfolded_multi_char) -STATIC I32 S_make_trie(pTHX_ struct RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth) +STATIC I32 S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) @@ -6625,37 +6786,43 @@ STATIC I32 S_make_trie(pTHX_ struct RExC_state_t *pRExC_state, regnode *startbra #define PERL_ARGS_ASSERT_MAKE_TRIE \ assert(pRExC_state); assert(startbranch); assert(first); assert(last); assert(tail) -STATIC void S_make_trie_failtable(pTHX_ struct RExC_state_t *pRExC_state, regnode *source, regnode *stclass, U32 depth) +STATIC void S_make_trie_failtable(pTHX_ RExC_state_t *pRExC_state, regnode *source, regnode *stclass, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_MAKE_TRIE_FAILTABLE \ assert(pRExC_state); assert(source); assert(stclass) -STATIC char * S_nextchar(pTHX_ struct RExC_state_t *pRExC_state) +STATIC char * S_nextchar(pTHX_ RExC_state_t *pRExC_state) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_NEXTCHAR \ assert(pRExC_state) -STATIC void S_parse_lparen_question_flags(pTHX_ struct RExC_state_t *pRExC_state) +STATIC void S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS \ assert(pRExC_state) -PERL_STATIC_NO_RET void S_re_croak2(pTHX_ const char* pat1, const char* pat2, ...) - __attribute__noreturn__ +STATIC void S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST \ + assert(node); assert(invlist_ptr) + +PERL_STATIC_NO_RET void S_re_croak2(pTHX_ bool utf8, const char* pat1, const char* pat2, ...) + __attribute__noreturn__ + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_RE_CROAK2 \ assert(pat1); assert(pat2) -STATIC regnode* S_reg(pTHX_ struct RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth) +STATIC regnode* S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_REG \ assert(pRExC_state); assert(flagp) -STATIC regnode* S_reg_node(pTHX_ struct RExC_state_t *pRExC_state, U8 op) +STATIC regnode* S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_REG_NODE \ assert(pRExC_state) @@ -6665,91 +6832,168 @@ STATIC UV S_reg_recode(pTHX_ const char value, SV **encp) #define PERL_ARGS_ASSERT_REG_RECODE \ assert(encp) -STATIC SV * S_reg_scan_name(pTHX_ struct RExC_state_t *pRExC_state, U32 flags) +STATIC SV * S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_REG_SCAN_NAME \ assert(pRExC_state) -STATIC bool S_reg_skipcomment(pTHX_ struct RExC_state_t *pRExC_state) +STATIC bool S_reg_skipcomment(pTHX_ RExC_state_t *pRExC_state) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_REG_SKIPCOMMENT \ assert(pRExC_state) -STATIC regnode* S_reganode(pTHX_ struct RExC_state_t *pRExC_state, U8 op, U32 arg) +STATIC regnode* S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_REGANODE \ assert(pRExC_state) -STATIC regnode* S_regatom(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, U32 depth) +STATIC regnode* S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_REGATOM \ assert(pRExC_state); assert(flagp) -STATIC regnode* S_regbranch(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth) +STATIC regnode* S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_REGBRANCH \ assert(pRExC_state); assert(flagp) -STATIC regnode* S_regclass(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, U32 depth, const bool stop_at_1, bool allow_multi_fold, const bool silence_non_portable, SV** ret_invlist) +STATIC regnode* S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth, const bool stop_at_1, bool allow_multi_fold, const bool silence_non_portable, SV** ret_invlist) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_REGCLASS \ assert(pRExC_state); assert(flagp) -STATIC void S_reginsert(pTHX_ struct RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth) +STATIC void S_reginsert(pTHX_ RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_REGINSERT \ assert(pRExC_state); assert(opnd) -STATIC char * S_regpatws(struct RExC_state_t *pRExC_state, char *p, const bool recognize_comment) +STATIC char * S_regpatws(RExC_state_t *pRExC_state, char *p, const bool recognize_comment) __attribute__warn_unused_result__ __attribute__nonnull__(1) __attribute__nonnull__(2); #define PERL_ARGS_ASSERT_REGPATWS \ assert(pRExC_state); assert(p) -STATIC regnode* S_regpiece(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, U32 depth) +STATIC regnode* S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_REGPIECE \ assert(pRExC_state); assert(flagp) -PERL_STATIC_INLINE I32 S_regpposixcc(pTHX_ struct RExC_state_t *pRExC_state, I32 value, const bool strict) +PERL_STATIC_INLINE I32 S_regpposixcc(pTHX_ RExC_state_t *pRExC_state, I32 value, const bool strict) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_REGPPOSIXCC \ assert(pRExC_state) -STATIC void S_regtail(pTHX_ struct RExC_state_t *pRExC_state, regnode *p, const regnode *val, U32 depth) +STATIC void S_regtail(pTHX_ RExC_state_t *pRExC_state, regnode *p, const regnode *val, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_REGTAIL \ assert(pRExC_state); assert(p); assert(val) -STATIC STRLEN S_reguni(pTHX_ const struct RExC_state_t *pRExC_state, UV uv, char *s) +PERL_STATIC_INLINE STRLEN S_reguni(pTHX_ const RExC_state_t *pRExC_state, UV uv, char *s) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_REGUNI \ assert(pRExC_state); assert(s) -STATIC char * S_regwhite(struct RExC_state_t *pRExC_state, char *p) +STATIC char * S_regwhite(RExC_state_t *pRExC_state, char *p) __attribute__warn_unused_result__ __attribute__nonnull__(1) __attribute__nonnull__(2); #define PERL_ARGS_ASSERT_REGWHITE \ assert(pRExC_state); assert(p) -STATIC void S_scan_commit(pTHX_ const struct RExC_state_t *pRExC_state, struct scan_data_t *data, I32 *minlenp, int is_inf) +STATIC void S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, struct scan_data_t *data, SSize_t *minlenp, int is_inf) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT_SCAN_COMMIT \ assert(pRExC_state); assert(data); assert(minlenp) -STATIC I32 S_study_chunk(pTHX_ struct RExC_state_t *pRExC_state, regnode **scanp, I32 *minlenp, I32 *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U8* recursed, struct regnode_charclass_class *and_withp, U32 flags, U32 depth) +STATIC void S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state, regnode* const node, SV* const cp_list, SV* const runtime_defns, SV* const only_utf8_locale_list, SV* const swash, const bool has_user_defined_property) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SET_ANYOF_ARG \ + assert(pRExC_state); assert(node) + +PERL_STATIC_INLINE void S_ssc_add_range(pTHX_ regnode_ssc *ssc, UV const start, UV const end) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SSC_ADD_RANGE \ + assert(ssc) + +STATIC void S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *and_with) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3); +#define PERL_ARGS_ASSERT_SSC_AND \ + assert(pRExC_state); assert(ssc); assert(and_with) + +STATIC void S_ssc_anything(pTHX_ regnode_ssc *ssc) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SSC_ANYTHING \ + assert(ssc) + +PERL_STATIC_INLINE void S_ssc_clear_locale(pTHX_ regnode_ssc *ssc) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE \ + assert(ssc) + +PERL_STATIC_INLINE void S_ssc_cp_and(pTHX_ regnode_ssc *ssc, UV const cp) + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SSC_CP_AND \ + assert(ssc) + +STATIC void S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SSC_FINALIZE \ + assert(pRExC_state); assert(ssc) + +STATIC void S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SSC_INIT \ + assert(pRExC_state); assert(ssc) + +PERL_STATIC_INLINE void S_ssc_intersection(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert_2nd) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SSC_INTERSECTION \ + assert(ssc); assert(invlist) + +STATIC int S_ssc_is_anything(pTHX_ const regnode_ssc *ssc) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_SSC_IS_ANYTHING \ + assert(ssc) + +STATIC int S_ssc_is_cp_posixl_init(pTHX_ const RExC_state_t *pRExC_state, const regnode_ssc *ssc) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT \ + assert(pRExC_state); assert(ssc) + +STATIC void S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *or_with) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2) + __attribute__nonnull__(pTHX_3); +#define PERL_ARGS_ASSERT_SSC_OR \ + assert(pRExC_state); assert(ssc); assert(or_with) + +PERL_STATIC_INLINE void S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert_2nd) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT_SSC_UNION \ + assert(ssc); assert(invlist) + +STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3) @@ -6759,13 +7003,31 @@ STATIC I32 S_study_chunk(pTHX_ struct RExC_state_t *pRExC_state, regnode **scanp assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); assert(last) #endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) -PERL_STATIC_INLINE UV* S__get_invlist_len_addr(pTHX_ SV* invlist) +#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) +PERL_CALLCONV void Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, const char* const indent, SV* const invlist) + __attribute__nonnull__(pTHX_1) + __attribute__nonnull__(pTHX_3) + __attribute__nonnull__(pTHX_4); +#define PERL_ARGS_ASSERT__INVLIST_DUMP \ + assert(file); assert(indent); assert(invlist) + +#endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C) +PERL_CALLCONV SV* Perl__new_invlist_C_array(pTHX_ const UV* const list) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT__GET_INVLIST_LEN_ADDR \ - assert(invlist) +#define PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY \ + assert(list) + +#endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) +PERL_CALLCONV SV* Perl__get_regclass_nonbitmap_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale) + __attribute__nonnull__(pTHX_2); +#define PERL_ARGS_ASSERT__GET_REGCLASS_NONBITMAP_DATA \ + assert(node) +#endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) PERL_CALLCONV SV* Perl__get_swash_invlist(pTHX_ SV* const swash) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -6802,6 +7064,12 @@ PERL_CALLCONV HV* Perl__swash_inversion_hash(pTHX_ SV* const swash) #define PERL_ARGS_ASSERT__SWASH_INVERSION_HASH \ assert(swash) +PERL_STATIC_INLINE bool* S_get_invlist_offset_addr(pTHX_ SV* invlist) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_1); +#define PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR \ + assert(invlist) + #endif #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_TOKE_C) PERL_CALLCONV SV* Perl__core_swash_init(pTHX_ const char* pkg, const char* name, SV* listsv, I32 minbits, I32 none, SV* invlist, U8* const flags_p) @@ -6820,7 +7088,7 @@ STATIC char* S_form_short_octal_warning(pTHX_ const char * const s, const STRLEN #define PERL_ARGS_ASSERT_FORM_SHORT_OCTAL_WARNING \ assert(s) -STATIC char S_grok_bslash_c(pTHX_ const char source, const bool utf8, const bool output_warning) +STATIC char S_grok_bslash_c(pTHX_ const char source, const bool output_warning) __attribute__warn_unused_result__; STATIC bool S_grok_bslash_o(pTHX_ char** s, UV* uv, const char** error_msg, const bool output_warning, const bool strict, const bool silence_non_portable, const bool utf8) @@ -6856,7 +7124,7 @@ PERL_CALLCONV SV* Perl__add_range_to_invlist(pTHX_ SV* invlist, const UV start, __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); */ -PERL_CALLCONV void Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, bool complement_b, SV** i) +PERL_CALLCONV void Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, const bool complement_b, SV** i) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_4); #define PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND \ @@ -6867,11 +7135,6 @@ PERL_CALLCONV void Perl__invlist_invert(pTHX_ SV* const invlist) #define PERL_ARGS_ASSERT__INVLIST_INVERT \ assert(invlist) -PERL_CALLCONV void Perl__invlist_invert_prop(pTHX_ SV* const invlist) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT__INVLIST_INVERT_PROP \ - assert(invlist) - PERL_CALLCONV void Perl__invlist_populate_swatch(pTHX_ SV* const invlist, const UV start, const UV end, U8* swatch) __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_4); @@ -6887,7 +7150,7 @@ PERL_CALLCONV void Perl__invlist_populate_swatch(pTHX_ SV* const invlist, const __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); */ -PERL_CALLCONV void Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, bool complement_b, SV** output) +PERL_CALLCONV void Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, const bool complement_b, SV** output) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_4); #define PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND \ @@ -6896,6 +7159,12 @@ PERL_CALLCONV void Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, S PERL_CALLCONV SV* Perl__new_invlist(pTHX_ IV initial_size) __attribute__warn_unused_result__; +PERL_CALLCONV SV* Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, UV** other_elements_ptr) + __attribute__warn_unused_result__ + __attribute__nonnull__(pTHX_3); +#define PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST \ + assert(other_elements_ptr) + PERL_CALLCONV SV* Perl__swash_to_invlist(pTHX_ SV* const swash) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -6904,13 +7173,7 @@ PERL_CALLCONV SV* Perl__swash_to_invlist(pTHX_ SV* const swash) #endif #if defined(PERL_IN_REGEXEC_C) -STATIC SV* S_core_regclass_swash(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp) - __attribute__warn_unused_result__ - __attribute__nonnull__(pTHX_2); -#define PERL_ARGS_ASSERT_CORE_REGCLASS_SWASH \ - assert(node) - -STATIC char* S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo, bool is_utf_pat) +STATIC char* S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) @@ -6946,28 +7209,37 @@ STATIC CHECKPOINT S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxop #define PERL_ARGS_ASSERT_REGCPPUSH \ assert(rex) -STATIC U8* S_reghop3(U8 *s, I32 off, const U8 *lim) +STATIC U8* S_reghop3(U8 *s, SSize_t off, const U8 *lim) __attribute__warn_unused_result__ __attribute__nonnull__(1) __attribute__nonnull__(3); #define PERL_ARGS_ASSERT_REGHOP3 \ assert(s); assert(lim) -STATIC U8* S_reghopmaybe3(U8 *s, I32 off, const U8 *lim) +STATIC U8* S_reghop4(U8 *s, SSize_t off, const U8 *llim, const U8 *rlim) + __attribute__warn_unused_result__ + __attribute__nonnull__(1) + __attribute__nonnull__(3) + __attribute__nonnull__(4); +#define PERL_ARGS_ASSERT_REGHOP4 \ + assert(s); assert(llim); assert(rlim) + +STATIC U8* S_reghopmaybe3(U8 *s, SSize_t off, const U8 *lim) __attribute__warn_unused_result__ __attribute__nonnull__(1) __attribute__nonnull__(3); #define PERL_ARGS_ASSERT_REGHOPMAYBE3 \ assert(s); assert(lim) -STATIC bool S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8 * const p, bool const utf8_target) +STATIC bool S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8 * const p, const U8 * const p_end, bool const utf8_target) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); + __attribute__nonnull__(pTHX_3) + __attribute__nonnull__(pTHX_4); #define PERL_ARGS_ASSERT_REGINCLASS \ - assert(n); assert(p) + assert(n); assert(p); assert(p_end) -STATIC I32 S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) +STATIC SSize_t S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) @@ -6975,13 +7247,14 @@ STATIC I32 S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *pro #define PERL_ARGS_ASSERT_REGMATCH \ assert(reginfo); assert(startpos); assert(prog) -STATIC I32 S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, I32 max, int depth, bool is_utf8_pat) +STATIC I32 S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, regmatch_info *const reginfo, I32 max, int depth) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); + __attribute__nonnull__(pTHX_3) + __attribute__nonnull__(pTHX_4); #define PERL_ARGS_ASSERT_REGREPEAT \ - assert(prog); assert(startposp); assert(p) + assert(prog); assert(startposp); assert(p); assert(reginfo) STATIC I32 S_regtry(pTHX_ regmatch_info *reginfo, char **startposp) __attribute__warn_unused_result__ @@ -7000,16 +7273,6 @@ STATIC void S_to_utf8_substr(pTHX_ regexp * prog) #define PERL_ARGS_ASSERT_TO_UTF8_SUBSTR \ assert(prog) -# if defined(XXX_dmq) -STATIC U8* S_reghop4(U8 *s, I32 off, const U8 *llim, const U8 *rlim) - __attribute__warn_unused_result__ - __attribute__nonnull__(1) - __attribute__nonnull__(3) - __attribute__nonnull__(4); -#define PERL_ARGS_ASSERT_REGHOP4 \ - assert(s); assert(llim); assert(rlim) - -# endif #endif #if defined(PERL_IN_SCOPE_C) STATIC void S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2, const int type); @@ -7233,7 +7496,7 @@ STATIC char* S_force_version(pTHX_ char *s, int guessing) #define PERL_ARGS_ASSERT_FORCE_VERSION \ assert(s) -STATIC char* S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack, int allow_tick) +STATIC char* S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack) __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_FORCE_WORD \ assert(start) @@ -7287,7 +7550,6 @@ STATIC void S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_pa assert(s); assert(d); assert(e) STATIC int S_pending_ident(pTHX); -STATIC void S_readpipe_override(pTHX); STATIC char* S_scan_const(pTHX_ char *start) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); @@ -7306,12 +7568,11 @@ STATIC char* S_scan_heredoc(pTHX_ char *s) #define PERL_ARGS_ASSERT_SCAN_HEREDOC \ assert(s) -STATIC char* S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck_uni) +STATIC char* S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni) __attribute__nonnull__(pTHX_1) - __attribute__nonnull__(pTHX_2) - __attribute__nonnull__(pTHX_3); + __attribute__nonnull__(pTHX_2); #define PERL_ARGS_ASSERT_SCAN_IDENT \ - assert(s); assert(send); assert(dest) + assert(s); assert(dest) STATIC char* S_scan_inputsymbol(pTHX_ char *start) __attribute__warn_unused_result__ @@ -7325,7 +7586,7 @@ STATIC char* S_scan_pat(pTHX_ char *start, I32 type) #define PERL_ARGS_ASSERT_SCAN_PAT \ assert(start) -STATIC char* S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims, int re_reparse, bool deprecate_escaped_matching) +STATIC char* S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims, int re_reparse, bool deprecate_escaped_matching, char **delimp) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); #define PERL_ARGS_ASSERT_SCAN_STR \ @@ -7350,10 +7611,10 @@ STATIC char* S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_pa #define PERL_ARGS_ASSERT_SCAN_WORD \ assert(s); assert(dest); assert(slp) -STATIC char* S_skipspace(pTHX_ char *s) +STATIC char* S_skipspace_flags(pTHX_ char *s, U32 flags) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_SKIPSPACE \ +#define PERL_ARGS_ASSERT_SKIPSPACE_FLAGS \ assert(s) STATIC I32 S_sublex_done(pTHX) @@ -7431,7 +7692,7 @@ PERL_STATIC_INLINE STRLEN S_is_utf8_char_slow(const U8 *s, const STRLEN len) #define PERL_ARGS_ASSERT_IS_UTF8_CHAR_SLOW \ assert(s) -PERL_STATIC_INLINE bool S_is_utf8_common(pTHX_ const U8 *const p, SV **swash, const char * const swashname) +PERL_STATIC_INLINE bool S_is_utf8_common(pTHX_ const U8 *const p, SV **swash, const char * const swashname, SV* const invlist) __attribute__warn_unused_result__ __attribute__nonnull__(pTHX_1) __attribute__nonnull__(pTHX_2) @@ -7458,7 +7719,7 @@ PERL_CALLCONV UV Perl__to_upper_title_latin1(pTHX_ const U8 c, U8 *p, STRLEN *le #endif #if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -PERL_CALLCONV UV Perl__to_fold_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, const bool flags) +PERL_CALLCONV UV Perl__to_fold_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, const unsigned int flags) __attribute__nonnull__(pTHX_2) __attribute__nonnull__(pTHX_3); #define PERL_ARGS_ASSERT__TO_FOLD_LATIN1 \ @@ -7467,11 +7728,6 @@ PERL_CALLCONV UV Perl__to_fold_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, con #endif #if defined(PERL_IN_UTIL_C) STATIC bool S_ckwarn_common(pTHX_ U32 w); -STATIC const COP* S_closest_cop(pTHX_ const COP *cop, const OP *o) - __attribute__nonnull__(pTHX_1); -#define PERL_ARGS_ASSERT_CLOSEST_COP \ - assert(cop) - STATIC bool S_invoke_exception_hook(pTHX_ SV *ex, bool warn); STATIC SV* S_mess_alloc(pTHX); STATIC SV * S_with_queued_errors(pTHX_ SV *ex) @@ -7611,78 +7867,6 @@ PERL_CALLCONV void Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const cha #define PERL_ARGS_ASSERT_XMLDUMP_VINDENT \ assert(file); assert(pat) -#endif -#if defined(PERL_NEED_MY_BETOH16) -PERL_CALLCONV U16 Perl_my_betoh16(U16 n); -#endif -#if defined(PERL_NEED_MY_BETOH32) -PERL_CALLCONV U32 Perl_my_betoh32(U32 n); -#endif -#if defined(PERL_NEED_MY_BETOH64) -PERL_CALLCONV U64 Perl_my_betoh64(U64 n); -#endif -#if defined(PERL_NEED_MY_BETOHI) -PERL_CALLCONV int Perl_my_betohi(int n); -#endif -#if defined(PERL_NEED_MY_BETOHL) -PERL_CALLCONV long Perl_my_betohl(long n); -#endif -#if defined(PERL_NEED_MY_BETOHS) -PERL_CALLCONV short Perl_my_betohs(short n); -#endif -#if defined(PERL_NEED_MY_HTOBE16) -PERL_CALLCONV U16 Perl_my_htobe16(U16 n); -#endif -#if defined(PERL_NEED_MY_HTOBE32) -PERL_CALLCONV U32 Perl_my_htobe32(U32 n); -#endif -#if defined(PERL_NEED_MY_HTOBE64) -PERL_CALLCONV U64 Perl_my_htobe64(U64 n); -#endif -#if defined(PERL_NEED_MY_HTOBEI) -PERL_CALLCONV int Perl_my_htobei(int n); -#endif -#if defined(PERL_NEED_MY_HTOBEL) -PERL_CALLCONV long Perl_my_htobel(long n); -#endif -#if defined(PERL_NEED_MY_HTOBES) -PERL_CALLCONV short Perl_my_htobes(short n); -#endif -#if defined(PERL_NEED_MY_HTOLE16) -PERL_CALLCONV U16 Perl_my_htole16(U16 n); -#endif -#if defined(PERL_NEED_MY_HTOLE32) -PERL_CALLCONV U32 Perl_my_htole32(U32 n); -#endif -#if defined(PERL_NEED_MY_HTOLE64) -PERL_CALLCONV U64 Perl_my_htole64(U64 n); -#endif -#if defined(PERL_NEED_MY_HTOLEI) -PERL_CALLCONV int Perl_my_htolei(int n); -#endif -#if defined(PERL_NEED_MY_HTOLEL) -PERL_CALLCONV long Perl_my_htolel(long n); -#endif -#if defined(PERL_NEED_MY_HTOLES) -PERL_CALLCONV short Perl_my_htoles(short n); -#endif -#if defined(PERL_NEED_MY_LETOH16) -PERL_CALLCONV U16 Perl_my_letoh16(U16 n); -#endif -#if defined(PERL_NEED_MY_LETOH32) -PERL_CALLCONV U32 Perl_my_letoh32(U32 n); -#endif -#if defined(PERL_NEED_MY_LETOH64) -PERL_CALLCONV U64 Perl_my_letoh64(U64 n); -#endif -#if defined(PERL_NEED_MY_LETOHI) -PERL_CALLCONV int Perl_my_letohi(int n); -#endif -#if defined(PERL_NEED_MY_LETOHL) -PERL_CALLCONV long Perl_my_letohl(long n); -#endif -#if defined(PERL_NEED_MY_LETOHS) -PERL_CALLCONV short Perl_my_letohs(short n); #endif #if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C) STATIC void S_pidgone(pTHX_ Pid_t pid, int status); @@ -7860,7 +8044,7 @@ PERL_CALLCONV char* Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp assert(sv); assert(nxp) #endif -#if defined(USE_PERLIO) && !defined(USE_SFIO) +#if defined(USE_PERLIO) PERL_CALLCONV void Perl_PerlIO_clearerr(pTHX_ PerlIO *f); PERL_CALLCONV int Perl_PerlIO_close(pTHX_ PerlIO *f); PERL_CALLCONV int Perl_PerlIO_eof(pTHX_ PerlIO *f); @@ -7869,10 +8053,10 @@ PERL_CALLCONV int Perl_PerlIO_fileno(pTHX_ PerlIO *f); PERL_CALLCONV int Perl_PerlIO_fill(pTHX_ PerlIO *f); PERL_CALLCONV int Perl_PerlIO_flush(pTHX_ PerlIO *f); PERL_CALLCONV STDCHAR * Perl_PerlIO_get_base(pTHX_ PerlIO *f); -PERL_CALLCONV int Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f) +PERL_CALLCONV SSize_t Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f) __attribute__warn_unused_result__; -PERL_CALLCONV int Perl_PerlIO_get_cnt(pTHX_ PerlIO *f) +PERL_CALLCONV SSize_t Perl_PerlIO_get_cnt(pTHX_ PerlIO *f) __attribute__warn_unused_result__; PERL_CALLCONV STDCHAR * Perl_PerlIO_get_ptr(pTHX_ PerlIO *f); @@ -7882,8 +8066,8 @@ PERL_CALLCONV SSize_t Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count assert(vbuf) PERL_CALLCONV int Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence); -PERL_CALLCONV void Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt); -PERL_CALLCONV void Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, int cnt); +PERL_CALLCONV void Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt); +PERL_CALLCONV void Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, SSize_t cnt); PERL_CALLCONV void Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f); PERL_CALLCONV PerlIO * Perl_PerlIO_stderr(pTHX) __attribute__warn_unused_result__; @@ -7907,6 +8091,9 @@ PERL_CALLCONV SSize_t Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_ #endif #if defined(WIN32) +PERL_CALLCONV char* Perl_my_setlocale(pTHX_ int category, const char* locale) + __attribute__pure__; + PERL_CALLCONV_NO_RET void win32_croak_not_implemented(const char * fname) __attribute__noreturn__ __attribute__nonnull__(1); diff --git a/Master/tlpkg/tlperl/lib/CORE/reentr.h b/Master/tlpkg/tlperl/lib/CORE/reentr.h index 3510fc55457..c268851922c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/reentr.h +++ b/Master/tlpkg/tlperl/lib/CORE/reentr.h @@ -41,13 +41,11 @@ #ifdef __hpux # undef HAS_CRYPT_R -# undef HAS_DRAND48_R # undef HAS_ENDGRENT_R # undef HAS_ENDPWENT_R # undef HAS_GETGRENT_R # undef HAS_GETPWENT_R # undef HAS_SETLOCALE_R -# undef HAS_SRAND48_R # undef HAS_STRERROR_R # define NETDB_R_OBSOLETE #endif @@ -101,9 +99,6 @@ #ifdef I_NETDB # include #endif -#ifdef I_STDLIB -# include /* drand48_data */ -#endif #ifdef I_CRYPT # ifdef I_CRYPT # include @@ -150,48 +145,43 @@ #define REENTRANT_PROTO_I_ISD 33 #define REENTRANT_PROTO_I_LISBI 34 #define REENTRANT_PROTO_I_LISD 35 -#define REENTRANT_PROTO_I_LS 36 -#define REENTRANT_PROTO_I_SB 37 -#define REENTRANT_PROTO_I_SBI 38 -#define REENTRANT_PROTO_I_SBIE 39 -#define REENTRANT_PROTO_I_SBIH 40 -#define REENTRANT_PROTO_I_SBIR 41 -#define REENTRANT_PROTO_I_SBWR 42 -#define REENTRANT_PROTO_I_SBWRE 43 -#define REENTRANT_PROTO_I_SD 44 -#define REENTRANT_PROTO_I_ST 45 -#define REENTRANT_PROTO_I_St 46 -#define REENTRANT_PROTO_I_TISD 47 -#define REENTRANT_PROTO_I_TS 48 -#define REENTRANT_PROTO_I_TSBI 49 -#define REENTRANT_PROTO_I_TSBIR 50 -#define REENTRANT_PROTO_I_TSBWR 51 -#define REENTRANT_PROTO_I_TSR 52 -#define REENTRANT_PROTO_I_TsISBWRE 53 -#define REENTRANT_PROTO_I_UISBWRE 54 -#define REENTRANT_PROTO_I_iS 55 -#define REENTRANT_PROTO_I_lS 56 -#define REENTRANT_PROTO_I_uISBWRE 57 -#define REENTRANT_PROTO_S_CBI 58 -#define REENTRANT_PROTO_S_CCSBI 59 -#define REENTRANT_PROTO_S_CIISBIE 60 -#define REENTRANT_PROTO_S_CSBI 61 -#define REENTRANT_PROTO_S_CSBIE 62 -#define REENTRANT_PROTO_S_CWISBIE 63 -#define REENTRANT_PROTO_S_CWISBWIE 64 -#define REENTRANT_PROTO_S_ICSBI 65 -#define REENTRANT_PROTO_S_ISBI 66 -#define REENTRANT_PROTO_S_LISBI 67 -#define REENTRANT_PROTO_S_SBI 68 -#define REENTRANT_PROTO_S_SBIE 69 -#define REENTRANT_PROTO_S_SBW 70 -#define REENTRANT_PROTO_S_TISBI 71 -#define REENTRANT_PROTO_S_TSBI 72 -#define REENTRANT_PROTO_S_TSBIE 73 -#define REENTRANT_PROTO_S_TWISBIE 74 -#define REENTRANT_PROTO_V_D 75 -#define REENTRANT_PROTO_V_H 76 -#define REENTRANT_PROTO_V_ID 77 +#define REENTRANT_PROTO_I_SB 36 +#define REENTRANT_PROTO_I_SBI 37 +#define REENTRANT_PROTO_I_SBIE 38 +#define REENTRANT_PROTO_I_SBIH 39 +#define REENTRANT_PROTO_I_SBIR 40 +#define REENTRANT_PROTO_I_SBWR 41 +#define REENTRANT_PROTO_I_SBWRE 42 +#define REENTRANT_PROTO_I_SD 43 +#define REENTRANT_PROTO_I_TISD 44 +#define REENTRANT_PROTO_I_TS 45 +#define REENTRANT_PROTO_I_TSBI 46 +#define REENTRANT_PROTO_I_TSBIR 47 +#define REENTRANT_PROTO_I_TSBWR 48 +#define REENTRANT_PROTO_I_TSR 49 +#define REENTRANT_PROTO_I_TsISBWRE 50 +#define REENTRANT_PROTO_I_UISBWRE 51 +#define REENTRANT_PROTO_I_uISBWRE 52 +#define REENTRANT_PROTO_S_CBI 53 +#define REENTRANT_PROTO_S_CCSBI 54 +#define REENTRANT_PROTO_S_CIISBIE 55 +#define REENTRANT_PROTO_S_CSBI 56 +#define REENTRANT_PROTO_S_CSBIE 57 +#define REENTRANT_PROTO_S_CWISBIE 58 +#define REENTRANT_PROTO_S_CWISBWIE 59 +#define REENTRANT_PROTO_S_ICSBI 60 +#define REENTRANT_PROTO_S_ISBI 61 +#define REENTRANT_PROTO_S_LISBI 62 +#define REENTRANT_PROTO_S_SBI 63 +#define REENTRANT_PROTO_S_SBIE 64 +#define REENTRANT_PROTO_S_SBW 65 +#define REENTRANT_PROTO_S_TISBI 66 +#define REENTRANT_PROTO_S_TSBI 67 +#define REENTRANT_PROTO_S_TSBIE 68 +#define REENTRANT_PROTO_S_TWISBIE 69 +#define REENTRANT_PROTO_V_D 70 +#define REENTRANT_PROTO_V_H 71 +#define REENTRANT_PROTO_V_ID 72 /* Defines for indicating which special features are supported. */ @@ -639,10 +629,6 @@ typedef struct { char* _ctime_buffer; size_t _ctime_size; #endif /* HAS_CTIME_R */ -#ifdef HAS_DRAND48_R - struct drand48_data _drand48_struct; - double _drand48_double; -#endif /* HAS_DRAND48_R */ #ifdef HAS_GETGRNAM_R struct group _grent_struct; char* _grent_buffer; @@ -740,18 +726,6 @@ typedef struct { FILE* _spent_fptr; # endif #endif /* HAS_GETSPNAM_R */ -#ifdef HAS_RANDOM_R - struct random_data _random_struct; -# if RANDOM_R_PROTO == REENTRANT_PROTO_I_iS - int _random_retval; -# endif -# if RANDOM_R_PROTO == REENTRANT_PROTO_I_lS - long _random_retval; -# endif -# if RANDOM_R_PROTO == REENTRANT_PROTO_I_St - int32_t _random_retval; -# endif -#endif /* HAS_RANDOM_R */ #ifdef HAS_READDIR_R struct dirent* _readdir_struct; size_t _readdir_size; @@ -770,9 +744,6 @@ typedef struct { char* _setlocale_buffer; size_t _setlocale_size; #endif /* HAS_SETLOCALE_R */ -#ifdef HAS_SRANDOM_R - struct random_data _srandom_struct; -#endif /* HAS_SRANDOM_R */ #ifdef HAS_STRERROR_R char* _strerror_buffer; size_t _strerror_size; @@ -844,15 +815,6 @@ typedef struct { # endif #endif /* HAS_CTIME_R */ -#ifdef HAS_DRAND48_R -# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) -# undef drand48 -# if !defined(drand48) && DRAND48_R_PROTO == REENTRANT_PROTO_I_ST -# define drand48() (drand48_r(&PL_reentrant_buffer->_drand48_struct, &PL_reentrant_buffer->_drand48_double) == 0 ? PL_reentrant_buffer->_drand48_double : 0) -# endif -# endif -#endif /* HAS_DRAND48_R */ - #ifdef HAS_ENDGRENT_R # if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) # undef endgrent @@ -1324,21 +1286,6 @@ typedef struct { # endif #endif /* HAS_GETSPNAM_R */ -#ifdef HAS_RANDOM_R -# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) -# undef random -# if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_iS -# define random() (random_r(&PL_reentrant_buffer->_random_retval, &PL_reentrant_buffer->_random_struct) == 0 ? PL_reentrant_buffer->_random_retval : 0) -# endif -# if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_lS -# define random() (random_r(&PL_reentrant_buffer->_random_retval, &PL_reentrant_buffer->_random_struct) == 0 ? PL_reentrant_buffer->_random_retval : 0) -# endif -# if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_St -# define random() (random_r(&PL_reentrant_buffer->_random_struct, &PL_reentrant_buffer->_random_retval) == 0 ? PL_reentrant_buffer->_random_retval : 0) -# endif -# endif -#endif /* HAS_RANDOM_R */ - #ifdef HAS_READDIR_R # if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) # undef readdir @@ -1444,24 +1391,6 @@ typedef struct { # endif #endif /* HAS_SETSERVENT_R */ -#ifdef HAS_SRAND48_R -# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) -# undef srand48 -# if !defined(srand48) && SRAND48_R_PROTO == REENTRANT_PROTO_I_LS -# define srand48(a) (srand48_r(a, &PL_reentrant_buffer->_drand48_struct) == 0 ? &PL_reentrant_buffer->_drand48_struct : 0) -# endif -# endif -#endif /* HAS_SRAND48_R */ - -#ifdef HAS_SRANDOM_R -# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) -# undef srandom -# if !defined(srandom) && SRANDOM_R_PROTO == REENTRANT_PROTO_I_TS -# define srandom(a) (srandom_r(a, &PL_reentrant_buffer->_srandom_struct) == 0 ? &PL_reentrant_buffer->_srandom_struct : 0) -# endif -# endif -#endif /* HAS_SRANDOM_R */ - #ifdef HAS_STRERROR_R # if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) # undef strerror diff --git a/Master/tlpkg/tlperl/lib/CORE/regcharclass.h b/Master/tlpkg/tlperl/lib/CORE/regcharclass.h index e51fe64af40..5e34ec0d916 100644 --- a/Master/tlpkg/tlperl/lib/CORE/regcharclass.h +++ b/Master/tlpkg/tlperl/lib/CORE/regcharclass.h @@ -10,6 +10,8 @@ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! * This file is built by regen/regcharclass.pl. * Any changes made here will be lost! + * WARNING: These macros are for internal Perl core use only, and may be + * changed or removed without notice. */ @@ -22,85 +24,58 @@ "\x0D\x0A" # CRLF - Network (Windows) line ending \p{VertSpace} */ -/*** GENERATED CODE ***/ -#define is_LNBREAK(s,is_utf8) \ -( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \ -: ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ -: ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ -: ( 0x85 == ((U8*)s)[0] ) ) - /*** GENERATED CODE ***/ #define is_LNBREAK_safe(s,e,is_utf8) \ ( ((e)-(s) > 2) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \ - : ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ + ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0C ) ? 1\ + : ( 0x0D == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x0A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 1 ) \ : ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ - : ( 0x85 == ((U8*)s)[0] ) ) \ + ( ( 0xC2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ + : ( ( ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ + : ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ) \ : ((e)-(s) > 1) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \ - : ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ + ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0C ) ? 1\ + : ( 0x0D == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x0A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 1 ) \ : ( is_utf8 ) ? \ - ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ - : ( 0x85 == ((U8*)s)[0] ) ) \ + ( ( ( 0xC2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) ? 2 : 0 )\ + : ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ) \ : ((e)-(s) > 0) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ + ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0D ) ? 1\ : ( !( is_utf8 ) ) ? \ - ( 0x85 == ((U8*)s)[0] ) \ + ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) \ : 0 ) \ : 0 ) -/*** GENERATED CODE ***/ -#define is_LNBREAK_utf8(s) \ -( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \ -: ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ -: ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ -: ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 ) - /*** GENERATED CODE ***/ #define is_LNBREAK_utf8_safe(s,e) \ ( ((e)-(s) > 2) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \ - : ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ - : ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ + ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0C ) ? 1\ + : ( 0x0D == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x0A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 1 ) \ + : ( 0xC2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ + : ( ( ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ : ((e)-(s) > 1) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \ - : ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ - : ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ + ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0C ) ? 1\ + : ( 0x0D == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x0A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 1 ) \ + : ( ( 0xC2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) ? 2 : 0 )\ : ((e)-(s) > 0) ? \ - ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) \ -: 0 ) - -/*** GENERATED CODE ***/ -#define is_LNBREAK_latin1(s) \ -( ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) || 0x85 == ((U8*)s)[0] ) ? 1\ -: ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ + ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0D )\ : 0 ) /*** GENERATED CODE ***/ #define is_LNBREAK_latin1_safe(s,e) \ ( ((e)-(s) > 1) ? \ - ( ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) || 0x85 == ((U8*)s)[0] ) ? 1\ - : ( 0x0D == ((U8*)s)[0] ) ? \ - ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \ + ( ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0C ) || 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? 1\ + : ( 0x0D == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x0A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 1 ) \ : 0 ) \ : ((e)-(s) > 0) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x85 == ((U8*)s)[0] )\ + ( ( 0x0A <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0D ) || 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) )\ : 0 ) /* @@ -108,313 +83,77 @@ \p{HorizSpace} */ -/*** GENERATED CODE ***/ -#define is_HORIZWS(s,is_utf8) \ -( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ -: ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 )\ -: ( 0xA0 == ((U8*)s)[0] ) ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_safe(s,e,is_utf8) \ -( ((e)-(s) > 2) ? \ - ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ - : ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 )\ - : ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 )\ - : ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 )\ - : ( 0xA0 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 1) ? \ - ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ - : ( is_utf8 ) ? \ - ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0xA0 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ - : ( 0xA0 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 0) ? \ - ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ - : ( !( is_utf8 ) ) ? \ - ( 0xA0 == ((U8*)s)[0] ) \ - : 0 ) \ -: 0 ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_utf8(s) \ -( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ -: ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \ -: ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_utf8_safe(s,e) \ -( ((e)-(s) > 2) ? \ - ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ - : ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 )\ -: ((e)-(s) > 1) ? \ - ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \ - : ( ( 0xC2 == ((U8*)s)[0] ) && ( 0xA0 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ -: ((e)-(s) > 0) ? \ - ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) \ -: 0 ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_latin1(s) \ -( ((U8*)s)[0] == 0x09 || ( ( ((U8*)s)[0] & 0x7F ) == 0x20 ) ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_latin1_safe(s,e) \ -( ((e)-(s) > 0) ? \ - ( ((U8*)s)[0] == 0x09 || ( ( ((U8*)s)[0] & 0x7F ) == 0x20 ) ) \ -: 0 ) - /*** GENERATED CODE ***/ #define is_HORIZWS_high(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_high_safe(s,e) \ -( ((e)-(s) > 2) ? \ - ( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 )\ -: 0 ) - -/*** GENERATED CODE ***/ -#define is_HORIZWS_cp(cp) \ -( 0x09 == cp || ( 0x09 < cp && \ -( 0x20 == cp || ( 0x20 < cp && \ -( 0xA0 == cp || ( 0xA0 < cp && \ -( 0x1680 == cp || ( 0x1680 < cp && \ -( 0x180E == cp || ( 0x180E < cp && \ -( ( 0x2000 <= cp && cp <= 0x200A ) || ( 0x200A < cp && \ -( 0x202F == cp || ( 0x202F < cp && \ -( 0x205F == cp || 0x3000 == cp ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0x9A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x8A ) || 0xAF == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 )\ + : ( ( 0x81 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( ( ( 0xE3 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 ) /*** GENERATED CODE ***/ #define is_HORIZWS_cp_high(cp) \ -( 0x1680 == cp || ( 0x1680 < cp && \ -( 0x180E == cp || ( 0x180E < cp && \ -( ( 0x2000 <= cp && cp <= 0x200A ) || ( 0x200A < cp && \ -( 0x202F == cp || ( 0x202F < cp && \ -( 0x205F == cp || 0x3000 == cp ) ) ) ) ) ) ) ) ) +( 0x1680 == NATIVE_TO_UNI(cp) || ( 0x1680 < NATIVE_TO_UNI(cp) && \ +( ( 0x2000 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0x200A ) || ( 0x200A < NATIVE_TO_UNI(cp) &&\ +( 0x202F == NATIVE_TO_UNI(cp) || ( 0x202F < NATIVE_TO_UNI(cp) && \ +( 0x205F == NATIVE_TO_UNI(cp) || 0x3000 == NATIVE_TO_UNI(cp) ) ) ) ) ) ) ) /* VERTWS: Vertical Whitespace: \v \V \p{VertSpace} */ -/*** GENERATED CODE ***/ -#define is_VERTWS(s,is_utf8) \ -( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ -: ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ -: ( 0x85 == ((U8*)s)[0] ) ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_safe(s,e,is_utf8) \ -( ((e)-(s) > 2) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ - : ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ - : ( 0x85 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 1) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ - : ( is_utf8 ) ? \ - ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ - : ( 0x85 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 0) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ - : ( !( is_utf8 ) ) ? \ - ( 0x85 == ((U8*)s)[0] ) \ - : 0 ) \ -: 0 ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_utf8(s) \ -( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ -: ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ -: ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_utf8_safe(s,e) \ -( ((e)-(s) > 2) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ - : ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ -: ((e)-(s) > 1) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \ - : ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ -: ((e)-(s) > 0) ? \ - ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) \ -: 0 ) - /*** GENERATED CODE ***/ #define is_VERTWS_high(s) \ -( ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_high_safe(s,e) \ -( ( ( ( ((e)-(s) > 2) && ( 0xE2 == ((U8*)s)[0] ) ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_latin1(s) \ -( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x85 == ((U8*)s)[0] ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_latin1_safe(s,e) \ -( ((e)-(s) > 0) ? \ - ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x85 == ((U8*)s)[0] )\ -: 0 ) - -/*** GENERATED CODE ***/ -#define is_VERTWS_cp(cp) \ -( ( 0x0A <= cp && cp <= 0x0D ) || ( 0x0D < cp && \ -( 0x85 == cp || ( 0x85 < cp && \ -( 0x2028 == cp || 0x2029 == cp ) ) ) ) ) +( ( ( ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xA8 ) ) ? 3 : 0 ) /*** GENERATED CODE ***/ #define is_VERTWS_cp_high(cp) \ -( 0x2028 == cp || 0x2029 == cp ) +( 0x2028 == NATIVE_TO_UNI(cp) || 0x2029 == NATIVE_TO_UNI(cp) ) /* XDIGIT: Hexadecimal digits \p{XDigit} */ -/*** GENERATED CODE ***/ -#define is_XDIGIT_utf8(s) \ -( ( ( 0x30 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x39 ) || ( 0x41 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x46 ) || ( 0x61 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x66 ) ) ? 1\ -: ( 0xEF == ((U8*)s)[0] ) ? \ - ( ( 0xBC == ((U8*)s)[1] ) ? \ - ( ( ( 0x90 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x99 ) || ( 0xA1 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xA6 ) ) ? 3 : 0 )\ - : ( ( 0xBD == ((U8*)s)[1] ) && ( 0x81 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x86 ) ) ? 3 : 0 )\ -: 0 ) - /*** GENERATED CODE ***/ #define is_XDIGIT_high(s) \ -( ( 0xEF == ((U8*)s)[0] ) ? \ - ( ( 0xBC == ((U8*)s)[1] ) ? \ - ( ( ( 0x90 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x99 ) || ( 0xA1 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xA6 ) ) ? 3 : 0 )\ - : ( ( 0xBD == ((U8*)s)[1] ) && ( 0x81 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x86 ) ) ? 3 : 0 )\ +( ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0x90 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x99 ) || ( 0xA1 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xA6 ) ) ? 3 : 0 )\ + : ( ( 0xBD == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x81 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) ) ? 3 : 0 )\ : 0 ) /*** GENERATED CODE ***/ #define is_XDIGIT_cp_high(cp) \ -( ( 0xFF10 <= cp && cp <= 0xFF19 ) || ( 0xFF19 < cp && \ -( ( 0xFF21 <= cp && cp <= 0xFF26 ) || ( 0xFF41 <= cp && cp <= 0xFF46 ) ) ) ) +( ( 0xFF10 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0xFF19 ) || ( 0xFF19 < NATIVE_TO_UNI(cp) &&\ +( ( 0xFF21 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0xFF26 ) || ( 0xFF41 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0xFF46 ) ) ) ) /* XPERLSPACE: \p{XPerlSpace} \p{XPerlSpace} */ -/*** GENERATED CODE ***/ -#define is_XPERLSPACE(s,is_utf8) \ -( ( ( 0x09 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x20 == ((U8*)s)[0] ) ? 1\ -: ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] || 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || ( ((U8*)s)[2] & 0xFE ) == 0xA8 || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 )\ -: ( 0x85 == ((U8*)s)[0] || 0xA0 == ((U8*)s)[0] ) ) - -/*** GENERATED CODE ***/ -#define is_XPERLSPACE_utf8(s) \ -( ( ( 0x09 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x20 == ((U8*)s)[0] ) ? 1\ -: ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] || 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \ -: ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0x8A ) || ( ((U8*)s)[2] & 0xFE ) == 0xA8 || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) - /*** GENERATED CODE ***/ #define is_XPERLSPACE_high(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0x8A ) || ( ((U8*)s)[2] & 0xFE ) == 0xA8 || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x81 == ((U8*)s)[1] ) && ( 0x9F == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( ( ( 0xE3 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0x9A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x8A ) || ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xA8 || 0xAF == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 )\ + : ( ( 0x81 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( ( ( 0xE3 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 ) /*** GENERATED CODE ***/ #define is_XPERLSPACE_cp_high(cp) \ -( 0x1680 == cp || ( 0x1680 < cp && \ -( 0x180E == cp || ( 0x180E < cp && \ -( ( 0x2000 <= cp && cp <= 0x200A ) || ( 0x200A < cp && \ -( 0x2028 == cp || ( 0x2028 < cp && \ -( 0x2029 == cp || ( 0x2029 < cp && \ -( 0x202F == cp || ( 0x202F < cp && \ -( 0x205F == cp || 0x3000 == cp ) ) ) ) ) ) ) ) ) ) ) ) ) +( 0x1680 == NATIVE_TO_UNI(cp) || ( 0x1680 < NATIVE_TO_UNI(cp) && \ +( ( 0x2000 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0x200A ) || ( 0x200A < NATIVE_TO_UNI(cp) &&\ +( 0x2028 == NATIVE_TO_UNI(cp) || ( 0x2028 < NATIVE_TO_UNI(cp) && \ +( 0x2029 == NATIVE_TO_UNI(cp) || ( 0x2029 < NATIVE_TO_UNI(cp) && \ +( 0x202F == NATIVE_TO_UNI(cp) || ( 0x202F < NATIVE_TO_UNI(cp) && \ +( 0x205F == NATIVE_TO_UNI(cp) || 0x3000 == NATIVE_TO_UNI(cp) ) ) ) ) ) ) ) ) ) ) ) /* REPLACEMENT: Unicode REPLACEMENT CHARACTER @@ -423,7 +162,7 @@ */ /*** GENERATED CODE ***/ #define is_REPLACEMENT_utf8_safe(s,e) \ -( ( ( ( ((e)-(s) > 2) && ( 0xEF == ((U8*)s)[0] ) ) && ( 0xBF == ((U8*)s)[1] ) ) && ( 0xBD == ((U8*)s)[2] ) ) ? 3 : 0 ) +( ( ( ( ( ((e) - (s)) >= 3 ) && ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0xBD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 ) /* NONCHAR: Non character code points @@ -432,15 +171,15 @@ */ /*** GENERATED CODE ***/ #define is_NONCHAR_utf8(s) \ -( ( 0xEF == ((U8*)s)[0] ) ? \ - ( ( 0xB7 == ((U8*)s)[1] ) ? \ - ( ( 0x90 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xAF ) ? 3 : 0 ) \ - : ( ( 0xBF == ((U8*)s)[1] ) && ( ((U8*)s)[2] >= 0xBE ) ) ? 3 : 0 ) \ -: ( 0xF0 == ((U8*)s)[0] ) ? \ - ( ( ( ( ((U8*)s)[1] == 0x9F || ( ( ((U8*)s)[1] & 0xEF ) == 0xAF ) ) && ( 0xBF == ((U8*)s)[2] ) ) && ( ((U8*)s)[3] >= 0xBE ) ) ? 4 : 0 )\ -: ( 0xF1 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0xF3 ) ? \ - ( ( ( ( ( ((U8*)s)[1] & 0xCF ) == 0x8F ) && ( 0xBF == ((U8*)s)[2] ) ) && ( ((U8*)s)[3] >= 0xBE ) ) ? 4 : 0 )\ -: ( ( ( ( 0xF4 == ((U8*)s)[0] ) && ( 0x8F == ((U8*)s)[1] ) ) && ( 0xBF == ((U8*)s)[2] ) ) && ( ((U8*)s)[3] >= 0xBE ) ) ? 4 : 0 ) +( ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xB7 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x90 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xAF ) ? 3 : 0 )\ + : ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xBE ) ) ? 3 : 0 )\ +: ( 0xF0 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) == 0x9F || ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xEF ) == 0xAF ) ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[3]) >= 0xBE ) ) ? 4 : 0 )\ +: ( 0xF1 <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0xF3 ) ?\ + ( ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xCF ) == 0x8F ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[3]) >= 0xBE ) ) ? 4 : 0 )\ +: ( ( ( ( 0xF4 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x8F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[3]) >= 0xBE ) ) ? 4 : 0 ) /* SURROGATE: Surrogate characters @@ -449,7 +188,7 @@ */ /*** GENERATED CODE ***/ #define is_SURROGATE_utf8(s) \ -( ( ( 0xED == ((U8*)s)[0] ) && ( ((U8*)s)[1] >= 0xA0 ) ) ? 3 : 0 ) +( ( ( 0xED == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[1]) >= 0xA0 ) ) ? 3 : 0 ) /* GCB_L: Grapheme_Cluster_Break=L @@ -458,11 +197,11 @@ */ /*** GENERATED CODE ***/ #define is_GCB_L_utf8(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x84 == ((U8*)s)[1] ) ? \ +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x84 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ 3 \ - : ( ( 0x85 == ((U8*)s)[1] ) && ( ((U8*)s)[2] <= 0x9F ) ) ? 3 : 0 ) \ -: ( ( ( 0xEA == ((U8*)s)[0] ) && ( 0xA5 == ((U8*)s)[1] ) ) && ( 0xA0 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xBC ) ) ? 3 : 0 ) + : ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x9F ) ) ? 3 : 0 )\ +: ( ( ( 0xEA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0xA5 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0xA0 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xBC ) ) ? 3 : 0 ) /* GCB_LV_LVT_V: Grapheme_Cluster_Break=(LV or LVT or V) @@ -471,22 +210,22 @@ */ /*** GENERATED CODE ***/ #define is_GCB_LV_LVT_V_utf8(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] >= 0xA0 ) ? 3 : 0 ) \ - : ( ( 0x86 == ((U8*)s)[1] ) && ( ((U8*)s)[2] <= 0xA7 ) ) ? 3 : 0 ) \ -: ( 0xEA == ((U8*)s)[0] ) ? \ - ( ( ((U8*)s)[1] >= 0xB0 ) ? \ +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xA0 ) ? 3 : 0 ) \ + : ( ( 0x86 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xA7 ) ) ? 3 : 0 )\ +: ( 0xEA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) >= 0xB0 ) ? \ 3 \ : 0 ) \ -: ( 0xEB == ((U8*)s)[0] || 0xEC == ((U8*)s)[0] ) ? \ +: ( 0xEB == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0xEC == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ 3 \ -: ( 0xED == ((U8*)s)[0] ) ? \ - ( ( ((U8*)s)[1] <= 0x9D ) ? \ +: ( 0xED == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) <= 0x9D ) ? \ 3 \ - : ( 0x9E == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0xA3 ) || ( ((U8*)s)[2] >= 0xB0 ) ) ? 3 : 0 ) \ - : ( ( 0x9F == ((U8*)s)[1] ) && ( ((U8*)s)[2] <= 0x86 ) ) ? 3 : 0 ) \ + : ( 0x9E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xA3 ) || ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xB0 ) ) ? 3 : 0 )\ + : ( ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) ) ? 3 : 0 )\ : 0 ) /* @@ -505,7 +244,7 @@ */ /*** GENERATED CODE ***/ #define is_GCB_RI_utf8(s) \ -( ( ( ( ( 0xF0 == ((U8*)s)[0] ) && ( 0x9F == ((U8*)s)[1] ) ) && ( 0x87 == ((U8*)s)[2] ) ) && ( ((U8*)s)[3] >= 0xA6 ) ) ? 4 : 0 ) +( ( ( ( ( 0xF0 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[3]) >= 0xA6 ) ) ? 4 : 0 ) /* GCB_SPECIAL_BEGIN_START: Grapheme_Cluster_Break=special_begin_starts @@ -514,25 +253,25 @@ */ /*** GENERATED CODE ***/ #define is_GCB_SPECIAL_BEGIN_START_utf8(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( ( ((U8*)s)[1] & 0xFC ) == 0x84 ) ? \ +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xFC ) == 0x84 ) ? \ 3 \ : 0 ) \ -: ( 0xEA == ((U8*)s)[0] ) ? \ - ( ( 0xA5 == ((U8*)s)[1] ) ? \ - ( ( 0xA0 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xBC ) ? 3 : 0 ) \ - : ( ((U8*)s)[1] >= 0xB0 ) ? \ +: ( 0xEA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xA5 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xA0 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xBC ) ? 3 : 0 )\ + : ( NATIVE_TO_LATIN1(((U8*)s)[1]) >= 0xB0 ) ? \ 3 \ : 0 ) \ -: ( 0xEB == ((U8*)s)[0] || 0xEC == ((U8*)s)[0] ) ? \ +: ( 0xEB == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0xEC == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ 3 \ -: ( 0xED == ((U8*)s)[0] ) ? \ - ( ( ((U8*)s)[1] <= 0x9D ) ? \ +: ( 0xED == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) <= 0x9D ) ? \ 3 \ - : ( 0x9E == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0xA3 ) || ( ((U8*)s)[2] >= 0xB0 ) ) ? 3 : 0 ) \ - : ( ( 0x9F == ((U8*)s)[1] ) && ( ( ((U8*)s)[2] <= 0x86 ) || ( 0x8B <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xBB ) ) ) ? 3 : 0 )\ -: ( ( ( ( 0xF0 == ((U8*)s)[0] ) && ( 0x9F == ((U8*)s)[1] ) ) && ( 0x87 == ((U8*)s)[2] ) ) && ( ((U8*)s)[3] >= 0xA6 ) ) ? 4 : 0 ) + : ( 0x9E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xA3 ) || ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xB0 ) ) ? 3 : 0 )\ + : ( ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) || ( 0x8B <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xBB ) ) ) ? 3 : 0 )\ +: ( ( ( ( 0xF0 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[3]) >= 0xA6 ) ) ? 4 : 0 ) /* GCB_T: Grapheme_Cluster_Break=T @@ -541,13 +280,13 @@ */ /*** GENERATED CODE ***/ #define is_GCB_T_utf8(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x86 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] >= 0xA8 ) ? 3 : 0 ) \ - : ( 0x87 == ((U8*)s)[1] ) ? \ +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x86 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xA8 ) ? 3 : 0 ) \ + : ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ 3 \ : 0 ) \ -: ( ( ( 0xED == ((U8*)s)[0] ) && ( 0x9F == ((U8*)s)[1] ) ) && ( 0x8B <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xBB ) ) ? 3 : 0 ) +: ( ( ( 0xED == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0x8B <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xBB ) ) ? 3 : 0 ) /* GCB_V: Grapheme_Cluster_Break=V @@ -556,14 +295,14 @@ */ /*** GENERATED CODE ***/ #define is_GCB_V_utf8(s) \ -( ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] >= 0xA0 ) ? 3 : 0 ) \ - : ( ( 0x86 == ((U8*)s)[1] ) && ( ((U8*)s)[2] <= 0xA7 ) ) ? 3 : 0 ) \ -: ( 0xED == ((U8*)s)[0] ) ? \ - ( ( 0x9E == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] >= 0xB0 ) ? 3 : 0 ) \ - : ( ( 0x9F == ((U8*)s)[1] ) && ( ((U8*)s)[2] <= 0x86 ) ) ? 3 : 0 ) \ +( ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xA0 ) ? 3 : 0 ) \ + : ( ( 0x86 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xA7 ) ) ? 3 : 0 )\ +: ( 0xED == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x9E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xB0 ) ? 3 : 0 ) \ + : ( ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) ) ? 3 : 0 )\ : 0 ) /* @@ -573,49 +312,51 @@ */ /*** GENERATED CODE ***/ #define is_QUOTEMETA_high(s) \ -( ( 0xCD == ((U8*)s)[0] ) ? \ - ( ( 0x8F == ((U8*)s)[1] ) ? 2 : 0 ) \ -: ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? \ - ( ( 0x9F == ((U8*)s)[2] || 0xA0 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( 0x9A == ((U8*)s)[1] ) ? \ - ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( 0x9E == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] & 0xFE ) == 0xB4 ) ? 3 : 0 ) \ - : ( ( 0xA0 == ((U8*)s)[1] ) && ( 0x8B <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8E ) ) ? 3 : 0 )\ -: ( 0xE2 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] <= 0xBE ) ? 3 : 0 ) \ - : ( 0x81 == ((U8*)s)[1] ) ? \ - ( ( ( 0x81 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x93 ) || ( 0x95 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xAF ) ) ? 3 : 0 )\ - : ( 0x86 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] >= 0x90 ) ? 3 : 0 ) \ - : ( ( 0x87 <= ((U8*)s)[1] && ((U8*)s)[1] <= 0x90 ) || ( 0x94 <= ((U8*)s)[1] && ((U8*)s)[1] <= 0x9C ) || ( 0x9F <= ((U8*)s)[1] && ((U8*)s)[1] <= 0xAF ) || ( ((U8*)s)[1] & 0xFE ) == 0xB8 ) ?\ +( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x8F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xD8 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x9C == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[2]) || 0xA0 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 )\ + : ( 0x9A == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 ) \ + : ( 0x9E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xB4 ) ? 3 : 0 ) \ + : ( ( 0xA0 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8B <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x8E ) ) ? 3 : 0 )\ +: ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xBE ) ? 3 : 0 ) \ + : ( 0x81 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0x81 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x93 ) || ( 0x95 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xAF ) ) ? 3 : 0 )\ + : ( 0x86 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0x90 ) ? 3 : 0 ) \ + : ( ( 0x87 <= NATIVE_TO_LATIN1(((U8*)s)[1]) && NATIVE_TO_LATIN1(((U8*)s)[1]) <= 0x90 ) || ( 0x94 <= NATIVE_TO_LATIN1(((U8*)s)[1]) && NATIVE_TO_LATIN1(((U8*)s)[1]) <= 0x9C ) || ( 0x9F <= NATIVE_TO_LATIN1(((U8*)s)[1]) && NATIVE_TO_LATIN1(((U8*)s)[1]) <= 0xAF ) || ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xFE ) == 0xB8 ) ?\ 3 \ - : ( 0x91 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] <= 0x9F ) ? 3 : 0 ) \ - : ( 0x9D == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] <= 0xB5 ) ? 3 : 0 ) \ - : ( ( 0x9E == ((U8*)s)[1] ) && ( ((U8*)s)[2] >= 0x94 ) ) ? 3 : 0 ) \ -: ( 0xE3 == ((U8*)s)[0] ) ? \ - ( ( 0x80 == ((U8*)s)[1] ) ? \ - ( ( ( ((U8*)s)[2] <= 0x83 ) || ( 0x88 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xA0 ) || 0xB0 == ((U8*)s)[2] ) ? 3 : 0 )\ - : ( ( 0x85 == ((U8*)s)[1] ) && ( 0xA4 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ -: ( 0xEF == ((U8*)s)[0] ) ? \ - ( ( 0xB4 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] >= 0xBE ) ? 3 : 0 ) \ - : ( 0xB8 == ((U8*)s)[1] ) ? \ - ( ( ((U8*)s)[2] <= 0x8F ) ? 3 : 0 ) \ - : ( 0xB9 == ((U8*)s)[1] ) ? \ - ( ( 0x85 == ((U8*)s)[2] || 0x86 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( 0xBB == ((U8*)s)[1] ) ? \ - ( ( 0xBF == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( 0xBE == ((U8*)s)[1] ) ? \ - ( ( 0xA0 == ((U8*)s)[2] ) ? 3 : 0 ) \ - : ( ( 0xBF == ((U8*)s)[1] ) && ( 0xB0 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0xB8 ) ) ? 3 : 0 )\ -: ( 0xF0 == ((U8*)s)[0] ) ? \ - ( ( ( ( 0x9D == ((U8*)s)[1] ) && ( 0x85 == ((U8*)s)[2] ) ) && ( 0xB3 <= ((U8*)s)[3] && ((U8*)s)[3] <= 0xBA ) ) ? 4 : 0 )\ -: ( ( 0xF3 == ((U8*)s)[0] ) && ( 0xA0 == ((U8*)s)[1] ) ) ? 4 : 0 ) + : ( 0x91 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x9F ) ? 3 : 0 ) \ + : ( 0x9D == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xB5 ) ? 3 : 0 ) \ + : ( ( 0x9E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0x94 ) ) ? 3 : 0 )\ +: ( 0xE3 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x83 ) || ( 0x88 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xA0 ) || 0xB0 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 )\ + : ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xA4 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xB4 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) >= 0xBE ) ? 3 : 0 ) \ + : ( 0xB8 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x8F ) ? 3 : 0 ) \ + : ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[2]) || 0x86 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 )\ + : ( 0xBB == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 ) \ + : ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xA0 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 ) \ + : ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xB0 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0xB8 ) ) ? 3 : 0 )\ +: ( 0xF0 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( ( 0x9D == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB3 <= NATIVE_TO_LATIN1(((U8*)s)[3]) && NATIVE_TO_LATIN1(((U8*)s)[3]) <= 0xBA ) ) ? 4 : 0 )\ +: ( ( 0xF3 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0xA0 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) ? 4 : 0 ) /* MULTI_CHAR_FOLD: multi-char strings that are folded to by a single character @@ -625,211 +366,233 @@ */ /*** GENERATED CODE ***/ #define is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) \ -( ( 0x61 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCA == ((U8*)s)[1] ) && ( 0xBE == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x66 == ((U8*)s)[0] ) ? \ - ( ( 0x66 == ((U8*)s)[1] ) ? \ - ( ( 0x69 == ((U8*)s)[2] || 0x6C == ((U8*)s)[2] ) ? 3 : 2 ) \ - : ( 0x69 == ((U8*)s)[1] || 0x6C == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x68 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0xB1 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x69 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x87 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x6A == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8C == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x73 == ((U8*)s)[0] ) ? \ - ( ( 0x73 == ((U8*)s)[1] || 0x74 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x74 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x88 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x77 == ((U8*)s)[0] || 0x79 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8A == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xCA == ((U8*)s)[0] ) ? \ - ( ( ( 0xBC == ((U8*)s)[1] ) && ( 0x6E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xCE == ((U8*)s)[0] ) ? \ - ( ( ( ((U8*)s)[1] & 0xFD ) == 0xAC ) ? \ - ( ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB1 == ((U8*)s)[1] || 0xB7 == ((U8*)s)[1] ) ? \ - ( ( 0xCD == ((U8*)s)[2] ) ? \ - ( ( 0x82 == ((U8*)s)[3] ) ? 4 : 0 ) \ - : ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( ( ( 0xB9 == ((U8*)s)[1] ) && ( 0xCD == ((U8*)s)[2] ) ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xCF == ((U8*)s)[0] ) ? \ - ( ( 0x81 == ((U8*)s)[1] ) ? \ - ( ( ( 0xCC == ((U8*)s)[2] ) && ( 0x93 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0x85 == ((U8*)s)[1] ) ? \ - ( ( 0xCC == ((U8*)s)[2] ) ? \ - ( ( 0x93 == ((U8*)s)[3] ) ? 4 : 0 ) \ - : ( ( 0xCD == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0x89 == ((U8*)s)[1] ) ? \ - ( ( 0xCD == ((U8*)s)[2] ) ? \ - ( ( 0x82 == ((U8*)s)[3] ) ? 4 : 0 ) \ - : ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( ( ( 0x8E == ((U8*)s)[1] ) && ( 0xCE == ((U8*)s)[2] ) ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xD5 == ((U8*)s)[0] ) ? \ - ( ( 0xA5 == ((U8*)s)[1] ) ? \ - ( ( ( 0xD6 == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB4 == ((U8*)s)[1] ) ? \ - ( ( ( 0xD5 == ((U8*)s)[2] ) && ( ( ( ((U8*)s)[3] & 0xF7 ) == 0xA5 ) || ((U8*)s)[3] == 0xAB || ((U8*)s)[3] == 0xB6 ) ) ? 4 : 0 )\ - : ( ( ( 0xBE == ((U8*)s)[1] ) && ( 0xD5 == ((U8*)s)[2] ) ) && ( 0xB6 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0xBC == ((U8*)s)[1] ) ? \ - ( ( ( ( ( ((U8*)s)[2] & 0xD8 ) == 0x80 ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\ - : ( ( ( ( 0xBD == ((U8*)s)[1] ) && ( ( ( ((U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((U8*)s)[2] & 0xFB ) == 0xB0 ) || ((U8*)s)[2] == 0xBC ) ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\ - : 0 ) +( ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x74 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) /*** GENERATED CODE ***/ #define is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) \ -( ((e)-(s) > 3) ? \ - ( ( 0x61 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCA == ((U8*)s)[1] ) && ( 0xBE == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x66 == ((U8*)s)[0] ) ? \ - ( ( 0x66 == ((U8*)s)[1] ) ? \ - ( ( 0x69 == ((U8*)s)[2] || 0x6C == ((U8*)s)[2] ) ? 3 : 2 ) \ - : ( 0x69 == ((U8*)s)[1] || 0x6C == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x68 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0xB1 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x69 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x87 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x6A == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8C == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x73 == ((U8*)s)[0] ) ? \ - ( ( 0x73 == ((U8*)s)[1] || 0x74 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x74 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x88 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x77 == ((U8*)s)[0] || 0x79 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8A == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xCA == ((U8*)s)[0] ) ? \ - ( ( ( 0xBC == ((U8*)s)[1] ) && ( 0x6E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xCE == ((U8*)s)[0] ) ? \ - ( ( ( ((U8*)s)[1] & 0xFD ) == 0xAC ) ? \ - ( ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB1 == ((U8*)s)[1] || 0xB7 == ((U8*)s)[1] ) ? \ - ( ( 0xCD == ((U8*)s)[2] ) ? \ - ( ( 0x82 == ((U8*)s)[3] ) ? 4 : 0 ) \ - : ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( ( ( 0xB9 == ((U8*)s)[1] ) && ( 0xCD == ((U8*)s)[2] ) ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xCF == ((U8*)s)[0] ) ? \ - ( ( 0x81 == ((U8*)s)[1] ) ? \ - ( ( ( 0xCC == ((U8*)s)[2] ) && ( 0x93 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0x85 == ((U8*)s)[1] ) ? \ - ( ( 0xCC == ((U8*)s)[2] ) ? \ - ( ( 0x93 == ((U8*)s)[3] ) ? 4 : 0 ) \ - : ( ( 0xCD == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0x89 == ((U8*)s)[1] ) ? \ - ( ( 0xCD == ((U8*)s)[2] ) ? \ - ( ( 0x82 == ((U8*)s)[3] ) ? 4 : 0 ) \ - : ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( ( ( 0x8E == ((U8*)s)[1] ) && ( 0xCE == ((U8*)s)[2] ) ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xD5 == ((U8*)s)[0] ) ? \ - ( ( 0xA5 == ((U8*)s)[1] ) ? \ - ( ( ( 0xD6 == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB4 == ((U8*)s)[1] ) ? \ - ( ( ( 0xD5 == ((U8*)s)[2] ) && ( ( ( ((U8*)s)[3] & 0xF7 ) == 0xA5 ) || ((U8*)s)[3] == 0xAB || ((U8*)s)[3] == 0xB6 ) ) ? 4 : 0 )\ - : ( ( ( 0xBE == ((U8*)s)[1] ) && ( 0xD5 == ((U8*)s)[2] ) ) && ( 0xB6 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : 0 ) \ -: ((e)-(s) > 2) ? \ - ( ( 0x61 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCA == ((U8*)s)[1] ) && ( 0xBE == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x66 == ((U8*)s)[0] ) ? \ - ( ( 0x66 == ((U8*)s)[1] ) ? \ - ( ( 0x69 == ((U8*)s)[2] || 0x6C == ((U8*)s)[2] ) ? 3 : 2 ) \ - : ( 0x69 == ((U8*)s)[1] || 0x6C == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x68 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0xB1 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x69 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x87 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x6A == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8C == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x73 == ((U8*)s)[0] ) ? \ - ( ( 0x73 == ((U8*)s)[1] || 0x74 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x74 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x88 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x77 == ((U8*)s)[0] || 0x79 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8A == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( ( ( 0xCA == ((U8*)s)[0] ) && ( 0xBC == ((U8*)s)[1] ) ) && ( 0x6E == ((U8*)s)[2] ) ) ? 3 : 0 )\ -: ((e)-(s) > 1) ? \ - ( ( 0x66 == ((U8*)s)[0] ) ? \ - ( ( 0x66 == ((U8*)s)[1] || 0x69 == ((U8*)s)[1] || 0x6C == ((U8*)s)[1] ) ? 2 : 0 )\ - : ( ( 0x73 == ((U8*)s)[0] ) && ( 0x73 == ((U8*)s)[1] || 0x74 == ((U8*)s)[1] ) ) ? 2 : 0 )\ -: 0 ) - - -/*** GENERATED CODE ***/ -#define is_MULTI_CHAR_FOLD_utf8_safe(s,e) \ -( ((e)-(s) > 5) ? \ - ( ( 0x61 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCA == ((U8*)s)[1] ) && ( 0xBE == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x66 == ((U8*)s)[0] ) ? \ - ( ( 0x66 == ((U8*)s)[1] ) ? \ - ( ( 0x69 == ((U8*)s)[2] || 0x6C == ((U8*)s)[2] ) ? 3 : 2 ) \ - : ( 0x69 == ((U8*)s)[1] || 0x6C == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x68 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0xB1 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x69 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x87 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x6A == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8C == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x73 == ((U8*)s)[0] ) ? \ - ( ( 0x73 == ((U8*)s)[1] || 0x74 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( 0x74 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x88 == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0x77 == ((U8*)s)[0] || 0x79 == ((U8*)s)[0] ) ? \ - ( ( ( 0xCC == ((U8*)s)[1] ) && ( 0x8A == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xCA == ((U8*)s)[0] ) ? \ - ( ( ( 0xBC == ((U8*)s)[1] ) && ( 0x6E == ((U8*)s)[2] ) ) ? 3 : 0 ) \ - : ( 0xCE == ((U8*)s)[0] ) ? \ - ( ( ( ((U8*)s)[1] & 0xFD ) == 0xAC ) ? \ - ( ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB1 == ((U8*)s)[1] || 0xB7 == ((U8*)s)[1] ) ? \ - ( ( 0xCD == ((U8*)s)[2] ) ? \ - ( ( 0x82 == ((U8*)s)[3] ) ? \ - ( ( ( 0xCE == ((U8*)s)[4] ) && ( 0xB9 == ((U8*)s)[5] ) ) ? 6 : 4 )\ +( ( 0x74 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x88 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x77 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0x79 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8A == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x6E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xFD ) == 0xAC ) ? \ + ( ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xB7 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ?\ + ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? \ + ( ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[4]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[5]) ) ) ? 6 : 4 )\ : 0 ) \ - : ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB9 == ((U8*)s)[1] ) ? \ - ( ( 0xCC == ((U8*)s)[2] ) ? \ - ( ( 0x88 == ((U8*)s)[3] ) ? \ - ( ( 0xCC == ((U8*)s)[4] ) ? \ - ( ( ( ((U8*)s)[5] & 0xFE ) == 0x80 ) ? 6 : 0 ) \ - : ( ( 0xCD == ((U8*)s)[4] ) && ( 0x82 == ((U8*)s)[5] ) ) ? 6 : 0 )\ + : ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x88 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[5]) & 0xFE ) == 0x80 ) ? 6 : 0 )\ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[4]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[5]) ) ) ? 6 : 0 )\ : 0 ) \ - : ( ( 0xCD == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ : 0 ) \ - : ( 0xCF == ((U8*)s)[0] ) ? \ - ( ( 0x81 == ((U8*)s)[1] ) ? \ - ( ( ( 0xCC == ((U8*)s)[2] ) && ( 0x93 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0x85 == ((U8*)s)[1] ) ? \ - ( ( 0xCC == ((U8*)s)[2] ) ? \ - ( ( 0x88 == ((U8*)s)[3] ) ? \ - ( ( 0xCC == ((U8*)s)[4] ) ? \ - ( ( ( ((U8*)s)[5] & 0xFE ) == 0x80 ) ? 6 : 0 ) \ - : ( ( 0xCD == ((U8*)s)[4] ) && ( 0x82 == ((U8*)s)[5] ) ) ? 6 : 0 )\ - : ( 0x93 == ((U8*)s)[3] ) ? \ - ( ( 0xCC == ((U8*)s)[4] ) ? \ - ( ( ( ((U8*)s)[5] & 0xFE ) == 0x80 ) ? 6 : 4 ) \ - : ( ( 0xCD == ((U8*)s)[4] ) && ( 0x82 == ((U8*)s)[5] ) ) ? 6 : 4 )\ + : ( 0xCF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x81 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x93 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x88 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[5]) & 0xFE ) == 0x80 ) ? 6 : 0 )\ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[4]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[5]) ) ) ? 6 : 0 )\ + : ( 0x93 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[5]) & 0xFE ) == 0x80 ) ? 6 : 4 )\ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[4]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[5]) ) ) ? 6 : 4 )\ : 0 ) \ - : ( ( 0xCD == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0x89 == ((U8*)s)[1] ) ? \ - ( ( 0xCD == ((U8*)s)[2] ) ? \ - ( ( 0x82 == ((U8*)s)[3] ) ? \ - ( ( ( 0xCE == ((U8*)s)[4] ) && ( 0xB9 == ((U8*)s)[5] ) ) ? 6 : 4 )\ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0x89 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? \ + ( ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[4]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[5]) ) ) ? 6 : 4 )\ : 0 ) \ - : ( ( 0xCE == ((U8*)s)[2] ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( ( ( 0x8E == ((U8*)s)[1] ) && ( 0xCE == ((U8*)s)[2] ) ) && ( 0xB9 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xD5 == ((U8*)s)[0] ) ? \ - ( ( 0xA5 == ((U8*)s)[1] ) ? \ - ( ( ( 0xD6 == ((U8*)s)[2] ) && ( 0x82 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xB4 == ((U8*)s)[1] ) ? \ - ( ( ( 0xD5 == ((U8*)s)[2] ) && ( ( ( ((U8*)s)[3] & 0xF7 ) == 0xA5 ) || ((U8*)s)[3] == 0xAB || ((U8*)s)[3] == 0xB6 ) ) ? 4 : 0 )\ - : ( ( ( 0xBE == ((U8*)s)[1] ) && ( 0xD5 == ((U8*)s)[2] ) ) && ( 0xB6 == ((U8*)s)[3] ) ) ? 4 : 0 )\ - : ( 0xE1 == ((U8*)s)[0] ) ? \ - ( ( 0xBC == ((U8*)s)[1] ) ? \ - ( ( ( ( ( ((U8*)s)[2] & 0xD8 ) == 0x80 ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\ - : ( ( ( ( 0xBD == ((U8*)s)[1] ) && ( ( ( ((U8*)s)[2] & 0xF8 ) == 0xA0 ) || ( ( ((U8*)s)[2] & 0xFB ) == 0xB0 ) || ((U8*)s)[2] == 0xBC ) ) && ( 0xCE == ((U8*)s)[3] ) ) && ( 0xB9 == ((U8*)s)[4] ) ) ? 5 : 0 )\ + : ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( ( ( 0x8E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xA5 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xD6 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB4 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[3]) & 0xF7 ) == 0xA5 ) || NATIVE_TO_LATIN1(((U8*)s)[3]) == 0xAB || NATIVE_TO_LATIN1(((U8*)s)[3]) == 0xB6 ) ) ? 4 : 0 )\ + : ( ( ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB6 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xD8 ) == 0x80 ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ) ? 5 : 0 )\ + : ( ( ( ( 0xBD == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF8 ) == 0xA0 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFB ) == 0xB0 ) || NATIVE_TO_LATIN1(((U8*)s)[2]) == 0xBC ) ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ) ? 5 : 0 )\ + : 0 ) + + +/*** GENERATED CODE ***/ +#define is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e) \ +( ( 0x61 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[2]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 2 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x68 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x6A == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x74 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x74 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x88 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x77 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0x79 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8A == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x6E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xFD ) == 0xAC ) ? \ + ( ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xB7 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ?\ + ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? 4 : 0 ) \ + : ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( ( ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xCF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x81 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x93 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x93 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? 4 : 0 ) \ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0x89 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? 4 : 0 ) \ + : ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( ( ( 0x8E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xA5 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xD6 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB4 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[3]) & 0xF7 ) == 0xA5 ) || NATIVE_TO_LATIN1(((U8*)s)[3]) == 0xAB || NATIVE_TO_LATIN1(((U8*)s)[3]) == 0xB6 ) ) ? 4 : 0 )\ + : ( ( ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB6 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : 0 ) + + +/*** GENERATED CODE ***/ +#define is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e) \ +( ((e)-(s) > 2) ? \ + ( ( 0x61 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[2]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 2 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x68 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x6A == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x74 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x74 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x88 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x77 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0x79 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8A == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( ( ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( 0x6E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ((e)-(s) > 1) ? \ + ( ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x69 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x74 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) ? 2 : 0 )\ +: 0 ) + + +/*** GENERATED CODE ***/ +#define is_MULTI_CHAR_FOLD_utf8_safe_part4(s,e) \ +( ( 0x61 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[2]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 2 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x68 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x6A == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) ) + + +/*** GENERATED CODE ***/ +#define is_MULTI_CHAR_FOLD_utf8_safe_part5(s,e) \ +( ((e)-(s) > 4) ? \ + ( ( 0x61 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x66 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[2]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 2 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x6C == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x68 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x69 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x6A == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8C == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x73 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0x74 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ + : ( 0x74 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x88 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0x77 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0x79 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x8A == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0x6E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ + : ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xFD ) == 0xAC ) ? \ + ( ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB1 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xB7 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ?\ + ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? 4 : 0 ) \ + : ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( ( ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xCF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x81 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x93 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCC == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x93 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? 4 : 0 ) \ + : ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0x89 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( 0xCD == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? \ + ( ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ? 4 : 0 ) \ + : ( ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( ( ( 0x8E == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xA5 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xD6 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( 0x82 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xB4 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[3]) & 0xF7 ) == 0xA5 ) || NATIVE_TO_LATIN1(((U8*)s)[3]) == 0xAB || NATIVE_TO_LATIN1(((U8*)s)[3]) == 0xB6 ) ) ? 4 : 0 )\ + : ( ( ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( 0xD5 == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) && ( 0xB6 == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) ? 4 : 0 )\ + : ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xD8 ) == 0x80 ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ) ? 5 : 0 )\ + : ( ( ( ( 0xBD == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF8 ) == 0xA0 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFB ) == 0xB0 ) || NATIVE_TO_LATIN1(((U8*)s)[2]) == 0xBC ) ) && ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[3]) ) ) && ( 0xB9 == NATIVE_TO_LATIN1(((U8*)s)[4]) ) ) ? 5 : 0 )\ : 0 ) \ -: ((e)-(s) > 4) ? is_MULTI_CHAR_FOLD_utf8_safe_part0(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part1(s,e) ) +: ((e)-(s) > 3) ? is_MULTI_CHAR_FOLD_utf8_safe_part2(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part3(s,e) ) + + +/*** GENERATED CODE ***/ +#define is_MULTI_CHAR_FOLD_utf8_safe(s,e) \ +( ((e)-(s) > 5) ? is_MULTI_CHAR_FOLD_utf8_safe_part4(s,e) : is_MULTI_CHAR_FOLD_utf8_safe_part5(s,e) ) /* MULTI_CHAR_FOLD: multi-char strings that are folded to by a single character @@ -839,82 +602,159 @@ /*** GENERATED CODE ***/ #define is_MULTI_CHAR_FOLD_latin1_safe(s,e) \ ( ((e)-(s) > 2) ? \ - ( ( ( ((U8*)s)[0] & 0xDF ) == 0x46 ) ? \ - ( ( ( ((U8*)s)[1] & 0xDF ) == 0x46 ) ? \ - ( ( ( ( ((U8*)s)[2] & 0xDF ) == 0x49 ) || ( ( ((U8*)s)[2] & 0xDF ) == 0x4C ) ) ? 3 : 2 )\ - : ( ( ( ((U8*)s)[1] & 0xDF ) == 0x49 ) || ( ( ((U8*)s)[1] & 0xDF ) == 0x4C ) ) ? 2 : 0 )\ - : ( ( ( ((U8*)s)[0] & 0xDF ) == 0x53 ) && ( ( ( ((U8*)s)[1] & 0xDF ) == 0x53 ) || ( ( ((U8*)s)[1] & 0xDF ) == 0x54 ) ) ) ? 2 : 0 )\ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0xDF ) == 0x46 ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x46 ) ? \ + ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xDF ) == 0x49 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xDF ) == 0x4C ) ) ? 3 : 2 )\ + : ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x49 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x4C ) ) ? 2 : 0 )\ + : ( ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0xDF ) == 0x53 ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x53 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x54 ) ) ) ? 2 : 0 )\ : ((e)-(s) > 1) ? \ - ( ( ( ((U8*)s)[0] & 0xDF ) == 0x46 ) ? \ - ( ( ( ( ((U8*)s)[1] & 0xDF ) == 0x46 ) || ( ( ((U8*)s)[1] & 0xDF ) == 0x49 ) || ( ( ((U8*)s)[1] & 0xDF ) == 0x4C ) ) ? 2 : 0 )\ - : ( ( ( ((U8*)s)[0] & 0xDF ) == 0x53 ) && ( ( ( ((U8*)s)[1] & 0xDF ) == 0x53 ) || ( ( ((U8*)s)[1] & 0xDF ) == 0x54 ) ) ) ? 2 : 0 )\ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0xDF ) == 0x46 ) ? \ + ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x46 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x49 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x4C ) ) ? 2 : 0 )\ + : ( ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0xDF ) == 0x53 ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x53 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x54 ) ) ) ? 2 : 0 )\ : 0 ) /* - PATWS: pattern white space + FOLDS_TO_MULTI: characters that fold to multi-char strings - \p{PatWS} + \p{_Perl_Folds_To_Multi_Char} */ /*** GENERATED CODE ***/ -#define is_PATWS(s,is_utf8) \ -( ( ( 0x09 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x20 == ((U8*)s)[0] ) ? 1\ -: ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0x8E || ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ -: ( 0x85 == ((U8*)s)[0] ) ) +#define is_FOLDS_TO_MULTI_utf8(s) \ +( ( 0xC3 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x9F == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xC4 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0xC7 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( 0xB0 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x89 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x90 ) ? 2 : 0 ) \ +: ( 0xD6 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x87 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xBA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( 0x96 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x9A ) || 0x9E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ? 3 : 0 )\ + : ( 0xBD == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF9 ) == 0x90 ) ? 3 : 0 ) \ + : ( 0xBE == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? \ + ( ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xE0 ) == 0x80 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF0 ) == 0xA0 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFA ) == 0xB2 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF7 ) == 0xB4 ) ) ? 3 : 0 )\ + : ( ( 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xCA ) == 0x82 ) || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF7 ) == 0x84 ) || NATIVE_TO_LATIN1(((U8*)s)[2]) == 0xA4 || ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xF7 ) == 0xB4 ) ) ) ? 3 : 0 )\ +: ( ( ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0xAC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) || ( 0x93 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x97 ) ) ) ? 3 : 0 ) + +/* + PROBLEMATIC_LOCALE_FOLD: characters whose fold is problematic under locale + \p{_Perl_Problematic_Locale_Folds} +*/ /*** GENERATED CODE ***/ -#define is_PATWS_safe(s,e,is_utf8) \ -( ((e)-(s) > 2) ? \ - ( ( ( 0x09 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x20 == ((U8*)s)[0] ) ? 1\ - : ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0x8E || ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ - : ( 0x85 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 1) ? \ - ( ( ( 0x09 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x20 == ((U8*)s)[0] ) ? 1\ - : ( is_utf8 ) ? \ - ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ - : ( 0x85 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 0) ? \ - ( ( ( 0x09 <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x20 == ((U8*)s)[0] ) ? 1\ - : ( !( is_utf8 ) ) ? \ - ( 0x85 == ((U8*)s)[0] ) \ - : 0 ) \ -: 0 ) +#define is_PROBLEMATIC_LOCALE_FOLD_utf8(s) \ +( ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0x80 ) == 0x00 ) ? 1 \ +: ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0xFE ) == 0xC2 ) ? \ + 2 \ +: ( 0xC4 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0xC7 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( 0xB0 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x89 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xB8 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ +: ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x9C ) ? 2 : 0 ) \ +: ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xBA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( 0x96 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x9A ) || 0x9E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0x84 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xAA ) ) ? 3 : 0 )\ +: ( ( ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0xAC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) ) ? 3 : 0 ) + +/*** GENERATED CODE ***/ +#define is_PROBLEMATIC_LOCALE_FOLD_cp(cp) \ +( NATIVE_TO_UNI(cp) <= 0xFF || ( 0xFF < NATIVE_TO_UNI(cp) && \ +( 0x130 == NATIVE_TO_UNI(cp) || ( 0x130 < NATIVE_TO_UNI(cp) && \ +( 0x149 == NATIVE_TO_UNI(cp) || ( 0x149 < NATIVE_TO_UNI(cp) && \ +( 0x178 == NATIVE_TO_UNI(cp) || ( 0x178 < NATIVE_TO_UNI(cp) && \ +( 0x17F == NATIVE_TO_UNI(cp) || ( 0x17F < NATIVE_TO_UNI(cp) && \ +( 0x1F0 == NATIVE_TO_UNI(cp) || ( 0x1F0 < NATIVE_TO_UNI(cp) && \ +( 0x39C == NATIVE_TO_UNI(cp) || ( 0x39C < NATIVE_TO_UNI(cp) && \ +( 0x3BC == NATIVE_TO_UNI(cp) || ( 0x3BC < NATIVE_TO_UNI(cp) && \ +( ( 0x1E96 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0x1E9A ) || ( 0x1E9A < NATIVE_TO_UNI(cp) &&\ +( 0x1E9E == NATIVE_TO_UNI(cp) || ( 0x1E9E < NATIVE_TO_UNI(cp) && \ +( 0x212A == NATIVE_TO_UNI(cp) || ( 0x212A < NATIVE_TO_UNI(cp) && \ +( 0x212B == NATIVE_TO_UNI(cp) || ( 0xFB00 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0xFB06 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) + +/* + PROBLEMATIC_LOCALE_FOLDEDS_START: The first folded character of folds which are problematic under locale + \p{_Perl_Problematic_Locale_Foldeds_Start} +*/ /*** GENERATED CODE ***/ -#define is_PATWS_non_low(s,is_utf8) \ -( ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0x8E || ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ -: ( 0x85 == ((U8*)s)[0] ) ) +#define is_PROBLEMATIC_LOCALE_FOLDEDS_START_utf8(s) \ +( ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0x80 ) == 0x00 ) ? 1 \ +: ( ( NATIVE_TO_LATIN1(((U8*)s)[0]) & 0xFE ) == 0xC2 ) ? \ + 2 \ +: ( 0xC4 == NATIVE_TO_LATIN1(((U8*)s)[0]) || 0xC7 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ?\ + ( ( 0xB0 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xC5 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x89 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xB8 == NATIVE_TO_LATIN1(((U8*)s)[1]) || 0xBF == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 )\ +: ( 0xCA == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0xBC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ +: ( 0xCE == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( NATIVE_TO_LATIN1(((U8*)s)[1]) & 0xDF ) == 0x9C ) ? 2 : 0 ) \ +: ( 0xE1 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0xBA == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( 0x96 <= NATIVE_TO_LATIN1(((U8*)s)[2]) && NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x9A ) || 0x9E == NATIVE_TO_LATIN1(((U8*)s)[2]) ) ) ? 3 : 0 )\ +: ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( ( 0x84 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xAA ) ) ? 3 : 0 )\ +: ( ( ( 0xEF == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0xAC == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( NATIVE_TO_LATIN1(((U8*)s)[2]) <= 0x86 ) ) ? 3 : 0 ) + +/*** GENERATED CODE ***/ +#define is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp(cp) \ +( NATIVE_TO_UNI(cp) <= 0xFF || ( 0xFF < NATIVE_TO_UNI(cp) && \ +( 0x130 == NATIVE_TO_UNI(cp) || ( 0x130 < NATIVE_TO_UNI(cp) && \ +( 0x149 == NATIVE_TO_UNI(cp) || ( 0x149 < NATIVE_TO_UNI(cp) && \ +( 0x178 == NATIVE_TO_UNI(cp) || ( 0x178 < NATIVE_TO_UNI(cp) && \ +( 0x17F == NATIVE_TO_UNI(cp) || ( 0x17F < NATIVE_TO_UNI(cp) && \ +( 0x1F0 == NATIVE_TO_UNI(cp) || ( 0x1F0 < NATIVE_TO_UNI(cp) && \ +( 0x2BC == NATIVE_TO_UNI(cp) || ( 0x2BC < NATIVE_TO_UNI(cp) && \ +( 0x39C == NATIVE_TO_UNI(cp) || ( 0x39C < NATIVE_TO_UNI(cp) && \ +( 0x3BC == NATIVE_TO_UNI(cp) || ( 0x3BC < NATIVE_TO_UNI(cp) && \ +( ( 0x1E96 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0x1E9A ) || ( 0x1E9A < NATIVE_TO_UNI(cp) &&\ +( 0x1E9E == NATIVE_TO_UNI(cp) || ( 0x1E9E < NATIVE_TO_UNI(cp) && \ +( 0x212A == NATIVE_TO_UNI(cp) || ( 0x212A < NATIVE_TO_UNI(cp) && \ +( 0x212B == NATIVE_TO_UNI(cp) || ( 0xFB00 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0xFB06 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) + +/* + PATWS: pattern white space + + \p{PatWS} +*/ +/*** GENERATED CODE ***/ +#define is_PATWS_safe(s,e,is_utf8) \ +( ((e) > (s)) ? \ + ( ( ( 0x09 <= NATIVE_TO_LATIN1(((U8*)s)[0]) && NATIVE_TO_LATIN1(((U8*)s)[0]) <= 0x0D ) || 0x20 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? 1\ + : (! is_utf8 ) ? \ + ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) \ + : (((e) - (s)) >= UTF8SKIP(s)) ? \ + ( ( 0xC2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ + : ( ( ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0x8E || ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ + : 0 ) \ +: 0 ) /*** GENERATED CODE ***/ #define is_PATWS_non_low_safe(s,e,is_utf8) \ -( ((e)-(s) > 2) ? \ - ( ( is_utf8 ) ? \ - ( ( 0xC2 == ((U8*)s)[0] ) ? \ - ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \ - : ( ( ( 0xE2 == ((U8*)s)[0] ) && ( 0x80 == ((U8*)s)[1] ) ) && ( ( ((U8*)s)[2] & 0xFE ) == 0x8E || ( ((U8*)s)[2] & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ - : ( 0x85 == ((U8*)s)[0] ) ) \ -: ((e)-(s) > 1) ? \ - ( ( is_utf8 ) ? \ - ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \ - : ( 0x85 == ((U8*)s)[0] ) ) \ -: ( ((e)-(s) > 0) && ( !( is_utf8 ) ) ) ? ( 0x85 == ((U8*)s)[0] ) : 0 ) +( ((e) > (s)) ? \ + ( (! is_utf8) ? \ + ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) \ + : (((e) - (s)) >= UTF8SKIP(s)) ? \ + ( ( 0xC2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) ? \ + ( ( 0x85 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ? 2 : 0 ) \ + : ( ( ( 0xE2 == NATIVE_TO_LATIN1(((U8*)s)[0]) ) && ( 0x80 == NATIVE_TO_LATIN1(((U8*)s)[1]) ) ) && ( ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0x8E || ( NATIVE_TO_LATIN1(((U8*)s)[2]) & 0xFE ) == 0xA8 ) ) ? 3 : 0 )\ + : 0 ) \ +: 0 ) /*** GENERATED CODE ***/ #define is_PATWS_cp(cp) \ -( ( 0x09 <= cp && cp <= 0x0D ) || ( 0x0D < cp && \ -( 0x20 == cp || ( 0x20 < cp && \ -( 0x85 == cp || ( 0x85 < cp && \ -( 0x200E == cp || ( 0x200E < cp && \ -( 0x200F == cp || ( 0x200F < cp && \ -( 0x2028 == cp || 0x2029 == cp ) ) ) ) ) ) ) ) ) ) ) +( ( 0x09 <= NATIVE_TO_UNI(cp) && NATIVE_TO_UNI(cp) <= 0x0D ) || ( 0x0D < NATIVE_TO_UNI(cp) &&\ +( 0x20 == NATIVE_TO_UNI(cp) || ( 0x20 < NATIVE_TO_UNI(cp) && \ +( 0x85 == NATIVE_TO_UNI(cp) || ( 0x85 < NATIVE_TO_UNI(cp) && \ +( 0x200E == NATIVE_TO_UNI(cp) || ( 0x200E < NATIVE_TO_UNI(cp) && \ +( 0x200F == NATIVE_TO_UNI(cp) || ( 0x200F < NATIVE_TO_UNI(cp) && \ +( 0x2028 == NATIVE_TO_UNI(cp) || 0x2029 == NATIVE_TO_UNI(cp) ) ) ) ) ) ) ) ) ) ) ) #endif /* H_REGCHARCLASS */ diff --git a/Master/tlpkg/tlperl/lib/CORE/regcomp.h b/Master/tlpkg/tlperl/lib/CORE/regcomp.h index 21d2e1e3519..3bb1a533f69 100644 --- a/Master/tlpkg/tlperl/lib/CORE/regcomp.h +++ b/Master/tlpkg/tlperl/lib/CORE/regcomp.h @@ -26,13 +26,6 @@ #define RE_TRACK_PATTERN_OFFSETS #endif -/* Unless the next line is uncommented it is illegal to combine lazy - matching with possessive matching. Frankly it doesn't make much sense - to allow it as X*?+ matches nothing, X+?+ matches a single char only, - and X{min,max}?+ matches min times only. - */ -/* #define REG_ALLOW_MINMOD_SUSPEND */ - /* * The "internal use only" fields in regexp.h are present to pass info from * compile to execute that permits the execute phase to run lots faster on @@ -132,13 +125,28 @@ * * See regexp.h for flags used externally to the regexp engine */ +#define RXp_INTFLAGS(rx) ((rx)->intflags) +#define RX_INTFLAGS(prog) RXp_INTFLAGS(ReANY(prog)) + #define PREGf_SKIP 0x00000001 #define PREGf_IMPLICIT 0x00000002 /* Converted .* to ^.* */ #define PREGf_NAUGHTY 0x00000004 /* how exponential is this pattern? */ #define PREGf_VERBARG_SEEN 0x00000008 #define PREGf_CUTGROUP_SEEN 0x00000010 #define PREGf_USE_RE_EVAL 0x00000020 /* compiled with "use re 'eval'" */ +/* these used to be extflags, but are now intflags */ +#define PREGf_NOSCAN 0x00000040 +#define PREGf_CANY_SEEN 0x00000080 +#define PREGf_GPOS_SEEN 0x00000100 +#define PREGf_GPOS_FLOAT 0x00000200 + +#define PREGf_ANCH_BOL 0x00000400 +#define PREGf_ANCH_MBOL 0x00000800 +#define PREGf_ANCH_SBOL 0x00001000 +#define PREGf_ANCH_GPOS 0x00002000 +#define PREGf_ANCH (PREGf_ANCH_SBOL | PREGf_ANCH_GPOS | \ + PREGf_ANCH_MBOL | PREGf_ANCH_BOL ) /* this is where the old regcomp.h started */ @@ -177,27 +185,73 @@ struct regnode_2 { }; -#define ANYOF_BITMAP_SIZE 32 /* 256 b/(8 b/B) */ +#define ANYOF_BITMAP_SIZE (256 / 8) /* 8 bits/Byte */ + +/* Note that these form structs which are supersets of the next smaller one, by + * appending fields. Alignment problems can occur if one of those optional + * fields requires stricter alignment than the base struct. And formal + * parameters that can really be two or more of the structs should be + * declared as the smallest one it could be. See commit message for + * 7dcac5f6a5195002b55c935ee1d67f67e1df280b. Regnode allocation is done + * without regard to alignment, and changing it to would also require changing + * the code that inserts and deletes regnodes. The basic single-argument + * regnode has a U32, which is what reganode() allocates as a unit. Therefore + * no field can require stricter alignment than U32. */ /* also used by trie */ struct regnode_charclass { U8 flags; U8 type; U16 next_off; - U32 arg1; /* used as ptr in S_regclass */ + U32 arg1; char bitmap[ANYOF_BITMAP_SIZE]; /* only compile-time */ }; /* has runtime (locale) \d, \w, ..., [:posix:] classes */ struct regnode_charclass_class { - U8 flags; /* ANYOF_CLASS bit must go here */ + U8 flags; /* ANYOF_POSIXL bit must go here */ U8 type; U16 next_off; - U32 arg1; /* used as ptr in S_regclass */ + U32 arg1; char bitmap[ANYOF_BITMAP_SIZE]; /* both compile-time */ U32 classflags; /* and run-time */ }; +/* A synthetic start class (SSC); is a regnode_charclass_posixl_fold, plus an + * extra SV*, used only during its construction and which is not used by + * regexec.c. Note that the 'next_off' field is unused, as the SSC stands + * alone, so there is never a next node. Also, there is no alignment issue, + * becase these are declared or allocated as a complete unit so the compiler + * takes care of alignment. This is unlike the other regnodes which are + * allocated in terms of multiples of a single-argument regnode. SSC nodes can + * have a pointer field because there is no alignment issue, and because it is + * set to NULL after construction, before any cloning of the pattern */ +struct regnode_ssc { + U8 flags; /* ANYOF_POSIXL bit must go here */ + U8 type; + U16 next_off; + U32 arg1; + char bitmap[ANYOF_BITMAP_SIZE]; /* both compile-time */ + U32 classflags; /* and run-time */ + + /* Auxiliary, only used during construction; NULL afterwards: list of code + * points matched */ + SV* invlist; +}; + +/* We take advantage of 'next_off' not otherwise being used in the SSC by + * actually using it: by setting it to 1. This allows us to test and + * distinguish between an SSC and other ANYOF node types, as 'next_off' cannot + * otherwise be 1, because it is the offset to the next regnode expressed in + * units of regnodes. Since an ANYOF node contains extra fields, it adds up + * to 12 regnode units on 32-bit systems, (hence the minimum this can be (if + * not 0) is 11 there. Even if things get tightly packed on a 64-bit system, + * it still would be more than 1. */ +#define set_ANYOF_SYNTHETIC(n) STMT_START{ OP(n) = ANYOF; \ + NEXT_OFF(n) = 1; \ + } STMT_END +#define is_ANYOF_SYNTHETIC(n) (OP(n) == ANYOF && NEXT_OFF(n) == 1) + /* XXX fix this description. Impose a limit of REG_INFTY on various pattern matching operations to limit stack growth and to avoid "infinite" recursions. @@ -288,75 +342,79 @@ struct regnode_charclass_class { #define REG_MAGIC 0234 -#define SIZE_ONLY (RExC_emit == &PL_regdummy) +#define SIZE_ONLY (RExC_emit == (regnode *) & RExC_emit_dummy) +#define PASS1 SIZE_ONLY +#define PASS2 (! SIZE_ONLY) /* If the bitmap doesn't fully represent what this ANYOF node can match, the * ARG is set to this special value (since 0, 1, ... are legal, but will never * reach this high). */ #define ANYOF_NONBITMAP_EMPTY ((U32) -1) -/* The information used to be stored as as combination of the ANYOF_UTF8 and - * ANYOF_NONBITMAP_NON_UTF8 bits in the flags field, but was moved out of there - * to free up a bit for other uses. This tries to hide the change from - * existing code as much as possible. Now, the data structure that goes in ARG - * is not allocated unless it is needed, and that is what is used to determine - * if there is something outside the bitmap. The code now assumes that if - * that structure exists, that any UTF-8 encoded string should be tried against - * it, but a non-UTF8-encoded string will be tried only if the - * ANYOF_NONBITMAP_NON_UTF8 bit is also set. */ -#define ANYOF_NONBITMAP(node) (ARG(node) != ANYOF_NONBITMAP_EMPTY) - -/* Flags for node->flags of ANYOF. These are in short supply, but there is one - * currently available. If more than this are needed, the ANYOF_LOCALE and - * ANYOF_CLASS bits could be shared, making a space penalty for all locale nodes. - * Also, the UNICODE_ALL bit could be freed up by resorting to creating a swash - * containing everything above 255. This introduces a performance penalty. - * Better would be to split it off into a separate node, which actually would - * improve performance a bit by allowing regexec.c to test for a UTF-8 - * character being above 255 without having to call a function nor calculate - * its code point value. However, this solution might need to have a second - * node type, ANYOF_SYNTHETIC_ABOVE_LATIN1_ALL */ - -#define ANYOF_LOCALE 0x01 /* /l modifier */ +/* Flags for node->flags of ANYOF. These are in short supply, with none + * currently available. The ABOVE_LATIN1_ALL bit could be freed up + * by resorting to creating a swash containing everything above 255. This + * introduces a performance penalty. An option that wouldn't slow things down + * would be to split one of the two LOC flags out into a separate + * node, like what was done with ANYOF_NON_UTF8_NON_ASCII_ALL in commit + * 34fdef848b1687b91892ba55e9e0c3430e0770f6 (but which was reverted because it + * wasn't the best option available at the time), and using a LOC flag is + * probably better than that commit anyway. But it could be reinstated if we + * need a bit. The LOC flags are only for /l nodes; the reverted commit was + * only for /d, so there are no combinatorial issues. The LOC flag to use is + * probably the POSIXL one. + * Several flags are not used in synthetic start class (SSC) nodes, so could be + * shared should new flags be needed for SSCs, like ANYOF_EMPTY_STRING now. */ + +/* regexec.c is expecting this to be in the low bit */ +#define ANYOF_INVERT 0x01 + +/* For the SSC node only, which cannot be inverted, so is shared with that bit. + * This means "Does this SSC match an empty string?" This is used only during + * regex compilation. */ +#define ANYOF_EMPTY_STRING ANYOF_INVERT + +/* Are there things that will match only if the target string is encoded in + * UTF-8? (This is not set if ANYOF_AOVE_LATIN1_ALL is set) */ +#define ANYOF_UTF8 0x02 /* The fold is calculated and stored in the bitmap where possible at compile * time. However under locale, the actual folding varies depending on * what the locale is at the time of execution, so it has to be deferred until * then */ -#define ANYOF_LOC_FOLD 0x02 +#define ANYOF_LOC_FOLD 0x04 -#define ANYOF_INVERT 0x04 - -/* Set if this is a struct regnode_charclass_class vs a regnode_charclass. This +/* Set if this is a regnode_charclass_posixl vs a regnode_charclass. This * is used for runtime \d, \w, [:posix:], ..., which are used only in locale * and the optimizer's synthetic start class. Non-locale \d, etc are resolved - * at compile-time. Could be shared with ANYOF_LOCALE, forcing all locale - * nodes to be large */ -#define ANYOF_CLASS 0x08 -#define ANYOF_LARGE ANYOF_CLASS /* Same; name retained for back compat */ + * at compile-time */ +#define ANYOF_POSIXL 0x08 +#define ANYOF_CLASS ANYOF_POSIXL +#define ANYOF_LARGE ANYOF_POSIXL -/* Unused: 0x10. When using, be sure to change ANYOF_FLAGS_ALL below */ +/* Should we raise a warning if matching against an above-Unicode code point? + * */ +#define ANYOF_WARN_SUPER 0x10 /* Can match something outside the bitmap that isn't in utf8 */ #define ANYOF_NONBITMAP_NON_UTF8 0x20 /* Matches every code point 0x100 and above*/ -#define ANYOF_UNICODE_ALL 0x40 +#define ANYOF_ABOVE_LATIN1_ALL 0x40 +#define ANYOF_UNICODE_ALL ANYOF_ABOVE_LATIN1_ALL /* Match all Latin1 characters that aren't ASCII when the target string is not * in utf8. */ -#define ANYOF_NON_UTF8_LATIN1_ALL 0x80 +#define ANYOF_NON_UTF8_NON_ASCII_ALL 0x80 -#define ANYOF_FLAGS_ALL (0xff & ~0x10) +#define ANYOF_FLAGS_ALL (0xff) -/* These are the flags that ANYOF_INVERT being set or not doesn't affect - * whether they are operative or not. e.g., the node still has LOCALE - * regardless of being inverted; whereas ANYOF_UNICODE_ALL means something - * different if inverted */ -#define INVERSION_UNAFFECTED_FLAGS (ANYOF_LOCALE \ - |ANYOF_LOC_FOLD \ - |ANYOF_CLASS \ - |ANYOF_NONBITMAP_NON_UTF8) +#define ANYOF_LOCALE_FLAGS (ANYOF_LOC_FOLD | ANYOF_POSIXL) + +/* These are the flags that apply to both regular ANYOF nodes and synthetic + * start class nodes during construction of the SSC. During finalization of + * the SSC, other of the flags could be added to it */ +#define ANYOF_COMMON_FLAGS (ANYOF_WARN_SUPER|ANYOF_UTF8) /* Character classes for node->classflags of ANYOF */ /* Should be synchronized with a table in regprop() */ @@ -408,19 +466,21 @@ struct regnode_charclass_class { # error Problem with handy.h _HIGHEST_REGCOMP_DOT_H_SYNC #define #endif -#define ANYOF_MAX (ANYOF_VERTWS) /* So upper loop limit is written: - * '< ANYOF_MAX' - * Hence doesn't include VERTWS, as that - * is a pseudo class */ -#if (ANYOF_MAX > 32) /* Must fit in 32-bit word */ +#define ANYOF_POSIXL_MAX (ANYOF_VERTWS) /* So upper loop limit is written: + * '< ANYOF_MAX' + * Hence doesn't include VERTWS, as that + * is a pseudo class */ +#define ANYOF_MAX ANYOF_POSIXL_MAX + +#if (ANYOF_POSIXL_MAX > 32) /* Must fit in 32-bit word */ # error Problem with handy.h _CC_foo #defines #endif -#define ANYOF_HORIZWS ((ANYOF_MAX)+2) /* = (ANYOF_NVERTWS + 1) */ -#define ANYOF_NHORIZWS ((ANYOF_MAX)+3) +#define ANYOF_HORIZWS ((ANYOF_POSIXL_MAX)+2) /* = (ANYOF_NVERTWS + 1) */ +#define ANYOF_NHORIZWS ((ANYOF_POSIXL_MAX)+3) -#define ANYOF_UNIPROP ((ANYOF_MAX)+4) /* Used to indicate a Unicode - property: \p{} or \P{} */ +#define ANYOF_UNIPROP ((ANYOF_POSIXL_MAX)+4) /* Used to indicate a Unicode + property: \p{} or \P{} */ /* Backward source code compatibility. */ @@ -434,22 +494,51 @@ struct regnode_charclass_class { /* Utility macros for the bitmap and classes of ANYOF */ #define ANYOF_SIZE (sizeof(struct regnode_charclass)) -#define ANYOF_CLASS_SIZE (sizeof(struct regnode_charclass_class)) +#define ANYOF_POSIXL_SIZE (sizeof(regnode_charclass_posixl)) +#define ANYOF_CLASS_SIZE ANYOF_POSIXL_SIZE #define ANYOF_FLAGS(p) ((p)->flags) #define ANYOF_BIT(c) (1 << ((c) & 7)) -#define ANYOF_CLASS_SET(p, c) (((struct regnode_charclass_class*) (p))->classflags |= (1U << (c))) -#define ANYOF_CLASS_CLEAR(p, c) (((struct regnode_charclass_class*) (p))->classflags &= ~ (1U <<(c))) -#define ANYOF_CLASS_TEST(p, c) (((struct regnode_charclass_class*) (p))->classflags & (1U << (c))) +#define ANYOF_POSIXL_SET(p, c) (((regnode_charclass_posixl*) (p))->classflags |= (1U << (c))) +#define ANYOF_CLASS_SET(p, c) ANYOF_POSIXL_SET((p), (c)) -#define ANYOF_CLASS_ZERO(ret) STMT_START { ((struct regnode_charclass_class*) (ret))->classflags = 0; } STMT_END +#define ANYOF_POSIXL_CLEAR(p, c) (((regnode_charclass_posixl*) (p))->classflags &= ~ (1U <<(c))) +#define ANYOF_CLASS_CLEAR(p, c) ANYOF_POSIXL_CLEAR((p), (c)) + +#define ANYOF_POSIXL_TEST(p, c) (((regnode_charclass_posixl*) (p))->classflags & (1U << (c))) +#define ANYOF_CLASS_TEST(p, c) ANYOF_POSIXL_TEST((p), (c)) + +#define ANYOF_POSIXL_ZERO(ret) STMT_START { ((regnode_charclass_posixl*) (ret))->classflags = 0; } STMT_END +#define ANYOF_CLASS_ZERO(ret) ANYOF_POSIXL_ZERO(ret) /* Shifts a bit to get, eg. 0x4000_0000, then subtracts 1 to get 0x3FFF_FFFF */ -#define ANYOF_CLASS_SETALL(ret) STMT_START { ((struct regnode_charclass_class*) (ret))->classflags = ((1U << ((ANYOF_MAX) - 1))) - 1; } STMT_END +#define ANYOF_POSIXL_SETALL(ret) STMT_START { ((regnode_charclass_posixl*) (ret))->classflags = ((1U << ((ANYOF_POSIXL_MAX) - 1))) - 1; } STMT_END +#define ANYOF_CLASS_SETALL(ret) ANYOF_POSIXL_SETALL(ret) + +#define ANYOF_POSIXL_TEST_ANY_SET(p) \ + ((ANYOF_FLAGS(p) & ANYOF_POSIXL) \ + && (((regnode_charclass_posixl*)(p))->classflags)) +#define ANYOF_CLASS_TEST_ANY_SET(p) ANYOF_POSIXL_TEST_ANY_SET(p) -#define ANYOF_CLASS_OR(source, dest) STMT_START { (dest)->classflags |= source->classflags ; } STMT_END +/* Since an SSC always has this field, we don't have to test for that; nor do + * we want to because the bit isn't set for SSC during its construction */ +#define ANYOF_POSIXL_SSC_TEST_ANY_SET(p) \ + cBOOL(((regnode_ssc*)(p))->classflags) +#define ANYOF_POSIXL_SSC_TEST_ALL_SET(p) /* Are all bits set? */ \ + (((regnode_ssc*) (p))->classflags \ + == ((1U << ((ANYOF_POSIXL_MAX) - 1))) - 1) + +#define ANYOF_POSIXL_TEST_ALL_SET(p) \ + ((ANYOF_FLAGS(p) & ANYOF_POSIXL) \ + && ((regnode_charclass_posixl*) (p))->classflags \ + == ((1U << ((ANYOF_POSIXL_MAX) - 1))) - 1) + +#define ANYOF_POSIXL_OR(source, dest) STMT_START { (dest)->classflags |= (source)->classflags ; } STMT_END +#define ANYOF_CLASS_OR(source, dest) ANYOF_POSIXL_OR((source), (dest)) + +#define ANYOF_POSIXL_AND(source, dest) STMT_START { (dest)->classflags &= (source)->classflags ; } STMT_END #define ANYOF_BITMAP_ZERO(ret) Zero(((struct regnode_charclass*)(ret))->bitmap, ANYOF_BITMAP_SIZE, char) #define ANYOF_BITMAP(p) (((struct regnode_charclass*)(p))->bitmap) @@ -467,14 +556,8 @@ struct regnode_charclass_class { memEQ (ANYOF_BITMAP(p), "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", ANYOF_BITMAP_SIZE) #define ANYOF_SKIP ((ANYOF_SIZE - 1)/sizeof(regnode)) -#define ANYOF_CLASS_SKIP ((ANYOF_CLASS_SIZE - 1)/sizeof(regnode)) - -#define ANYOF_CLASS_TEST_ANY_SET(p) \ - ((ANYOF_FLAGS(p) & ANYOF_CLASS) \ - && (((struct regnode_charclass_class*)(p))->classflags)) -/*#define ANYOF_CLASS_ADD_SKIP (ANYOF_CLASS_SKIP - ANYOF_SKIP) - * */ - +#define ANYOF_POSIXL_SKIP ((ANYOF_POSIXL_SIZE - 1)/sizeof(regnode)) +#define ANYOF_CLASS_SKIP ANYOF_POSIXL_SKIP /* * Utility definitions. @@ -487,18 +570,20 @@ struct regnode_charclass_class { #define EXTRA_SIZE(guy) ((sizeof(guy)-1)/sizeof(struct regnode)) -#define REG_SEEN_ZERO_LEN 0x00000001 -#define REG_SEEN_LOOKBEHIND 0x00000002 -#define REG_SEEN_GPOS 0x00000004 +#define REG_ZERO_LEN_SEEN 0x00000001 +#define REG_LOOKBEHIND_SEEN 0x00000002 +#define REG_GPOS_SEEN 0x00000004 /* spare */ -#define REG_SEEN_CANY 0x00000010 -#define REG_SEEN_SANY REG_SEEN_CANY /* src bckwrd cmpt */ -#define REG_SEEN_RECURSE 0x00000020 -#define REG_TOP_LEVEL_BRANCHES 0x00000040 -#define REG_SEEN_VERBARG 0x00000080 -#define REG_SEEN_CUTGROUP 0x00000100 -#define REG_SEEN_RUN_ON_COMMENT 0x00000200 -#define REG_SEEN_EXACTF_SHARP_S 0x00000400 +#define REG_CANY_SEEN 0x00000010 +#define REG_RECURSE_SEEN 0x00000020 +#define REG_TOP_LEVEL_BRANCHES_SEEN 0x00000040 +#define REG_VERBARG_SEEN 0x00000080 +#define REG_CUTGROUP_SEEN 0x00000100 +#define REG_RUN_ON_COMMENT_SEEN 0x00000200 +#define REG_UNFOLDED_MULTI_SEEN 0x00000400 +#define REG_GOSTART_SEEN 0x00000800 +#define REG_UNBOUNDED_QUANTIFIER_SEEN 0x00001000 + START_EXTERN_C diff --git a/Master/tlpkg/tlperl/lib/CORE/regexp.h b/Master/tlpkg/tlperl/lib/CORE/regexp.h index 31fb879c66a..db7ae8be016 100644 --- a/Master/tlpkg/tlperl/lib/CORE/regexp.h +++ b/Master/tlpkg/tlperl/lib/CORE/regexp.h @@ -36,13 +36,14 @@ struct regexp_engine; struct regexp; struct reg_substr_datum { - I32 min_offset; - I32 max_offset; + SSize_t min_offset; /* min pos (in chars) that substr must appear */ + SSize_t max_offset /* max pos (in chars) that substr must appear */; SV *substr; /* non-utf8 variant */ SV *utf8_substr; /* utf8 variant */ - I32 end_shift; + SSize_t end_shift; /* how many fixed chars must end the string */ }; struct reg_substr_data { + U8 check_ix; /* index into data[] of check substr */ struct reg_substr_datum data[3]; /* Actual array */ }; @@ -55,15 +56,15 @@ struct reg_substr_data { /* offsets within a string of a particular /(.)/ capture */ typedef struct regexp_paren_pair { - I32 start; - I32 end; + SSize_t start; + SSize_t end; /* 'start_tmp' records a new opening position before the matching end * has been found, so that the old start and end values are still * valid, e.g. * "abc" =~ /(.(?{print "[$1]"}))+/ *outputs [][a][b] * This field is not part of the API. */ - I32 start_tmp; + SSize_t start_tmp; } regexp_paren_pair; #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C) @@ -104,9 +105,9 @@ struct reg_code_block { /* Information about the match that the perl core uses to */ \ /* manage things */ \ U32 extflags; /* Flags used both externally and internally */ \ - I32 minlen; /* mininum possible number of chars in string to match */\ - I32 minlenret; /* mininum possible number of chars in $& */ \ - U32 gofs; /* chars left of pos that we search from */ \ + SSize_t minlen; /* mininum possible number of chars in string to match */\ + SSize_t minlenret; /* mininum possible number of chars in $& */ \ + STRLEN gofs; /* chars left of pos that we search from */ \ /* substring data about strings that must appear in the */ \ /* final match, used for optimisations */ \ struct reg_substr_data *substrs; \ @@ -124,10 +125,11 @@ struct reg_code_block { /* saved or original string so \digit works forever. */ \ char *subbeg; \ SV_SAVED_COPY /* If non-NULL, SV which is COW from original */\ - I32 sublen; /* Length of string pointed by subbeg */ \ - I32 suboffset; /* byte offset of subbeg from logical start of str */ \ - I32 subcoffset; /* suboffset equiv, but in chars (for @-/@+) */ \ + SSize_t sublen; /* Length of string pointed by subbeg */ \ + SSize_t suboffset; /* byte offset of subbeg from logical start of str */ \ + SSize_t subcoffset; /* suboffset equiv, but in chars (for @-/@+) */ \ /* Information about the match that isn't often used */ \ + SSize_t maxlen; /* mininum possible number of chars in string to match */\ /* offset from wrapped to the start of precomp */ \ PERL_BITFIELD32 pre_prefix:4; \ /* original flags used to compile the pattern, may differ */ \ @@ -146,7 +148,7 @@ typedef struct regexp { typedef struct re_scream_pos_data_s { char **scream_olds; /* match pos */ - I32 *scream_pos; /* Internal iterator of scream. */ + SSize_t *scream_pos; /* Internal iterator of scream. */ } re_scream_pos_data; /* regexp_engine structure. This is the dispatch table for regexes. @@ -155,10 +157,15 @@ typedef struct re_scream_pos_data_s typedef struct regexp_engine { REGEXP* (*comp) (pTHX_ SV * const pattern, U32 flags); I32 (*exec) (pTHX_ REGEXP * const rx, char* stringarg, char* strend, - char* strbeg, I32 minend, SV* screamer, + char* strbeg, SSize_t minend, SV* sv, void* data, U32 flags); - char* (*intuit) (pTHX_ REGEXP * const rx, SV *sv, char *strpos, - char *strend, const U32 flags, + char* (*intuit) (pTHX_ + REGEXP * const rx, + SV *sv, + const char * const strbeg, + char *strpos, + char *strend, + const U32 flags, re_scream_pos_data *data); SV* (*checkstr) (pTHX_ REGEXP * const rx); void (*free) (pTHX_ REGEXP * const rx); @@ -225,7 +232,7 @@ typedef struct regexp_engine { =for apidoc Am|REGEXP *|SvRX|SV *sv -Convenience macro to get the REGEXP from a SV. This is approximately +Convenience macro to get the REGEXP from a SV. This is approximately equivalent to the following snippet: if (SvMAGICAL(sv)) @@ -379,29 +386,25 @@ get_regex_charset_name(const U32 flags, STRLEN* const lenp) } } -/* Anchor and GPOS related stuff */ -#define RXf_ANCH_BOL (1<<(RXf_BASE_SHIFT+0)) -#define RXf_ANCH_MBOL (1<<(RXf_BASE_SHIFT+1)) -#define RXf_ANCH_SBOL (1<<(RXf_BASE_SHIFT+2)) -#define RXf_ANCH_GPOS (1<<(RXf_BASE_SHIFT+3)) -#define RXf_GPOS_SEEN (1<<(RXf_BASE_SHIFT+4)) -#define RXf_GPOS_FLOAT (1<<(RXf_BASE_SHIFT+5)) -/* two bits here */ -#define RXf_ANCH (RXf_ANCH_BOL|RXf_ANCH_MBOL|RXf_ANCH_GPOS|RXf_ANCH_SBOL) -#define RXf_GPOS_CHECK (RXf_GPOS_SEEN|RXf_ANCH_GPOS) -#define RXf_ANCH_SINGLE (RXf_ANCH_SBOL|RXf_ANCH_GPOS) +/* Do we have some sort of anchor? */ +#define RXf_IS_ANCHORED (1<<(RXf_BASE_SHIFT+0)) +#define RXf_UNUSED1 (1<<(RXf_BASE_SHIFT+1)) +#define RXf_UNUSED2 (1<<(RXf_BASE_SHIFT+2)) +#define RXf_UNUSED3 (1<<(RXf_BASE_SHIFT+3)) +#define RXf_UNUSED4 (1<<(RXf_BASE_SHIFT+4)) +#define RXf_UNUSED5 (1<<(RXf_BASE_SHIFT+5)) /* What we have seen */ #define RXf_NO_INPLACE_SUBST (1<<(RXf_BASE_SHIFT+6)) #define RXf_EVAL_SEEN (1<<(RXf_BASE_SHIFT+7)) -#define RXf_CANY_SEEN (1<<(RXf_BASE_SHIFT+8)) +#define RXf_UNUSED8 (1<<(RXf_BASE_SHIFT+8)) /* Special */ -#define RXf_NOSCAN (1<<(RXf_BASE_SHIFT+9)) +#define RXf_UNBOUNDED_QUANTIFIER_SEEN (1<<(RXf_BASE_SHIFT+9)) #define RXf_CHECK_ALL (1<<(RXf_BASE_SHIFT+10)) /* UTF8 related */ -#define RXf_MATCH_UTF8 (1<<(RXf_BASE_SHIFT+11)) +#define RXf_MATCH_UTF8 (1<<(RXf_BASE_SHIFT+11)) /* $1 etc are utf8 */ /* Intuit related */ #define RXf_USE_INTUIT_NOML (1<<(RXf_BASE_SHIFT+12)) @@ -412,8 +415,7 @@ get_regex_charset_name(const U32 flags, STRLEN* const lenp) /* Copy and tainted info */ #define RXf_COPY_DONE (1<<(RXf_BASE_SHIFT+16)) -/* during execution: pattern temporarily tainted by executing locale ops; - * post-execution: $1 et al are tainted */ +/* post-execution: $1 et al are tainted */ #define RXf_TAINTED_SEEN (1<<(RXf_BASE_SHIFT+17)) /* this pattern was tainted during compilation */ #define RXf_TAINTED (1<<(RXf_BASE_SHIFT+18)) @@ -433,7 +435,7 @@ get_regex_charset_name(const U32 flags, STRLEN* const lenp) * */ -#if NO_TAINT_SUPPORT +#ifdef NO_TAINT_SUPPORT # define RX_ISTAINTED(prog) 0 # define RX_TAINT_on(prog) NOOP # define RXp_MATCH_TAINTED(prog) 0 @@ -496,6 +498,10 @@ get_regex_charset_name(const U32 flags, STRLEN* const lenp) #define RX_LASTPAREN(prog) (ReANY(prog)->lastparen) #define RX_LASTCLOSEPAREN(prog) (ReANY(prog)->lastcloseparen) #define RX_SAVED_COPY(prog) (ReANY(prog)->saved_copy) +/* last match was zero-length */ +#define RX_ZERO_LEN(prog) \ + (RX_OFFS(prog)[0].start + (SSize_t)RX_GOFS(prog) \ + == RX_OFFS(prog)[0].end) #endif /* PLUGGABLE_RE_EXTENSION */ @@ -523,22 +529,30 @@ get_regex_charset_name(const U32 flags, STRLEN* const lenp) #define RX_MATCH_UTF8_on(prog) (RX_EXTFLAGS(prog) |= RXf_MATCH_UTF8) #define RX_MATCH_UTF8_off(prog) (RX_EXTFLAGS(prog) &= ~RXf_MATCH_UTF8) #define RX_MATCH_UTF8_set(prog, t) ((t) \ - ? (RX_MATCH_UTF8_on(prog), (PL_reg_match_utf8 = 1)) \ - : (RX_MATCH_UTF8_off(prog), (PL_reg_match_utf8 = 0))) + ? RX_MATCH_UTF8_on(prog) \ + : RX_MATCH_UTF8_off(prog)) /* Whether the pattern stored at RX_WRAPPED is in UTF-8 */ #define RX_UTF8(prog) SvUTF8(prog) -#define REXEC_COPY_STR 0x01 /* Need to copy the string. */ -#define REXEC_CHECKED 0x02 /* check_substr already checked. */ -#define REXEC_SCREAM 0x04 /* use scream table. */ -#define REXEC_IGNOREPOS 0x08 /* \G matches at start. */ -#define REXEC_NOT_FIRST 0x10 /* This is another iteration of //g. */ - /* under REXEC_COPY_STR, it's ok for the - * engine (modulo PL_sawamperand etc) - * to skip copying ... */ -#define REXEC_COPY_SKIP_PRE 0x20 /* ...the $` part of the string, or */ -#define REXEC_COPY_SKIP_POST 0x40 /* ...the $' part of the string */ + +/* bits in flags arg of Perl_regexec_flags() */ + +#define REXEC_COPY_STR 0x01 /* Need to copy the string for captures. */ +#define REXEC_CHECKED 0x02 /* re_intuit_start() already called. */ +#define REXEC_SCREAM 0x04 /* currently unused. */ +#define REXEC_IGNOREPOS 0x08 /* use stringarg, not pos(), for \G match */ +#define REXEC_NOT_FIRST 0x10 /* This is another iteration of //g: + no need to copy string again */ + + /* under REXEC_COPY_STR, it's ok for the + engine (modulo PL_sawamperand etc) + to skip copying: ... */ +#define REXEC_COPY_SKIP_PRE 0x20 /* ...the $` part of the string, or */ +#define REXEC_COPY_SKIP_POST 0x40 /* ...the $' part of the string */ +#define REXEC_FAIL_ON_UNDERFLOW 0x80 /* fail the match if $& would start before + the start pos (so s/.\G// would fail + on second iteration */ #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) # define ReREFCNT_inc(re) \ @@ -571,17 +585,64 @@ get_regex_charset_name(const U32 flags, STRLEN* const lenp) #define FBMrf_MULTILINE 1 +struct regmatch_state; +struct regmatch_slab; + +/* like regmatch_info_aux, but contains extra fields only needed if the + * pattern contains (?{}). If used, is snuck into the second slot in the + * regmatch_state stack at the start of execution */ + +typedef struct { + regexp *rex; + PMOP *curpm; /* saved PL_curpm */ +#ifdef PERL_ANY_COW + SV *saved_copy; /* saved saved_copy field from rex */ +#endif + char *subbeg; /* saved subbeg field from rex */ + STRLEN sublen; /* saved sublen field from rex */ + STRLEN suboffset; /* saved suboffset field from rex */ + STRLEN subcoffset; /* saved subcoffset field from rex */ + MAGIC *pos_magic; /* pos() magic attached to $_ */ + SSize_t pos; /* the original value of pos() in pos_magic */ + U8 pos_flags; /* flags to be restored; currently only MGf_BYTES*/ +} regmatch_info_aux_eval; + + +/* fields that logically live in regmatch_info, but which need cleaning + * up on croak(), and so are instead are snuck into the first slot in + * the regmatch_state stack at the start of execution */ + +typedef struct { + regmatch_info_aux_eval *info_aux_eval; + struct regmatch_state *old_regmatch_state; /* saved PL_regmatch_state */ + struct regmatch_slab *old_regmatch_slab; /* saved PL_regmatch_slab */ + char *poscache; /* S-L cache of fail positions of WHILEMs */ +} regmatch_info_aux; + + /* some basic information about the current match that is created by - * Perl_regexec_flags and then passed to regtry(), regmatch() etc */ + * Perl_regexec_flags and then passed to regtry(), regmatch() etc. + * It is allocated as a local var on the stack, so nothing should be + * stored in it that needs preserving or clearing up on croak(). + * For that, see the aux_info and aux_info_eval members of the + * regmatch_state union. */ typedef struct { - REGEXP *prog; - char *bol; - char *till; - SV *sv; - char *ganch; - char *cutpoint; - bool is_utf8_pat; + REGEXP *prog; /* the regex being executed */ + const char * strbeg; /* real start of string */ + char *strend; /* one byte beyond last char of match string */ + char *till; /* matches shorter than this fail (see minlen arg) */ + SV *sv; /* the SV string currently being matched */ + char *ganch; /* position of \G anchor */ + char *cutpoint; /* (*COMMIT) position (if any) */ + regmatch_info_aux *info_aux; /* extra fields that need cleanup */ + regmatch_info_aux_eval *info_aux_eval; /* extra saved state for (?{}) */ + I32 poscache_maxiter; /* how many whilems todo before S-L cache kicks in */ + I32 poscache_iter; /* current countdown from _maxiter to zero */ + STRLEN poscache_size; /* size of regmatch_info_aux.poscache */ + bool intuit; /* re_intuit_start() is the top-level caller */ + bool is_utf8_pat; /* regex is utf8 */ + bool is_utf8_target; /* string being matched is utf8 */ bool warned; /* we have issued a recursion warning; no need for more */ } regmatch_info; @@ -600,6 +661,29 @@ typedef struct regmatch_state { union { + /* the 'info_aux' and 'info_aux_eval' union members are cuckoos in + * the nest. They aren't saved backtrack state; rather they + * represent one or two extra chunks of data that need allocating + * at the start of a match. These fields would logically live in + * the regmatch_info struct, except that is allocated on the + * C stack, and these fields are all things that require cleanup + * after a croak(), when the stack is lost. + * As a convenience, we just use the first 1 or 2 regmatch_state + * slots to store this info, as we will be allocating a slab of + * these anyway. Otherwise we'd have to malloc and then free them, + * or allocate them on the save stack (where they will get + * realloced if the save stack grows). + * info_aux contains the extra fields that are always needed; + * info_aux_eval contains extra fields that only needed if + * the pattern contains code blocks + * We split them into two separate structs to avoid increasing + * the size of the union. + */ + + regmatch_info_aux info_aux; + + regmatch_info_aux_eval info_aux_eval; + /* this is a fake union member that matches the first element * of each member that needs to store positive backtrack * information */ @@ -654,7 +738,6 @@ typedef struct regmatch_state { struct regmatch_state *prev_eval; struct regmatch_state *prev_curlyx; REGEXP *prev_rex; - bool saved_utf8_pat; /* saved copy of is_utf8_pat */ CHECKPOINT cp; /* remember current savestack indexes */ CHECKPOINT lastcp; U32 close_paren; /* which close bracket is our end */ @@ -755,50 +838,7 @@ typedef struct regmatch_slab { struct regmatch_slab *prev, *next; } regmatch_slab; -#define PL_bostr PL_reg_state.re_state_bostr -#define PL_regeol PL_reg_state.re_state_regeol -#define PL_reg_match_utf8 PL_reg_state.re_state_reg_match_utf8 -#define PL_reg_magic PL_reg_state.re_state_reg_magic -#define PL_reg_oldpos PL_reg_state.re_state_reg_oldpos -#define PL_reg_oldcurpm PL_reg_state.re_state_reg_oldcurpm -#define PL_reg_curpm PL_reg_state.re_state_reg_curpm -#define PL_reg_oldsaved PL_reg_state.re_state_reg_oldsaved -#define PL_reg_oldsavedlen PL_reg_state.re_state_reg_oldsavedlen -#define PL_reg_oldsavedoffset PL_reg_state.re_state_reg_oldsavedoffset -#define PL_reg_oldsavedcoffset PL_reg_state.re_state_reg_oldsavedcoffset -#define PL_reg_maxiter PL_reg_state.re_state_reg_maxiter -#define PL_reg_leftiter PL_reg_state.re_state_reg_leftiter -#define PL_reg_poscache PL_reg_state.re_state_reg_poscache -#define PL_reg_poscache_size PL_reg_state.re_state_reg_poscache_size -#define PL_reg_starttry PL_reg_state.re_state_reg_starttry -#define PL_nrs PL_reg_state.re_state_nrs - -struct re_save_state { - bool re_state_eval_setup_done; /* from regexec.c */ - bool re_state_reg_match_utf8; /* from regexec.c */ - /* Space for U8 */ - I32 re_state_reg_oldpos; /* from regexec.c */ - I32 re_state_reg_maxiter; /* max wait until caching pos */ - I32 re_state_reg_leftiter; /* wait until caching pos */ - char *re_state_bostr; - char *re_state_regeol; /* End of input, for $ check. */ - MAGIC *re_state_reg_magic; /* from regexec.c */ - PMOP *re_state_reg_oldcurpm; /* from regexec.c */ - PMOP *re_state_reg_curpm; /* from regexec.c */ - char *re_state_reg_oldsaved; /* old saved substr during match */ - STRLEN re_state_reg_oldsavedlen; /* old length of saved substr during match */ - STRLEN re_state_reg_oldsavedoffset; /* old offset of saved substr during match */ - STRLEN re_state_reg_oldsavedcoffset;/* old coffset of saved substr during match */ - STRLEN re_state_reg_poscache_size; /* size of pos cache of WHILEM */ - char *re_state_reg_poscache; /* cache of pos of WHILEM */ - char *re_state_reg_starttry; /* from regexec.c */ -#ifdef PERL_ANY_COW - SV *re_state_nrs; /* was placeholder: unused since 5.8.0 (5.7.2 patch #12027 for bug ID 20010815.012). Used to save rx->saved_copy */ -#endif -}; -#define SAVESTACK_ALLOC_FOR_RE_SAVE_STATE \ - (1 + ((sizeof(struct re_save_state) - 1) / sizeof(*PL_savestack))) /* * Local variables: diff --git a/Master/tlpkg/tlperl/lib/CORE/regnodes.h b/Master/tlpkg/tlperl/lib/CORE/regnodes.h index 0caf86dd556..43ec681967c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/regnodes.h +++ b/Master/tlpkg/tlperl/lib/CORE/regnodes.h @@ -6,8 +6,8 @@ /* Regops and State definitions */ -#define REGNODE_MAX 95 -#define REGMATCH_STATE_MAX 135 +#define REGNODE_MAX 93 +#define REGMATCH_STATE_MAX 133 #define END 0 /* 0000 End of program. */ #define SUCCEED 1 /* 0x01 Return from a subroutine, basically. */ @@ -18,93 +18,91 @@ #define EOL 6 /* 0x06 Match "" at end of line. */ #define MEOL 7 /* 0x07 Same, assuming multiline. */ #define SEOL 8 /* 0x08 Same, assuming singleline. */ -#define BOUND 9 /* 0x09 Match "" at any word boundary using native charset semantics for non-utf8 */ +#define BOUND 9 /* 0x09 Match "" at any word boundary using native charset rules for non-utf8 */ #define BOUNDL 10 /* 0x0a Match "" at any locale word boundary */ -#define BOUNDU 11 /* 0x0b Match "" at any word boundary using Unicode semantics */ -#define BOUNDA 12 /* 0x0c Match "" at any word boundary using ASCII semantics */ -#define NBOUND 13 /* 0x0d Match "" at any word non-boundary using native charset semantics for non-utf8 */ +#define BOUNDU 11 /* 0x0b Match "" at any word boundary using Unicode rules */ +#define BOUNDA 12 /* 0x0c Match "" at any word boundary using ASCII rules */ +#define NBOUND 13 /* 0x0d Match "" at any word non-boundary using native charset rules for non-utf8 */ #define NBOUNDL 14 /* 0x0e Match "" at any locale word non-boundary */ -#define NBOUNDU 15 /* 0x0f Match "" at any word non-boundary using Unicode semantics */ -#define NBOUNDA 16 /* 0x10 Match "" at any word non-boundary using ASCII semantics */ +#define NBOUNDU 15 /* 0x0f Match "" at any word non-boundary using Unicode rules */ +#define NBOUNDA 16 /* 0x10 Match "" at any word non-boundary using ASCII rules */ #define GPOS 17 /* 0x11 Matches where last m//g left off. */ #define REG_ANY 18 /* 0x12 Match any one character (except newline). */ #define SANY 19 /* 0x13 Match any one character. */ #define CANY 20 /* 0x14 Match any one byte. */ #define ANYOF 21 /* 0x15 Match character in (or not in) this class, single char match only */ -#define ANYOF_WARN_SUPER 22 /* 0x16 Match character in (or not in) this class, warn (if enabled) upon matching a char above Unicode max; */ -#define ANYOF_SYNTHETIC 23 /* 0x17 Synthetic start class */ -#define POSIXD 24 /* 0x18 Some [[:class:]] under /d; the FLAGS field gives which one */ -#define POSIXL 25 /* 0x19 Some [[:class:]] under /l; the FLAGS field gives which one */ -#define POSIXU 26 /* 0x1a Some [[:class:]] under /u; the FLAGS field gives which one */ -#define POSIXA 27 /* 0x1b Some [[:class:]] under /a; the FLAGS field gives which one */ -#define NPOSIXD 28 /* 0x1c complement of POSIXD, [[:^class:]] */ -#define NPOSIXL 29 /* 0x1d complement of POSIXL, [[:^class:]] */ -#define NPOSIXU 30 /* 0x1e complement of POSIXU, [[:^class:]] */ -#define NPOSIXA 31 /* 0x1f complement of POSIXA, [[:^class:]] */ -#define CLUMP 32 /* 0x20 Match any extended grapheme cluster sequence */ -#define BRANCH 33 /* 0x21 Match this alternative, or the next... */ -#define BACK 34 /* 0x22 Match "", "next" ptr points backward. */ -#define EXACT 35 /* 0x23 Match this string (preceded by length). */ -#define EXACTF 36 /* 0x24 Match this non-UTF-8 string (not guaranteed to be folded) using /id rules (w/len). */ -#define EXACTFL 37 /* 0x25 Match this string (not guaranteed to be folded) using /il rules (w/len). */ -#define EXACTFU 38 /* 0x26 Match this string (folded iff in UTF-8, length in folding doesn't change if not in UTF-8) using /iu rules (w/len). */ -#define EXACTFA 39 /* 0x27 Match this string (not guaranteed to be folded) using /iaa rules (w/len). */ -#define EXACTFU_SS 40 /* 0x28 Match this string (folded iff in UTF-8, length in folding may change even if not in UTF-8) using /iu rules (w/len). */ -#define EXACTFU_TRICKYFOLD 41 /* 0x29 Match this folded UTF-8 string using /iu rules */ -#define NOTHING 42 /* 0x2a Match empty string. */ -#define TAIL 43 /* 0x2b Match empty string. Can jump here from outside. */ -#define STAR 44 /* 0x2c Match this (simple) thing 0 or more times. */ -#define PLUS 45 /* 0x2d Match this (simple) thing 1 or more times. */ -#define CURLY 46 /* 0x2e Match this simple thing {n,m} times. */ -#define CURLYN 47 /* 0x2f Capture next-after-this simple thing */ -#define CURLYM 48 /* 0x30 Capture this medium-complex thing {n,m} times. */ -#define CURLYX 49 /* 0x31 Match this complex thing {n,m} times. */ -#define WHILEM 50 /* 0x32 Do curly processing and see if rest matches. */ -#define OPEN 51 /* 0x33 Mark this point in input as start of #n. */ -#define CLOSE 52 /* 0x34 Analogous to OPEN. */ -#define REF 53 /* 0x35 Match some already matched string */ -#define REFF 54 /* 0x36 Match already matched string, folded using native charset semantics for non-utf8 */ -#define REFFL 55 /* 0x37 Match already matched string, folded in loc. */ -#define REFFU 56 /* 0x38 Match already matched string, folded using unicode semantics for non-utf8 */ -#define REFFA 57 /* 0x39 Match already matched string, folded using unicode semantics for non-utf8, no mixing ASCII, non-ASCII */ -#define NREF 58 /* 0x3a Match some already matched string */ -#define NREFF 59 /* 0x3b Match already matched string, folded using native charset semantics for non-utf8 */ -#define NREFFL 60 /* 0x3c Match already matched string, folded in loc. */ -#define NREFFU 61 /* 0x3d Match already matched string, folded using unicode semantics for non-utf8 */ -#define NREFFA 62 /* 0x3e Match already matched string, folded using unicode semantics for non-utf8, no mixing ASCII, non-ASCII */ -#define IFMATCH 63 /* 0x3f Succeeds if the following matches. */ -#define UNLESSM 64 /* 0x40 Fails if the following matches. */ -#define SUSPEND 65 /* 0x41 "Independent" sub-RE. */ -#define IFTHEN 66 /* 0x42 Switch, should be preceded by switcher. */ -#define GROUPP 67 /* 0x43 Whether the group matched. */ -#define LONGJMP 68 /* 0x44 Jump far away. */ -#define BRANCHJ 69 /* 0x45 BRANCH with long offset. */ -#define EVAL 70 /* 0x46 Execute some Perl code. */ -#define MINMOD 71 /* 0x47 Next operator is not greedy. */ -#define LOGICAL 72 /* 0x48 Next opcode should set the flag only. */ -#define RENUM 73 /* 0x49 Group with independently numbered parens. */ -#define TRIE 74 /* 0x4a Match many EXACT(F[ALU]?)? at once. flags==type */ -#define TRIEC 75 /* 0x4b Same as TRIE, but with embedded charclass data */ -#define AHOCORASICK 76 /* 0x4c Aho Corasick stclass. flags==type */ -#define AHOCORASICKC 77 /* 0x4d Same as AHOCORASICK, but with embedded charclass data */ -#define GOSUB 78 /* 0x4e recurse to paren arg1 at (signed) ofs arg2 */ -#define GOSTART 79 /* 0x4f recurse to start of pattern */ -#define NGROUPP 80 /* 0x50 Whether the group matched. */ -#define INSUBP 81 /* 0x51 Whether we are in a specific recurse. */ -#define DEFINEP 82 /* 0x52 Never execute directly. */ -#define ENDLIKE 83 /* 0x53 Used only for the type field of verbs */ -#define OPFAIL 84 /* 0x54 Same as (?!) */ -#define ACCEPT 85 /* 0x55 Accepts the current matched string. */ -#define VERB 86 /* 0x56 Used only for the type field of verbs */ -#define PRUNE 87 /* 0x57 Pattern fails at this startpoint if no-backtracking through this */ -#define MARKPOINT 88 /* 0x58 Push the current location for rollback by cut. */ -#define SKIP 89 /* 0x59 On failure skip forward (to the mark) before retrying */ -#define COMMIT 90 /* 0x5a Pattern fails outright if backtracking through this */ -#define CUTGROUP 91 /* 0x5b On failure go to the next alternation in the group */ -#define KEEPS 92 /* 0x5c $& begins here. */ -#define LNBREAK 93 /* 0x5d generic newline pattern */ -#define OPTIMIZED 94 /* 0x5e Placeholder for dump. */ -#define PSEUDO 95 /* 0x5f Pseudo opcode for internal use. */ +#define POSIXD 22 /* 0x16 Some [[:class:]] under /d; the FLAGS field gives which one */ +#define POSIXL 23 /* 0x17 Some [[:class:]] under /l; the FLAGS field gives which one */ +#define POSIXU 24 /* 0x18 Some [[:class:]] under /u; the FLAGS field gives which one */ +#define POSIXA 25 /* 0x19 Some [[:class:]] under /a; the FLAGS field gives which one */ +#define NPOSIXD 26 /* 0x1a complement of POSIXD, [[:^class:]] */ +#define NPOSIXL 27 /* 0x1b complement of POSIXL, [[:^class:]] */ +#define NPOSIXU 28 /* 0x1c complement of POSIXU, [[:^class:]] */ +#define NPOSIXA 29 /* 0x1d complement of POSIXA, [[:^class:]] */ +#define CLUMP 30 /* 0x1e Match any extended grapheme cluster sequence */ +#define BRANCH 31 /* 0x1f Match this alternative, or the next... */ +#define BACK 32 /* 0x20 Match "", "next" ptr points backward. */ +#define EXACT 33 /* 0x21 Match this string (preceded by length). */ +#define EXACTF 34 /* 0x22 Match this non-UTF-8 string (not guaranteed to be folded) using /id rules (w/len). */ +#define EXACTFL 35 /* 0x23 Match this string (not guaranteed to be folded) using /il rules (w/len). */ +#define EXACTFU 36 /* 0x24 Match this string (folded iff in UTF-8, length in folding doesn't change if not in UTF-8) using /iu rules (w/len). */ +#define EXACTFA 37 /* 0x25 Match this string (not guaranteed to be folded) using /iaa rules (w/len). */ +#define EXACTFU_SS 38 /* 0x26 Match this string (folded iff in UTF-8, length in folding may change even if not in UTF-8) using /iu rules (w/len). */ +#define EXACTFA_NO_TRIE 39 /* 0x27 Match this string (which is not trie-able; not guaranteed to be folded) using /iaa rules (w/len). */ +#define NOTHING 40 /* 0x28 Match empty string. */ +#define TAIL 41 /* 0x29 Match empty string. Can jump here from outside. */ +#define STAR 42 /* 0x2a Match this (simple) thing 0 or more times. */ +#define PLUS 43 /* 0x2b Match this (simple) thing 1 or more times. */ +#define CURLY 44 /* 0x2c Match this simple thing {n,m} times. */ +#define CURLYN 45 /* 0x2d Capture next-after-this simple thing */ +#define CURLYM 46 /* 0x2e Capture this medium-complex thing {n,m} times. */ +#define CURLYX 47 /* 0x2f Match this complex thing {n,m} times. */ +#define WHILEM 48 /* 0x30 Do curly processing and see if rest matches. */ +#define OPEN 49 /* 0x31 Mark this point in input as start of #n. */ +#define CLOSE 50 /* 0x32 Analogous to OPEN. */ +#define REF 51 /* 0x33 Match some already matched string */ +#define REFF 52 /* 0x34 Match already matched string, folded using native charset rules for non-utf8 */ +#define REFFL 53 /* 0x35 Match already matched string, folded in loc. */ +#define REFFU 54 /* 0x36 Match already matched string, folded using unicode rules for non-utf8 */ +#define REFFA 55 /* 0x37 Match already matched string, folded using unicode rules for non-utf8, no mixing ASCII, non-ASCII */ +#define NREF 56 /* 0x38 Match some already matched string */ +#define NREFF 57 /* 0x39 Match already matched string, folded using native charset rules for non-utf8 */ +#define NREFFL 58 /* 0x3a Match already matched string, folded in loc. */ +#define NREFFU 59 /* 0x3b Match already matched string, folded using unicode rules for non-utf8 */ +#define NREFFA 60 /* 0x3c Match already matched string, folded using unicode rules for non-utf8, no mixing ASCII, non-ASCII */ +#define IFMATCH 61 /* 0x3d Succeeds if the following matches. */ +#define UNLESSM 62 /* 0x3e Fails if the following matches. */ +#define SUSPEND 63 /* 0x3f "Independent" sub-RE. */ +#define IFTHEN 64 /* 0x40 Switch, should be preceded by switcher. */ +#define GROUPP 65 /* 0x41 Whether the group matched. */ +#define LONGJMP 66 /* 0x42 Jump far away. */ +#define BRANCHJ 67 /* 0x43 BRANCH with long offset. */ +#define EVAL 68 /* 0x44 Execute some Perl code. */ +#define MINMOD 69 /* 0x45 Next operator is not greedy. */ +#define LOGICAL 70 /* 0x46 Next opcode should set the flag only. */ +#define RENUM 71 /* 0x47 Group with independently numbered parens. */ +#define TRIE 72 /* 0x48 Match many EXACT(F[ALU]?)? at once. flags==type */ +#define TRIEC 73 /* 0x49 Same as TRIE, but with embedded charclass data */ +#define AHOCORASICK 74 /* 0x4a Aho Corasick stclass. flags==type */ +#define AHOCORASICKC 75 /* 0x4b Same as AHOCORASICK, but with embedded charclass data */ +#define GOSUB 76 /* 0x4c recurse to paren arg1 at (signed) ofs arg2 */ +#define GOSTART 77 /* 0x4d recurse to start of pattern */ +#define NGROUPP 78 /* 0x4e Whether the group matched. */ +#define INSUBP 79 /* 0x4f Whether we are in a specific recurse. */ +#define DEFINEP 80 /* 0x50 Never execute directly. */ +#define ENDLIKE 81 /* 0x51 Used only for the type field of verbs */ +#define OPFAIL 82 /* 0x52 Same as (?!) */ +#define ACCEPT 83 /* 0x53 Accepts the current matched string. */ +#define VERB 84 /* 0x54 Used only for the type field of verbs */ +#define PRUNE 85 /* 0x55 Pattern fails at this startpoint if no-backtracking through this */ +#define MARKPOINT 86 /* 0x56 Push the current location for rollback by cut. */ +#define SKIP 87 /* 0x57 On failure skip forward (to the mark) before retrying */ +#define COMMIT 88 /* 0x58 Pattern fails outright if backtracking through this */ +#define CUTGROUP 89 /* 0x59 On failure go to the next alternation in the group */ +#define KEEPS 90 /* 0x5a $& begins here. */ +#define LNBREAK 91 /* 0x5b generic newline pattern */ +#define OPTIMIZED 92 /* 0x5c Placeholder for dump. */ +#define PSEUDO 93 /* 0x5d Pseudo opcode for internal use. */ /* ------------ States ------------- */ #define TRIE_next (REGNODE_MAX + 1) /* state for TRIE */ #define TRIE_next_fail (REGNODE_MAX + 2) /* state for TRIE */ @@ -175,8 +173,6 @@ EXTCONST U8 PL_regkind[] = { REG_ANY, /* SANY */ REG_ANY, /* CANY */ ANYOF, /* ANYOF */ - ANYOF, /* ANYOF_WARN_SUPER */ - ANYOF, /* ANYOF_SYNTHETIC */ POSIXD, /* POSIXD */ POSIXD, /* POSIXL */ POSIXD, /* POSIXU */ @@ -194,7 +190,7 @@ EXTCONST U8 PL_regkind[] = { EXACT, /* EXACTFU */ EXACT, /* EXACTFA */ EXACT, /* EXACTFU_SS */ - EXACT, /* EXACTFU_TRICKYFOLD */ + EXACT, /* EXACTFA_NO_TRIE */ NOTHING, /* NOTHING */ NOTHING, /* TAIL */ STAR, /* STAR */ @@ -319,8 +315,6 @@ static const U8 regarglen[] = { 0, /* SANY */ 0, /* CANY */ 0, /* ANYOF */ - 0, /* ANYOF_WARN_SUPER */ - 0, /* ANYOF_SYNTHETIC */ 0, /* POSIXD */ 0, /* POSIXL */ 0, /* POSIXU */ @@ -338,7 +332,7 @@ static const U8 regarglen[] = { 0, /* EXACTFU */ 0, /* EXACTFA */ 0, /* EXACTFU_SS */ - 0, /* EXACTFU_TRICKYFOLD */ + 0, /* EXACTFA_NO_TRIE */ 0, /* NOTHING */ 0, /* TAIL */ 0, /* STAR */ @@ -420,8 +414,6 @@ static const char reg_off_by_arg[] = { 0, /* SANY */ 0, /* CANY */ 0, /* ANYOF */ - 0, /* ANYOF_WARN_SUPER */ - 0, /* ANYOF_SYNTHETIC */ 0, /* POSIXD */ 0, /* POSIXL */ 0, /* POSIXU */ @@ -439,7 +431,7 @@ static const char reg_off_by_arg[] = { 0, /* EXACTFU */ 0, /* EXACTFA */ 0, /* EXACTFU_SS */ - 0, /* EXACTFU_TRICKYFOLD */ + 0, /* EXACTFA_NO_TRIE */ 0, /* NOTHING */ 0, /* TAIL */ 0, /* STAR */ @@ -526,80 +518,78 @@ EXTCONST char * const PL_reg_name[] = { "SANY", /* 0x13 */ "CANY", /* 0x14 */ "ANYOF", /* 0x15 */ - "ANYOF_WARN_SUPER", /* 0x16 */ - "ANYOF_SYNTHETIC", /* 0x17 */ - "POSIXD", /* 0x18 */ - "POSIXL", /* 0x19 */ - "POSIXU", /* 0x1a */ - "POSIXA", /* 0x1b */ - "NPOSIXD", /* 0x1c */ - "NPOSIXL", /* 0x1d */ - "NPOSIXU", /* 0x1e */ - "NPOSIXA", /* 0x1f */ - "CLUMP", /* 0x20 */ - "BRANCH", /* 0x21 */ - "BACK", /* 0x22 */ - "EXACT", /* 0x23 */ - "EXACTF", /* 0x24 */ - "EXACTFL", /* 0x25 */ - "EXACTFU", /* 0x26 */ - "EXACTFA", /* 0x27 */ - "EXACTFU_SS", /* 0x28 */ - "EXACTFU_TRICKYFOLD", /* 0x29 */ - "NOTHING", /* 0x2a */ - "TAIL", /* 0x2b */ - "STAR", /* 0x2c */ - "PLUS", /* 0x2d */ - "CURLY", /* 0x2e */ - "CURLYN", /* 0x2f */ - "CURLYM", /* 0x30 */ - "CURLYX", /* 0x31 */ - "WHILEM", /* 0x32 */ - "OPEN", /* 0x33 */ - "CLOSE", /* 0x34 */ - "REF", /* 0x35 */ - "REFF", /* 0x36 */ - "REFFL", /* 0x37 */ - "REFFU", /* 0x38 */ - "REFFA", /* 0x39 */ - "NREF", /* 0x3a */ - "NREFF", /* 0x3b */ - "NREFFL", /* 0x3c */ - "NREFFU", /* 0x3d */ - "NREFFA", /* 0x3e */ - "IFMATCH", /* 0x3f */ - "UNLESSM", /* 0x40 */ - "SUSPEND", /* 0x41 */ - "IFTHEN", /* 0x42 */ - "GROUPP", /* 0x43 */ - "LONGJMP", /* 0x44 */ - "BRANCHJ", /* 0x45 */ - "EVAL", /* 0x46 */ - "MINMOD", /* 0x47 */ - "LOGICAL", /* 0x48 */ - "RENUM", /* 0x49 */ - "TRIE", /* 0x4a */ - "TRIEC", /* 0x4b */ - "AHOCORASICK", /* 0x4c */ - "AHOCORASICKC", /* 0x4d */ - "GOSUB", /* 0x4e */ - "GOSTART", /* 0x4f */ - "NGROUPP", /* 0x50 */ - "INSUBP", /* 0x51 */ - "DEFINEP", /* 0x52 */ - "ENDLIKE", /* 0x53 */ - "OPFAIL", /* 0x54 */ - "ACCEPT", /* 0x55 */ - "VERB", /* 0x56 */ - "PRUNE", /* 0x57 */ - "MARKPOINT", /* 0x58 */ - "SKIP", /* 0x59 */ - "COMMIT", /* 0x5a */ - "CUTGROUP", /* 0x5b */ - "KEEPS", /* 0x5c */ - "LNBREAK", /* 0x5d */ - "OPTIMIZED", /* 0x5e */ - "PSEUDO", /* 0x5f */ + "POSIXD", /* 0x16 */ + "POSIXL", /* 0x17 */ + "POSIXU", /* 0x18 */ + "POSIXA", /* 0x19 */ + "NPOSIXD", /* 0x1a */ + "NPOSIXL", /* 0x1b */ + "NPOSIXU", /* 0x1c */ + "NPOSIXA", /* 0x1d */ + "CLUMP", /* 0x1e */ + "BRANCH", /* 0x1f */ + "BACK", /* 0x20 */ + "EXACT", /* 0x21 */ + "EXACTF", /* 0x22 */ + "EXACTFL", /* 0x23 */ + "EXACTFU", /* 0x24 */ + "EXACTFA", /* 0x25 */ + "EXACTFU_SS", /* 0x26 */ + "EXACTFA_NO_TRIE", /* 0x27 */ + "NOTHING", /* 0x28 */ + "TAIL", /* 0x29 */ + "STAR", /* 0x2a */ + "PLUS", /* 0x2b */ + "CURLY", /* 0x2c */ + "CURLYN", /* 0x2d */ + "CURLYM", /* 0x2e */ + "CURLYX", /* 0x2f */ + "WHILEM", /* 0x30 */ + "OPEN", /* 0x31 */ + "CLOSE", /* 0x32 */ + "REF", /* 0x33 */ + "REFF", /* 0x34 */ + "REFFL", /* 0x35 */ + "REFFU", /* 0x36 */ + "REFFA", /* 0x37 */ + "NREF", /* 0x38 */ + "NREFF", /* 0x39 */ + "NREFFL", /* 0x3a */ + "NREFFU", /* 0x3b */ + "NREFFA", /* 0x3c */ + "IFMATCH", /* 0x3d */ + "UNLESSM", /* 0x3e */ + "SUSPEND", /* 0x3f */ + "IFTHEN", /* 0x40 */ + "GROUPP", /* 0x41 */ + "LONGJMP", /* 0x42 */ + "BRANCHJ", /* 0x43 */ + "EVAL", /* 0x44 */ + "MINMOD", /* 0x45 */ + "LOGICAL", /* 0x46 */ + "RENUM", /* 0x47 */ + "TRIE", /* 0x48 */ + "TRIEC", /* 0x49 */ + "AHOCORASICK", /* 0x4a */ + "AHOCORASICKC", /* 0x4b */ + "GOSUB", /* 0x4c */ + "GOSTART", /* 0x4d */ + "NGROUPP", /* 0x4e */ + "INSUBP", /* 0x4f */ + "DEFINEP", /* 0x50 */ + "ENDLIKE", /* 0x51 */ + "OPFAIL", /* 0x52 */ + "ACCEPT", /* 0x53 */ + "VERB", /* 0x54 */ + "PRUNE", /* 0x55 */ + "MARKPOINT", /* 0x56 */ + "SKIP", /* 0x57 */ + "COMMIT", /* 0x58 */ + "CUTGROUP", /* 0x59 */ + "KEEPS", /* 0x5a */ + "LNBREAK", /* 0x5b */ + "OPTIMIZED", /* 0x5c */ + "PSEUDO", /* 0x5d */ /* ------------ States ------------- */ "TRIE_next", /* REGNODE_MAX +0x01 */ "TRIE_next_fail", /* REGNODE_MAX +0x02 */ @@ -660,16 +650,16 @@ EXTCONST char * const PL_reg_extflags_name[] = { "CHARSET1", /* 0x00000040 : "CHARSET" - 0x000000e0 */ "CHARSET2", /* 0x00000080 : "CHARSET" - 0x000000e0 */ "SPLIT", /* 0x00000100 */ - "ANCH_BOL", /* 0x00000200 */ - "ANCH_MBOL", /* 0x00000400 */ - "ANCH_SBOL", /* 0x00000800 */ - "ANCH_GPOS", /* 0x00001000 */ - "GPOS_SEEN", /* 0x00002000 */ - "GPOS_FLOAT", /* 0x00004000 */ + "IS_ANCHORED", /* 0x00000200 */ + "UNUSED1", /* 0x00000400 */ + "UNUSED2", /* 0x00000800 */ + "UNUSED3", /* 0x00001000 */ + "UNUSED4", /* 0x00002000 */ + "UNUSED5", /* 0x00004000 */ "NO_INPLACE_SUBST", /* 0x00008000 */ "EVAL_SEEN", /* 0x00010000 */ - "CANY_SEEN", /* 0x00020000 */ - "NOSCAN", /* 0x00040000 */ + "UNUSED8", /* 0x00020000 */ + "UNBOUNDED_QUANTIFIER_SEEN",/* 0x00040000 */ "CHECK_ALL", /* 0x00080000 */ "MATCH_UTF8", /* 0x00100000 */ "USE_INTUIT_NOML", /* 0x00200000 */ @@ -686,6 +676,37 @@ EXTCONST char * const PL_reg_extflags_name[] = { }; #endif /* DOINIT */ +#ifdef DEBUGGING +# define REG_EXTFLAGS_NAME_SIZE 32 +#endif + +/* PL_reg_intflags_name[] - Opcode/state names in string form, for debugging */ + +#ifndef DOINIT +EXTCONST char * PL_reg_intflags_name[]; +#else +EXTCONST char * const PL_reg_intflags_name[] = { + "SKIP", /* 0x00000001 - PREGf_SKIP */ + "IMPLICIT", /* 0x00000002 - PREGf_IMPLICIT - Converted .* to ^.* */ + "NAUGHTY", /* 0x00000004 - PREGf_NAUGHTY - how exponential is this pattern? */ + "VERBARG_SEEN", /* 0x00000008 - PREGf_VERBARG_SEEN */ + "CUTGROUP_SEEN", /* 0x00000010 - PREGf_CUTGROUP_SEEN */ + "USE_RE_EVAL", /* 0x00000020 - PREGf_USE_RE_EVAL - compiled with "use re 'eval'" */ + "NOSCAN", /* 0x00000040 - PREGf_NOSCAN */ + "CANY_SEEN", /* 0x00000080 - PREGf_CANY_SEEN */ + "GPOS_SEEN", /* 0x00000100 - PREGf_GPOS_SEEN */ + "GPOS_FLOAT", /* 0x00000200 - PREGf_GPOS_FLOAT */ + "ANCH_BOL", /* 0x00000400 - PREGf_ANCH_BOL */ + "ANCH_MBOL", /* 0x00000800 - PREGf_ANCH_MBOL */ + "ANCH_SBOL", /* 0x00001000 - PREGf_ANCH_SBOL */ + "ANCH_GPOS", /* 0x00002000 - PREGf_ANCH_GPOS */ +}; +#endif /* DOINIT */ + +#ifdef DEBUGGING +# define REG_INTFLAGS_NAME_SIZE 14 +#endif + /* The following have no fixed length. U8 so we can do strchr() on it. */ #define REGNODE_VARIES(node) (PL_varies_bitmask[(node) >> 3] & (1 << ((node) & 7))) @@ -704,7 +725,7 @@ EXTCONST U8 PL_varies[] __attribute__deprecated__ = { EXTCONST U8 PL_varies_bitmask[]; #else EXTCONST U8 PL_varies_bitmask[] = { - 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0xE7, 0x7F, 0x26, 0x00, 0x00, 0x00 + 0x00, 0x00, 0x00, 0xC0, 0x01, 0xFC, 0xF9, 0x9F, 0x09, 0x00, 0x00, 0x00 }; #endif /* DOINIT */ @@ -716,8 +737,8 @@ EXTCONST U8 PL_varies_bitmask[] = { EXTCONST U8 PL_simple[] __attribute__deprecated__; #else EXTCONST U8 PL_simple[] __attribute__deprecated__ = { - REG_ANY, SANY, CANY, ANYOF, ANYOF_WARN_SUPER, ANYOF_SYNTHETIC, POSIXD, - POSIXL, POSIXU, POSIXA, NPOSIXD, NPOSIXL, NPOSIXU, NPOSIXA, + REG_ANY, SANY, CANY, ANYOF, POSIXD, POSIXL, POSIXU, POSIXA, NPOSIXD, + NPOSIXL, NPOSIXU, NPOSIXA, 0 }; #endif /* DOINIT */ @@ -726,7 +747,7 @@ EXTCONST U8 PL_simple[] __attribute__deprecated__ = { EXTCONST U8 PL_simple_bitmask[]; #else EXTCONST U8 PL_simple_bitmask[] = { - 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; #endif /* DOINIT */ diff --git a/Master/tlpkg/tlperl/lib/CORE/scope.h b/Master/tlpkg/tlperl/lib/CORE/scope.h index 22c728d1be2..0dce9d64530 100644 --- a/Master/tlpkg/tlperl/lib/CORE/scope.h +++ b/Master/tlpkg/tlperl/lib/CORE/scope.h @@ -16,7 +16,7 @@ #define SAVEt_CLEARPADRANGE 1 #define SAVEt_CLEARSV 2 #define SAVEt_REGCONTEXT 3 -#define SAVEt_RE_STATE 4 +/*** SPARE 4 ***/ #define SAVEt_ARG0_MAX 4 @@ -38,12 +38,12 @@ #define SAVEt_OP 18 #define SAVEt_PARSER 19 #define SAVEt_STACK_POS 20 +#define SAVEt_READONLY_OFF 21 -#define SAVEt_ARG1_MAX 20 +#define SAVEt_ARG1_MAX 21 /* two args */ -#define SAVEt_ADELETE 21 #define SAVEt_APTR 22 #define SAVEt_AV 23 #define SAVEt_DESTRUCTOR 24 @@ -64,21 +64,22 @@ #define SAVEt_SAVESWITCHSTACK 39 #define SAVEt_SHARED_PVREF 40 #define SAVEt_SPTR 41 -#define SAVEt_STACK_CXPOS 42 +#define SAVEt_STRLEN 42 #define SAVEt_SV 43 #define SAVEt_SVREF 44 #define SAVEt_VPTR 45 +#define SAVEt_ADELETE 46 -#define SAVEt_ARG2_MAX 45 +#define SAVEt_ARG2_MAX 46 /* three args */ -#define SAVEt_AELEM 46 #define SAVEt_DELETE 47 #define SAVEt_HELEM 48 #define SAVEt_PADSV_AND_MORTALIZE 49 #define SAVEt_SET_SVFLAGS 50 #define SAVEt_GVSLOT 51 +#define SAVEt_AELEM 52 #define SAVEf_SETMAGIC 1 #define SAVEf_KEEPOLDELEM 2 @@ -97,8 +98,8 @@ * macros */ #define SS_MAXPUSH 4 -#define SSCHECK(need) if (PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max) savestack_grow() -#define SSGROW(need) if (PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max) savestack_grow_cnt(need + SS_MAXPUSH) +#define SSCHECK(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max)) savestack_grow() +#define SSGROW(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max)) savestack_grow_cnt(need + SS_MAXPUSH) #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i)) #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i)) #define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p)) @@ -122,14 +123,14 @@ #define dSS_ADD \ I32 ix = PL_savestack_ix; \ - ANY *ssp = &PL_savestack[ix]; + ANY *ssp = &PL_savestack[ix] #define SS_ADD_END(need) \ assert((need) <= SS_MAXPUSH); \ ix += (need); \ PL_savestack_ix = ix; \ assert(ix <= PL_savestack_max); \ - if ((ix + SS_MAXPUSH) > PL_savestack_max) savestack_grow(); \ + if (UNLIKELY((ix + SS_MAXPUSH) > PL_savestack_max)) savestack_grow(); \ assert(PL_savestack_ix + SS_MAXPUSH <= PL_savestack_max); #define SS_ADD_INT(i) ((ssp++)->any_i32 = (I32)(i)) @@ -185,7 +186,8 @@ scope has the given name. Name must be a literal string. =cut */ -#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix +#define SAVETMPS Perl_save_strlen(aTHX_ (STRLEN *)&PL_tmps_floor), \ + PL_tmps_floor = PL_tmps_ix #define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps() #ifdef DEBUGGING @@ -252,7 +254,7 @@ scope has the given name. Name must be a literal string. #define SAVEHDELETE(h,s) \ save_hdelete(MUTABLE_HV(h), (s)) #define SAVEADELETE(a,k) \ - save_adelete(MUTABLE_AV(a), (I32)(k)) + save_adelete(MUTABLE_AV(a), (SSize_t)(k)) #define SAVEDESTRUCTOR(f,p) \ save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p)) @@ -287,15 +289,6 @@ scope has the given name. Name must be a literal string. save stack. */ #define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS) -#define SAVESTACK_CXPOS() \ - STMT_START { \ - dSS_ADD; \ - SS_ADD_INT(cxstack[cxstack_ix].blk_oldsp); \ - SS_ADD_INT(cxstack_ix); \ - SS_ADD_UV(SAVEt_STACK_CXPOS); \ - SS_ADD_END(3); \ - } STMT_END - #define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER) #ifdef USE_ITHREADS diff --git a/Master/tlpkg/tlperl/lib/CORE/sv.h b/Master/tlpkg/tlperl/lib/CORE/sv.h index 984121fa83d..b129225bd3c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/sv.h +++ b/Master/tlpkg/tlperl/lib/CORE/sv.h @@ -22,7 +22,6 @@ in the C enum. Test these flags with the C macro. The types are: SVt_NULL - SVt_BIND (unused) SVt_IV SVt_NV SVt_RV @@ -30,6 +29,7 @@ The types are: SVt_PVIV SVt_PVNV SVt_PVMG + SVt_INVLIST SVt_REGEXP SVt_PVGV SVt_PVLV @@ -57,7 +57,9 @@ typeglob has been assigned. Assigning to it again will stop it from being a typeglob. SVt_PVLV represents a scalar that delegates to another scalar behind the scenes. It is used, e.g., for the return value of C and for tied hash and array elements. It can hold any scalar value, including -a typeglob. SVt_REGEXP is for regular expressions. +a typeglob. SVt_REGEXP is for regular +expressions. SVt_INVLIST is for Perl +core internal use only. SVt_PVMG represents a "normal" scalar (not a typeglob, regular expression, or delegate). Since most scalars do not need all the internal fields of a @@ -91,6 +93,9 @@ Type flag for scalars. See L. =for apidoc AmU||SVt_PVMG Type flag for scalars. See L. +=for apidoc AmU||SVt_INVLIST +Type flag for scalars. See L. + =for apidoc AmU||SVt_REGEXP Type flag for regular expressions. See L. @@ -116,15 +121,22 @@ Type flag for formats. See L. Type flag for I/O objects. See L. =cut + + These are ordered so that the simpler types have a lower value; SvUPGRADE + doesn't allow you to upgrade from a higher numbered type to a lower numbered + one; also there is code that assumes that anything that has as a PV component + has a type numbered >= SVt_PV. */ + typedef enum { SVt_NULL, /* 0 */ - SVt_BIND, /* 1 */ - SVt_IV, /* 2 */ - SVt_NV, /* 3 */ + /* BIND was here, before INVLIST replaced it. */ + SVt_IV, /* 1 */ + SVt_NV, /* 2 */ /* RV was here, before it was merged with IV. */ - SVt_PV, /* 4 */ + SVt_PV, /* 3 */ + SVt_INVLIST, /* 4, implemented as a PV */ SVt_PVIV, /* 5 */ SVt_PVNV, /* 6 */ SVt_PVMG, /* 7 */ @@ -141,13 +153,15 @@ typedef enum { } svtype; /* *** any alterations to the SV types above need to be reflected in - * SVt_MASK and the various PL_valid_types_* tables */ + * SVt_MASK and the various PL_valid_types_* tables. As of this writing those + * tables are in perl.h. There are also two affected names tables in dump.c, + * one in B.xs, and 'bodies_by_type[]' in sv.c */ #define SVt_MASK 0xf /* smallest bitmask that covers all types */ #ifndef PERL_CORE /* Although Fast Boyer Moore tables are now being stored in PVGVs, for most - purposes eternal code wanting to consider PVBM probably needs to think of + purposes external code wanting to consider PVBM probably needs to think of PVMG instead. */ # define SVt_PVBM SVt_PVMG /* Anything wanting to create a reference from clean should ensure that it has @@ -284,7 +298,7 @@ to return a meaningful value, or check for NULLness, so it's smaller and faster. =for apidoc Am|void|SvREFCNT_dec|SV* sv -Decrements the reference count of the given SV. I may be NULL. +Decrements the reference count of the given SV. I may be NULL. =for apidoc Am|void|SvREFCNT_dec_NN|SV* sv Same as SvREFCNT_dec, but can only be used if you know I @@ -347,6 +361,7 @@ perform the upgrade if necessary. See C. subroutine in another package. Set the GvIMPORTED_CV_on() if it needs to be expanded to a real GV */ +#define SVpad_NAMELIST SVp_SCREAM /* AV is a padnamelist */ #define SVf_IsCOW 0x00010000 /* copy on write (shared hash key if SvLEN == 0) */ #define SVs_PADTMP 0x00020000 /* in use as tmp; only if ! SVs_PADMY */ @@ -390,21 +405,24 @@ perform the upgrade if necessary. See C. #define SVf_AMAGIC 0x10000000 /* has magical overloaded methods */ +/* note that SVf_AMAGIC is now only set on stashes, so this bit is free + * for non-HV SVs */ + /* Ensure this value does not clash with the GV_ADD* flags in gv.h: */ #define SVf_UTF8 0x20000000 /* SvPV is UTF-8 encoded This is also set on RVs whose overloaded stringification is UTF-8. This might only happen as a side effect of SvPV() */ - - -/* Some private flags. */ +/* PVHV */ +#define SVphv_SHAREKEYS 0x20000000 /* PVHV keys live on shared string table */ /* PVAV could probably use 0x2000000 without conflict. I assume that PVFM can be UTF-8 encoded, and PVCVs could well have UTF-8 prototypes. PVIOs haven't been restructured, so sometimes get used as string buffers. */ -/* PVHV */ -#define SVphv_SHAREKEYS 0x20000000 /* PVHV keys live on shared string table */ + +/* Some private flags. */ + /* PVNV, PVMG only, and only used in pads. Should be safe to test on any scalar SV, as the core is careful to avoid setting both. @@ -463,10 +481,6 @@ union _xnvu { U32 xlow; U32 xhigh; } xpad_cop_seq; /* used by pad.c for cop_sequence */ - struct { - I32 xbm_useful; - U8 xbm_rare; /* rarest character in string */ - } xbm_s; /* fields from PVBM */ }; union _xivu { @@ -479,7 +493,7 @@ union _xmgu { MAGIC* xmg_magic; /* linked list of magicalness */ HV* xmg_ourstash; /* Stash for our (when SvPAD_OUR is true) */ STRLEN xmg_hash_index; /* used while freeing hash entries */ -}; +}; /* also used by PadnamelistMAXNAMED */ struct xpv { _XPV_HEAD; @@ -516,7 +530,10 @@ struct xpvlv { _XPV_HEAD; union _xivu xiv_u; union _xnvu xnv_u; - STRLEN xlv_targoff; + union { + STRLEN xlvu_targoff; + SSize_t xlvu_stargoff; + } xlv_targoff_u; STRLEN xlv_targlen; SV* xlv_targ; char xlv_type; /* k=keys .=pos x=substr v=vec /=join/re @@ -524,6 +541,15 @@ struct xpvlv { char xlv_flags; /* 1 = negative offset 2 = negative len */ }; +#define xlv_targoff xlv_targoff_u.xlvu_targoff + +struct xpvinvlist { + _XPV_HEAD; + IV prev_index; + STRLEN iterator; + bool is_offset; /* */ +}; + /* This structure works in 3 ways - regular scalar, GV with GP, or fast Boyer-Moore. */ struct xpvgv { @@ -532,7 +558,7 @@ struct xpvgv { union _xnvu xnv_u; }; -typedef U16 cv_flags_t; +typedef U32 cv_flags_t; #define _XPVCV_COMMON \ HV * xcv_stash; \ @@ -624,7 +650,7 @@ double. Checks the B setting. Use C instead. Unsets the NV/IV status of an SV. =for apidoc Am|U32|SvOK|SV* sv -Returns a U32 value indicating whether the value is defined. This is +Returns a U32 value indicating whether the value is defined. This is only meaningful for scalars. =for apidoc Am|U32|SvIOKp|SV* sv @@ -730,7 +756,8 @@ Only use when you are sure SvNOK is true. See also C. =for apidoc Am|char*|SvPVX|SV* sv Returns a pointer to the physical string in the SV. The SV must contain a -string. Prior to 5.9.3 it is not safe to execute this macro unless the SV's +string. Prior to 5.9.3 it is not safe +to execute this macro unless the SV's type >= SVt_PV. This is also used to store the name of an autoloaded subroutine in an XS @@ -746,7 +773,7 @@ attributable to C. See C. =for apidoc Am|char*|SvEND|SV* sv Returns a pointer to the spot just after the last character in the string which is in the SV, where there is usually a trailing -null (even though Perl scalars do not strictly require it). +C character (even though Perl scalars do not strictly require it). See C. Access the character as *(SvEND(sv)). Warning: If C is equal to C, then C points to @@ -765,7 +792,8 @@ C instead of the lvalue assignment to C. Set the value of the NV pointer in sv to val. See C. =for apidoc Am|void|SvPV_set|SV* sv|char* val -Set the value of the PV pointer in sv to val. See also C. +Set the value of the PV pointer in C to the C-terminated string +C. See also C. Beware that the existing pointer may be involved in copy-on-write or other mischief, so do C and use C or @@ -932,6 +960,7 @@ in gv.h: */ #define HvAMAGIC_off(hv) (SvFLAGS(hv) &=~ SVf_AMAGIC) +/* "nog" means "doesn't have get magic" */ #define SvPOK_nog(sv) ((SvFLAGS(sv) & (SVf_POK|SVs_GMG)) == SVf_POK) #define SvIOK_nog(sv) ((SvFLAGS(sv) & (SVf_IOK|SVs_GMG)) == SVf_IOK) #define SvUOK_nog(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV|SVs_GMG)) == (SVf_IOK|SVf_IVisUV)) @@ -1056,27 +1085,30 @@ sv_force_normal does nothing. #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) # define SvVALID(sv) ({ const SV *const _svvalid = (const SV*)(sv); \ - if (SvFLAGS(_svvalid) & SVpbm_VALID) \ + if (SvFLAGS(_svvalid) & SVpbm_VALID && !SvSCREAM(_svvalid)) \ assert(!isGV_with_GP(_svvalid)); \ (SvFLAGS(_svvalid) & SVpbm_VALID); \ }) # define SvVALID_on(sv) ({ SV *const _svvalid = MUTABLE_SV(sv); \ assert(!isGV_with_GP(_svvalid)); \ + assert(!SvSCREAM(_svvalid)); \ (SvFLAGS(_svvalid) |= SVpbm_VALID); \ }) # define SvVALID_off(sv) ({ SV *const _svvalid = MUTABLE_SV(sv); \ assert(!isGV_with_GP(_svvalid)); \ + assert(!SvSCREAM(_svvalid)); \ (SvFLAGS(_svvalid) &= ~SVpbm_VALID); \ }) # define SvTAIL(sv) ({ const SV *const _svtail = (const SV *)(sv); \ - assert(SvTYPE(_svtail) != SVt_PVAV); \ - assert(SvTYPE(_svtail) != SVt_PVHV); \ + assert(SvTYPE(_svtail) != SVt_PVAV); \ + assert(SvTYPE(_svtail) != SVt_PVHV); \ + assert(!SvSCREAM(_svtail)); \ (SvFLAGS(sv) & (SVpbm_TAIL|SVpbm_VALID)) \ == (SVpbm_TAIL|SVpbm_VALID); \ }) #else -# define SvVALID(sv) (SvFLAGS(sv) & SVpbm_VALID) +# define SvVALID(sv) ((SvFLAGS(sv) & SVpbm_VALID) && !SvSCREAM(sv)) # define SvVALID_on(sv) (SvFLAGS(sv) |= SVpbm_VALID) # define SvVALID_off(sv) (SvFLAGS(sv) &= ~SVpbm_VALID) # define SvTAIL(sv) ((SvFLAGS(sv) & (SVpbm_TAIL|SVpbm_VALID)) \ @@ -1331,7 +1363,7 @@ sv_force_normal does nothing. assert(SvTYPE(sv) >= SVt_PV); \ if (SvLEN(sv)) { \ assert(!SvROK(sv)); \ - if(SvOOK(sv)) { \ + if(UNLIKELY(SvOOK(sv))) { \ STRLEN zok; \ SvOOK_offset(sv, zok); \ SvPV_set(sv, SvPVX_mutable(sv) - zok); \ @@ -1361,37 +1393,29 @@ sv_force_normal does nothing. #endif #if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) -# define BmRARE(sv) \ - (*({ SV *const _bmrare = MUTABLE_SV(sv); \ - assert(SvTYPE(_bmrare) == SVt_PVMG); \ - assert(SvVALID(_bmrare)); \ - &(((XPVMG*) SvANY(_bmrare))->xnv_u.xbm_s.xbm_rare); \ - })) # define BmUSEFUL(sv) \ (*({ SV *const _bmuseful = MUTABLE_SV(sv); \ - assert(SvTYPE(_bmuseful) == SVt_PVMG); \ + assert(SvTYPE(_bmuseful) >= SVt_PVIV); \ assert(SvVALID(_bmuseful)); \ assert(!SvIOK(_bmuseful)); \ - &(((XPVMG*) SvANY(_bmuseful))->xnv_u.xbm_s.xbm_useful); \ - })) -# define BmPREVIOUS(sv) \ - (*({ SV *const _bmprevious = MUTABLE_SV(sv); \ - assert(SvTYPE(_bmprevious) == SVt_PVMG); \ - assert(SvVALID(_bmprevious)); \ - &(((XPVMG*) SvANY(_bmprevious))->xiv_u.xivu_uv); \ + &(((XPVIV*) SvANY(_bmuseful))->xiv_u.xivu_iv); \ })) #else -# define BmRARE(sv) ((XPVMG*) SvANY(sv))->xnv_u.xbm_s.xbm_rare -# define BmUSEFUL(sv) ((XPVMG*) SvANY(sv))->xnv_u.xbm_s.xbm_useful -# define BmPREVIOUS(sv) ((XPVMG*) SvANY(sv))->xiv_u.xivu_uv +# define BmUSEFUL(sv) ((XPVIV*) SvANY(sv))->xiv_u.xivu_iv #endif +#ifndef PERL_CORE +# define BmRARE(sv) 0 +# define BmPREVIOUS(sv) 0 +#endif + #define FmLINES(sv) ((XPVIV*) SvANY(sv))->xiv_iv #define LvTYPE(sv) ((XPVLV*) SvANY(sv))->xlv_type #define LvTARG(sv) ((XPVLV*) SvANY(sv))->xlv_targ #define LvTARGOFF(sv) ((XPVLV*) SvANY(sv))->xlv_targoff +#define LvSTARGOFF(sv) ((XPVLV*) SvANY(sv))->xlv_targoff_u.xlvu_stargoff #define LvTARGLEN(sv) ((XPVLV*) SvANY(sv))->xlv_targlen #define LvFLAGS(sv) ((XPVLV*) SvANY(sv))->xlv_flags @@ -1436,7 +1460,7 @@ Marks an SV as tainted if tainting is enabled. Untaints an SV. Be I careful with this routine, as it short-circuits some of Perl's fundamental security features. XS module authors should not use this function unless they fully understand all the implications of -unconditionally untainting the value. Untainting should be done in the +unconditionally untainting the value. Untainting should be done in the standard perl fashion, via a carefully crafted regexp, rather than directly untainting variables. @@ -1452,18 +1476,18 @@ attention to precisely which outputs are influenced by which inputs. #define sv_taint(sv) sv_magic((sv), NULL, PERL_MAGIC_taint, NULL, 0) -#if NO_TAINT_SUPPORT +#ifdef NO_TAINT_SUPPORT # define SvTAINTED(sv) 0 #else # define SvTAINTED(sv) (SvMAGICAL(sv) && sv_tainted(sv)) #endif -#define SvTAINTED_on(sv) STMT_START{ if(TAINTING_get){sv_taint(sv);} }STMT_END -#define SvTAINTED_off(sv) STMT_START{ if(TAINTING_get){sv_untaint(sv);} }STMT_END +#define SvTAINTED_on(sv) STMT_START{ if(UNLIKELY(TAINTING_get)){sv_taint(sv);} }STMT_END +#define SvTAINTED_off(sv) STMT_START{ if(UNLIKELY(TAINTING_get)){sv_untaint(sv);} }STMT_END #define SvTAINT(sv) \ STMT_START { \ - if (TAINTING_get) { \ - if (TAINT_get) \ + if (UNLIKELY(TAINTING_get)) { \ + if (UNLIKELY(TAINT_get)) \ SvTAINTED_on(sv); \ } \ } STMT_END @@ -1475,7 +1499,7 @@ only a string (C), by hook or by crook. You need force if you are going to update the C directly. Processes get magic. Note that coercing an arbitrary scalar into a plain PV will potentially -strip useful data from it. For example if the SV was C, then the +strip useful data from it. For example if the SV was C, then the referent will have its reference count decremented, and the SV itself may be converted to an C scalar with a string buffer containing a value such as C<"ARRAY(0x1234)">. @@ -1486,13 +1510,15 @@ Like C, but doesn't process get magic. =for apidoc Am|char*|SvPV|SV* sv|STRLEN len Returns a pointer to the string in the SV, or a stringified form of the SV if the SV does not contain a string. The SV may cache the -stringified version becoming C. Handles 'get' magic. See also -C for a version which guarantees to evaluate sv only once. +stringified version becoming C. Handles 'get' magic. The +C variable will be set to the length of the string (this is a macro, so +don't use C<&len>). See also C for a version which guarantees to +evaluate sv only once. Note that there is no guarantee that the return value of C is equal to C, or that C contains valid data, or that -successive calls to C will return the same pointer value each +time. This is due to the way that things like overloading and Copy-On-Write are handled. In these cases, the return value may point to a temporary buffer or similar. If you absolutely need the SvPVX field to be valid (for example, if you intend to write to it), then see @@ -1599,8 +1625,8 @@ Like C, but converts sv to byte representation first if necessary. Guarantees to evaluate sv only once; use the more efficient C otherwise. -=for apidoc Am|bool|SvIsCOW|SV* sv -Returns a boolean indicating whether the SV is Copy-On-Write (either shared +=for apidoc Am|U32|SvIsCOW|SV* sv +Returns a U32 value indicating whether the SV is Copy-On-Write (either shared hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for COW). @@ -1682,6 +1708,7 @@ Like sv_utf8_upgrade, but doesn't do magic on C. (SvPOK_nog(sv) \ ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC)) +/* "_nomg" in these defines means no mg_get() */ #define SvPV_nomg_nolen(sv) \ (SvPOK_nog(sv) \ ? SvPVX(sv) : sv_2pv_flags(sv, 0, 0)) @@ -1732,9 +1759,9 @@ Like sv_utf8_upgrade, but doesn't do magic on C. #define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp) #define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp) -#define SvTRUE(sv) ((sv) && (SvGMAGICAL(sv) ? sv_2bool(sv) : SvTRUE_common(sv, sv_2bool_nomg(sv)))) -#define SvTRUE_nomg(sv) ((sv) && ( SvTRUE_common(sv, sv_2bool_nomg(sv)))) -#define SvTRUE_NN(sv) (SvGMAGICAL(sv) ? sv_2bool(sv) : SvTRUE_common(sv, sv_2bool_nomg(sv))) +#define SvTRUE(sv) (LIKELY(sv) && (UNLIKELY(SvGMAGICAL(sv)) ? sv_2bool(sv) : SvTRUE_common(sv, sv_2bool_nomg(sv)))) +#define SvTRUE_nomg(sv) (LIKELY(sv) && ( SvTRUE_common(sv, sv_2bool_nomg(sv)))) +#define SvTRUE_NN(sv) (UNLIKELY(SvGMAGICAL(sv)) ? sv_2bool(sv) : SvTRUE_common(sv, sv_2bool_nomg(sv))) #define SvTRUE_nomg_NN(sv) ( SvTRUE_common(sv, sv_2bool_nomg(sv))) #define SvTRUE_common(sv,fallback) ( \ !SvOK(sv) \ @@ -1885,12 +1912,6 @@ mg.c:1024: warning: left-hand operand of comma expression has no effect /* Note: To allow 256 COW "copies", a refcnt of 0 means 1. */ # define CowREFCNT(sv) (*(U8 *)(SvPVX(sv)+SvLEN(sv)-1)) # define SV_COW_REFCNT_MAX ((1 << sizeof(U8)*8) - 1) -# ifndef SV_COW_THRESHOLD -# define SV_COW_THRESHOLD 0 /* min string length for cow */ -# endif -# ifndef SV_COWBUF_THRESHOLD -# define SV_COWBUF_THRESHOLD 1250 /* min string length for cow */ -# endif /* over existing buffer */ # define CAN_COW_MASK (SVf_POK|SVf_ROK|SVp_POK|SVf_FAKE| \ SVf_OOK|SVf_BREAK|SVf_READONLY) # endif @@ -1959,12 +1980,11 @@ mg.c:1024: warning: left-hand operand of comma expression has no effect #define sv_catpvn_nomg_maybeutf8(dsv, sstr, slen, is_utf8) \ sv_catpvn_flags(dsv, sstr, slen, (is_utf8)?SV_CATUTF8:SV_CATBYTES) -#ifdef PERL_CORE +#if defined(PERL_CORE) || defined(PERL_EXT) # define sv_or_pv_len_utf8(sv, pv, bytelen) \ (SvGAMAGIC(sv) \ ? utf8_length((U8 *)(pv), (U8 *)(pv)+(bytelen)) \ : sv_len_utf8(sv)) -# define sv_or_pv_pos_u2b(sv,s,p,lp) S_sv_or_pv_pos_u2b(aTHX_ sv,s,p,lp) #endif /* @@ -1994,15 +2014,15 @@ after modifying a scalar, in case it is a magical variable like C<$|> or a tied variable (it calls C). This macro evaluates its argument more than once. -=for apidoc Am|void|SvSetSV|SV* dsb|SV* ssv +=for apidoc Am|void|SvSetSV|SV* dsv|SV* ssv Calls C if dsv is not the same as ssv. May evaluate arguments -more than once. +more than once. Does not handle 'set' magic on the destination SV. =for apidoc Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv Calls a non-destructive version of C if dsv is not the same as ssv. May evaluate arguments more than once. -=for apidoc Am|void|SvSetMagicSV|SV* dsb|SV* ssv +=for apidoc Am|void|SvSetMagicSV|SV* dsv|SV* ssv Like C, but does any set magic required afterwards. =for apidoc Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv @@ -2025,8 +2045,9 @@ has been loaded. =for apidoc Am|char *|SvGROW|SV* sv|STRLEN len Expands the character buffer in the SV so that it has room for the indicated number of bytes (remember to reserve space for an extra trailing -NUL character). Calls C to perform the expansion if necessary. -Returns a pointer to the character buffer. SV must be of type >= SVt_PV. One +C character). Calls C to perform the expansion if necessary. +Returns a pointer to the character +buffer. SV must be of type >= SVt_PV. One alternative is to call C if you are not sure of the type of SV. =cut @@ -2037,19 +2058,19 @@ alternative is to call C if you are not sure of the type of SV. #define SvUNLOCK(sv) PL_unlockhook(aTHX_ sv) #define SvDESTROYABLE(sv) PL_destroyhook(aTHX_ sv) -#define SvGETMAGIC(x) ((void)(SvGMAGICAL(x) && mg_get(x))) -#define SvSETMAGIC(x) STMT_START { if (SvSMAGICAL(x)) mg_set(x); } STMT_END +#define SvGETMAGIC(x) ((void)(UNLIKELY(SvGMAGICAL(x)) && mg_get(x))) +#define SvSETMAGIC(x) STMT_START { if (UNLIKELY(SvSMAGICAL(x))) mg_set(x); } STMT_END #define SvSetSV_and(dst,src,finally) \ STMT_START { \ - if ((dst) != (src)) { \ + if (LIKELY((dst) != (src))) { \ sv_setsv(dst, src); \ finally; \ } \ } STMT_END #define SvSetSV_nosteal_and(dst,src,finally) \ STMT_START { \ - if ((dst) != (src)) { \ + if (LIKELY((dst) != (src))) { \ sv_setsv_flags(dst, src, SV_GMAGIC | SV_NOSTEAL | SV_DO_COW_SVSETSV); \ finally; \ } \ @@ -2117,7 +2138,7 @@ See also C and C. == (SVt_PVLV|SVf_FAKE)) -#ifdef PERL_NEW_COPY_ON_WRITE +#ifdef PERL_ANY_COW # define SvGROW(sv,len) \ (SvIsCOW(sv) || SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX(sv)) #else @@ -2143,7 +2164,8 @@ struct clone_params { /* =for apidoc Am|SV*|newSVpvn_utf8|NULLOK const char* s|STRLEN len|U32 utf8 -Creates a new SV and copies a string into it. If utf8 is true, calls +Creates a new SV and copies a string (which may contain C (C<\0>) +characters) into it. If utf8 is true, calls C on the new SV. Implemented as a wrapper around C. =cut @@ -2220,6 +2242,54 @@ Evaluates I more than once. Sets I to 0 if C is false. #define newIO() MUTABLE_IO(newSV_type(SVt_PVIO)) +#define SV_CONST(name) \ + PL_sv_consts[SV_CONST_##name] \ + ? PL_sv_consts[SV_CONST_##name] \ + : (PL_sv_consts[SV_CONST_##name] = newSVpv_share(#name, 0)) + +#define SV_CONST_TIESCALAR 0 +#define SV_CONST_TIEARRAY 1 +#define SV_CONST_TIEHASH 2 +#define SV_CONST_TIEHANDLE 3 + +#define SV_CONST_FETCH 4 +#define SV_CONST_FETCHSIZE 5 +#define SV_CONST_STORE 6 +#define SV_CONST_STORESIZE 7 +#define SV_CONST_EXISTS 8 + +#define SV_CONST_PUSH 9 +#define SV_CONST_POP 10 +#define SV_CONST_SHIFT 11 +#define SV_CONST_UNSHIFT 12 +#define SV_CONST_SPLICE 13 +#define SV_CONST_EXTEND 14 + +#define SV_CONST_FIRSTKEY 15 +#define SV_CONST_NEXTKEY 16 +#define SV_CONST_SCALAR 17 + +#define SV_CONST_OPEN 18 +#define SV_CONST_WRITE 19 +#define SV_CONST_PRINT 20 +#define SV_CONST_PRINTF 21 +#define SV_CONST_READ 22 +#define SV_CONST_READLINE 23 +#define SV_CONST_GETC 24 +#define SV_CONST_SEEK 25 +#define SV_CONST_TELL 26 +#define SV_CONST_EOF 27 +#define SV_CONST_BINMODE 28 +#define SV_CONST_FILENO 29 +#define SV_CONST_CLOSE 30 + +#define SV_CONST_DELETE 31 +#define SV_CONST_CLEAR 32 +#define SV_CONST_UNTIE 33 +#define SV_CONST_DESTROY 34 + +#define SV_CONSTS_COUNT 35 + /* * Local variables: * c-indentation-style: bsd diff --git a/Master/tlpkg/tlperl/lib/CORE/sys/errno2.h b/Master/tlpkg/tlperl/lib/CORE/sys/errno2.h new file mode 100644 index 00000000000..3ca85e33ae7 --- /dev/null +++ b/Master/tlpkg/tlperl/lib/CORE/sys/errno2.h @@ -0,0 +1,178 @@ +#ifndef _INC_SYS_ERRNO2 +#define _INC_SYS_ERRNO2 + +/* Too late to include winsock2.h if winsock.h has already been loaded */ +#ifndef _WINSOCKAPI_ +# if defined(UNDER_CE) && UNDER_CE <= 300 + /* winsock2 only for 4.00+ */ +# include +# else +# include +# endif +#endif + +/* Ensure all the Exxx constants required by convert_wsa_error_to_errno() in + * win32/win32sck.c are defined. Many are defined in already (more so + * in VC++ 2010 and above and some MinGW/gcc-4.8 and above, which have an extra + * "POSIX supplement") so, for the sake of compatibility with third-party code + * linked into XS modules, we must be careful not to redefine them; for the + * remainder we define our own values, namely the corresponding WSAExxx values. + * + * These definitions are also used as a supplement to the use of in + * the Errno and POSIX modules, both of which may be used to test the value of + * $!, which may have these values assigned to it (via code in win32/win32sck.c + * and the $! case in Perl_magic_set()). It also provides numerous otherwise + * missing values in the (hard-coded) list of Exxx constants exported by POSIX. + * Finally, three of the non-standard errno.h values (actually all now in the + * POSIX supplement in VC10+ and some MinGW/gcc-4.8+) are used in the perl core. + * + * This list is in the same order as that in convert_wsa_error_to_errno(). A + * handful of WSAExxx constants used by that function have no corresponding Exxx + * constant in any errno.h so there is no point in making up values for them; + * they are just returned unchanged by that function so we do not need to worry + * about them here. + */ + +/* EINTR is a standard errno.h value */ +/* EBADF is a standard errno.h value */ +/* EACCES is a standard errno.h value */ +/* EFAULT is a standard errno.h value */ +/* EINVAL is a standard errno.h value */ +/* EMFILE is a standard errno.h value */ + +#ifndef EWOULDBLOCK /* New in VC10 */ +# define EWOULDBLOCK WSAEWOULDBLOCK +#endif +#ifndef EINPROGRESS /* New in VC10 */ +# define EINPROGRESS WSAEINPROGRESS +#endif +#ifndef EALREADY /* New in VC10 */ +# define EALREADY WSAEALREADY +#endif +#ifndef ENOTSOCK /* New in VC10 and needed in doio.c */ +# define ENOTSOCK WSAENOTSOCK +#endif +#ifndef EDESTADDRREQ /* New in VC10 */ +# define EDESTADDRREQ WSAEDESTADDRREQ +#endif +#ifndef EMSGSIZE /* New in VC10 */ +# define EMSGSIZE WSAEMSGSIZE +#endif +#ifndef EPROTOTYPE /* New in VC10 */ +# define EPROTOTYPE WSAEPROTOTYPE +#endif +#ifndef ENOPROTOOPT /* New in VC10 */ +# define ENOPROTOOPT WSAENOPROTOOPT +#endif +#ifndef EPROTONOSUPPORT /* New in VC10 */ +# define EPROTONOSUPPORT WSAEPROTONOSUPPORT +#endif +#ifndef ESOCKTNOSUPPORT /* Not in errno.h but wanted by POSIX.pm */ +# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT +#endif +#ifndef EOPNOTSUPP /* New in VC10 */ +# define EOPNOTSUPP WSAEOPNOTSUPP +#endif +#ifndef EPFNOSUPPORT /* Not in errno.h but wanted by POSIX.pm */ +# define EPFNOSUPPORT WSAEPFNOSUPPORT +#endif +#ifndef EAFNOSUPPORT /* New in VC10 and needed in util.c */ +# define EAFNOSUPPORT WSAEAFNOSUPPORT +#endif +#ifndef EADDRINUSE /* New in VC10 */ +# define EADDRINUSE WSAEADDRINUSE +#endif +#ifndef EADDRNOTAVAIL /* New in VC10 */ +# define EADDRNOTAVAIL WSAEADDRNOTAVAIL +#endif +#ifndef ENETDOWN /* New in VC10 */ +# define ENETDOWN WSAENETDOWN +#endif +#ifndef ENETUNREACH /* New in VC10 */ +# define ENETUNREACH WSAENETUNREACH +#endif +#ifndef ENETRESET /* New in VC10 */ +# define ENETRESET WSAENETRESET +#endif +#ifndef ECONNABORTED /* New in VC10 and needed in util.c */ +# define ECONNABORTED WSAECONNABORTED +#endif +#ifndef ECONNRESET /* New in VC10 */ +# define ECONNRESET WSAECONNRESET +#endif +#ifndef ENOBUFS /* New in VC10 */ +# define ENOBUFS WSAENOBUFS +#endif +#ifndef EISCONN /* New in VC10 */ +# define EISCONN WSAEISCONN +#endif +#ifndef ENOTCONN /* New in VC10 */ +# define ENOTCONN WSAENOTCONN +#endif +#ifndef ESHUTDOWN /* Not in errno.h but wanted by POSIX.pm */ +# define ESHUTDOWN WSAESHUTDOWN +#endif +#ifndef ETOOMANYREFS /* Not in errno.h but wanted by POSIX.pm */ +# define ETOOMANYREFS WSAETOOMANYREFS +#endif +#ifndef ETIMEDOUT /* New in VC10 */ +# define ETIMEDOUT WSAETIMEDOUT +#endif +#ifndef ECONNREFUSED /* New in VC10 */ +# define ECONNREFUSED WSAECONNREFUSED +#endif +#ifndef ELOOP /* New in VC10 */ +# define ELOOP WSAELOOP +#endif + +/* ENAMETOOLONG is a standard errno.h value */ + +/* EHOSTDOWN is not in errno.h and despite being wanted by POSIX.pm we cannot + * provide any sane value since there is no WSAEHOSTDOWN */ + +#ifndef EHOSTUNREACH /* New in VC10 */ +# define EHOSTUNREACH WSAEHOSTUNREACH +#endif + +/* ENOTEMPTY is a standard errno.h value */ + +#ifndef EPROCLIM /* Not in errno.h but wanted by POSIX.pm */ +# define EPROCLIM WSAEPROCLIM +#endif +#ifndef EUSERS /* Not in errno.h but wanted by POSIX.pm */ +# define EUSERS WSAEUSERS +#endif +#ifndef EDQUOT /* Not in errno.h but wanted by POSIX.pm */ +# define EDQUOT WSAEDQUOT +#endif +#ifndef ESTALE /* Not in errno.h but wanted by POSIX.pm */ +# define ESTALE WSAESTALE +#endif +#ifndef EREMOTE /* Not in errno.h but wanted by POSIX.pm */ +# define EREMOTE WSAEREMOTE +#endif + +/* EDISCON is not an errno.h value at all */ +/* ENOMORE is not an errno.h value at all */ + +#ifndef ECANCELED /* New in VC10 */ +# ifdef WSAECANCELLED /* New in WinSock2 */ +# define ECANCELED WSAECANCELLED +# endif +#endif + +/* EINVALIDPROCTABLE is not an errno.h value at all */ +/* EINVALIDPROVIDER is not an errno.h value at all */ +/* EPROVIDERFAILEDINIT is not an errno.h value at all */ +/* EREFUSED is not an errno.h value at all */ + +/* Set a flag indicating whether has the POSIX supplement (the first + * constant in which is EADDRINUSE). If so then we won't have just defined it as + * WSAEADDRINUSE above. + */ +#undef ERRNO_HAS_POSIX_SUPPLEMENT +#if EADDRINUSE != WSAEADDRINUSE +# define ERRNO_HAS_POSIX_SUPPLEMENT +#endif + +#endif /* _INC_SYS_ERRNO2 */ diff --git a/Master/tlpkg/tlperl/lib/CORE/sys/socket.h b/Master/tlpkg/tlperl/lib/CORE/sys/socket.h index 6009572725b..d658913f8b4 100644 --- a/Master/tlpkg/tlperl/lib/CORE/sys/socket.h +++ b/Master/tlpkg/tlperl/lib/CORE/sys/socket.h @@ -177,23 +177,11 @@ # define EAI_NODATA WSANO_DATA #endif -#include "win32.h" - #ifdef __cplusplus extern "C" { #endif -#undef ENOTSOCK -#define ENOTSOCK WSAENOTSOCK - -#undef ECONNABORTED -#define ECONNABORTED WSAECONNABORTED - -#undef ECONNRESET -#define ECONNRESET WSAECONNRESET - -#undef EAFNOSUPPORT -#define EAFNOSUPPORT WSAEAFNOSUPPORT +#include "errno2.h" #ifndef PERL_FD_SETSIZE #define PERL_FD_SETSIZE 64 diff --git a/Master/tlpkg/tlperl/lib/CORE/thread.h b/Master/tlpkg/tlperl/lib/CORE/thread.h index 03965c8b52f..43932fbb3b3 100644 --- a/Master/tlpkg/tlperl/lib/CORE/thread.h +++ b/Master/tlpkg/tlperl/lib/CORE/thread.h @@ -91,10 +91,6 @@ # endif #endif -#ifdef DGUX -# define THREAD_CREATE_NEEDS_STACK (32*1024) -#endif - #ifdef __VMS /* Default is 1024 on VAX, 8192 otherwise */ # ifdef __ia64 @@ -340,7 +336,7 @@ # define ALLOC_THREAD_KEY \ STMT_START { \ if (pthread_key_create(&PL_thr_key, 0)) { \ - write(2, STR_WITH_LEN("panic: pthread_key_create failed\n")); \ + PERL_UNUSED_RESULT(write(2, STR_WITH_LEN("panic: pthread_key_create failed\n"))); \ exit(1); \ } \ } STMT_END diff --git a/Master/tlpkg/tlperl/lib/CORE/time64.h b/Master/tlpkg/tlperl/lib/CORE/time64.h index 07bb33fd849..b7306d01fb4 100644 --- a/Master/tlpkg/tlperl/lib/CORE/time64.h +++ b/Master/tlpkg/tlperl/lib/CORE/time64.h @@ -28,11 +28,14 @@ struct TM64 { #endif #ifdef HAS_TM_TM_ZONE -# ifdef __GLIBC__ - const char *tm_zone; -# else - char *tm_zone; +/* If glibc is defined or we are on QNX, use const. + * Otherwise, if we are on android, use const but + * not with g++. + */ +# if defined(__GLIBC__) || (defined(__ANDROID__) && !defined(__cplusplus)) || defined(__QNX__) + const # endif + char *tm_zone; #endif }; diff --git a/Master/tlpkg/tlperl/lib/CORE/uconfig.h b/Master/tlpkg/tlperl/lib/CORE/uconfig.h index 82664c47a48..e5cca088d84 100644 --- a/Master/tlpkg/tlperl/lib/CORE/uconfig.h +++ b/Master/tlpkg/tlperl/lib/CORE/uconfig.h @@ -703,12 +703,6 @@ */ /*#define I_NETINET_IN / **/ -/* I_SFIO: - * This symbol, if defined, indicates to the C program that it should - * include . - */ -/*#define I_SFIO / **/ - /* I_STDDEF: * This symbol, if defined, indicates that exists and should * be included. @@ -811,26 +805,6 @@ */ /*#define I_SYS_WAIT / **/ -/* I_TERMIO: - * This symbol, if defined, indicates that the program should include - * rather than . There are also differences in - * the ioctl() calls that depend on the value of this symbol. - */ -/* I_TERMIOS: - * This symbol, if defined, indicates that the program should include - * the POSIX termios.h rather than sgtty.h or termio.h. - * There are also differences in the ioctl() calls that depend on the - * value of this symbol. - */ -/* I_SGTTY: - * This symbol, if defined, indicates that the program should include - * rather than . There are also differences in - * the ioctl() calls that depend on the value of this symbol. - */ -/*#define I_TERMIO / **/ -/*#define I_TERMIOS / **/ -/*#define I_SGTTY / **/ - /* I_UNISTD: * This symbol, if defined, indicates to the C program that it should * include . @@ -892,18 +866,6 @@ #define OSNAME "unknown" /**/ #define OSVERS "unknown" /**/ -/* USE_CROSS_COMPILE: - * This symbol, if defined, indicates that Perl is being cross-compiled. - */ -/* PERL_TARGETARCH: - * This symbol, if defined, indicates the target architecture - * Perl has been cross-compiled to. Undefined if not a cross-compile. - */ -#ifndef USE_CROSS_COMPILE -/*#define USE_CROSS_COMPILE / **/ -#define PERL_TARGETARCH "" /**/ -#endif - /* MULTIARCH: * This symbol, if defined, signifies that the build * process will produce some binary files that are going to be @@ -934,8 +896,8 @@ * This symbol contains the ~name expanded version of ARCHLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -/*#define ARCHLIB "/usr/local/lib/perl5/5.18/unknown" / **/ -/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.18/unknown" / **/ +/*#define ARCHLIB "/usr/local/lib/perl5/5.20/unknown" / **/ +/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.20/unknown" / **/ /* ARCHNAME: * This symbol holds a string representing the architecture name. @@ -993,7 +955,7 @@ * so the default case (for NeXT) is big endian to catch them. * This might matter for NeXT 3.0. */ -#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH) +#if defined(MULTIARCH) # ifdef __LITTLE_ENDIAN__ # if LONGSIZE == 4 # define BYTEORDER 0x1234 @@ -3045,8 +3007,8 @@ * This symbol contains the ~name expanded version of PRIVLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define PRIVLIB "/usr/local/lib/perl5/5.18" /**/ -#define PRIVLIB_EXP "/usr/local/lib/perl5/5.18" /**/ +#define PRIVLIB "/usr/local/lib/perl5/5.20" /**/ +#define PRIVLIB_EXP "/usr/local/lib/perl5/5.20" /**/ /* CAN_PROTOTYPE: * If defined, this macro indicates that the C compiler can handle @@ -3112,9 +3074,9 @@ * function used to generate normalized random numbers. * Values include 15, 16, 31, and 48. */ -#define Drand01() ((rand() & 0x7FFF) / (double) ((unsigned long)1 << 15)) /**/ -#define Rand_seed_t int /**/ -#define seedDrand01(x) srand((Rand_seed_t)x) /**/ +#define Drand01() Perl_drand48() /**/ +#define Rand_seed_t U32 /**/ +#define seedDrand01(x) Perl_drand48_init((Rand_seed_t)x) /**/ #define RANDBITS 48 /**/ /* Select_fd_set_t: @@ -3189,8 +3151,8 @@ * This symbol contains the ~name expanded version of SITEARCH, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -/*#define SITEARCH "/usr/local/lib/perl5/5.18/unknown" / **/ -/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.18/unknown" / **/ +/*#define SITEARCH "/usr/local/lib/perl5/5.20/unknown" / **/ +/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.20/unknown" / **/ /* SITELIB: * This symbol contains the name of the private library for this package. @@ -3212,8 +3174,8 @@ * removed. The elements in inc_version_list (inc_version_list.U) can * be tacked onto this variable to generate a list of directories to search. */ -#define SITELIB "/usr/local/lib/perl5/5.18" /**/ -#define SITELIB_EXP "/usr/local/lib/perl5/5.18" /**/ +#define SITELIB "/usr/local/lib/perl5/5.20" /**/ +#define SITELIB_EXP "/usr/local/lib/perl5/5.20" /**/ #define SITELIB_STEM "/usr/local/lib/perl5" /**/ /* Size_t_size: @@ -3330,29 +3292,36 @@ /*#define PERL_VENDORLIB_EXP "" / **/ /*#define PERL_VENDORLIB_STEM "" / **/ -/* VOIDFLAGS: - * This symbol indicates how much support of the void type is given by this - * compiler. What various bits mean: - * - * 1 = supports declaration of void - * 2 = supports arrays of pointers to functions returning void - * 4 = supports comparisons between pointers to void functions and - * addresses of void functions - * 8 = supports declaration of generic void pointers - * - * The package designer should define VOIDUSED to indicate the requirements - * of the package. This can be done either by #defining VOIDUSED before - * including config.h, or by defining defvoidused in Myinit.U. If the - * latter approach is taken, only those flags will be tested. If the - * level of void support necessary is not present, defines void to int. - */ -#ifndef VOIDUSED -#define VOIDUSED 1 -#endif -#define VOIDFLAGS 1 -#if (VOIDFLAGS & VOIDUSED) != VOIDUSED -#define void int /* is void to be avoided? */ -#define M_VOID /* Xenix strikes again */ +/* I_TERMIO: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/* I_TERMIOS: + * This symbol, if defined, indicates that the program should include + * the POSIX termios.h rather than sgtty.h or termio.h. + * There are also differences in the ioctl() calls that depend on the + * value of this symbol. + */ +/* I_SGTTY: + * This symbol, if defined, indicates that the program should include + * rather than . There are also differences in + * the ioctl() calls that depend on the value of this symbol. + */ +/*#define I_TERMIO / **/ +/*#define I_TERMIOS / **/ +/*#define I_SGTTY / **/ + +/* USE_CROSS_COMPILE: + * This symbol, if defined, indicates that Perl is being cross-compiled. + */ +/* PERL_TARGETARCH: + * This symbol, if defined, indicates the target architecture + * Perl has been cross-compiled to. Undefined if not a cross-compile. + */ +#ifndef USE_CROSS_COMPILE +/*#define USE_CROSS_COMPILE / **/ +#define PERL_TARGETARCH "" /**/ #endif /* PERL_USE_DEVEL: @@ -3917,12 +3886,6 @@ */ /*#define HAS_SETPROCTITLE / **/ -/* USE_SFIO: - * This symbol, if defined, indicates that sfio should - * be used. - */ -/*#define USE_SFIO / **/ - /* HAS_SIGNBIT: * This symbol, if defined, indicates that the signbit routine is * available to check if the given number has the sign bit set. @@ -4188,8 +4151,10 @@ /*#define USE_DYNAMIC_LOADING / **/ /* FFLUSH_NULL: - * This symbol, if defined, tells that fflush(NULL) does flush - * all pending stdio output. + * This symbol, if defined, tells that fflush(NULL) correctly + * flushes all pending stdio output without side effects. In + * particular, on some platforms calling fflush(NULL) *still* + * corrupts STDIN if it is a pipe. */ /* FFLUSH_ALL: * This symbol, if defined, tells that to flush @@ -4753,6 +4718,6 @@ #endif /* Generated from: - * 2c9dc3f21d37b1665f6a59dfc6d79e6cb08bdf36a9c3e427d11d6b9ddffe2439 config_h.SH - * 26ab9b4aa382d32761cb91084ba59e7e4b190799502a43366ccb3d2f584783ca uconfig.sh + * 7557e985de18f71e80f627226b454bc8eaf20477dcf0c45b5b2c51ec792f5c89 config_h.SH + * dbc8d38ba52ae23e5423418bb3f56b1b6fcdaa82cf71ba0be3463e8221bfe0c0 uconfig.sh * ex: set ro: */ diff --git a/Master/tlpkg/tlperl/lib/CORE/unicode_constants.h b/Master/tlpkg/tlperl/lib/CORE/unicode_constants.h index 19f3acd33f9..2ae9d77646e 100755 --- a/Master/tlpkg/tlperl/lib/CORE/unicode_constants.h +++ b/Master/tlpkg/tlperl/lib/CORE/unicode_constants.h @@ -20,19 +20,26 @@ * "_TAIL" if instead it represents all but the first byte. This, and * with no additional suffix are both string constants */ +#define LATIN_SMALL_LETTER_LONG_S_UTF8 "\xC5\xBF" /* U+017F */ #define COMBINING_GRAVE_ACCENT_UTF8 "\xCC\x80" /* U+0300 */ -#define COMBINING_ACUTE_ACCENT_UTF8 "\xCC\x81" /* U+0301 */ -#define COMBINING_DIAERESIS_UTF8 "\xCC\x88" /* U+0308 */ -#define GREEK_SMALL_LETTER_IOTA_UTF8 "\xCE\xB9" /* U+03B9 */ +#define GREEK_CAPITAL_LETTER_IOTA_UTF8 "\xCE\x99" /* U+0399 */ +#define GREEK_SMALL_LETTER_MU_UTF8 "\xCE\xBC" /* U+03BC */ -#define GREEK_SMALL_LETTER_UPSILON_UTF8 "\xCF\x85" /* U+03C5 */ +#define LATIN_CAPITAL_LETTER_SHARP_S_UTF8 "\xE1\xBA\x9E" /* U+1E9E */ + +#define LATIN_SMALL_LIGATURE_LONG_S_T_UTF8 "\xEF\xAC\x85" /* U+FB05 */ +#define LATIN_SMALL_LIGATURE_ST_UTF8 "\xEF\xAC\x86" /* U+FB06 */ #define HYPHEN_UTF8 "\xE2\x80\x90" /* U+2010 */ #define FIRST_SURROGATE_UTF8_FIRST_BYTE 0xED /* U+D800 */ +#define BOM_UTF8_FIRST_BYTE 0xEF /* U+FEFF */ +#define BOM_UTF8_TAIL "\xBB\xBF" /* U+FEFF */ #define DEL_NATIVE 0x7F /* U+007F */ +#define CR_NATIVE 0x0D /* U+000D */ +#define LF_NATIVE 0x0A /* U+000A */ #define LATIN_SMALL_LETTER_SHARP_S_NATIVE 0xDF /* U+00DF */ #define LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_NATIVE 0xE5 /* U+00E5 */ #define LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_NATIVE 0xC5 /* U+00C5 */ diff --git a/Master/tlpkg/tlperl/lib/CORE/utf8.h b/Master/tlpkg/tlperl/lib/CORE/utf8.h index 01d8f5fa204..f0e9d56966a 100644 --- a/Master/tlpkg/tlperl/lib/CORE/utf8.h +++ b/Master/tlpkg/tlperl/lib/CORE/utf8.h @@ -26,6 +26,9 @@ # define USE_UTF8_IN_NAMES (PL_hints & HINT_UTF8) #endif +#include "regcharclass.h" +#include "unicode_constants.h" + /* For to_utf8_fold_flags, q.v. */ #define FOLD_FLAGS_LOCALE 0x1 #define FOLD_FLAGS_FULL 0x2 @@ -36,21 +39,26 @@ #define _CORE_SWASH_INIT_RETURN_IF_UNDEF 0x2 #define _CORE_SWASH_INIT_ACCEPT_INVLIST 0x4 +#define uvchr_to_utf8(a,b) uvchr_to_utf8_flags(a,b,0) +#define uvchr_to_utf8_flags(d,uv,flags) \ + uvoffuni_to_utf8_flags(d,NATIVE_TO_UNI(uv),flags) +#define utf8_to_uvchr_buf(s, e, lenp) \ + utf8n_to_uvchr(s, (U8*)(e) - (U8*)(s), lenp, \ + ckWARN_d(WARN_UTF8) ? 0 : UTF8_ALLOW_ANY) + #define to_uni_fold(c, p, lenp) _to_uni_fold_flags(c, p, lenp, FOLD_FLAGS_FULL) -#define to_utf8_fold(c, p, lenp) _to_utf8_fold_flags(c, p, lenp, \ - FOLD_FLAGS_FULL, NULL) -#define to_utf8_lower(a,b,c) _to_utf8_lower_flags(a,b,c,0, NULL) -#define to_utf8_upper(a,b,c) _to_utf8_upper_flags(a,b,c,0, NULL) -#define to_utf8_title(a,b,c) _to_utf8_title_flags(a,b,c,0, NULL) +#define to_utf8_fold(c, p, lenp) _to_utf8_fold_flags(c, p, lenp, FOLD_FLAGS_FULL) +#define to_utf8_lower(a,b,c) _to_utf8_lower_flags(a,b,c,0) +#define to_utf8_upper(a,b,c) _to_utf8_upper_flags(a,b,c,0) +#define to_utf8_title(a,b,c) _to_utf8_title_flags(a,b,c,0) /* Source backward compatibility. */ -#define uvuni_to_utf8(d, uv) uvuni_to_utf8_flags(d, uv, 0) #define is_utf8_string_loc(s, len, ep) is_utf8_string_loclen(s, len, ep, 0) #define foldEQ_utf8(s1, pe1, l1, u1, s2, pe2, l2, u2) \ foldEQ_utf8_flags(s1, pe1, l1, u1, s2, pe2, l2, u2, 0) -#define FOLDEQ_UTF8_NOMIX_ASCII (1 << 0) -#define FOLDEQ_UTF8_LOCALE (1 << 1) +#define FOLDEQ_UTF8_NOMIX_ASCII (1 << 0) +#define FOLDEQ_LOCALE (1 << 1) #define FOLDEQ_S1_ALREADY_FOLDED (1 << 2) #define FOLDEQ_S2_ALREADY_FOLDED (1 << 3) @@ -102,28 +110,23 @@ EXTCONST unsigned char PL_utf8skip[]; END_EXTERN_C -#include "regcharclass.h" -#include "unicode_constants.h" +/* Native character to/from iso-8859-1. Are the identity functions on ASCII + * platforms */ +#define NATIVE_TO_LATIN1(ch) (ch) +#define LATIN1_TO_NATIVE(ch) (ch) + +/* I8 is an intermediate version of UTF-8 used only in UTF-EBCDIC. We thus + * consider it to be identical to UTF-8 on ASCII platforms. Strictly speaking + * UTF-8 and UTF-EBCDIC are two different things, but we often conflate them + * because they are 8-bit encodings that serve the same purpose in Perl, and + * rarely do we need to distinguish them. The term "NATIVE_UTF8" applies to + * whichever one is applicable on the current platform */ +#define NATIVE_UTF8_TO_I8(ch) (ch) +#define I8_TO_NATIVE_UTF8(ch) (ch) -/* Native character to iso-8859-1 */ -#define NATIVE_TO_ASCII(ch) (ch) -#define ASCII_TO_NATIVE(ch) (ch) -/* Transform after encoding */ -#define NATIVE_TO_UTF(ch) (ch) -#define NATIVE_TO_I8(ch) NATIVE_TO_UTF(ch) /* a clearer synonym */ -#define UTF_TO_NATIVE(ch) (ch) -#define I8_TO_NATIVE(ch) UTF_TO_NATIVE(ch) /* Transforms in wide UV chars */ #define UNI_TO_NATIVE(ch) (ch) #define NATIVE_TO_UNI(ch) (ch) -/* Transforms in invariant space */ -#define NATIVE_TO_NEED(enc,ch) (ch) -#define ASCII_TO_NEED(enc,ch) (ch) - -/* As there are no translations, avoid the function wrapper */ -#define utf8n_to_uvchr utf8n_to_uvuni -#define valid_utf8_to_uvchr valid_utf8_to_uvuni -#define uvchr_to_utf8 uvuni_to_utf8 /* @@ -201,12 +204,12 @@ Perl's extended UTF-8 means we can have start bytes up to FF. /* This defines the 1-bits that are to be in the first byte of a multi-byte * UTF-8 encoded character that give the number of bytes that comprise the - * character. - * */ -#define UTF_START_MARK(len) (((len) > 7) ? 0xFF : (0xFE << (7-(len)))) + * character. 'len' is the number of bytes in the multi-byte sequence. */ +#define UTF_START_MARK(len) (((len) > 7) ? 0xFF : (0xFF & (0xFE << (7-(len))))) /* Masks out the initial one bits in a start byte, leaving the real data ones. - * Doesn't work on an invariant byte */ + * Doesn't work on an invariant byte. 'len' is the number of bytes in the + * multi-byte sequence that comprises the character. */ #define UTF_START_MASK(len) (((len) >= 7) ? 0x00 : (0x1F >> ((len)-2))) /* This defines the bits that are to be in the continuation bytes of a multi-byte @@ -229,8 +232,11 @@ Perl's extended UTF-8 means we can have start bytes up to FF. (((UV) UTF_CONTINUATION_MASK) << ((sizeof(UV) * CHARBITS) \ - UTF_ACCUMULATION_SHIFT)) -#ifdef HAS_QUAD -#define UNISKIP(uv) ( (uv) < 0x80 ? 1 : \ +#if UVSIZE >= 8 +# define UTF8_QUAD_MAX UINT64_C(0x1000000000) + +/* Input is a true Unicode (not-native) code point */ +#define OFFUNISKIP(uv) ( (uv) < 0x80 ? 1 : \ (uv) < 0x800 ? 2 : \ (uv) < 0x10000 ? 3 : \ (uv) < 0x200000 ? 4 : \ @@ -239,7 +245,7 @@ Perl's extended UTF-8 means we can have start bytes up to FF. (uv) < UTF8_QUAD_MAX ? 7 : 13 ) #else /* No, I'm not even going to *TRY* putting #ifdef inside a #define */ -#define UNISKIP(uv) ( (uv) < 0x80 ? 1 : \ +#define OFFUNISKIP(uv) ( (uv) < 0x80 ? 1 : \ (uv) < 0x800 ? 2 : \ (uv) < 0x10000 ? 3 : \ (uv) < 0x200000 ? 4 : \ @@ -264,6 +270,8 @@ Perl's extended UTF-8 means we can have start bytes up to FF. #error UTF8_MAXBYTES must be at least 12 #endif +#define MAX_UTF8_TWO_BYTE 0x7FF + #define UTF8_MAXBYTES_CASE UTF8_MAXBYTES #endif /* EBCDIC vs ASCII */ @@ -273,27 +281,53 @@ Perl's extended UTF-8 means we can have start bytes up to FF. * this level; the macros that some of these call may have different * definitions in the two encodings */ -#define NATIVE8_TO_UNI(ch) NATIVE_TO_ASCII(ch) /* a clearer synonym */ +/* In domain restricted to ASCII, these may make more sense to the reader than + * the ones with Latin1 in the name */ +#define NATIVE_TO_ASCII(ch) NATIVE_TO_LATIN1(ch) +#define ASCII_TO_NATIVE(ch) LATIN1_TO_NATIVE(ch) + +/* More or less misleadingly-named defines, retained for back compat */ +#define NATIVE_TO_UTF(ch) NATIVE_UTF8_TO_I8(ch) +#define NATIVE_TO_I8(ch) NATIVE_UTF8_TO_I8(ch) +#define UTF_TO_NATIVE(ch) I8_TO_NATIVE_UTF8(ch) +#define I8_TO_NATIVE(ch) I8_TO_NATIVE_UTF8(ch) +#define NATIVE8_TO_UNI(ch) NATIVE_TO_LATIN1(ch) /* Adds a UTF8 continuation byte 'new' of information to a running total code * point 'old' of all the continuation bytes so far. This is designed to be - * used in a loop to convert from UTF-8 to the code point represented */ -#define UTF8_ACCUMULATE(old, new) (((old) << UTF_ACCUMULATION_SHIFT) \ - | (((U8)new) & UTF_CONTINUATION_MASK)) + * used in a loop to convert from UTF-8 to the code point represented. Note + * that this is asymmetric on EBCDIC platforms, in that the 'new' parameter is + * the UTF-EBCDIC byte, whereas the 'old' parameter is a Unicode (not EBCDIC) + * code point in process of being generated */ +#define UTF8_ACCUMULATE(old, new) (((old) << UTF_ACCUMULATION_SHIFT) \ + | ((NATIVE_UTF8_TO_I8((U8)new)) \ + & UTF_CONTINUATION_MASK)) /* This works in the face of malformed UTF-8. */ #define UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, e) (UTF8_IS_DOWNGRADEABLE_START(*s) \ && ( (e) - (s) > 1) \ && UTF8_IS_CONTINUATION(*((s)+1))) -/* Convert a two (not one) byte utf8 character to a unicode code point value. +/* Number of bytes a code point occupies in UTF-8. */ +#define NATIVE_SKIP(uv) OFFUNISKIP(NATIVE_TO_UNI(uv)) + +/* Most code which says UNISKIP is really thinking in terms of native code + * points (0-255) plus all those beyond. This is an imprecise term, but having + * it means existing code continues to work. For precision, use NATIVE_SKIP + * and OFFUNISKIP */ +#define UNISKIP(uv) NATIVE_SKIP(uv) + +/* Convert a two (not one) byte utf8 character to a native code point value. * Needs just one iteration of accumulate. Should not be used unless it is * known that the two bytes are legal: 1) two-byte start, and 2) continuation. * Note that the result can be larger than 255 if the input character is not * downgradable */ -#define TWO_BYTE_UTF8_TO_UNI(HI, LO) \ - UTF8_ACCUMULATE((NATIVE_TO_UTF(HI) & UTF_START_MASK(2)), \ - NATIVE_TO_UTF(LO)) +#define TWO_BYTE_UTF8_TO_NATIVE(HI, LO) \ + UNI_TO_NATIVE(UTF8_ACCUMULATE((NATIVE_UTF8_TO_I8(HI) & UTF_START_MASK(2)), \ + (LO))) + +/* Should never be used, and be deprecated */ +#define TWO_BYTE_UTF8_TO_UNI(HI, LO) NATIVE_TO_UNI(TWO_BYTE_UTF8_TO_NATIVE(HI, LO)) /* How many bytes in the UTF-8 encoded character whose first (perhaps only) * byte is pointed to by 's' */ @@ -303,27 +337,63 @@ Perl's extended UTF-8 means we can have start bytes up to FF. * works on both UTF-8 encoded strings and non-encoded, as it returns TRUE in * each for the exact same set of bit patterns. (And it works on any byte in a * UTF-8 encoded string) */ -#define UTF8_IS_INVARIANT(c) UNI_IS_INVARIANT(NATIVE_TO_UTF(c)) +#define UTF8_IS_INVARIANT(c) UNI_IS_INVARIANT(NATIVE_UTF8_TO_I8(c)) -#define NATIVE_IS_INVARIANT(c) UNI_IS_INVARIANT(NATIVE8_TO_UNI(c)) +/* Like the above, but its name implies a non-UTF8 input, and is implemented + * differently (for no particular reason) */ +#define NATIVE_BYTE_IS_INVARIANT(c) UNI_IS_INVARIANT(NATIVE_TO_LATIN1(c)) -#define MAX_PORTABLE_UTF8_TWO_BYTE 0x3FF /* constrained by EBCDIC */ - -/* The macros in the next sets are used to generate the two utf8 or utfebcdic - * bytes from an ordinal that is known to fit into two bytes; it must be less - * than 0x3FF to work across both encodings. */ -/* Nocast allows these to be used in the case label of a switch statement */ -#define UTF8_TWO_BYTE_HI_nocast(c) NATIVE_TO_I8(((c) \ - >> UTF_ACCUMULATION_SHIFT) | (0xFF & UTF_START_MARK(2))) -#define UTF8_TWO_BYTE_LO_nocast(c) NATIVE_TO_I8(((c) & UTF_CONTINUATION_MASK) \ - | UTF_CONTINUATION_MARK) +/* Like the above, but accepts any UV as input */ +#define UVCHR_IS_INVARIANT(uv) UNI_IS_INVARIANT(NATIVE_TO_UNI(uv)) -#define UTF8_TWO_BYTE_HI(c) ((U8) (UTF8_TWO_BYTE_HI_nocast(c))) -#define UTF8_TWO_BYTE_LO(c) ((U8) (UTF8_TWO_BYTE_LO_nocast(c))) +#define MAX_PORTABLE_UTF8_TWO_BYTE 0x3FF /* constrained by EBCDIC */ -/* This name is used when the source is a single byte */ -#define UTF8_EIGHT_BIT_HI(c) UTF8_TWO_BYTE_HI((U8)(c)) -#define UTF8_EIGHT_BIT_LO(c) UTF8_TWO_BYTE_LO((U8)(c)) +/* The macros in the next 4 sets are used to generate the two utf8 or utfebcdic + * bytes from an ordinal that is known to fit into exactly two (not one) bytes; + * it must be less than 0x3FF to work across both encodings. */ + +/* These two are helper macros for the other three sets, and should not be used + * directly anywhere else. 'translate_function' is either NATIVE_TO_LATIN1 + * (which works for code points up to 0xFF) or NATIVE_TO_UNI which works for any + * code point */ +#define __BASE_TWO_BYTE_HI(c, translate_function) \ + I8_TO_NATIVE_UTF8((translate_function(c) >> UTF_ACCUMULATION_SHIFT) \ + | UTF_START_MARK(2)) +#define __BASE_TWO_BYTE_LO(c, translate_function) \ + I8_TO_NATIVE_UTF8((translate_function(c) & UTF_CONTINUATION_MASK) \ + | UTF_CONTINUATION_MARK) + +/* The next two macros should not be used. They were designed to be usable as + * the case label of a switch statement, but this doesn't work for EBCDIC. Use + * regen/unicode_constants.pl instead */ +#define UTF8_TWO_BYTE_HI_nocast(c) __BASE_TWO_BYTE_HI(c, NATIVE_TO_UNI) +#define UTF8_TWO_BYTE_LO_nocast(c) __BASE_TWO_BYTE_LO(c, NATIVE_TO_UNI) + +/* The next two macros are used when the source should be a single byte + * character; checked for under DEBUGGING */ +#define UTF8_EIGHT_BIT_HI(c) (__ASSERT_(FITS_IN_8_BITS(c)) \ + ((U8) __BASE_TWO_BYTE_HI(c, NATIVE_TO_LATIN1))) +#define UTF8_EIGHT_BIT_LO(c) (__ASSERT_(FITS_IN_8_BITS(c)) \ + ((U8) __BASE_TWO_BYTE_LO(c, NATIVE_TO_LATIN1))) + +/* These final two macros in the series are used when the source can be any + * code point whose UTF-8 is known to occupy 2 bytes; they are less efficient + * than the EIGHT_BIT versions on EBCDIC platforms. We use the logical '~' + * operator instead of "<=" to avoid getting compiler warnings. + * MAX_PORTABLE_UTF8_TWO_BYTE should be exactly all one bits in the lower few + * places, so the ~ works */ +#define UTF8_TWO_BYTE_HI(c) \ + (__ASSERT_((sizeof(c) == 1) \ + || !(((WIDEST_UTYPE)(c)) & ~MAX_PORTABLE_UTF8_TWO_BYTE)) \ + ((U8) __BASE_TWO_BYTE_HI(c, NATIVE_TO_LATIN1))) +#define UTF8_TWO_BYTE_LO(c) \ + (__ASSERT_((sizeof(c) == 1) \ + || !(((WIDEST_UTYPE)(c)) & ~MAX_PORTABLE_UTF8_TWO_BYTE)) \ + ((U8) __BASE_TWO_BYTE_LO(c, NATIVE_TO_LATIN1))) + +/* This is illegal in any well-formed UTF-8 in both EBCDIC and ASCII + * as it is only in overlongs. */ +#define ILLEGAL_UTF8_BYTE I8_TO_NATIVE_UTF8(0xC1) /* * 'UTF' is whether or not p is encoded in UTF8. The names 'foo_lazy_if' stem @@ -376,7 +446,9 @@ Perl's extended UTF-8 means we can have start bytes up to FF. #define UTF8_WARN_SUPER 0x0400 /* points above the legal max */ /* Code points which never were part of the original UTF-8 standard, the first - * byte of which is a FE or FF on ASCII platforms. */ + * byte of which is a FE or FF on ASCII platforms. If the first byte is FF, it + * will overflow a 32-bit word. If the first byte is FE, it will overflow a + * signed 32-bit word. */ #define UTF8_DISALLOW_FE_FF 0x0800 #define UTF8_WARN_FE_FF 0x1000 @@ -415,9 +487,9 @@ Perl's extended UTF-8 means we can have start bytes up to FF. * U+110001: \xF4\x90\x80\x81 \xF9\xA2\xA0\xA0\xA1 */ #ifdef EBCDIC /* Both versions assume well-formed UTF8 */ -# define UTF8_IS_SUPER(s) (NATIVE_TO_I8(* (U8*) (s)) >= 0xF9 \ - && (NATIVE_TO_I8(* (U8*) (s)) > 0xF9 \ - || (NATIVE_TO_I8(* (U8*) ((s)) + 1 >= 0xA2)))) +# define UTF8_IS_SUPER(s) (NATIVE_UTF8_TO_I8(* (U8*) (s)) >= 0xF9 \ + && (NATIVE_UTF8_TO_I8(* (U8*) (s)) > 0xF9 \ + || (NATIVE_UTF8_TO_I8(* ((U8*) (s) + 1)) >= 0xA2))) #else # define UTF8_IS_SUPER(s) (*(U8*) (s) >= 0xF4 \ && (*(U8*) (s) > 0xF4 || (*((U8*) (s) + 1) >= 0x90))) @@ -471,10 +543,6 @@ Perl's extended UTF-8 means we can have start bytes up to FF. #define UNICODE_IS_SUPER(c) ((c) > PERL_UNICODE_MAX) #define UNICODE_IS_FE_FF(c) ((c) > 0x7FFFFFFF) -#ifdef HAS_QUAD -# define UTF8_QUAD_MAX UINT64_C(0x1000000000) -#endif - #define LATIN_SMALL_LETTER_SHARP_S LATIN_SMALL_LETTER_SHARP_S_NATIVE #define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS \ LATIN_SMALL_LETTER_Y_WITH_DIAERESIS_NATIVE @@ -487,12 +555,15 @@ Perl's extended UTF-8 means we can have start bytes up to FF. #define UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA 0x03C2 #define UNICODE_GREEK_SMALL_LETTER_SIGMA 0x03C3 #define GREEK_SMALL_LETTER_MU 0x03BC -#define GREEK_CAPITAL_LETTER_MU 0x039C /* Upper and title case of MICRON */ -#define LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS 0x0178 /* Also is title case */ -#define LATIN_CAPITAL_LETTER_SHARP_S 0x1E9E -#define LATIN_SMALL_LETTER_LONG_S 0x017F -#define KELVIN_SIGN 0x212A -#define ANGSTROM_SIGN 0x212B +#define GREEK_CAPITAL_LETTER_MU 0x039C /* Upper and title case + of MICRON */ +#define LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS 0x0178 /* Also is title case */ +#define LATIN_CAPITAL_LETTER_SHARP_S 0x1E9E +#define LATIN_SMALL_LETTER_LONG_S 0x017F +#define LATIN_SMALL_LIGATURE_LONG_S_T 0xFB05 +#define LATIN_SMALL_LIGATURE_ST 0xFB06 +#define KELVIN_SIGN 0x212A +#define ANGSTROM_SIGN 0x212B #define UNI_DISPLAY_ISPRINT 0x0001 #define UNI_DISPLAY_BACKSLASH 0x0002 @@ -504,8 +575,8 @@ Perl's extended UTF-8 means we can have start bytes up to FF. (ANYOF_NONBITMAP(node)) && \ (ANYOF_FLAGS(node) & ANYOF_LOC_NONBITMAP_FOLD) && \ ((end) > (input) + 1) && \ - toLOWER((input)[0]) == 's' && \ - toLOWER((input)[1]) == 's') + toFOLD((input)[0]) == 's' && \ + toFOLD((input)[1]) == 's') #define SHARP_S_SKIP 2 /* If you want to exclude surrogates, and beyond legal Unicode, see the blame diff --git a/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h b/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h index e7f5f32c69f..54a3d2696e9 100644 --- a/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h +++ b/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h @@ -43,7 +43,7 @@ * first byte of the final form of a variant will always have its upper * bit set (at least in the encodings that Perl recognizes, and probably * all). But note that the upper bit of some invariants is also 1. - * + * * If you're starting from Unicode, skip step 1. For UTF-EBCDIC to straight * EBCDIC, reverse the steps. * @@ -51,19 +51,19 @@ * equivalents have ordinal numbers less than 160, that is the same characters * that are expressible in ASCII, plus the C1 controls. So there are 160 * invariants instead of the 128 in UTF-8. (My guess is that this is because - * the C1 control NEL (and maybe others) is important in IBM.) + * the C1 control NEL (and maybe others) is important in IBM.) * * The purpose of Step 3 is to make the encoding be invariant for the chosen * characters. This messes up the convenient patterns found in step 2, so * generally, one has to undo step 3 into a temporary to use them. However, * a "shadow", or parallel table, PL_utf8skip, has been constructed so that for - * each byte, it says how long the sequence is if that byte were to begin it + * each byte, it says how long the sequence is if that byte were to begin it * * There are actually 3 slightly different UTF-EBCDIC encodings in this file, * one for each of the code pages recognized by Perl. That means that there * are actually three different sets of tables, one for each code page. (If * Perl is compiled on platforms using another EBCDIC code page, it may not - * compile, or Perl may silently mistake it for one of the three.) + * compile, or Perl may silently mistake it for one of the three.) * * EBCDIC characters above 0xFF are the same as Unicode in Perl's * implementation of all 3 encodings, so for those Step 1 is trivial. @@ -85,7 +85,7 @@ START_EXTERN_C as length 1 here so that we can recover. */ #if '^' == 95 /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */ -EXTCONST unsigned char PL_utf8skip[] = { +EXTCONST U8 PL_utf8skip[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -106,7 +106,7 @@ EXTCONST unsigned char PL_utf8skip[] = { #endif #if '^' == 106 /* if defined(_OSD_POSIX) POSIX-BC */ -unsigned char PL_utf8skip[] = { +U8 PL_utf8skip[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -127,7 +127,7 @@ unsigned char PL_utf8skip[] = { #endif #if '^' == 176 /* if defined(??) (OS/400?) 037 */ -unsigned char PL_utf8skip[] = { +U8 PL_utf8skip[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -152,7 +152,7 @@ unsigned char PL_utf8skip[] = { * remains 'A' */ #if '^' == 95 /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */ -EXTCONST unsigned char PL_utf2e[] = { /* I8 to UTFEBCDIC (IBM-1047) */ +EXTCONST U8 PL_utf2e[] = { /* I8 to UTFEBCDIC (IBM-1047) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, @@ -171,7 +171,7 @@ EXTCONST unsigned char PL_utf2e[] = { /* I8 to UTFEBCDIC (IBM-1047) */ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }; -EXTCONST unsigned char PL_e2utf[] = { /* UTFEBCDIC (IBM-1047) to I8 */ +EXTCONST U8 PL_e2utf[] = { /* UTFEBCDIC (IBM-1047) to I8 */ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, @@ -192,7 +192,7 @@ EXTCONST unsigned char PL_e2utf[] = { /* UTFEBCDIC (IBM-1047) to I8 */ #endif /* 1047 */ #if '^' == 106 /* if defined(_OSD_POSIX) POSIX-BC */ -unsigned char PL_utf2e[] = { /* I8 to UTFEBCDIC (POSIX-BC) */ +U8 PL_utf2e[] = { /* I8 to UTFEBCDIC (POSIX-BC) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, @@ -211,7 +211,7 @@ unsigned char PL_utf2e[] = { /* I8 to UTFEBCDIC (POSIX-BC) */ 0xDC, 0xC0, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xDD, 0xFC, 0xE0, 0xFE }; -unsigned char PL_e2utf[] = { /* UTFEBCDIC (POSIX-BC) to I8 */ +U8 PL_e2utf[] = { /* UTFEBCDIC (POSIX-BC) to I8 */ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, @@ -232,7 +232,7 @@ unsigned char PL_e2utf[] = { /* UTFEBCDIC (POSIX-BC) to I8 */ #endif /* POSIX-BC */ #if '^' == 176 /* if defined(??) (OS/400?) 037 */ -unsigned char PL_utf2e[] = { /* I8 to UTFEBCDIC (IBM-037) */ +U8 PL_utf2e[] = { /* I8 to UTFEBCDIC (IBM-037) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, @@ -251,7 +251,7 @@ unsigned char PL_utf2e[] = { /* I8 to UTFEBCDIC (IBM-037) */ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE }; -unsigned char PL_e2utf[] = { /* UTFEBCDIC (IBM-037) to I8 */ +U8 PL_e2utf[] = { /* UTFEBCDIC (IBM-037) to I8 */ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, @@ -276,7 +276,7 @@ unsigned char PL_e2utf[] = { /* UTFEBCDIC (IBM-037) to I8 */ */ #if '^' == 95 /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */ -EXTCONST unsigned char PL_a2e[] = { /* ASCII (iso-8859-1) to EBCDIC (IBM-1047) */ +EXTCONST U8 PL_a2e[] = { /* ASCII (iso-8859-1) to EBCDIC (IBM-1047) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, @@ -295,7 +295,7 @@ EXTCONST unsigned char PL_a2e[] = { /* ASCII (iso-8859-1) to EBCDIC (IBM-1047) * 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF }; -EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-1047) to ASCII (iso-8859-1) */ +EXTCONST U8 PL_e2a[] = { /* EBCDIC (IBM-1047) to ASCII (iso-8859-1) */ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, @@ -314,8 +314,47 @@ EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-1047) to ASCII (iso-8859-1) * 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F }; -EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table, 'A' => - 'a'; 'a' => 'A' */ +EXTCONST U8 PL_latin1_lc[] = { /* lowercasing */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x70, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9C, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0x8C, 0xAD, 0x8E, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0x8D, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xEA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xDB, 0xDC, 0xDD, 0xDE, 0xFF +}; + +EXTCONST U8 PL_mod_latin1_uc[] = { /* uppercasing */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0xDF, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x80, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0x8A, 0x8B, 0xAC, 0xBA, 0xAE, 0x8F, + 0x90, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0x9A, 0x9B, 0x9E, 0x9D, 0x9E, 0x9F, + 0xDF, 0xA1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +EXTCONST U8 PL_fold_latin1[] = { /* fast EBCDIC case folding table, + 'A' => 'a'; 'a' => 'A'; full + 0-255 range */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -352,7 +391,7 @@ EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table, 'A' => #endif /* 1047 */ #if '^' == 106 /* if defined(_OSD_POSIX) POSIX-BC */ -EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */ +EXTCONST U8 PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, @@ -371,7 +410,7 @@ EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xC0, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF }; -EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */ +EXTCONST U8 PL_e2a[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, @@ -390,8 +429,47 @@ EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0x7B, 0xDC, 0x7D, 0xDA, 0x7E }; -EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table, 'A' => - 'a'; 'a' => 'A' */ +EXTCONST U8 PL_latin1_lc[] = { /* lowercasing */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x70, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9C, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0x8C, 0x8D, 0x8E, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0xDA, 0xDB, 0xDC, 0xDB, 0xDE, 0xDF, + 0xC0, 0xE1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xEA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xDC, 0xFD, 0xDE, 0xFF +}; + +EXTCONST U8 PL_mod_latin1_uc[] = { /* uppercasing */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0xDF, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x80, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0x8A, 0x8B, 0xAC, 0xAD, 0xAE, 0x8F, + 0x90, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0x9A, 0x9B, 0x9E, 0x9D, 0x9E, 0x9F, + 0xDF, 0xA1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xE0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDD, 0xFC, 0xDD, 0xFE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +EXTCONST U8 PL_fold_latin1[] = { /* fast EBCDIC case folding table, + 'A' => 'a'; 'a' => 'A'; full + 0-255 range */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -428,7 +506,7 @@ EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table, 'A' => #endif /* POSIX-BC */ #if '^' == 176 /* if defined(??) (OS/400?) 037 */ -EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */ +EXTCONST U8 PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F, 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, @@ -447,7 +525,7 @@ EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF }; -EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */ +EXTCONST U8 PL_e2a[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07, @@ -466,8 +544,47 @@ EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F }; -EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table, 'A' => - 'a'; 'a' => 'A' */ +EXTCONST U8 PL_latin1_lc[] = { /* lowercasing */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x70, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9C, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0x8C, 0x8D, 0x8E, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xEA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xDB, 0xDC, 0xDD, 0xDE, 0xFF +}; + +EXTCONST U8 PL_mod_latin1_uc[] = { /* uppercasing */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0xDF, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x80, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0x8A, 0x8B, 0xAC, 0xAD, 0xAE, 0x8F, + 0x90, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0x9A, 0x9B, 0x9E, 0x9D, 0x9E, 0x9F, + 0xDF, 0xA1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +EXTCONST U8 PL_fold_latin1[] = { /* fast EBCDIC case folding table, + 'A' => 'a'; 'a' => 'A'; full + 0-255 range */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -503,38 +620,68 @@ EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table, 'A' => }; #endif /* 037 */ -/* Since the EBCDIC code pages are isomorphic to Latin1, that table is merely a - * duplicate */ -EXTCONST unsigned char * PL_fold_latin1 = PL_fold; +/* This is the same in all code pages, as only A-Z, a-z are affected */ +EXTCONST U8 PL_fold[] = { /* fast EBCDIC case folding table, 'A' => + 'a'; 'a' => 'A' */ + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 138, 139, 140, 141, 142, 143, + 144, 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 154, 155, 156, 157, 158, 159, + 160, 161, 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 202, 203, 204, 205, 206, 207, + 208, 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 218, 219, 220, 221, 222, 223, + 224, 225, 's', 't', 'u', 'v', 'w', 'x', + 'y', 'z', 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255 +}; #else -EXTCONST unsigned char PL_utf8skip[]; -EXTCONST unsigned char PL_e2utf[]; -EXTCONST unsigned char PL_utf2e[]; -EXTCONST unsigned char PL_e2a[]; -EXTCONST unsigned char PL_a2e[]; -EXTCONST unsigned char PL_fold[]; -EXTCONST unsigned char * PL_fold_latin1; +EXTCONST U8 PL_utf8skip[]; +EXTCONST U8 PL_e2utf[]; +EXTCONST U8 PL_utf2e[]; +EXTCONST U8 PL_e2a[]; +EXTCONST U8 PL_a2e[]; +EXTCONST U8 PL_fold[]; +EXTCONST U8 PL_fold_latin1[]; +EXTCONST U8 PL_latin1_lc[]; +EXTCONST U8 PL_mod_latin1_uc[]; #endif END_EXTERN_C /* EBCDIC-happy ways of converting native code to UTF-8 */ -/* Native to iso-8859-1 */ -#define NATIVE_TO_ASCII(ch) PL_e2a[(U8)(ch)] -#define ASCII_TO_NATIVE(ch) PL_a2e[(U8)(ch)] -/* Transform after encoding, essentially converts to/from I8 */ -#define NATIVE_TO_UTF(ch) PL_e2utf[(U8)(ch)] /* to I8 */ -#define NATIVE_TO_I8(ch) NATIVE_TO_UTF(ch) /* synonym */ -#define UTF_TO_NATIVE(ch) PL_utf2e[(U8)(ch)] /* from I8 */ -#define I8_TO_NATIVE(ch) UTF_TO_NATIVE(ch) /* synonym */ -/* Transform in wide UV char space */ -#define NATIVE_TO_UNI(ch) (((ch) > 255) ? (ch) : NATIVE_TO_ASCII(ch)) -#define UNI_TO_NATIVE(ch) (((ch) > 255) ? (ch) : ASCII_TO_NATIVE(ch)) -/* Transform in invariant..byte space */ -#define NATIVE_TO_NEED(enc,ch) ((enc) ? UTF_TO_NATIVE(NATIVE_TO_ASCII(ch)) : (ch)) -#define ASCII_TO_NEED(enc,ch) ((enc) ? UTF_TO_NATIVE(ch) : ASCII_TO_NATIVE(ch)) +#define NATIVE_TO_LATIN1(ch) PL_e2a[(U8)(ch)] +#define LATIN1_TO_NATIVE(ch) PL_a2e[(U8)(ch)] + +#define NATIVE_UTF8_TO_I8(ch) PL_e2utf[(U8)(ch)] +#define I8_TO_NATIVE_UTF8(ch) PL_utf2e[(U8)(ch)] + +/* Transforms in wide UV chars */ +#define NATIVE_TO_UNI(ch) (((ch) > 255) ? (ch) : NATIVE_TO_LATIN1(ch)) +#define UNI_TO_NATIVE(ch) (((ch) > 255) ? (ch) : LATIN1_TO_NATIVE(ch)) /* The following table is adapted from tr16, it shows I8 encoding of Unicode code points. @@ -554,26 +701,37 @@ END_EXTERN_C */ -#define UNISKIP(uv) ( (uv) < 0xA0 ? 1 : \ +/* Input is a true Unicode (not-native) code point */ +#define OFFUNISKIP(uv) ( (uv) < 0xA0 ? 1 : \ (uv) < 0x400 ? 2 : \ (uv) < 0x4000 ? 3 : \ (uv) < 0x40000 ? 4 : \ (uv) < 0x400000 ? 5 : \ (uv) < 0x4000000 ? 6 : 7 ) -#define UNI_IS_INVARIANT(c) ((c) < 0xA0) +#define UNI_IS_INVARIANT(c) (((UV)(c)) < 0xA0) /* UTF-EBCDIC semantic macros - transform back into I8 and then compare * Comments as to the meaning of each are given at their corresponding utf8.h * definitions */ -#define UTF8_IS_START(c) (NATIVE_TO_UTF(c) >= 0xC5 && NATIVE_TO_UTF(c) != 0xE0) -#define UTF8_IS_CONTINUATION(c) ((NATIVE_TO_UTF(c) & 0xE0) == 0xA0) -#define UTF8_IS_CONTINUED(c) (NATIVE_TO_UTF(c) >= 0xA0) -#define UTF8_IS_DOWNGRADEABLE_START(c) (NATIVE_TO_UTF(c) >= 0xC5 && NATIVE_TO_UTF(c) <= 0xC7) -#define UTF8_IS_ABOVE_LATIN1(c) (NATIVE_TO_I8(c) >= 0xC8) +#define UTF8_IS_START(c) (NATIVE_UTF8_TO_I8(c) >= 0xC5 \ + && NATIVE_UTF8_TO_I8(c) != 0xE0) +#define UTF8_IS_CONTINUATION(c) ((NATIVE_UTF8_TO_I8(c) & 0xE0) == 0xA0) +#define UTF8_IS_CONTINUED(c) (NATIVE_UTF8_TO_I8(c) >= 0xA0) + +#define UTF8_IS_DOWNGRADEABLE_START(c) (NATIVE_UTF8_TO_I8(c) >= 0xC5 \ + && NATIVE_UTF8_TO_I8(c) <= 0xC7) +/* Saying it this way adds a runtime test, but removes 2 run-time lookups */ +/*#define UTF8_IS_DOWNGRADEABLE_START(c) ((c) == I8_TO_NATIVE_UTF8(0xC5) \ + || (c) == I8_TO_NATIVE_UTF8(0xC6) \ + || (c) == I8_TO_NATIVE_UTF8(0xC7)) +*/ +#define UTF8_IS_ABOVE_LATIN1(c) (NATIVE_UTF8_TO_I8(c) >= 0xC8) + +/* Can't exceed 7 on EBCDIC platforms */ +#define UTF_START_MARK(len) (0xFF & (0xFE << (7-(len)))) -#define UTF_START_MARK(len) (((len) > 7) ? 0xFF : ((U8)(0xFE << (7-(len))))) #define UTF_START_MASK(len) (((len) >= 6) ? 0x01 : (0x1F >> ((len)-2))) #define UTF_CONTINUATION_MARK 0xA0 #define UTF_CONTINUATION_MASK ((U8)0x1f) @@ -592,6 +750,8 @@ END_EXTERN_C * character occupies 5 bytes, therefore this number is 15 */ #define UTF8_MAXBYTES_CASE 15 +#define MAX_UTF8_TWO_BYTE 0x3FF + /* * Local variables: * c-indentation-style: bsd diff --git a/Master/tlpkg/tlperl/lib/CORE/util.h b/Master/tlpkg/tlperl/lib/CORE/util.h index ed133c464bd..08544f5600c 100644 --- a/Master/tlpkg/tlperl/lib/CORE/util.h +++ b/Master/tlpkg/tlperl/lib/CORE/util.h @@ -52,6 +52,36 @@ This is a synonym for (! foldEQ_locale()) #define ibcmp(s1, s2, len) cBOOL(! foldEQ(s1, s2, len)) #define ibcmp_locale(s1, s2, len) cBOOL(! foldEQ_locale(s1, s2, len)) +/* outside the core, perl.h undefs HAS_QUAD if IV isn't 64-bit + We can't swap this to HAS_QUAD, because the logic here affects the type of + perl_drand48_t below, and that is visible outside of the core. */ +#if defined(U64TYPE) && !defined(USING_MSVC6) +/* use a faster implementation when quads are available, + * but not with VC6 on Windows */ +# define PERL_DRAND48_QUAD +#endif + +#ifdef PERL_DRAND48_QUAD + +/* U64 is only defined under PERL_CORE, but this needs to be visible + * elsewhere so the definition of PerlInterpreter is complete. + */ +typedef U64TYPE perl_drand48_t; + +#else + +struct PERL_DRAND48_T { + U16 seed[3]; +}; + +typedef struct PERL_DRAND48_T perl_drand48_t; + +#endif + +#define PL_RANDOM_STATE_TYPE perl_drand48_t + +#define Perl_drand48_init(seed) (Perl_drand48_init_r(&PL_random_state, (seed))) +#define Perl_drand48() (Perl_drand48_r(&PL_random_state)) /* * Local variables: diff --git a/Master/tlpkg/tlperl/lib/CORE/vdir.h b/Master/tlpkg/tlperl/lib/CORE/vdir.h index db7ec8417fe..a4186a1ad9f 100644 --- a/Master/tlpkg/tlperl/lib/CORE/vdir.h +++ b/Master/tlpkg/tlperl/lib/CORE/vdir.h @@ -146,43 +146,21 @@ void VDir::Init(VDir* pDir, VMem *p) else { int bSave = bManageDirectory; DWORD driveBits = GetLogicalDrives(); - OSVERSIONINFO osver; - - memset(&osver, 0, sizeof(osver)); - osver.dwOSVersionInfoSize = sizeof(osver); - GetVersionEx(&osver); bManageDirectory = 0; - if (osver.dwMajorVersion < 5) { - char szBuffer[MAX_PATH*driveCount]; - if (GetLogicalDriveStringsA(sizeof(szBuffer), szBuffer)) { - char* pEnv = (char*)GetEnvironmentStringsA(); - char* ptr = szBuffer; - for (index = 0; index < driveCount; ++index) { - if (driveBits & (1<= PERL_VERSION_DECIMAL(r,v,s)) + +#if PERL_VERSION_LT(5,15,4) +# define ISA_VERSION_OBJ(v) (sv_isobject(v) && sv_derived_from(v,"version")) +#else +# define ISA_VERSION_OBJ(v) (sv_isobject(v) && sv_derived_from_pvn(v,"version",7,0)) +#endif + + +#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE +#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) + +/* prototype to pass -Wmissing-prototypes */ +STATIC void +S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params); + +STATIC void +S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params) +{ + const GV *const gv = CvGV(cv); + + PERL_ARGS_ASSERT_CROAK_XS_USAGE; + + if (gv) { + const char *const gvname = GvNAME(gv); + const HV *const stash = GvSTASH(gv); + const char *const hvname = stash ? HvNAME(stash) : NULL; + + if (hvname) + Perl_croak_nocontext("Usage: %s::%s(%s)", hvname, gvname, params); + else + Perl_croak_nocontext("Usage: %s(%s)", gvname, params); + } else { + /* Pants. I don't think that it should be possible to get here. */ + Perl_croak_nocontext("Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params); + } +} + +#ifdef PERL_IMPLICIT_CONTEXT +#define croak_xs_usage(a,b) S_croak_xs_usage(aTHX_ a,b) +#else +#define croak_xs_usage S_croak_xs_usage +#endif + +#endif + +#if PERL_VERSION_GE(5,9,0) && !defined(PERL_CORE) + +# define VUTIL_REPLACE_CORE 1 + +const char * Perl_scan_version2(pTHX_ const char *s, SV *rv, bool qv); +SV * Perl_new_version2(pTHX_ SV *ver); +SV * Perl_upg_version2(pTHX_ SV *sv, bool qv); +SV * Perl_vstringify2(pTHX_ SV *vs); +SV * Perl_vverify2(pTHX_ SV *vs); +SV * Perl_vnumify2(pTHX_ SV *vs); +SV * Perl_vnormal2(pTHX_ SV *vs); +SV * Perl_vstringify2(pTHX_ SV *vs); +int Perl_vcmp2(pTHX_ SV *lsv, SV *rsv); +const char * Perl_prescan_version2(pTHX_ const char *s, bool strict, const char** errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha); + +# define SCAN_VERSION(a,b,c) Perl_scan_version2(aTHX_ a,b,c) +# define NEW_VERSION(a) Perl_new_version2(aTHX_ a) +# define UPG_VERSION(a,b) Perl_upg_version2(aTHX_ a, b) +# define VSTRINGIFY(a) Perl_vstringify2(aTHX_ a) +# define VVERIFY(a) Perl_vverify2(aTHX_ a) +# define VNUMIFY(a) Perl_vnumify2(aTHX_ a) +# define VNORMAL(a) Perl_vnormal2(aTHX_ a) +# define VCMP(a,b) Perl_vcmp2(aTHX_ a,b) +# define PRESCAN_VERSION(a,b,c,d,e,f,g) Perl_prescan_version2(aTHX_ a,b,c,d,e,f,g) +# undef is_LAX_VERSION +# define is_LAX_VERSION(a,b) \ + (a != Perl_prescan_version2(aTHX_ a, FALSE, b, NULL, NULL, NULL, NULL)) +# undef is_STRICT_VERSION +# define is_STRICT_VERSION(a,b) \ + (a != Perl_prescan_version2(aTHX_ a, TRUE, b, NULL, NULL, NULL, NULL)) + +#else + +const char * Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv); +SV * Perl_new_version(pTHX_ SV *ver); +SV * Perl_upg_version(pTHX_ SV *sv, bool qv); +SV * Perl_vverify(pTHX_ SV *vs); +SV * Perl_vnumify(pTHX_ SV *vs); +SV * Perl_vnormal(pTHX_ SV *vs); +SV * Perl_vstringify(pTHX_ SV *vs); +int Perl_vcmp(pTHX_ SV *lsv, SV *rsv); +const char * Perl_prescan_version(pTHX_ const char *s, bool strict, const char** errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha); + +# define SCAN_VERSION(a,b,c) Perl_scan_version(aTHX_ a,b,c) +# define NEW_VERSION(a) Perl_new_version(aTHX_ a) +# define UPG_VERSION(a,b) Perl_upg_version(aTHX_ a, b) +# define VSTRINGIFY(a) Perl_vstringify(aTHX_ a) +# define VVERIFY(a) Perl_vverify(aTHX_ a) +# define VNUMIFY(a) Perl_vnumify(aTHX_ a) +# define VNORMAL(a) Perl_vnormal(aTHX_ a) +# define VCMP(a,b) Perl_vcmp(aTHX_ a,b) + +# define PRESCAN_VERSION(a,b,c,d,e,f,g) Perl_prescan_version(aTHX_ a,b,c,d,e,f,g) +# ifndef is_LAX_VERSION +# define is_LAX_VERSION(a,b) \ + (a != Perl_prescan_version(aTHX_ a, FALSE, b, NULL, NULL, NULL, NULL)) +# endif +# ifndef is_STRICT_VERSION +# define is_STRICT_VERSION(a,b) \ + (a != Perl_prescan_version(aTHX_ a, TRUE, b, NULL, NULL, NULL, NULL)) +# endif + +#endif + +#if PERL_VERSION_LT(5,11,4) +# define BADVERSION(a,b,c) \ + if (b) { \ + *b = c; \ + } \ + return a; + +# define PERL_ARGS_ASSERT_PRESCAN_VERSION \ + assert(s); assert(sqv); assert(ssaw_decimal);\ + assert(swidth); assert(salpha); + +# define PERL_ARGS_ASSERT_SCAN_VERSION \ + assert(s); assert(rv) +# define PERL_ARGS_ASSERT_NEW_VERSION \ + assert(ver) +# define PERL_ARGS_ASSERT_UPG_VERSION \ + assert(ver) +# define PERL_ARGS_ASSERT_VVERIFY \ + assert(vs) +# define PERL_ARGS_ASSERT_VNUMIFY \ + assert(vs) +# define PERL_ARGS_ASSERT_VNORMAL \ + assert(vs) +# define PERL_ARGS_ASSERT_VSTRINGIFY \ + assert(vs) +# define PERL_ARGS_ASSERT_VCMP \ + assert(lhv); assert(rhv) +# define PERL_ARGS_ASSERT_CK_WARNER \ + assert(pat) +#endif + + +#if PERL_VERSION_LT(5,19,0) +# undef STORE_NUMERIC_LOCAL_SET_STANDARD +# undef RESTORE_NUMERIC_LOCAL +# ifdef USE_LOCALE +# define STORE_NUMERIC_LOCAL_SET_STANDARD()\ + char *loc = savepv(setlocale(LC_NUMERIC, NULL)); \ + SAVEFREEPV(loc); \ + setlocale(LC_NUMERIC, "C"); + +# define RESTORE_NUMERIC_LOCAL()\ + setlocale(LC_NUMERIC, loc); +# else +# define STORE_NUMERIC_LOCAL_SET_STANDARD() +# define RESTORE_NUMERIC_LOCAL() +# endif +#endif diff --git a/Master/tlpkg/tlperl/lib/CORE/warnings.h b/Master/tlpkg/tlperl/lib/CORE/warnings.h index 5c40d5c398b..66e4153d6b9 100644 --- a/Master/tlpkg/tlperl/lib/CORE/warnings.h +++ b/Master/tlpkg/tlperl/lib/CORE/warnings.h @@ -95,9 +95,16 @@ #define WARN_EXPERIMENTAL__REGEX_SETS 54 #define WARN_EXPERIMENTAL__SMARTMATCH 55 -#define WARNsize 14 -#define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125" -#define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +/* Warnings Categories added in Perl 5.019 */ + +#define WARN_EXPERIMENTAL__AUTODEREF 56 +#define WARN_EXPERIMENTAL__POSTDEREF 57 +#define WARN_EXPERIMENTAL__SIGNATURES 58 +#define WARN_SYSCALLS 59 + +#define WARNsize 15 +#define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" +#define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" #define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD) #define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD) @@ -111,6 +118,10 @@ char)) #define ckWARN(w) Perl_ckwarn(aTHX_ packWARN(w)) + +/* The w1, w2 ... should be independent warnings categories; one shouldn't be + * a subcategory of any other */ + #define ckWARN2(w1,w2) Perl_ckwarn(aTHX_ packWARN2(w1,w2)) #define ckWARN3(w1,w2,w3) Perl_ckwarn(aTHX_ packWARN3(w1,w2,w3)) #define ckWARN4(w1,w2,w3,w4) Perl_ckwarn(aTHX_ packWARN4(w1,w2,w3,w4)) @@ -123,6 +134,10 @@ #define WARNshift 8 #define packWARN(a) (a ) + +/* The a, b, ... should be independent warnings categories; one shouldn't be + * a subcategory of any other */ + #define packWARN2(a,b) ((a) | ((b)<<8) ) #define packWARN3(a,b,c) ((a) | ((b)<<8) | ((c)<<16) ) #define packWARN4(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d) <<24)) diff --git a/Master/tlpkg/tlperl/lib/CORE/win32.h b/Master/tlpkg/tlperl/lib/CORE/win32.h index 3065867bd28..735c4503e27 100644 --- a/Master/tlpkg/tlperl/lib/CORE/win32.h +++ b/Master/tlpkg/tlperl/lib/CORE/win32.h @@ -13,6 +13,7 @@ # define _WIN32_WINNT 0x0500 /* needed for CreateHardlink() etc. */ #endif +/* Win32 only optimizations for faster building */ #ifdef PERL_IS_MINIPERL /* this macro will remove Winsock only on miniperl, PERL_IMPLICIT_SYS and * makedef.pl create dependencies that will keep Winsock linked in even with @@ -20,6 +21,8 @@ * level in full perl */ # define WIN32_NO_SOCKETS +/* less I/O calls during each require */ +# define PERL_DISABLE_PMC #endif #ifdef WIN32_NO_SOCKETS @@ -242,13 +245,18 @@ typedef unsigned short mode_t; #pragma warning(disable: 4102) /* "unreferenced label" */ -#define isnan _isnan +#if _MSC_VER < 1800 +#define isnan _isnan /* Defined already in VC++ 12.0 */ +#endif +#ifdef UNDER_CE /* revisit what function this becomes celib vs corelibc, prv warning here*/ +# undef snprintf +#endif #define snprintf _snprintf #define vsnprintf _vsnprintf -#if _MSC_VER < 1300 -/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false */ -#define NAN_COMPARE_BROKEN 1 +/* on VC2003, msvcrt.lib is missing these symbols */ +#if _MSC_VER >= 1300 && _MSC_VER < 1400 +# pragma intrinsic(_rotl64,_rotr64) #endif #endif /* _MSC_VER */ @@ -312,7 +320,6 @@ extern gid_t getegid(void); extern int setuid(uid_t uid); extern int setgid(gid_t gid); extern int kill(int pid, int sig); -extern int killpg(int pid, int sig); #ifndef USE_PERL_SBRK extern void *sbrk(ptrdiff_t need); # define HAS_SBRK_PROTO @@ -369,6 +376,8 @@ extern char * win32_get_vendorlib(const char *pl, STRLEN *const len); extern void win32_delete_internal_host(void *h); #endif +extern int win32_get_errno(int err); + extern const char * const staticlinkmodules[]; END_EXTERN_C @@ -383,8 +392,8 @@ typedef char * caddr_t; /* In malloc.c (core address). */ #ifdef MYMALLOC #define EMBEDMYMALLOC /**/ -/* #define USE_PERL_SBRK /**/ -/* #define PERL_SBRK_VIA_MALLOC /**/ +/* #define USE_PERL_SBRK / **/ +/* #define PERL_SBRK_VIA_MALLOC / **/ #endif #ifdef PERL_TEXTMODE_SCRIPTS @@ -500,6 +509,100 @@ void win32_wait_for_children(pTHX); # define PERL_WAIT_FOR_CHILDREN win32_wait_for_children(aTHX) #endif +#ifdef PERL_CORE +/* C doesn't like repeat struct definitions */ +#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3) +#undef _CRTIMP +#endif +#ifndef _CRTIMP +#define _CRTIMP __declspec(dllimport) +#endif + + +/* VV 2005 has multiple ioinfo struct definitions through VC 2005's release life + * VC 2008-2012 have been stable but do not assume future VCs will have the + * same ioinfo struct, just because past struct stability. If research is done + * on the CRTs of future VS, the version check can be bumped up so the newer + * VC uses a fixed ioinfo size. + */ +#if ! (_MSC_VER < 1400 || (_MSC_VER >= 1500 && _MSC_VER <= 1700) \ + || defined(__MINGW32__)) +/* size of ioinfo struct is determined at runtime */ +# define WIN32_DYN_IOINFO_SIZE +#endif + +#ifndef WIN32_DYN_IOINFO_SIZE +/* + * Control structure for lowio file handles + */ +typedef struct { + intptr_t osfhnd;/* underlying OS file HANDLE */ + char osfile; /* attributes of file (e.g., open in text mode?) */ + char pipech; /* one char buffer for handles opened on pipes */ + int lockinitflag; + CRITICAL_SECTION lock; +/* this struct defintion breaks ABI compatibility with + * not using, cl.exe's native VS version specitfic CRT. */ +# if _MSC_VER >= 1400 && _MSC_VER < 1500 +# error "This ioinfo struct is incomplete for Visual C 2005" +# endif +/* VC 2005 CRT has atleast 3 different definitions of this struct based on the + * CRT DLL's build number. */ +# if _MSC_VER >= 1500 +# ifndef _SAFECRT_IMPL + /* Not used in the safecrt downlevel. We do not define them, so we cannot + * use them accidentally */ + char textmode : 7;/* __IOINFO_TM_ANSI or __IOINFO_TM_UTF8 or __IOINFO_TM_UTF16LE */ + char unicode : 1; /* Was the file opened as unicode? */ + char pipech2[2]; /* 2 more peak ahead chars for UNICODE mode */ + __int64 startpos; /* File position that matches buffer start */ + BOOL utf8translations; /* Buffer contains translations other than CRLF*/ + char dbcsBuffer; /* Buffer for the lead byte of dbcs when converting from dbcs to unicode */ + BOOL dbcsBufferUsed; /* Bool for the lead byte buffer is used or not */ +# endif +# endif +} ioinfo; +#else +typedef intptr_t ioinfo; +#endif + +/* + * Array of arrays of control structures for lowio files. + */ +EXTERN_C _CRTIMP ioinfo* __pioinfo[]; + +/* + * Definition of IOINFO_L2E, the log base 2 of the number of elements in each + * array of ioinfo structs. + */ +#define IOINFO_L2E 5 + +/* + * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array + */ +#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E) + +/* + * Access macros for getting at an ioinfo struct and its fields from a + * file handle + */ +#ifdef WIN32_DYN_IOINFO_SIZE +# define _pioinfo(i) ((intptr_t *) \ + (((Size_t)__pioinfo[(i) >> IOINFO_L2E])/* * to head of array ioinfo [] */\ + /* offset to the head of a particular ioinfo struct */ \ + + (((i) & (IOINFO_ARRAY_ELTS - 1)) * w32_ioinfo_size)) \ + ) +/* first slice of ioinfo is always the OS handle */ +# define _osfhnd(i) (*(_pioinfo(i))) +#else +# define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1))) +# define _osfhnd(i) (_pioinfo(i)->osfhnd) +#endif + +/* since we are not doing a dup2(), this works fine */ +# define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh) +#endif /* PERL_CORE */ + /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */ #if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX) #undef PERLIO_NOT_STDIO diff --git a/Master/tlpkg/tlperl/lib/CORE/win32iop.h b/Master/tlpkg/tlperl/lib/CORE/win32iop.h index 207c9176e56..246375faa32 100644 --- a/Master/tlpkg/tlperl/lib/CORE/win32iop.h +++ b/Master/tlpkg/tlperl/lib/CORE/win32iop.h @@ -207,75 +207,210 @@ END_EXTERN_C */ #undef fprintf #define fprintf win32_fprintf +#ifdef UNDER_CE /* celib also makes these be macros to celib's x* symbols */ +# undef vfprintf +#endif #define vfprintf win32_vfprintf +#ifdef UNDER_CE +# undef printf +#endif #define printf win32_printf +#ifdef UNDER_CE +# undef vprintf +#endif #define vprintf win32_vprintf +#ifdef UNDER_CE +# undef fread +#endif #define fread(buf,size,count,f) win32_fread(buf,size,count,f) +#ifdef UNDER_CE +# undef fwrite +#endif #define fwrite(buf,size,count,f) win32_fwrite(buf,size,count,f) +#ifdef UNDER_CE +# undef fopen +#endif #define fopen win32_fopen #undef fdopen #define fdopen win32_fdopen +#ifdef UNDER_CE +# undef freopen +#endif #define freopen win32_freopen #define fclose(f) win32_fclose(f) +#ifdef UNDER_CE +# undef fputs +#endif #define fputs(s,f) win32_fputs(s,f) +#ifdef UNDER_CE +# undef fputc +#endif #define fputc(c,f) win32_fputc(c,f) +#ifdef UNDER_CE +# undef ungetc +#endif #define ungetc(c,f) win32_ungetc(c,f) #undef getc #define getc(f) win32_getc(f) +#ifdef UNDER_CE +# undef fileno +#endif #define fileno(f) win32_fileno(f) +#ifdef UNDER_CE +# undef clearerr +#endif #define clearerr(f) win32_clearerr(f) +#ifdef UNDER_CE +# undef fflush +#endif #define fflush(f) win32_fflush(f) +#ifdef UNDER_CE +# undef ftell +#endif #define ftell(f) win32_ftell(f) +#ifdef UNDER_CE +# undef fseek +#endif #define fseek(f,o,w) win32_fseek(f,o,w) +#ifdef UNDER_CE +# undef fgetpos +#endif #define fgetpos(f,p) win32_fgetpos(f,p) +#ifdef UNDER_CE +# undef fsetpos +#endif #define fsetpos(f,p) win32_fsetpos(f,p) +#ifdef UNDER_CE +# undef rewind +#endif #define rewind(f) win32_rewind(f) #define tmpfile() win32_tmpfile() +#ifdef UNDER_CE +# undef abort +#endif #define abort() win32_abort() +#ifdef UNDER_CE +# undef fstat +#endif #define fstat(fd,bufptr) win32_fstat(fd,bufptr) +#ifdef UNDER_CE +# undef stat +#endif #define stat(pth,bufptr) win32_stat(pth,bufptr) #define longpath(pth) win32_longpath(pth) #define ansipath(pth) win32_ansipath(pth) +#ifdef UNDER_CE +# undef rename +#endif #define rename(old,new) win32_rename(old,new) +#ifdef UNDER_CE +# undef setmode +#endif #define setmode(fd,mode) win32_setmode(fd,mode) #define chsize(fd,sz) win32_chsize(fd,sz) +#ifdef UNDER_CE +# undef lseek +#endif #define lseek(fd,offset,orig) win32_lseek(fd,offset,orig) #define tell(fd) win32_tell(fd) +#ifdef UNDER_CE +# undef dup +#endif #define dup(fd) win32_dup(fd) +#ifdef UNDER_CE +# undef dup2 +#endif #define dup2(fd1,fd2) win32_dup2(fd1,fd2) +#ifdef UNDER_CE +# undef open +#endif #define open win32_open +#ifdef UNDER_CE +# undef close +#endif #define close(fd) win32_close(fd) #define eof(fd) win32_eof(fd) +#ifdef UNDER_CE +# undef isatty +#endif #define isatty(fd) win32_isatty(fd) +#ifdef UNDER_CE +# undef read +#endif #define read(fd,b,s) win32_read(fd,b,s) +#ifdef UNDER_CE +# undef write +#endif #define write(fd,b,s) win32_write(fd,b,s) #define _open_osfhandle win32_open_osfhandle +#ifdef UNDER_CE +# undef _get_osfhandle +#endif #define _get_osfhandle win32_get_osfhandle #define spawnvp win32_spawnvp +#ifdef UNDER_CE +# undef mkdir +#endif #define mkdir win32_mkdir +#ifdef UNDER_CE +# undef rmdir +#endif #define rmdir win32_rmdir +#ifdef UNDER_CE +# undef chdir +#endif #define chdir win32_chdir #define flock(fd,o) win32_flock(fd,o) +#ifdef UNDER_CE +# undef execv +#endif #define execv win32_execv +#ifdef UNDER_CE +# undef execvp +#endif #define execvp win32_execvp +#ifdef UNDER_CE +# undef perror +#endif #define perror win32_perror #define setbuf win32_setbuf +#ifdef UNDER_CE +# undef setvbuf +#endif #define setvbuf win32_setvbuf #undef flushall #define flushall win32_flushall #undef fcloseall #define fcloseall win32_fcloseall +#ifdef UNDER_CE +# undef fgets +#endif #define fgets win32_fgets +#ifdef UNDER_CE +# undef gets +#endif #define gets win32_gets +#ifdef UNDER_CE +# undef fgetc +#endif #define fgetc win32_fgetc #undef putc #define putc win32_putc +#ifdef UNDER_CE +# undef puts +#endif #define puts win32_puts #undef getchar #define getchar win32_getchar #undef putchar #define putchar win32_putchar +#ifdef UNDER_CE +# undef access +#endif #define access(p,m) win32_access(p,m) +#ifdef UNDER_CE +# undef chmod +#endif #define chmod(p,m) win32_chmod(p,m) @@ -302,19 +437,42 @@ END_EXTERN_C #define link win32_link #define unlink win32_unlink #define utime win32_utime +#ifdef UNDER_CE +# undef gettimeofday +#endif #define gettimeofday win32_gettimeofday #define uname win32_uname #define wait win32_wait #define waitpid win32_waitpid +#ifdef UNDER_CE +# undef kill +#endif #define kill win32_kill +#ifdef UNDER_CE +# undef killpg +#endif +#define killpg(pid, sig) win32_kill(pid, -(sig)) + +#ifdef UNDER_CE +# undef opendir +#endif #define opendir win32_opendir +#ifdef UNDER_CE +# undef readdir +#endif #define readdir win32_readdir #define telldir win32_telldir #define seekdir win32_seekdir #define rewinddir win32_rewinddir +#ifdef UNDER_CE +# undef closedir +#endif #define closedir win32_closedir #define os_id win32_os_id +#ifdef UNDER_CE +# undef getpid +#endif #define getpid win32_getpid #undef crypt diff --git a/Master/tlpkg/tlperl/lib/CPAN.pm b/Master/tlpkg/tlperl/lib/CPAN.pm index 1c68b02e6e1..4ed4b6cdd00 100644 --- a/Master/tlpkg/tlperl/lib/CPAN.pm +++ b/Master/tlpkg/tlperl/lib/CPAN.pm @@ -2,7 +2,7 @@ # vim: ts=4 sts=4 sw=4: use strict; package CPAN; -$CPAN::VERSION = '2.00'; +$CPAN::VERSION = '2.05'; $CPAN::VERSION =~ s/_//; # we need to run chdir all over and we would get at wrong libraries @@ -886,7 +886,7 @@ this variable in either a CPAN/MyConfig.pm or a CPAN/Config.pm in your # be politely squashed. Any bug that causes every eval {} to have to be # modified should be not so politely squashed. # -# Those are my current opinions. It is also my optinion that polite +# Those are my current opinions. It is also my opinion that polite # arguments degenerate to personal arguments far too frequently, and that # when they do, it's because both people wanted it to, or at least didn't # sufficiently want it not to. @@ -1111,7 +1111,7 @@ sub has_inst { my %dont = map { $_ => 1 } keys %{$CPAN::META->{dontload_hash}||{}}, keys %{$CPAN::Config->{dontload_hash}||{}}, @{$CPAN::Config->{dontload_list}||[]}; - if (defined $message && $message eq "no" # afair only used by Nox + if (defined $message && $message eq "no" # as far as I remember only used by Nox || $dont{$mod} ) { @@ -1125,7 +1125,7 @@ sub has_inst { if ($INC{$file}) { # checking %INC is wrong, because $INC{LWP} may be true # although $INC{"URI/URL.pm"} may have failed. But as - # I really want to say "bla loaded OK", I have to somehow + # I really want to say "blah loaded OK", I have to somehow # cache results. ### warn "$file in %INC"; #debug return 1; @@ -1746,7 +1746,7 @@ not yet been installed. See also C. =item is_tested -List all buid directories of distributions that have been tested +List all build directories of distributions that have been tested successfully but have not yet been installed. See also C. @@ -1865,7 +1865,7 @@ separated): Modules know their associated Distribution objects. They always refer to the most recent official release. Developers may mark their releases -as unstable development versions (by inserting an underbar into the +as unstable development versions (by inserting an unserscore into the module version number which will also be reflected in the distribution name when you run 'make dist'), so the really hottest and newest distribution is not always the default. If a module Foo circulates @@ -2110,12 +2110,14 @@ currently defined: proxy_user username for accessing an authenticating proxy proxy_pass password for accessing an authenticating proxy randomize_urllist add some randomness to the sequence of the urllist + recommends_policy whether recommended prerequisites should be included scan_cache controls scanning of cache ('atstart', 'atexit' or 'never') shell your favorite shell show_unparsable_versions boolean if r command tells which modules are versionless show_upload_date boolean if commands should try to determine upload date show_zero_versions boolean if r command tells for which modules $version==0 + suggests_policy whether suggested prerequisites should be included tar location of external program tar tar_verbosity verbosity level for the tar command term_is_latin deprecated: if true Unicode is translated to ISO-8859-1 @@ -2127,6 +2129,7 @@ currently defined: CPAN::Reporter history) unzip location of external program unzip urllist arrayref to nearby CPAN sites (or equivalent locations) + use_prompt_default set PERL_MM_USE_DEFAULT for configure/make/test/install use_sqlite use CPAN::SQLite for metadata storage (fast and lean) username your username if you CPAN server wants one version_timeout stops version parsing after this many seconds. @@ -3755,7 +3758,7 @@ which to try in which order. Henk P. Penning maintains a site that collects data about CPAN sites: - http://www.cs.uu.nl/people/henkp/mirmon/cpan.html + http://mirrors.cpan.org/ Also, feel free to play with experimental features. Run @@ -3791,8 +3794,9 @@ Speaking of the build directory. Do I have to clean it up myself? You have the choice to set the config variable C to C. Then you must clean it up yourself. The other possible values, C and C clean up the build directory when you -start or exit the CPAN shell, respectively. If you never start up the -CPAN shell, you probably also have to clean up the build directory +start (or more precisely, after the first extraction into the build +directory) or exit the CPAN shell, respectively. If you never start up +the CPAN shell, you probably also have to clean up the build directory yourself. =back diff --git a/Master/tlpkg/tlperl/lib/CPAN/API/HOWTO.pod b/Master/tlpkg/tlperl/lib/CPAN/API/HOWTO.pod new file mode 100644 index 00000000000..e65a4bc9313 --- /dev/null +++ b/Master/tlpkg/tlperl/lib/CPAN/API/HOWTO.pod @@ -0,0 +1,44 @@ +=head1 NAME + +CPAN::API::HOWTO - a recipe book for programming with CPAN.pm + +=head1 RECIPES + +All of these recipes assume that you have put "use CPAN" at the top of +your program. + +=head2 What distribution contains a particular module? + + my $distribution = CPAN::Shell->expand( + "Module", "Data::UUID" + )->distribution()->pretty_id(); + +This returns a string of the form "AUTHORID/TARBALL". If you want the +full path and filename to this distribution on a CPAN mirror, then it is +C<.../authors/id/A/AU/AUTHORID/TARBALL>. + +=head2 What modules does a particular distribution contain? + + CPAN::Index->reload(); + my @modules = CPAN::Shell->expand( + "Distribution", "JHI/Graph-0.83.tar.gz" + )->containsmods(); + +You may also refer to a distribution in the form A/AU/AUTHORID/TARBALL. + +=head1 SEE ALSO + +the main CPAN.pm documentation + +=head1 LICENSE + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See L + +=head1 AUTHOR + +David Cantrell + +=cut diff --git a/Master/tlpkg/tlperl/lib/CPAN/Author.pm b/Master/tlpkg/tlperl/lib/CPAN/Author.pm index 64fe57f61bd..572f3ab31d5 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Author.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Author.pm @@ -8,7 +8,7 @@ use CPAN::InfoObj; use vars qw( $VERSION ); -$VERSION = "5.5001"; +$VERSION = "5.5002"; package CPAN::Author; use strict; @@ -178,7 +178,7 @@ sub dir_listing { $lc_file = $lc_want; # we *could* second-guess and if the user has a file: URL, # then we could look there. But on the other hand, if they do - # have a file: URL, wy did they choose to set + # have a file: URL, why did they choose to set # $CPAN::Config->{show_upload_date} to false? } diff --git a/Master/tlpkg/tlperl/lib/CPAN/Bundle.pm b/Master/tlpkg/tlperl/lib/CPAN/Bundle.pm index 92f7990ed3d..1525dde5e32 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Bundle.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Bundle.pm @@ -8,7 +8,7 @@ use CPAN::Module; use vars qw( $VERSION ); -$VERSION = "5.5"; +$VERSION = "5.5001"; sub look { my $self = shift; @@ -229,7 +229,9 @@ Going to $meth that. my $obj = $CPAN::META->instance($type,$s); $obj->{reqtype} = $self->{reqtype}; # $obj->$meth(); - CPAN::Queue->queue_item(qmod => $obj->id, reqtype => $self->{reqtype}); + # XXX should optional be based on whether bundle was optional? -- xdg, 2012-04-01 + # A: Sure, what could demand otherwise? --andk, 2013-11-25 + CPAN::Queue->queue_item(qmod => $obj->id, reqtype => $self->{reqtype}, optional => !$self->{mandatory}); } } @@ -267,7 +269,7 @@ sub clean { shift->rematein('clean',@_); } #-> sub CPAN::Bundle::uptodate ; sub uptodate { my($self) = @_; - return 0 unless $self->SUPER::uptodate; # we mut have the current Bundle def + return 0 unless $self->SUPER::uptodate; # we must have the current Bundle def my $c; foreach $c ($self->contains) { my $obj = CPAN::Shell->expandany($c); diff --git a/Master/tlpkg/tlperl/lib/CPAN/CacheMgr.pm b/Master/tlpkg/tlperl/lib/CPAN/CacheMgr.pm index 23e756e75b2..144efd62b3b 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/CacheMgr.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/CacheMgr.pm @@ -10,7 +10,7 @@ use File::Find; use vars qw( $VERSION ); -$VERSION = "5.5001"; +$VERSION = "5.5002"; package CPAN::CacheMgr; use strict; @@ -172,7 +172,7 @@ sub _clean_cache { } elsif (my $id = $peek_yaml->[0]{distribution}{ID}) { $CPAN::META->delete("CPAN::Distribution", $id); - # XXX we should restore the state NOW, otherise this + # XXX we should restore the state NOW, otherwise this # distro does not exist until we read an index. BUG ALERT(?) # $CPAN::Frontend->mywarn (" +++\n"); diff --git a/Master/tlpkg/tlperl/lib/CPAN/Complete.pm b/Master/tlpkg/tlperl/lib/CPAN/Complete.pm index e1fe896d4a5..588e6e6c2cf 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Complete.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Complete.pm @@ -4,7 +4,7 @@ package CPAN::Complete; use strict; @CPAN::Complete::ISA = qw(CPAN::Debug); # Q: where is the "How do I add a new command" HOWTO? -# A: svn diff -r 1048:1049 where andk added the report command +# A: git log -p -1 355c44e9caaec857e4b12f51afb96498833c3e36 where andk added the report command @CPAN::Complete::COMMANDS = sort qw( ? ! a b d h i m o q r u autobundle @@ -42,7 +42,7 @@ use strict; use vars qw( $VERSION ); -$VERSION = "5.5"; +$VERSION = "5.5001"; package CPAN::Complete; use strict; diff --git a/Master/tlpkg/tlperl/lib/CPAN/Distribution.pm b/Master/tlpkg/tlperl/lib/CPAN/Distribution.pm index 690d6a063db..9a0870717da 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Distribution.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Distribution.pm @@ -4,11 +4,12 @@ package CPAN::Distribution; use strict; use Cwd qw(chdir); use CPAN::Distroprefs; +use CPAN::Meta::Requirements 2; use CPAN::InfoObj; use File::Path (); @CPAN::Distribution::ISA = qw(CPAN::InfoObj); use vars qw($VERSION); -$VERSION = "2.00"; +$VERSION = "2.02"; # Accessors sub cpan_comment { @@ -70,7 +71,7 @@ sub normalize { } elsif ( $s =~ tr|/|| == 1 or - $s !~ m|[A-Z]/[A-Z-]{2}/[A-Z-]{2,}/| + $s !~ m|[A-Z]/[A-Z-0-9]{2}/[A-Z-0-9]{2,}/| ) { return $s if $s =~ m:^N/A|^Contact Author: ; $s =~ s|^(.)(.)([^/]*/)(.+)$|$1/$1$2/$1$2$3$4|; @@ -185,8 +186,13 @@ sub color_cmd_tmps { # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1; my $prereq_pm = $self->prereq_pm; if (defined $prereq_pm) { - PREREQ: for my $pre (keys %{$prereq_pm->{requires}||{}}, - keys %{$prereq_pm->{build_requires}||{}}) { + # XXX also optional_req & optional_breq? -- xdg, 2012-04-01 + PREREQ: for my $pre ( + keys %{$prereq_pm->{requires}||{}}, + keys %{$prereq_pm->{build_requires}||{}}, + keys %{$prereq_pm->{opt_requires}||{}}, + keys %{$prereq_pm->{opt_build_requires}||{}} + ) { next PREREQ if $pre eq "perl"; my $premo; unless ($premo = CPAN::Shell->expand("Module",$pre)) { @@ -275,20 +281,66 @@ sub called_for { return $self->{CALLED_FOR}; } +#-> sub CPAN::Distribution::shortcut_get ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_get { + my ($self) = @_; + + if (my $why = $self->check_disabled) { + $self->{unwrapped} = CPAN::Distrostatus->new("NO $why"); + # XXX why is this goodbye() instead of just print/warn? + # Alternatively, should other print/warns here be goodbye()? + # -- xdg, 2012-04-05 + return $self->goodbye("[disabled] -- NA $why"); + } + + $self->debug("checking already unwrapped[$self->{ID}]") if $CPAN::DEBUG; + if (exists $self->{build_dir} && -d $self->{build_dir}) { + # this deserves print, not warn: + return $self->success("Has already been unwrapped into directory ". + "$self->{build_dir}" + ); + } + + # XXX I'm not sure this should be here because it's not really + # a test for whether get should continue or return; this is + # a side effect -- xdg, 2012-04-05 + $self->debug("checking missing build_dir[$self->{ID}]") if $CPAN::DEBUG; + if (exists $self->{build_dir} && ! -d $self->{build_dir}){ + # we have lost it. + $self->fforce(""); # no method to reset all phases but not set force (dodge) + return undef; # no shortcut + } + + # although we talk about 'force' we shall not test on + # force directly. New model of force tries to refrain from + # direct checking of force. + $self->debug("checking unwrapping error[$self->{ID}]") if $CPAN::DEBUG; + if ( exists $self->{unwrapped} and ( + UNIVERSAL::can($self->{unwrapped},"failed") ? + $self->{unwrapped}->failed : + $self->{unwrapped} =~ /^NO/ ) + ) { + return $self->goodbye("Unwrapping had some problem, won't try again without force"); + } + + return undef; # no shortcut +} + #-> sub CPAN::Distribution::get ; sub get { my($self) = @_; + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; if (my $goto = $self->prefs->{goto}) { - $CPAN::Frontend->mywarn - (sprintf( - "delegating to '%s' as specified in prefs file '%s' doc %d\n", - $goto, - $self->{prefs_file}, - $self->{prefs_file_doc}, - )); return $self->goto($goto); } + + if ( defined( my $sc = $self->shortcut_get) ) { + return $sc; + } + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) ? $ENV{PERL5LIB} : ($ENV{PERLLIB} || ""); @@ -296,77 +348,38 @@ sub get { $CPAN::META->set_perl5lib; local $ENV{MAKEFLAGS}; # protect us from outer make calls - EXCUSE: { - my @e; - my $goodbye_message; - $self->debug("checking disabled id[$self->{ID}]") if $CPAN::DEBUG; - if ($self->prefs->{disabled} && ! $self->{force_update}) { - my $why = sprintf( - "Disabled via prefs file '%s' doc %d", - $self->{prefs_file}, - $self->{prefs_file_doc}, - ); - push @e, $why; - $self->{unwrapped} = CPAN::Distrostatus->new("NO $why"); - $goodbye_message = "[disabled] -- NA $why"; - # note: not intended to be persistent but at least visible - # during this session - } else { - if (exists $self->{build_dir} && -d $self->{build_dir} - && ($self->{modulebuild}||$self->{writemakefile}) - ) { - # this deserves print, not warn: - $CPAN::Frontend->myprint(" Has already been unwrapped into directory ". - "$self->{build_dir}\n" - ); - return 1; - } - if (exists $self->{build_dir} && ! -d $self->{build_dir}){ - # we have lost it. - $self->fforce(""); # no method to reset all phases but not set force (dodge) - } - - # although we talk about 'force' we shall not test on - # force directly. New model of force tries to refrain from - # direct checking of force. - exists $self->{unwrapped} and ( - UNIVERSAL::can($self->{unwrapped},"failed") ? - $self->{unwrapped}->failed : - $self->{unwrapped} =~ /^NO/ - ) - and push @e, "Unwrapping had some problem, won't try again without force"; - } - if (@e) { - $CPAN::Frontend->mywarn(join "", map {"$_\n"} @e); - if ($goodbye_message) { - $self->goodbye($goodbye_message); - } - return; - } - } my $sub_wd = CPAN::anycwd(); # for cleaning up as good as possible my($local_file); + # XXX I don't think this check needs to be here, as it + # is already checked in shortcut_get() -- xdg, 2012-04-05 unless ($self->{build_dir} && -d $self->{build_dir}) { $self->get_file_onto_local_disk; return if $CPAN::Signal; $self->check_integrity; return if $CPAN::Signal; (my $packagedir,$local_file) = $self->run_preps_on_packagedir; + # XXX why is this check here? -- xdg, 2012-04-08 if (exists $self->{writemakefile} && ref $self->{writemakefile} && $self->{writemakefile}->can("failed") && $self->{writemakefile}->failed) { + # return; } $packagedir ||= $self->{build_dir}; $self->{build_dir} = $packagedir; } + # XXX should this move up to after run_preps_on_packagedir? + # Otherwise, failing writemakefile can return without + # a $CPAN::Signal check -- xdg, 2012-04-05 if ($CPAN::Signal) { $self->safe_chdir($sub_wd); return; } - return $self->choose_MM_or_MB($local_file); + return unless $self->patch; + $self->store_persistent_state; + return 1; # success } #-> CPAN::Distribution::get_file_onto_local_disk @@ -639,6 +652,8 @@ sub parse_meta_yml { } #-> sub CPAN::Distribution::satisfy_requires ; +# return values: 1 means requirements are satisfied; +# and 0 means not satisfied (and maybe queued) sub satisfy_requires { my ($self) = @_; $self->debug("Entering satisfy_requires") if $CPAN::DEBUG; @@ -656,18 +671,19 @@ sub satisfy_requires { my $follow = eval { $self->follow_prereqs("later",@prereq); }; if (0) { } elsif ($follow) { - # signal success to the queuerunner - return 1; + return; # we need deps } elsif ($@ && ref $@ && $@->isa("CPAN::Exception::RecursiveDependency")) { $CPAN::Frontend->mywarn($@); die "[depend] -- NOT OK\n"; } } } - return; + return 1; } #-> sub CPAN::Distribution::satisfy_configure_requires ; +# return values: 1 means configure_require is satisfied; +# and 0 means not satisfied (and maybe queued) sub satisfy_configure_requires { my($self) = @_; $self->debug("Entering satisfy_configure_requires") if $CPAN::DEBUG; @@ -710,7 +726,7 @@ sub satisfy_configure_requires { }; if (0) { } elsif ($follow) { - return; + return; # we need deps } elsif ($@ && ref $@ && $@->isa("CPAN::Exception::RecursiveDependency")) { $CPAN::Frontend->mywarn($@); return $self->goodbye("[depend] -- NOT OK"); @@ -724,8 +740,9 @@ sub satisfy_configure_requires { #-> sub CPAN::Distribution::choose_MM_or_MB ; sub choose_MM_or_MB { - my($self,$local_file) = @_; + my($self) = @_; $self->satisfy_configure_requires() or return; + my $local_file = $self->{localfile}; my($mpl) = File::Spec->catfile($self->{build_dir},"Makefile.PL"); my($mpl_exists) = -f $mpl; unless ($mpl_exists) { @@ -754,7 +771,6 @@ sub choose_MM_or_MB { $prefer_installer = "mb"; } } - return unless $self->patch; if (lc($prefer_installer) eq "rand") { $prefer_installer = rand()<.5 ? "eumm" : "mb"; } @@ -1063,7 +1079,7 @@ sub _exefile_stanza { $fh->open($script_file) or Carp::croak("Could not open script '$script_file': $!"); local $/ = "\n"; - # name parsen und prereq + # parse name and prereq my($state) = "poddir"; my($name, $prereq) = ("", ""); while (<$fh>) { @@ -1720,48 +1736,78 @@ sub perl { return CPAN::HandleConfig->safe_quote($CPAN::Perl); } +#-> sub CPAN::Distribution::shortcut_prepare ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success -#-> sub CPAN::Distribution::make ; -sub make { - my($self) = @_; - if (my $goto = $self->prefs->{goto}) { - return $self->goto($goto); +sub shortcut_prepare { + my ($self) = @_; + + $self->debug("checking archive type[$self->{ID}]") if $CPAN::DEBUG; + if (!$self->{archived} || $self->{archived} eq "NO") { + return $self->goodbye("Is neither a tar nor a zip archive."); } - my $make = $self->{modulebuild} ? "Build" : "make"; - # Emergency brake if they said install Pippi and get newest perl - if ($self->isa_perl) { + + $self->debug("checking unwrapping[$self->{ID}]") if $CPAN::DEBUG; + if (!$self->{unwrapped} + || ( + UNIVERSAL::can($self->{unwrapped},"failed") ? + $self->{unwrapped}->failed : + $self->{unwrapped} =~ /^NO/ + )) { + return $self->goodbye("Had problems unarchiving. Please build manually"); + } + + $self->debug("checking signature[$self->{ID}]") if $CPAN::DEBUG; + if ( ! $self->{force_update} + && exists $self->{signature_verify} + && ( + UNIVERSAL::can($self->{signature_verify},"failed") ? + $self->{signature_verify}->failed : + $self->{signature_verify} =~ /^NO/ + ) + ) { + return $self->goodbye("Did not pass the signature test."); + } + + $self->debug("checking writemakefile[$self->{ID}]") if $CPAN::DEBUG; + if ($self->{writemakefile}) { if ( - $self->called_for ne $self->id && - ! $self->{force_update} - ) { - # if we die here, we break bundles - $CPAN::Frontend - ->mywarn(sprintf( - qq{The most recent version "%s" of the module "%s" -is part of the perl-%s distribution. To install that, you need to run - force install %s --or-- - install %s -}, - $CPAN::META->instance( - 'CPAN::Module', - $self->called_for - )->cpan_version, - $self->called_for, - $self->isa_perl, - $self->called_for, - $self->id, - )); - $self->{make} = CPAN::Distrostatus->new("NO isa perl"); - $CPAN::Frontend->mysleep(1); - return; + UNIVERSAL::can($self->{writemakefile},"failed") ? + $self->{writemakefile}->failed : + $self->{writemakefile} =~ /^NO/ + ) { + # XXX maybe a retry would be in order? + my $err = UNIVERSAL::can($self->{writemakefile},"text") ? + $self->{writemakefile}->text : + $self->{writemakefile}; + $err =~ s/^NO\s*(--\s+)?//; + $err ||= "Had some problem writing Makefile"; + $err .= ", not re-running"; + return $self->goodbye($err); + } else { + return $self->success("Has already been prepared"); } } - $CPAN::Frontend->myprint(sprintf "Running %s for %s\n", $make, $self->id); - $self->get; - return if $self->prefs->{disabled} && ! $self->{force_update}; - if ($self->{configure_requires_later}) { - return; + + $self->debug("checking configure_requires_later[$self->{ID}]") if $CPAN::DEBUG; + if( my $later = $self->{configure_requires_later} ) { # see also undelay + return $self->goodbye($later); + } + + return undef; # no shortcut +} + +sub prepare { + my ($self) = @_; + + $self->get + or return; + + if ( defined( my $sc = $self->shortcut_prepare) ) { + return $sc; } + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) ? $ENV{PERL5LIB} : ($ENV{PERLLIB} || ""); @@ -1774,103 +1820,37 @@ is part of the perl-%s distribution. To install that, you need to run return; } - my $builddir; - EXCUSE: { - my @e; - if (!$self->{archived} || $self->{archived} eq "NO") { - push @e, "Is neither a tar nor a zip archive."; - } - - if (!$self->{unwrapped} - || ( - UNIVERSAL::can($self->{unwrapped},"failed") ? - $self->{unwrapped}->failed : - $self->{unwrapped} =~ /^NO/ - )) { - push @e, "Had problems unarchiving. Please build manually"; - } - - unless ($self->{force_update}) { - exists $self->{signature_verify} and - ( - UNIVERSAL::can($self->{signature_verify},"failed") ? - $self->{signature_verify}->failed : - $self->{signature_verify} =~ /^NO/ - ) - and push @e, "Did not pass the signature test."; - } - - if (exists $self->{writemakefile} && - ( - UNIVERSAL::can($self->{writemakefile},"failed") ? - $self->{writemakefile}->failed : - $self->{writemakefile} =~ /^NO/ - )) { - # XXX maybe a retry would be in order? - my $err = UNIVERSAL::can($self->{writemakefile},"text") ? - $self->{writemakefile}->text : - $self->{writemakefile}; - $err =~ s/^NO\s*(--\s+)?//; - $err ||= "Had some problem writing Makefile"; - $err .= ", won't make"; - push @e, $err; - } - - if (defined $self->{make}) { - if (UNIVERSAL::can($self->{make},"failed") ? - $self->{make}->failed : - $self->{make} =~ /^NO/) { - if ($self->{force_update}) { - # Trying an already failed 'make' (unless somebody else blocks) - } else { - # introduced for turning recursion detection into a distrostatus - my $error = length $self->{make}>3 - ? substr($self->{make},3) : "Unknown error"; - $CPAN::Frontend->mywarn("Could not make: $error\n"); - $self->store_persistent_state; - return; - } - } else { - push @e, "Has already been made"; - my $wait_for_prereqs = eval { $self->satisfy_requires }; - return 1 if $wait_for_prereqs; # tells queuerunner to continue - return $self->goodbye($@) if $@; # tells queuerunner to stop - } - } - - my $later = $self->{later} || $self->{configure_requires_later}; - if ($later) { # see also undelay - if ($later) { - push @e, $later; - } - } + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); - $CPAN::Frontend->myprint(join "", map {" $_\n"} @e) and return if @e; - $builddir = $self->dir or - $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); - unless (chdir $builddir) { - push @e, "Couldn't chdir to '$builddir': $!"; - } - $CPAN::Frontend->mywarn(join "", map {" $_\n"} @e) and return if @e; + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; } + if ($CPAN::Signal) { delete $self->{force_update}; return; } - $CPAN::Frontend->myprint("\n CPAN.pm: Building ".$self->id."\n\n"); - $self->debug("Changed directory to $builddir") if $CPAN::DEBUG; - if ($^O eq 'MacOS') { - Mac::BuildTools::make($self); - return; - } + $self->debug("Changed directory to $builddir") if $CPAN::DEBUG; local $ENV{PERL_AUTOINSTALL} = $ENV{PERL_AUTOINSTALL}; local $ENV{PERL_EXTUTILS_AUTOINSTALL} = $ENV{PERL_EXTUTILS_AUTOINSTALL}; + $self->choose_MM_or_MB + or return; + + my $configurator = $self->{configure} ? "Configure" + : $self->{modulebuild} ? "Build.PL" + : "Makefile.PL"; + + $CPAN::Frontend->myprint("Configuring ".$self->id." with $configurator\n"); + if ($CPAN::Config->{prerequisites_policy} eq "follow") { $ENV{PERL_AUTOINSTALL} ||= "--defaultdeps"; $ENV{PERL_EXTUTILS_AUTOINSTALL} ||= "--defaultdeps"; } + my $system; my $pl_commandline; if ($self->prefs->{pl}) { @@ -1878,6 +1858,8 @@ is part of the perl-%s distribution. To install that, you need to run } local $ENV{PERL} = $ENV{PERL}; local $ENV{PERL5_CPAN_IS_EXECUTING} = $ENV{PERL5_CPAN_IS_EXECUTING}; + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; if ($pl_commandline) { $system = $pl_commandline; $ENV{PERL} = $^X; @@ -2005,6 +1987,8 @@ is part of the perl-%s distribution. To install that, you need to run if (-f "Makefile" || -f "Build" || ($^O eq 'VMS' && (-f 'descrip.mms' || -f 'Build.com'))) { $self->{writemakefile} = CPAN::Distrostatus->new("YES"); delete $self->{make_clean}; # if cleaned before, enable next + $self->store_persistent_state; + return $self->success("$system -- OK"); } else { my $makefile = $self->{modulebuild} ? "Build" : "Makefile"; my $why = "No '$makefile' created"; @@ -2015,22 +1999,145 @@ is part of the perl-%s distribution. To install that, you need to run return $self->goodbye("$system -- NOT OK"); } } + $self->store_persistent_state; + return 1; # success +} + +#-> sub CPAN::Distribution::shortcut_make ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_make { + my ($self) = @_; + + $self->debug("checking make/build results[$self->{ID}]") if $CPAN::DEBUG; + if (defined $self->{make}) { + if (UNIVERSAL::can($self->{make},"failed") ? + $self->{make}->failed : + $self->{make} =~ /^NO/ + ) { + if ($self->{force_update}) { + # Trying an already failed 'make' (unless somebody else blocks) + return undef; # no shortcut + } else { + # introduced for turning recursion detection into a distrostatus + my $error = length $self->{make}>3 + ? substr($self->{make},3) : "Unknown error"; + $self->store_persistent_state; + return $self->goodbye("Could not make: $error\n"); + } + } else { + return $self->success("Has already been made") + } + } + return undef; # no shortcut +} + +#-> sub CPAN::Distribution::make ; +sub make { + my($self) = @_; + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; + if (my $goto = $self->prefs->{goto}) { + return $self->goto($goto); + } + # Emergency brake if they said install Pippi and get newest perl + + # XXX Would this make more sense in shortcut_prepare, since + # that doesn't make sense on a perl dist either? Broader + # question: what is the purpose of suggesting force install + # on a perl distribution? That seems unlikely to result in + # such a dependency being satisfied, even if the perl is + # successfully installed. This situation is tantamount to + # a prereq on a version of perl greater than the current one + # so I think we should just abort. -- xdg, 2012-04-06 + if ($self->isa_perl) { + if ( + $self->called_for ne $self->id && + ! $self->{force_update} + ) { + # if we die here, we break bundles + $CPAN::Frontend + ->mywarn(sprintf( + qq{The most recent version "%s" of the module "%s" +is part of the perl-%s distribution. To install that, you need to run + force install %s --or-- + install %s +}, + $CPAN::META->instance( + 'CPAN::Module', + $self->called_for + )->cpan_version, + $self->called_for, + $self->isa_perl, + $self->called_for, + $self->id, + )); + $self->{make} = CPAN::Distrostatus->new("NO isa perl"); + $CPAN::Frontend->mysleep(1); + return; + } + } + + $self->prepare + or return; + + if ( defined( my $sc = $self->shortcut_make) ) { + return $sc; + } + if ($CPAN::Signal) { delete $self->{force_update}; return; } - my $wait_for_prereqs = eval { $self->satisfy_requires }; - return 1 if $wait_for_prereqs; # tells queuerunner to continue - return $self->goodbye($@) if $@; # tells queuerunner to stop + + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); + + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; + } + + my $make = $self->{modulebuild} ? "Build" : "make"; + $CPAN::Frontend->myprint(sprintf "Running %s for %s\n", $make, $self->id); + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + $CPAN::META->set_perl5lib; + local $ENV{MAKEFLAGS}; # protect us from outer make calls + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + if ($^O eq 'MacOS') { + Mac::BuildTools::make($self); + return; + } + + my %env; + while (my($k,$v) = each %ENV) { + next unless defined $v; + $env{$k} = $v; + } + local %ENV = %env; + my $satisfied = eval { $self->satisfy_requires }; + return $self->goodbye($@) if $@; + return unless $satisfied ; if ($CPAN::Signal) { delete $self->{force_update}; return; } + my $system; my $make_commandline; if ($self->prefs->{make}) { $make_commandline = $self->prefs->{make}{commandline}; } local $ENV{PERL} = $ENV{PERL}; + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; if ($make_commandline) { $system = $make_commandline; $ENV{PERL} = CPAN::find_perl(); @@ -2093,6 +2200,7 @@ is part of the perl-%s distribution. To install that, you need to run $CPAN::Frontend->mywarn(" $system -- NOT OK\n"); } $self->store_persistent_state; + return !! $system_ok; } # CPAN::Distribution::goodbye ; @@ -2100,7 +2208,14 @@ sub goodbye { my($self,$goodbye) = @_; my $id = $self->pretty_id; $CPAN::Frontend->mywarn(" $id\n $goodbye\n"); - return; + return 0; # must be explicit false, not undef +} + +sub success { + my($self,$why) = @_; + my $id = $self->pretty_id; + $CPAN::Frontend->myprint(" $id\n $why\n"); + return 1; } # CPAN::Distribution::_run_via_expect ; @@ -2448,6 +2563,30 @@ sub _make_command { } } +sub _make_install_make_command { + my ($self) = @_; + my $mimc = + CPAN::HandleConfig->prefs_lookup($self, q{make_install_make_command}); + return $self->_make_command() unless $mimc; + + # Quote the "make install" make command on Windows, where it is commonly + # found in, e.g., C:\Program Files\... and therefore needs quoting. We can't + # do this in general because the command maybe "sudo make..." (i.e. a + # program with arguments), but that is unlikely to be the case on Windows. + $mimc = CPAN::HandleConfig->safe_quote($mimc) if $^O eq 'MSWin32'; + + return $mimc; +} + +#-> sub CPAN::Distribution::is_locally_optional +sub is_locally_optional { + my($self, $prereq_pm, $prereq) = @_; + $prereq_pm ||= $self->{prereq_pm}; + exists $prereq_pm->{opt_requires}{$prereq} + || + exists $prereq_pm->{opt_build_requires}{$prereq}; +} + #-> sub CPAN::Distribution::follow_prereqs ; sub follow_prereqs { my($self) = shift; @@ -2456,13 +2595,14 @@ sub follow_prereqs { return unless @prereq_tuples; my(@good_prereq_tuples); for my $p (@prereq_tuples) { + # e.g. $p = ['Devel::PartialDump', 'r', 1] # promote if possible if ($p->[1] =~ /^(r|c)$/) { push @good_prereq_tuples, $p; } elsif ($p->[1] =~ /^(b)$/) { my $reqtype = CPAN::Queue->reqtype_of($p->[0]); if ($reqtype =~ /^(r|c)$/) { - push @good_prereq_tuples, [$p->[0], $reqtype]; + push @good_prereq_tuples, [$p->[0], $reqtype, $p->[2]]; } else { push @good_prereq_tuples, $p; } @@ -2494,7 +2634,7 @@ sub follow_prereqs { $CPAN::Frontend-> myprint("$filler1 $unsat $filler2". "$filler3 $pretty_id $filler4". - join("", map {" $_->[0] \[$map{$_->[1]}]\n"} @good_prereq_tuples), + join("", map {sprintf " %s \[%s%s]\n", $_->[0], $map{$_->[1]}, $self->is_locally_optional(undef,$_->[0]) ? ",optional" : ""} @good_prereq_tuples), ); my $follow = 0; if ($CPAN::Config->{prerequisites_policy} eq "follow") { @@ -2512,24 +2652,42 @@ of modules we are processing right now?", "yes"); } if ($follow) { my $id = $self->id; - # color them as dirty + my(@to_queue_mand,@to_queue_opt); for my $gp (@good_prereq_tuples) { - # warn "calling color_cmd_tmps(0,1)"; - my $p = $gp->[0]; - my $any = CPAN::Shell->expandany($p); - $self->{$slot . "_for"}{$any->id}++; - if ($any) { - $any->color_cmd_tmps(0,2); + my($prereq,$reqtype,$optional) = @$gp; + my $qthing = +{qmod=>$prereq,reqtype=>$reqtype,optional=>$optional}; + if ($optional && + $self->is_locally_optional(undef,$prereq) + ){ + # Since we do not depend on this one, we do not need + # this in a mandatory arrangement: + push @to_queue_opt, $qthing; } else { - $CPAN::Frontend->mywarn("Warning (maybe a bug): Cannot expand prereq '$p'\n"); - $CPAN::Frontend->mysleep(2); + my $any = CPAN::Shell->expandany($prereq); + $self->{$slot . "_for"}{$any->id}++; + if ($any) { + unless ($optional) { + # No recursion check in an optional area of the tree + $any->color_cmd_tmps(0,2); + } + } else { + $CPAN::Frontend->mywarn("Warning (maybe a bug): Cannot expand prereq '$prereq'\n"); + $CPAN::Frontend->mysleep(2); + } + # order everything that is not locally_optional just + # like mandatory items: this keeps leaves before + # branches + unshift @to_queue_mand, $qthing; } } - # queue them and re-queue yourself - CPAN::Queue->jumpqueue({qmod => $id, reqtype => $self->{reqtype}}, - map {+{qmod=>$_->[0],reqtype=>$_->[1]}} reverse @good_prereq_tuples); - $self->{$slot} = "Delayed until after prerequisites"; - return 1; # signal success to the queuerunner + if (@to_queue_mand) { + unshift @to_queue_mand, {qmod => $id, reqtype => $self->{reqtype}, optional=> !$self->{mandatory}}; + CPAN::Queue->jumpqueue(@to_queue_opt,@to_queue_mand); + $self->{$slot} = "Delayed until after prerequisites"; + return 1; # signal we need dependencies + } elsif (@to_queue_opt) { + CPAN::Queue->jumpqueue(@to_queue_opt); + } } return; } @@ -2572,25 +2730,24 @@ sub _feature_depends { $dep; } -#-> sub CPAN::Distribution::unsat_prereq ; -# return ([Foo,"r"],[Bar,"b"]) for normal modules -# return ([perl=>5.008]) if we need a newer perl than we are running under -# (sorry for the inconsistency, it was an accident) -sub unsat_prereq { +sub prereqs_for_slot { my($self,$slot) = @_; - my(%merged,$prereq_pm); + my($prereq_pm); + my $merged = CPAN::Meta::Requirements->new; my $prefs_depends = $self->prefs->{depends}||{}; my $feature_depends = $self->_feature_depends(); if ($slot eq "configure_requires_later") { - my $meta_configure_requires = $self->configure_requires(); - %merged = ( - %{$meta_configure_requires||{}}, - %{$prefs_depends->{configure_requires}||{}}, - %{$feature_depends->{configure_requires}||{}}, - ); + for my $hash ( $self->configure_requires, + $prefs_depends->{configure_requires}, + $feature_depends->{configure_requires}, + ) { + $merged->add_requirements( + CPAN::Meta::Requirements->from_string_hash($hash) + ); + } if (-f "Build.PL" - && ! -f "Makefile.PL" - && ! exists $merged{"Module::Build"} + && ! -f File::Spec->catfile($self->{build_dir},"Makefile.PL") + && ! $merged->requirements_for_module("Module::Build") && ! $CPAN::META->has_inst("Module::Build") ) { $CPAN::Frontend->mywarn( @@ -2598,13 +2755,13 @@ sub unsat_prereq { " Adding it now as such.\n" ); $CPAN::Frontend->mysleep(5); - $merged{"Module::Build"} = 0; + $merged->add_minimum( "Module::Build" => 0 ); delete $self->{writemakefile}; } $prereq_pm = {}; # configure_requires defined as "b" } elsif ($slot eq "later") { my $prereq_pm_0 = $self->prereq_pm || {}; - for my $reqtype (qw(requires build_requires)) { + for my $reqtype (qw(requires build_requires opt_requires opt_build_requires)) { $prereq_pm->{$reqtype} = {%{$prereq_pm_0->{$reqtype}||{}}}; # copy to not pollute it for my $dep ($prefs_depends,$feature_depends) { for my $k (keys %{$dep->{$reqtype}||{}}) { @@ -2612,14 +2769,37 @@ sub unsat_prereq { } } } - %merged = (%{$prereq_pm->{requires}||{}},%{$prereq_pm->{build_requires}||{}}); + # XXX what about optional_req|breq? -- xdg, 2012-04-01 + for my $hash ( + $prereq_pm->{requires}, + $prereq_pm->{build_requires}, + $prereq_pm->{opt_requires}, + $prereq_pm->{opt_build_requires}, + + ) { + $merged->add_requirements( + CPAN::Meta::Requirements->from_string_hash($hash) + ); + } } else { die "Panic: illegal slot '$slot'"; } + return ($merged->as_string_hash, $prereq_pm); +} + +#-> sub CPAN::Distribution::unsat_prereq ; +# return ([Foo,"r"],[Bar,"b"]) for normal modules +# return ([perl=>5.008]) if we need a newer perl than we are running under +# (sorry for the inconsistency, it was an accident) +sub unsat_prereq { + my($self,$slot) = @_; + my($merged_hash,$prereq_pm) = $self->prereqs_for_slot($slot); my(@need); - my @merged = %merged; + my $merged = CPAN::Meta::Requirements->from_string_hash($merged_hash); + my @merged = $merged->required_modules; CPAN->debug("all merged_prereqs[@merged]") if $CPAN::DEBUG; - NEED: while (my($need_module, $need_version) = each %merged) { + NEED: for my $need_module ( @merged ) { + my $need_version = $merged->requirements_for_module($need_module); my($available_version,$inst_file,$available_file,$nmo); if ($need_module eq "perl") { $available_version = $]; @@ -2636,7 +2816,7 @@ sub unsat_prereq { # if they have not specified a version, we accept any installed one if ( $available_file - and ( # a few quick shortcurcuits + and ( # a few quick short circuits not defined $need_version or $need_version eq '0' # "==" would trigger warning when not numeric or $need_version eq "undef" @@ -2664,8 +2844,7 @@ sub unsat_prereq { $available_version, $need_version, ); - if (0) { - } elsif ( $inst_file + if ( $inst_file && $available_file eq $inst_file && $nmo->inst_deprecated ) { @@ -2682,7 +2861,12 @@ sub unsat_prereq { # loop CPANPLUS => CPANPLUS::Dist::Build RT#83042) next NEED; } - } elsif ($self->{reqtype} =~ /^(r|c)$/ && exists $prereq_pm->{requires}{$need_module} && $nmo && !$inst_file) { + } elsif ( + $self->{reqtype} =~ /^(r|c)$/ + && (exists $prereq_pm->{requires}{$need_module} || exists $prereq_pm->{opt_requires} ) + && $nmo + && !$inst_file + ) { # continue installing as a prereq; this may be a # distro we already used when it was a build_requires # so we did not install it. But suddenly somebody @@ -2766,14 +2950,20 @@ sub unsat_prereq { ) { next NOSAYER; } - $CPAN::Frontend->mywarn("Warning: Prerequisite ". - "'$need_module => $need_version' ". - "for '$selfid' failed when ". - "processing '$did' with ". - "'$nosayer => $do->{$nosayer}'. Continuing, ". - "but chances to succeed are limited.\n" - ); - $CPAN::Frontend->mysleep($sponsoring/10); + ### XXX don't complain about missing optional deps -- xdg, 2012-04-01 + if ($self->is_locally_optional($prereq_pm, $need_module)) { + # don't complain about failing optional prereqs + } + else { + $CPAN::Frontend->mywarn("Warning: Prerequisite ". + "'$need_module => $need_version' ". + "for '$selfid' failed when ". + "processing '$did' with ". + "'$nosayer => $do->{$nosayer}'. Continuing, ". + "but chances to succeed are limited.\n" + ); + $CPAN::Frontend->mysleep($sponsoring/10); + } next NEED; } else { # the other guy succeeded if ($nosayer =~ /^(install|make_test)$/) { @@ -2796,7 +2986,9 @@ sub unsat_prereq { } my $needed_as; if (0) { - } elsif (exists $prereq_pm->{requires}{$need_module}) { + } elsif (exists $prereq_pm->{requires}{$need_module} + || exists $prereq_pm->{opt_requires}{$need_module} + ) { $needed_as = "r"; } elsif ($slot eq "configure_requires_later") { # in ae872487d5 we said: C< we have not yet run the @@ -2809,7 +3001,11 @@ sub unsat_prereq { } else { $needed_as = "b"; } - push @need, [$need_module,$needed_as]; + # here need to flag as optional for recommends/suggests + # -- xdg, 2012-04-01 + my $optional = !$self->{mandatory} + || $self->is_locally_optional($prereq_pm, $need_module); + push @need, [$need_module,$needed_as,$optional]; } my @unfolded = map { "[".join(",",@$_)."]" } @need; CPAN->debug("returning from unsat_prereq[@unfolded]") if $CPAN::DEBUG; @@ -2896,7 +3092,7 @@ sub read_meta { # XXX This should be DEPRECATED -- dagolden, 2011-02-05 sub read_yaml { my($self) = @_; - my $meta_file = $self->pick_meta_file; + my $meta_file = $self->pick_meta_file('\.yml$'); $self->debug("meta_file[$meta_file]") if $CPAN::DEBUG; return unless $meta_file; my $yaml; @@ -2948,11 +3144,14 @@ sub prereq_pm { unless ($self->{build_dir}) { return; } + # no Makefile/Build means configuration aborted, so don't look for prereqs + return unless -f File::Spec->catfile($self->{build_dir},'Makefile') + || -f File::Spec->catfile($self->{build_dir},'Build'); CPAN->debug(sprintf "writemakefile[%s]modulebuild[%s]", $self->{writemakefile}||"", $self->{modulebuild}||"", ) if $CPAN::DEBUG; - my($req,$breq); + my($req,$breq, $opt_req, $opt_breq); my $meta_obj = $self->read_meta; # META/MYMETA is only authoritative if dynamic_config is false if ($meta_obj && ! $meta_obj->dynamic_config) { @@ -2964,10 +3163,31 @@ sub prereq_pm { $build_requires->add_requirements($test_requires); $req = $requires->as_string_hash; $breq = $build_requires->as_string_hash; + + # XXX assemble optional_req && optional_breq from recommends/suggests + # depending on corresponding policies -- xdg, 2012-04-01 + my $opt_runtime = CPAN::Meta::Requirements->new; + my $opt_build = CPAN::Meta::Requirements->new; + if ( $CPAN::Config->{recommends_policy} ) { + $opt_runtime->add_requirements( $prereqs->requirements_for(qw/runtime recommends/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/build recommends/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/test recommends/)); + + } + if ( $CPAN::Config->{suggests_policy} ) { + $opt_runtime->add_requirements( $prereqs->requirements_for(qw/runtime suggests/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/build suggests/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/test suggests/)); + } + $opt_req = $opt_runtime->as_string_hash; + $opt_breq = $opt_build->as_string_hash; } elsif (my $yaml = $self->read_yaml) { # often dynamic_config prevents a result here $req = $yaml->{requires} || {}; $breq = $yaml->{build_requires} || {}; + if ( $CPAN::Config->{recommends_policy} ) { + $opt_req = $yaml->{recommends} || {}; + } undef $req unless ref $req eq "HASH" && %$req; if ($req) { if ($yaml->{generated_by} && @@ -3074,29 +3294,142 @@ sub prereq_pm { } } } - if ($req || $breq) { - return $self->{prereq_pm} = { requires => $req, build_requires => $breq }; + # XXX needs to be adapted for optional_req & optional_breq -- xdg, 2012-04-01 + if ($req || $breq || $opt_req || $opt_breq ) { + return $self->{prereq_pm} = { + requires => $req, + build_requires => $breq, + opt_requires => $opt_req, + opt_build_requires => $opt_breq, + }; + } +} + +#-> sub CPAN::Distribution::shortcut_test ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_test { + my ($self) = @_; + + $self->debug("checking badtestcnt[$self->{ID}]") if $CPAN::DEBUG; + $self->{badtestcnt} ||= 0; + if ($self->{badtestcnt} > 0) { + require Data::Dumper; + CPAN->debug(sprintf "NOREPEAT[%s]", Data::Dumper::Dumper($self)) if $CPAN::DEBUG; + return $self->goodbye("Won't repeat unsuccessful test during this command"); + } + + for my $slot ( qw/later configure_requires_later/ ) { + $self->debug("checking $slot slot[$self->{ID}]") if $CPAN::DEBUG; + return $self->success($self->{$slot}) + if $self->{$slot}; + } + + $self->debug("checking if tests passed[$self->{ID}]") if $CPAN::DEBUG; + if ( $self->{make_test} ) { + if ( + UNIVERSAL::can($self->{make_test},"failed") ? + $self->{make_test}->failed : + $self->{make_test} =~ /^NO/ + ) { + if ( + UNIVERSAL::can($self->{make_test},"commandid") + && + $self->{make_test}->commandid == $CPAN::CurrentCommandId + ) { + return $self->goodbye("Has already been tested within this command"); + } + } else { + # if global "is_tested" has been cleared, we need to mark this to + # be added to PERL5LIB if not already installed + if ($self->tested_ok_but_not_installed) { + $CPAN::META->is_tested($self->{build_dir},$self->{make_test}{TIME}); + } + return $self->success("Has already been tested successfully"); + } + } + + if ($self->{notest}) { + $self->{make_test} = CPAN::Distrostatus->new("YES"); + return $self->success("Skipping test because of notest pragma"); + } + + return undef; # no shortcut +} + +#-> sub CPAN::Distribution::_exe_files ; +sub _exe_files { + my($self) = @_; + return unless $self->{writemakefile} # no need to have succeeded + # but we must have run it + || $self->{modulebuild}; + unless ($self->{build_dir}) { + return; + } + CPAN->debug(sprintf "writemakefile[%s]modulebuild[%s]", + $self->{writemakefile}||"", + $self->{modulebuild}||"", + ) if $CPAN::DEBUG; + my $build_dir; + unless ( $build_dir = $self->{build_dir} ) { + return; + } + my $makefile = File::Spec->catfile($build_dir,"Makefile"); + my $fh; + my @exe_files; + if (-f $makefile + and + $fh = FileHandle->new("<$makefile\0")) { + CPAN->debug("Getting exefiles from Makefile") if $CPAN::DEBUG; + local($/) = "\n"; + while (<$fh>) { + last if /MakeMaker post_initialize section/; + my($p) = m{^[\#] + \s+EXE_FILES\s+=>\s+\[(.+)\] + }x; + next unless $p; + # warn "Found exefiles expr[$p]"; + my @p = split /,\s*/, $p; + for my $p2 (@p) { + if ($p2 =~ /^q\[(.+)\]/) { + push @exe_files, $1; + } + } + } + } + return \@exe_files if @exe_files; + my $buildparams = File::Spec->catfile($build_dir,"_build","build_params"); + if (-f $buildparams) { + CPAN->debug("Found '$buildparams'") if $CPAN::DEBUG; + my $x = do $buildparams; + for my $sf (@{$x->[2]{script_files} || []}) { + push @exe_files, $sf; + } } + return \@exe_files; } #-> sub CPAN::Distribution::test ; sub test { my($self) = @_; + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; if (my $goto = $self->prefs->{goto}) { return $self->goto($goto); } - $self->make; - return if $self->prefs->{disabled} && ! $self->{force_update}; + + $self->make + or return; + + if ( defined( my $sc = $self->shortcut_test ) ) { + return $sc; + } + if ($CPAN::Signal) { delete $self->{force_update}; return; } # warn "XDEBUG: checking for notest: $self->{notest} $self"; - if ($self->{notest}) { - $CPAN::Frontend->myprint("Skipping test because of notest pragma\n"); - return 1; - } - my $make = $self->{modulebuild} ? "Build" : "make"; local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) @@ -3106,66 +3439,19 @@ sub test { local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; $CPAN::META->set_perl5lib; local $ENV{MAKEFLAGS}; # protect us from outer make calls + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; $CPAN::Frontend->myprint("Running $make test\n"); - EXCUSE: { - my @e; - if ($self->{make} or $self->{later}) { - # go ahead - } else { - push @e, - "Make had some problems, won't test"; - } - - exists $self->{make} and - ( - UNIVERSAL::can($self->{make},"failed") ? - $self->{make}->failed : - $self->{make} =~ /^NO/ - ) and push @e, "Can't test without successful make"; - $self->{badtestcnt} ||= 0; - if ($self->{badtestcnt} > 0) { - require Data::Dumper; - CPAN->debug(sprintf "NOREPEAT[%s]", Data::Dumper::Dumper($self)) if $CPAN::DEBUG; - push @e, "Won't repeat unsuccessful test during this command"; - } - - push @e, $self->{later} if $self->{later}; - push @e, $self->{configure_requires_later} if $self->{configure_requires_later}; - - if (exists $self->{build_dir}) { - if (exists $self->{make_test}) { - if ( - UNIVERSAL::can($self->{make_test},"failed") ? - $self->{make_test}->failed : - $self->{make_test} =~ /^NO/ - ) { - if ( - UNIVERSAL::can($self->{make_test},"commandid") - && - $self->{make_test}->commandid == $CPAN::CurrentCommandId - ) { - push @e, "Has already been tested within this command"; - } - } else { - push @e, "Has already been tested successfully"; - # if global "is_tested" has been cleared, we need to mark this to - # be added to PERL5LIB if not already installed - if ($self->tested_ok_but_not_installed) { - $CPAN::META->is_tested($self->{build_dir},$self->{make_test}{TIME}); - } - } - } - } elsif (!@e) { - push @e, "Has no own directory"; - } - $CPAN::Frontend->myprint(join "", map {" $_\n"} @e) and return if @e; - unless (chdir $self->{build_dir}) { - push @e, "Couldn't chdir to '$self->{build_dir}': $!"; - } - $CPAN::Frontend->mywarn(join "", map {" $_\n"} @e) and return if @e; + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); + + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; } + $self->debug("Changed directory to $self->{build_dir}") if $CPAN::DEBUG; @@ -3287,6 +3573,10 @@ sub test { $but .= "; additionally test harness failed"; $CPAN::Frontend->mywarn("$but\n"); $self->{make_test} = CPAN::Distrostatus->new("NO $but"); + } elsif ( $self->{force_update} ) { + $self->{make_test} = CPAN::Distrostatus->new( + "NO but failure ignored because 'force' in effect" + ); } else { $self->{make_test} = CPAN::Distrostatus->new("NO"); } @@ -3300,6 +3590,8 @@ sub test { $self->pretty_id)); } $self->store_persistent_state; + + return $self->{force_update} ? 1 : !! $tests_ok; } sub _make_test_illuminate_prereqs { @@ -3331,7 +3623,8 @@ sub _make_test_illuminate_prereqs { CPAN->debug("m[$m] have available_file[$available_file]") if $CPAN::DEBUG; } else { - push @prereq, $m; + push @prereq, $m + if $m_obj->{mandatory}; } } my $but; @@ -3443,6 +3736,20 @@ sub clean { $self->store_persistent_state; } +#-> sub CPAN::Distribution::check_disabled ; +sub check_disabled { + my ($self) = @_; + $self->debug("checking disabled id[$self->{ID}]") if $CPAN::DEBUG; + if ($self->prefs->{disabled} && ! $self->{force_update}) { + return sprintf( + "Disabled via prefs file '%s' doc %d", + $self->{prefs_file}, + $self->{prefs_file_doc}, + ); + } + return; +} + #-> sub CPAN::Distribution::goto ; sub goto { my($self,$goto) = @_; @@ -3469,87 +3776,76 @@ sub goto { my($method) = (caller(1))[3]; CPAN->instance("CPAN::Distribution",$goto)->$method(); CPAN::Queue->delete_first($goto); + # XXX delete_first returns undef; is that what this should return + # up the call stack, eg. return $sefl->goto($goto) -- xdg, 2012-04-04 +} + +#-> sub CPAN::Distribution::shortcut_install ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_install { + my ($self) = @_; + + $self->debug("checking previous install results[$self->{ID}]") if $CPAN::DEBUG; + if (exists $self->{install}) { + my $text = UNIVERSAL::can($self->{install},"text") ? + $self->{install}->text : + $self->{install}; + if ($text =~ /^YES/) { + $CPAN::META->is_installed($self->{build_dir}); + return $self->success("Already done"); + } elsif ($text =~ /is only/) { + # e.g. 'is only build_requires' + return $self->goodbye($text); + } else { + # comment in Todo on 2006-02-11; maybe retry? + return $self->goodbye("Already tried without success"); + } + } + + for my $slot ( qw/later configure_requires_later/ ) { + return $self->success($self->{$slot}) + if $self->{$slot}; + } + + return undef; } #-> sub CPAN::Distribution::install ; sub install { my($self) = @_; + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; if (my $goto = $self->prefs->{goto}) { return $self->goto($goto); } - unless ($self->{badtestcnt}) { - $self->test; + + $self->test + or return; + + if ( defined( my $sc = $self->shortcut_install ) ) { + return $sc; } + if ($CPAN::Signal) { delete $self->{force_update}; return; } - my $make = $self->{modulebuild} ? "Build" : "make"; - $CPAN::Frontend->myprint("Running $make install\n"); - EXCUSE: { - my @e; - if ($self->{make} or $self->{later}) { - # go ahead - } else { - push @e, - "Make had some problems, won't install"; - } - - exists $self->{make} and - ( - UNIVERSAL::can($self->{make},"failed") ? - $self->{make}->failed : - $self->{make} =~ /^NO/ - ) and - push @e, "Make had returned bad status, install seems impossible"; - - if (exists $self->{build_dir}) { - } elsif (!@e) { - push @e, "Has no own directory"; - } - - if (exists $self->{make_test} and - ( - UNIVERSAL::can($self->{make_test},"failed") ? - $self->{make_test}->failed : - $self->{make_test} =~ /^NO/ - )) { - if ($self->{force_update}) { - $self->{make_test}->text("FAILED but failure ignored because ". - "'force' in effect"); - } else { - push @e, "make test had returned bad status, ". - "won't install without force" - } - } - if (exists $self->{install}) { - my $text = UNIVERSAL::can($self->{install},"text") ? - $self->{install}->text : - $self->{install}; - if ($text =~ /^YES/) { - $CPAN::Frontend->myprint(" Already done\n"); - $CPAN::META->is_installed($self->{build_dir}); - return 1; - } elsif ($text =~ /is only/) { - push @e, $text; - } else { - # comment in Todo on 2006-02-11; maybe retry? - push @e, "Already tried without success"; - } - } - push @e, $self->{later} if $self->{later}; - push @e, $self->{configure_requires_later} if $self->{configure_requires_later}; + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); - $CPAN::Frontend->myprint(join "", map {" $_\n"} @e) and return if @e; - unless (chdir $self->{build_dir}) { - push @e, "Couldn't chdir to '$self->{build_dir}': $!"; - } - $CPAN::Frontend->mywarn(join "", map {" $_\n"} @e) and return if @e; + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; } + $self->debug("Changed directory to $self->{build_dir}") if $CPAN::DEBUG; + my $make = $self->{modulebuild} ? "Build" : "make"; + $CPAN::Frontend->myprint("Running $make install\n"); + if ($^O eq 'MacOS') { Mac::BuildTools::make_install($self); return; @@ -3573,10 +3869,7 @@ sub install { ); } else { - my($make_install_make_command) = - CPAN::HandleConfig->prefs_lookup($self, - q{make_install_make_command}) - || $self->_make_command(); + my($make_install_make_command) = $self->_make_install_make_command(); $system = sprintf("%s install %s", $make_install_make_command, $CPAN::Config->{make_install_arg}, @@ -3605,10 +3898,9 @@ sub install { } unless ($want_install =~ /^y/i) { my $is_only = "is only 'build_requires'"; - $CPAN::Frontend->mywarn("Not installing because $is_only\n"); $self->{install} = CPAN::Distrostatus->new("NO -- $is_only"); delete $self->{force_update}; - return; + return $self->goodbye("Not installing because $is_only"); } local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) ? $ENV{PERL5LIB} @@ -3616,6 +3908,9 @@ sub install { local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; $CPAN::META->set_perl5lib; + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; + my($pipe) = FileHandle->new("$system $stderr |") || Carp::croak ("Can't execute $system: $!"); my($makeout) = ""; @@ -3659,6 +3954,7 @@ sub install { } delete $self->{force_update}; $self->store_persistent_state; + return !! $close_ok; } sub introduce_myself { @@ -4011,7 +4307,7 @@ sub reports { } $CPAN::Frontend->myprint("DONE\n\n"); my $yaml = $resp->content; - # was fuer ein Umweg! + # what a long way round! my $fh = File::Temp->new( dir => File::Spec->tmpdir, template => 'cpan_reports_XXXX', diff --git a/Master/tlpkg/tlperl/lib/CPAN/Distroprefs.pm b/Master/tlpkg/tlperl/lib/CPAN/Distroprefs.pm index 61c389ed2d3..05b19faa47a 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Distroprefs.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Distroprefs.pm @@ -1,11 +1,12 @@ # -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- # vim: ts=4 sts=4 sw=4: +use 5.006; use strict; package CPAN::Distroprefs; use vars qw($VERSION); -$VERSION = '6'; +$VERSION = '6.0001'; package CPAN::Distroprefs::Result; @@ -147,26 +148,53 @@ sub _load_st { return @data; } +sub _build_file_list { + if (@_ > 3) { + die "_build_file_list should be called with 3 arguments, was called with more. First argument is '$_[0]'."; + } + my ($dir, $dir1, $ext_re) = @_; + my @list; + my $dh; + unless (opendir($dh, $dir)) { + $CPAN::Frontend->mywarn("ignoring prefs directory '$dir': $!"); + return @list; + } + while (my $fn = readdir $dh) { + next if $fn eq '.' || $fn eq '..'; + if (-d "$dir/$fn") { + next if $fn =~ /^[._]/; # prune .svn, .git, .hg, _darcs and what the user wants to hide + push @list, _build_file_list("$dir/$fn", "$dir1$fn/", $ext_re); + } else { + if ($fn =~ $ext_re) { + push @list, "$dir1$fn"; + } + } + } + return @list; +} + sub find { my ($self, $dir, $ext_map) = @_; - my $dh = DirHandle->new($dir) or Carp::croak("Couldn't open '$dir': $!"); - my @files = sort $dh->read; + return CPAN::Distroprefs::Iterator->new(sub { return }) unless %$ext_map; + + my $possible_ext = join "|", map { quotemeta } keys %$ext_map; + my $ext_re = qr/\.($possible_ext)$/; + + my @files = _build_file_list($dir, '', $ext_re); + @files = sort @files if @files; # label the block so that we can use redo in the middle return CPAN::Distroprefs::Iterator->new(sub { LOOP: { - return unless %$ext_map; - local $_ = shift @files; - return unless defined; - redo if $_ eq '.' || $_ eq '..'; + my $fn = shift @files; + return unless defined $fn; + my ($ext) = $fn =~ $ext_re; - my $possible_ext = join "|", map { quotemeta } keys %$ext_map; - my ($ext) = /\.($possible_ext)$/ or redo; my $loader = $ext_map->{$ext}; my $result = CPAN::Distroprefs::Result->new({ - file => $_, ext => $ext, dir => $dir + file => $fn, ext => $ext, dir => $dir }); # copied from CPAN.pm; is this ever actually possible? redo unless -f $result->abs; @@ -346,7 +374,9 @@ This module encapsulates reading L and matching them against C while (my $result = $finder->next) { ... } -Build an iterator which finds distroprefs files in the given directory. +Build an iterator which finds distroprefs files in the tree below the +given directory. Within the tree directories matching C are +pruned. C<%ext_map> is a hashref whose keys are file extensions and whose values are modules used to load matching files: diff --git a/Master/tlpkg/tlperl/lib/CPAN/FTP.pm b/Master/tlpkg/tlperl/lib/CPAN/FTP.pm index 997e141be5a..831f234d3ce 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/FTP.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/FTP.pm @@ -14,7 +14,7 @@ use vars qw($connect_to_internet_ok $Ua $Thesite $ThesiteURL $Themethod); use vars qw( $VERSION ); -$VERSION = "5.5005"; +$VERSION = "5.5006"; #-> sub CPAN::FTP::ftp_statistics # if they want to rewrite, they need to pass in a filehandle @@ -48,7 +48,8 @@ sub _ftp_statistics { if ($@) { if (ref $@) { if (ref $@ eq "CPAN::Exception::yaml_not_installed") { - $CPAN::Frontend->myprint("Warning (usually harmless): $@\n"); + chomp $@; + $CPAN::Frontend->myprintonce("Warning (usually harmless): $@\n"); return; } elsif (ref $@ eq "CPAN::Exception::yaml_process_error") { my $time = time; diff --git a/Master/tlpkg/tlperl/lib/CPAN/FirstTime.pm b/Master/tlpkg/tlperl/lib/CPAN/FirstTime.pm index b099b04a110..d1a8eef2607 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/FirstTime.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/FirstTime.pm @@ -10,7 +10,7 @@ use File::Path (); use File::Spec (); use CPAN::Mirrors (); use vars qw($VERSION $auto_config); -$VERSION = "5.5304"; +$VERSION = "5.5306"; =head1 NAME @@ -132,6 +132,9 @@ warnings, debugging output, and the output of the modules being installed. Set your favorite colors after some experimenting with the Term::ANSIColor module. +Please note that on Windows platforms colorized output also requires +the Win32::Console::ANSI module. + Do you want to turn on colored output? =item colorize_print @@ -203,7 +206,8 @@ Preferred method for determining the current working directory? Normally, CPAN.pm continues processing the full list of targets and dependencies, even if one of them fails. However, you can specify -that CPAN should halt after the first failure. +that CPAN should halt after the first failure. (Note that optional +recommended or suggested modules that fail will not cause a halt.) Do you want to halt on failure (yes/no)? @@ -420,6 +424,14 @@ host should be tried first. Randomize parameter +=item recommends_policy + +(Experimental feature!) Some CPAN modules recommend additional, optional dependencies. These should +generally be installed except in resource constrained environments. When this +policy is true, recommended modules will be included with required modules. + +Included recommended modules? + =item scan_cache By default, each time the CPAN module is started, cache scanning is @@ -462,6 +474,14 @@ variable. Show all individual modules that have a $VERSION of zero? +=item suggests_policy + +(Experimental feature!) Some CPAN modules suggest additional, optional dependencies. These 'suggest' +dependencies provide enhanced operation. When this policy is true, suggested +modules will be included with required modules. + +Included suggested modules? + =item tar_verbosity When CPAN.pm uses the tar command, which switch for the verbosity @@ -538,6 +558,17 @@ regardless of the history using "force". Do you want to rely on the test report history (yes/no)? +=item use_prompt_default + +When this is true, CPAN will set PERL_MM_USE_DEFAULT to a true +value. This causes ExtUtils::MakeMaker (and compatible) prompts +to use default values instead of stopping to prompt you to answer +questions. It also sets NONINTERACTIVE_TESTING to a true value to +signal more generally that distributions should not try to +interact with you. + +Do you want to use prompt defaults (yes/no)? + =item use_sqlite CPAN::SQLite is a layer between the index files that are downloaded @@ -865,6 +896,8 @@ sub init { 'follow|ask|ignore'); my_prompt_loop(build_requires_install_policy => 'yes', $matcher, 'yes|no|ask/yes|ask/no'); + my_yn_prompt(recommends_policy => 1, $matcher); + my_yn_prompt(suggests_policy => 0, $matcher); # #= Module::Signature @@ -1045,6 +1078,11 @@ sub init { my_dflt_prompt(mbuild_install_arg => "", $matcher); + # + #== use_prompt_default + # + my_yn_prompt(use_prompt_default => 0, $matcher); + # #= Alarm period # @@ -1224,10 +1262,7 @@ sub init { ); } else { - $CPAN::Frontend->myprint( - "Autoconfigured everything but 'urllist'.\n" - ); - _do_pick_mirrors(); + $CPAN::Config->{urllist} = [ 'http://www.cpan.org/' ]; } } elsif (!$matcher || "urllist" =~ $matcher) { @@ -1298,10 +1333,6 @@ sub init { sub _local_lib_config { # Set environment stuff for this process require local::lib; - my %env = local::lib->build_environment_vars_for(_local_lib_path(), 1); - while ( my ($k, $v) = each %env ) { - $ENV{$k} = $v; - } # Tell user about environment vars to set $CPAN::Frontend->myprint($prompts{local_lib_installed}); @@ -1309,6 +1340,12 @@ sub _local_lib_config { my $shellvars = local::lib->environment_vars_string_for(_local_lib_path()); $CPAN::Frontend->myprint($shellvars); + # Set %ENV after getting string above + my %env = local::lib->build_environment_vars_for(_local_lib_path(), 1); + while ( my ($k, $v) = each %env ) { + $ENV{$k} = $v; + } + # Offer to mangle the shell config my $munged_rc; if ( my $rc = _find_shell_config() ) { @@ -1853,8 +1890,7 @@ sub auto_mirrored_by { my $local = shift or return; local $|=1; $CPAN::Frontend->myprint("Looking for CPAN mirrors near you (please be patient)\n"); - my $mirrors = CPAN::Mirrors->new; - $mirrors->parse_mirrored_by($local); + my $mirrors = CPAN::Mirrors->new($local); my $cnt = 0; my @best = $mirrors->best_mirrors( diff --git a/Master/tlpkg/tlperl/lib/CPAN/HTTP/Client.pm b/Master/tlpkg/tlperl/lib/CPAN/HTTP/Client.pm index c5eb0f6a435..4fc792c26a4 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/HTTP/Client.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/HTTP/Client.pm @@ -6,7 +6,7 @@ use vars qw(@ISA); use CPAN::HTTP::Credentials; use HTTP::Tiny 0.005; -$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9600"; +$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9601"; # CPAN::HTTP::Client is adapted from parts of cpanm by Tatsuhiko Miyagawa # and parts of LWP by Gisle Aas @@ -78,7 +78,7 @@ sub _auth_headers { # Get user credentials for mode my $cred_method = "get_" . ($mode ? "proxy" : "non_proxy") ."_credentials"; - my ($user, $pass) = return CPAN::HTTP::Credentials->$cred_method; + my ($user, $pass) = CPAN::HTTP::Credentials->$cred_method; # Generate the header for the mode & type my $header = $mode eq 'proxy' ? 'Proxy-Authorization' : 'Authorization'; diff --git a/Master/tlpkg/tlperl/lib/CPAN/HandleConfig.pm b/Master/tlpkg/tlperl/lib/CPAN/HandleConfig.pm index 2978c3bde99..a138128bdfe 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/HandleConfig.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/HandleConfig.pm @@ -12,7 +12,7 @@ CPAN::HandleConfig - internal configuration handling for CPAN.pm =cut -$VERSION = "5.5003"; # see also CPAN::Config::VERSION at end of file +$VERSION = "5.5005"; # see also CPAN::Config::VERSION at end of file %can = ( commit => "Commit changes to disk", @@ -95,11 +95,13 @@ $VERSION = "5.5003"; # see also CPAN::Config::VERSION at end of file "proxy_pass", "proxy_user", "randomize_urllist", + "recommends_policy", "scan_cache", "shell", "show_unparsable_versions", "show_upload_date", "show_zero_versions", + "suggests_policy", "tar", "tar_verbosity", "term_is_latin", @@ -108,6 +110,7 @@ $VERSION = "5.5003"; # see also CPAN::Config::VERSION at end of file "trust_test_report_history", "unzip", "urllist", + "use_prompt_default", "use_sqlite", "username", "version_timeout", @@ -765,7 +768,7 @@ sub prefs_lookup { use strict; use vars qw($AUTOLOAD $VERSION); - $VERSION = "5.5001"; + $VERSION = "5.5005"; # formerly CPAN::HandleConfig was known as CPAN::Config sub AUTOLOAD { ## no critic diff --git a/Master/tlpkg/tlperl/lib/CPAN/Index.pm b/Master/tlpkg/tlperl/lib/CPAN/Index.pm index c338cc7ec7b..8205d78bd02 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Index.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Index.pm @@ -1,11 +1,11 @@ package CPAN::Index; use strict; use vars qw($LAST_TIME $DATE_OF_02 $DATE_OF_03 $HAVE_REANIMATED $VERSION); -$VERSION = "1.9600"; +$VERSION = "1.9601"; @CPAN::Index::ISA = qw(CPAN::Debug); $LAST_TIME ||= 0; $DATE_OF_03 ||= 0; -# use constant PROTOCOL => "2.0"; # outcommented to avoid warning on upgrade from 1.57 +# use constant PROTOCOL => "2.0"; # commented out to avoid warning on upgrade from 1.57 sub PROTOCOL { 2.0 } #-> sub CPAN::Index::force_reload ; @@ -123,75 +123,76 @@ sub reanimate_build_dir { my $i = 0; my $painted = 0; my $restored = 0; + my $start = CPAN::FTP::_mytime(); my @candidates = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, -M File::Spec->catfile($d,$_) ] } grep {/(.+)\.yml$/ && -d File::Spec->catfile($d,$1)} readdir $dh; - unless (@candidates) { - $CPAN::Frontend->myprint("Build_dir empty, nothing to restore\n"); - return; - } - $CPAN::Frontend->myprint - (sprintf("Reading %d yaml file%s from %s/\n", - scalar @candidates, - @candidates==1 ? "" : "s", - $CPAN::Config->{build_dir} - )); - my $start = CPAN::FTP::_mytime(); - DISTRO: for $i (0..$#candidates) { - my $dirent = $candidates[$i]; - my $y = eval {CPAN->_yaml_loadfile(File::Spec->catfile($d,$dirent))}; - if ($@) { - warn "Error while parsing file '$dirent'; error: '$@'"; - next DISTRO; - } - my $c = $y->[0]; - if ($c && $c->{perl} && $c->{distribution} && CPAN->_perl_fingerprint($c->{perl})) { - my $key = $c->{distribution}{ID}; - for my $k (keys %{$c->{distribution}}) { - if ($c->{distribution}{$k} - && ref $c->{distribution}{$k} - && UNIVERSAL::isa($c->{distribution}{$k},"CPAN::Distrostatus")) { - $c->{distribution}{$k}{COMMANDID} = $i - @candidates; - } + if ( @candidates ) { + $CPAN::Frontend->myprint + (sprintf("Reading %d yaml file%s from %s/\n", + scalar @candidates, + @candidates==1 ? "" : "s", + $CPAN::Config->{build_dir} + )); + DISTRO: for $i (0..$#candidates) { + my $dirent = $candidates[$i]; + my $y = eval {CPAN->_yaml_loadfile(File::Spec->catfile($d,$dirent))}; + if ($@) { + warn "Error while parsing file '$dirent'; error: '$@'"; + next DISTRO; } + my $c = $y->[0]; + if ($c && $c->{perl} && $c->{distribution} && CPAN->_perl_fingerprint($c->{perl})) { + my $key = $c->{distribution}{ID}; + for my $k (keys %{$c->{distribution}}) { + if ($c->{distribution}{$k} + && ref $c->{distribution}{$k} + && UNIVERSAL::isa($c->{distribution}{$k},"CPAN::Distrostatus")) { + $c->{distribution}{$k}{COMMANDID} = $i - @candidates; + } + } - #we tried to restore only if element already - #exists; but then we do not work with metadata - #turned off. - my $do - = $CPAN::META->{readwrite}{'CPAN::Distribution'}{$key} - = $c->{distribution}; - for my $skipper (qw( - badtestcnt - configure_requires_later - configure_requires_later_for - force_update - later - later_for - notest - should_report - sponsored_mods - prefs - negative_prefs_cache - )) { - delete $do->{$skipper}; - } - if ($do->can("tested_ok_but_not_installed")) { - if ($do->tested_ok_but_not_installed) { - $CPAN::META->is_tested($do->{build_dir},$do->{make_test}{TIME}); - } else { - next DISTRO; + #we tried to restore only if element already + #exists; but then we do not work with metadata + #turned off. + my $do + = $CPAN::META->{readwrite}{'CPAN::Distribution'}{$key} + = $c->{distribution}; + for my $skipper (qw( + badtestcnt + configure_requires_later + configure_requires_later_for + force_update + later + later_for + notest + should_report + sponsored_mods + prefs + negative_prefs_cache + )) { + delete $do->{$skipper}; } + if ($do->can("tested_ok_but_not_installed")) { + if ($do->tested_ok_but_not_installed) { + $CPAN::META->is_tested($do->{build_dir},$do->{make_test}{TIME}); + } else { + next DISTRO; + } + } + $restored++; + } + $i++; + while (($painted/76) < ($i/@candidates)) { + $CPAN::Frontend->myprint("."); + $painted++; } - $restored++; - } - $i++; - while (($painted/76) < ($i/@candidates)) { - $CPAN::Frontend->myprint("."); - $painted++; } } + else { + $CPAN::Frontend->myprint("Build_dir empty, nothing to restore\n"); + } my $took = CPAN::FTP::_mytime() - $start; $CPAN::Frontend->myprint(sprintf( "DONE\nRestored the state of %s (in %.4f secs)\n", diff --git a/Master/tlpkg/tlperl/lib/CPAN/LWP/UserAgent.pm b/Master/tlpkg/tlperl/lib/CPAN/LWP/UserAgent.pm index e9fbc7bcded..fe8bf27a4a9 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/LWP/UserAgent.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/LWP/UserAgent.pm @@ -6,7 +6,7 @@ use vars qw(@ISA $USER $PASSWD $SETUPDONE); use CPAN::HTTP::Credentials; # we delay requiring LWP::UserAgent and setting up inheritance until we need it -$CPAN::LWP::UserAgent::VERSION = $CPAN::LWP::UserAgent::VERSION = "1.9600"; +$CPAN::LWP::UserAgent::VERSION = $CPAN::LWP::UserAgent::VERSION = "1.9601"; sub config { @@ -35,22 +35,7 @@ sub no_proxy { } # mirror(): Its purpose is to deal with proxy authentication. When we -# call SUPER::mirror, we relly call the mirror method in -# LWP::UserAgent. LWP::UserAgent will then call -# $self->get_basic_credentials or some equivalent and this will be -# $self->dispatched to our own get_basic_credentials method. - -# Our own get_basic_credentials sets $USER and $PASSWD, two globals. - -# 407 stands for HTTP_PROXY_AUTHENTICATION_REQUIRED. Which means -# although we have gone through our get_basic_credentials, the proxy -# server refuses to connect. This could be a case where the username or -# password has changed in the meantime, so I'm trying once again without -# $USER and $PASSWD to give the get_basic_credentials routine another -# chance to set $USER and $PASSWD. - -# mirror(): Its purpose is to deal with proxy authentication. When we -# call SUPER::mirror, we relly call the mirror method in +# call SUPER::mirror, we really call the mirror method in # LWP::UserAgent. LWP::UserAgent will then call # $self->get_basic_credentials or some equivalent and this will be # $self->dispatched to our own get_basic_credentials method. diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta.pm index 19980bd4fc8..3ab0111844a 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta.pm @@ -2,18 +2,81 @@ use 5.006; use strict; use warnings; package CPAN::Meta; -our $VERSION = '2.120921'; # VERSION - +our $VERSION = '2.140640'; # VERSION + +# =head1 SYNOPSIS +# +# use v5.10; +# use strict; +# use warnings; +# use CPAN::Meta; +# use Module::Load; +# +# my $meta = CPAN::Meta->load_file('META.json'); +# +# printf "testing requirements for %s version %s\n", +# $meta->name, +# $meta->version; +# +# my $prereqs = $meta->effective_prereqs; +# +# for my $phase ( qw/configure runtime build test/ ) { +# say "Requirements for $phase:"; +# my $reqs = $prereqs->requirements_for($phase, "requires"); +# for my $module ( sort $reqs->required_modules ) { +# my $status; +# if ( eval { load $module unless $module eq 'perl'; 1 } ) { +# my $version = $module eq 'perl' ? $] : $module->VERSION; +# $status = $reqs->accepts_module($module, $version) +# ? "$version ok" : "$version not ok"; +# } else { +# $status = "missing" +# }; +# say " $module ($status)"; +# } +# } +# +# =head1 DESCRIPTION +# +# Software distributions released to the CPAN include a F or, for +# older distributions, F, which describes the distribution, its +# contents, and the requirements for building and installing the distribution. +# The data structure stored in the F file is described in +# L. +# +# CPAN::Meta provides a simple class to represent this distribution metadata (or +# I), along with some helpful methods for interrogating that data. +# +# The documentation below is only for the methods of the CPAN::Meta object. For +# information on the meaning of individual fields, consult the spec. +# +# =cut use Carp qw(carp croak); use CPAN::Meta::Feature; use CPAN::Meta::Prereqs; use CPAN::Meta::Converter; use CPAN::Meta::Validator; -use Parse::CPAN::Meta 1.4403 (); +use Parse::CPAN::Meta 1.4414 (); BEGIN { *_dclone = \&CPAN::Meta::Converter::_dclone } +# =head1 STRING DATA +# +# The following methods return a single value, which is the value for the +# corresponding entry in the distmeta structure. Values should be either undef +# or strings. +# +# =for :list +# * abstract +# * description +# * dynamic_config +# * generated_by +# * name +# * release_status +# * version +# +# =cut BEGIN { my @STRING_READERS = qw( @@ -32,6 +95,20 @@ BEGIN { } } +# =head1 LIST DATA +# +# These methods return lists of string values, which might be represented in the +# distmeta structure as arrayrefs or scalars: +# +# =for :list +# * authors +# * keywords +# * licenses +# +# The C and C methods may also be called as C and +# C, respectively, to match the field name in the distmeta structure. +# +# =cut BEGIN { my @LIST_READERS = qw( @@ -55,6 +132,20 @@ BEGIN { sub authors { $_[0]->author } sub licenses { $_[0]->license } +# =head1 MAP DATA +# +# These readers return hashrefs of arbitrary unblessed data structures, each +# described more fully in the specification: +# +# =for :list +# * meta_spec +# * resources +# * provides +# * no_index +# * prereqs +# * optional_features +# +# =cut BEGIN { my @MAP_READERS = qw( @@ -78,6 +169,16 @@ BEGIN { } } +# =head1 CUSTOM DATA +# +# A list of custom keys are available from the C method and +# particular keys may be retrieved with the C method. +# +# say $meta->custom($_) for $meta->custom_keys; +# +# If a custom key refers to a data structure, a deep clone is returned. +# +# =cut sub custom_keys { return grep { /^x_/i } keys %{$_[0]}; @@ -90,6 +191,29 @@ sub custom { return $value; } +# =method new +# +# my $meta = CPAN::Meta->new($distmeta_struct, \%options); +# +# Returns a valid CPAN::Meta object or dies if the supplied metadata hash +# reference fails to validate. Older-format metadata will be up-converted to +# version 2 if they validate against the original stated specification. +# +# It takes an optional hashref of options. Valid options include: +# +# =over +# +# =item * +# +# lazy_validation -- if true, new will attempt to convert the given metadata +# to version 2 before attempting to validate it. This means than any +# fixable errors will be handled by CPAN::Meta::Converter before validation. +# (Note that this might result in invalid optional data being silently +# dropped.) The default is false. +# +# =back +# +# =cut sub _new { my ($class, $struct, $options) = @_; @@ -130,6 +254,15 @@ sub new { return $self; } +# =method create +# +# my $meta = CPAN::Meta->create($distmeta_struct, \%options); +# +# This is same as C, except that C and C fields +# will be generated if not provided. This means the metadata structure is +# assumed to otherwise follow the latest L. +# +# =cut sub create { my ($class, $struct, $options) = @_; @@ -141,6 +274,19 @@ sub create { return $self; } +# =method load_file +# +# my $meta = CPAN::Meta->load_file($distmeta_file, \%options); +# +# Given a pathname to a file containing metadata, this deserializes the file +# according to its file suffix and constructs a new C object, just +# like C. It will die if the deserialized version fails to validate +# against its stated specification version. +# +# It takes the same options as C but C defaults to +# true. +# +# =cut sub load_file { my ($class, $file, $options) = @_; @@ -158,6 +304,14 @@ sub load_file { return $self; } +# =method load_yaml_string +# +# my $meta = CPAN::Meta->load_yaml_string($yaml, \%options); +# +# This method returns a new CPAN::Meta object using the first document in the +# given YAML string. In other respects it is identical to C. +# +# =cut sub load_yaml_string { my ($class, $yaml, $options) = @_; @@ -172,6 +326,14 @@ sub load_yaml_string { return $self; } +# =method load_json_string +# +# my $meta = CPAN::Meta->load_json_string($json, \%options); +# +# This method returns a new CPAN::Meta object using the structure represented by +# the given JSON string. In other respects it is identical to C. +# +# =cut sub load_json_string { my ($class, $json, $options) = @_; @@ -186,6 +348,50 @@ sub load_json_string { return $self; } +# =method load_string +# +# my $meta = CPAN::Meta->load_string($string, \%options); +# +# If you don't know if a string contains YAML or JSON, this method will use +# L to guess. In other respects it is identical to +# C. +# +# =cut + +sub load_string { + my ($class, $string, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + my $self; + eval { + my $struct = Parse::CPAN::Meta->load_string( $string ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; +} + +# =method save +# +# $meta->save($distmeta_file, \%options); +# +# Serializes the object as JSON and writes it to the given file. The only valid +# option is C, which defaults to '2'. On Perl 5.8.1 or later, the file +# is saved with UTF-8 encoding. +# +# For C 2 (or higher), the filename should end in '.json'. L +# is the default JSON backend. Using another JSON backend requires L 2.5 or +# later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate +# backend like L. +# +# For C less than 2, the filename should end in '.yml'. +# L is used to generate an older metadata structure, which +# is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may +# set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though +# this is not recommended due to subtle incompatibilities between YAML parsers on +# CPAN. +# +# =cut sub save { my ($self, $file, $options) = @_; @@ -213,12 +419,32 @@ sub save { return 1; } +# =method meta_spec_version +# +# This method returns the version part of the C entry in the distmeta +# structure. It is equivalent to: +# +# $meta->meta_spec->{version}; +# +# =cut sub meta_spec_version { my ($self) = @_; return $self->meta_spec->{version}; } +# =method effective_prereqs +# +# my $prereqs = $meta->effective_prereqs; +# +# my $prereqs = $meta->effective_prereqs( \@feature_identifiers ); +# +# This method returns a L object describing all the +# prereqs for the distribution. If an arrayref of feature identifiers is given, +# the prereqs for the identified features are merged together with the +# distribution's core prereqs before the CPAN::Meta::Prereqs object is returned. +# +# =cut sub effective_prereqs { my ($self, $features) = @_; @@ -233,6 +459,17 @@ sub effective_prereqs { return $prereq->with_merged_prereqs(\@other); } +# =method should_index_file +# +# ... if $meta->should_index_file( $filename ); +# +# This method returns true if the given file should be indexed. It decides this +# by checking the C and C keys in the C property of +# the distmeta structure. +# +# C<$filename> should be given in unix format. +# +# =cut sub should_index_file { my ($self, $filename) = @_; @@ -249,6 +486,15 @@ sub should_index_file { return 1; } +# =method should_index_package +# +# ... if $meta->should_index_package( $package ); +# +# This method returns true if the given package should be indexed. It decides +# this by checking the C and C keys in the C +# property of the distmeta structure. +# +# =cut sub should_index_package { my ($self, $package) = @_; @@ -264,6 +510,14 @@ sub should_index_package { return 1; } +# =method features +# +# my @feature_objects = $meta->features; +# +# This method returns a list of L objects, one for each +# optional feature described by the distribution's metadata. +# +# =cut sub features { my ($self) = @_; @@ -275,6 +529,15 @@ sub features { return @features; } +# =method feature +# +# my $feature_object = $meta->feature( $identifier ); +# +# This method returns a L object for the optional feature +# with the given identifier. If no feature with that identifier exists, an +# exception will be raised. +# +# =cut sub feature { my ($self, $ident) = @_; @@ -285,6 +548,18 @@ sub feature { return CPAN::Meta::Feature->new($ident, $f); } +# =method as_struct +# +# my $copy = $meta->as_struct( \%options ); +# +# This method returns a deep copy of the object's metadata as an unblessed hash +# reference. It takes an optional hashref of options. If the hashref contains +# a C argument, the copied metadata will be converted to the version +# of the specification and returned. For example: +# +# my $old_spec = $meta->as_struct( {version => "1.4"} ); +# +# =cut sub as_struct { my ($self, $options) = @_; @@ -296,6 +571,24 @@ sub as_struct { return $struct; } +# =method as_string +# +# my $string = $meta->as_string( \%options ); +# +# This method returns a serialized copy of the object's metadata as a character +# string. (The strings are B UTF-8 encoded.) It takes an optional hashref +# of options. If the hashref contains a C argument, the copied metadata +# will be converted to the version of the specification and returned. For +# example: +# +# my $string = $meta->as_string( {version => "1.4"} ); +# +# For C greater than or equal to 2, the string will be serialized as +# JSON. For C less than 2, the string will be serialized as YAML. In +# both cases, the same rules are followed as in the C method for choosing +# a serialization backend. +# +# =cut sub as_string { my ($self, $options) = @_; @@ -336,35 +629,51 @@ sub TO_JSON { # ABSTRACT: the distribution metadata for a CPAN dist - +__END__ =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta - the distribution metadata for a CPAN dist =head1 VERSION -version 2.120921 +version 2.140640 =head1 SYNOPSIS - my $meta = CPAN::Meta->load_file('META.json'); + use v5.10; + use strict; + use warnings; + use CPAN::Meta; + use Module::Load; - printf "testing requirements for %s version %s\n", + my $meta = CPAN::Meta->load_file('META.json'); + + printf "testing requirements for %s version %s\n", $meta->name, $meta->version; - my $prereqs = $meta->requirements_for('configure'); - - for my $module ($prereqs->required_modules) { - my $version = get_local_version($module); - - die "missing required module $module" unless defined $version; - die "version for $module not in range" - unless $prereqs->accepts_module($module, $version); - } + my $prereqs = $meta->effective_prereqs; + + for my $phase ( qw/configure runtime build test/ ) { + say "Requirements for $phase:"; + my $reqs = $prereqs->requirements_for($phase, "requires"); + for my $module ( sort $reqs->required_modules ) { + my $status; + if ( eval { load $module unless $module eq 'perl'; 1 } ) { + my $version = $module eq 'perl' ? $] : $module->VERSION; + $status = $reqs->accepts_module($module, $version) + ? "$version ok" : "$version not ok"; + } else { + $status = "missing" + }; + say " $module ($status)"; + } + } =head1 DESCRIPTION @@ -438,6 +747,14 @@ given YAML string. In other respects it is identical to C. This method returns a new CPAN::Meta object using the structure represented by the given JSON string. In other respects it is identical to C. +=head2 load_string + + my $meta = CPAN::Meta->load_string($string, \%options); + +If you don't know if a string contains YAML or JSON, this method will use +L to guess. In other respects it is identical to +C. + =head2 save $meta->save($distmeta_file, \%options); @@ -513,7 +830,7 @@ exception will be raised. my $copy = $meta->as_struct( \%options ); -This method returns a deep copy of the object's metadata as an unblessed has +This method returns a deep copy of the object's metadata as an unblessed hash reference. It takes an optional hashref of options. If the hashref contains a C argument, the copied metadata will be converted to the version of the specification and returned. For example: @@ -530,7 +847,7 @@ of options. If the hashref contains a C argument, the copied metadata will be converted to the version of the specification and returned. For example: - my $string = $meta->as_struct( {version => "1.4"} ); + my $string = $meta->as_string( {version => "1.4"} ); For C greater than or equal to 2, the string will be serialized as JSON. For C less than 2, the string will be serialized as YAML. In @@ -675,7 +992,7 @@ L =head2 Bugs / Feature Requests Please report any bugs or feature requests through the issue tracker -at L. +at L. You will be notified automatically of any progress on your issue. =head2 Source Code @@ -683,9 +1000,9 @@ You will be notified automatically of any progress on your issue. This is open source software. The code repository is available for public review and contribution under the terms of the license. -L +L - git clone git://github.com/dagolden/cpan-meta.git + git clone https://github.com/Perl-Toolchain-Gang/CPAN-Meta.git =head1 AUTHORS @@ -701,6 +1018,84 @@ Ricardo Signes =back +=head1 CONTRIBUTORS + +=over 4 + +=item * + +Ansgar Burchardt + +=item * + +Avar Arnfjord Bjarmason + +=item * + +Christopher J. Madsen + +=item * + +Chuck Adams + +=item * + +Cory G Watson + +=item * + +Damyan Ivanov + +=item * + +Eric Wilhelm + +=item * + +Gregor Hermann + +=item * + +Karen Etheridge + +=item * + +Ken Williams + +=item * + +Kenichi Ishigaki + +=item * + +Lars Dieckow + +=item * + +Leon Timmermans + +=item * + +Mark Fowler + +=item * + +Michael G. Schwern + +=item * + +Olaf Alders + +=item * + +Olivier Mengue + +=item * + +Randy Sims + +=back + =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2010 by David Golden and Ricardo Signes. @@ -709,8 +1104,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - - -__END__ - - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Converter.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Converter.pm index 772d5792b12..1bb4431f2b2 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Converter.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Converter.pm @@ -2,13 +2,31 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Converter; -our $VERSION = '2.120921'; # VERSION +our $VERSION = '2.140640'; # VERSION +# =head1 SYNOPSIS +# +# my $struct = decode_json_file('META.json'); +# +# my $cmc = CPAN::Meta::Converter->new( $struct ); +# +# my $new_struct = $cmc->convert( version => "2" ); +# +# =head1 DESCRIPTION +# +# This module converts CPAN Meta structures from one form to another. The +# primary use is to convert older structures to the most modern version of +# the specification, but other transformations may be implemented in the +# future as needed. (E.g. stripping all custom fields or stripping all +# optional fields.) +# +# =cut use CPAN::Meta::Validator; use CPAN::Meta::Requirements; use version 0.88 (); use Parse::CPAN::Meta 1.4400 (); +use List::Util 1.33 qw/all/; sub _dclone { my $ref = shift; @@ -60,7 +78,7 @@ sub _generated_by { my $sig = __PACKAGE__ . " version " . (__PACKAGE__->VERSION || ""); return $sig unless defined $gen and length $gen; - return $gen if $gen =~ /(, )\Q$sig/; + return $gen if $gen =~ /\Q$sig/; return "$gen, $sig"; } @@ -80,14 +98,21 @@ sub _ucfirst_custom { return $key; } +sub _no_prefix_ucfirst_custom { + my $key = shift; + $key =~ s/^x_//; + return _ucfirst_custom($key); +} + sub _change_meta_spec { my ($element, undef, undef, $version) = @_; - $element->{version} = $version; - $element->{url} = $known_specs{$version}; - return $element; + return { + version => $version, + url => $known_specs{$version}, + }; } -my @valid_licenses_1 = ( +my @open_source = ( 'perl', 'gpl', 'apache', @@ -99,6 +124,12 @@ my @valid_licenses_1 = ( 'mit', 'mozilla', 'open_source', +); + +my %is_open_source = map {; $_ => 1 } @open_source; + +my @valid_licenses_1 = ( + @open_source, 'unrestricted', 'restrictive', 'unknown', @@ -115,7 +146,9 @@ sub _license_1 { if ( $license_map_1{lc $element} ) { return $license_map_1{lc $element}; } - return 'unknown'; + else { + return 'unknown'; + } } my @valid_licenses_2 = qw( @@ -213,12 +246,20 @@ sub _downgrade_license { return "unknown"; } elsif( ref $element eq 'ARRAY' ) { - if ( @$element == 1 ) { - return $license_downgrade_map{$element->[0]} || "unknown"; + if ( @$element > 1) { + if ( all { $is_open_source{ $license_downgrade_map{lc $_} || 'unknown' } } @$element ) { + return 'open_source'; + } + else { + return 'unknown'; + } + } + elsif ( @$element == 1 ) { + return $license_downgrade_map{lc $element->[0]} || "unknown"; } } elsif ( ! ref $element ) { - return $license_downgrade_map{$element} || "unknown"; + return $license_downgrade_map{lc $element} || "unknown"; } return "unknown"; } @@ -307,7 +348,7 @@ sub _is_module_name { } sub _clean_version { - my ($element, $key, $meta, $to_version) = @_; + my ($element) = @_; return 0 if ! defined $element; $element =~ s{^\s*}{}; @@ -342,7 +383,7 @@ sub _version_map { # XXX turn this into CPAN::Meta::Requirements with bad version hook # and then turn it back into a hash my $new_map = CPAN::Meta::Requirements->new( - { bad_version_hook => sub { version->new(0) } } # punt + { bad_version_hook => \&_bad_version_hook } # punt ); while ( my ($k,$v) = each %$element ) { next unless _is_module_name($k); @@ -653,7 +694,7 @@ my $resource_downgrade_spec = { homepage => \&_url_or_drop, bugtracker => sub { return $_[0]->{web} }, repository => sub { return $_[0]->{url} || $_[0]->{web} }, - ':custom' => \&_ucfirst_custom, + ':custom' => \&_no_prefix_ucfirst_custom, }; sub _downgrade_resources { @@ -676,12 +717,12 @@ sub _release_status_from_version { my $provides_spec = { file => \&_keep, - version => \&_clean_version, + version => \&_keep, }; my $provides_spec_2 = { file => \&_keep, - version => \&_clean_version, + version => \&_keep, ':custom' => \&_prefix_custom, }; @@ -692,6 +733,8 @@ sub _provides { my $new_data = {}; for my $k ( keys %$element ) { $new_data->{$k} = _convert($element->{$k}, $spec, $to_version); + $new_data->{$k}{version} = _clean_version($element->{$k}{version}) + if exists $element->{$k}{version}; } return $new_data; } @@ -1191,6 +1234,15 @@ my %cleanup = ( # Code #--------------------------------------------------------------------------# +# =method new +# +# my $cmc = CPAN::Meta::Converter->new( $struct ); +# +# The constructor should be passed a valid metadata structure but invalid +# structures are accepted. If no meta-spec version is provided, version 1.0 will +# be assumed. +# +# =cut sub new { my ($class,$data) = @_; @@ -1198,13 +1250,80 @@ sub new { # create an attributes hash my $self = { 'data' => $data, - 'spec' => $data->{'meta-spec'}{'version'} || "1.0", + 'spec' => _extract_spec_version($data), }; # create the object return bless $self, $class; } +sub _extract_spec_version { + my ($data) = @_; + my $spec = $data->{'meta-spec'}; + + # is meta-spec there and valid? + return "1.0" unless defined $spec && ref $spec eq 'HASH'; # before meta-spec? + + # does the version key look like a valid version? + my $v = $spec->{version}; + if ( defined $v && $v =~ /^\d+(?:\.\d+)?$/ ) { + return $v if defined $v && grep { $v eq $_ } keys %known_specs; # known spec + return $v+0 if defined $v && grep { $v == $_ } keys %known_specs; # 2.0 => 2 + } + + # otherwise, use heuristics: look for 1.x vs 2.0 fields + return "2" if exists $data->{prereqs}; + return "1.4" if exists $data->{configure_requires}; + return "1.2"; # when meta-spec was first defined +} + +# =method convert +# +# my $new_struct = $cmc->convert( version => "2" ); +# +# Returns a new hash reference with the metadata converted to a different form. +# C will die if any conversion/standardization still results in an +# invalid structure. +# +# Valid parameters include: +# +# =over +# +# =item * +# +# C -- Indicates the desired specification version (e.g. "1.0", "1.1" ... "1.4", "2"). +# Defaults to the latest version of the CPAN Meta Spec. +# +# =back +# +# Conversion proceeds through each version in turn. For example, a version 1.2 +# structure might be converted to 1.3 then 1.4 then finally to version 2. The +# conversion process attempts to clean-up simple errors and standardize data. +# For example, if C is given as a scalar, it will converted to an array +# reference containing the item. (Converting a structure to its own version will +# also clean-up and standardize.) +# +# When data are cleaned and standardized, missing or invalid fields will be +# replaced with sensible defaults when possible. This may be lossy or imprecise. +# For example, some badly structured META.yml files on CPAN have prerequisite +# modules listed as both keys and values: +# +# requires => { 'Foo::Bar' => 'Bam::Baz' } +# +# These would be split and each converted to a prerequisite with a minimum +# version of zero. +# +# When some mandatory fields are missing or invalid, the conversion will attempt +# to provide a sensible default or will fill them with a value of 'unknown'. For +# example a missing or unrecognized C field will result in a C +# field of 'unknown'. Fields that may get an 'unknown' include: +# +# =for :list +# * abstract +# * author +# * license +# +# =cut sub convert { my ($self, %args) = @_; @@ -1260,17 +1379,19 @@ sub convert { # ABSTRACT: Convert CPAN distribution metadata structures - +__END__ =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::Converter - Convert CPAN distribution metadata structures =head1 VERSION -version 2.120921 +version 2.140640 =head1 SYNOPSIS @@ -1386,8 +1507,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - - -__END__ - - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Feature.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Feature.pm index 31f4935b178..f97cc652e83 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Feature.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Feature.pm @@ -2,10 +2,28 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Feature; -our $VERSION = '2.120921'; # VERSION +our $VERSION = '2.140640'; # VERSION use CPAN::Meta::Prereqs; +# =head1 DESCRIPTION +# +# A CPAN::Meta::Feature object describes an optional feature offered by a CPAN +# distribution and specified in the distribution's F (or F) +# file. +# +# For the most part, this class will only be used when operating on the result of +# the C or C methods on a L object. +# +# =method new +# +# my $feature = CPAN::Meta::Feature->new( $identifier => \%spec ); +# +# This returns a new Feature object. The C<%spec> argument to the constructor +# should be the same as the value of the C entry in the +# distmeta. It must contain entries for C and C. +# +# =cut sub new { my ($class, $identifier, $spec) = @_; @@ -19,12 +37,28 @@ sub new { bless \%guts => $class; } +# =method identifier +# +# This method returns the feature's identifier. +# +# =cut sub identifier { $_[0]{identifier} } +# =method description +# +# This method returns the feature's long description. +# +# =cut sub description { $_[0]{description} } +# =method prereqs +# +# This method returns the feature's prerequisites as a L +# object. +# +# =cut sub prereqs { $_[0]{prereqs} } @@ -32,17 +66,19 @@ sub prereqs { $_[0]{prereqs} } # ABSTRACT: an optional feature provided by a CPAN distribution - +__END__ =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::Feature - an optional feature provided by a CPAN distribution =head1 VERSION -version 2.120921 +version 2.140640 =head1 DESCRIPTION @@ -107,9 +143,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - - -__END__ - - - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/History.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/History.pm index 9e32d56ab5a..1ebf3893390 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/History.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/History.pm @@ -3,24 +3,25 @@ use 5.006; use strict; use warnings; package CPAN::Meta::History; -our $VERSION = '2.120921'; # VERSION +our $VERSION = '2.140640'; # VERSION 1; # ABSTRACT: history of CPAN Meta Spec changes - - __END__ + =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::History - history of CPAN Meta Spec changes =head1 VERSION -version 2.120921 +version 2.140640 =head1 DESCRIPTION @@ -174,10 +175,6 @@ November 2006 =item * -Clarified that all prerequisites take version range specifications - -=item * - Added 'no_index' subkey 'directory' and removed 'dir' to match actual usage in the wild @@ -211,6 +208,10 @@ Changed 'license' to be mandatory =item * +Added version range specifications for prerequisites + +=item * + Added required 'abstract' field =item * @@ -312,4 +313,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Prereqs.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Prereqs.pm index c1c58f0a6a6..b6e6c73c9e1 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Prereqs.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Prereqs.pm @@ -2,13 +2,47 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Prereqs; -our $VERSION = '2.120921'; # VERSION +our $VERSION = '2.140640'; # VERSION +# =head1 DESCRIPTION +# +# A CPAN::Meta::Prereqs object represents the prerequisites for a CPAN +# distribution or one of its optional features. Each set of prereqs is +# organized by phase and type, as described in L. +# +# =cut use Carp qw(confess); use Scalar::Util qw(blessed); use CPAN::Meta::Requirements 2.121; +# =method new +# +# my $prereq = CPAN::Meta::Prereqs->new( \%prereq_spec ); +# +# This method returns a new set of Prereqs. The input should look like the +# contents of the C field described in L, meaning +# something more or less like this: +# +# my $prereq = CPAN::Meta::Prereqs->new({ +# runtime => { +# requires => { +# 'Some::Module' => '1.234', +# ..., +# }, +# ..., +# }, +# ..., +# }); +# +# You can also construct an empty set of prereqs with: +# +# my $prereqs = CPAN::Meta::Prereqs->new; +# +# This empty set of prereqs is useful for accumulating new prereqs before finally +# dumping the whole set into a structure or string. +# +# =cut sub __legal_phases { qw(configure build test runtime develop) } sub __legal_types { qw(requires recommends suggests conflicts) } @@ -44,6 +78,19 @@ sub new { return bless \%guts => $class; } +# =method requirements_for +# +# my $requirements = $prereqs->requirements_for( $phase, $type ); +# +# This method returns a L object for the given +# phase/type combination. If no prerequisites are registered for that +# combination, a new CPAN::Meta::Requirements object will be returned, and it may +# be added to as needed. +# +# If C<$phase> or C<$type> are undefined or otherwise invalid, an exception will +# be raised. +# +# =cut sub requirements_for { my ($self, $phase, $type) = @_; @@ -66,6 +113,21 @@ sub requirements_for { return $req; } +# =method with_merged_prereqs +# +# my $new_prereqs = $prereqs->with_merged_prereqs( $other_prereqs ); +# +# my $new_prereqs = $prereqs->with_merged_prereqs( \@other_prereqs ); +# +# This method returns a new CPAN::Meta::Prereqs objects in which all the +# other prerequisites given are merged into the current set. This is primarily +# provided for combining a distribution's core prereqs with the prereqs of one of +# its optional features. +# +# The new prereqs object has no ties to the originals, and altering it further +# will not alter them. +# +# =cut sub with_merged_prereqs { my ($self, $other) = @_; @@ -96,6 +158,56 @@ sub with_merged_prereqs { return (ref $self)->new(\%new_arg); } +# =method merged_requirements +# +# my $new_reqs = $prereqs->merged_requirements( \@phases, \@types ); +# my $new_reqs = $prereqs->merged_requirements( \@phases ); +# my $new_reqs = $preerqs->merged_requirements(); +# +# This method joins together all requirements across a number of phases +# and types into a new L object. If arguments +# are omitted, it defaults to "runtime", "build" and "test" for phases +# and "requires" and "recommends" for types. +# +# =cut + +sub merged_requirements { + my ($self, $phases, $types) = @_; + $phases = [qw/runtime build test/] unless defined $phases; + $types = [qw/requires recommends/] unless defined $types; + + confess "merged_requirements phases argument must be an arrayref" + unless ref $phases eq 'ARRAY'; + confess "merged_requirements types argument must be an arrayref" + unless ref $types eq 'ARRAY'; + + my $req = CPAN::Meta::Requirements->new; + + for my $phase ( @$phases ) { + unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) { + confess "requested requirements for unknown phase: $phase"; + } + for my $type ( @$types ) { + unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) { + confess "requested requirements for unknown type: $type"; + } + $req->add_requirements( $self->requirements_for($phase, $type) ); + } + } + + $req->finalize if $self->is_finalized; + + return $req; +} + + +# =method as_string_hash +# +# This method returns a hashref containing structures suitable for dumping into a +# distmeta data structure. It is made up of hashes and strings, only; there will +# be no Prereqs, CPAN::Meta::Requirements, or C objects inside it. +# +# =cut sub as_string_hash { my ($self) = @_; @@ -114,9 +226,22 @@ sub as_string_hash { return \%hash; } +# =method is_finalized +# +# This method returns true if the set of prereqs has been marked "finalized," and +# cannot be altered. +# +# =cut sub is_finalized { $_[0]{finalized} } +# =method finalize +# +# Calling C on a Prereqs object will close it for further modification. +# Attempting to make any changes that would actually alter the prereqs will +# result in an exception being thrown. +# +# =cut sub finalize { my ($self) = @_; @@ -128,6 +253,16 @@ sub finalize { } } +# =method clone +# +# my $cloned_prereqs = $prereqs->clone; +# +# This method returns a Prereqs object that is identical to the original object, +# but can be altered without affecting the original object. Finalization does +# not survive cloning, meaning that you may clone a finalized set of prereqs and +# then modify the clone. +# +# =cut sub clone { my ($self) = @_; @@ -139,17 +274,19 @@ sub clone { # ABSTRACT: a set of distribution prerequisites by phase and type - +__END__ =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::Prereqs - a set of distribution prerequisites by phase and type =head1 VERSION -version 2.120921 +version 2.140640 =head1 DESCRIPTION @@ -211,6 +348,17 @@ its optional features. The new prereqs object has no ties to the originals, and altering it further will not alter them. +=head2 merged_requirements + + my $new_reqs = $prereqs->merged_requirements( \@phases, \@types ); + my $new_reqs = $prereqs->merged_requirements( \@phases ); + my $new_reqs = $preerqs->merged_requirements(); + +This method joins together all requirements across a number of phases +and types into a new L object. If arguments +are omitted, it defaults to "runtime", "build" and "test" for phases +and "requires" and "recommends" for types. + =head2 as_string_hash This method returns a hashref containing structures suitable for dumping into a @@ -268,9 +416,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - - -__END__ - - - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Requirements.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Requirements.pm index ee53a3c4570..621550cef6a 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Requirements.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Requirements.pm @@ -1,7 +1,7 @@ use strict; use warnings; package CPAN::Meta::Requirements; -our $VERSION = '2.122'; # VERSION +our $VERSION = '2.125'; # VERSION # ABSTRACT: a set of version requirements for a CPAN dist @@ -433,15 +433,18 @@ sub from_string_hash { # vim: ts=2 sts=2 sw=2 et: __END__ + =pod +=encoding utf-8 + =head1 NAME CPAN::Meta::Requirements - a set of version requirements for a CPAN dist =head1 VERSION -version 2.122 +version 2.125 =head1 SYNOPSIS @@ -691,7 +694,7 @@ CPAN::Meta::Requirements object. =head2 Bugs / Feature Requests Please report any bugs or feature requests through the issue tracker -at L. +at L. You will be notified automatically of any progress on your issue. =head2 Source Code @@ -699,9 +702,9 @@ You will be notified automatically of any progress on your issue. This is open source software. The code repository is available for public review and contribution under the terms of the license. -L +L - git clone https://github.com/dagolden/cpan-meta-requirements.git + git clone https://github.com/dagolden/CPAN-Meta-Requirements.git =head1 AUTHORS @@ -725,4 +728,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Spec.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Spec.pm index 9addfd43600..1ec27af25e9 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Spec.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Spec.pm @@ -1,26 +1,34 @@ -# vi:tw=72 +# XXX RULES FOR PATCHING THIS FILE XXX +# Patches that fix typos or formatting are acceptable. Patches +# that change semantics are not acceptable without prior approval +# by David Golden or Ricardo Signes. + use 5.006; use strict; use warnings; package CPAN::Meta::Spec; -our $VERSION = '2.120921'; # VERSION +our $VERSION = '2.140640'; # VERSION 1; # ABSTRACT: specification for CPAN distribution metadata +# vi:tw=72 __END__ + =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::Spec - specification for CPAN distribution metadata =head1 VERSION -version 2.120921 +version 2.140640 =head1 SYNOPSIS @@ -74,7 +82,7 @@ version 2.120921 keywords => [ qw/ toolchain cpan dual-life / ], 'meta-spec' => { version => '2', - url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec', + url => 'https://metacpan.org/pod/CPAN::Meta::Spec', }, generated_by => 'Module::Build version 0.36', }; @@ -307,7 +315,7 @@ Example: license => [ 'perl_5' ] - license => [ 'apache_2', 'mozilla_1_0' ] + license => [ 'apache_2_0', 'mozilla_1_0' ] (Spec 2) [required] {List of one or more License Strings} @@ -387,6 +395,20 @@ This is a I of the metadata specification document corresponding to the given version. This is strictly for human-consumption and should not impact the interpretation of the document. +For the version 2 spec, either of these are recommended: + +=over 4 + +=item * + +C + +=item * + +C + +=back + =back =head3 name @@ -400,7 +422,8 @@ Example: This field is the name of the distribution. This is often created by taking the "main package" in the distribution and changing C<::> to C<->, but the name may be completely unrelated to the packages within -the distribution. C.f. L. +the distribution. For example, L is distributed as part +of the distribution name "libwww-perl". =head3 release_status @@ -585,7 +608,7 @@ I Because there is currently no way for a distribution to specify a dependency on an optional feature of another dependency, the use of C is discouraged. Instead, create a separate, installable distribution that ensures the desired -feature is available. For example, if C has a "Baz" feature, +feature is available. For example, if C has a C feature, release a separate C distribution that satisfies requirements for the feature. @@ -639,14 +662,14 @@ Example: provides => { 'Foo::Bar' => { file => 'lib/Foo/Bar.pm', - version => 0.27_02 + version => '0.27_02', }, 'Foo::Bar::Blah' => { file => 'lib/Foo/Bar/Blah.pm', }, 'Foo::Bar::Baz' => { file => 'lib/Foo/Bar/Baz.pm', - version => 0.3, + version => '0.3', }, } @@ -654,23 +677,26 @@ Example: This describes all packages provided by this distribution. This information is used by distribution and automation mechanisms like -PAUSE, CPAN, and search.cpan.org to build indexes saying in which -distribution various packages can be found. +PAUSE, CPAN, metacpan.org and search.cpan.org to build indexes saying in +which distribution various packages can be found. The keys of C are package names that can be found within -the distribution. The values are Maps with the following valid subkeys: +the distribution. If a package name key is provided, it must +have a Map with the following valid subkeys: =over =item file -This field is required. The value must contain a Unix-style relative -file path from the root of the distribution to the module containing the -package. +This field is required. It must contain a Unix-style relative file path +from the root of the distribution directory to a file that contains or +generates the package. =item version -This field contains a I String for the package, if one exists. +If it exists, this field must contains a I String for the +package. If the package does not have a C<$VERSION>, this field must +be omitted. =back @@ -731,7 +757,8 @@ is a Map with the following valid keys: Because a url like C is ambiguous as to type, producers should provide a C whenever a C key is given. The C field should be the name of the most common program used -to work with the repository, e.g. git, svn, cvs, darcs, bzr or hg. +to work with the repository, e.g. C, C, C, C, +C or C. =back @@ -992,7 +1019,7 @@ described in the L section. Another subtle error that can occur in resolving prerequisites comes from the way that modules in prerequisites are indexed to distribution files on CPAN. When a module is deleted from a distribution, prerequisites calling -for that module could indicate an older distribution should installed, +for that module could indicate an older distribution should be installed, potentially overwriting files from a newer distribution. For example, as of Oct 31, 2009, the CPAN index file contained these @@ -1078,23 +1105,43 @@ this presents security implications. =head1 SEE ALSO +=over 4 + +=item * + CPAN, L -CPAN.pm, L +=item * + +JSON, L -CPANPLUS, L +=item * -ExtUtils::MakeMaker, L +YAML, L -Module::Build, L +=item * -Module::Install, L +L -JSON, L +=item * -YAML, L +L -=head1 CONTRIBUTORS +=item * + +L + +=item * + +L + +=item * + +L + +=back + +=head1 HISTORY Ken Williams wrote the original CPAN Meta Spec (also known as the "META.yml spec") in 2003 and maintained it through several revisions @@ -1107,21 +1154,6 @@ process. David and Ricardo Signes drafted the final version 2 spec in April 2010 based on the version 1.4 spec and patches contributed during the proposal process. -Several others have contributed patches over the years. The full list -of contributors in the repository history currently includes: - - 2shortplanks - Avar Arnfjord Bjarmason - Christopher J. Madsen - Damyan Ivanov - David Golden - Eric Wilhelm - Ken Williams - Lars DIECKOW - Michael G. Schwern - Randy Sims - Ricardo Signes - =head1 AUTHORS =over 4 @@ -1144,4 +1176,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Validator.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Validator.pm index e35f4c04ec7..f8b2fcaf303 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Validator.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Validator.pm @@ -2,8 +2,26 @@ use 5.006; use strict; use warnings; package CPAN::Meta::Validator; -our $VERSION = '2.120921'; # VERSION - +our $VERSION = '2.140640'; # VERSION + +# =head1 SYNOPSIS +# +# my $struct = decode_json_file('META.json'); +# +# my $cmv = CPAN::Meta::Validator->new( $struct ); +# +# unless ( $cmv->is_valid ) { +# my $msg = "Invalid META structure. Errors found:\n"; +# $msg .= join( "\n", $cmv->errors ); +# die $msg; +# } +# +# =head1 DESCRIPTION +# +# This module validates a CPAN Meta structure against the version of the +# the specification claimed in the C field of the structure. +# +# =cut #--------------------------------------------------------------------------# # This code copied and adapted from Test::CPAN::Meta @@ -78,10 +96,10 @@ my %definitions = ( '2' => { # REQUIRED 'abstract' => { mandatory => 1, value => \&string }, - 'author' => { mandatory => 1, lazylist => { value => \&string } }, + 'author' => { mandatory => 1, list => { value => \&string } }, 'dynamic_config' => { mandatory => 1, value => \&boolean }, 'generated_by' => { mandatory => 1, value => \&string }, - 'license' => { mandatory => 1, lazylist => { value => \&license } }, + 'license' => { mandatory => 1, list => { value => \&license } }, 'meta-spec' => { mandatory => 1, 'map' => { @@ -96,7 +114,7 @@ my %definitions = ( # OPTIONAL 'description' => { value => \&string }, - 'keywords' => { lazylist => { value => \&string } }, + 'keywords' => { list => { value => \&string } }, 'no_index' => $no_index_2, 'optional_features' => { 'map' => { @@ -125,7 +143,7 @@ my %definitions = ( }, 'resources' => { 'map' => { - license => { lazylist => { value => \&url } }, + license => { list => { value => \&url } }, homepage => { value => \&url }, bugtracker => { 'map' => { @@ -419,6 +437,13 @@ my %definitions = ( # Code #--------------------------------------------------------------------------# +# =method new +# +# my $cmv = CPAN::Meta::Validator->new( $struct ) +# +# The constructor must be passed a metadata structure. +# +# =cut sub new { my ($class,$data) = @_; @@ -426,7 +451,7 @@ sub new { # create an attributes hash my $self = { 'data' => $data, - 'spec' => $data->{'meta-spec'}{'version'} || "1.0", + 'spec' => eval { $data->{'meta-spec'}{'version'} } || "1.0", 'errors' => undef, }; @@ -434,6 +459,16 @@ sub new { return bless $self, $class; } +# =method is_valid +# +# if ( $cmv->is_valid ) { +# ... +# } +# +# Returns a boolean value indicating whether the metadata provided +# is valid. +# +# =cut sub is_valid { my $self = shift; @@ -443,6 +478,13 @@ sub is_valid { return ! $self->errors; } +# =method errors +# +# warn( join "\n", $cmv->errors ); +# +# Returns a list of errors seen during validation. +# +# =cut sub errors { my $self = shift; @@ -450,9 +492,34 @@ sub errors { return @{$self->{errors}}; } +# =begin :internals +# +# =head2 Check Methods +# +# =over +# +# =item * +# +# check_map($spec,$data) +# +# Checks whether a map (or hash) part of the data structure conforms to the +# appropriate specification definition. +# +# =item * +# +# check_list($spec,$data) +# +# Checks whether a list (or array) part of the data structure conforms to +# the appropriate specification definition. +# +# =item * +# +# =back +# +# =cut my $spec_error = "Missing validation action in specification. " - . "Must be one of 'map', 'list', 'lazylist', or 'value'"; + . "Must be one of 'map', 'list', or 'value'"; sub check_map { my ($self,$spec,$data) = @_; @@ -484,8 +551,6 @@ sub check_map { $self->check_map($spec->{$key}{'map'},$data->{$key}); } elsif($spec->{$key}{'list'}) { $self->check_list($spec->{$key}{'list'},$data->{$key}); - } elsif($spec->{$key}{'lazylist'}) { - $self->check_lazylist($spec->{$key}{'lazylist'},$data->{$key}); } else { $self->_error( "$spec_error for '$key'" ); } @@ -498,8 +563,6 @@ sub check_map { $self->check_map($spec->{':key'}{'map'},$data->{$key}); } elsif($spec->{':key'}{'list'}) { $self->check_list($spec->{':key'}{'list'},$data->{$key}); - } elsif($spec->{':key'}{'lazylist'}) { - $self->check_lazylist($spec->{':key'}{'lazylist'},$data->{$key}); } else { $self->_error( "$spec_error for ':key'" ); } @@ -512,17 +575,6 @@ sub check_map { } } -# if it's a string, make it into a list and check the list -sub check_lazylist { - my ($self,$spec,$data) = @_; - - if ( defined $data && ! ref($data) ) { - $data = [ $data ]; - } - - $self->check_list($spec,$data); -} - sub check_list { my ($self,$spec,$data) = @_; @@ -545,8 +597,6 @@ sub check_list { $self->check_map($spec->{'map'},$value); } elsif(defined $spec->{'list'}) { $self->check_list($spec->{'list'},$value); - } elsif(defined $spec->{'lazylist'}) { - $self->check_lazylist($spec->{'lazylist'},$value); } elsif ($spec->{':key'}) { $self->check_map($spec,$value); } else { @@ -556,6 +606,113 @@ sub check_list { } } +# =head2 Validator Methods +# +# =over +# +# =item * +# +# header($self,$key,$value) +# +# Validates that the header is valid. +# +# Note: No longer used as we now read the data structure, not the file. +# +# =item * +# +# url($self,$key,$value) +# +# Validates that a given value is in an acceptable URL format +# +# =item * +# +# urlspec($self,$key,$value) +# +# Validates that the URL to a META specification is a known one. +# +# =item * +# +# string_or_undef($self,$key,$value) +# +# Validates that the value is either a string or an undef value. Bit of a +# catchall function for parts of the data structure that are completely user +# defined. +# +# =item * +# +# string($self,$key,$value) +# +# Validates that a string exists for the given key. +# +# =item * +# +# file($self,$key,$value) +# +# Validate that a file is passed for the given key. This may be made more +# thorough in the future. For now it acts like \&string. +# +# =item * +# +# exversion($self,$key,$value) +# +# Validates a list of versions, e.g. '<= 5, >=2, ==3, !=4, >1, <6, 0'. +# +# =item * +# +# version($self,$key,$value) +# +# Validates a single version string. Versions of the type '5.8.8' and '0.00_00' +# are both valid. A leading 'v' like 'v1.2.3' is also valid. +# +# =item * +# +# boolean($self,$key,$value) +# +# Validates for a boolean value. Currently these values are '1', '0', 'true', +# 'false', however the latter 2 may be removed. +# +# =item * +# +# license($self,$key,$value) +# +# Validates that a value is given for the license. Returns 1 if an known license +# type, or 2 if a value is given but the license type is not a recommended one. +# +# =item * +# +# custom_1($self,$key,$value) +# +# Validates that the given key is in CamelCase, to indicate a user defined +# keyword and only has characters in the class [-_a-zA-Z]. In version 1.X +# of the spec, this was only explicitly stated for 'resources'. +# +# =item * +# +# custom_2($self,$key,$value) +# +# Validates that the given key begins with 'x_' or 'X_', to indicate a user +# defined keyword and only has characters in the class [-_a-zA-Z] +# +# =item * +# +# identifier($self,$key,$value) +# +# Validates that key is in an acceptable format for the META specification, +# for an identifier, i.e. any that matches the regular expression +# qr/[a-z][a-z_]/i. +# +# =item * +# +# module($self,$key,$value) +# +# Validates that a given key is in an acceptable module name format, e.g. +# 'Test::CPAN::Meta::Version'. +# +# =back +# +# =end :internals +# +# =cut sub header { my ($self,$key,$value) = @_; @@ -828,17 +985,19 @@ sub _error { # ABSTRACT: validate CPAN distribution metadata structures - +__END__ =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::Validator - validate CPAN distribution metadata structures =head1 VERSION -version 2.120921 +version 2.140640 =head1 SYNOPSIS @@ -902,10 +1061,6 @@ the appropriate specification definition. =item * -check_lazylist($spec,$data) - -Checks whether a list conforms, but converts strings to a single-element list - =back =head2 Validator Methods @@ -1014,7 +1169,7 @@ Validates that a given key is in an acceptable module name format, e.g. =end :internals -=for Pod::Coverage anything boolean check_lazylist check_list custom_1 custom_2 exversion file +=for Pod::Coverage anything boolean check_list custom_1 custom_2 exversion file identifier license module phase relation release_status string string_or_undef url urlspec version header check_map @@ -1049,9 +1204,3 @@ This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut - - -__END__ - - - diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/YAML.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/YAML.pm index a9f4d6d94cb..387a8c4bb80 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/YAML.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/YAML.pm @@ -1,654 +1,887 @@ +use 5.008001; # sane UTF-8 support +use strict; +use warnings; package CPAN::Meta::YAML; -{ - $CPAN::Meta::YAML::VERSION = '0.008'; +$CPAN::Meta::YAML::VERSION = '0.012'; +BEGIN { + $CPAN::Meta::YAML::AUTHORITY = 'cpan:ADAMK'; } +# git description: v1.60-1-g1c16a0a +; # original $VERSION removed by Doppelgaenger +# XXX-INGY is 5.8.1 too old/broken for utf8? +# XXX-XDG Lancaster consensus was that it was sufficient until +# proven otherwise -use strict; -# UTF Support? -sub HAVE_UTF8 () { $] >= 5.007003 } +##################################################################### +# The CPAN::Meta::YAML API. +# +# These are the currently documented API functions/methods and +# exports: + +use Exporter; +our @ISA = qw{ Exporter }; +our @EXPORT = qw{ Load Dump }; +our @EXPORT_OK = qw{ LoadFile DumpFile freeze thaw }; + +### +# Functional/Export API: + +sub Dump { + return CPAN::Meta::YAML->new(@_)->_dump_string; +} + +# XXX-INGY Returning last document seems a bad behavior. +# XXX-XDG I think first would seem more natural, but I don't know +# that it's worth changing now +sub Load { + my $self = CPAN::Meta::YAML->_load_string(@_); + if ( wantarray ) { + return @$self; + } else { + # To match YAML.pm, return the last document + return $self->[-1]; + } +} + +# XXX-INGY Do we really need freeze and thaw? +# XXX-XDG I don't think so. I'd support deprecating them. BEGIN { - if ( HAVE_UTF8 ) { - # The string eval helps hide this from Test::MinimumVersion - eval "require utf8;"; - die "Failed to load UTF-8 support" if $@; - } - - # Class structure - require 5.004; - require Exporter; - require Carp; - @CPAN::Meta::YAML::ISA = qw{ Exporter }; - @CPAN::Meta::YAML::EXPORT = qw{ Load Dump }; - @CPAN::Meta::YAML::EXPORT_OK = qw{ LoadFile DumpFile freeze thaw }; - - # Error storage - $CPAN::Meta::YAML::errstr = ''; + *freeze = \&Dump; + *thaw = \&Load; +} + +sub DumpFile { + my $file = shift; + return CPAN::Meta::YAML->new(@_)->_dump_file($file); +} + +sub LoadFile { + my $file = shift; + my $self = CPAN::Meta::YAML->_load_file($file); + if ( wantarray ) { + return @$self; + } else { + # Return only the last document to match YAML.pm, + return $self->[-1]; + } +} + + +### +# Object Oriented API: + +# Create an empty CPAN::Meta::YAML object +# XXX-INGY Why do we use ARRAY object? +# NOTE: I get it now, but I think it's confusing and not needed. +# Will change it on a branch later, for review. +# +# XXX-XDG I don't support changing it yet. It's a very well-documented +# "API" of CPAN::Meta::YAML. I'd support deprecating it, but Adam suggested +# we not change it until YAML.pm's own OO API is established so that +# users only have one API change to digest, not two +sub new { + my $class = shift; + bless [ @_ ], $class; +} + +# XXX-INGY It probably doesn't matter, and it's probably too late to +# change, but 'read/write' are the wrong names. Read and Write +# are actions that take data from storage to memory +# characters/strings. These take the data to/from storage to native +# Perl objects, which the terms dump and load are meant. As long as +# this is a legacy quirk to CPAN::Meta::YAML it's ok, but I'd prefer not +# to add new {read,write}_* methods to this API. + +sub read_string { + my $self = shift; + $self->_load_string(@_); +} + +sub write_string { + my $self = shift; + $self->_dump_string(@_); +} + +sub read { + my $self = shift; + $self->_load_file(@_); +} + +sub write { + my $self = shift; + $self->_dump_file(@_); } -# The character class of all characters we need to escape -# NOTE: Inlined, since it's only used once -# my $RE_ESCAPE = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f\"\n]'; + + + +##################################################################### +# Constants # Printed form of the unprintable characters in the lowest range # of ASCII characters, listed by ASCII ordinal position. my @UNPRINTABLE = qw( - z x01 x02 x03 x04 x05 x06 a - x08 t n v f r x0e x0f - x10 x11 x12 x13 x14 x15 x16 x17 - x18 x19 x1a e x1c x1d x1e x1f + 0 x01 x02 x03 x04 x05 x06 a + b t n v f r x0E x0F + x10 x11 x12 x13 x14 x15 x16 x17 + x18 x19 x1A e x1C x1D x1E x1F ); # Printable characters for escapes my %UNESCAPES = ( - z => "\x00", a => "\x07", t => "\x09", - n => "\x0a", v => "\x0b", f => "\x0c", - r => "\x0d", e => "\x1b", '\\' => '\\', + 0 => "\x00", z => "\x00", N => "\x85", + a => "\x07", b => "\x08", t => "\x09", + n => "\x0a", v => "\x0b", f => "\x0c", + r => "\x0d", e => "\x1b", '\\' => '\\', ); -# Special magic boolean words +# XXX-INGY +# I(ngy) need to decide if these values should be quoted in +# CPAN::Meta::YAML or not. Probably yes. + +# These 3 values have special meaning when unquoted and using the +# default YAML schema. They need quotes if they are strings. my %QUOTE = map { $_ => 1 } qw{ - null Null NULL - y Y yes Yes YES n N no No NO - true True TRUE false False FALSE - on On ON off Off OFF + null true false }; +# The commented out form is simpler, but overloaded the Perl regex +# engine due to recursion and backtracking problems on strings +# larger than 32,000ish characters. Keep it for reference purposes. +# qr/\"((?:\\.|[^\"])*)\"/ +my $re_capture_double_quoted = qr/\"([^\\"]*(?:\\.[^\\"]*)*)\"/; +my $re_capture_single_quoted = qr/\'([^\']*(?:\'\'[^\']*)*)\'/; +# unquoted re gets trailing space that needs to be stripped +my $re_capture_unquoted_key = qr/([^:]+(?::+\S[^:]*)*)(?=\s*\:(?:\s+|$))/; +my $re_trailing_comment = qr/(?:\s+\#.*)?/; +my $re_key_value_separator = qr/\s*:(?:\s+(?:\#.*)?|$)/; + ##################################################################### -# Implementation +# CPAN::Meta::YAML Implementation. +# +# These are the private methods that do all the work. They may change +# at any time. -# Create an empty CPAN::Meta::YAML object -sub new { - my $class = shift; - bless [ @_ ], $class; -} + +### +# Loader functions: # Create an object from a file -sub read { - my $class = ref $_[0] ? ref shift : shift; - - # Check the file - my $file = shift or return $class->_error( 'You did not specify a file name' ); - return $class->_error( "File '$file' does not exist" ) unless -e $file; - return $class->_error( "'$file' is a directory, not a file" ) unless -f _; - return $class->_error( "Insufficient permissions to read '$file'" ) unless -r _; - - # Slurp in the file - local $/ = undef; - local *CFG; - unless ( open(CFG, $file) ) { - return $class->_error("Failed to open file '$file': $!"); - } - my $contents = ; - unless ( close(CFG) ) { - return $class->_error("Failed to close file '$file': $!"); - } - - $class->read_string( $contents ); +sub _load_file { + my $class = ref $_[0] ? ref shift : shift; + + # Check the file + my $file = shift or $class->_error( 'You did not specify a file name' ); + $class->_error( "File '$file' does not exist" ) + unless -e $file; + $class->_error( "'$file' is a directory, not a file" ) + unless -f _; + $class->_error( "Insufficient permissions to read '$file'" ) + unless -r _; + + # Open unbuffered with strict UTF-8 decoding and no translation layers + open( my $fh, "<:unix:encoding(UTF-8)", $file ); + unless ( $fh ) { + $class->_error("Failed to open file '$file': $!"); + } + + # flock if available (or warn if not possible for OS-specific reasons) + if ( _can_flock() ) { + flock( $fh, Fcntl::LOCK_SH() ) + or warn "Couldn't lock '$file' for reading: $!"; + } + + # slurp the contents + my $contents = eval { + use warnings FATAL => 'utf8'; + local $/; + <$fh> + }; + if ( my $err = $@ ) { + $class->_error("Error reading from file '$file': $err"); + } + + # close the file (release the lock) + unless ( close $fh ) { + $class->_error("Failed to close file '$file': $!"); + } + + $class->_load_string( $contents ); } # Create an object from a string -sub read_string { - my $class = ref $_[0] ? ref shift : shift; - my $self = bless [], $class; - my $string = $_[0]; - eval { - unless ( defined $string ) { - die \"Did not provide a string to load"; - } - - # Byte order marks - # NOTE: Keeping this here to educate maintainers - # my %BOM = ( - # "\357\273\277" => 'UTF-8', - # "\376\377" => 'UTF-16BE', - # "\377\376" => 'UTF-16LE', - # "\377\376\0\0" => 'UTF-32LE' - # "\0\0\376\377" => 'UTF-32BE', - # ); - if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) { - die \"Stream has a non UTF-8 BOM"; - } else { - # Strip UTF-8 bom if found, we'll just ignore it - $string =~ s/^\357\273\277//; - } - - # Try to decode as utf8 - utf8::decode($string) if HAVE_UTF8; - - # Check for some special cases - return $self unless length $string; - unless ( $string =~ /[\012\015]+\z/ ) { - die \"Stream does not end with newline character"; - } - - # Split the file into lines - my @lines = grep { ! /^\s*(?:\#.*)?\z/ } - split /(?:\015{1,2}\012|\015|\012)/, $string; - - # Strip the initial YAML header - @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines; - - # A nibbling parser - while ( @lines ) { - # Do we have a document header? - if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) { - # Handle scalar documents - shift @lines; - if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) { - push @$self, $self->_read_scalar( "$1", [ undef ], \@lines ); - next; - } - } - - if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) { - # A naked document - push @$self, undef; - while ( @lines and $lines[0] !~ /^---/ ) { - shift @lines; - } - - } elsif ( $lines[0] =~ /^\s*\-/ ) { - # An array at the root - my $document = [ ]; - push @$self, $document; - $self->_read_array( $document, [ 0 ], \@lines ); - - } elsif ( $lines[0] =~ /^(\s*)\S/ ) { - # A hash at the root - my $document = { }; - push @$self, $document; - $self->_read_hash( $document, [ length($1) ], \@lines ); - - } else { - die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; - } - } - }; - if ( ref $@ eq 'SCALAR' ) { - return $self->_error(${$@}); - } elsif ( $@ ) { - require Carp; - Carp::croak($@); - } - - return $self; +sub _load_string { + my $class = ref $_[0] ? ref shift : shift; + my $self = bless [], $class; + my $string = $_[0]; + eval { + unless ( defined $string ) { + die \"Did not provide a string to load"; + } + + # Check if Perl has it marked as characters, but it's internally + # inconsistent. E.g. maybe latin1 got read on a :utf8 layer + if ( utf8::is_utf8($string) && ! utf8::valid($string) ) { + die \<<'...'; +Read an invalid UTF-8 string (maybe mixed UTF-8 and 8-bit character set). +Did you decode with lax ":utf8" instead of strict ":encoding(UTF-8)"? +... + } + + # Ensure Unicode character semantics, even for 0x80-0xff + utf8::upgrade($string); + + # Check for and strip any leading UTF-8 BOM + $string =~ s/^\x{FEFF}//; + + # Check for some special cases + return $self unless length $string; + + # Split the file into lines + my @lines = grep { ! /^\s*(?:\#.*)?\z/ } + split /(?:\015{1,2}\012|\015|\012)/, $string; + + # Strip the initial YAML header + @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines; + + # A nibbling parser + my $in_document = 0; + while ( @lines ) { + # Do we have a document header? + if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) { + # Handle scalar documents + shift @lines; + if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) { + push @$self, + $self->_load_scalar( "$1", [ undef ], \@lines ); + next; + } + $in_document = 1; + } + + if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) { + # A naked document + push @$self, undef; + while ( @lines and $lines[0] !~ /^---/ ) { + shift @lines; + } + $in_document = 0; + + # XXX The final '-+$' is to look for -- which ends up being an + # error later. + } elsif ( ! $in_document && @$self ) { + # only the first document can be explicit + die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; + } elsif ( $lines[0] =~ /^\s*\-(?:\s|$|-+$)/ ) { + # An array at the root + my $document = [ ]; + push @$self, $document; + $self->_load_array( $document, [ 0 ], \@lines ); + + } elsif ( $lines[0] =~ /^(\s*)\S/ ) { + # A hash at the root + my $document = { }; + push @$self, $document; + $self->_load_hash( $document, [ length($1) ], \@lines ); + + } else { + # Shouldn't get here. @lines have whitespace-only lines + # stripped, and previous match is a line with any + # non-whitespace. So this clause should only be reachable via + # a perlbug where \s is not symmetric with \S + + # uncoverable statement + die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; + } + } + }; + if ( ref $@ eq 'SCALAR' ) { + $self->_error(${$@}); + } elsif ( $@ ) { + $self->_error($@); + } + + return $self; } -# Deparse a scalar string to the actual scalar -sub _read_scalar { - my ($self, $string, $indent, $lines) = @_; - - # Trim trailing whitespace - $string =~ s/\s*\z//; - - # Explitic null/undef - return undef if $string eq '~'; - - # Single quote - if ( $string =~ /^\'(.*?)\'(?:\s+\#.*)?\z/ ) { - return '' unless defined $1; - $string = $1; - $string =~ s/\'\'/\'/g; - return $string; - } - - # Double quote. - # The commented out form is simpler, but overloaded the Perl regex - # engine due to recursion and backtracking problems on strings - # larger than 32,000ish characters. Keep it for reference purposes. - # if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) { - if ( $string =~ /^\"([^\\"]*(?:\\.[^\\"]*)*)\"(?:\s+\#.*)?\z/ ) { - # Reusing the variable is a little ugly, - # but avoids a new variable and a string copy. - $string = $1; - $string =~ s/\\"/"/g; - $string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex; - return $string; - } - - # Special cases - if ( $string =~ /^[\'\"!&]/ ) { - die \"CPAN::Meta::YAML does not support a feature in line '$string'"; - } - return {} if $string =~ /^{}(?:\s+\#.*)?\z/; - return [] if $string =~ /^\[\](?:\s+\#.*)?\z/; - - # Regular unquoted string - if ( $string !~ /^[>|]/ ) { - if ( - $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ - or - $string =~ /:(?:\s|$)/ - ) { - die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'"; - } - $string =~ s/\s+#.*\z//; - return $string; - } - - # Error - die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines; - - # Check the indent depth - $lines->[0] =~ /^(\s*)/; - $indent->[-1] = length("$1"); - if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) { - die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; - } - - # Pull the lines - my @multiline = (); - while ( @$lines ) { - $lines->[0] =~ /^(\s*)/; - last unless length($1) >= $indent->[-1]; - push @multiline, substr(shift(@$lines), length($1)); - } - - my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n"; - my $t = (substr($string, 1, 1) eq '-') ? '' : "\n"; - return join( $j, @multiline ) . $t; +sub _unquote_single { + my ($self, $string) = @_; + return '' unless length $string; + $string =~ s/\'\'/\'/g; + return $string; } -# Parse an array -sub _read_array { - my ($self, $array, $indent, $lines) = @_; - - while ( @$lines ) { - # Check for a new document - if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { - while ( @$lines and $lines->[0] !~ /^---/ ) { - shift @$lines; - } - return 1; - } - - # Check the indent level - $lines->[0] =~ /^(\s*)/; - if ( length($1) < $indent->[-1] ) { - return 1; - } elsif ( length($1) > $indent->[-1] ) { - die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; - } - - if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) { - # Inline nested hash - my $indent2 = length("$1"); - $lines->[0] =~ s/-/ /; - push @$array, { }; - $self->_read_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); - - } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { - # Array entry with a value - shift @$lines; - push @$array, $self->_read_scalar( "$2", [ @$indent, undef ], $lines ); - - } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) { - shift @$lines; - unless ( @$lines ) { - push @$array, undef; - return 1; - } - if ( $lines->[0] =~ /^(\s*)\-/ ) { - my $indent2 = length("$1"); - if ( $indent->[-1] == $indent2 ) { - # Null array entry - push @$array, undef; - } else { - # Naked indenter - push @$array, [ ]; - $self->_read_array( $array->[-1], [ @$indent, $indent2 ], $lines ); - } - - } elsif ( $lines->[0] =~ /^(\s*)\S/ ) { - push @$array, { }; - $self->_read_hash( $array->[-1], [ @$indent, length("$1") ], $lines ); - - } else { - die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; - } - - } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) { - # This is probably a structure like the following... - # --- - # foo: - # - list - # bar: value - # - # ... so lets return and let the hash parser handle it - return 1; - - } else { - die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; - } - } - - return 1; +sub _unquote_double { + my ($self, $string) = @_; + return '' unless length $string; + $string =~ s/\\"/"/g; + $string =~ + s{\\([Nnever\\fartz0b]|x([0-9a-fA-F]{2}))} + {(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}}gex; + return $string; } -# Parse an array -sub _read_hash { - my ($self, $hash, $indent, $lines) = @_; - - while ( @$lines ) { - # Check for a new document - if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { - while ( @$lines and $lines->[0] !~ /^---/ ) { - shift @$lines; - } - return 1; - } - - # Check the indent level - $lines->[0] =~ /^(\s*)/; - if ( length($1) < $indent->[-1] ) { - return 1; - } elsif ( length($1) > $indent->[-1] ) { - die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; - } - - # Get the key - unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+(?:\#.*)?|$)// ) { - if ( $lines->[0] =~ /^\s*[?\'\"]/ ) { - die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"; - } - die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; - } - my $key = $1; - - # Do we have a value? - if ( length $lines->[0] ) { - # Yes - $hash->{$key} = $self->_read_scalar( shift(@$lines), [ @$indent, undef ], $lines ); - } else { - # An indent - shift @$lines; - unless ( @$lines ) { - $hash->{$key} = undef; - return 1; - } - if ( $lines->[0] =~ /^(\s*)-/ ) { - $hash->{$key} = []; - $self->_read_array( $hash->{$key}, [ @$indent, length($1) ], $lines ); - } elsif ( $lines->[0] =~ /^(\s*)./ ) { - my $indent2 = length("$1"); - if ( $indent->[-1] >= $indent2 ) { - # Null hash entry - $hash->{$key} = undef; - } else { - $hash->{$key} = {}; - $self->_read_hash( $hash->{$key}, [ @$indent, length($1) ], $lines ); - } - } - } - } - - return 1; +# Load a YAML scalar string to the actual Perl scalar +sub _load_scalar { + my ($self, $string, $indent, $lines) = @_; + + # Trim trailing whitespace + $string =~ s/\s*\z//; + + # Explitic null/undef + return undef if $string eq '~'; + + # Single quote + if ( $string =~ /^$re_capture_single_quoted$re_trailing_comment\z/ ) { + return $self->_unquote_single($1); + } + + # Double quote. + if ( $string =~ /^$re_capture_double_quoted$re_trailing_comment\z/ ) { + return $self->_unquote_double($1); + } + + # Special cases + if ( $string =~ /^[\'\"!&]/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$string'"; + } + return {} if $string =~ /^{}(?:\s+\#.*)?\z/; + return [] if $string =~ /^\[\](?:\s+\#.*)?\z/; + + # Regular unquoted string + if ( $string !~ /^[>|]/ ) { + die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'" + if $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or + $string =~ /:(?:\s|$)/; + $string =~ s/\s+#.*\z//; + return $string; + } + + # Error + die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines; + + # Check the indent depth + $lines->[0] =~ /^(\s*)/; + $indent->[-1] = length("$1"); + if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + # Pull the lines + my @multiline = (); + while ( @$lines ) { + $lines->[0] =~ /^(\s*)/; + last unless length($1) >= $indent->[-1]; + push @multiline, substr(shift(@$lines), length($1)); + } + + my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n"; + my $t = (substr($string, 1, 1) eq '-') ? '' : "\n"; + return join( $j, @multiline ) . $t; } -# Save an object to a file -sub write { - my $self = shift; - my $file = shift or return $self->_error('No file name provided'); - - # Write it to the file - open( CFG, '>' . $file ) or return $self->_error( - "Failed to open file '$file' for writing: $!" - ); - print CFG $self->write_string; - close CFG; - - return 1; +# Load an array +sub _load_array { + my ($self, $array, $indent, $lines) = @_; + + while ( @$lines ) { + # Check for a new document + if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { + while ( @$lines and $lines->[0] !~ /^---/ ) { + shift @$lines; + } + return 1; + } + + # Check the indent level + $lines->[0] =~ /^(\s*)/; + if ( length($1) < $indent->[-1] ) { + return 1; + } elsif ( length($1) > $indent->[-1] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) { + # Inline nested hash + my $indent2 = length("$1"); + $lines->[0] =~ s/-/ /; + push @$array, { }; + $self->_load_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); + + } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) { + shift @$lines; + unless ( @$lines ) { + push @$array, undef; + return 1; + } + if ( $lines->[0] =~ /^(\s*)\-/ ) { + my $indent2 = length("$1"); + if ( $indent->[-1] == $indent2 ) { + # Null array entry + push @$array, undef; + } else { + # Naked indenter + push @$array, [ ]; + $self->_load_array( + $array->[-1], [ @$indent, $indent2 ], $lines + ); + } + + } elsif ( $lines->[0] =~ /^(\s*)\S/ ) { + push @$array, { }; + $self->_load_hash( + $array->[-1], [ @$indent, length("$1") ], $lines + ); + + } else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + + } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { + # Array entry with a value + shift @$lines; + push @$array, $self->_load_scalar( + "$2", [ @$indent, undef ], $lines + ); + + } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) { + # This is probably a structure like the following... + # --- + # foo: + # - list + # bar: value + # + # ... so lets return and let the hash parser handle it + return 1; + + } else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + } + + return 1; } -# Save an object to a string -sub write_string { - my $self = shift; - return '' unless @$self; - - # Iterate over the documents - my $indent = 0; - my @lines = (); - foreach my $cursor ( @$self ) { - push @lines, '---'; - - # An empty document - if ( ! defined $cursor ) { - # Do nothing - - # A scalar document - } elsif ( ! ref $cursor ) { - $lines[-1] .= ' ' . $self->_write_scalar( $cursor, $indent ); - - # A list at the root - } elsif ( ref $cursor eq 'ARRAY' ) { - unless ( @$cursor ) { - $lines[-1] .= ' []'; - next; - } - push @lines, $self->_write_array( $cursor, $indent, {} ); - - # A hash at the root - } elsif ( ref $cursor eq 'HASH' ) { - unless ( %$cursor ) { - $lines[-1] .= ' {}'; - next; - } - push @lines, $self->_write_hash( $cursor, $indent, {} ); - - } else { - Carp::croak("Cannot serialize " . ref($cursor)); - } - } - - join '', map { "$_\n" } @lines; +# Load a hash +sub _load_hash { + my ($self, $hash, $indent, $lines) = @_; + + while ( @$lines ) { + # Check for a new document + if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { + while ( @$lines and $lines->[0] !~ /^---/ ) { + shift @$lines; + } + return 1; + } + + # Check the indent level + $lines->[0] =~ /^(\s*)/; + if ( length($1) < $indent->[-1] ) { + return 1; + } elsif ( length($1) > $indent->[-1] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + # Find the key + my $key; + + # Quoted keys + if ( $lines->[0] =~ + s/^\s*$re_capture_single_quoted$re_key_value_separator// + ) { + $key = $self->_unquote_single($1); + } + elsif ( $lines->[0] =~ + s/^\s*$re_capture_double_quoted$re_key_value_separator// + ) { + $key = $self->_unquote_double($1); + } + elsif ( $lines->[0] =~ + s/^\s*$re_capture_unquoted_key$re_key_value_separator// + ) { + $key = $1; + $key =~ s/\s+$//; + } + elsif ( $lines->[0] =~ /^\s*\?/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"; + } + else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + + # Do we have a value? + if ( length $lines->[0] ) { + # Yes + $hash->{$key} = $self->_load_scalar( + shift(@$lines), [ @$indent, undef ], $lines + ); + } else { + # An indent + shift @$lines; + unless ( @$lines ) { + $hash->{$key} = undef; + return 1; + } + if ( $lines->[0] =~ /^(\s*)-/ ) { + $hash->{$key} = []; + $self->_load_array( + $hash->{$key}, [ @$indent, length($1) ], $lines + ); + } elsif ( $lines->[0] =~ /^(\s*)./ ) { + my $indent2 = length("$1"); + if ( $indent->[-1] >= $indent2 ) { + # Null hash entry + $hash->{$key} = undef; + } else { + $hash->{$key} = {}; + $self->_load_hash( + $hash->{$key}, [ @$indent, length($1) ], $lines + ); + } + } + } + } + + return 1; } -sub _write_scalar { - my $string = $_[1]; - return '~' unless defined $string; - return "''" unless length $string; - if ( $string =~ /[\x00-\x08\x0b-\x0d\x0e-\x1f\"\'\n]/ ) { - $string =~ s/\\/\\\\/g; - $string =~ s/"/\\"/g; - $string =~ s/\n/\\n/g; - $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g; - return qq|"$string"|; - } - if ( $string =~ /(?:^\W|\s|:\z)/ or $QUOTE{$string} ) { - return "'$string'"; - } - return $string; -} -sub _write_array { - my ($self, $array, $indent, $seen) = @_; - if ( $seen->{refaddr($array)}++ ) { - die "CPAN::Meta::YAML does not support circular references"; - } - my @lines = (); - foreach my $el ( @$array ) { - my $line = (' ' x $indent) . '-'; - my $type = ref $el; - if ( ! $type ) { - $line .= ' ' . $self->_write_scalar( $el, $indent + 1 ); - push @lines, $line; - - } elsif ( $type eq 'ARRAY' ) { - if ( @$el ) { - push @lines, $line; - push @lines, $self->_write_array( $el, $indent + 1, $seen ); - } else { - $line .= ' []'; - push @lines, $line; - } - - } elsif ( $type eq 'HASH' ) { - if ( keys %$el ) { - push @lines, $line; - push @lines, $self->_write_hash( $el, $indent + 1, $seen ); - } else { - $line .= ' {}'; - push @lines, $line; - } - - } else { - die "CPAN::Meta::YAML does not support $type references"; - } - } - - @lines; +### +# Dumper functions: + +# Save an object to a file +sub _dump_file { + my $self = shift; + + require Fcntl; + + # Check the file + my $file = shift or $self->_error( 'You did not specify a file name' ); + + my $fh; + # flock if available (or warn if not possible for OS-specific reasons) + if ( _can_flock() ) { + # Open without truncation (truncate comes after lock) + my $flags = Fcntl::O_WRONLY()|Fcntl::O_CREAT(); + sysopen( $fh, $file, $flags ); + unless ( $fh ) { + $self->_error("Failed to open file '$file' for writing: $!"); + } + + # Use no translation and strict UTF-8 + binmode( $fh, ":raw:encoding(UTF-8)"); + + flock( $fh, Fcntl::LOCK_EX() ) + or warn "Couldn't lock '$file' for reading: $!"; + + # truncate and spew contents + truncate $fh, 0; + seek $fh, 0, 0; + } + else { + open $fh, ">:unix:encoding(UTF-8)", $file; + } + + # serialize and spew to the handle + print {$fh} $self->_dump_string; + + # close the file (release the lock) + unless ( close $fh ) { + $self->_error("Failed to close file '$file': $!"); + } + + return 1; } -sub _write_hash { - my ($self, $hash, $indent, $seen) = @_; - if ( $seen->{refaddr($hash)}++ ) { - die "CPAN::Meta::YAML does not support circular references"; - } - my @lines = (); - foreach my $name ( sort keys %$hash ) { - my $el = $hash->{$name}; - my $line = (' ' x $indent) . "$name:"; - my $type = ref $el; - if ( ! $type ) { - $line .= ' ' . $self->_write_scalar( $el, $indent + 1 ); - push @lines, $line; - - } elsif ( $type eq 'ARRAY' ) { - if ( @$el ) { - push @lines, $line; - push @lines, $self->_write_array( $el, $indent + 1, $seen ); - } else { - $line .= ' []'; - push @lines, $line; - } - - } elsif ( $type eq 'HASH' ) { - if ( keys %$el ) { - push @lines, $line; - push @lines, $self->_write_hash( $el, $indent + 1, $seen ); - } else { - $line .= ' {}'; - push @lines, $line; - } - - } else { - die "CPAN::Meta::YAML does not support $type references"; - } - } - - @lines; +# Save an object to a string +sub _dump_string { + my $self = shift; + return '' unless ref $self && @$self; + + # Iterate over the documents + my $indent = 0; + my @lines = (); + + eval { + foreach my $cursor ( @$self ) { + push @lines, '---'; + + # An empty document + if ( ! defined $cursor ) { + # Do nothing + + # A scalar document + } elsif ( ! ref $cursor ) { + $lines[-1] .= ' ' . $self->_dump_scalar( $cursor ); + + # A list at the root + } elsif ( ref $cursor eq 'ARRAY' ) { + unless ( @$cursor ) { + $lines[-1] .= ' []'; + next; + } + push @lines, $self->_dump_array( $cursor, $indent, {} ); + + # A hash at the root + } elsif ( ref $cursor eq 'HASH' ) { + unless ( %$cursor ) { + $lines[-1] .= ' {}'; + next; + } + push @lines, $self->_dump_hash( $cursor, $indent, {} ); + + } else { + die \("Cannot serialize " . ref($cursor)); + } + } + }; + if ( ref $@ eq 'SCALAR' ) { + $self->_error(${$@}); + } elsif ( $@ ) { + $self->_error($@); + } + + join '', map { "$_\n" } @lines; } -# Set error -sub _error { - $CPAN::Meta::YAML::errstr = $_[1]; - undef; +sub _has_internal_string_value { + my $value = shift; + my $b_obj = B::svref_2object(\$value); # for round trip problem + return $b_obj->FLAGS & B::SVf_POK(); } -# Retrieve error -sub errstr { - $CPAN::Meta::YAML::errstr; +sub _dump_scalar { + my $string = $_[1]; + my $is_key = $_[2]; + # Check this before checking length or it winds up looking like a string! + my $has_string_flag = _has_internal_string_value($string); + return '~' unless defined $string; + return "''" unless length $string; + if (Scalar::Util::looks_like_number($string)) { + # keys and values that have been used as strings get quoted + if ( $is_key || $has_string_flag ) { + return qq['$string']; + } + else { + return $string; + } + } + if ( $string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/ ) { + $string =~ s/\\/\\\\/g; + $string =~ s/"/\\"/g; + $string =~ s/\n/\\n/g; + $string =~ s/[\x85]/\\N/g; + $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g; + $string =~ s/([\x7f-\x9f])/'\x' . sprintf("%X",ord($1))/ge; + return qq|"$string"|; + } + if ( $string =~ /(?:^[~!@#%&*|>?:,'"`{}\[\]]|^-+$|\s|:\z)/ or + $QUOTE{$string} + ) { + return "'$string'"; + } + return $string; } +sub _dump_array { + my ($self, $array, $indent, $seen) = @_; + if ( $seen->{refaddr($array)}++ ) { + die \"CPAN::Meta::YAML does not support circular references"; + } + my @lines = (); + foreach my $el ( @$array ) { + my $line = (' ' x $indent) . '-'; + my $type = ref $el; + if ( ! $type ) { + $line .= ' ' . $self->_dump_scalar( $el ); + push @lines, $line; + + } elsif ( $type eq 'ARRAY' ) { + if ( @$el ) { + push @lines, $line; + push @lines, $self->_dump_array( $el, $indent + 1, $seen ); + } else { + $line .= ' []'; + push @lines, $line; + } + + } elsif ( $type eq 'HASH' ) { + if ( keys %$el ) { + push @lines, $line; + push @lines, $self->_dump_hash( $el, $indent + 1, $seen ); + } else { + $line .= ' {}'; + push @lines, $line; + } + + } else { + die \"CPAN::Meta::YAML does not support $type references"; + } + } + + @lines; +} +sub _dump_hash { + my ($self, $hash, $indent, $seen) = @_; + if ( $seen->{refaddr($hash)}++ ) { + die \"CPAN::Meta::YAML does not support circular references"; + } + my @lines = (); + foreach my $name ( sort keys %$hash ) { + my $el = $hash->{$name}; + my $line = (' ' x $indent) . $self->_dump_scalar($name, 1) . ":"; + my $type = ref $el; + if ( ! $type ) { + $line .= ' ' . $self->_dump_scalar( $el ); + push @lines, $line; + + } elsif ( $type eq 'ARRAY' ) { + if ( @$el ) { + push @lines, $line; + push @lines, $self->_dump_array( $el, $indent + 1, $seen ); + } else { + $line .= ' []'; + push @lines, $line; + } + + } elsif ( $type eq 'HASH' ) { + if ( keys %$el ) { + push @lines, $line; + push @lines, $self->_dump_hash( $el, $indent + 1, $seen ); + } else { + $line .= ' {}'; + push @lines, $line; + } + + } else { + die \"CPAN::Meta::YAML does not support $type references"; + } + } + + @lines; +} ##################################################################### -# YAML Compatibility +# DEPRECATED API methods: -sub Dump { - CPAN::Meta::YAML->new(@_)->write_string; -} +# Error storage (DEPRECATED as of 1.57) +our $errstr = ''; -sub Load { - my $self = CPAN::Meta::YAML->read_string(@_); - unless ( $self ) { - Carp::croak("Failed to load YAML document from string"); - } - if ( wantarray ) { - return @$self; - } else { - # To match YAML.pm, return the last document - return $self->[-1]; - } +# Set error +sub _error { + require Carp; + $errstr = $_[1]; + $errstr =~ s/ at \S+ line \d+.*//; + Carp::croak( $errstr ); } -BEGIN { - *freeze = *Dump; - *thaw = *Load; +# Retrieve error +my $errstr_warned; +sub errstr { + require Carp; + Carp::carp( "CPAN::Meta::YAML->errstr and \$CPAN::Meta::YAML::errstr is deprecated" ) + unless $errstr_warned++; + $errstr; } -sub DumpFile { - my $file = shift; - CPAN::Meta::YAML->new(@_)->write($file); -} - -sub LoadFile { - my $self = CPAN::Meta::YAML->read($_[0]); - unless ( $self ) { - Carp::croak("Failed to load YAML document from '" . ($_[0] || '') . "'"); - } - if ( wantarray ) { - return @$self; - } else { - # Return only the last document to match YAML.pm, - return $self->[-1]; - } -} +##################################################################### +# Helper functions. Possibly not needed. + + +# Use to detect nv or iv +use B; + +# XXX-INGY Is flock CPAN::Meta::YAML's responsibility? +# Some platforms can't flock :-( +# XXX-XDG I think it is. When reading and writing files, we ought +# to be locking whenever possible. People (foolishly) use YAML +# files for things like session storage, which has race issues. +my $HAS_FLOCK; +sub _can_flock { + if ( defined $HAS_FLOCK ) { + return $HAS_FLOCK; + } + else { + require Config; + my $c = \%Config::Config; + $HAS_FLOCK = grep { $c->{$_} } qw/d_flock d_fcntl_can_lock d_lockf/; + require Fcntl if $HAS_FLOCK; + return $HAS_FLOCK; + } +} +# XXX-INGY Is this core in 5.8.1? Can we remove this? +# XXX-XDG Scalar::Util 1.18 didn't land until 5.8.8, so we need this ##################################################################### # Use Scalar::Util if possible, otherwise emulate it BEGIN { - local $@; - eval { - require Scalar::Util; - }; - my $v = eval("$Scalar::Util::VERSION") || 0; - if ( $@ or $v < 1.18 ) { - eval <<'END_PERL'; + local $@; + if ( eval { require Scalar::Util } + && $Scalar::Util::VERSION + && eval($Scalar::Util::VERSION) >= 1.18 + ) { + *refaddr = *Scalar::Util::refaddr; + } + else { + eval <<'END_PERL'; # Scalar::Util failed to load or too old sub refaddr { - my $pkg = ref($_[0]) or return undef; - if ( !! UNIVERSAL::can($_[0], 'can') ) { - bless $_[0], 'Scalar::Util::Fake'; - } else { - $pkg = undef; - } - "$_[0]" =~ /0x(\w+)/; - my $i = do { local $^W; hex $1 }; - bless $_[0], $pkg if defined $pkg; - $i; + my $pkg = ref($_[0]) or return undef; + if ( !! UNIVERSAL::can($_[0], 'can') ) { + bless $_[0], 'Scalar::Util::Fake'; + } else { + $pkg = undef; + } + "$_[0]" =~ /0x(\w+)/; + my $i = do { no warnings 'portable'; hex $1 }; + bless $_[0], $pkg if defined $pkg; + $i; } END_PERL - } else { - *refaddr = *Scalar::Util::refaddr; - } + } } -1; +1; + +# XXX-INGY Doc notes I'm putting up here. Changing the doc when it's wrong +# but leaving grey area stuff up here. +# +# I would like to change Read/Write to Load/Dump below without +# changing the actual API names. +# +# It might be better to put Load/Dump API in the SYNOPSIS instead of the +# dubious OO API. +# +# null and bool explanations may be outdated. + =pod +=encoding UTF-8 + =head1 NAME CPAN::Meta::YAML - Read and write a subset of YAML for CPAN Meta files =head1 VERSION -version 0.008 +version 0.012 =head1 SYNOPSIS @@ -684,7 +917,7 @@ C methods do B support UTF-8 and should not be used. This module is currently derived from L by Adam Kennedy. If there are bugs in how it parses a particular META.yml file, please file a bug report in the YAML::Tiny bugtracker: -L +L =head1 SEE ALSO @@ -697,7 +930,7 @@ L, L, L =head2 Bugs / Feature Requests Please report any bugs or feature requests through the issue tracker -at L. +at L. You will be notified automatically of any progress on your issue. =head2 Source Code @@ -705,9 +938,9 @@ You will be notified automatically of any progress on your issue. This is open source software. The code repository is available for public review and contribution under the terms of the license. -L +L - git clone https://github.com/dagolden/cpan-meta-yaml.git + git clone https://github.com/dagolden/CPAN-Meta-YAML.git =head1 AUTHORS @@ -732,7 +965,6 @@ the same terms as the Perl 5 programming language system itself. =cut - __END__ diff --git a/Master/tlpkg/tlperl/lib/CPAN/Mirrors.pm b/Master/tlpkg/tlperl/lib/CPAN/Mirrors.pm index 38e0043d7a4..37e7ce0ef9f 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Mirrors.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Mirrors.pm @@ -2,29 +2,28 @@ # vim: ts=4 sts=4 sw=4: =head1 NAME -CPAN::Mirrors - Get CPAN miror information and select a fast one +CPAN::Mirrors - Get CPAN mirror information and select a fast one =head1 SYNOPSIS - use CPAN::Mirrors; + use CPAN::Mirrors; - my $mirrors = CPAN::Mirrors->new; - $mirrors->parse_from_file( $mirrored_by_file ); + my $mirrors = CPAN::Mirrors->new( $mirrored_by_file ); - my $seen = {}; + my $seen = {}; - my $best_continent = $mirrors->find_best_continents( { seen => $seen } ); - my @mirrors = $mirrors->get_mirrors_by_continents( $best_continent ); + my $best_continent = $mirrors->find_best_continents( { seen => $seen } ); + my @mirrors = $mirrors->get_mirrors_by_continents( $best_continent ); - my $callback = sub { - my( $m ) = @_; - printf "%s = %s\n", $m->hostname, $m->rtt - }; - $mirrors->get_mirrors_timings( \@mirrors, $seen, $callback ); + my $callback = sub { + my( $m ) = @_; + printf "%s = %s\n", $m->hostname, $m->rtt + }; + $mirrors->get_mirrors_timings( \@mirrors, $seen, $callback ); - @mirrors = sort { $a->rtt <=> $b->rtt } @mirrors; + @mirrors = sort { $a->rtt <=> $b->rtt } @mirrors; - print "Best mirrors are ", map( { $_->rtt } @mirrors[0..3] ), "\n"; + print "Best mirrors are ", map( { $_->rtt } @mirrors[0..3] ), "\n"; =head1 DESCRIPTION @@ -35,7 +34,7 @@ CPAN::Mirrors - Get CPAN miror information and select a fast one package CPAN::Mirrors; use strict; use vars qw($VERSION $urllist $silent); -$VERSION = "1.9600"; +$VERSION = "1.9601"; use Carp; use FileHandle; @@ -44,24 +43,28 @@ use Net::Ping (); =item new( LOCAL_FILE_NAME ) +Create a new CPAN::Mirrors object from LOCAL_FILE_NAME. This file +should look like that in http://www.cpan.org/MIRRORED.BY . + =cut sub new { my ($class, $file) = @_; + croak "CPAN::Mirrors->new requires a filename" unless defined $file; + croak "The file [$file] was not found" unless -e $file; + my $self = bless { mirrors => [], geography => {}, }, $class; - if( defined $file ) { - $self->parse_mirrored_by( $file ); - } + $self->parse_mirrored_by( $file ); - return $self + return $self; } sub parse_mirrored_by { - my ($self, $file) = @_; + my ($self, $file) = @_; my $handle = FileHandle->new; $handle->open($file) or croak "Couldn't open $file: $!"; @@ -134,21 +137,36 @@ sub get_mirrors_by_countries { &mirrors } Return a list of mirrors for all of continents you specify. If you don't specify any continents, it returns all of the mirrors. +You can specify a single continent or an array reference of continents. + =cut sub get_mirrors_by_continents { - my ($self, $continents ) = @_; + my ($self, $continents ) = @_; + $continents = [ $continents ] unless ref $continents; - $self->mirrors( $self->get_countries_by_continents( @$continents ) ); - } + eval { + $self->mirrors( $self->get_countries_by_continents( @$continents ) ); + }; + } =item get_countries_by_continents( [CONTINENTS] ) A more sensible synonym for countries. =cut + sub get_countries_by_continents { &countries } +=item default_mirror + +Returns the default mirror, http://www.cpan.org/ . This mirror uses +dynamic DNS to give a close mirror. + +=cut + +sub default_mirror { 'http://www.cpan.org/' } + =item best_mirrors C checks for the best mirrors based on the list of @@ -159,14 +177,17 @@ In scalar context, it returns the single best mirror. Arguments - how_many - the number of mirrors to return. Default: 1 - callback - a callback for find_best_continents - verbose - true or false on all the whining and moaning. Default: false - continents - an array ref of the continents to check + how_many - the number of mirrors to return. Default: 1 + callback - a callback for find_best_continents + verbose - true or false on all the whining and moaning. Default: false + continents - an array ref of the continents to check If you don't specify the continents, C calls C to get the list of continents to check. +If you don't have L v2.13 or later, needed for timings, +this returns the default mirror. + =cut sub best_mirrors { @@ -178,17 +199,22 @@ sub best_mirrors { $continents = [$continents] unless ref $continents; # Old Net::Ping did not do timings at all - return "http://www.cpan.org/" unless Net::Ping->VERSION gt '2.13'; + my $min_version = '2.13'; + unless( Net::Ping->VERSION gt $min_version ) { + carp sprintf "Net::Ping version is %s (< %s). Returning %s", + Net::Ping->VERSION, $min_version, $self->default_mirror; + return $self->default_mirror; + } my $seen = {}; if ( ! @$continents ) { print "Searching for the best continent ...\n" if $verbose; my @best_continents = $self->find_best_continents( - seen => $seen, - verbose => $verbose, - callback => $callback, - ); + seen => $seen, + verbose => $verbose, + callback => $callback, + ); # Only add enough continents to find enough mirrors my $count = 0; @@ -201,7 +227,7 @@ sub best_mirrors { print "Scanning " . join(", ", @$continents) . " ...\n" if $verbose; - my $trial_mirrors = $self->get_n_random_mirrors_by_continents( 3 * $how_many, $continents->[0] ); + my $trial_mirrors = $self->get_n_random_mirrors_by_continents( 3 * $how_many, $continents->[0] ); my $timings = $self->get_mirrors_timings( $trial_mirrors, $seen, $callback ); return [] unless @$timings; @@ -211,7 +237,7 @@ sub best_mirrors { return wantarray ? @{$timings}[0 .. $how_many-1] : $timings->[0]; } -=item get_n_random_mirrors_by_continents( N, [CONTINENTS] +=item get_n_random_mirrors_by_continents( N, [CONTINENTS] ) Returns up to N random mirrors for the specified continents. Specify the continents as an array reference. @@ -219,55 +245,65 @@ continents as an array reference. =cut sub get_n_random_mirrors_by_continents { - my( $self, $n, $continents ) = @_; - $n ||= 3; - $continents = [ $continents ] unless ref $continents; + my( $self, $n, $continents ) = @_; + $n ||= 3; + $continents = [ $continents ] unless ref $continents; if ( $n <= 0 ) { - return wantarray ? () : []; + return wantarray ? () : []; } my @long_list = $self->get_mirrors_by_continents( $continents ); if ( $n eq '*' or $n > @long_list ) { - return wantarray ? @long_list : \@long_list; + return wantarray ? @long_list : \@long_list; } - @long_list = map {$_->[0]} - sort {$a->[1] <=> $b->[1]} + @long_list = map {$_->[0]} + sort {$a->[1] <=> $b->[1]} map {[$_, rand]} @long_list; - splice @long_list, $n; # truncate + splice @long_list, $n; # truncate - \@long_list; + \@long_list; } =item get_mirrors_timings( MIRROR_LIST, SEEN, CALLBACK ); -Pings the listed mirrors and returns a list of mirrors sorted -in ascending ping times. +Pings the listed mirrors and returns a list of mirrors sorted in +ascending ping times. + +C is an anonymous array of C objects to +ping. + +The optional argument C is a hash reference used to track the +mirrors you've already pinged. + +The optional argument C is a subroutine reference to call +after each ping. It gets the C object after each +ping. =cut sub get_mirrors_timings { - my( $self, $mirror_list, $seen, $callback ) = @_; + my( $self, $mirror_list, $seen, $callback ) = @_; - $seen = {} unless defined $seen; - croak "The mirror list argument must be an array reference" - unless ref $mirror_list eq ref []; - croak "The seen argument must be a hash reference" - unless ref $seen eq ref {}; - croak "callback must be a subroutine" - if( defined $callback and ref $callback ne ref sub {} ); + $seen = {} unless defined $seen; + croak "The mirror list argument must be an array reference" + unless ref $mirror_list eq ref []; + croak "The seen argument must be a hash reference" + unless ref $seen eq ref {}; + croak "callback must be a subroutine" + if( defined $callback and ref $callback ne ref sub {} ); - my $timings = []; + my $timings = []; for my $m ( @$mirror_list ) { - $seen->{$m->hostname} = $m; - next unless eval{ $m->http }; + $seen->{$m->hostname} = $m; + next unless eval{ $m->http }; if( $self->_try_a_ping( $seen, $m, ) ) { my $ping = $m->ping; - next unless defined $ping; + next unless defined $ping; push @$timings, $m; $callback->( $m ) if $callback; } @@ -278,48 +314,52 @@ sub get_mirrors_timings { } my @best = sort { - if( defined $a->rtt and defined $b->rtt ) { - $a->rtt <=> $b->rtt - } - elsif( defined $a->rtt and ! defined $b->rtt ) { - return -1; - } - elsif( ! defined $a->rtt and defined $b->rtt ) { - return 1; - } - elsif( ! defined $a->rtt and ! defined $b->rtt ) { - return 0; - } - - } @$timings; + if( defined $a->rtt and defined $b->rtt ) { + $a->rtt <=> $b->rtt + } + elsif( defined $a->rtt and ! defined $b->rtt ) { + return -1; + } + elsif( ! defined $a->rtt and defined $b->rtt ) { + return 1; + } + elsif( ! defined $a->rtt and ! defined $b->rtt ) { + return 0; + } + + } @$timings; return wantarray ? @best : \@best; } =item find_best_continents( HASH_REF ); -C goes through each continent and pings C random -mirrors on that continent. It then orders the continents by ascending -median ping time. In list context, it returns the ordered list of -continent. In scalar context, it returns the same list as an anonymous -array. +C goes through each continent and pings C +random mirrors on that continent. It then orders the continents by +ascending median ping time. In list context, it returns the ordered list +of continent. In scalar context, it returns the same list as an +anonymous array. Arguments: - n - the number of hosts to ping for each continent. Default: 3 - seen - a hashref of cached hostname ping times - verbose - true or false for noisy or quiet. Default: false - callback - a subroutine to run after each ping. - ping_cache_limit - how long, in seconds, to reuse previous ping times. - Default: 1 day + n - the number of hosts to ping for each continent. Default: 3 + seen - a hashref of cached hostname ping times + verbose - true or false for noisy or quiet. Default: false + callback - a subroutine to run after each ping. + ping_cache_limit - how long, in seconds, to reuse previous ping times. + Default: 1 day -The C hash has hostnames as keys and anonymous arrays as values. The -anonymous array is a triplet of a C object, a ping -time, and the epoch time for the measurement. +The C hash has hostnames as keys and anonymous arrays as values. +The anonymous array is a triplet of a C object, a +ping time, and the epoch time for the measurement. The callback subroutine gets the C object, the ping -time, and measurement time (the same things in the C hashref) as arguments. -C doesn't care what the callback does and ignores the return +time, and measurement time (the same things in the C hashref) as +arguments. C doesn't care what the callback does +and ignores the return value. + +With a low value for C, a single mirror might skew the results enough +to choose a worse continent. If you have that problem, try a larger value. =cut @@ -327,19 +367,19 @@ value. sub find_best_continents { my ($self, %args) = @_; - $args{n} ||= 3; - $args{verbose} = 0 unless defined $args{verbose}; - $args{seen} = {} unless defined $args{seen}; - croak "The seen argument must be a hash reference" - unless ref $args{seen} eq ref {}; - $args{ping_cache_limit} = 24 * 60 * 60 - unless defined $args{ping_cache_time}; - croak "callback must be a subroutine" - if( defined $args{callback} and ref $args{callback} ne ref sub {} ); + $args{n} ||= 3; + $args{verbose} = 0 unless defined $args{verbose}; + $args{seen} = {} unless defined $args{seen}; + croak "The seen argument must be a hash reference" + unless ref $args{seen} eq ref {}; + $args{ping_cache_limit} = 24 * 60 * 60 + unless defined $args{ping_cache_time}; + croak "callback must be a subroutine" + if( defined $args{callback} and ref $args{callback} ne ref sub {} ); my %medians; CONT: for my $c ( $self->continents ) { - print "Testing $c\n" if $args{verbose}; + print "Testing $c\n" if $args{verbose}; my @mirrors = $self->mirrors( $self->countries($c) ); next CONT unless @mirrors; @@ -350,19 +390,19 @@ sub find_best_continents { RANDOM: while ( @mirrors && @tests < $n && $tries++ < 15 ) { my $m = splice( @mirrors, int(rand(@mirrors)), 1 ); if( $self->_try_a_ping( $args{seen}, $m, $args{ping_cache_limit} ) ) { - $self->get_mirrors_timings( [ $m ], @args{qw(seen callback)} ); - next RANDOM unless defined $args{seen}{$m->hostname}->rtt; + $self->get_mirrors_timings( [ $m ], @args{qw(seen callback)} ); + next RANDOM unless defined $args{seen}{$m->hostname}->rtt; } printf "\t%s -> %0.2f ms\n", - $m->hostname, - join ' ', 1000 * $args{seen}{$m->hostname}->rtt - if $args{verbose}; + $m->hostname, + join ' ', 1000 * $args{seen}{$m->hostname}->rtt + if $args{verbose}; - push @tests, $args{seen}{$m->hostname}->rtt; + push @tests, $args{seen}{$m->hostname}->rtt; } - my $median = $self->_get_median_ping_time( \@tests, $args{verbose} ); - $medians{$c} = $median if defined $median; + my $median = $self->_get_median_ping_time( \@tests, $args{verbose} ); + $medians{$c} = $median if defined $median; } my @best_cont = sort { $medians{$a} <=> $medians{$b} } keys %medians; @@ -379,33 +419,33 @@ sub find_best_continents { # retry if sub _try_a_ping { - my ($self, $seen, $mirror, $ping_cache_limit ) = @_; - - ( ! exists $seen->{$mirror->hostname} ) - or - ( - ! defined $seen->{$mirror->hostname}->rtt - or - time - $seen->{$mirror->hostname}->rtt > $ping_cache_limit - ) + my ($self, $seen, $mirror, $ping_cache_limit ) = @_; + + ( ! exists $seen->{$mirror->hostname} ) + or + ( + ! defined $seen->{$mirror->hostname}->rtt + or + time - $seen->{$mirror->hostname}->rtt > $ping_cache_limit + ) } sub _get_median_ping_time { - my ($self, $tests, $verbose ) = @_; + my ($self, $tests, $verbose ) = @_; - my @sorted = sort { $a <=> $b } @$tests; + my @sorted = sort { $a <=> $b } @$tests; - my $median = do { - if ( @sorted == 0 ) { undef } - elsif ( @sorted == 1 ) { $sorted[0] } - elsif ( @sorted % 2 ) { $sorted[ int(@sorted / 2) ] } - else { - my $mid_high = int(@sorted/2); - ($sorted[$mid_high-1] + $sorted[$mid_high])/2; - } - }; + my $median = do { + if ( @sorted == 0 ) { undef } + elsif ( @sorted == 1 ) { $sorted[0] } + elsif ( @sorted % 2 ) { $sorted[ int(@sorted / 2) ] } + else { + my $mid_high = int(@sorted/2); + ($sorted[$mid_high-1] + $sorted[$mid_high])/2; + } + }; - printf "\t-->median time: %0.2f ms\n", $median * 1000 if $verbose; + printf "\t-->median time: %0.2f ms\n", $median * 1000 if $verbose; return $median; } @@ -513,7 +553,7 @@ sub ping { my $port = $proto eq 'http' ? 80 : 21; return unless $port; - if ( $ping->can('port_number') ) { + if ( $ping->can('port_number') ) { $ping->port_number($port); } else { @@ -546,6 +586,4 @@ modify it under the same terms as Perl itself. See L - - =cut diff --git a/Master/tlpkg/tlperl/lib/CPAN/Queue.pm b/Master/tlpkg/tlperl/lib/CPAN/Queue.pm index 1222b37ef61..8027d22d3b2 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Queue.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Queue.pm @@ -20,6 +20,11 @@ sub reqtype { $self->{reqtype}; } +sub optional { + my($self) = @_; + $self->{optional}; +} + package CPAN::Queue; # One use of the queue is to determine if we should or shouldn't @@ -67,7 +72,7 @@ package CPAN::Queue; # in CPAN::Distribution::rematein. use vars qw{ @All $VERSION }; -$VERSION = "5.5001"; +$VERSION = "5.5002"; # CPAN::Queue::queue_item ; sub queue_item { @@ -82,7 +87,7 @@ sub qpush { my($class,$obj) = @_; push @All, $obj; CPAN->debug(sprintf("in new All[%s]", - join("",map {sprintf " %s\[%s]\n",$_->{qmod},$_->{reqtype}} @All), + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All), )) if $CPAN::DEBUG; } @@ -99,9 +104,13 @@ sub delete_first { for my $i (0..$#All) { if ( $All[$i]->{qmod} eq $what ) { splice @All, $i, 1; - return; + last; } } + CPAN->debug(sprintf("after delete_first mod[%s] All[%s]", + $what, + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All) + )) if $CPAN::DEBUG; } # CPAN::Queue::jumpqueue ; @@ -109,8 +118,8 @@ sub jumpqueue { my $class = shift; my @what = @_; CPAN->debug(sprintf("before jumpqueue All[%s] what[%s]", - join("",map {sprintf " %s\[%s]\n",$_->{qmod},$_->{reqtype}} @All), - join("",map {sprintf " %s\[%s]\n",$_->{qmod},$_->{reqtype}} @what), + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All), + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @what), )) if $CPAN::DEBUG; unless (defined $what[0]{reqtype}) { # apparently it was not the Shell that sent us this enquiry, @@ -119,7 +128,7 @@ sub jumpqueue { } my $inherit_reqtype = $what[0]{reqtype} =~ /^(c|r)$/ ? "r" : "b"; WHAT: for my $what_tuple (@what) { - my($qmod,$reqtype) = @$what_tuple{qw(qmod reqtype)}; + my($qmod,$reqtype,$optional) = @$what_tuple{qw(qmod reqtype optional)}; if ($reqtype eq "r" && $inherit_reqtype eq "b" @@ -138,12 +147,13 @@ sub jumpqueue { CPAN->debug("qmod[$qmod]jumped[$jumped]") if $CPAN::DEBUG; my $obj = "$class\::Item"->new( qmod => $qmod, - reqtype => $reqtype + reqtype => $reqtype, + optional => !! $optional, ); unshift @All, $obj; } CPAN->debug(sprintf("after jumpqueue All[%s]", - join("",map {sprintf " %s\[%s]\n",$_->{qmod},$_->{reqtype}} @All) + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All) )) if $CPAN::DEBUG; } @@ -162,7 +172,7 @@ sub delete { @All = grep { $_->{qmod} ne $mod } @All; CPAN->debug(sprintf("after delete mod[%s] All[%s]", $mod, - join("",map {sprintf " %s\[%s]\n",$_->{qmod},$_->{reqtype}} @All) + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All) )) if $CPAN::DEBUG; } diff --git a/Master/tlpkg/tlperl/lib/CPAN/Shell.pm b/Master/tlpkg/tlperl/lib/CPAN/Shell.pm index 21441df653f..9e0bb14a2b8 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Shell.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Shell.pm @@ -47,7 +47,7 @@ use vars qw( "CPAN/Tarzip.pm", "CPAN/Version.pm", ); -$VERSION = "5.5002"; +$VERSION = "5.5004"; # record the initial timestamp for reload. $reload = { map {$INC{$_} ? ($_,(stat $INC{$_})[9]) : ()} @relo }; @CPAN::Shell::ISA = qw(CPAN::Debug); @@ -206,7 +206,7 @@ sub a { sub globls { my($self,$s,$pragmas) = @_; # ls is really very different, but we had it once as an ordinary - # command in the Shell (upto rev. 321) and we could not handle + # command in the Shell (up to rev. 321) and we could not handle # force well then my(@accept,@preexpand); if ($s =~ /[\*\?\/]/) { @@ -604,7 +604,7 @@ sub _reload_this { CPAN->debug("file[$file]") if $CPAN::DEBUG; my @inc = @INC; unless ($file && -f $file) { - # this thingie is not in the INC path, maybe CPAN/MyConfig.pm? + # this thingy is not in the INC path, maybe CPAN/MyConfig.pm? $file = $INC{$f}; unless (CPAN->has_inst("File::Basename")) { @inc = File::Basename::dirname($file); @@ -626,9 +626,12 @@ sub _reload_this { if ($must_reload) { my $fh = FileHandle->new($file) or $CPAN::Frontend->mydie("Could not open $file: $!"); - local($/); - local $^W = 1; - my $content = <$fh>; + my $content; + { + local($/); + local $^W = 1; + $content = <$fh>; + } CPAN->debug(sprintf("reload file[%s] content[%s...]",$file,substr($content,0,128))) if $CPAN::DEBUG; delete $INC{$f}; @@ -769,6 +772,201 @@ sub scripts { } } +sub _guess_manpage { + my($self,$d,$contains,$dist) = @_; + $dist =~ s/-/::/g; + my $module; + if (exists $contains->{$dist}) { + $module = $dist; + } elsif (1 == keys %$contains) { + ($module) = keys %$contains; + } + my $manpage; + if ($module) { + my $m = $self->expand("Module",$module); + $m->as_string; # called for side-effects, shame + $manpage = $m->{MANPAGE}; + } else { + $manpage = "unknown"; + } + return $manpage; +} + +#-> sub CPAN::Shell::_specfile ; +sub _specfile { + my $self = shift; + my $distribution = shift; + unless ($CPAN::META->has_inst("CPAN::DistnameInfo")){ + $CPAN::Frontend->mydie("CPAN::DistnameInfo not installed; cannot continue"); + } + my $d = CPAN::Shell->expand("Distribution",$distribution) + or $CPAN::Frontend->mydie("Unknowns distribution '$distribution'\n"); + my $build_dir = $d->{build_dir} or $CPAN::Frontend->mydie("Distribution has not been built yet, cannot proceed"); + my %contains = map {($_ => undef)} $d->containsmods; + my @m; + my $width = 16; + my $header = sub { + my($header,$value) = @_; + push @m, sprintf("%-s:%*s%s\n", $header, $width-length($header), "", $value); + }; + my $dni = CPAN::DistnameInfo->new($distribution); + my $dist = $dni->dist; + my $summary = $self->_guess_manpage($d,\%contains,$dist); + $header->("Name", "perl-$dist"); + my $version = $dni->version; + $header->("Version", $version); + $header->("Release", "1%{?dist}"); +#Summary: Template processing system +#Group: Development/Libraries +#License: GPL+ or Artistic +#URL: http://www.template-toolkit.org/ +#Source0: http://search.cpan.org/CPAN/authors/id/A/AB/ABW/Template-Toolkit-%{version}.tar.gz +#Patch0: Template-2.22-SREZIC-01.patch +#BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + for my $h_tuple + ([Summary => $summary], + [Group => "Development/Libraries"], + [License =>], + [URL =>], + [BuildRoot => "%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)"], + [Requires => "perl(:MODULE_COMPAT_%(eval \"`%{__perl} -V:version`\"; echo \$version))"], + ) { + my($h,$v) = @$h_tuple; + $v = "unknown" unless defined $v; + $header->($h, $v); + } + $header->("Source0", sprintf( + "http://search.cpan.org/CPAN/authors/id/%s/%s/%s", + substr($distribution,0,1), + substr($distribution,0,2), + $distribution + )); + require POSIX; + my @xs = glob "$build_dir/*.xs"; # quick try + unless (@xs) { + require ExtUtils::Manifest; + my $manifest_file = "$build_dir/MANIFEST"; + my $manifest = ExtUtils::Manifest::maniread($manifest_file); + @xs = grep /\.xs$/, keys %$manifest; + } + if (! @xs) { + $header->('BuildArch', 'noarch'); + } + for my $k (sort keys %contains) { + my $m = CPAN::Shell->expand("Module",$k); + my $v = $contains{$k} = $m->cpan_version; + my $vspec = $v eq "undef" ? "" : " = $v"; + $header->("Provides", "perl($k)$vspec"); + } + if (my $prereq_pm = $d->{prereq_pm}) { + my %req; + for my $reqkey (keys %$prereq_pm) { + while (my($k,$v) = each %{$prereq_pm->{$reqkey}}) { + $req{$k} = $v; + } + } + if (-e "$build_dir/Build.PL" && ! exists $req{"Module::Build"}) { + $req{"Module::Build"} = 0; + } + for my $k (sort keys %req) { + next if $k eq "perl"; + my $v = $req{$k}; + my $vspec = defined $v && length $v && $v > 0 ? " >= $v" : ""; + $header->(BuildRequires => "perl($k)$vspec"); + next if $k =~ /^(Module::Build)$/; # MB is always only a + # BuildRequires; if we + # turn it into a + # Requires, then we + # would have to make it + # a BuildRequires + # everywhere we depend + # on *one* MB built + # module. + $header->(Requires => "perl($k)$vspec"); + } + } + push @m, "\n%define _use_internal_dependency_generator 0 +%define __find_requires %{nil} +%define __find_provides %{nil} +"; + push @m, "\n%description\n%{summary}.\n"; + push @m, "\n%prep\n%setup -q -n $dist-%{version}\n"; + if (-e "$build_dir/Build.PL") { + # see http://www.redhat.com/archives/rpm-list/2002-July/msg00110.html about RPM_BUILD_ROOT vs %{buildroot} + push @m, <<'EOF'; + +%build +%{__perl} Build.PL --installdirs=vendor --libdoc installvendorman3dir +./Build + +%install +rm -rf $RPM_BUILD_ROOT +./Build install destdir=$RPM_BUILD_ROOT create_packlist=0 +find $RPM_BUILD_ROOT -depth -type d -exec rmdir {} 2>/dev/null \; +%{_fixperms} $RPM_BUILD_ROOT/* + +%check +./Build test +EOF + } elsif (-e "$build_dir/Makefile.PL") { + push @m, <<'EOF'; + +%build +%{__perl} Makefile.PL INSTALLDIRS=vendor +make %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT +make pure_install DESTDIR=$RPM_BUILD_ROOT +find $RPM_BUILD_ROOT -type f -name .packlist -exec rm -f {} ';' +find $RPM_BUILD_ROOT -depth -type d -exec rmdir {} 2>/dev/null ';' +%{_fixperms} $RPM_BUILD_ROOT/* + +%check +make test +EOF + } else { + $CPAN::Frontend->mydie("'$distribution' has neither a Build.PL nor a Makefile.PL\n"); + } + push @m, "\n%clean\nrm -rf \$RPM_BUILD_ROOT\n"; + my $vendorlib = @xs ? "vendorarch" : "vendorlib"; + my $date = POSIX::strftime("%a %b %d %Y", gmtime); + my @doc = grep { -e "$build_dir/$_" } qw(README Changes); + my $exe_stanza = "\n"; + if (my $exe_files = $d->_exe_files) { + if (@$exe_files) { + $exe_stanza = "%{_mandir}/man1/*.1*\n"; + for my $e (@$exe_files) { + unless (CPAN->has_inst("File::Basename")) { + $CPAN::Frontend->mydie("File::Basename not installed, cannot continue"); + } + my $basename = File::Basename::basename($e); + $exe_stanza .= "/usr/bin/$basename\n"; + } + } + } + push @m, < - $version-1 +- autogenerated by _specfile() in CPAN.pm + +EOF + + my $ret = join "", @m; + $CPAN::Frontend->myprint($ret); + open my $specout, ">", "perl-$dist.spec" or die; + print $specout $ret; + $CPAN::Frontend->myprint("Wrote perl-$dist.spec"); + $ret; +} + #-> sub CPAN::Shell::report ; sub report { my($self,@args) = @_; @@ -1040,6 +1238,41 @@ sub u { #-> sub CPAN::Shell::failed ; sub failed { my($self,$only_id,$silent) = @_; + my @failed = $self->find_failed($only_id); + my $scope; + if ($only_id) { + $scope = "this command"; + } elsif ($CPAN::Index::HAVE_REANIMATED) { + $scope = "this or a previous session"; + # it might be nice to have a section for previous session and + # a second for this + } else { + $scope = "this session"; + } + if (@failed) { + my $print; + my $debug = 0; + if ($debug) { + $print = join "", + map { sprintf "%5d %-45s: %s %s\n", @$_ } + sort { $a->[0] <=> $b->[0] } @failed; + } else { + $print = join "", + map { sprintf " %-45s: %s %s\n", @$_[1..3] } + sort { + $a->[0] <=> $b->[0] + || + $a->[4] <=> $b->[4] + } @failed; + } + $CPAN::Frontend->myprint("Failed during $scope:\n$print"); + } elsif (!$only_id || !$silent) { + $CPAN::Frontend->myprint("Nothing failed in $scope\n"); + } +} + +sub find_failed { + my($self,$only_id) = @_; my @failed; DIST: for my $d ($CPAN::META->all_objects("CPAN::Distribution")) { my $failed = ""; @@ -1072,6 +1305,10 @@ sub failed { next DIST unless $failed; my $id = $d->id; $id =~ s|^./../||; + ### XXX need to flag optional modules as '(optional)' if they are + # from recommends/suggests -- i.e. *show* failure, but make it clear + # it was failure of optional module -- xdg, 2012-04-01 + $id = "(optional) $id" if ! $d->{mandatory}; #$print .= sprintf( # " %-45s: %s %s\n", push @failed, @@ -1083,6 +1320,7 @@ sub failed { $failed, $d->{$failed}->text, $d->{$failed}{TIME}||0, + !! $d->{mandatory}, ] : [ 1, @@ -1090,39 +1328,16 @@ sub failed { $failed, $d->{$failed}, 0, + !! $d->{mandatory}, ] ); } - my $scope; - if ($only_id) { - $scope = "this command"; - } elsif ($CPAN::Index::HAVE_REANIMATED) { - $scope = "this or a previous session"; - # it might be nice to have a section for previous session and - # a second for this - } else { - $scope = "this session"; - } - if (@failed) { - my $print; - my $debug = 0; - if ($debug) { - $print = join "", - map { sprintf "%5d %-45s: %s %s\n", @$_ } - sort { $a->[0] <=> $b->[0] } @failed; - } else { - $print = join "", - map { sprintf " %-45s: %s %s\n", @$_[1..3] } - sort { - $a->[0] <=> $b->[0] - || - $a->[4] <=> $b->[4] - } @failed; - } - $CPAN::Frontend->myprint("Failed during $scope:\n$print"); - } elsif (!$only_id || !$silent) { - $CPAN::Frontend->myprint("Nothing failed in $scope\n"); - } + return @failed; +} + +sub mandatory_dist_failed { + my ($self) = @_; + return grep { $_->[5] } $self->find_failed($CPAN::CurrentCommandID); } # XXX intentionally undocumented because completely bogus, unportable, @@ -1428,6 +1643,14 @@ sub format_result { my $print_ornamented_have_warned = 0; sub colorize_output { my $colorize_output = $CPAN::Config->{colorize_output}; + if ($colorize_output && $^O eq 'MSWin32' && !$CPAN::META->has_inst("Win32::Console::ANSI")) { + unless ($print_ornamented_have_warned++) { + # no myprint/mywarn within myprint/mywarn! + warn "Colorize_output is set to true but Win32::Console::ANSI is not +installed. To activate colorized output, please install Win32::Console::ANSI.\n\n"; + } + $colorize_output = 0; + } if ($colorize_output && !$CPAN::META->has_inst("Term::ANSIColor")) { unless ($print_ornamented_have_warned++) { # no myprint/mywarn within myprint/mywarn! @@ -1461,7 +1684,7 @@ sub print_ornamented { } if ($self->colorize_output) { if ( $CPAN::DEBUG && $swhat =~ /^Debug\(/ ) { - # if you want to have this configurable, please file a bugreport + # if you want to have this configurable, please file a bug report $ornament = $CPAN::Config->{colorize_debug} || "black on_cyan"; } my $color_on = eval { Term::ANSIColor::color($ornament) } || ""; @@ -1591,6 +1814,7 @@ sub unrecoverable_error { #-> sub CPAN::Shell::mysleep ; sub mysleep { + return if $ENV{AUTOMATED_TESTING} || ! -t STDOUT; my($self, $sleep) = @_; if (CPAN->has_inst("Time::HiRes")) { Time::HiRes::sleep($sleep); @@ -1700,7 +1924,7 @@ sub rematein { } } } - CPAN::Queue->queue_item(qmod => $obj->id, reqtype => "c"); + CPAN::Queue->queue_item(qmod => $obj->id, reqtype => "c", optional => ''); push @qcopy, $obj; } elsif ($CPAN::META->exists('CPAN::Author',uc($s))) { $obj = $CPAN::META->instance('CPAN::Author',uc($s)); @@ -1738,6 +1962,7 @@ to find objects with matching identifiers. my $obj; my $s = $q->as_string; my $reqtype = $q->reqtype || ""; + my $optional = $q->optional || ""; $obj = CPAN::Shell->expandany($s); unless ($obj) { # don't know how this can happen, maybe we should panic, @@ -1750,6 +1975,23 @@ to find objects with matching identifiers. next QITEM; } $obj->{reqtype} ||= ""; + my $type = ref $obj; + if ( $type eq 'CPAN::Distribution' || $type eq 'CPAN::Bundle' ) { + $obj->{mandatory} ||= ! $optional; # once mandatory, always mandatory + } + elsif ( $type eq 'CPAN::Module' ) { + $obj->{mandatory} ||= ! $optional; # once mandatory, always mandatory + if (my $d = $obj->distribution) { + $d->{mandatory} ||= ! $optional; # once mandatory, always mandatory + } elsif ($optional) { + # the queue object does not know who was recommending/suggesting us:( + # So we only vaguely write "optional". + $CPAN::Frontend->mywarn("Warning: optional module '$s' ". + "not known. Skipping.\n"); + CPAN::Queue->delete_first($s); + next QITEM; + } + } { # force debugging because CPAN::SQLite somehow delivers us # an empty object; @@ -1812,11 +2054,18 @@ to find objects with matching identifiers. } CPAN->debug("Going to panic. meth[$meth]s[$s]") if $CPAN::DEBUG; $CPAN::Frontend->mydie("Panic: obj[$serialized] cannot meth[$meth]"); - } elsif ($obj->$meth()) { - CPAN::Queue->delete($s); - CPAN->debug("From queue deleted. meth[$meth]s[$s]") if $CPAN::DEBUG; } else { - CPAN->debug("Failed. pragma[@pragma]meth[$meth]") if $CPAN::DEBUG; + my $upgraded_meth = $meth; + if ( $meth eq "make" and $obj->{reqtype} eq "b" ) { + # rt 86915 + $upgraded_meth = "test"; + } + if ($obj->$upgraded_meth()) { + CPAN::Queue->delete($s); + CPAN->debug("Succeeded and deleted from queue. pragma[@pragma]meth[$meth][s][$s]") if $CPAN::DEBUG; + } else { + CPAN->debug("Failed. pragma[@pragma]meth[$meth]s[$s]") if $CPAN::DEBUG; + } } $obj->undelay; @@ -1826,10 +2075,14 @@ to find objects with matching identifiers. $obj->$unpragma(); } } - if ($CPAN::Config->{halt_on_failure} - && - CPAN::Distrostatus::something_has_just_failed() - ) { + # if any failures occurred and the current object is mandatory, we + # still don't know if *it* failed or if it was another (optional) + # module, so we have to check that explicitly (and expensively) + if ( $CPAN::Config->{halt_on_failure} + && $obj->{mandatory} + && CPAN::Distrostatus::something_has_just_failed() + && $self->mandatory_dist_failed() + ) { $CPAN::Frontend->mywarn("Stopping: '$meth' failed for '$s'.\n"); CPAN::Queue->nullify_queue; last QITEM; diff --git a/Master/tlpkg/tlperl/lib/CPAN/Tarzip.pm b/Master/tlpkg/tlperl/lib/CPAN/Tarzip.pm index 708a5794f34..f585a01bf72 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Tarzip.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Tarzip.pm @@ -4,7 +4,7 @@ use strict; use vars qw($VERSION @ISA $BUGHUNTING); use CPAN::Debug; use File::Basename qw(basename); -$VERSION = "5.5011"; +$VERSION = "5.5012"; # module is internal to CPAN.pm @ISA = qw(CPAN::Debug); ## no critic @@ -73,6 +73,7 @@ sub gzip { my $cwd = `pwd`; my $gz = Compress::Zlib::gzopen($write, "wb") or $CPAN::Frontend->mydie("Cannot gzopen $write: $! (pwd is $cwd)\n"); + binmode($fhw); $gz->gzwrite($buffer) while read($fhw,$buffer,4096) > 0 ; $gz->gzclose() ; @@ -94,8 +95,9 @@ sub gunzip { or $CPAN::Frontend->mydie("Could not open >$write: $!"); my $gz = Compress::Zlib::gzopen($read, "rb") or $CPAN::Frontend->mydie("Cannot gzopen $read: $!\n"); + binmode($fhw); $fhw->print($buffer) - while $gz->gzread($buffer) > 0 ; + while $gz->gzread($buffer) > 0 ; $CPAN::Frontend->mydie("Error reading from $read: $!\n") if $gz->gzerror != Compress::Zlib::Z_STREAM_END(); $gz->gzclose() ; @@ -103,7 +105,7 @@ sub gunzip { return 1; } else { my $command = CPAN::HandleConfig->safe_quote($self->{UNGZIPPRG}); - system(qq{$command -dc "$read" > "$write"})==0; + system(qq{$command -d -c "$read" > "$write"})==0; } } @@ -188,7 +190,7 @@ sub TIEHANDLE { $class->debug("via Compress::Zlib"); } else { my $gzip = CPAN::HandleConfig->safe_quote($self->{UNGZIPPRG}); - my $pipe = "$gzip -dc $file |"; + my $pipe = "$gzip -d -c $file |"; my $fh = FileHandle->new($pipe) or $CPAN::Frontend->mydie("Could not pipe[$pipe]: $!"); binmode $fh; $self->{FH} = $fh; @@ -322,7 +324,7 @@ Can't continue cutting file '$file'. my $tarcommand = CPAN::HandleConfig->safe_quote($exttar); if ($is_compressed) { my $command = CPAN::HandleConfig->safe_quote($extgzip); - $system = qq{$command -dc }. + $system = qq{$command -d -c }. qq{< "$file" | $tarcommand x${tar_verb}f -}; } else { $system = qq{$tarcommand x${tar_verb}f "$file"}; diff --git a/Master/tlpkg/tlperl/lib/CPAN/Version.pm b/Master/tlpkg/tlperl/lib/CPAN/Version.pm index 43aaa1ce911..fa75221d9da 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Version.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Version.pm @@ -2,7 +2,7 @@ package CPAN::Version; use strict; use vars qw($VERSION); -$VERSION = "5.5001"; +$VERSION = "5.5003"; # CPAN::Version::vcmp courtesy Jost Krieger sub vcmp { @@ -10,6 +10,10 @@ sub vcmp { local($^W) = 0; CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + # treat undef as zero + $l = 0 if $l eq 'undef'; + $r = 0 if $r eq 'undef'; + return 0 if $l eq $r; # short circuit for quicker success for ($l,$r) { diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS.pm b/Master/tlpkg/tlperl/lib/CPANPLUS.pm deleted file mode 100644 index e0ff071b34c..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS.pm +++ /dev/null @@ -1,272 +0,0 @@ -package CPANPLUS; -use deprecate; - -use strict; -use Carp; - -use CPANPLUS::Error; -use CPANPLUS::Backend; - -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -BEGIN { - use Exporter (); - use vars qw( @EXPORT @ISA $VERSION ); - @EXPORT = qw( shell fetch get install ); - @ISA = qw( Exporter ); - $VERSION = "0.9135"; #have to hardcode or cpan.org gets unhappy -} - -### purely for backward compatibility, so we can call it from the commandline: -### perl -MCPANPLUS -e 'install Net::SMTP' -sub install { - my $cpan = CPANPLUS::Backend->new; - my $mod = shift or ( - error(loc("No module specified!")), return - ); - - if ( ref $mod ) { - error( loc( "You passed an object. Use %1 for OO style interaction", - 'CPANPLUS::Backend' )); - return; - - } else { - my $obj = $cpan->module_tree($mod) or ( - error(loc("No such module '%1'", $mod)), - return - ); - - my $ok = $obj->install; - - $ok - ? msg(loc("Installing of %1 successful", $mod),1) - : msg(loc("Installing of %1 failed", $mod),1); - - return $ok; - } -} - -### simply downloads a module and stores it -sub fetch { - my $cpan = CPANPLUS::Backend->new; - - my $mod = shift or ( - error(loc("No module specified!")), return - ); - - if ( ref $mod ) { - error( loc( "You passed an object. Use %1 for OO style interaction", - 'CPANPLUS::Backend' )); - return; - - } else { - my $obj = $cpan->module_tree($mod) or ( - error(loc("No such module '%1'", $mod)), - return - ); - - my $ok = $obj->fetch( fetchdir => '.' ); - - $ok - ? msg(loc("Fetching of %1 successful", $mod),1) - : msg(loc("Fetching of %1 failed", $mod),1); - - return $ok; - } -} - -### alias to fetch() due to compatibility with cpan.pm ### -sub get { fetch(@_) } - - -### purely for backwards compatibility, so we can call it from the commandline: -### perl -MCPANPLUS -e 'shell' -sub shell { - my $option = shift; - - ### since the user can specify the type of shell they wish to start - ### when they call the shell() function, we have to eval the usage - ### of CPANPLUS::Shell so we can set up all the checks properly - eval { require CPANPLUS::Shell; CPANPLUS::Shell->import($option) }; - die $@ if $@; - - my $cpan = CPANPLUS::Shell->new(); - - $cpan->shell(); -} - -1; - -__END__ - -=pod - -=head1 NAME - -CPANPLUS - API & CLI access to the CPAN mirrors - -=head1 SYNOPSIS - - ### standard invocation from the command line - $ cpanp - $ cpanp -i Some::Module - - $ perl -MCPANPLUS -eshell - $ perl -MCPANPLUS -e'fetch Some::Module' - - -=head1 DESCRIPTION - -The C library is an API to the C mirrors and a -collection of interactive shells, commandline programs, etc, -that use this API. - -=head1 GUIDE TO DOCUMENTATION - -=head2 GENERAL USAGE - -This is the document you are currently reading. It describes -basic usage and background information. Its main purpose is to -assist the user who wants to learn how to invoke CPANPLUS -and install modules from the commandline and to point you -to more indepth reading if required. - -=head2 API REFERENCE - -The C API is meant to let you programmatically -interact with the C mirrors. The documentation in -L shows you how to create an object -capable of interacting with those mirrors, letting you -create & retrieve module objects. -L shows you how you can use these module -objects to perform actions like installing and testing. - -The default shell, documented in L -is also scriptable. You can use its API to dispatch calls -from your script to the CPANPLUS Shell. - -=cut - -=head1 COMMANDLINE TOOLS - -=head2 STARTING AN INTERACTIVE SHELL - -You can start an interactive shell by running either of -the two following commands: - - $ cpanp - - $ perl -MCPANPLUS -eshell - -All commands available are listed in the interactive shells -help menu. See C or L -for instructions on using the default shell. - -=head2 CHOOSE A SHELL - -By running C without arguments, you will start up -the shell specified in your config, which defaults to -L. There are more shells available. -C itself ships with an emulation shell called -L that looks and feels just like -the old C shell. - -You can start this shell by typing: - - $ perl -MCPANPLUS -e'shell Classic' - -Even more shells may be available from C. - -Note that if you have changed your default shell in your -configuration, that shell will be used instead. If for -some reason there was an error with your specified shell, -you will be given the default shell. - -=head2 BUILDING PACKAGES - -C is a commandline tool to convert any distribution -from C into a package in the format of your choice, like -for example C<.deb> or C. - -See C for details. - - -=head1 FUNCTIONS - -For quick access to common commands, you may use this module, -C rather than the full programmatic API situated in -C. This module offers the following functions: - -=head2 $bool = install( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz ) - -This function requires the full name of the module, which is case -sensitive. The module name can also be provided as a fully -qualified file name, beginning with a I, relative to -the /authors/id directory on a CPAN mirror. - -It will download, extract and install the module. - -=head2 $where = fetch( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz ) - -Like install, fetch needs the full name of a module or the fully -qualified file name, and is case sensitive. - -It will download the specified module to the current directory. - -=head2 $where = get( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz ) - -Get is provided as an alias for fetch for compatibility with -CPAN.pm. - -=head2 shell() - -Shell starts the default CPAN shell. You can also start the shell -by using the C command, which will be installed in your -perl bin. - -=head1 FAQ - -For frequently asked questions and answers, please consult the -C manual. - -=head1 BUG REPORTS - -Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. - -=head1 AUTHOR - -This module by Jos Boumans Ekane@cpan.orgE. - -=head1 COPYRIGHT - -The CPAN++ interface (of which this module is a part of) is copyright (c) -2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. - -This library is free software; you may redistribute and/or modify it -under the same terms as Perl itself. - -=head1 SEE ALSO - -L, L, L, L, L, L - -=head1 CONTACT INFORMATION - -=over 4 - -=item * Bug reporting: -I - -=item * Questions & suggestions: -I - -=back - - -=cut - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Backend.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Backend.pm deleted file mode 100644 index 85559dc04ff..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Backend.pm +++ /dev/null @@ -1,1344 +0,0 @@ -package CPANPLUS::Backend; -use deprecate; - -use strict; - - -use CPANPLUS::Error; -use CPANPLUS::Configure; -use CPANPLUS::Internals; -use CPANPLUS::Internals::Constants; -use CPANPLUS::Module; -use CPANPLUS::Module::Author; -use CPANPLUS::Backend::RV; - -use FileHandle; -use File::Spec (); -use File::Spec::Unix (); -use File::Basename (); -use Params::Check qw[check]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -$Params::Check::VERBOSE = 1; - -use vars qw[@ISA $VERSION]; - -@ISA = qw[CPANPLUS::Internals]; -$VERSION = "0.9135"; - -### mark that we're running under CPANPLUS to spawned processes -$ENV{'PERL5_CPANPLUS_IS_RUNNING'} = $$; - -### XXX version.pm MAY format this version, if it's in use... :( -### so for consistency, just call ->VERSION ourselves as well. -$ENV{'PERL5_CPANPLUS_IS_VERSION'} = __PACKAGE__->VERSION; - -=pod - -=head1 NAME - -CPANPLUS::Backend - programmer's interface to CPANPLUS - -=head1 SYNOPSIS - - my $cb = CPANPLUS::Backend->new; - my $conf = $cb->configure_object; - - my $author = $cb->author_tree('KANE'); - my $mod = $cb->module_tree('Some::Module'); - my $mod = $cb->parse_module( module => 'Some::Module' ); - - my @objs = $cb->search( type => TYPE, - allow => [...] ); - - $cb->flush('all'); - $cb->reload_indices; - $cb->local_mirror; - - -=head1 DESCRIPTION - -This module provides the programmer's interface to the C -libraries. - -=head1 ENVIRONMENT - -When C is loaded, which is necessary for just -about every operation, the environment variable -C is set to the current process id. - -Additionally, the environment variable C -will be set to the version of C. - -This information might be useful somehow to spawned processes. - -=head1 METHODS - -=head2 $cb = CPANPLUS::Backend->new( [CONFIGURE_OBJ] ) - -This method returns a new C object. -This also initialises the config corresponding to this object. -You have two choices in this: - -=over 4 - -=item Provide a valid C object - -This will be used verbatim. - -=item No arguments - -Your default config will be loaded and used. - -=back - -New will return a C object on success and die on -failure. - -=cut - -sub new { - my $class = shift; - my $conf; - - if( $_[0] && IS_CONFOBJ->( conf => $_[0] ) ) { - $conf = shift; - } else { - $conf = CPANPLUS::Configure->new() or return; - } - - my $self = $class->SUPER::_init( _conf => $conf ); - - return $self; -} - -=pod - -=head2 $href = $cb->module_tree( [@modules_names_list] ) - -Returns a reference to the CPANPLUS module tree. - -If you give it any arguments, they will be treated as module names -and C will try to look up these module names and -return the corresponding module objects instead. - -See L for the operations you can perform on a -module object. - -=cut - -sub module_tree { - my $self = shift; - my $modtree = $self->_module_tree; - - if( @_ ) { - my @rv; - for my $name ( grep { defined } @_) { - - ### From John Malmberg: This is failing on VMS - ### because ODS-2 does not retain the case of - ### filenames that are created. - ### The problem is the filename is being converted - ### to a module name and then looked up in the - ### %$modtree hash. - ### - ### As a fix, we do a search on VMS instead -- - ### more cpu cycles, but it gets around the case - ### problem --kane - my ($modobj) = do { - ON_VMS - ? $self->search( - type => 'module', - allow => [qr/^$name$/i], - ) - : $modtree->{$name} - }; - - push @rv, $modobj || ''; - } - return @rv == 1 ? $rv[0] : @rv; - } else { - return $modtree; - } -} - -=pod - -=head2 $href = $cb->author_tree( [@author_names_list] ) - -Returns a reference to the CPANPLUS author tree. - -If you give it any arguments, they will be treated as author names -and C will try to look up these author names and -return the corresponding author objects instead. - -See L for the operations you can perform on -an author object. - -=cut - -sub author_tree { - my $self = shift; - my $authtree = $self->_author_tree; - - if( @_ ) { - my @rv; - for my $name (@_) { - push @rv, $authtree->{$name} || ''; - } - return @rv == 1 ? $rv[0] : @rv; - } else { - return $authtree; - } -} - -=pod - -=head2 $conf = $cb->configure_object; - -Returns a copy of the C object. - -See L for operations you can perform on a -configure object. - -=cut - -sub configure_object { return shift->_conf() }; - -=head2 $su = $cb->selfupdate_object; - -Returns a copy of the C object. - -See the L manpage for the operations -you can perform on the selfupdate object. - -=cut - -sub selfupdate_object { return shift->_selfupdate() }; - -=pod - -=head2 @mods = $cb->search( type => TYPE, allow => AREF, [data => AREF, verbose => BOOL] ) - -C enables you to search for either module or author objects, -based on their data. The C you can specify is any of the -accessors specified in C or -C. C will determine by the C you -specified whether to search by author object or module object. - -You have to specify an array reference of regular expressions or -strings to match against. The rules used for this array ref are the -same as in C, so read that manpage for details. - -The search is an C search, meaning that if C of the criteria -match, the search is considered to be successful. - -You can specify the result of a previous search as C to limit -the new search to these module or author objects, rather than the -entire module or author tree. This is how you do C searches. - -Returns a list of module or author objects on success and false -on failure. - -See L for the operations you can perform on a -module object. -See L for the operations you can perform on -an author object. - -=cut - -sub search { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my ($type); - my $args = do { - local $Params::Check::NO_DUPLICATES = 0; - local $Params::Check::ALLOW_UNKNOWN = 1; - - my $tmpl = { - type => { required => 1, allow => [CPANPLUS::Module->accessors(), - CPANPLUS::Module::Author->accessors()], store => \$type }, - allow => { required => 1, default => [ ], strict_type => 1 }, - }; - - check( $tmpl, \%hash ) - } or return; - - ### figure out whether it was an author or a module search - ### when ambiguous, it'll be an author search. - my $aref; - if( grep { $type eq $_ } CPANPLUS::Module::Author->accessors() ) { - $aref = $self->_search_author_tree( %$args ); - } else { - $aref = $self->_search_module_tree( %$args ); - } - - return @$aref if $aref; - return; -} - -=pod - -=head2 $backend_rv = $cb->fetch( modules => \@mods ) - -Fetches a list of modules. C<@mods> can be a list of distribution -names, module names or module objects--basically anything that -L can understand. - -See the equivalent method in C for details on -other options you can pass. - -Since this is a multi-module method call, the return value is -implemented as a C object. Please consult -that module's documentation on how to interpret the return value. - -=head2 $backend_rv = $cb->extract( modules => \@mods ) - -Extracts a list of modules. C<@mods> can be a list of distribution -names, module names or module objects--basically anything that -L can understand. - -See the equivalent method in C for details on -other options you can pass. - -Since this is a multi-module method call, the return value is -implemented as a C object. Please consult -that module's documentation on how to interpret the return value. - -=head2 $backend_rv = $cb->install( modules => \@mods ) - -Installs a list of modules. C<@mods> can be a list of distribution -names, module names or module objects--basically anything that -L can understand. - -See the equivalent method in C for details on -other options you can pass. - -Since this is a multi-module method call, the return value is -implemented as a C object. Please consult -that module's documentation on how to interpret the return value. - -=head2 $backend_rv = $cb->readme( modules => \@mods ) - -Fetches the readme for a list of modules. C<@mods> can be a list of -distribution names, module names or module objects--basically -anything that L can understand. - -See the equivalent method in C for details on -other options you can pass. - -Since this is a multi-module method call, the return value is -implemented as a C object. Please consult -that module's documentation on how to interpret the return value. - -=head2 $backend_rv = $cb->files( modules => \@mods ) - -Returns a list of files used by these modules if they are installed. -C<@mods> can be a list of distribution names, module names or module -objects--basically anything that L can understand. - -See the equivalent method in C for details on -other options you can pass. - -Since this is a multi-module method call, the return value is -implemented as a C object. Please consult -that module's documentation on how to interpret the return value. - -=head2 $backend_rv = $cb->distributions( modules => \@mods ) - -Returns a list of module objects representing all releases for this -module on success. -C<@mods> can be a list of distribution names, module names or module -objects, basically anything that L can understand. - -See the equivalent method in C for details on -other options you can pass. - -Since this is a multi-module method call, the return value is -implemented as a C object. Please consult -that module's documentation on how to interpret the return value. - -=cut - -### XXX add direcotry_tree, packlist etc? or maybe remove files? ### -for my $func (qw[fetch extract install readme files distributions]) { - no strict 'refs'; - - *$func = sub { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my ($mods); - my $args = do { - local $Params::Check::NO_DUPLICATES = 1; - local $Params::Check::ALLOW_UNKNOWN = 1; - - my $tmpl = { - modules => { default => [], strict_type => 1, - required => 1, store => \$mods }, - }; - - check( $tmpl, \%hash ); - } or return; - - ### make them all into module objects ### - my %mods = map { $_ => $self->parse_module(module => $_) || '' } @$mods; - - my $flag; my $href; - while( my($name,$obj) = each %mods ) { - $href->{$name} = IS_MODOBJ->( mod => $obj ) - ? $obj->$func( %$args ) - : undef; - - $flag++ unless $href->{$name}; - } - - return CPANPLUS::Backend::RV->new( - function => $func, - ok => ( !$flag ? 1 : 0 ), - rv => $href, - args => \%hash, - ); - } -} - -=pod - -=head2 $mod_obj = $cb->parse_module( module => $modname|$distname|$modobj|URI|PATH ) - -C tries to find a C object that -matches your query. Here's a list of examples you could give to -C; - -=over 4 - -=item Text::Bastardize - -=item Text-Bastardize - -=item Text/Bastardize.pm - -=item Text-Bastardize-1.06 - -=item AYRNIEU/Text-Bastardize - -=item AYRNIEU/Text-Bastardize-1.06 - -=item AYRNIEU/Text-Bastardize-1.06.tar.gz - -=item http://example.com/Text-Bastardize-1.06.tar.gz - -=item file:///tmp/Text-Bastardize-1.06.tar.gz - -=item /tmp/Text-Bastardize-1.06 - -=item ./Text-Bastardize-1.06 - -=item . - -=back - -These items would all come up with a C object for -C. The ones marked explicitly as being version 1.06 -would give back a C object of that version. -Even if the version on CPAN is currently higher. - -The last three are examples of PATH resolution. In the first, we supply -an absolute path to the unwrapped distribution. In the second the -distribution is relative to the current working directory. -In the third, we will use the current working directory. - -If C is unable to actually find the module you are looking -for in its module tree, but you supplied it with an author, module -and version part in a distribution name or URI, it will create a fake -C object for you, that you can use just like the -real thing. - -See L for the operations you can perform on a -module object. - -If even this fancy guessing doesn't enable C to create -a fake module object for you to use, it will warn about an error and -return false. - -=cut - -sub parse_module { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my $mod; - my $tmpl = { - module => { required => 1, store => \$mod }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - return $mod if IS_MODOBJ->( module => $mod ); - - ### ok, so it's not a module object, but a ref nonetheless? - ### what are you smoking? - if( ref $mod ) { - error(loc("Can not parse module string from reference '%1'", $mod )); - return; - } - - ### check only for allowed characters in a module name - unless( $mod =~ /[^\w:]/ ) { - - ### perhaps we can find it in the module tree? - my $maybe = $self->module_tree($mod); - return $maybe if IS_MODOBJ->( module => $maybe ); - } - - ### Special case arbitrary file paths such as '.' etc. - if ( $mod and -d File::Spec->rel2abs($mod) ) { - my $dir = File::Spec->rel2abs($mod); - my $parent = File::Spec->rel2abs( File::Spec->catdir( $dir, '..' ) ); - - ### fix paths on VMS - if (ON_VMS) { - $dir = VMS::Filespec::unixify($dir); - $parent = VMS::Filespec::unixify($parent); - } - - my $dist = $mod = File::Basename::basename($dir); - $dist .= '-0' unless $dist =~ /\-[0-9._]+$/; - $dist .= '.tar.gz' unless $dist =~ /\.[A-Za-z]+$/; - - my $modobj = CPANPLUS::Module::Fake->new( - module => $mod, - version => 0, - package => $dist, - path => $parent, - author => CPANPLUS::Module::Author::Fake->new - ); - - ### better guess for the version - $modobj->version( $modobj->package_version ) - if defined $modobj->package_version; - - ### better guess at module name, if possible - if ( my $pkgname = $modobj->package_name ) { - $pkgname =~ s/-/::/g; - - ### no sense replacing it unless we changed something - $modobj->module( $pkgname ) - if ($pkgname ne $modobj->package_name) || $pkgname !~ /-/; - } - - $modobj->status->fetch( $parent ); - $modobj->status->extract( $dir ); - $modobj->get_installer_type; - return $modobj; - } - - ### ok, so it looks like a distribution then? - my @parts = split '/', $mod; - my $dist = pop @parts; - - ### ah, it's a URL - if( $mod =~ m|\w+://.+| ) { - my $modobj = CPANPLUS::Module::Fake->new( - module => $dist, - version => 0, - package => $dist, - path => File::Spec::Unix->catdir( - $conf->_get_mirror('base'), - UNKNOWN_DL_LOCATION ), - author => CPANPLUS::Module::Author::Fake->new - ); - - ### set the fetch_from accessor so we know to by pass the - ### usual mirrors - $modobj->status->_fetch_from( $mod ); - - ### better guess for the version - $modobj->version( $modobj->package_version ) - if defined $modobj->package_version; - - ### better guess at module name, if possible - if ( my $pkgname = $modobj->package_name ) { - $pkgname =~ s/-/::/g; - - ### no sense replacing it unless we changed something - $modobj->module( $pkgname ) - if ($pkgname ne $modobj->package_name) || $pkgname !~ /-/; - } - - return $modobj; - } - - # Stolen from cpanminus to support 'Module/Install.pm' - # type input - if ( ( my $tmpmod = $mod ) =~ s/\.pm$//i ) { - my ($volume, $dirs, $file) = File::Spec->splitpath( $tmpmod ); - $tmpmod = join '::', grep { $_ } File::Spec->splitdir( $dirs ), $file; - ### perhaps we can find it in the module tree? - my $maybe = $self->module_tree( $tmpmod ); - return $maybe if IS_MODOBJ->( module => $maybe ); - } - - ### perhaps we can find it's a third party module? - { my $modobj = CPANPLUS::Module::Fake->new( - module => $mod, - version => 0, - package => $dist, - path => File::Spec::Unix->catdir( - $conf->_get_mirror('base'), - UNKNOWN_DL_LOCATION ), - author => CPANPLUS::Module::Author::Fake->new - ); - if( $modobj->is_third_party ) { - my $info = $modobj->third_party_information; - - $modobj->author->author( $info->{author} ); - $modobj->author->email( $info->{author_url} ); - $modobj->description( $info->{url} ); - - return $modobj; - } - } - - unless( $dist ) { - error( loc("%1 is not a proper distribution name!", $mod) ); - return; - } - - ### there's wonky uris out there, like this: - ### E/EY/EYCK/Net/Lite/Net-Lite-FTP-0.091 - ### compensate for that - my $author; - ### you probably have an A/AB/ABC/....../Dist.tgz type uri - if( (defined $parts[0] and length $parts[0] == 1) and - (defined $parts[1] and length $parts[1] == 2) and - $parts[2] =~ /^$parts[0]/i and $parts[2] =~ /^$parts[1]/i - ) { - splice @parts, 0, 2; # remove the first 2 entries from the list - $author = shift @parts; # this is the actual author name then - - ### we''ll assume a ABC/..../Dist.tgz - } else { - $author = shift @parts || ''; - } - - my($pkg, $version, $ext, $full) = - $self->_split_package_string( package => $dist ); - - ### translate a distribution into a module name ### - my $guess = $pkg; - $guess =~ s/-/::/g if $guess; - - my $maybe = $self->module_tree( $guess ); - if( IS_MODOBJ->( module => $maybe ) ) { - - ### maybe you asked for a package instead - if ( $maybe->package eq $mod ) { - return $maybe; - - ### perhaps an outdated version instead? - } elsif ( $version ) { - my $auth_obj; my $path; - - ### did you give us an author part? ### - if( $author ) { - $auth_obj = CPANPLUS::Module::Author::Fake->new( - _id => $maybe->_id, - cpanid => uc $author, - author => uc $author, - ); - $path = File::Spec::Unix->catdir( - $conf->_get_mirror('base'), - substr(uc $author, 0, 1), - substr(uc $author, 0, 2), - uc $author, - @parts, #possible sub dirs - ); - } else { - $auth_obj = $maybe->author; - $path = $maybe->path; - } - - if( $maybe->package_name eq $pkg ) { - - my $modobj = CPANPLUS::Module::Fake->new( - module => $maybe->module, - version => $version, - ### no extension? use the extension the original package - ### had instead - package => do { $ext - ? $full - : $full .'.'. $maybe->package_extension - }, - path => $path, - author => $auth_obj, - _id => $maybe->_id - ); - return $modobj; - - ### you asked for a specific version? - ### assume our $maybe is the one you wanted, - ### and fix up the version.. - } else { - - my $modobj = $maybe->clone; - $modobj->version( $version ); - $modobj->package( - $maybe->package_name .'-'. - $version .'.'. - $maybe->package_extension - ); - - ### you wanted a specific author, but it's not the one - ### from the module tree? we'll fix it up - if( $author and $author ne $modobj->author->cpanid ) { - $modobj->author( $auth_obj ); - $modobj->path( $path ); - } - - return $modobj; - } - - ### you didn't care about a version, so just return the object then - } elsif ( !$version ) { - return $maybe; - } - - ### ok, so we can't find it, and it's not an outdated dist either - ### perhaps we can fake one based on the author name and so on - } elsif ( $author and $version ) { - - ### be extra friendly and pad the .tar.gz suffix where needed - ### it's just a guess of course, but most dists are .tar.gz - $dist .= '.tar.gz' unless $dist =~ /\.[A-Za-z]+$/; - - ### XXX duplication from above for generating author obj + path... - my $modobj = CPANPLUS::Module::Fake->new( - module => $guess, - version => $version, - package => $dist, - author => CPANPLUS::Module::Author::Fake->new( - author => uc $author, - cpanid => uc $author, - _id => $self->_id, - ), - path => File::Spec::Unix->catdir( - $conf->_get_mirror('base'), - substr(uc $author, 0, 1), - substr(uc $author, 0, 2), - uc $author, - @parts, #possible subdirs - ), - _id => $self->_id, - ); - - return $modobj; - - ### face it, we have /no/ idea what he or she wants... - ### let's start putting the blame somewhere - } else { - - # Lets not give up too easily. There is one last chance - # http://perlmonks.org/?node_id=805957 - # This should catch edge-cases where the package name - # is unrelated to the modules it contains. - - my ($modobj) = grep { $_->package_name eq $mod } - $self->search( type => 'package', allow => [ qr/^\Q$mod\E/ ], ); - return $modobj if IS_MODOBJ->( module => $modobj ); - - unless( $author ) { - error( loc( "'%1' does not contain an author part", $mod ) ); - } - - error( loc( "Cannot find '%1' in the module tree", $mod ) ); - } - - return; -} - -=pod - -=head2 $bool = $cb->reload_indices( [update_source => BOOL, verbose => BOOL] ); - -This method reloads the source files. - -If C is set to true, this will fetch new source files -from your CPAN mirror. Otherwise, C will do its -usual cache checking and only update them if they are out of date. - -By default, C will be false. - -The verbose setting defaults to what you have specified in your -config file. - -Returns true on success and false on failure. - -=cut - -sub reload_indices { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - my $tmpl = { - update_source => { default => 0, allow => [qr/^\d$/] }, - verbose => { default => $conf->get_conf('verbose') }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### make a call to the internal _module_tree, so it triggers cache - ### file age - my $uptodate = $self->_check_trees( %$args ); - - - return 1 if $self->_build_trees( - uptodate => $uptodate, - use_stored => 0, - verbose => $conf->get_conf('verbose'), - ); - - error( loc( "Error rebuilding source trees!" ) ); - - return; -} - -=pod - -=head2 $bool = $cb->flush(CACHE_NAME) - -This method allows flushing of caches. -There are several things which can be flushed: - -=over 4 - -=item * C - -The return status of methods which have been attempted, such as -different ways of fetching files. It is recommended that automatic -flushing be used instead. - -=item * C - -The return status of URIs which have been attempted, such as -different hosts of fetching files. It is recommended that automatic -flushing be used instead. - -=item * C - -Information about modules such as prerequisites and whether -installation succeeded, failed, or was not attempted. - -=item * C - -This resets PERL5LIB, which is changed to ensure that while installing -modules they are in our @INC. - -=item * C - -This resets the cache of modules we've attempted to load, but failed. -This enables you to load them again after a failed load, if they -somehow have become available. - -=item * C - -Flush all of the aforementioned caches. - -=back - -Returns true on success and false on failure. - -=cut - -sub flush { - my $self = shift; - my $type = shift or return; - - my $cache = { - methods => [ qw( methods load ) ], - hosts => [ qw( hosts ) ], - modules => [ qw( modules lib) ], - lib => [ qw( lib ) ], - load => [ qw( load ) ], - all => [ qw( hosts lib modules methods load ) ], - }; - - my $aref = $cache->{$type} - or ( - error( loc("No such cache '%1'", $type) ), - return - ); - - return $self->_flush( list => $aref ); -} - -=pod - -=head2 @mods = $cb->installed() - -Returns a list of module objects of all your installed modules. -If an error occurs, it will return false. - -See L for the operations you can perform on a -module object. - -=cut - -sub installed { - my $self = shift; - my $aref = $self->_all_installed; - - return @$aref if $aref; - return; -} - -=pod - -=head2 $bool = $cb->local_mirror([path => '/dir/to/save/to', index_files => BOOL, force => BOOL, verbose => BOOL] ) - -Creates a local mirror of CPAN, of only the most recent sources in a -location you specify. If you set this location equal to a custom host -in your C you can use your local mirror to install -from. - -It takes the following arguments: - -=over 4 - -=item path - -The location where to create the local mirror. - -=item index_files - -Enable/disable fetching of index files. You can disable fetching of the -index files if you don't plan to use the local mirror as your primary -site, or if you'd like up-to-date index files be fetched from elsewhere. - -Defaults to true. - -=item force - -Forces refetching of packages, even if they are there already. - -Defaults to whatever setting you have in your C. - -=item verbose - -Prints more messages about what its doing. - -Defaults to whatever setting you have in your C. - -=back - -Returns true on success and false on error. - -=cut - -sub local_mirror { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($path, $index, $force, $verbose); - my $tmpl = { - path => { default => $conf->get_conf('base'), - store => \$path }, - index_files => { default => 1, store => \$index }, - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - }; - - check( $tmpl, \%hash ) or return; - - unless( -d $path ) { - $self->_mkdir( dir => $path ) - or( error( loc( "Could not create '%1', giving up", $path ) ), - return - ); - } elsif ( ! -w _ ) { - error( loc( "Could not write to '%1', giving up", $path ) ); - return; - } - - my $flag; - AUTHOR: { - for my $auth ( sort { $a->cpanid cmp $b->cpanid } - values %{$self->author_tree} - ) { - - MODULE: { - my $i; - for my $mod ( $auth->modules ) { - my $fetchdir = File::Spec->catdir( $path, $mod->path ); - - my %opts = ( - verbose => $verbose, - force => $force, - fetchdir => $fetchdir, - ); - - ### only do this the for the first module ### - unless( $i++ ) { - $mod->_get_checksums_file( - %opts - ) or ( - error( loc( "Could not fetch %1 file, " . - "skipping author '%2'", - CHECKSUMS, $auth->cpanid ) ), - $flag++, next AUTHOR - ); - } - - $mod->fetch( %opts ) - or( error( loc( "Could not fetch '%1'", $mod->module ) ), - $flag++, next MODULE - ); - } } - } } - - if( $index ) { - for my $name (qw[auth dslip mod]) { - $self->_update_source( - name => $name, - verbose => $verbose, - path => $path, - ) or ( $flag++, next ); - } - } - - return !$flag; -} - -=pod - -=head2 $file = $cb->autobundle([path => OUTPUT_PATH, force => BOOL, verbose => BOOL]) - -Writes out a snapshot of your current installation in C bundle -style. This can then be used to install the same modules for a -different or on a different machine by issuing the following commands: - - ### using the default shell: - CPAN Terminal> i file://path/to/Snapshot_XXYY.pm - - ### using the API - $modobj = $cb->parse_module( module => 'file://path/to/Snapshot_XXYY.pm' ); - $modobj->install; - -It will, by default, write to an 'autobundle' directory under your -cpanplus homedirectory, but you can override that by supplying a -C argument. - -It will return the location of the output file on success and false on -failure. - -=cut - -sub autobundle { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($path,$force,$verbose); - my $tmpl = { - force => { default => $conf->get_conf('force'), store => \$force }, - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - path => { default => File::Spec->catdir( - $conf->get_conf('base'), - $self->_perl_version( perl => $^X ), - $conf->_get_build('distdir'), - $conf->_get_build('autobundle') ), - store => \$path }, - }; - - check($tmpl, \%hash) or return; - - unless( -d $path ) { - $self->_mkdir( dir => $path ) - or( error(loc("Could not create directory '%1'", $path ) ), - return - ); - } - - my $name; my $file; - { ### default filename for the bundle ### - my($year,$month,$day) = (localtime)[5,4,3]; - $year += 1900; $month++; - - my $ext = 0; - - my $prefix = $conf->_get_build('autobundle_prefix'); - my $format = "${prefix}_%04d_%02d_%02d_%02d"; - - BLOCK: { - $name = sprintf( $format, $year, $month, $day, $ext); - - $file = File::Spec->catfile( $path, $name . '.pm' ); - - -f $file ? ++$ext && redo BLOCK : last BLOCK; - } - } - my $fh; - unless( $fh = FileHandle->new( ">$file" ) ) { - error( loc( "Could not open '%1' for writing: %2", $file, $! ) ); - return; - } - - ### make sure we load the module tree *before* doing this, as it - ### starts to chdir all over the place - $self->module_tree; - - my $string = join "\n\n", - map { - join ' ', - $_->module, - ($_->installed_version(verbose => 0) || 'undef') - } sort { - $a->module cmp $b->module - } $self->installed; - - my $now = scalar localtime; - my $head = '=head1'; - my $pkg = __PACKAGE__; - my $version = $self->VERSION; - my $perl_v = join '', `$^X -V`; - - print $fh <save_state - -Explicit command to save memory state to disk. This can be used to save -information to disk about where a module was extracted, the result of -C, etc. This will then be re-loaded into memory when a new -session starts. - -The capability of saving state to disk depends on the source engine -being used (See C for the option to choose your -source engine). The default storage engine supports this option. - -Most users will not need this command, but it can handy for automated -systems like setting up CPAN smoke testers. - -The method will return true if it managed to save the state to disk, -or false if it did not. - -=cut - -sub save_state { - my $self = shift; - return $self->_save_state( @_ ); -} - - -### XXX these wrappers are not individually tested! only the underlying -### code through source.t and indirectly through he CustomSource plugin. - -=pod - -=head1 CUSTOM MODULE SOURCES - -Besides the sources as provided by the general C mirrors, it's -possible to add your own sources list to your C index. - -The methodology behind this works much like C. - -The methods below show you how to make use of this functionality. Also -note that most of these methods are available through the default shell -plugin command C, making them available as shortcuts through the -shell and via the commandline. - -=head2 %files = $cb->list_custom_sources - -Returns a mapping of registered custom sources and their local indices -as follows: - - /full/path/to/local/index => http://remote/source - -Note that any file starting with an C<#> is being ignored. - -=cut - -sub list_custom_sources { - return shift->__list_custom_module_sources( @_ ); -} - -=head2 $local_index = $cb->add_custom_source( uri => URI, [verbose => BOOL] ); - -Adds an C to your own sources list and mirrors its index. See the -documentation on C<< $cb->update_custom_source >> on how this is done. - -Returns the full path to the local index on success, or false on failure. - -Note that when adding a new C, the change to the in-memory tree is -not saved until you rebuild or save the tree to disk again. You can do -this using the C<< $cb->reload_indices >> method. - -=cut - -sub add_custom_source { - return shift->_add_custom_module_source( @_ ); -} - -=head2 $local_index = $cb->remove_custom_source( uri => URI, [verbose => BOOL] ); - -Removes an C from your own sources list and removes its index. - -To find out what Cs you have as part of your own sources list, use -the C<< $cb->list_custom_sources >> method. - -Returns the full path to the deleted local index file on success, or false -on failure. - -=cut - -### XXX do clever dispatching based on arg number? -sub remove_custom_source { - return shift->_remove_custom_module_source( @_ ); -} - -=head2 $bool = $cb->update_custom_source( [remote => URI] ); - -Updates the indexes for all your custom sources. It does this by fetching -a file called C in the root of the custom sources's C. -If you provide the C argument, it will only update the index for -that specific C. - -Here's an example of how custom sources would resolve into index files: - - file:///path/to/sources => file:///path/to/sources/packages.txt - http://example.com/sources => http://example.com/sources/packages.txt - ftp://example.com/sources => ftp://example.com/sources/packages.txt - -The file C simply holds a list of packages that can be found -under the root of the C. This file can be automatically generated for -you when the remote source is a C. For C, C, -and similar, the administrator of that repository should run the method -C<< $cb->write_custom_source_index >> on the repository to allow remote -users to index it. - -For details, see the C<< $cb->write_custom_source_index >> method below. - -All packages that are added via this mechanism will be attributed to the -author with C C. You can use this id to search for all -added packages. - -=cut - -sub update_custom_source { - my $self = shift; - - ### if it mentions /remote/, the request is to update a single uri, - ### not all the ones we have, so dispatch appropriately - my $rv = grep( /remote/i, @_) - ? $self->__update_custom_module_source( @_ ) - : $self->__update_custom_module_sources( @_ ); - - return $rv; -} - -=head2 $file = $cb->write_custom_source_index( path => /path/to/package/root, [to => /path/to/index/file, verbose => BOOL] ); - -Writes the index for a custom repository root. Most users will not have to -worry about this, but administrators of a repository will need to make sure -their indexes are up to date. - -The index will be written to a file called C in your repository -root, which you can specify with the C argument. You can override this -location by specifying the C argument, but in normal operation, that should -not be required. - -Once the index file is written, users can then add the C pointing to -the repository to their custom list of sources and start using it right away. See the C<< $cb->add_custom_source >> method for user details. - -=cut - -sub write_custom_source_index { - return shift->__write_custom_module_index( @_ ); -} - -1; - -=pod - -=head1 BUG REPORTS - -Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. - -=head1 AUTHOR - -This module by Jos Boumans Ekane@cpan.orgE. - -=head1 COPYRIGHT - -The CPAN++ interface (of which this module is a part of) is copyright (c) -2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. - -This library is free software; you may redistribute and/or modify it -under the same terms as Perl itself. - -=head1 SEE ALSO - -L, L, L, -L - -=cut - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: - -__END__ - -todo: -sub dist { # not sure about this one -- probably already done - enough in Module.pm -sub reports { # in Module.pm, wrapper here - - diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Backend/RV.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Backend/RV.pm deleted file mode 100644 index e7310ee418c..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Backend/RV.pm +++ /dev/null @@ -1,145 +0,0 @@ -package CPANPLUS::Backend::RV; -use deprecate; - -use strict; -use vars qw[$STRUCT $VERSION]; -$VERSION = "0.9135"; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; - -use IPC::Cmd qw[can_run run]; -use Params::Check qw[check]; - -use base 'Object::Accessor'; - -local $Params::Check::VERBOSE = 1; - - -=pod - -=head1 NAME - -CPANPLUS::Backend::RV - return value objects - -=head1 SYNOPSIS - - ### create a CPANPLUS::Backend::RV object - $backend_rv = CPANPLUS::Backend::RV->new( - ok => $boolean, - args => $args, - rv => $return_value - function => $calling_function ); - - ### if you have a CPANPLUS::Backend::RV object - $passed_args = $backend_rv->args; # args passed to function - $ok = $backend_rv->ok; # boolean indication overall - # result of the call - $function = $backend_rv->function # name of the calling - # function - $rv = $backend_rv->rv # the actual return value - # of the calling function - -=head1 DESCRIPTION - -This module provides return value objects for multi-module -calls to CPANPLUS::Backend. In boolean context, it returns the status -of the overall result (ie, the same as the C method would). - -=head1 METHODS - -=head2 new( ok => BOOL, args => DATA, rv => DATA, [function => $method_name] ) - -Creates a new CPANPLUS::Backend::RV object from the data provided. -This method should only be called by CPANPLUS::Backend functions. -The accessors may be used by users inspecting an RV object. - -All the argument names can be used as accessors later to retrieve the -data. - -Arguments: - -=over 4 - -=item ok - -Boolean indicating overall success - -=item args - -The arguments provided to the function that returned this rv object. -Useful to inspect later to see what was actually passed to the function -in case of an error. - -=item rv - -An arbitrary data structure that has the detailed return values of each -of your multi-module calls. - -=item function - -The name of the function that created this rv object. -Can be explicitly passed. If not, C will try to deduce the name -from C information. - -=back - -=cut - -sub new { - my $class = shift; - my %hash = @_; - - my $tmpl = { - ok => { required => 1, allow => BOOLEANS }, - args => { required => 1 }, - rv => { required => 1 }, - function => { default => CALLING_FUNCTION->() }, - }; - - my $args = check( $tmpl, \%hash ) or return; - my $self = bless {}, $class; - -# $self->mk_accessors( qw[ok args function rv] ); - $self->mk_accessors( keys %$tmpl ); - - ### set the values passed in the struct ### - while( my($key,$val) = each %$args ) { - $self->$key( $val ); - } - - return $self; -} - -sub _ok { return shift->ok } -#sub _stringify { Carp::carp( "stringifying!" ); overload::StrVal( shift ) } - -### make it easier to check if($rv) { foo() } -### this allows people to not have to explicitly say -### if( $rv->ok ) { foo() } -### XXX add an explicit stringify, so it doesn't fall back to "bool"? :( -use overload bool => \&_ok, -# '""' => \&_stringify, - fallback => 1; - -=pod - -=head1 BUG REPORTS - -Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. - -=head1 AUTHOR - -This module by Jos Boumans Ekane@cpan.orgE. - -=head1 COPYRIGHT - -The CPAN++ interface (of which this module is a part of) is copyright (c) -2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. - -This library is free software; you may redistribute and/or modify it -under the same terms as Perl itself. - -=cut - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Config.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Config.pm deleted file mode 100644 index 26a056fe035..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Config.pm +++ /dev/null @@ -1,834 +0,0 @@ -package CPANPLUS::Config; -use deprecate; - -use strict; -use warnings; - -use base 'Object::Accessor'; -use base 'CPANPLUS::Internals::Utils'; - -use Config; -use File::Spec; -use Module::Load; -use CPANPLUS; -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; - -use File::Basename qw[dirname]; -use IPC::Cmd qw[can_run]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use Module::Load::Conditional qw[check_install]; -use version; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -=pod - -=head1 NAME - -CPANPLUS::Config - configuration defaults and heuristics for CPANPLUS - -=head1 SYNOPSIS - - ### conf object via CPANPLUS::Backend; - $cb = CPANPLUS::Backend->new; - $conf = $cb->configure_object; - - ### or as a standalone object - $conf = CPANPLUS::Configure->new; - - ### values in 'conf' section - $verbose = $conf->get_conf( 'verbose' ); - $conf->set_conf( verbose => 1 ); - - ### values in 'program' section - $editor = $conf->get_program( 'editor' ); - $conf->set_program( editor => '/bin/vi' ); - -=head1 DESCRIPTION - -This module contains defaults and heuristics for configuration -information for CPANPLUS. To change any of these values, please -see the documentation in C. - -Below you'll find a list of configuration types and keys, and -their meaning. - -=head1 CONFIGURATION - -=cut - -### BAH! you can't have POD interleaved with a hash -### declaration.. so declare every entry separately :( -my $Conf = { - '_fetch' => { - 'blacklist' => [ 'ftp' ], - }, - - ### _source, _build and _mirror are supposed to be static - ### no changes should be needed unless pause/cpan changes - '_source' => { - 'hosts' => 'MIRRORED.BY', - 'auth' => '01mailrc.txt.gz', - 'stored' => 'sourcefiles', - 'dslip' => '03modlist.data.gz', - 'update' => '86400', - 'mod' => '02packages.details.txt.gz', - 'custom_index' => 'packages.txt', - }, - '_build' => { - 'plugins' => 'plugins', - 'moddir' => 'build', - 'startdir' => '', - 'distdir' => 'dist', - 'autobundle' => 'autobundle', - 'autobundle_prefix' => 'Snapshot', - 'autdir' => 'authors', - 'install_log_dir' => 'install-logs', - 'custom_sources' => 'custom-sources', - 'sanity_check' => 1, - }, - '_mirror' => { - 'base' => 'authors/id/', - 'auth' => 'authors/01mailrc.txt.gz', - 'dslip' => 'modules/03modlist.data.gz', - 'mod' => 'modules/02packages.details.txt.gz' - }, -}; - -=head2 Section 'conf' - -=over 4 - -=item hosts - -An array ref containing hosts entries to be queried for packages. - -An example entry would like this: - - { 'scheme' => 'ftp', - 'path' => '/pub/CPAN/', - 'host' => 'ftp.cpan.org' - }, - -=cut - - ### default host list - $Conf->{'conf'}->{'hosts'} = [ - { - 'scheme' => 'ftp', - 'path' => '/pub/CPAN/', - 'host' => 'ftp.cpan.org' - }, - { - 'scheme' => 'http', - 'path' => '/', - 'host' => 'www.cpan.org' - }, - { - 'scheme' => 'ftp', - 'path' => '/', - 'host' => 'cpan.hexten.net' - }, - { - 'scheme' => 'ftp', - 'path' => '/CPAN/', - 'host' => 'cpan.cpantesters.org' - }, - { - 'scheme' => 'ftp', - 'path' => '/pub/languages/perl/CPAN/', - 'host' => 'ftp.funet.fi' - } - ]; - -=item allow_build_interactivity - -Boolean flag to indicate whether 'perl Makefile.PL' and similar -are run interactively or not. Defaults to 'true'. - -=cut - - $Conf->{'conf'}->{'allow_build_interactivity'} = 1; - -=item allow_unknown_prereqs - -Boolean flag to indicate that unresolvable prereqs are acceptable. -If C then only warnings will be issued (the behaviour before 0.9114) -when a module is unresolvable from any our sources (CPAN and/or -C). If C then an unresolvable prereq will fail -during the C stage of distribution installation. -Defaults to C. - -=cut - - $Conf->{'conf'}->{'allow_unknown_prereqs'} = 1; - -=item base - -The directory CPANPLUS keeps all its build and state information in. -Defaults to ~/.cpanplus. If L is available, that will -be used to work out your C directory. This may be overriden by -setting the C environment variable, see -L for more details. - -=cut - - $Conf->{'conf'}->{'base'} = File::Spec->catdir( - __PACKAGE__->_home_dir, DOT_CPANPLUS ); - -=item buildflags - -Any flags to be passed to 'perl Build.PL'. See C -for details. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'buildflags'} = ''; - -=item cpantest - -Boolean flag to indicate whether or not to mail test results of module -installations to C. Defaults to 'false'. - -=cut - - $Conf->{'conf'}->{'cpantest'} = 0; - -=item cpantest_mx - -String holding an explicit mailserver to use when sending out emails -for C. An empty string will use your system -settings. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'cpantest_mx'} = ''; - -=item debug - -Boolean flag to enable or disable extensive debuggging information. -Defaults to 'false'. - -=cut - - $Conf->{'conf'}->{'debug'} = 0; - -=item dist_type - -Default distribution type to use when building packages. See C -or C for details. An empty string will not use any -package building software. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'dist_type'} = ''; - -=item email - -Email address to use for anonymous ftp access and as C address -when sending emails. Defaults to an C address. - -=cut - - $Conf->{'conf'}->{'email'} = DEFAULT_EMAIL; - -=item enable_custom_sources - -Boolean flag indicating whether custom sources should be enabled or -not. See the C in C for -details on how to use them. - -Defaults to C - -=cut - - ### this addresses #32248 which requests a possibility to - ### turn off custom sources - $Conf->{'conf'}->{'enable_custom_sources'} = 1; - -=item extractdir - -String containing the directory where fetched archives should be -extracted. An empty string will use a directory under your C -directory. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'extractdir'} = ''; - -=item fetchdir - -String containing the directory where fetched archives should be -stored. An empty string will use a directory under your C -directory. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'fetchdir'} = ''; - -=item flush - -Boolean indicating whether build failures, cache dirs etc should -be flushed after every operation or not. Defaults to 'true'. - -=cut - - $Conf->{'conf'}->{'flush'} = 1; - -=item force - -Boolean indicating whether files should be forcefully overwritten -if they exist, modules should be installed when they fail tests, -etc. Defaults to 'false'. - -=cut - - $Conf->{'conf'}->{'force'} = 0; - -=item histfile - -A string containing the history filename of the CPANPLUS readline instance. - -=cut - - $Conf->{'conf'}->{'histfile'} = File::Spec->catdir( - __PACKAGE__->_home_dir, DOT_CPANPLUS, 'history' ); - -=item lib - -An array ref holding directories to be added to C<@INC> when CPANPLUS -starts up. Defaults to an empty array reference. - -=cut - - $Conf->{'conf'}->{'lib'} = []; - -=item makeflags - -A string holding flags that will be passed to the C program -when invoked. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'makeflags'} = ''; - -=item makemakerflags - -A string holding flags that will be passed to C -when invoked. Defaults to an empty string. - -=cut - - $Conf->{'conf'}->{'makemakerflags'} = ''; - -=item md5 - -A boolean indicating whether or not sha256 checks should be done when -an archive is fetched. Defaults to 'true' if you have C -installed, 'false' otherwise. - -=cut - - $Conf->{'conf'}->{'md5'} = ( - check_install( module => 'Digest::SHA' ) ? 1 : 0 ); - -=item no_update - -A boolean indicating whether or not C' source files should be -updated or not. Defaults to 'false'. - -=cut - - $Conf->{'conf'}->{'no_update'} = 0; - -=item passive - -A boolean indicating whether or not to use passive ftp connections. -Defaults to 'true'. - -=cut - - $Conf->{'conf'}->{'passive'} = 1; - -=item prefer_bin - -A boolean indicating whether or not to prefer command line programs -over perl modules. Defaults to 'false' unless you do not have -C installed (as that would mean we could not extract -C<.tar.gz> files) - -=cut - - ### if we dont have c::zlib, we'll need to use /bin/tar or we - ### can not extract any files. Good time to change the default - $Conf->{'conf'}->{'prefer_bin'} = - (eval {require Compress::Zlib; 1} ? 0 : 1 ); - -=item prefer_makefile - -A boolean indicating whether or not prefer a C over a -C file if both are present. Defaults to 'true', unless -the perl version is at least 5.10.1 or appropriate versions of L -and L are available. - -=cut - - $Conf->{'conf'}->{'prefer_makefile'} = - ( $] >= 5.010001 or - ( check_install( module => 'Module::Build', version => '0.32' ) and - check_install( module => INSTALLER_BUILD, version => '0.60' ) ) - ? 0 : 1 ); - -=item prereqs - -A digit indicating what to do when a package you are installing has a -prerequisite. Options are: - - 0 Do not install - 1 Install - 2 Ask - 3 Ignore (dangerous, install will probably fail!) - -The default is to ask. - -=cut - - $Conf->{'conf'}->{'prereqs'} = PREREQ_ASK; - -=item shell - -A string holding the shell class you wish to start up when starting -C in interactive mode. - -Defaults to C, the default CPANPLUS shell. - -=cut - - $Conf->{'conf'}->{'shell'} = 'CPANPLUS::Shell::Default'; - -=item show_startup_tip - -A boolean indicating whether or not to show start up tips in the -interactive shell. Defaults to 'true'. - -=cut - - $Conf->{'conf'}->{'show_startup_tip'} = 1; - -=item signature - -A boolean indicating whether or not check signatures if packages are -signed. Defaults to 'true' if you have C or C -installed, 'false' otherwise. - -=cut - - $Conf->{'conf'}->{'signature'} = do { - check_install( module => 'Module::Signature', version => '0.06' ) - and ( can_run('gpg') || - check_install(module => 'Crypt::OpenPGP') - ); - } ? 1 : 0; - -=item skiptest - -A boolean indicating whether or not to skip tests when installing modules. -Defaults to 'false'. - -=cut - - $Conf->{'conf'}->{'skiptest'} = 0; - -=item storable - -A boolean indicating whether or not to use C to write compiled -source file information to disk. This makes for faster startup and look -up times, but takes extra diskspace. Defaults to 'true' if you have -C installed and 'false' if you don't. - -=cut - - $Conf->{'conf'}->{'storable'} = - ( check_install( module => 'Storable' ) ? 1 : 0 ); - -=item timeout - -Digit indicating the time before a fetch request times out (in seconds). -Defaults to 300. - -=cut - - $Conf->{'conf'}->{'timeout'} = 300; - -=item verbose - -A boolean indicating whether or not C runs in verbose mode. -Defaults to 'true' if you have the environment variable -C set to true, 'false' otherwise. - -It is recommended you run with verbose enabled, but it is disabled -for historical reasons. - -=cut - - $Conf->{'conf'}->{'verbose'} = $ENV{PERL5_CPANPLUS_VERBOSE} || 0; - -=item write_install_log - -A boolean indicating whether or not to write install logs after installing -a module using the interactive shell. Defaults to 'true'. - - -=cut - - $Conf->{'conf'}->{'write_install_logs'} = 1; - -=item source_engine - -Class to use as the source engine, which is generally a subclass of -C. Default to C. - -=cut - - $Conf->{'conf'}->{'source_engine'} = DEFAULT_SOURCE_ENGINE; - -=item cpantest_reporter_args - -A hashref of key => value pairs that are passed to the constructor -of C. If you'd want to enable TLS for example, you'd -set it to: - - { transport => 'Net::SMTP::TLS', - transport_args => [ User => 'Joe', Password => '123' ], - } - -=cut - - $Conf->{'conf'}->{'cpantest_reporter_args'} = {}; - -=back - -=head2 Section 'program' - -=cut - - ### Paths get stripped of whitespace on win32 in the constructor - ### sudo gets emptied if there's no need for it in the constructor - -=over 4 - -=item editor - -A string holding the path to your editor of choice. Defaults to your -$ENV{EDITOR}, $ENV{VISUAL}, 'vi' or 'pico' programs, in that order. - -=cut - - $Conf->{'program'}->{'editor'} = do { - $ENV{'EDITOR'} || $ENV{'VISUAL'} || - can_run('vi') || can_run('pico') - }; - -=item make - -A string holding the path to your C binary. Looks for the C -program used to build perl or failing that, a C in your path. - -=cut - - $Conf->{'program'}->{'make'} = - can_run($Config{'make'}) || can_run('make'); - -=item pager - -A string holding the path to your pager of choice. Defaults to your -$ENV{PAGER}, 'less' or 'more' programs, in that order. - -=cut - - $Conf->{'program'}->{'pager'} = - $ENV{'PAGER'} || can_run('less') || can_run('more'); - - ### no one uses this feature anyway, and it's only working for EU::MM - ### and not for module::build - #'perl' => '', - -=item shell - -A string holding the path to your login shell of choice. Defaults to your -$ENV{SHELL} setting, or $ENV{COMSPEC} on Windows. - -=cut - - $Conf->{'program'}->{'shell'} = $^O eq 'MSWin32' - ? $ENV{COMSPEC} - : $ENV{SHELL}; - -=item sudo - -A string holding the path to your C binary if your install path -requires super user permissions. Looks for C in your path, or -remains empty if you do not require super user permissions to install. - -=cut - - $Conf->{'program'}->{'sudo'} = do { - ### let's assume you dont need sudo, - ### unless one of the below criteria tells us otherwise - my $sudo = undef; - - ### you're a normal user, you might need sudo - if( $> ) { - - ### check for all install dirs! - ### you have write permissions to the installdir, - ### you don't need sudo - if( -w $Config{'installsitelib'} && -w $Config{'installsitebin'} ) { - - ### installsiteman3dir is a 5.8'ism.. don't check - ### it on 5.6.x... - if( defined $Config{'installsiteman3dir'} ) { - $sudo = -w $Config{'installsiteman3dir'} - ? undef - : can_run('sudo'); - } else { - $sudo = undef; - } - - ### you have PERL_MM_OPT set to some alternate - ### install place. You probably have write permissions - ### to that - } elsif ( $ENV{'PERL_MM_OPT'} and - $ENV{'PERL_MM_OPT'} =~ /INSTALL|LIB|PREFIX/ - ) { - $sudo = undef; - - ### you probably don't have write permissions - } else { - $sudo = can_run('sudo'); - } - } - - ### and return the value - $sudo; - }; - -=item perlwrapper - -B - -A string holding the path to the C utility bundled -with CPANPLUS, which is used to enable autoflushing in spawned processes. - -=cut - - ### perlwrapper that allows us to turn on autoflushing - $Conf->{'program'}->{'perlwrapper'} = sub { - my $name = 'cpanp-run-perl'; - - my @bins = do{ - require Config; - my $ver = $Config::Config{version}; - - ### if we are running with 'versiononly' enabled, - ### all binaries will have the perlversion appended - ### ie, cpanp will become cpanp5.9.5 - ### so prefer the versioned binary in that case - $Config::Config{versiononly} - ? ($name.$ver, $name) - : ($name, $name.$ver); - }; - - ### patch from Steve Hay Fri 29 Jun 2007 14:26:02 GMT+02:00 - ### Msg-Id: <4684FA5A.7030506@uk.radan.com> - ### look for files with a ".bat" extension as well on Win32 - @bins = map { $_, "$_.bat" } @bins if $^O eq 'MSWin32'; - - my $path; - BIN: for my $bin (@bins) { - - ### parallel to your cpanp/cpanp-boxed - my $maybe = File::Spec->rel2abs( - File::Spec->catfile( dirname($0), $bin ) - ); - $path = $maybe and last BIN if -f $maybe; - - ### parallel to your CPANPLUS.pm: - ### $INC{cpanplus}/../bin/cpanp-run-perl - $maybe = File::Spec->rel2abs( - File::Spec->catfile( - dirname($INC{'CPANPLUS.pm'}), - '..', # lib dir - 'bin', # bin dir - $bin, # script - ) - ); - $path = $maybe and last BIN if -f $maybe; - - ### you installed CPANPLUS in a custom prefix, - ### so go parallel to /that/. PREFIX=/tmp/cp - ### would put cpanp-run-perl in /tmp/cp/bin and - ### CPANPLUS.pm in - ### /tmp/cp/lib/perl5/site_perl/5.8.8 - $maybe = File::Spec->rel2abs( - File::Spec->catfile( - dirname( $INC{'CPANPLUS.pm'} ), - '..', '..', '..', '..', # 4x updir - 'bin', # bin dir - $bin, # script - ) - ); - $path = $maybe and last BIN if -f $maybe; - - ### in your path -- take this one last, the - ### previous two assume extracted tarballs - ### or user installs - ### note that we don't use 'can_run' as it's - ### not an executable, just a wrapper... - ### prefer anything that's found in the path paralel to your $^X - for my $dir (File::Spec->rel2abs( dirname($^X) ), - split(/\Q$Config::Config{path_sep}\E/, $ENV{PATH}), - File::Spec->curdir, - ) { - - ### On VMS the path could be in UNIX format, and we - ### currently need it to be in VMS format - $dir = VMS::Filespec::vmspath($dir) if ON_VMS; - - $maybe = File::Spec->catfile( $dir, $bin ); - $path = $maybe and last BIN if -f $maybe; - } - } - - ### we should have a $path by now ideally, if so return it - return $path if defined $path; - - ### CPANPLUS::Dist::MM doesn't require this anymore - ### but CPANPLUS::Dist::Build might if it is less than 0.60 - my $cpdb = check_install( module => INSTALLER_BUILD ); - return '' unless - $cpdb and eval { version->parse($cpdb->{version}) < version->parse('0.60') }; - - ### if not, warn about it and give sensible default. - ### XXX try to be a no-op instead then.. - ### cross your fingers... - ### pass '-P' to perl: "run program through C - ### preprocessor before compilation" - ### XXX using -P actually changes the way some Makefile.PLs - ### are executed, so don't do that... --kane - error(loc( - "Could not find the '%1' binary in your path". - "--this may be a problem.\n". - "Please locate this program and set ". - "your '%2' config entry to its path.\n". - "From the default shell, you can do this by typing:\n\n". - " %3\n". - " %4\n", - $name, 'perlwrapper', - 's program perlwrapper FULL_PATH_TO_CPANP_RUN_PERL', - 's save' - )); - return ''; - }->(); - -=back - -=cut - -sub new { - my $class = shift; - my $obj = $class->SUPER::new; - - $obj->mk_accessors( keys %$Conf ); - - for my $acc ( keys %$Conf ) { - my $subobj = Object::Accessor->new; - $subobj->mk_accessors( keys %{$Conf->{$acc}} ); - - ### read in all the settings from the sub accessors; - for my $subacc ( $subobj->ls_accessors ) { - $subobj->$subacc( $Conf->{$acc}->{$subacc} ); - } - - ### now store it in the parent object - $obj->$acc( $subobj ); - } - - $obj->_clean_up_paths; - - ### shut up IPC::Cmd warning about not findin IPC::Run on win32 - $IPC::Cmd::WARN = 0; - - return $obj; -} - -sub _clean_up_paths { - my $self = shift; - - ### clean up paths if we are on win32 - if( $^O eq 'MSWin32' ) { - for my $pgm ( $self->program->ls_accessors ) { - my $path = $self->program->$pgm; - - ### paths with whitespace needs to be shortened - ### for shell outs. - if ($path and $path =~ /\s+/) { - my($prog, $args); - - ### patch from Steve Hay, 13nd of June 2007 - ### msg-id: <467012A4.6060705@uk.radan.com> - ### windows directories are not allowed to end with - ### a space, so any occurrence of '\w\s+/\w+' means - ### we're dealing with arguments, not directory - ### names. - if ($path =~ /^(.*?)(\s+\/.*$)/) { - ($prog, $args) = ($1, $2); - - ### otherwise, there are no arguments - } else { - ($prog, $args) = ($path, ''); - } - - $prog = Win32::GetShortPathName( $prog ); - $self->program->$pgm( $prog . $args ); - } - } - } - - return 1; -} - -1; - -=pod - -=head1 BUG REPORTS - -Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. - -=head1 AUTHOR - -This module by Jos Boumans Ekane@cpan.orgE. - -=head1 COPYRIGHT - -The CPAN++ interface (of which this module is a part of) is copyright (c) -2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. - -This library is free software; you may redistribute and/or modify it -under the same terms as Perl itself. - -=head1 SEE ALSO - -L, L, L - -=cut - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Config/HomeEnv.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Config/HomeEnv.pm deleted file mode 100755 index 90703a066de..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Config/HomeEnv.pm +++ /dev/null @@ -1,63 +0,0 @@ -package CPANPLUS::Config::HomeEnv; -use deprecate; - -use strict; -use File::Spec; -use vars qw($VERSION); - -$VERSION = "0.9135"; - -sub setup { - my $conf = shift; - $conf->set_conf( base => File::Spec->catdir( $ENV{PERL5_CPANPLUS_HOME}, '.cpanplus' ) ) - if $ENV{PERL5_CPANPLUS_HOME}; - return 1; -} - -qq'Wherever I hang my hat is home'; - -__END__ - -=head1 NAME - -CPANPLUS::Config::HomeEnv - Set the environment for the CPANPLUS base dir - -=head1 SYNOPSIS - - export PERL5_CPANPLUS_HOME=/home/moo/perls/conf/perl-5.8.9/ - -=head1 DESCRIPTION - -CPANPLUS::Config::HomeEnv is a L file that allows the CPANPLUS user to -specify where L gets its configuration from. - -Setting the environment variable C to a path location, determines -where the C<.cpanplus> directory will be located. - -=head1 METHODS - -=over - -=item C - -Called by L. - -=back - -=head1 AUTHOR - -Chris C Williams - -Contributions and patience from Jos Boumans the L guy! - -=head1 LICENSE - -Copyright E Chris Williams and Jos Boumans. - -This module may be used, modified, and distributed under the same terms as Perl itself. Please see the license that came with your Perl distribution for details. - -=head1 SEE ALSO - -L - -=cut diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Configure.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Configure.pm deleted file mode 100644 index 1abf759ef74..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Configure.pm +++ /dev/null @@ -1,637 +0,0 @@ -package CPANPLUS::Configure; -use deprecate; -use strict; - - -use CPANPLUS::Internals::Constants; -use CPANPLUS::Error; -use CPANPLUS::Config; - -use Log::Message; -use Module::Load qw[load]; -use Params::Check qw[check]; -use File::Basename qw[dirname]; -use Module::Loaded (); -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$AUTOLOAD $VERSION $MIN_CONFIG_VERSION]; -use base qw[CPANPLUS::Internals::Utils]; - -local $Params::Check::VERBOSE = 1; - -### require, avoid circular use ### -require CPANPLUS::Internals; -$VERSION = "0.9135"; - -### can't use O::A as we're using our own AUTOLOAD to get to -### the config options. -for my $meth ( qw[conf _lib _perl5lib]) { - no strict 'refs'; - - *$meth = sub { - my $self = shift; - $self->{'_'.$meth} = $_[0] if @_; - return $self->{'_'.$meth}; - } -} - - -=pod - -=head1 NAME - -CPANPLUS::Configure - configuration for CPANPLUS - -=head1 SYNOPSIS - - $conf = CPANPLUS::Configure->new( ); - - $bool = $conf->can_save; - $bool = $conf->save( $where ); - - @opts = $conf->options( $type ); - - $make = $conf->get_program('make'); - $verbose = $conf->set_conf( verbose => 1 ); - -=head1 DESCRIPTION - -This module deals with all the configuration issues for CPANPLUS. -Users can use objects created by this module to alter the behaviour -of CPANPLUS. - -Please refer to the C documentation on how to -obtain a C object. - -=head1 METHODS - -=head2 $Configure = CPANPLUS::Configure->new( load_configs => BOOL ) - -This method returns a new object. Normal users will never need to -invoke the C method, but instead retrieve the desired object via -a method call on a C object. - -=over 4 - -=item load_configs - -Controls whether or not additional user configurations are to be loaded -or not. Defaults to C. - -=back - -=cut - -### store the CPANPLUS::Config object in a closure, so we only -### initialize it once.. otherwise, on a 2nd ->new, settings -### from configs on top of this one will be reset -{ my $Config; - - sub new { - my $class = shift; - my %hash = @_; - - ### XXX pass on options to ->init() like rescan? - my ($load); - my $tmpl = { - load_configs => { default => 1, store => \$load }, - }; - - check( $tmpl, \%hash ) or ( - warn Params::Check->last_error, return - ); - - $Config ||= CPANPLUS::Config->new; - my $self = bless {}, $class; - $self->conf( $Config ); - - ### you want us to load other configs? - ### these can override things in the default config - $self->init if $load; - - ### after processing the config files, check what - ### @INC and PERL5LIB are set to. - $self->_lib( \@INC ); - $self->_perl5lib( $ENV{'PERL5LIB'} ); - - return $self; - } -} - -=head2 $bool = $Configure->init( [rescan => BOOL]) - -Initialize the configure with other config files than just -the default 'CPANPLUS::Config'. - -Called from C to load user/system configurations - -If the C option is provided, your disk will be -examined again to see if there are new config files that -could be read. Defaults to C. - -Returns true on success, false on failure. - -=cut - -### move the Module::Pluggable detection to runtime, rather -### than compile time, so that a simple 'require CPANPLUS' -### doesn't start running over your filesystem for no good -### reason. Make sure we only do the M::P call once though. -### we use $loaded to mark it -{ my $loaded; - my $warned; - sub init { - my $self = shift; - my $obj = $self->conf; - my %hash = @_; - - my ($rescan); - my $tmpl = { - rescan => { default => 0, store => \$rescan }, - }; - - check( $tmpl, \%hash ) or ( - warn Params::Check->last_error, return - ); - - ### if the base dir is changed, we have to rescan it - ### for any CPANPLUS::Config::* files as well, so keep - ### track of it - my $cur_base = $self->get_conf('base'); - - ### warn if we find an old style config specified - ### via environment variables - { my $env = ENV_CPANPLUS_CONFIG; - if( $ENV{$env} and not $warned ) { - $warned++; - error(loc("Specifying a config file in your environment " . - "using %1 is obsolete.\nPlease follow the ". - "directions outlined in %2 or use the '%3' command\n". - "in the default shell to use custom config files.", - $env, "CPANPLUS::Configure->save", 's save')); - } - } - - { ### make sure that the homedir is included now - local @INC = ( LIB_DIR->($cur_base), @INC ); - - ### only set it up once - if( !$loaded++ or $rescan ) { - ### find plugins & extra configs - ### check $home/.cpanplus/lib as well - require Module::Pluggable; - - Module::Pluggable->import( - search_path => ['CPANPLUS::Config'], - search_dirs => [ LIB_DIR->($cur_base) ], - except => qr/::SUPER$/, - sub_name => 'configs' - ); - } - - - ### do system config, user config, rest.. in that order - ### apparently, on a 2nd invocation of -->configs, a - ### ::ISA::CACHE package can appear.. that's bad... - my %confs = map { $_ => $_ } - grep { $_ !~ /::ISA::/ } __PACKAGE__->configs; - my @confs = grep { defined } - map { delete $confs{$_} } CONFIG_SYSTEM, CONFIG_USER; - push @confs, sort keys %confs; - - for my $plugin ( @confs ) { - msg(loc("Found config '%1'", $plugin),0); - - ### if we already did this the /last/ time around dont - ### run the setup agian. - if( my $loc = Module::Loaded::is_loaded( $plugin ) ) { - msg(loc(" Already loaded '%1' (%2)", $plugin, $loc), 0); - next; - } else { - msg(loc(" Loading config '%1'", $plugin),0); - - if( eval { load $plugin; 1 } ) { - msg(loc(" Loaded '%1' (%2)", - $plugin, Module::Loaded::is_loaded( $plugin ) ), 0); - } else { - error(loc(" Error loading '%1': %2", $plugin, $@)); - } - } - - if( $@ ) { - error(loc("Could not load '%1': %2", $plugin, $@)); - next; - } - - my $sub = $plugin->can('setup'); - $sub->( $self ) if $sub; - } - } - - ### did one of the plugins change the base dir? then we should - ### scan the dirs again - if( $cur_base ne $self->get_conf('base') ) { - msg(loc("Base dir changed from '%1' to '%2', rescanning", - $cur_base, $self->get_conf('base')), 0); - $self->init( @_, rescan => 1 ); - } - - ### clean up the paths once more, just in case - $obj->_clean_up_paths; - - ### XXX in case the 'lib' param got changed, we need to - ### add that now, or it's not propagating ;( - { my $lib = $self->get_conf('lib'); - my %inc = map { $_ => $_ } @INC; - for my $l ( @$lib ) { - push @INC, $l unless $inc{$l}; - } - $self->_lib( \@INC ); - } - - return 1; - } -} -=pod - -=head2 can_save( [$config_location] ) - -Check if we can save the configuration to the specified file. -If no file is provided, defaults to your personal config. - -Returns true if the file can be saved, false otherwise. - -=cut - -sub can_save { - my $self = shift; - my $file = shift || CONFIG_USER_FILE->(); - - return 1 unless -e $file; - - chmod 0644, $file; - return (-w $file); -} - -=pod - -=head2 $file = $conf->save( [$package_name] ) - -Saves the configuration to the package name you provided. -If this package is not C, it will -be saved in your C<.cpanplus> directory, otherwise it will -be attempted to be saved in the system wide directory. - -If no argument is provided, it will default to your personal -config. - -Returns the full path to the file if the config was saved, -false otherwise. - -=cut - -sub _config_pm_to_file { - my $self = shift; - my $pm = shift or return; - my $dir = shift || CONFIG_USER_LIB_DIR->(); - - ### only 3 types of files know: home, system and 'other' - ### so figure out where to save them based on their type - my $file; - if( $pm eq CONFIG_USER ) { - $file = CONFIG_USER_FILE->(); - - } elsif ( $pm eq CONFIG_SYSTEM ) { - $file = CONFIG_SYSTEM_FILE->(); - - ### third party file - } else { - my $cfg_pkg = CONFIG . '::'; - unless( $pm =~ /^$cfg_pkg/ ) { - error(loc( - "WARNING: Your config package '%1' is not in the '%2' ". - "namespace and will not be automatically detected by %3", - $pm, $cfg_pkg, 'CPANPLUS' - )); - } - - $file = File::Spec->catfile( - $dir, - split( '::', $pm ) - ) . '.pm'; - } - - return $file; -} - - -sub save { - my $self = shift; - my $pm = shift || CONFIG_USER; - my $savedir = shift || ''; - - my $file = $self->_config_pm_to_file( $pm, $savedir ) or return; - my $dir = dirname( $file ); - - unless( -d $dir ) { - $self->_mkdir( dir => $dir ) or ( - error(loc("Can not create directory '%1' to save config to",$dir)), - return - ) - } - return unless $self->can_save($file); - - ### find only accessors that are not private - my @acc = sort grep { $_ !~ /^_/ } $self->conf->ls_accessors; - - ### for dumping the values - use Data::Dumper; - - my @lines; - for my $acc ( @acc ) { - - push @lines, "### $acc section", $/; - - for my $key ( $self->conf->$acc->ls_accessors ) { - my $val = Dumper( $self->conf->$acc->$key ); - - $val =~ s/\$VAR1\s+=\s+//; - $val =~ s/;\n//; - - push @lines, '$'. "conf->set_${acc}( $key => $val );", $/; - } - push @lines, $/,$/; - - } - - my $str = join '', map { " $_" } @lines; - - ### use a variable to make sure the pod parser doesn't snag it - my $is = '='; - my $time = gmtime; - - - my $msg = <<_END_OF_CONFIG_; -############################################### -### -### Configuration structure for $pm -### -############################################### - -#last changed: $time GMT - -### minimal pod, so you can find it with perldoc -l, etc -${is}pod - -${is}head1 NAME - -$pm - -${is}head1 DESCRIPTION - -This is a CPANPLUS configuration file. Editing this -config changes the way CPANPLUS will behave - -${is}cut - -package $pm; - -use strict; - -sub setup { - my \$conf = shift; - -$str - - return 1; -} - -1; - -_END_OF_CONFIG_ - - $self->_move( file => $file, to => "$file~" ) if -f $file; - - my $fh = new FileHandle; - $fh->open(">$file") - or (error(loc("Could not open '%1' for writing: %2", $file, $!)), - return ); - - $fh->print($msg); - $fh->close; - - return $file; -} - -=pod - -=head2 options( type => TYPE ) - -Returns a list of all valid config options given a specific type -(like for example C of C) or false if the type does -not exist - -=cut - -sub options { - my $self = shift; - my $conf = $self->conf; - my %hash = @_; - - my $type; - my $tmpl = { - type => { required => 1, default => '', - strict_type => 1, store => \$type }, - }; - - check($tmpl, \%hash) or return; - - my %seen; - return sort grep { !$seen{$_}++ } - map { $_->$type->ls_accessors if $_->can($type) } - $self->conf; - return; -} - -=pod - -=head1 ACCESSORS - -Accessors that start with a C<_> are marked private -- regular users -should never need to use these. - -See the C documentation for what items can be -set and retrieved. - -=head2 get_SOMETHING( ITEM, [ITEM, ITEM, ... ] ); - -The C style accessors merely retrieves one or more desired -config options. - -=head2 set_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] ); - -The C style accessors set the current value for one -or more config options and will return true upon success, false on -failure. - -=head2 add_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] ); - -The C style accessor adds a new key to a config key. - -Currently, the following accessors exist: - -=over 4 - -=item set|get_conf - -Simple configuration directives like verbosity and favourite shell. - -=item set|get_program - -Location of helper programs. - -=item _set|_get_build - -Locations of where to put what files for CPANPLUS. - -=item _set|_get_source - -Locations and names of source files locally. - -=item _set|_get_mirror - -Locations and names of source files remotely. - -=item _set|_get_fetch - -Special settings pertaining to the fetching of files. - -=back - -=cut - -sub AUTOLOAD { - my $self = shift; - my $conf = $self->conf; - - my $name = $AUTOLOAD; - $name =~ s/.+:://; - - my ($private, $action, $field) = - $name =~ m/^(_)?((?:[gs]et|add))_([a-z]+)$/; - - my $type = ''; - $type .= '_' if $private; - $type .= $field if $field; - - my $type_code = $conf->can($type); - unless ( $type_code ) { - error( loc("Invalid method type: '%1'", $name) ); - return; - } - my $type_obj = $type_code->(); - - unless( scalar @_ ) { - error( loc("No arguments provided!") ); - return; - } - - ### retrieve a current value for an existing key ### - if( $action eq 'get' ) { - for my $key (@_) { - my @list = (); - - ### get it from the user config first - if( my $code = $type_obj->can($key) ) { - push @list, $code->(); - - ### XXX EU::AI compatibility hack to provide lookups like in - ### cpanplus 0.04x; we renamed ->_get_build('base') to - ### ->get_conf('base') - } elsif ( $type eq '_build' and $key eq 'base' ) { - return $self->get_conf($key); - - } else { - error( loc(q[No such key '%1' in field '%2'], $key, $type) ); - return; - } - - return wantarray ? @list : $list[0]; - } - - ### set an existing key to a new value ### - } elsif ( $action eq 'set' ) { - my %args = @_; - - while( my($key,$val) = each %args ) { - - if( my $code = $type_obj->can($key) ) { - $code->( $val ); - - } else { - error( loc(q[No such key '%1' in field '%2'], $key, $type) ); - return; - } - } - - return 1; - - ### add a new key to the config ### - } elsif ( $action eq 'add' ) { - my %args = @_; - - while( my($key,$val) = each %args ) { - - if( $type_obj->can($key) ) { - error( loc( q[Key '%1' already exists for field '%2'], - $key, $type)); - return; - } else { - $type_obj->mk_accessors( $key ); - $type_obj->$key( $val ); - } - } - return 1; - - } else { - - error( loc(q[Unknown action '%1'], $action) ); - return; - } -} - -sub DESTROY { 1 }; - -1; - -=pod - -=head1 BUG REPORTS - -Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. - -=head1 AUTHOR - -This module by Jos Boumans Ekane@cpan.orgE. - -=head1 COPYRIGHT - -The CPAN++ interface (of which this module is a part of) is copyright (c) -2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. - -This library is free software; you may redistribute and/or modify it -under the same terms as Perl itself. - -=head1 SEE ALSO - -L, L, L - -=cut - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: - diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Configure/Setup.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Configure/Setup.pm deleted file mode 100644 index 8ac565a70ec..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Configure/Setup.pm +++ /dev/null @@ -1,1654 +0,0 @@ -package CPANPLUS::Configure::Setup; -use deprecate; - -use strict; -use vars qw[@ISA $VERSION]; -$VERSION = "0.9135"; - -use base qw[CPANPLUS::Internals::Utils]; -use base qw[Object::Accessor]; - -use Config; -use Term::UI; -use Module::Load; -use Term::ReadLine; - -use CPANPLUS::Internals::Utils; -use CPANPLUS::Internals::Constants; -use CPANPLUS::Error; - -use IPC::Cmd qw[can_run]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[check_install]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -### silence Term::UI -$Term::UI::VERBOSE = 0; - -#Can't ioctl TIOCGETP: Unknown error -#Consider installing Term::ReadKey from CPAN site nearby -# at http://www.perl.com/CPAN -#Or use -# perl -MCPAN -e shell -#to reach CPAN. Falling back to 'stty'. -# If you do not want to see this warning, set PERL_READLINE_NOWARN -#in your environment. -#'stty' is not recognized as an internal or external command, -#operable program or batch file. -#Cannot call `stty': No such file or directory at C:/Perl/site/lib/Term/ReadLine/ - -### setting this var in the meantime to avoid this warning ### -$ENV{PERL_READLINE_NOWARN} = 1; - - -sub new { - my $class = shift; - my %hash = @_; - - my $tmpl = { - configure_object => { }, - term => { }, - backend => { }, - autoreply => { default => 0, }, - skip_mirrors => { default => 0, }, - use_previous => { default => 1, }, - config_type => { default => CONFIG_USER }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### initialize object - my $obj = $class->SUPER::new( keys %$tmpl ); - for my $acc ( $obj->ls_accessors ) { - $obj->$acc( $args->{$acc} ); - } - - ### otherwise there's a circular use ### - load CPANPLUS::Configure; - load CPANPLUS::Backend; - - $obj->configure_object( CPANPLUS::Configure->new() ) - unless $obj->configure_object; - - $obj->backend( CPANPLUS::Backend->new( $obj->configure_object ) ) - unless $obj->backend; - - ### use empty string in case user only has T::R::Stub -- it complains - $obj->term( Term::ReadLine->new('') ) - unless $obj->term; - - ### enable autoreply if that was passed ### - $Term::UI::AUTOREPLY = $obj->autoreply; - - return $obj; -} - -sub init { - my $self = shift; - my $term = $self->term; - - ### default setting, unless changed - $self->config_type( CONFIG_USER ) unless $self->config_type; - - my $save = loc('Save & exit'); - my $exit = loc('Quit without saving'); - my @map = ( - # key on the display # method to dispatch to - [ loc('Select Configuration file') => '_save_where' ], - [ loc('Setup CLI Programs') => '_setup_program' ], - [ loc('Setup CPANPLUS Home directory') => '_setup_base' ], - [ loc('Setup FTP/Email settings') => '_setup_ftp' ], - [ loc('Setup basic preferences') => '_setup_conf' ], - [ loc('Setup installer settings') => '_setup_installer' ], - [ loc('Select mirrors'), => '_setup_hosts' ], - [ loc('Edit configuration file') => '_edit' ], - [ $save => '_save' ], - [ $exit => 1 ], - ); - - my @keys = map { $_->[0] } @map; # sorted keys - my %map = map { @$_ } @map; # lookup hash - - PICK_SECTION: { - print loc(" -=================> MAIN MENU <================= - -Welcome to the CPANPLUS configuration. Please select which -parts you wish to configure - -Defaults are taken from your current configuration. -If you would save now, your settings would be written to: - - %1 - - ", $self->config_type ); - - my $choice = $term->get_reply( - prompt => "Section to configure:", - choices => \@keys, - default => $keys[0] - ); - - ### exit configuration? - if( $choice eq $exit ) { - print loc(" -Quitting setup, changes will not be saved. - "); - return 1; - } - - my $method = $map{$choice}; - - my $rv = $self->$method or print loc(" -There was an error setting up this section. You might want to try again - "); - - ### was it save & exit? - if( $choice eq $save and $rv ) { - print loc(" -Quitting setup, changes are saved to '%1' - ", $self->config_type - ); - return 1; - } - - ### otherwise, present choice again - redo PICK_SECTION; - } - - return 1; -} - - - -### sub that figures out what kind of config type the user wants -sub _save_where { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - - ASK_CONFIG_TYPE: { - - print loc( q[ -Where would you like to save your CPANPLUS Configuration file? - -If you want to configure CPANPLUS for this user only, -select the '%1' option. -The file will then be saved in your homedirectory. - -If you are the system administrator of this machine, -and would like to make this config available globally, -select the '%2' option. -The file will be then be saved in your CPANPLUS -installation directory. - - ], CONFIG_USER, CONFIG_SYSTEM ); - - - ### ask what config type we should save to - my $type = $term->get_reply( - prompt => loc("Type of configuration file"), - default => $self->config_type || CONFIG_USER, - choices => [CONFIG_USER, CONFIG_SYSTEM], - ); - - my $file = $conf->_config_pm_to_file( $type ); - - ### can we save to this file? - unless( $conf->can_save( $file ) ) { - error(loc( - "Can not save to file '%1'-- please check permissions " . - "and try again", $file - )); - - redo ASK_CONFIG_FILE; - } - - ### you already have the file -- are we allowed to overwrite - ### or should we try again? - if ( -e $file and -w _ ) { - print loc(q[ -I see you already have this file: - %1 - -The file will not be overwritten until you explicitly save it. - - ], $file ); - - redo ASK_CONFIG_TYPE - unless $term->ask_yn( - prompt => loc( "Do you wish to use this file?"), - default => 'n', - ); - } - - print $/, loc("Using '%1' as your configuration type", $type); - - return $self->config_type($type); - } -} - - -### setup the build & cache dirs -sub _setup_base { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - my $base = $conf->get_conf('base'); - my $home = File::Spec->catdir( $self->_home_dir, DOT_CPANPLUS ); - - print loc(" -CPANPLUS needs a directory of its own to cache important index -files and maybe keep a temporary mirror of CPAN files. -This may be a site-wide directory or a personal directory. - -For a single-user installation, we suggest using your home directory. - -"); - - my $where; - ASK_HOME_DIR: { - my $other = loc('Somewhere else'); - if( $base and ($base ne $home) ) { - print loc("You have several choices:"); - - $where = $term->get_reply( - prompt => loc('Please pick one'), - choices => [$home, $base, $other], - default => $home, - ); - } else { - $where = $base; - } - - if( $where and -d $where ) { - print loc(" -I see you already have a directory: - %1 - - "), $where; - - my $yn = $term->ask_yn( - prompt => loc('Should I use it?'), - default => 'y', - ); - $where = '' unless $yn; - } - - if( $where and ($where ne $other) and not -d $where ) { - if (!$self->_mkdir( dir => $where ) ) { - print "\n", loc("Unable to create directory '%1'", $where); - redo ASK_HOME_DIR; - } - - } elsif( not $where or ($where eq $other) ) { - print loc(" -First of all, I'd like to create this directory. - - "); - - NEW_HOME: { - $where = $term->get_reply( - prompt => loc('Where shall I create it?'), - default => $home, - ); - - my $again; - if( -d $where and not -w _ ) { - print "\n", loc("I can't seem to write in this directory"); - $again++; - } elsif (!$self->_mkdir( dir => $where ) ) { - print "\n", loc("Unable to create directory '%1'", $where); - $again++; - } - - if( $again ) { - print "\n", loc('Please select another directory'), "\n\n"; - redo NEW_HOME; - } - } - } - } - - ### tidy up the path and store it - $where = File::Spec->rel2abs($where); - $conf->set_conf( base => $where ); - - ### create subdirectories ### - my @dirs = - File::Spec->catdir( $where, $self->_perl_version(perl => $^X), - $conf->_get_build('moddir') ), - map { - File::Spec->catdir( $where, $conf->_get_build($_) ) - } qw[autdir distdir]; - - for my $dir ( @dirs ) { - unless( $self->_mkdir( dir => $dir ) ) { - warn loc("I wasn't able to create '%1'", $dir), "\n"; - } - } - - ### clear away old storable images before 0.031 - for my $src (qw[dslip mailrc packages]) { - 1 while unlink File::Spec->catfile( $where, $src ); - - } - - print loc(q[ -Your CPANPLUS build and cache directory has been set to: - %1 - - ], $where); - - return 1; -} - -sub _setup_ftp { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - ######################### - ## are you a pacifist? ## - ######################### - - print loc(" -If you are connecting through a firewall or proxy that doesn't handle -FTP all that well you can use passive FTP. - -"); - - my $yn = $term->ask_yn( - prompt => loc("Use passive FTP?"), - default => $conf->get_conf('passive'), - ); - - $conf->set_conf(passive => $yn); - - ### set the ENV var as well, else it won't get set till AFTER - ### the configuration is saved. but we fetch files BEFORE that. - $ENV{FTP_PASSIVE} = $yn; - - print "\n"; - print $yn - ? loc("I will use passive FTP.") - : loc("I won't use passive FTP."); - print "\n"; - - ############################# - ## should fetches timeout? ## - ############################# - - print loc(" -CPANPLUS can specify a network timeout for downloads (in whole seconds). -If none is desired (or to skip this question), enter '0'. - -"); - - my $timeout = 0 + $term->get_reply( - prompt => loc("Network timeout for downloads"), - default => $conf->get_conf('timeout') || 0, - allow => qr/(?!\D)/, ### whole numbers only - ); - - $conf->set_conf(timeout => $timeout); - - print "\n"; - print $timeout - ? loc("The network timeout for downloads is %1 seconds.", $timeout) - : loc("The network timeout for downloads is not set."); - print "\n"; - - ############################ - ## where can I reach you? ## - ############################ - - print loc(" -What email address should we send as our anonymous password when -fetching modules from CPAN servers? Some servers will NOT allow you to -connect without a valid email address, or at least something that looks -like one. -Also, if you choose to report test results at some point, a valid email -is required for the 'from' field, so choose wisely. - - "); - - my $other = 'Something else'; - my @choices = (DEFAULT_EMAIL, $Config{cf_email}, $other); - my $current = $conf->get_conf('email'); - - ### if your current address is not in the list, add it to the choices - unless (grep { $_ eq $current } @choices) { - unshift @choices, $current; - } - - my $email = $term->get_reply( - prompt => loc('Which email address shall I use?'), - default => $current || $choices[0], - choices => \@choices, - ); - - if( $email eq $other ) { - EMAIL: { - $email = $term->get_reply( - prompt => loc('Email address: '), - ); - - unless( $self->_valid_email($email) ) { - print loc(" -You did not enter a valid email address, please try again! - ") if length $email; - - redo EMAIL; - } - } - } - - print loc(" -Your 'email' is now: - %1 - - ", $email); - - $conf->set_conf( email => $email ); - - return 1; -} - - -### commandline programs -sub _setup_program { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - print loc(" -CPANPLUS can use command line utilities to do certain -tasks, rather than use perl modules. - -If you wish to use a certain command utility, just enter -the full path (or accept the default). If you do not wish -to use it, enter a single space. - -Note that the paths you provide should not contain spaces, which is -needed to make a distinction between program name and options to that -program. For Win32 machines, you can use the short name for a path, -like '%1'. -", 'c:\Progra~1\prog.exe' ); - - for my $prog ( sort $conf->options( type => 'program') ) { - PROGRAM: { - print "\n", loc("Where can I find your '%1' utility? ". - "(Enter a single space to disable)", $prog ), "\n"; - - my $loc = $term->get_reply( - prompt => "Path to your '$prog'", - default => $conf->get_program( $prog ), - ); - - ### empty line clears it - my $cmd = $loc =~ /^\s*$/ ? undef : $loc; - my ($bin) = $cmd =~ /^(\S+)/; - - ### did you provide a valid program ? - if( $bin and not can_run( $bin ) ) { - print "\n"; - print loc("Can not find the binary '%1' in your path!", $bin); - redo PROGRAM; - } - - ### make is special -- we /need/ it! - if( $prog eq 'make' and not $bin ) { - print loc( - "==> Without your '%1' utility, I can not function! <==", - 'make' - ); - print loc("Please provide one!"); - - ### show win32 where to download - if ( $^O eq 'MSWin32' ) { - print loc("You can get '%1' from:", NMAKE); - print "\t". NMAKE_URL ."\n"; - } - print "\n"; - redo PROGRAM; - } - - $conf->set_program( $prog => $cmd ); - print $cmd - ? loc( "Your '%1' utility has been set to '%2'.", - $prog, $cmd ) - : loc( "Your '%1' has been disabled.", $prog ); - print "\n"; - } - } - - return 1; -} - -sub _setup_installer { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - my $none = 'None'; - { - print loc(" -CPANPLUS uses binary programs as well as Perl modules to accomplish -various tasks. Normally, CPANPLUS will prefer the use of Perl modules -over binary programs. - -You can change this setting by making CPANPLUS prefer the use of -certain binary programs if they are available. - - "); - - ### default to using binaries if we don't have compress::zlib only - ### -- it'll get very noisy otherwise - my $type = 'prefer_bin'; - my $yn = $term->ask_yn( - prompt => loc("Should I prefer the use of binary programs?"), - default => $conf->get_conf( $type ), - ); - - print $yn - ? loc("Ok, I will prefer to use binary programs if possible.") - : loc("Ok, I will prefer to use Perl modules if possible."); - print "\n\n"; - - - $conf->set_conf( $type => $yn ); - } - - { - print loc(" -Makefile.PL is run by perl in a separate process, and accepts various -flags that controls the module's installation. For instance, if you -would like to install modules to your private user directory, set -'makemakerflags' to: - -LIB=~/perl/lib INSTALLMAN1DIR=~/perl/man/man1 INSTALLMAN3DIR=~/perl/man/man3 - -and be sure that you do NOT set UNINST=1 in 'makeflags' below. - -Enter a name=value list separated by whitespace, but quote any embedded -spaces that you want to preserve. (Enter a space to clear any existing -settings.) - -If you don't understand this question, just press ENTER. - - "); - - my $type = 'makemakerflags'; - my $flags = $term->get_reply( - prompt => 'Makefile.PL flags?', - default => $conf->get_conf($type), - ); - - $flags = '' if $flags eq $none || $flags !~ /\S/; - - print "\n", loc("Your '%1' have been set to:", 'Makefile.PL flags'), - "\n ", ( $flags ? $flags : loc('*nothing entered*')), - "\n\n"; - - $conf->set_conf( $type => $flags ); - } - - { - print loc(" -Like Makefile.PL, we run 'make' and 'make install' as separate processes. -If you have any parameters (e.g. '-j3' in dual processor systems) you want -to pass to the calls, please specify them here. - -In particular, 'UNINST=1' is recommended for root users, unless you have -fine-tuned ideas of where modules should be installed in the \@INC path. - -Enter a name=value list separated by whitespace, but quote any embedded -spaces that you want to preserve. (Enter a space to clear any existing -settings.) - -Again, if you don't understand this question, just press ENTER. - - "); - my $type = 'makeflags'; - my $flags = $term->get_reply( - prompt => 'make flags?', - default => $conf->get_conf($type), - ); - - $flags = '' if $flags eq $none || $flags !~ /\S/; - - print "\n", loc("Your '%1' have been set to:", $type), - "\n ", ( $flags ? $flags : loc('*nothing entered*')), - "\n\n"; - - $conf->set_conf( $type => $flags ); - } - - { - print loc(" -An alternative to ExtUtils::MakeMaker and Makefile.PL there's a module -called Module::Build which uses a Build.PL. - -If you would like to specify any flags to pass when executing the -Build.PL (and Build) script, please enter them below. - -For instance, if you would like to install modules to your private -user directory, you could enter: - - install_base=/my/private/path - -Or to uninstall old copies of modules before updating, you might -want to enter: - - uninst=1 - -Again, if you don't understand this question, just press ENTER. - - "); - - my $type = 'buildflags'; - my $flags = $term->get_reply( - prompt => 'Build.PL and Build flags?', - default => $conf->get_conf($type), - ); - - $flags = '' if $flags eq $none || $flags !~ /\S/; - - print "\n", loc("Your '%1' have been set to:", - 'Build.PL and Build flags'), - "\n ", ( $flags ? $flags : loc('*nothing entered*')), - "\n\n"; - - $conf->set_conf( $type => $flags ); - } - - ### use EU::MM or module::build? ### - { - print loc(" -Some modules provide both a Build.PL (Module::Build) and a Makefile.PL -(ExtUtils::MakeMaker). By default, CPANPLUS prefers Makefile.PL. - -Module::Build support is not bundled standard with CPANPLUS, but -requires you to install 'CPANPLUS::Dist::Build' from CPAN. - -Although Module::Build is a pure perl solution, which means you will -not need a 'make' binary, it does have some limitations. The most -important is that CPANPLUS is unable to uninstall any modules installed -by Module::Build. - -Again, if you don't understand this question, just press ENTER. - - "); - my $type = 'prefer_makefile'; - my $yn = $term->ask_yn( - prompt => loc("Prefer Makefile.PL over Build.PL?"), - default => $conf->get_conf($type), - ); - - $conf->set_conf( $type => $yn ); - } - - { - print loc(' -If you like, CPANPLUS can add extra directories to your @INC list during -startup. These will just be used by CPANPLUS and will not change your -external environment or perl interpreter. Enter a space separated list of -pathnames to be added to your @INC, quoting any with embedded whitespace. -(To clear the current value enter a single space.) - - '); - - my $type = 'lib'; - my $flags = $term->get_reply( - prompt => loc('Additional @INC directories to add?'), - default => (join " ", @{$conf->get_conf($type) || []} ), - ); - - my $lib; - unless( $flags =~ /\S/ ) { - $lib = []; - } else { - (@$lib) = $flags =~ m/\s*("[^"]+"|'[^']+'|[^\s]+)/g; - } - - print "\n", loc("Your additional libs are now:"), "\n"; - - print scalar @$lib - ? map { " $_\n" } @$lib - : " ", loc("*nothing entered*"), "\n"; - print "\n\n"; - - $conf->set_conf( $type => $lib ); - } - - return 1; -} - - -sub _setup_conf { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - my $none = 'None'; - { - ############ - ## noisy? ## - ############ - - print loc(" -In normal operation I can just give you basic information about what I -am doing, or I can be more verbose and give you every little detail. - - "); - - my $type = 'verbose'; - my $yn = $term->ask_yn( - prompt => loc("Should I be verbose?"), - default => $conf->get_conf( $type ), ); - - print "\n"; - print $yn - ? loc("You asked for it!") - : loc("I'll try to be quiet"); - - $conf->set_conf( $type => $yn ); - } - - { - ####################### - ## flush you animal! ## - ####################### - - print loc(" -In the interest of speed, we keep track of what modules were installed -successfully and which failed in the current session. We can flush this -data automatically, or you can explicitly issue a 'flush' when you want -to purge it. - - "); - - my $type = 'flush'; - my $yn = $term->ask_yn( - prompt => loc("Flush automatically?"), - default => $conf->get_conf( $type ), - ); - - print "\n"; - print $yn - ? loc("I'll flush after every full module install.") - : loc("I won't flush until you tell me to."); - - $conf->set_conf( $type => $yn ); - } - - { - ##################### - ## force installs? ## - ##################### - - print loc(" -Usually, when a test fails, I won't install the module, but if you -prefer, I can force the install anyway. - - "); - - my $type = 'force'; - my $yn = $term->ask_yn( - prompt => loc("Force installs?"), - default => $conf->get_conf( $type ), - ); - - print "\n"; - print $yn - ? loc("I will force installs.") - : loc("I won't force installs."); - - $conf->set_conf( $type => $yn ); - } - - { - ################### - ## about prereqs ## - ################### - - print loc(" -Sometimes a module will require other modules to be installed before it -will work. CPANPLUS can attempt to install these for you automatically -if you like, or you can do the deed yourself. - -If you would prefer that we NEVER try to install extra modules -automatically, select NO. (Usually you will want this set to YES.) - -If you would like to build modules to satisfy testing or prerequisites, -but not actually install them, select BUILD. - -NOTE: This feature requires you to flush the 'lib' cache for longer -running programs (refer to the CPANPLUS::Backend documentations for -more details). - -Otherwise, select ASK to have us ask your permission to install them. - - "); - - my $type = 'prereqs'; - - my @map = ( - [ PREREQ_IGNORE, # conf value - loc('No, do not install prerequisites'), # UI Value - loc("I won't install prerequisites") # diag message - ], - [ PREREQ_INSTALL, - loc('Yes, please install prerequisites'), - loc("I will install prerequisites") - ], - [ PREREQ_ASK, - loc('Ask me before installing a prerequisite'), - loc("I will ask permission to install") - ], - [ PREREQ_BUILD, - loc('Build prerequisites, but do not install them'), - loc( "I will only build, but not install prerequisites" ) - ], - ); - - my %reply = map { $_->[1] => $_->[0] } @map; # choice => value - my %diag = map { $_->[1] => $_->[2] } @map; # choice => diag message - my %conf = map { $_->[0] => $_->[1] } @map; # value => ui choice - - my $reply = $term->get_reply( - prompt => loc('Follow prerequisites?'), - default => $conf{ $conf->get_conf( $type ) }, - choices => [ @conf{ sort keys %conf } ], - ); - print "\n"; - - my $value = $reply{ $reply }; - my $diag = $diag{ $reply }; - - $conf->set_conf( $type => $value ); - print $diag, "\n"; - } - - { print loc(" -Modules in the CPAN archives are protected with md5 checksums. - -This requires the Perl module Digest::MD5 to be installed (which -CPANPLUS can do for you later); - - "); - my $type = 'md5'; - - my $yn = $term->ask_yn( - prompt => loc("Shall I use the MD5 checksums?"), - default => $conf->get_conf( $type ), - ); - - print $yn - ? loc("I will use the MD5 checksums if you have it") - : loc("I won't use the MD5 checksums"); - - $conf->set_conf( $type => $yn ); - - } - - - { ########################################### - ## sally sells seashells by the seashore ## - ########################################### - - print loc(" -By default CPANPLUS uses its own shell when invoked. If you would prefer -a different shell, such as one you have written or otherwise acquired, -please enter the full name for your shell module. - - "); - - my $type = 'shell'; - my $other = 'Other'; - my @choices = (qw| CPANPLUS::Shell::Default - CPANPLUS::Shell::Classic |, - $other ); - my $default = $conf->get_conf($type); - - unshift @choices, $default unless grep { $_ eq $default } @choices; - - my $reply = $term->get_reply( - prompt => loc('Which CPANPLUS shell do you want to use?'), - default => $default, - choices => \@choices, - ); - - if( $reply eq $other ) { - SHELL: { - $reply = $term->get_reply( - prompt => loc( 'Please enter the name of the shell '. - 'you wish to use: '), - ); - - unless( check_install( module => $reply ) ) { - print "\n", - loc("Could not find '$reply' in your path " . - "-- please try again"), - "\n"; - redo SHELL; - } - } - } - - print "\n", loc("Your shell is now: %1", $reply), "\n\n"; - - $conf->set_conf( $type => $reply ); - } - - { - ################### - ## use storable? ## - ################### - - print loc(" -To speed up the start time of CPANPLUS, and maintain a cache over -multiple runs, we can use Storable to freeze some information. -Would you like to do this? - -"); - my $type = 'storable'; - my $yn = $term->ask_yn( - prompt => loc("Use Storable?"), - default => $conf->get_conf( $type ) ? 1 : 0, - ); - print "\n"; - print $yn - ? loc("I will use Storable if you have it") - : loc("I will not use Storable"); - - $conf->set_conf( $type => $yn ); - } - - { - ################### - ## use sqlite ? ## - ################### - - print loc(" - -To limit the amount of RAM used by CPANPLUS, you can use the SQLite -source backend instead. Note that it is currently still experimental. -Would you like to do this? - -"); - my $type = 'source_engine'; - my $class = 'CPANPLUS::Internals::Source::SQLite'; - my $yn = $term->ask_yn( - prompt => loc("Use SQLite?"), - default => $conf->get_conf( $type ) eq $class ? 1 : 0, - ); - print "\n"; - print $yn - ? loc("I will use SQLite") - : loc("I will not use SQLite"); - - $conf->set_conf( $type => $class ); - } - - { - ################### - ## use cpantest? ## - ################### - - print loc(" -CPANPLUS has support for the Test::Reporter module, which can be utilized -to report success and failures of modules installed by CPANPLUS. Would -you like to do this? Note that you will still be prompted before -sending each report. - -If you don't have all the required modules installed yet, you should -consider installing '%1' - -This package bundles all the required modules to enable test reporting -and querying from CPANPLUS. -You can do so straight after this installation. - - ", 'Bundle::CPANPLUS::Test::Reporter'); - - my $type = 'cpantest'; - my $yn = $term->ask_yn( - prompt => loc('Report test results?'), - default => $conf->get_conf( $type ) ? 1 : 0, - ); - - print "\n"; - print $yn - ? loc("I will prompt you to report test results") - : loc("I won't prompt you to report test results"); - - $conf->set_conf( $type => $yn ); - } - - { - ################################### - ## use cryptographic signatures? ## - ################################### - - print loc(" -The Module::Signature extension allows CPAN authors to sign their -distributions using PGP signatures. Would you like to check for -module's cryptographic integrity before attempting to install them? -Note that this requires either the 'gpg' utility or Crypt::OpenPGP -to be installed. - - "); - my $type = 'signature'; - - my $yn = $term->ask_yn( - prompt => loc('Shall I check module signatures?'), - default => $conf->get_conf($type) ? 1 : 0, - ); - - print "\n"; - print $yn - ? loc("Ok, I will attempt to check module signatures.") - : loc("Ok, I won't attempt to check module signatures."); - - $conf->set_conf( $type => $yn ); - } - - return 1; -} - -sub _setup_hosts { - my $self = shift; - my $term = $self->term; - my $conf = $self->configure_object; - - - if( scalar @{ $conf->get_conf('hosts') } ) { - - my $hosts; - for my $href ( @{$conf->get_conf('hosts')} ) { - $hosts .= "\t$href->{scheme}://$href->{host}$href->{path}\n"; - } - - print loc(" -I see you already have some hosts selected: - -$hosts - -If you'd like to stick with your current settings, just select 'Yes'. -Otherwise, select 'No' and you can reconfigure your hosts - -"); - my $yn = $term->ask_yn( - prompt => loc("Would you like to keep your current hosts?"), - default => 'y', - ); - return 1 if $yn; - } - - my @hosts; - MAIN: { - - print loc(" -Now we need to know where your favorite CPAN sites are located. Make a -list of a few sites (just in case the first on the array won't work). - -If you are mirroring CPAN to your local workstation, specify a file: -URI by picking the CUSTOM option. - -Otherwise, let us fetch the official CPAN mirror list and you can pick -the mirror that suits you best from a list by using the MIRROR option; -First, pick a nearby continent and country. Then, you will be presented -with a list of URLs of CPAN mirrors in the country you selected. Select -one or more of those URLs. - -Note, the latter option requires a working net connection. - -You can select VIEW to see your current selection and QUIT when you -are done. - -"); - - my $reply = $term->get_reply( - prompt => loc('Please choose an option'), - choices => [qw|Mirror Custom View Quit|], - default => 'Mirror', - ); - - goto MIRROR if $reply eq 'Mirror'; - goto CUSTOM if $reply eq 'Custom'; - goto QUIT if $reply eq 'Quit'; - - $self->_view_hosts(@hosts) if $reply eq 'View'; - redo MAIN; - } - - my $mirror_file; - my $hosts; - MIRROR: { - $mirror_file ||= $self->_get_mirrored_by or return; - $hosts ||= $self->_parse_mirrored_by($mirror_file) or return; - - my ($continent, $country, $host) = $self->_guess_from_timezone( $hosts ); - - CONTINENT: { - my %seen; - my @choices = sort map { - $_->{'continent'} - } grep { - not $seen{$_->{'continent'}}++ - } values %$hosts; - push @choices, qw[Custom Up Quit]; - - my $reply = $term->get_reply( - prompt => loc('Pick a continent'), - default => $continent, - choices => \@choices, - ); - - goto MAIN if $reply eq 'Up'; - goto CUSTOM if $reply eq 'Custom'; - goto QUIT if $reply eq 'Quit'; - - $continent = $reply; - } - - COUNTRY: { - my %seen; - my @choices = sort map { - $_->{'country'} - } grep { - not $seen{$_->{'country'}}++ - } grep { - ($_->{'continent'} eq $continent) - } values %$hosts; - push @choices, qw[Custom Up Quit]; - - my $reply = $term->get_reply( - prompt => loc('Pick a country'), - default => $country, - choices => \@choices, - ); - - goto CONTINENT if $reply eq 'Up'; - goto CUSTOM if $reply eq 'Custom'; - goto QUIT if $reply eq 'Quit'; - - $country = $reply; - } - - HOST: { - my @list = grep { - $_->{'continent'} eq $continent and - $_->{'country'} eq $country - } values %$hosts; - - my %map; my $default; - for my $href (@list) { - for my $con ( @{$href->{'connections'}} ) { - next unless length $con->{'host'}; - - my $entry = $con->{'scheme'} . '://' . $con->{'host'}; - $default = $entry if $con->{'host'} eq $host; - - $map{$entry} = $con; - } - } - - CHOICE: { - - ### doesn't play nice with Term::UI :( - ### should make t::ui figure out pager opens - #$self->_pager_open; # host lists might be long - - print loc(" -You can enter multiple sites by separating them by a space. -For example: - 1 4 2 5 - "); - - my @reply = $term->get_reply( - prompt => loc('Please pick a site: '), - choices => [sort(keys %map), - qw|Custom View Up Quit|], - default => $default, - multi => 1, - ); - #$self->_pager_close; - - - goto COUNTRY if grep { $_ eq 'Up' } @reply; - goto CUSTOM if grep { $_ eq 'Custom' } @reply; - goto QUIT if grep { $_ eq 'Quit' } @reply; - - ### add the host, but only if it's not on the stack already ### - unless( grep { $_ eq 'View' } @reply ) { - for my $reply (@reply) { - if( grep { $_ eq $map{$reply} } @hosts ) { - print loc("Host '%1' already selected", $reply); - print "\n\n"; - } else { - push @hosts, $map{$reply} - } - } - } - - $self->_view_hosts(@hosts); - - goto QUIT if $self->autoreply; - redo CHOICE; - } - } - } - - CUSTOM: { - print loc(" -If there are any additional URLs you would like to use, please add them -now. You may enter them separately or as a space delimited list. - -We provide a default fall-back URL, but you are welcome to override it -with e.g. 'http://www.cpan.org/' if LWP, wget or curl is installed. - -(Enter a single space when you are done, or to simply skip this step.) - -Note that if you want to use a local depository, you will have to enter -as follows: - -file://server/path/to/cpan - -if the file is on a server on your local network or as: - -file:///path/to/cpan - -if the file is on your local disk. Note the three /// after the file: bit - -"); - - CHOICE: { - my $reply = $term->get_reply( - prompt => loc("Additionals host(s) to add: "), - default => '', - ); - - last CHOICE unless $reply =~ /\S/; - - my $href = $self->_parse_host($reply); - - if( $href ) { - push @hosts, $href - unless grep { - $href->{'scheme'} eq $_->{'scheme'} and - $href->{'host'} eq $_->{'host'} and - $href->{'path'} eq $_->{'path'} - } @hosts; - - last CHOICE if $self->autoreply; - } else { - print loc("Invalid uri! Please try again!"); - } - - $self->_view_hosts(@hosts); - - redo CHOICE; - } - - DONE: { - - print loc(" -Where would you like to go now? - -Please pick one of the following options or Quit when you are done - -"); - my $answer = $term->get_reply( - prompt => loc("Where to now?"), - default => 'Quit', - choices => [qw|Mirror Custom View Quit|], - ); - - if( $answer eq 'View' ) { - $self->_view_hosts(@hosts); - redo DONE; - } - - goto MIRROR if $answer eq 'Mirror'; - goto CUSTOM if $answer eq 'Custom'; - goto QUIT if $answer eq 'Quit'; - } - } - - QUIT: { - $conf->set_conf( hosts => \@hosts ); - - print loc(" -Your host configuration has been saved - -"); - } - - return 1; -} - -sub _view_hosts { - my $self = shift; - my @hosts = @_; - - print "\n\n"; - - if( scalar @hosts ) { - my $i = 1; - for my $host (@hosts) { - - ### show full path on file uris, otherwise, just show host - my $path = join '', ( - $host->{'scheme'} eq 'file' - ? ( ($host->{'host'} || '[localhost]'), - $host->{path} ) - : $host->{'host'} - ); - - printf "%-40s %30s\n", - loc("Selected %1",$host->{'scheme'} . '://' . $path ), - loc("%quant(%2,host) selected thus far.", $i); - $i++; - } - } else { - print loc("No hosts selected so far."); - } - - print "\n\n"; - - return 1; -} - -sub _get_mirrored_by { - my $self = shift; - my $cpan = $self->backend; - my $conf = $self->configure_object; - - print loc(" -Now, we are going to fetch the mirror list for first-time configurations. -This may take a while... - -"); - - ### use the new configuration ### - $cpan->configure_object( $conf ); - - load CPANPLUS::Module::Fake; - load CPANPLUS::Module::Author::Fake; - - my $mb = CPANPLUS::Module::Fake->new( - module => $conf->_get_source('hosts'), - path => '', - package => $conf->_get_source('hosts'), - author => CPANPLUS::Module::Author::Fake->new( - _id => $cpan->_id ), - _id => $cpan->_id, - ); - - my $file = $cpan->_fetch( fetchdir => $conf->get_conf('base'), - module => $mb ); - - return $file if $file; - return; -} - -sub _parse_mirrored_by { - my $self = shift; - my $file = shift; - - -s $file or return; - - my $fh = new FileHandle; - $fh->open("$file") - or ( - warn(loc('Could not open file "%1": %2', $file, $!)), - return - ); - - ### slurp the file in ### - { local $/; $file = <$fh> } - - ### remove comments ### - $file =~ s/#.*$//gm; - - $fh->close; - - ### sample host entry ### - # ftp.sun.ac.za: - # frequency = "daily" - # dst_ftp = "ftp://ftp.sun.ac.za/CPAN/CPAN/" - # dst_location = "Stellenbosch, South Africa, Africa (-26.1992 28.0564)" - # dst_organisation = "University of Stellenbosch" - # dst_timezone = "+2" - # dst_contact = "ftpadm@ftp.sun.ac.za" - # dst_src = "ftp.funet.fi" - # - # # dst_dst = "ftp://ftp.sun.ac.za/CPAN/CPAN/" - # # dst_contact = "mailto:ftpadm@ftp.sun.ac.za - # # dst_src = "ftp.funet.fi" - - ### host name as key, rest of the entry as value ### - my %hosts = $file =~ m/([a-zA-Z0-9\-\.]+):\s+((?:\w+\s+=\s+".*?"\s+)+)/gs; - - while (my($host,$data) = each %hosts) { - - my $href; - map { - s/^\s*//; - my @a = split /\s*=\s*/; - $a[1] =~ s/^"(.+?)"$/$1/g; - $href->{ pop @a } = pop @a; - } grep /\S/, split /\n/, $data; - - ($href->{city_area}, $href->{country}, $href->{continent}, - $href->{latitude}, $href->{longitude} ) = - $href->{dst_location} =~ - m/ - #Aizu-Wakamatsu, Tohoku-chiho, Fukushima - ^"?( - (?:[^,]+?)\s* # city - (?: - (?:,\s*[^,]+?)\s* # optional area - )*? # some have multiple areas listed - ) - - #Japan - ,\s*([^,]+?)\s* # country - - #Asia - ,\s*([^,]+?)\s* # continent - - # (37.4333 139.9821) - \((\S+)\s+(\S+?)\)"?$ # (latitude longitude) - /sx; - - ### parse the different hosts, store them in config format ### - my @list; - - for my $type (qw[dst_ftp dst_rsync dst_http]) { - my $path = $href->{$type}; - next unless $path =~ /\w/; - if ($type eq 'dst_rsync' && $path !~ /^rsync:/) { - $path =~ s{::}{/}; - $path = "rsync://$path/"; - } - my $parts = $self->_parse_host($path); - push @list, $parts; - } - - $href->{connections} = \@list; - $hosts{$host} = $href; - } - - return \%hosts; -} - -sub _parse_host { - my $self = shift; - my $host = shift; - - my @parts = $host =~ m|^(\w*)://([^/]*)(/.*)$|s; - - my $href; - for my $key (qw[scheme host path]) { - $href->{$key} = shift @parts; - } - - return if lc($href->{'scheme'}) ne 'file' and !$href->{'host'}; - return if !$href->{'path'}; - - return $href; -} - -## tries to figure out close hosts based on your timezone -## -## Currently can only report on unique items for each of zones, countries, and -## sites. In the future this will be combined with something else (perhaps a -## ping?) to narrow down multiple choices. -## -## Tries to return the best zone, country, and site for your location. Any non- -## unique items will be set to undef instead. -## -## (takes hashref, returns array) -## -sub _guess_from_timezone { - my $self = shift; - my $hosts = shift; - my (%zones, %countries, %sites); - - ### autrijus - build time zone table - my %freq_weight = ( - 'hourly' => 2400, - '4 times a day' => 400, - '4x daily' => 400, - 'daily' => 100, - 'twice daily' => 50, - 'weekly' => 15, - ); - - while (my ($site, $host) = each %{$hosts}) { - my ($zone, $continent, $country, $frequency) = - @{$host}{qw/dst_timezone continent country frequency/}; - - - # skip non-well-formed ones - next unless $continent and $country and $zone =~ /^[-+]?\d+(?::30)?/; - ### fix style - chomp $zone; - $zone =~ s/:30/.5/; - $zone =~ s/^\+//; - $zone =~ s/"//g; - - $zones{$zone}{$continent}++; - $countries{$zone}{$continent}{$country}++; - $sites{$zone}{$continent}{$country}{$site} = $freq_weight{$frequency}; - } - - use Time::Local; - my $offset = ((timegm(localtime) - timegm(gmtime)) / 3600); - - local $_; - - ## pick the entry with most country/site/frequency, one level each; - ## note it has to be sorted -- otherwise we're depending on the hash order. - ## also, the list context assignment (pick first one) is deliberate. - - my ($continent) = map { - (sort { ($_->{$b} <=> $_->{$a}) or $b cmp $a } keys(%{$_})) - } $zones{$offset}; - - my ($country) = map { - (sort { ($_->{$b} <=> $_->{$a}) or $b cmp $a } keys(%{$_})) - } $countries{$offset}{$continent}; - - my ($site) = map { - (sort { ($_->{$b} <=> $_->{$a}) or $b cmp $a } keys(%{$_})) - } $sites{$offset}{$continent}{$country}; - - return ($continent, $country, $site); -} # _guess_from_timezone - - -### big big regex, stolen to check if you enter a valid address -{ - my $RFC822PAT; # RFC pattern to match for valid email address - - sub _valid_email { - my $self = shift; - if (!$RFC822PAT) { - my $esc = '\\\\'; my $Period = '\.'; my $space = '\040'; - my $tab = '\t'; my $OpenBR = '\['; my $CloseBR = '\]'; - my $OpenParen = '\('; my $CloseParen = '\)'; my $NonASCII = '\x80-\xff'; - my $ctrl = '\000-\037'; my $CRlist = '\012\015'; - - my $qtext = qq/[^$esc$NonASCII$CRlist\"]/; - my $dtext = qq/[^$esc$NonASCII$CRlist$OpenBR$CloseBR]/; - my $quoted_pair = qq< $esc [^$NonASCII] >; # an escaped character - my $ctext = qq< [^$esc$NonASCII$CRlist()] >; - my $Cnested = qq< $OpenParen $ctext* (?: $quoted_pair $ctext* )* $CloseParen >; - my $comment = qq< $OpenParen $ctext* (?: (?: $quoted_pair | $Cnested ) $ctext* )* $CloseParen >; - my $X = qq< [$space$tab]* (?: $comment [$space$tab]* )* >; - my $atom_char = qq/[^($space)<>\@,;:\".$esc$OpenBR$CloseBR$ctrl$NonASCII]/; - my $atom = qq< $atom_char+ (?!$atom_char) >; - my $quoted_str = qq< \" $qtext * (?: $quoted_pair $qtext * )* \" >; - my $word = qq< (?: $atom | $quoted_str ) >; - my $domain_ref = $atom; - my $domain_lit = qq< $OpenBR (?: $dtext | $quoted_pair )* $CloseBR >; - my $sub_domain = qq< (?: $domain_ref | $domain_lit) $X >; - my $domain = qq< $sub_domain (?: $Period $X $sub_domain)* >; - my $route = qq< \@ $X $domain (?: , $X \@ $X $domain )* : $X >; - my $local_part = qq< $word $X (?: $Period $X $word $X )* >; - my $addr_spec = qq< $local_part \@ $X $domain >; - my $route_addr = qq[ < $X (?: $route )? $addr_spec > ]; - my $phrase_ctrl = '\000-\010\012-\037'; # like ctrl, but without tab - my $phrase_char = qq/[^()<>\@,;:\".$esc$OpenBR$CloseBR$NonASCII$phrase_ctrl]/; - my $phrase = qq< $word $phrase_char * (?: (?: $comment | $quoted_str ) $phrase_char * )* >; - $RFC822PAT = qq< $X (?: $addr_spec | $phrase $route_addr) >; - } - - return scalar ($_[0] =~ /$RFC822PAT/ox); - } -} - - - - - - -1; - - -sub _edit { - my $self = shift; - my $conf = $self->configure_object; - my $file = shift || $conf->_config_pm_to_file( $self->config_type ); - my $editor = shift || $conf->get_program('editor'); - my $term = $self->term; - - unless( $editor ) { - print loc(" -I'm sorry, I can't find a suitable editor, so I can't offer you -post-configuration editing of the config file - -"); - return 1; - } - - ### save the thing first, so there's something to edit - $self->_save; - - return !system("$editor $file"); -} - -sub _save { - my $self = shift; - my $conf = $self->configure_object; - - return $conf->save( $self->config_type ); -} - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist.pm deleted file mode 100644 index 51ee5fb9caa..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist.pm +++ /dev/null @@ -1,808 +0,0 @@ -package CPANPLUS::Dist; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; - -use Cwd (); -use Object::Accessor; -use Parse::CPAN::Meta; - -use IPC::Cmd qw[run]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load check_install]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -use base 'Object::Accessor'; - -local $Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -CPANPLUS::Dist - base class for plugins - -=head1 SYNOPSIS - - my $dist = CPANPLUS::Dist::YOUR_DIST_TYPE_HERE->new( - module => $modobj, - ); - -=head1 DESCRIPTION - -C is a base class for C -and C. Developers of other C -plugins should look at C. - -=head1 ACCESSORS - -=over 4 - -=item parent() - -Returns the C object that parented this object. - -=item status() - -Returns the C object that keeps the status for -this module. - -=back - -=head1 STATUS ACCESSORS - -All accessors can be accessed as follows: - $deb->status->ACCESSOR - -=over 4 - -=item created() - -Boolean indicating whether the dist was created successfully. -Explicitly set to C<0> when failed, so a value of C may be -interpreted as C. - -=item installed() - -Boolean indicating whether the dist was installed successfully. -Explicitly set to C<0> when failed, so a value of C may be -interpreted as C. - -=item uninstalled() - -Boolean indicating whether the dist was uninstalled successfully. -Explicitly set to C<0> when failed, so a value of C may be -interpreted as C. - -=item dist() - -The location of the final distribution. This may be a file or -directory, depending on how your distribution plug in of choice -works. This will be set upon a successful create. - -=cut - -=back - -=head2 $dist = CPANPLUS::Dist::YOUR_DIST_TYPE_HERE->new( module => MODOBJ ); - -Create a new C object based on the -provided C. - -*** DEPRECATED *** -The optional argument C is used to indicate what type of dist -you would like to create (like C or -C and so on ). - -C<< CPANPLUS::Dist->new >> is exclusively meant as a method to be -inherited by C. - -Returns a C object on success -and false on failure. - -=cut - -sub new { - my $self = shift; - my $class = ref $self || $self; - my %hash = @_; - - ### first verify we got a module object ### - my( $mod, $format ); - my $tmpl = { - module => { required => 1, allow => IS_MODOBJ, store => \$mod }, - ### for backwards compatibility - format => { default => $class, store => \$format, - allow => [ __PACKAGE__->dist_types ], - }, - }; - check( $tmpl, \%hash ) or return; - - unless( can_load( modules => { $format => '0.0' }, verbose => 1 ) ) { - error(loc("'%1' not found -- you need '%2' version '%3' or higher ". - "to detect plugins", $format, 'Module::Pluggable','2.4')); - return; - } - - ### get an empty o::a object for this class - my $obj = $format->SUPER::new; - - $obj->mk_accessors( qw[parent status] ); - - ### set the parent - $obj->parent( $mod ); - - ### create a status object ### - { my $acc = Object::Accessor->new; - $obj->status($acc); - - ### add minimum supported accessors - $acc->mk_accessors( qw[prepared created installed uninstalled - distdir dist] ); - } - - ### get the conf object ### - my $conf = $mod->parent->configure_object(); - - ### check if the format is available in this environment ### - if( $conf->_get_build('sanity_check') and not $obj->format_available ) { - error( loc( "Format '%1' is not available", $format) ); - return; - } - - ### now initialize it or admit failure - unless( $obj->init ) { - error(loc("Dist initialization of '%1' failed for '%2'", - $format, $mod->module)); - return; - } - - ### return the object - return $obj; -} - -=head2 @dists = CPANPLUS::Dist->dist_types; - -Returns a list of the CPANPLUS::Dist::* classes available - -=cut - -### returns a list of dist_types we support -### will get overridden by Module::Pluggable if loaded -### XXX add support for 'plugin' dir in config as well -{ my $Loaded; - my @Dists = (INSTALLER_MM); - my @Ignore = (); - - ### backdoor method to add more dist types - sub _add_dist_types { my $self = shift; push @Dists, @_ }; - - ### backdoor method to exclude dist types - sub _ignore_dist_types { my $self = shift; push @Ignore, @_ }; - sub _reset_dist_ignore { @Ignore = () }; - - ### locally add the plugins dir to @INC, so we can find extra plugins - #local @INC = @INC, File::Spec->catdir( - # $conf->get_conf('base'), - # $conf->_get_build('plugins') ); - - ### load any possible plugins - sub dist_types { - - if ( !$Loaded++ and check_install( module => 'Module::Pluggable', - version => '2.4') - ) { - require Module::Pluggable; - - my $only_re = __PACKAGE__ . '::\w+$'; - my %except = map { $_ => 1 } - INSTALLER_SAMPLE, - INSTALLER_BASE; - - Module::Pluggable->import( - sub_name => '_dist_types', - search_path => __PACKAGE__, - only => qr/$only_re/, - require => 1, - except => [ keys %except ] - ); - my %ignore = map { $_ => $_ } @Ignore; - - push @Dists, grep { not $ignore{$_} and not $except{$_} } - __PACKAGE__->_dist_types; - } - - return @Dists; - } - -=head2 $bool = CPANPLUS::Dist->rescan_dist_types; - -Rescans C<@INC> for available dist types. Useful if you've installed new -C classes and want to make them available to the -current process. - -=cut - - sub rescan_dist_types { - my $dist = shift; - $Loaded = 0; # reset the flag; - return $dist->dist_types; - } -} - -=head2 $bool = CPANPLUS::Dist->has_dist_type( $type ) - -Returns true if distribution type C<$type> is loaded/supported. - -=cut - -sub has_dist_type { - my $dist = shift; - my $type = shift or return; - - return scalar grep { $_ eq $type } CPANPLUS::Dist->dist_types; -} - -=head2 $bool = $dist->prereq_satisfied( modobj => $modobj, version => $version_spec ) - -Returns true if this prereq is satisfied. Returns false if it's not. -Also issues an error if it seems "unsatisfiable," i.e. if it can't be -found on CPAN or the latest CPAN version doesn't satisfy it. - -=cut - -sub prereq_satisfied { - my $dist = shift; - my $cb = $dist->parent->parent; - my %hash = @_; - - my($mod,$ver); - my $tmpl = { - version => { required => 1, store => \$ver }, - modobj => { required => 1, store => \$mod, allow => IS_MODOBJ }, - }; - - check( $tmpl, \%hash ) or return; - - return 1 if $mod->is_uptodate( version => $ver ); - - if ( $cb->_vcmp( $ver, $mod->version ) > 0 ) { - - error(loc( - "This distribution depends on %1, but the latest version". - " of %2 on CPAN (%3) doesn't satisfy the specific version". - " dependency (%4). You may have to resolve this dependency ". - "manually.", - $mod->module, $mod->module, $mod->version, $ver )); - - } - - return; -} - -=head2 $configure_requires = $dist->find_configure_requires( [file => /path/to/META.yml] ) - -Reads the configure_requires for this distribution from the META.yml or META.json -file in the root directory and returns a hashref with module names -and versions required. - -=cut - -sub find_configure_requires { - my $self = shift; - my $mod = $self->parent; - my %hash = @_; - - my ($meta); - my $href = {}; - - my $tmpl = { - file => { store => \$meta }, - }; - - check( $tmpl, \%hash ) or return; - - my $meth = 'configure_requires'; - - { - - ### the prereqs as we have them now - my @args = ( - defaults => $mod->status->$meth || {}, - ); - - my @possibles = do { defined $mod->status->extract - ? ( META_JSON->( $mod->status->extract ), - META_YML->( $mod->status->extract ) ) - : () - }; - - unshift @possibles, $meta if $meta; - - META: foreach my $mfile ( grep { -e } @possibles ) { - push @args, ( file => $mfile ); - if ( $mfile =~ /\.json/ ) { - $href = $self->_prereqs_from_meta_json( @args, keys => [ 'configure' ] ); - } - else { - $href = $self->_prereqs_from_meta_file( @args, keys => [ $meth ] ); - } - last META; - } - - } - - ### and store it in the module - $mod->status->$meth( $href ); - - return { %$href }; -} - -sub find_mymeta_requires { - my $self = shift; - my $mod = $self->parent; - my %hash = @_; - - my ($meta); - my $href = {}; - - my $tmpl = { - file => { store => \$meta }, - }; - - check( $tmpl, \%hash ) or return; - - my $meth = 'prereqs'; - - { - - ### the prereqs as we have them now - my @args = ( - defaults => $mod->status->$meth || {}, - ); - - my @possibles = do { defined $mod->status->extract - ? ( MYMETA_JSON->( $mod->status->extract ), - MYMETA_YML->( $mod->status->extract ) ) - : () - }; - - unshift @possibles, $meta if $meta; - - META: foreach my $mfile ( grep { -e } @possibles ) { - push @args, ( file => $mfile ); - if ( $mfile =~ /\.json/ ) { - $href = $self->_prereqs_from_meta_json( @args, - keys => [ qw|build test runtime| ] ); - } - else { - $href = $self->_prereqs_from_meta_file( @args, - keys => [ qw|build_requires requires| ] ); - } - last META; - } - - } - - ### and store it in the module - $mod->status->$meth( $href ); - - return { %$href }; -} - -sub _prereqs_from_meta_file { - my $self = shift; - my $mod = $self->parent; - my %hash = @_; - - my( $meta, $defaults, $keys ); - my $tmpl = { ### check if we have an extract path. if not, we - ### get 'undef value' warnings from file::spec - file => { default => do { defined $mod->status->extract - ? META_YML->( $mod->status->extract ) - : '' }, - store => \$meta, - }, - defaults => { required => 1, default => {}, strict_type => 1, - store => \$defaults }, - keys => { required => 1, default => [], strict_type => 1, - store => \$keys }, - }; - - check( $tmpl, \%hash ) or return; - - ### if there's a meta file, we read it; - if( -e $meta ) { - - ### Parse::CPAN::Meta uses exceptions for errors - ### hash returned in list context!!! - - local $ENV{PERL_JSON_BACKEND}; - - my ($doc) = eval { Parse::CPAN::Meta::LoadFile( $meta ) }; - - unless( $doc ) { - error(loc( "Could not read %1: '%2'", $meta, $@ )); - return $defaults; - } - - ### read the keys now, make sure not to throw - ### away anything that was already added - for my $key ( @$keys ) { - $defaults = { - %$defaults, - %{ $doc->{$key} }, - } if $doc->{ $key }; - } - } - - ### and return a copy - return \%{ $defaults }; -} - -sub _prereqs_from_meta_json { - my $self = shift; - my $mod = $self->parent; - my %hash = @_; - - my( $meta, $defaults, $keys ); - my $tmpl = { ### check if we have an extract path. if not, we - ### get 'undef value' warnings from file::spec - file => { default => do { defined $mod->status->extract - ? META_JSON->( $mod->status->extract ) - : '' }, - store => \$meta, - }, - defaults => { required => 1, default => {}, strict_type => 1, - store => \$defaults }, - keys => { required => 1, default => [], strict_type => 1, - store => \$keys }, - }; - - check( $tmpl, \%hash ) or return; - - ### if there's a meta file, we read it; - if( -e $meta ) { - - ### Parse::CPAN::Meta uses exceptions for errors - ### hash returned in list context!!! - - local $ENV{PERL_JSON_BACKEND}; - - my ($doc) = eval { Parse::CPAN::Meta->load_file( $meta ) }; - - unless( $doc ) { - error(loc( "Could not read %1: '%2'", $meta, $@ )); - return $defaults; - } - - ### read the keys now, make sure not to throw - ### away anything that was already added - #for my $key ( @$keys ) { - # $defaults = { - # %$defaults, - # %{ $doc->{$key} }, - # } if $doc->{ $key }; - #} - my $prereqs = $doc->{prereqs} || {}; - for my $key ( @$keys ) { - $defaults = { - %$defaults, - %{ $prereqs->{$key}->{requires} }, - } if $prereqs->{ $key }->{requires}; - } - } - - ### and return a copy - return \%{ $defaults }; -} - -=head2 $bool = $dist->_resolve_prereqs( ... ) - -Makes sure prerequisites are resolved - - format The dist class to use to make the prereqs - (ie. CPANPLUS::Dist::MM) - - prereqs Hash of the prerequisite modules and their versions - - target What to do with the prereqs. - create => Just build them - install => Install them - ignore => Ignore them - - prereq_build If true, always build the prereqs even if already - resolved - - verbose Be verbose - - force Force the prereq to be built, even if already resolved - -=cut - -sub _resolve_prereqs { - my $dist = shift; - my $self = $dist->parent; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my ($prereqs, $format, $verbose, $target, $force, $prereq_build,$tolerant); - my $tmpl = { - ### XXX perhaps this should not be required, since it may not be - ### packaged, just installed... - ### Let it be empty as well -- that means the $modobj->install - ### routine will figure it out, which is fine if we didn't have any - ### very specific wishes (it will even detect the favourite - ### dist_type). - format => { required => 1, store => \$format, - allow => ['',__PACKAGE__->dist_types], }, - prereqs => { required => 1, default => { }, - strict_type => 1, store => \$prereqs }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - force => { default => $conf->get_conf('force'), - store => \$force }, - ### make sure allow matches with $mod->install's list - target => { default => '', store => \$target, - allow => ['',qw[create ignore install]] }, - prereq_build => { default => 0, store => \$prereq_build }, - tolerant => { default => $conf->get_conf('allow_unknown_prereqs'), - store => \$tolerant }, - }; - - check( $tmpl, \%hash ) or return; - - ### so there are no prereqs? then don't even bother - return 1 unless keys %$prereqs; - - ### Make sure we wound up where we started. - my $original_wd = Cwd::cwd; - - ### so you didn't provide an explicit target. - ### maybe your config can tell us what to do. - $target ||= { - PREREQ_ASK, TARGET_INSTALL, # we'll bail out if the user says no - PREREQ_BUILD, TARGET_CREATE, - PREREQ_IGNORE, TARGET_IGNORE, - PREREQ_INSTALL, TARGET_INSTALL, - }->{ $conf->get_conf('prereqs') } || ''; - - ### XXX BIG NASTY HACK XXX FIXME at some point. - ### when installing Bundle::CPANPLUS::Dependencies, we want to - ### install all packages matching 'cpanplus' to be installed last, - ### as all CPANPLUS' prereqs are being installed as well, but are - ### being loaded for bootstrapping purposes. This means CPANPLUS - ### can find them, but for example cpanplus::dist::build won't, - ### which gets messy FAST. So, here we sort our prereqs only IF - ### the parent module is Bundle::CPANPLUS::Dependencies. - ### Really, we would wnat some sort of sorted prereq mechanism, - ### but Bundle:: doesn't support it, and we flatten everything - ### to a hash internally. A sorted hash *might* do the trick if - ### we got a transparent implementation.. that would mean we would - ### just have to remove the 'sort' here, and all will be well - my @sorted_prereqs; - - ### use regex, could either be a module name, or a package name - if( $self->module =~ /^Bundle(::|-)CPANPLUS(::|-)Dependencies/ ) { - my (@first, @last); - for my $mod ( sort keys %$prereqs ) { - $mod =~ /CPANPLUS/ - ? push @last, $mod - : push @first, $mod; - } - @sorted_prereqs = (@first, @last); - } else { - @sorted_prereqs = sort keys %$prereqs; - } - - ### first, transfer this key/value pairing into a - ### list of module objects + desired versions - my @install_me; - - my $flag; - - for my $mod ( @sorted_prereqs ) { - ( my $version = $prereqs->{$mod} ) =~ s#[^0-9\._]+##g; - - ### 'perl' is a special case, there's no mod object for it - if( $mod eq PERL_CORE ) { - - unless( $cb->_vcmp( sprintf('v%vd',$^V), $version ) >= 0 ) { - error(loc( "Module '%1' needs perl version '%2', but you ". - "only have version '%3' -- can not proceed", - $self->module, $version, - $cb->_perl_version( perl => $^X ) ) ); - return; - } - - next; - } - - my $modobj = $cb->module_tree($mod); - - #### XXX we ignore the version, and just assume that the latest - #### version from cpan will meet your requirements... dodgy =/ - unless( $modobj ) { - # Check if it is a core module - my $sub = CPANPLUS::Module->can( - 'module_is_supplied_with_perl_core' ); - my $core = $sub->( $mod ); - unless ( defined $core ) { - error( loc( "No such module '%1' found on CPAN", $mod ) ); - $flag++ unless $tolerant; - next; - } - if ( $cb->_vcmp( $version, $core ) > 0 ) { - error(loc( "Version of core module '%1' ('%2') is too low for ". - "'%3' (needs '%4') -- carrying on but this may be a problem", - $mod, $core, - $self->module, $version )); - } - next; - } - - ### it's not uptodate, we need to install it - if( !$dist->prereq_satisfied(modobj => $modobj, version => $version)) { - msg(loc("Module '%1' requires '%2' version '%3' to be installed ", - $self->module, $modobj->module, $version), $verbose ); - - push @install_me, [$modobj, $version]; - - ### it's not an MM or Build format, that means it's a package - ### manager... we'll need to install it as well, via the PM - } elsif ( INSTALL_VIA_PACKAGE_MANAGER->($format) and - !$modobj->package_is_perl_core and - ($target ne TARGET_IGNORE) - ) { - msg(loc("Module '%1' depends on '%2', may need to build a '%3' ". - "package for it as well", $self->module, $modobj->module, - $format)); - push @install_me, [$modobj, $version]; - } - } - - - - ### so you just want to ignore prereqs? ### - if( $target eq TARGET_IGNORE ) { - - ### but you have modules you need to install - if( @install_me ) { - msg(loc("Ignoring prereqs, this may mean your install will fail"), - $verbose); - msg(loc("'%1' listed the following dependencies:", $self->module), - $verbose); - - for my $aref (@install_me) { - my ($mod,$version) = @$aref; - - my $str = sprintf "\t%-35s %8s\n", $mod->module, $version; - msg($str,$verbose); - } - - return; - - ### ok, no problem, you have all needed prereqs anyway - } else { - return 1; - } - } - - for my $aref (@install_me) { - my($modobj,$version) = @$aref; - - ### another prereq may have already installed this one... - ### so dont ask again if the module turns out to be uptodate - ### see bug [#11840] - ### if either force or prereq_build are given, the prereq - ### should be built anyway - next if (!$force and !$prereq_build) && - $dist->prereq_satisfied(modobj => $modobj, version => $version); - - ### either we're told to ignore the prereq, - ### or the user wants us to ask him - if( ( $conf->get_conf('prereqs') == PREREQ_ASK and not - $cb->_callbacks->install_prerequisite->($self, $modobj) - ) - ) { - msg(loc("Will not install prerequisite '%1' -- Note " . - "that the overall install may fail due to this", - $modobj->module), $verbose); - next; - } - - ### value set and false -- means failure ### - if( defined $modobj->status->installed - && !$modobj->status->installed - ) { - error( loc( "Prerequisite '%1' failed to install before in " . - "this session", $modobj->module ) ); - $flag++; - last; - } - - ### part of core? - if( $modobj->package_is_perl_core ) { - error(loc("Prerequisite '%1' is perl-core (%2) -- not ". - "installing that. -- Note that the overall ". - "install may fail due to this.", - $modobj->module, $modobj->package ) ); - next; - } - - ### circular dependency code ### - my $pending = $cb->_status->pending_prereqs || {}; - - ### recursive dependency ### - if ( $pending->{ $modobj->module } ) { - error( loc( "Recursive dependency detected (%1) -- skipping", - $modobj->module ) ); - next; - } - - ### register this dependency as pending ### - $pending->{ $modobj->module } = $modobj; - $cb->_status->pending_prereqs( $pending ); - - ### call $modobj->install rather than doing - ### CPANPLUS::Dist->new and the like ourselves, - ### since ->install will take care of fetch && - ### extract as well - my $pa = $dist->status->_prepare_args || {}; - my $ca = $dist->status->_create_args || {}; - my $ia = $dist->status->_install_args || {}; - - unless( $modobj->install( %$pa, %$ca, %$ia, - force => $force, - verbose => $verbose, - format => $format, - target => $target ) - ) { - error(loc("Failed to install '%1' as prerequisite " . - "for '%2'", $modobj->module, $self->module ) ); - $flag++; - } - - ### unregister the pending dependency ### - $pending->{ $modobj->module } = 0; - $cb->_status->pending_prereqs( $pending ); - - last if $flag; - - ### don't want us to install? ### - if( $target ne TARGET_INSTALL ) { - my $dir = $modobj->status->extract - or error(loc("No extraction dir for '%1' found ". - "-- weird", $modobj->module)); - - $modobj->add_to_includepath(); - - next; - } - } - - ### reset the $prereqs iterator, in case we bailed out early ### - keys %$prereqs; - - ### chdir back to where we started - $cb->_chdir( dir => $original_wd ); - - return 1 unless $flag; - return; -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Autobundle.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Autobundle.pm deleted file mode 100644 index d5e45f3eca0..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Autobundle.pm +++ /dev/null @@ -1,120 +0,0 @@ -package CPANPLUS::Dist::Autobundle; -use deprecate; - -use strict; -use warnings; -use CPANPLUS::Error qw[error msg]; -use Params::Check qw[check]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -use base qw[CPANPLUS::Dist::Base]; - -=head1 NAME - -CPANPLUS::Dist::Autobundle - distribution class for installation snapshots - -=head1 SYNOPSIS - - $modobj = $cb->parse_module( module => 'file://path/to/Snapshot_XXYY.pm' ); - $modobj->install; - -=head1 DESCRIPTION - -C is a distribution class for installing installation -snapshots as created by C' C command. - -All modules as mentioned in the snapshot will be installed on your system. - -=cut - -sub init { - my $dist = shift; - my $status = $dist->status; - - $status->mk_accessors( - qw[prepared created installed _prepare_args _create_args _install_args] - ); - - return 1; -} - -sub prepare { - my $dist = shift; - my %args = @_; - - ### store the arguments, so ->install can use them in recursive loops ### - $dist->status->_prepare_args( \%args ); - - return $dist->status->prepared( 1 ); -} - -sub create { - my $dist = shift; - my $self = $dist->parent; - - ### we're also the cpan_dist, since we don't need to have anything - ### prepared - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my( $force, $verbose, $prereq_target, $prereq_format, $prereq_build); - - my $args = do { - local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - prereq_target => { default => '', store => \$prereq_target }, - - ### don't set the default prereq format to 'makemaker' -- wrong! - prereq_format => { #default => $self->status->installer_type, - default => '', - store => \$prereq_format }, - prereq_build => { default => 0, store => \$prereq_build }, - }; - - check( $tmpl, \%hash ) or return; - }; - - ### maybe we already ran a create on this object? ### - return 1 if $dist->status->created && !$force; - - ### store the arguments, so ->install can use them in recursive loops ### - $dist->status->_create_args( \%hash ); - - msg(loc("Resolving prerequisites mentioned in the bundle"), $verbose); - - ### this will set the directory back to the start - ### dir, so we must chdir /again/ - my $ok = $dist->_resolve_prereqs( - format => $prereq_format, - verbose => $verbose, - prereqs => $self->status->prereqs, - target => $prereq_target, - force => $force, - prereq_build => $prereq_build, - ); - - ### if all went well, mark it & return - return $dist->status->created( $ok ? 1 : 0); -} - -sub install { - my $dist = shift; - my %args = @_; - - ### store the arguments, so ->install can use them in recursive loops ### - $dist->status->_install_args( \%args ); - - return $dist->status->installed( 1 ); -} - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Base.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Base.pm deleted file mode 100644 index 73736d9e4da..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Base.pm +++ /dev/null @@ -1,261 +0,0 @@ -package CPANPLUS::Dist::Base; -use deprecate; - -use strict; - -use base qw[CPANPLUS::Dist]; -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -=head1 NAME - -CPANPLUS::Dist::Base - Base class for custom distribution classes - -=head1 SYNOPSIS - - package CPANPLUS::Dist::MY_IMPLEMENTATION - - use base 'CPANPLUS::Dist::Base'; - - sub prepare { - my $dist = shift; - - ### do the 'standard' things - $dist->SUPER::prepare( @_ ) or return; - - ### do MY_IMPLEMENTATION specific things - ... - - ### don't forget to set the status! - return $dist->status->prepared( $SUCCESS ? 1 : 0 ); - } - - -=head1 DESCRIPTION - -CPANPLUS::Dist::Base functions as a base class for all custom -distribution implementations. It does all the mundane work -CPANPLUS would have done without a custom distribution, so you -can override just the parts you need to make your own implementation -work. - -=head1 FLOW - -Below is a brief outline when and in which order methods in this -class are called: - - $Class->format_available; # can we use this class on this system? - - $dist->init; # set up custom accessors, etc - $dist->prepare; # find/write meta information - $dist->create; # write the distribution file - $dist->install; # install the distribution file - - $dist->uninstall; # remove the distribution (OPTIONAL) - -=head1 METHODS - -=cut - -=head2 @subs = $Class->methods - -Returns a list of methods that this class implements that you can -override. - -=cut - -sub methods { - return qw[format_available init prepare create install uninstall] -} - -=head2 $bool = $Class->format_available - -This method is called when someone requests a module to be installed -via the superclass. This gives you the opportunity to check if all -the needed requirements to build and install this distribution have -been met. - -For example, you might need a command line program, or a certain perl -module installed to do your job. Now is the time to check. - -Simply return true if the request can proceed and false if it can not. - -The C implementation always returns true. - -=cut - -sub format_available { return 1 } - - -=head2 $bool = $dist->init - -This method is called just after the new dist object is set up and -before the C method is called. This is the time to set up -the object so it can be used with your class. - -For example, you might want to add extra accessors to the C -object, which you might do as follows: - - $dist->status->mk_accessors( qw[my_implementation_accessor] ); - -The C object is implemented as an instance of the -C class. Please refer to its documentation for -details. - -Return true if the initialization was successful, and false if it was -not. - -The C implementation does not alter your object -and always returns true. - -=cut - -sub init { return 1; } - -=head2 $bool = $dist->prepare - -This runs the preparation step of your distribution. This step is meant -to set up the environment so the C step can create the actual -distribution(file). -A C call in the standard C distribution -would, for example, run C to find the dependencies -for a distribution. For a C distribution, this is where you -would write all the metafiles required for the C tools. - -The C implementation simply calls the underlying -distribution class (Typically C or -C). - -Sets C<< $dist->status->prepared >> to the return value of this function. -If you override this method, you should make sure to set this value. - -=cut - -sub prepare { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - my $dist_cpan = $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - - $dist->status->prepared( $dist_cpan->prepare( @_ ) ); -} - -=head2 $bool = $dist->create - -This runs the creation step of your distribution. This step is meant -to follow up on the C call, that set up your environment so -the C step can create the actual distribution(file). -A C call in the standard C distribution -would, for example, run C and C to build and test -a distribution. For a C distribution, this is where you -would create the actual C<.deb> file using C. - -The C implementation simply calls the underlying -distribution class (Typically C or -C). - -Sets C<< $dist->status->dist >> to the location of the created -distribution. -If you override this method, you should make sure to set this value. - -Sets C<< $dist->status->created >> to the return value of this function. -If you override this method, you should make sure to set this value. - -=cut - -sub create { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - my $dist_cpan = $self->status->dist_cpan; - $dist = $self->status->dist if $self->status->dist; - $self->status->dist( $dist ) unless $self->status->dist; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my $format = ref $dist; - - ### make sure to set this variable, if the caller hasn't yet - ### just so we have some clue where the dist left off. - $dist->status->dist( $dist_cpan->status->distdir ) - unless defined $dist->status->dist; - - $dist->status->created( $dist_cpan->create(prereq_format => $format, @_) ); -} - -=head2 $bool = $dist->install - -This runs the install step of your distribution. This step is meant -to follow up on the C call, which prepared a distribution(file) -to install. -A C call in the standard C distribution -would, for example, run C to copy the distribution files -to their final destination. For a C distribution, this is where -you would run C on the created C<.deb> file. - -The C implementation simply calls the underlying -distribution class (Typically C or -C). - -Sets C<< $dist->status->installed >> to the return value of this function. -If you override this method, you should make sure to set this value. - -=cut - -sub install { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - my $dist_cpan = $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - - $dist->status->installed( $dist_cpan->install( @_ ) ); -} - -=head2 $bool = $dist->uninstall - -This runs the uninstall step of your distribution. This step is meant -to remove the distribution from the file system. -A C call in the standard C distribution -would, for example, run C to remove the distribution -files the file system. For a C distribution, this is where you -would run C. - -The C implementation simply calls the underlying -distribution class (Typically C or -C). - -Sets C<< $dist->status->uninstalled >> to the return value of this function. -If you override this method, you should make sure to set this value. - -=cut - -sub uninstall { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - my $dist_cpan = $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - - $dist->status->uninstalled( $dist_cpan->uninstall( @_ ) ); -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build.pm deleted file mode 100644 index d938749c825..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build.pm +++ /dev/null @@ -1,879 +0,0 @@ -package CPANPLUS::Dist::Build; - -use if $] > 5.017, 'deprecate'; - -use strict; -use warnings; -use vars qw[@ISA $STATUS $VERSION]; -@ISA = qw[CPANPLUS::Dist]; - -use CPANPLUS::Internals::Constants; - -### these constants were exported by CPANPLUS::Internals::Constants -### in previous versions.. they do the same though. If we want to have -### a normal 'use' here, up the dependency to CPANPLUS 0.056 or higher -BEGIN { - require CPANPLUS::Dist::Build::Constants; - CPANPLUS::Dist::Build::Constants->import() - if not __PACKAGE__->can('BUILD') && __PACKAGE__->can('BUILD_DIR'); -} - -use CPANPLUS::Error; - -use Config; -use FileHandle; -use Cwd; -use version; - -use IPC::Cmd qw[run]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load check_install]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -local $Params::Check::VERBOSE = 1; - -$VERSION = '0.70'; - -=pod - -=head1 NAME - -CPANPLUS::Dist::Build - CPANPLUS plugin to install packages that use Build.PL - -=head1 SYNOPSIS - - my $build = CPANPLUS::Dist->new( - format => 'CPANPLUS::Dist::Build', - module => $modobj, - ); - - $build->prepare; # runs Build.PL - $build->create; # runs build && build test - $build->install; # runs build install - - -=head1 DESCRIPTION - -C is a distribution class for C -related modules. -Using this package, you can create, install and uninstall perl -modules. It inherits from C. - -Normal users won't have to worry about the interface to this module, -as it functions transparently as a plug-in to C and will -just C when it's loaded. - -=head1 ACCESSORS - -=over 4 - -=item C - -Returns the C object that parented this object. - -=item C - -Returns the C object that keeps the status for -this module. - -=back - -=head1 STATUS ACCESSORS - -All accessors can be accessed as follows: - $build->status->ACCESSOR - -=over 4 - -=item C - -Location of the Build file. -Set to 0 explicitly if something went wrong. - -=item C - -BOOL indicating if the C command was successful. - -=item C - -BOOL indicating if the C command was successful. - -=item C - -BOOL indicating if the C call exited successfully -This gets set after C - -=item C - -Full path to the directory in which the C call took place, -set after a call to C. - -=item C - -BOOL indicating if the C call exited successfully. This gets -set after C and C. - -=item C - -BOOL indicating if the module was installed. This gets set after -C exits successfully. - -=item uninstalled () - -BOOL indicating if the module was uninstalled properly. - -=item C<_create_args ()> - -Storage of the arguments passed to C for this object. Used -for recursive calls when satisfying prerequisites. - -=item C<_install_args ()> - -Storage of the arguments passed to C for this object. Used -for recursive calls when satisfying prerequisites. - -=back - -=cut - -=head1 METHODS - -=head2 $bool = CPANPLUS::Dist::Build->format_available(); - -Returns a boolean indicating whether or not you can use this package -to create and install modules in your environment. - -=cut - -### check if the format is available ### -sub format_available { - my $mod = 'Module::Build'; - unless( can_load( modules => { $mod => '0.2611' }, nocache => 1 ) ) { - error( loc( "You do not have '%1' -- '%2' not available", - $mod, __PACKAGE__ ) ); - return; - } - - return 1; -} - - -=head2 $bool = $dist->init(); - -Sets up the C object for use. -Effectively creates all the needed status accessors. - -Called automatically whenever you create a new C object. - -=cut - -sub init { - my $dist = shift; - my $status = $dist->status; - - $status->mk_accessors(qw[build_pl build test created installed uninstalled - _create_args _install_args _prepare_args - _mb_object _buildflags - ]); - - ### just in case 'format_available' didn't get called - require Module::Build; - - return 1; -} - -=pod - -=head2 $bool = $dist->prepare([perl => '/path/to/perl', buildflags => 'EXTRA=FLAGS', force => BOOL, verbose => BOOL]) - -C prepares a distribution, running C -and establishing any prerequisites this -distribution has. - -The variable C will be set to the full path -of the C that is being executed. This enables any code inside -the C to know that it is being installed via CPANPLUS. - -After a successful C you may call C to create the -distribution, followed by C to actually install it. - -Returns true on success and false on failure. - -=cut - -sub prepare { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - - ### we're also the cpan_dist, since we don't need to have anything - ### prepared from another installer - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my $args; - my( $force, $verbose, $buildflags, $perl, $prereq_target, $prereq_format, - $prereq_build ); - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - perl => { default => $^X, store => \$perl }, - buildflags => { default => $conf->get_conf('buildflags'), - store => \$buildflags }, - prereq_target => { default => '', store => \$prereq_target }, - prereq_format => { default => '', - store => \$prereq_format }, - prereq_build => { default => 0, store => \$prereq_build }, - }; - - $args = check( $tmpl, \%hash ) or return; - } - - return 1 if $dist->status->prepared && !$force; - - $dist->status->_prepare_args( $args ); - - ### chdir to work directory ### - my $orig = cwd(); - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - ### by now we've loaded module::build, and we're using the API, so - ### it's safe to remove CPANPLUS::inc from our inc path, especially - ### because it can trip up tests run under taint (just like EU::MM). - ### turn off our PERL5OPT so no modules from CPANPLUS::inc get - ### included in make test -- it should build without. - ### also, modules that run in taint mode break if we leave - ### our code ref in perl5opt - ### XXX we've removed the ENV settings from cp::inc, so only need - ### to reset the @INC - #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt; - #local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib; - #local @INC = CPANPLUS::inc->original_inc; - - ### this will generate warnings under anything lower than M::B 0.2606 - my @buildflags = $dist->_buildflags_as_list( $buildflags ); - $dist->status->_buildflags( $buildflags ); - - my $fail; my $prereq_fail; - my $status = { }; - RUN: { - # 0.85_01 - ### we resolve 'configure requires' here, so we can run the 'perl - ### Makefile.PL' command - ### XXX for tests: mock f_c_r to something that *can* resolve and - ### something that *doesn't* resolve. Check the error log for ok - ### on this step or failure - ### XXX make a separate tarball to test for this scenario: simply - ### containing a makefile.pl/build.pl for test purposes? - my $safe_ver = version->new('0.85_01'); - if ( version->new($CPANPLUS::Internals::VERSION) >= $safe_ver ) - { my $configure_requires = $dist->find_configure_requires; - my $ok = $dist->_resolve_prereqs( - format => $prereq_format, - verbose => $verbose, - prereqs => $configure_requires, - target => $prereq_target, - force => $force, - prereq_build => $prereq_build, - ); - - unless( $ok ) { - - #### use $dist->flush to reset the cache ### - error( loc( "Unable to satisfy '%1' for '%2' " . - "-- aborting install", - 'configure_requires', $self->module ) ); - $dist->status->prepared(0); - $prereq_fail++; - $fail++; - last RUN; - } - ### end of prereq resolving ### - } - - # Wrap the exception that may be thrown here (should likely be - # done at a much higher level). - my $prep_output; - - my $env = ENV_CPANPLUS_IS_EXECUTING; - local $ENV{$env} = BUILD_PL->( $dir ); - my @run_perl = ( '-e', CPDB_PERL_WRAPPER ); - my $cmd = [$perl, @run_perl, BUILD_PL->($dir), @buildflags]; - - unless ( scalar run( command => $cmd, - buffer => \$prep_output, - verbose => $verbose ) - ) { - error( loc( "Build.PL failed: %1", $prep_output ) ); - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'prepare'; - $status->{capture} = $prep_output; - } - $fail++; last RUN; - } - - unless ( BUILD->( $dir ) ) { - error( loc( "Build.PL failed to generate a Build script: %1", $prep_output ) ); - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'prepare'; - $status->{capture} = $prep_output; - } - $fail++; last RUN; - } - - msg( $prep_output, 0 ); - - my $prereqs = $self->status->prereqs; - - $prereqs ||= $dist->_find_prereqs( verbose => $verbose, - dir => $dir, - perl => $perl, - buildflags => $buildflags ); - - } - - ### send out test report? ### - if( $fail and $conf->get_conf('cpantest') and not $prereq_fail ) { - $cb->_send_report( - module => $self, - failed => $fail, - buffer => CPANPLUS::Error->stack_as_string, - status => $status, - verbose => $verbose, - force => $force, - ) or error(loc("Failed to send test report for '%1'", - $self->module ) ); - } - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir back to start dir '%1'", $orig ) ); - } - - ### save where we wrote this stuff -- same as extract dir in normal - ### installer circumstances - $dist->status->distdir( $self->status->extract ); - - return $dist->status->prepared( $fail ? 0 : 1 ); -} - -sub _find_prereqs { - my $dist = shift; - my $self = $dist->parent; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my ($verbose, $dir, $buildflags, $perl); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - dir => { default => $self->status->extract, store => \$dir }, - perl => { default => $^X, store => \$perl }, - buildflags => { default => $conf->get_conf('buildflags'), - store => \$buildflags }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my $prereqs = {}; - - $prereqs = $dist->find_mymeta_requires() - if $dist->can('find_mymeta_requires'); - - if ( keys %$prereqs ) { - # Ugly hack - } - else { - my $safe_ver = version->new('0.31_03'); - my $content; - PREREQS: { - if ( version->new( $Module::Build::VERSION ) >= $safe_ver and IPC::Cmd->can_capture_buffer ) { - my @buildflags = $dist->_buildflags_as_list( $buildflags ); - - # Use the new Build action 'prereq_data' - my @run_perl = ( '-e', CPDB_PERL_WRAPPER ); - - unless ( scalar run( command => [$perl, @run_perl, BUILD->($dir), 'prereq_data', @buildflags], - buffer => \$content, - verbose => 0 ) - ) { - error( loc( "Build 'prereq_data' failed: %1 %2", $!, $content ) ); - #return; - } - else { - last PREREQS; - } - - } - - my $file = File::Spec->catfile( $dir, '_build', 'prereqs' ); - return unless -f $file; - - my $fh = FileHandle->new(); - - unless( $fh->open( $file ) ) { - error( loc( "Cannot open '%1': %2", $file, $! ) ); - return; - } - - $content = do { local $/; <$fh> }; - - } - - return unless $content; - my $bphash = eval $content; - return unless $bphash and ref $bphash eq 'HASH'; - foreach my $type ('requires', 'build_requires') { - next unless $bphash->{$type} and ref $bphash->{$type} eq 'HASH'; - $prereqs->{$_} = $bphash->{$type}->{$_} for keys %{ $bphash->{$type} }; - } - } - - { - delete $prereqs->{'perl'} - unless version->new($CPANPLUS::Internals::VERSION) - >= version->new('0.9102'); - } - - ### allows for a user defined callback to filter the prerequisite - ### list as they see fit, to remove (or add) any prereqs they see - ### fit. The default installed callback will return the hashref in - ### an unmodified form - ### this callback got added after cpanplus 0.0562, so use a 'can' - ### to find out if it's supported. For older versions, we'll just - ### return the hashref as is ourselves. - my $href = $cb->_callbacks->can('filter_prereqs') - ? $cb->_callbacks->filter_prereqs->( $cb, $prereqs ) - : $prereqs; - - $self->status->prereqs( $href ); - - ### make sure it's not the same ref - return { %$href }; -} - -=pod - -=head2 $dist->create([perl => '/path/to/perl', buildflags => 'EXTRA=FLAGS', prereq_target => TARGET, force => BOOL, verbose => BOOL, skiptest => BOOL]) - -C preps a distribution for installation. This means it will -run C and C. -This will also satisfy any prerequisites the module may have. - -If you set C to true, it will skip the C stage. -If you set C to true, it will go over all the stages of the -C process again, ignoring any previously cached results. It -will also ignore a bad return value from C and still allow -the operation to return true. - -Returns true on success and false on failure. - -You may then call C<< $dist->install >> on the object to actually -install it. - -=cut - -sub create { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - - ### we're also the cpan_dist, since we don't need to have anything - ### prepared from another installer - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my $args; - my( $force, $verbose, $buildflags, $skiptest, $prereq_target, - $perl, $prereq_format, $prereq_build); - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - perl => { default => $^X, store => \$perl }, - buildflags => { default => $conf->get_conf('buildflags'), - store => \$buildflags }, - skiptest => { default => $conf->get_conf('skiptest'), - store => \$skiptest }, - prereq_target => { default => '', store => \$prereq_target }, - ### don't set the default format to 'build' -- that is wrong! - prereq_format => { #default => $self->status->installer_type, - default => '', - store => \$prereq_format }, - prereq_build => { default => 0, store => \$prereq_build }, - }; - - $args = check( $tmpl, \%hash ) or return; - } - - # restore the state as we have created this already. - if ( $dist->status->created && !$force ) { - ### add this directory to your lib ### - $self->add_to_includepath(); - return 1; - } - - $dist->status->_create_args( $args ); - - ### is this dist prepared? - unless( $dist->status->prepared ) { - error( loc( "You have not successfully prepared a '%2' distribution ". - "yet -- cannot create yet", __PACKAGE__ ) ); - return; - } - - ### chdir to work directory ### - my $orig = cwd(); - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - ### by now we've loaded module::build, and we're using the API, so - ### it's safe to remove CPANPLUS::inc from our inc path, especially - ### because it can trip up tests run under taint (just like EU::MM). - ### turn off our PERL5OPT so no modules from CPANPLUS::inc get - ### included in make test -- it should build without. - ### also, modules that run in taint mode break if we leave - ### our code ref in perl5opt - ### XXX we've removed the ENV settings from cp::inc, so only need - ### to reset the @INC - #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt; - #local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib; - #local @INC = CPANPLUS::inc->original_inc; - - ### but do it *before* the new_from_context, as M::B seems - ### to be actually running the file... - ### an unshift in the block seems to be ignored.. somehow... - #{ my $lib = $self->best_path_to_module_build; - # unshift @INC, $lib if $lib; - #} - unshift @INC, $self->best_path_to_module_build - if $self->best_path_to_module_build; - - ### this will generate warnings under anything lower than M::B 0.2606 - my @buildflags = $dist->_buildflags_as_list( $buildflags ); - $dist->status->_buildflags( $buildflags ); - - my $fail; my $prereq_fail; my $test_fail; - my $status = { }; - RUN: { - - my @run_perl = ( '-e', CPDB_PERL_WRAPPER ); - - ### this will set the directory back to the start - ### dir, so we must chdir /again/ - my $ok = $dist->_resolve_prereqs( - force => $force, - format => $prereq_format, - verbose => $verbose, - prereqs => $self->status->prereqs, - target => $prereq_target, - prereq_build => $prereq_build, - ); - - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - unless( $ok ) { - #### use $dist->flush to reset the cache ### - error( loc( "Unable to satisfy prerequisites for '%1' " . - "-- aborting install", $self->module ) ); - $dist->status->build(0); - $fail++; $prereq_fail++; - last RUN; - } - - my ($captured, $cmd); - if ( ON_VMS ) { - $cmd = [$perl, BUILD->($dir), @buildflags]; - } - else { - $cmd = [$perl, @run_perl, BUILD->($dir), @buildflags]; - } - - unless ( scalar run( command => $cmd, - buffer => \$captured, - verbose => $verbose ) - ) { - error( loc( "MAKE failed:\n%1", $captured ) ); - $dist->status->build(0); - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'build'; - $status->{capture} = $captured; - } - $fail++; last RUN; - } - - msg( $captured, 0 ); - - $dist->status->build(1); - - ### add this directory to your lib ### - $self->add_to_includepath(); - - ### this buffer will not include what tests failed due to a - ### M::B/Test::Harness bug. Reported as #9793 with patch - ### against 0.2607 on 26/1/2005 - unless( $skiptest ) { - my $test_output; - if ( ON_VMS ) { - $cmd = [$perl, BUILD->($dir), "test", @buildflags]; - } - else { - $cmd = [$perl, @run_perl, BUILD->($dir), "test", @buildflags]; - } - unless ( scalar run( command => $cmd, - buffer => \$test_output, - verbose => $verbose ) - ) { - error( loc( "MAKE TEST failed:\n%1 ", $test_output ), ( $verbose ? 0 : 1 ) ); - - ### mark specifically *test* failure.. so we dont - ### send success on force... - $test_fail++; - - if( !$force and !$cb->_callbacks->proceed_on_test_failure->( - $self, $@ ) - ) { - $dist->status->test(0); - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'test'; - $status->{capture} = $test_output; - } - $fail++; last RUN; - } - - } - else { - msg( loc( "MAKE TEST passed:\n%1", $test_output ), 0 ); - $dist->status->test(1); - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'test'; - $status->{capture} = $test_output; - } - } - } - else { - msg(loc("Tests skipped"), $verbose); - } - } - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir back to start dir '%1'", $orig ) ); - } - - ### send out test report? ### - if( $conf->get_conf('cpantest') and not $prereq_fail ) { - $cb->_send_report( - module => $self, - failed => $test_fail || $fail, - buffer => CPANPLUS::Error->stack_as_string, - status => $status, - verbose => $verbose, - force => $force, - tests_skipped => $skiptest, - ) or error(loc("Failed to send test report for '%1'", - $self->module ) ); - } - - return $dist->status->created( $fail ? 0 : 1 ); -} - -=head2 $dist->install([verbose => BOOL, perl => /path/to/perl]) - -Actually installs the created dist. - -Returns true on success and false on failure. - -=cut - -sub install { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - - ### we're also the cpan_dist, since we don't need to have anything - ### prepared from another installer - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - - my $verbose; my $perl; my $force; my $buildflags; - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - force => { default => $conf->get_conf('force'), - store => \$force }, - buildflags => { default => $conf->get_conf('buildflags'), - store => \$buildflags }, - perl => { default => $^X, store => \$perl }, - }; - - my $args = check( $tmpl, \%hash ) or return; - $dist->status->_install_args( $args ); - } - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my $orig = cwd(); - - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - ### value set and false -- means failure ### - if( defined $self->status->installed && - !$self->status->installed && !$force - ) { - error( loc( "Module '%1' has failed to install before this session " . - "-- aborting install", $self->module ) ); - return; - } - - my $fail; - my @buildflags = $dist->_buildflags_as_list( $buildflags ); - my @run_perl = ( '-e', CPDB_PERL_WRAPPER ); - - ### hmm, how is this going to deal with sudo? - ### for now, check effective uid, if it's not root, - ### shell out, otherwise use the method - if( $> ) { - - ### don't worry about loading the right version of M::B anymore - ### the 'new_from_context' already added the 'right' path to - ### M::B at the top of the build.pl - my $cmd; - if ( ON_VMS ) { - $cmd = [$perl, BUILD->($dir), "install", @buildflags]; - } - else { - $cmd = [$perl, @run_perl, BUILD->($dir), "install", @buildflags]; - } - - ### Detect local::lib type behaviour. Do not use 'sudo' in these cases - my $sudo = $conf->get_program('sudo'); - SUDO: { - ### Actual local::lib in use - last SUDO if defined $ENV{PERL_MB_OPT} and $ENV{PERL_MB_OPT} =~ m!install_base!; - ### 'buildflags' is configured with '--install_base' - last SUDO if scalar grep { m!install_base! } @buildflags; - ### oh well 'sudo make me a sandwich' - unshift @$cmd, $sudo; - } - - my $buffer; - unless( scalar run( command => $cmd, - buffer => \$buffer, - verbose => $verbose ) - ) { - error(loc("Could not run '%1': %2", 'Build install', $buffer)); - $fail++; - } - } else { - my ($install_output, $cmd); - if ( ON_VMS ) { - $cmd = [$perl, BUILD->($dir), "install", @buildflags]; - } - else { - $cmd = [$perl, @run_perl, BUILD->($dir), "install", @buildflags]; - } - unless( scalar run( command => $cmd, - buffer => \$install_output, - verbose => $verbose ) - ) { - error(loc("Could not run '%1': %2", 'Build install', $install_output)); - $fail++; - } - else { - msg( $install_output, 0 ); - } - } - - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir back to start dir '%1'", $orig ) ); - } - - return $dist->status->installed( $fail ? 0 : 1 ); -} - -### returns the string 'foo=bar --zot quux' -### as the list 'foo=bar', '--zot', 'qux' -sub _buildflags_as_list { - my $self = shift; - my $flags = shift or return; - - return Module::Build->split_like_shell($flags); -} - -=head1 AUTHOR - -Originally by Jos Boumans Ekane@cpan.orgE. Brought to working -condition by Ken Williams Ekwilliams@cpan.orgE. - -Other hackery and currently maintained by Chris C Williams ( no relation ). Ebingos@cpan.orgE. - -=head1 LICENSE - -The CPAN++ interface (of which this module is a part of) is -copyright (c) 2001, 2002, 2003, 2004, 2005 Jos Boumans Ekane@cpan.orgE. -All rights reserved. - -This library is free software; -you may redistribute and/or modify it under the same -terms as Perl itself. - -=cut - -qq[Putting the Module::Build into CPANPLUS]; - - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: - diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build/Constants.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build/Constants.pm deleted file mode 100644 index f020093c9c7..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Build/Constants.pm +++ /dev/null @@ -1,74 +0,0 @@ -package CPANPLUS::Dist::Build::Constants; - -use if $] > 5.017, 'deprecate'; - -use strict; -use warnings; -use File::Spec; - -BEGIN { - - require Exporter; - use vars qw[$VERSION @ISA @EXPORT]; - - $VERSION = '0.70'; - @ISA = qw[Exporter]; - @EXPORT = qw[ BUILD_DIR BUILD CPDB_PERL_WRAPPER]; -} - - -use constant BUILD_DIR => sub { return @_ - ? File::Spec->catdir($_[0], '_build') - : '_build'; - }; -use constant BUILD => sub { my $file = @_ - ? File::Spec->catfile($_[0], 'Build') - : 'Build'; - - ### on VMS, '.com' is appended when - ### creating the Build file - $file .= '.com' if $^O eq 'VMS'; - - return $file; - }; - - -use constant CPDB_PERL_WRAPPER => 'use strict; BEGIN { my $old = select STDERR; $|++; select $old; $|++; $0 = shift(@ARGV); my $rv = do($0); die $@ if $@; }'; - -1; - -=head1 NAME - -CPANPLUS::Dist::Build::Constants - Constants for CPANPLUS::Dist::Build - -=head1 SYNOPSIS - - use CPANPLUS::Dist::Build::Constants; - -=head1 DESCRIPTION - -CPANPLUS::Dist::Build::Constants provides some constants required by L. - -=head1 AUTHOR - -Originally by Jos Boumans Ekane@cpan.orgE. Brought to working -condition and currently maintained by Ken Williams Ekwilliams@cpan.orgE. - -=head1 LICENSE - -The CPAN++ interface (of which this module is a part of) is -copyright (c) 2001, 2002, 2003, 2004, 2005 Jos Boumans Ekane@cpan.orgE. -All rights reserved. - -This library is free software; -you may redistribute and/or modify it under the same -terms as Perl itself. - -=cut - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/MM.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/MM.pm deleted file mode 100644 index 35f31b7b089..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/MM.pm +++ /dev/null @@ -1,1044 +0,0 @@ -package CPANPLUS::Dist::MM; -use deprecate; - -use strict; -use warnings; -use vars qw[@ISA $STATUS $VERSION]; -use base 'CPANPLUS::Dist::Base'; -$VERSION = "0.9135"; - -use CPANPLUS::Internals::Constants; -use CPANPLUS::Internals::Constants::Report; -use CPANPLUS::Error; -use FileHandle; -use Cwd; - -use IPC::Cmd qw[run]; -use Params::Check qw[check]; -use File::Basename qw[dirname]; -use Module::Load::Conditional qw[can_load check_install]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -local $Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -CPANPLUS::Dist::MM - distribution class for MakeMaker related modules - -=head1 SYNOPSIS - - $mm = CPANPLUS::Dist::MM->new( module => $modobj ); - - $mm->create; # runs make && make test - $mm->install; # runs make install - - -=head1 DESCRIPTION - -C is a distribution class for MakeMaker related -modules. -Using this package, you can create, install and uninstall perl -modules. It inherits from C. - -=head1 ACCESSORS - -=over 4 - -=item parent() - -Returns the C object that parented this object. - -=item status() - -Returns the C object that keeps the status for -this module. - -=back - -=head1 STATUS ACCESSORS - -All accessors can be accessed as follows: - $mm->status->ACCESSOR - -=over 4 - -=item makefile () - -Location of the Makefile (or Build file). -Set to 0 explicitly if something went wrong. - -=item make () - -BOOL indicating if the C (or C) command was successful. - -=item test () - -BOOL indicating if the C (or C) command was -successful. - -=item prepared () - -BOOL indicating if the C call exited successfully -This gets set after C - -=item distdir () - -Full path to the directory in which the C call took place, -set after a call to C. - -=item created () - -BOOL indicating if the C call exited successfully. This gets -set after C and C. - -=item installed () - -BOOL indicating if the module was installed. This gets set after -C (or C) exits successfully. - -=item uninstalled () - -BOOL indicating if the module was uninstalled properly. - -=item _create_args () - -Storage of the arguments passed to C for this object. Used -for recursive calls when satisfying prerequisites. - -=item _install_args () - -Storage of the arguments passed to C for this object. Used -for recursive calls when satisfying prerequisites. - -=back - -=cut - -=head1 METHODS - -=head2 $bool = $dist->format_available(); - -Returns a boolean indicating whether or not you can use this package -to create and install modules in your environment. - -=cut - -### check if the format is available ### -sub format_available { - my $dist = shift; - - ### we might be called as $class->format_available =/ - require CPANPLUS::Internals; - my $cb = CPANPLUS::Internals->_retrieve_id( - CPANPLUS::Internals->_last_id ); - my $conf = $cb->configure_object; - - my $mod = "ExtUtils::MakeMaker"; - unless( can_load( modules => { $mod => 0.0 } ) ) { - error( loc( "You do not have '%1' -- '%2' not available", - $mod, __PACKAGE__ ) ); - return; - } - - for my $pgm ( qw[make] ) { - unless( $conf->get_program( $pgm ) ) { - error(loc( - "You do not have '%1' in your path -- '%2' not available\n" . - "Please check your config entry for '%1'", - $pgm, __PACKAGE__ , $pgm - )); - return; - } - } - - return 1; -} - -=pod - -=head2 $bool = $dist->init(); - -Sets up the C object for use. -Effectively creates all the needed status accessors. - -Called automatically whenever you create a new C object. - -=cut - -sub init { - my $dist = shift; - my $status = $dist->status; - - $status->mk_accessors(qw[makefile make test created installed uninstalled - bin_make _prepare_args _create_args _install_args] - ); - - return 1; -} - -=pod - -=head2 $bool = $dist->prepare([perl => '/path/to/perl', makemakerflags => 'EXTRA=FLAGS', force => BOOL, verbose => BOOL]) - -C preps a distribution for installation. This means it will -run C and determine what prerequisites this distribution -declared. - -If you set C to true, it will go over all the stages of the -C process again, ignoring any previously cached results. - -When running C, the environment variable -C will be set to the full path of the -C that is being executed. This enables any code inside -the C to know that it is being installed via CPANPLUS. - -Returns true on success and false on failure. - -You may then call C<< $dist->create >> on the object to create the -installable files. - -=cut - -sub prepare { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - - ### we're also the cpan_dist, since we don't need to have anything - ### prepared - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my $args; - my( $force, $verbose, $perl, $mmflags, $prereq_target, $prereq_format, - $prereq_build ); - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - perl => { default => $^X, store => \$perl }, - makemakerflags => { default => - $conf->get_conf('makemakerflags') || '', - store => \$mmflags }, - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - prereq_target => { default => '', store => \$prereq_target }, - prereq_format => { default => '', - store => \$prereq_format }, - prereq_build => { default => 0, store => \$prereq_build }, - }; - - $args = check( $tmpl, \%hash ) or return; - } - - my @mmflags = $dist->_split_like_shell( $mmflags ); - - ### maybe we already ran a create on this object? ### - return 1 if $dist->status->prepared && !$force; - - ### store the arguments, so ->install can use them in recursive loops ### - $dist->status->_prepare_args( $args ); - - ### chdir to work directory ### - my $orig = cwd(); - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - my $fail; - RUN: { - - ### we resolve 'configure requires' here, so we can run the 'perl - ### Makefile.PL' command - ### XXX for tests: mock f_c_r to something that *can* resolve and - ### something that *doesn't* resolve. Check the error log for ok - ### on this step or failure - ### XXX make a separate tarball to test for this scenario: simply - ### containing a makefile.pl/build.pl for test purposes? - { my $configure_requires = $dist->find_configure_requires; - my $ok = $dist->_resolve_prereqs( - format => $prereq_format, - verbose => $verbose, - prereqs => $configure_requires, - target => $prereq_target, - force => $force, - prereq_build => $prereq_build, - ); - - unless( $ok ) { - - #### use $dist->flush to reset the cache ### - error( loc( "Unable to satisfy '%1' for '%2' " . - "-- aborting install", - 'configure_requires', $self->module ) ); - $dist->status->prepared(0); - $fail++; - last RUN; - } - ### end of prereq resolving ### - } - - - - ### don't run 'perl makefile.pl' again if there's a makefile already - if( -e MAKEFILE->() && (-M MAKEFILE->() < -M $dir) && !$force ) { - msg(loc("'%1' already exists, not running '%2 %3' again ". - " unless you force", - MAKEFILE->(), $perl, MAKEFILE_PL->() ), $verbose ); - - } else { - unless( -e MAKEFILE_PL->() ) { - msg(loc("No '%1' found - attempting to generate one", - MAKEFILE_PL->() ), $verbose ); - - $dist->write_makefile_pl( - verbose => $verbose, - force => $force - ); - - ### bail out if there's no makefile.pl ### - unless( -e MAKEFILE_PL->() ) { - error( loc( "Could not find '%1' - cannot continue", - MAKEFILE_PL->() ) ); - - ### mark that we screwed up ### - $dist->status->makefile(0); - $fail++; last RUN; - } - } - - ### you can turn off running this verbose by changing - ### the config setting below, although it is really not - ### recommended - my $run_verbose = $verbose || - $conf->get_conf('allow_build_interactivity') || - 0; - - ### this makes MakeMaker use defaults if possible, according - ### to schwern. See ticket 8047 for details. - local $ENV{PERL_MM_USE_DEFAULT} = 1 unless $run_verbose; - - ### turn off our PERL5OPT so no modules from CPANPLUS::inc get - ### included in the makefile.pl -- it should build without - ### also, modules that run in taint mode break if we leave - ### our code ref in perl5opt - ### XXX we've removed the ENV settings from cp::inc, so only need - ### to reset the @INC - #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt || ''; - - ### make sure it's a string, so that mmflags that have more than - ### one key value pair are passed as is, rather than as: - ### perl Makefile.PL "key=val key=>val" - - - #### XXX this needs to be the absolute path to the Makefile.PL - ### since cpanp-run-perl uses 'do' to execute the file, and do() - ### checks your @INC.. so, if there's _another_ makefile.pl in - ### your @INC, it will execute that one... - my $makefile_pl = MAKEFILE_PL->( $cb->_safe_path( path => $dir ) ); - - ### setting autoflush to true fixes issue from rt #8047 - ### XXX this means that we need to keep the path to CPANPLUS - ### in @INC, stopping us from resolving dependencies on CPANPLUS - ### at bootstrap time properly. - - my @run_perl = ( '-e', PERL_WRAPPER ); - my $cmd = [$perl, @run_perl, $makefile_pl, @mmflags]; - - ### set ENV var to tell underlying code this is what we're - ### executing. - my $captured; - my $rv = do { - my $env = ENV_CPANPLUS_IS_EXECUTING; - local $ENV{$env} = $makefile_pl; - scalar run( command => $cmd, - buffer => \$captured, - verbose => $run_verbose, # may be interactive - ); - }; - - unless( $rv ) { - error( loc( "Could not run '%1 %2': %3 -- cannot continue", - $perl, MAKEFILE_PL->(), $captured ) ); - - $dist->status->makefile(0); - $fail++; last RUN; - } - - ### put the output on the stack, don't print it - msg( $captured, 0 ); - } - - ### so, nasty feature in Module::Build, that when a Makefile.PL - ### is a disguised Build.PL, it generates a Build file, not a - ### Makefile. this breaks everything :( see rt bug #19741 - if( not -e MAKEFILE->( $dir ) and -e BUILD_PL->( $dir ) ) { - error(loc( - "We just ran '%1' without errors, but no '%2' is ". - "present. However, there is a '%3' file, so this may ". - "be related to bug #19741 in %4, which describes a ". - "fake '%5' which generates a '%6' file instead of a '%7'. ". - "You could try to work around this issue by setting '%8' ". - "to false and trying again. This will attempt to use the ". - "'%9' instead.", - "$^X ".MAKEFILE_PL->(), MAKEFILE->(), BUILD_PL->(), - 'Module::Build', MAKEFILE_PL->(), 'Build', MAKEFILE->(), - 'prefer_makefile', BUILD_PL->() - )); - - $fail++, last RUN; - } - - ### if we got here, we managed to make a 'makefile' ### - $dist->status->makefile( MAKEFILE->($dir) ); - - ### Make (haha) sure that Makefile.PL is older than the Makefile - ### we just generated. - eval { - my $makestat = ( stat MAKEFILE->( $dir ) )[9]; - my $mplstat = ( stat MAKEFILE_PL->( $cb->_safe_path( path => $dir ) ) )[9]; - if ( $makestat < $mplstat ) { - my $ftime = $makestat - 60; - utime $ftime, $ftime, MAKEFILE_PL->( $cb->_safe_path( path => $dir ) ); - } - }; - - ### start resolving prereqs ### - my $prereqs = $self->status->prereqs; - - ### a hashref of prereqs on success, undef on failure ### - $prereqs ||= $dist->_find_prereqs( - verbose => $verbose, - file => $dist->status->makefile - ); - - unless( $prereqs ) { - error( loc( "Unable to scan '%1' for prereqs", - $dist->status->makefile ) ); - - $fail++; last RUN; - } - } - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir back to start dir '%1'", $orig ) ); - } - - ### save where we wrote this stuff -- same as extract dir in normal - ### installer circumstances - $dist->status->distdir( $self->status->extract ); - - return $dist->status->prepared( $fail ? 0 : 1); -} - -=pod - -=head2 $href = $dist->_find_prereqs( file => '/path/to/Makefile', [verbose => BOOL]) - -Parses a C for C entries and distills from that -any prerequisites mentioned in the C - -Returns a hash with module-version pairs on success and false on -failure. - -=cut - -sub _find_prereqs { - my $dist = shift; - my $self = $dist->parent; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my ($verbose, $file); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - file => { required => 1, allow => FILE_READABLE, store => \$file }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### see if we got prereqs from MYMETA - my $prereqs = $dist->find_mymeta_requires(); - - ### we found some prereqs, we'll trust MYMETA - ### but we do need to run it through the callback - return $cb->_callbacks->filter_prereqs->( $cb, $prereqs ) if keys %$prereqs; - - my $fh = FileHandle->new(); - unless( $fh->open( $file ) ) { - error( loc( "Cannot open '%1': %2", $file, $! ) ); - return; - } - - my %p; - while( local $_ = <$fh> ) { - my ($found) = m|^[\#]\s+PREREQ_PM\s+=>\s+(.+)|; - - next unless $found; - - while( $found =~ m/(?:\s)([\w\:]+)=>(?:q\[(.*?)\],?|undef)/g ) { - if( defined $p{$1} ) { - my $ver = $cb->_version_to_number(version => $2); - $p{$1} = $ver - if $cb->_vcmp( $ver, $p{$1} ) > 0; - } - else { - $p{$1} = $cb->_version_to_number(version => $2); - } - } - last; - } - - my $href = $cb->_callbacks->filter_prereqs->( $cb, \%p ); - - $self->status->prereqs( $href ); - - ### just to make sure it's not the same reference ### - return { %$href }; -} - -=pod - -=head2 $bool = $dist->create([perl => '/path/to/perl', make => '/path/to/make', makeflags => 'EXTRA=FLAGS', prereq_target => TARGET, skiptest => BOOL, force => BOOL, verbose => BOOL]) - -C creates the files necessary for installation. This means -it will run C and C. This will also scan for and -attempt to satisfy any prerequisites the module may have. - -If you set C to true, it will skip the C stage. -If you set C to true, it will go over all the stages of the -C process again, ignoring any previously cached results. It -will also ignore a bad return value from C and still allow -the operation to return true. - -Returns true on success and false on failure. - -You may then call C<< $dist->install >> on the object to actually -install it. - -=cut - -sub create { - ### just in case you already did a create call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - - ### we're also the cpan_dist, since we don't need to have anything - ### prepared - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my $args; - my( $force, $verbose, $make, $makeflags, $skiptest, $prereq_target, $perl, - @mmflags, $prereq_format, $prereq_build); - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - perl => { default => $^X, store => \$perl }, - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - make => { default => $conf->get_program('make'), - store => \$make }, - makeflags => { default => $conf->get_conf('makeflags'), - store => \$makeflags }, - skiptest => { default => $conf->get_conf('skiptest'), - store => \$skiptest }, - prereq_target => { default => '', store => \$prereq_target }, - ### don't set the default prereq format to 'makemaker' -- wrong! - prereq_format => { #default => $self->status->installer_type, - default => '', - store => \$prereq_format }, - prereq_build => { default => 0, store => \$prereq_build }, - }; - - $args = check( $tmpl, \%hash ) or return; - } - - my @makeflags = $dist->_split_like_shell( $makeflags ); - - ### maybe we already ran a create on this object? - ### make sure we add to include path again, just in case we came from - ### ->save_state, at which point we need to restore @INC/$PERL5LIB - if( $dist->status->created && !$force ) { - $self->add_to_includepath; - return 1; - } - - ### store the arguments, so ->install can use them in recursive loops ### - $dist->status->_create_args( $args ); - - unless( $dist->status->prepared ) { - error( loc( "You have not successfully prepared a '%2' distribution ". - "yet -- cannot create yet", __PACKAGE__ ) ); - return; - } - - - ### chdir to work directory ### - my $orig = cwd(); - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - my $fail; my $prereq_fail; my $test_fail; - my $status = { }; - RUN: { - ### this will set the directory back to the start - ### dir, so we must chdir /again/ - my $ok = $dist->_resolve_prereqs( - format => $prereq_format, - verbose => $verbose, - prereqs => $self->status->prereqs, - target => $prereq_target, - force => $force, - prereq_build => $prereq_build, - ); - - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - unless( $ok ) { - - #### use $dist->flush to reset the cache ### - error( loc( "Unable to satisfy prerequisites for '%1' " . - "-- aborting install", $self->module ) ); - $dist->status->make(0); - $fail++; $prereq_fail++; - last RUN; - } - ### end of prereq resolving ### - - my $captured; - - ### 'make' section ### - if( -d BLIB->($dir) && (-M BLIB->($dir) < -M $dir) && !$force ) { - msg(loc("Already ran '%1' for this module [%2] -- " . - "not running again unless you force", - $make, $self->module ), $verbose ); - } else { - unless(scalar run( command => [$make, @makeflags], - buffer => \$captured, - verbose => $verbose ) - ) { - error( loc( "MAKE failed: %1 %2", $!, $captured ) ); - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'build'; - $status->{capture} = $captured; - } - $dist->status->make(0); - $fail++; last RUN; - } - - ### put the output on the stack, don't print it - msg( $captured, 0 ); - - $dist->status->make(1); - - ### add this directory to your lib ### - $self->add_to_includepath(); - - ### dont bail out here, there's a conditional later on - #last RUN if $skiptest; - } - - ### 'make test' section ### - unless( $skiptest ) { - - ### turn off our PERL5OPT so no modules from CPANPLUS::inc get - ### included in make test -- it should build without - ### also, modules that run in taint mode break if we leave - ### our code ref in perl5opt - ### XXX CPANPLUS::inc functionality is now obsolete. - #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt || ''; - - ### you can turn off running this verbose by changing - ### the config setting below, although it is really not - ### recommended - my $run_verbose = - $verbose || - $conf->get_conf('allow_build_interactivity') || - 0; - - ### XXX need to add makeflags here too? - ### yes, but they should really be split out -- see bug #4143 - if( scalar run( - command => [$make, 'test', @makeflags], - buffer => \$captured, - verbose => $run_verbose, - ) ) { - ### tests might pass because it doesn't have any tests defined - ### log this occasion non-verbosely, so our test reporter can - ### pick up on this - if ( NO_TESTS_DEFINED->( $captured ) ) { - msg( NO_TESTS_DEFINED->( $captured ), 0 ) - } else { - msg( loc( "MAKE TEST passed: %1", $captured ), 0 ); - } - - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'test'; - $status->{capture} = $captured; - } - - $dist->status->test(1); - } else { - error( loc( "MAKE TEST failed: %1", $captured ), ( $run_verbose ? 0 : 1 ) ); - - if ( $conf->get_conf('cpantest') ) { - $status->{stage} = 'test'; - $status->{capture} = $captured; - } - - ### send out error report here? or do so at a higher level? - ### --higher level --kane. - $dist->status->test(0); - - ### mark specifically *test* failure.. so we dont - ### send success on force... - $test_fail++; - - if( !$force and !$cb->_callbacks->proceed_on_test_failure->( - $self, $captured ) - ) { - $fail++; last RUN; - } - } - } - } # - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir back to start dir '%1'", $orig ) ); - } - - ### TODO: Add $stage to _send_report() - ### send out test report? - ### only do so if the failure is this module, not its prereq - if( $conf->get_conf('cpantest') and not $prereq_fail) { - $cb->_send_report( - module => $self, - failed => $test_fail || $fail, - buffer => CPANPLUS::Error->stack_as_string, - status => $status, - verbose => $verbose, - force => $force, - ) or error(loc("Failed to send test report for '%1'", - $self->module ) ); - } - - return $dist->status->created( $fail ? 0 : 1); -} - -=pod - -=head2 $bool = $dist->install([make => '/path/to/make', makemakerflags => 'EXTRA=FLAGS', force => BOOL, verbose => BOOL]) - -C runs the following command: - make install - -Returns true on success, false on failure. - -=cut - -sub install { - - ### just in case you did the create with ANOTHER dist object linked - ### to the same module object - my $dist = shift(); - my $self = $dist->parent; - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - - unless( $dist->status->created ) { - error(loc("You have not successfully created a '%2' distribution yet " . - "-- cannot install yet", __PACKAGE__ )); - return; - } - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my $args; - my($force,$verbose,$make,$makeflags); - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - make => { default => $conf->get_program('make'), - store => \$make }, - makeflags => { default => $conf->get_conf('makeflags'), - store => \$makeflags }, - }; - - $args = check( $tmpl, \%hash ) or return; - } - - ### value set and false -- means failure ### - if( defined $self->status->installed && - !$self->status->installed && !$force - ) { - error( loc( "Module '%1' has failed to install before this session " . - "-- aborting install", $self->module ) ); - return; - } - - my @makeflags = $dist->_split_like_shell( $makeflags ); - - $dist->status->_install_args( $args ); - - my $orig = cwd(); - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - my $fail; my $captured; - - ### 'make install' section ### - ### XXX need makeflags here too? - ### yes, but they should really be split out.. see bug #4143 - my $cmd = [$make, 'install', @makeflags]; - my $sudo = $conf->get_program('sudo'); - unshift @$cmd, $sudo if $sudo and $>; - - $cb->flush('lib'); - unless(scalar run( command => $cmd, - verbose => $verbose, - buffer => \$captured, - ) ) { - error( loc( "MAKE INSTALL failed: %1 %2", $!, $captured ) ); - $fail++; - } - - ### put the output on the stack, don't print it - msg( $captured, 0 ); - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir back to start dir '%1'", $orig ) ); - } - - return $dist->status->installed( $fail ? 0 : 1 ); - -} - -=pod - -=head2 $bool = $dist->write_makefile_pl([force => BOOL, verbose => BOOL]) - -This routine can write a C from the information in a -module object. It is used to write a C when the original -author forgot it (!!). - -Returns 1 on success and false on failure. - -The file gets written to the directory the module's been extracted -to. - -=cut - -sub write_makefile_pl { - ### just in case you already did a call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - my ($force, $verbose); - my $tmpl = { - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my $file = MAKEFILE_PL->($dir); - if( -s $file && !$force ) { - msg(loc("Already created '%1' - not doing so again without force", - $file ), $verbose ); - return 1; - } - - ### due to a bug with AS perl 5.8.4 built 810 (and maybe others) - ### opening files with content in them already does nasty things; - ### seek to pos 0 and then print, but not truncating the file - ### bug reported to activestate on 19 sep 2004: - ### http://bugs.activestate.com/show_bug.cgi?id=34051 - unlink $file if $force; - - my $fh = new FileHandle; - unless( $fh->open( ">$file" ) ) { - error( loc( "Could not create file '%1': %2", $file, $! ) ); - return; - } - - my $mf = MAKEFILE_PL->(); - my $name = $self->module; - my $version = $self->version; - my $author = $self->author->author; - my $href = $self->status->prereqs; - my $prereqs = join ",\n", map { - (' ' x 25) . "'$_'\t=> '$href->{$_}'" - } keys %$href; - $prereqs ||= ''; # just in case there are none; - - print $fh qq| - ### Auto-generated $mf by CPANPLUS ### - - use ExtUtils::MakeMaker; - - WriteMakefile( - NAME => '$name', - VERSION => '$version', - AUTHOR => '$author', - PREREQ_PM => { -$prereqs - }, - ); - \n|; - - $fh->close; - return 1; -} - -sub dist_dir { - ### just in case you already did a call for this module object - ### just via a different dist object - my $dist = shift; - my $self = $dist->parent; - $dist = $self->status->dist_cpan if $self->status->dist_cpan; - $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan; - - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $make; my $verbose; - { local $Params::Check::ALLOW_UNKNOWN = 1; - my $tmpl = { - make => { default => $conf->get_program('make'), - store => \$make }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - }; - - check( $tmpl, \%hash ) or return; - } - - - my $dir; - unless( $dir = $self->status->extract ) { - error( loc( "No dir found to operate on!" ) ); - return; - } - - ### chdir to work directory ### - my $orig = cwd(); - unless( $cb->_chdir( dir => $dir ) ) { - error( loc( "Could not chdir to build directory '%1'", $dir ) ); - return; - } - - my $fail; my $distdir; - TRY: { - $dist->prepare( @_ ) or (++$fail, last TRY); - - - my $captured; - unless(scalar run( command => [$make, 'distdir'], - buffer => \$captured, - verbose => $verbose ) - ) { - error( loc( "MAKE DISTDIR failed: %1 %2", $!, $captured ) ); - ++$fail, last TRY; - } - - ### /path/to/Foo-Bar-1.2/Foo-Bar-1.2 - $distdir = File::Spec->catdir( $dir, $self->package_name . '-' . - $self->package_version ); - - unless( -d $distdir ) { - error(loc("Do not know where '%1' got created", 'distdir')); - ++$fail, last TRY; - } - } - - unless( $cb->_chdir( dir => $orig ) ) { - error( loc( "Could not chdir to start directory '%1'", $orig ) ); - return; - } - - return if $fail; - return $distdir; -} - -sub _split_like_shell { - my ($self, $string) = @_; - - return () unless defined($string); - return @$string if ref $string eq 'ARRAY'; - $string =~ s/^\s+|\s+$//g; - return () unless length($string); - - require Text::ParseWords; - return Text::ParseWords::shellwords($string); -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Sample.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Sample.pm deleted file mode 100644 index e03d66f9836..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Dist/Sample.pm +++ /dev/null @@ -1,20 +0,0 @@ -package CPANPLUS::Dist::Sample; -use deprecate; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -=pod - -=head1 NAME - -CPANPLUS::Dist::Sample -- Sample code to create your own Dist::* plugin - -=head1 Description. - -This document is B. Please read the documentation and code -in C. - -=cut - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Error.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Error.pm deleted file mode 100644 index 0df6f334689..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Error.pm +++ /dev/null @@ -1,210 +0,0 @@ -package CPANPLUS::Error; -use deprecate; - -use strict; -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -use Log::Message private => 0;; - -=pod - -=head1 NAME - -CPANPLUS::Error - error handling for CPANPLUS - -=head1 SYNOPSIS - - use CPANPLUS::Error qw[cp_msg cp_error]; - -=head1 DESCRIPTION - -This module provides the error handling code for the CPANPLUS -libraries, and is mainly intended for internal use. - -=head1 FUNCTIONS - -=head2 cp_msg("message string" [,VERBOSE]) - -Records a message on the stack, and prints it to C (or actually -C<$MSG_FH>, see the C section below), if the -C option is true. -The C option defaults to false. - -=head2 msg() - -An alias for C. - -=head2 cp_error("error string" [,VERBOSE]) - -Records an error on the stack, and prints it to C (or actually -C<$ERROR_FH>, see the C sections below), if the -C option is true. -The C options defaults to true. - -=head2 error() - -An alias for C. - -=head1 CLASS METHODS - -=head2 CPANPLUS::Error->stack() - -Retrieves all the items on the stack. Since C is -implemented using C, consult its manpage for the -function C to see what is returned and how to use the items. - -=head2 CPANPLUS::Error->stack_as_string([TRACE]) - -Returns the whole stack as a printable string. If the C option is -true all items are returned with C output, rather than -just the message. -C defaults to false. - -=head2 CPANPLUS::Error->flush() - -Removes all the items from the stack and returns them. Since -C is implemented using C, consult its -manpage for the function C to see what is returned and how -to use the items. - -=cut - -BEGIN { - use Exporter; - use Params::Check qw[check]; - use vars qw[@EXPORT @ISA $ERROR_FH $MSG_FH]; - - @ISA = 'Exporter'; - @EXPORT = qw[cp_error cp_msg error msg]; - - my $log = new Log::Message; - - for my $func ( @EXPORT ) { - no strict 'refs'; - - my $prefix = 'cp_'; - my $name = $func; - $name =~ s/^$prefix//g; - - *$func = sub { - my $msg = shift; - - ### no point storing non-messages - return unless defined $msg; - - $log->store( - message => $msg, - tag => uc $name, - level => $prefix . $name, - extra => [@_] - ); - }; - } - - sub flush { - my @foo = $log->flush; - return unless @foo; - return reverse @foo; - } - - sub stack { - return $log->retrieve( chrono => 1 ); - } - - sub stack_as_string { - my $class = shift; - my $trace = shift() ? 1 : 0; - - return join $/, map { - '[' . $_->tag . '] [' . $_->when . '] ' . - ($trace ? $_->message . ' ' . $_->longmess - : $_->message); - } __PACKAGE__->stack; - } -} - -=head1 GLOBAL VARIABLES - -=over 4 - -=item $ERROR_FH - -This is the filehandle all the messages sent to C are being -printed. This defaults to C<*STDERR>. - -=item $MSG_FH - -This is the filehandle all the messages sent to C are being -printed. This default to C<*STDOUT>. - -=back - -=cut - -local $| = 1; -$ERROR_FH = \*STDERR; -$MSG_FH = \*STDOUT; - -package # Hide from Pause - Log::Message::Handlers; -use Carp (); - -{ - - sub cp_msg { - my $self = shift; - my $verbose = shift; - - ### so you don't want us to print the msg? ### - return if defined $verbose && $verbose == 0; - - my $old_fh = select $CPANPLUS::Error::MSG_FH; - - print '['. $self->tag . '] ' . $self->message . "\n"; - select $old_fh; - - return; - } - - sub cp_error { - my $self = shift; - my $verbose = shift; - - ### so you don't want us to print the error? ### - return if defined $verbose && $verbose == 0; - - my $old_fh = select $CPANPLUS::Error::ERROR_FH; - - ### is only going to be 1 for now anyway ### - ### C::I may not be loaded, so do a can() check first - my $cb = CPANPLUS::Internals->can('_return_all_objects') - ? (CPANPLUS::Internals->_return_all_objects)[0] - : undef; - - ### maybe we didn't initialize an internals object (yet) ### - my $debug = $cb ? $cb->configure_object->get_conf('debug') : 0; - my $msg = '['. $self->tag . '] ' . $self->message . "\n"; - - ### i'm getting this warning in the test suite: - ### Ambiguous call resolved as CORE::warn(), qualify as such or - ### use & at CPANPLUS/Error.pm line 57. - ### no idea where it's coming from, since there's no 'sub warn' - ### anywhere to be found, but i'll mark it explicitly nonetheless - ### --kane - print $debug ? Carp::shortmess($msg) : $msg . "\n"; - - select $old_fh; - - return; - } -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals.pm deleted file mode 100644 index 5c53e67e74a..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals.pm +++ /dev/null @@ -1,556 +0,0 @@ -package CPANPLUS::Internals; -use deprecate; - -### we /need/ perl5.6.1 or higher -- we use coderefs in @INC, -### and 5.6.0 is just too buggy -use 5.006001; - -use strict; -use Config; - -use CPANPLUS::Error; - -use CPANPLUS::Selfupdate; - -use CPANPLUS::Internals::Extract; -use CPANPLUS::Internals::Fetch; -use CPANPLUS::Internals::Utils; -use CPANPLUS::Internals::Constants; -use CPANPLUS::Internals::Search; -use CPANPLUS::Internals::Report; - -require base; -use Cwd qw[cwd]; -use Module::Load qw[load]; -use Params::Check qw[check]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use Module::Load::Conditional qw[can_load]; - -use Object::Accessor; - -local $Params::Check::VERBOSE = 1; - -use vars qw[@ISA $VERSION]; - -@ISA = qw[ - CPANPLUS::Internals::Extract - CPANPLUS::Internals::Fetch - CPANPLUS::Internals::Utils - CPANPLUS::Internals::Search - CPANPLUS::Internals::Report - ]; - -$VERSION = "0.9135"; - -=pod - -=head1 NAME - -CPANPLUS::Internals - CPANPLUS internals - -=head1 SYNOPSIS - - my $internals = CPANPLUS::Internals->_init( _conf => $conf ); - my $backend = CPANPLUS::Internals->_retrieve_id( $ID ); - -=head1 DESCRIPTION - -This module is the guts of CPANPLUS -- it inherits from all other -modules in the CPANPLUS::Internals::* namespace, thus defying normal -rules of OO programming -- but if you're reading this, you already -know what's going on ;) - -Please read the C documentation for the normal API. - -=head1 ACCESSORS - -=over 4 - -=item _conf - -Get/set the configure object - -=item _id - -Get/set the id - -=cut - -### autogenerate accessors ### -for my $key ( qw[_conf _id _modules _hosts _methods _status _path - _callbacks _selfupdate _mtree _atree] -) { - no strict 'refs'; - *{__PACKAGE__."::$key"} = sub { - $_[0]->{$key} = $_[1] if @_ > 1; - return $_[0]->{$key}; - } -} - -=pod - -=back - -=head1 METHODS - -=head2 $internals = CPANPLUS::Internals->_init( _conf => CONFIG_OBJ ) - -C<_init> creates a new CPANPLUS::Internals object. - -You have to pass it a valid C object. - -Returns the object on success, or dies on failure. - -=cut - -{ ### NOTE: - ### if extra callbacks are added, don't forget to update the - ### 02-internals.t test script with them! - my $callback_map = { - ### name default value - install_prerequisite => 1, # install prereqs when 'ask' is set? - edit_test_report => 0, # edit the prepared test report? - send_test_report => 1, # send the test report? - # munge the test report - munge_test_report => sub { return $_[1] }, - # filter out unwanted prereqs - filter_prereqs => sub { return $_[1] }, - # continue if 'make test' fails? - proceed_on_test_failure => sub { return 0 }, - munge_dist_metafile => sub { return $_[1] }, - }; - - my $status = Object::Accessor->new; - $status->mk_accessors(qw[pending_prereqs]); - - my $callback = Object::Accessor->new; - $callback->mk_accessors(keys %$callback_map); - - my $conf; - my $Tmpl = { - _conf => { required => 1, store => \$conf, - allow => IS_CONFOBJ }, - _id => { default => '', no_override => 1 }, - _authortree => { default => '', no_override => 1 }, - _modtree => { default => '', no_override => 1 }, - _hosts => { default => {}, no_override => 1 }, - _methods => { default => {}, no_override => 1 }, - _status => { default => '', no_override => 1 }, - _callbacks => { default => '', no_override => 1 }, - _path => { default => $ENV{PATH} || '', no_override => 1 }, - }; - - sub _init { - my $class = shift; - my %hash = @_; - - ### temporary warning until we fix the storing of multiple id's - ### and their serialization: - ### probably not going to happen --kane - if( my $id = $class->_last_id ) { - # make it a singleton. - warn loc(q[%1 currently only supports one %2 object per ] . - qq[running program\n], 'CPANPLUS', $class); - - return $class->_retrieve_id( $id ); - } - - my $args = check($Tmpl, \%hash) - or die loc(qq[Could not initialize '%1' object], $class); - - bless $args, $class; - - $args->{'_id'} = $args->_inc_id; - $args->{'_status'} = $status; - $args->{'_callbacks'} = $callback; - - ### initialize callbacks to default state ### - for my $name ( $callback->ls_accessors ) { - my $rv = ref $callback_map->{$name} ? 'sub return value' : - $callback_map->{$name} ? 'true' : 'false'; - - $args->_callbacks->$name( - sub { msg(loc("DEFAULT '%1' HANDLER RETURNING '%2'", - $name, $rv), $args->_conf->get_conf('debug')); - return ref $callback_map->{$name} - ? $callback_map->{$name}->( @_ ) - : $callback_map->{$name}; - } - ); - } - - ### create a selfupdate object - $args->_selfupdate( CPANPLUS::Selfupdate->new( $args ) ); - - ### initialize it as an empty hashref ### - $args->_status->pending_prereqs( {} ); - - $conf->_set_build( startdir => cwd() ), - or error( loc("couldn't locate current dir!") ); - - $ENV{FTP_PASSIVE} = 1, if $conf->get_conf('passive'); - - my $id = $args->_store_id( $args ); - - unless ( $id == $args->_id ) { - error( loc("IDs do not match: %1 != %2. Storage failed!", - $id, $args->_id) ); - } - - ### different source engines available now, so set them here - { my $store = $conf->get_conf( 'source_engine' ) - || DEFAULT_SOURCE_ENGINE; - - unless( can_load( modules => { $store => '0.0' }, verbose => 1 ) ) { - error( loc( "Could not load source engine '%1'", $store ) ); - - if( $store ne DEFAULT_SOURCE_ENGINE ) { - msg( loc("Falling back to %1", DEFAULT_SOURCE_ENGINE), 1 ); - - load DEFAULT_SOURCE_ENGINE; - - base->import( DEFAULT_SOURCE_ENGINE ); - } else { - return; - } - } else { - base->import( $store ); - } - } - - return $args; - } - -=pod - -=head2 $bool = $internals->_flush( list => \@caches ) - -Flushes the designated caches from the C object. - -Returns true on success, false if one or more caches could not be -be flushed. - -=cut - - sub _flush { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my $aref; - my $tmpl = { - list => { required => 1, default => [], - strict_type => 1, store => \$aref }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my $flag = 0; - for my $what (@$aref) { - my $cache = '_' . $what; - - ### set the include paths back to their original ### - if( $what eq 'lib' ) { - $ENV{PERL5LIB} = $conf->_perl5lib || ''; - @INC = @{$conf->_lib}; - $ENV{PATH} = $self->_path || ''; - - ### give all modules a new status object -- this is slightly - ### costly, but the best way to make sure all statuses are - ### forgotten --kane - } elsif ( $what eq 'modules' ) { - for my $modobj ( values %{$self->module_tree} ) { - - $modobj->_flush; - } - - ### blow away the methods cache... currently, that's only - ### File::Fetch's method fail list - } elsif ( $what eq 'methods' ) { - - ### still unbelievably p4 :( ### - $File'Fetch::METHOD_FAIL = $File'Fetch::METHOD_FAIL = {}; - - ### blow away the m::l::c cache, so modules can be (re)loaded - ### again if they become available - } elsif ( $what eq 'load' ) { - undef $Module::Load::Conditional::CACHE; - - } else { - unless ( exists $self->{$cache} && exists $Tmpl->{$cache} ) { - error( loc( "No such cache: '%1'", $what ) ); - $flag++; - next; - } else { - $self->$cache( {} ); - } - } - } - return !$flag; - } - -### NOTE: -### if extra callbacks are added, don't forget to update the -### 02-internals.t test script with them! - -=pod - -=head2 $bool = $internals->_register_callback( name => CALLBACK_NAME, code => CODEREF ); - -Registers a callback for later use by the internal libraries. - -Here is a list of the currently used callbacks: - -=over 4 - -=item install_prerequisite - -Is called when the user wants to be C about what to do with -prerequisites. Should return a boolean indicating true to install -the prerequisite and false to skip it. - -=item send_test_report - -Is called when the user should be prompted if he wishes to send the -test report. Should return a boolean indicating true to send the -test report and false to skip it. - -=item munge_test_report - -Is called when the test report message has been composed, giving -the user a chance to programatically alter it. Should return the -(munged) message to be sent. - -=item edit_test_report - -Is called when the user should be prompted to edit test reports -about to be sent out by Test::Reporter. Should return a boolean -indicating true to edit the test report in an editor and false -to skip it. - -=item proceed_on_test_failure - -Is called when 'make test' or 'Build test' fails. Should return -a boolean indicating whether the install should continue even if -the test failed. - -=item munge_dist_metafile - -Is called when the C metafile is created, like -C for C, giving the user a chance to -programatically alter it. Should return the (munged) text to be -written to the metafile. - -=back - -=cut - - sub _register_callback { - my $self = shift or return; - my %hash = @_; - - my ($name,$code); - my $tmpl = { - name => { required => 1, store => \$name, - allow => [$callback->ls_accessors] }, - code => { required => 1, allow => IS_CODEREF, - store => \$code }, - }; - - check( $tmpl, \%hash ) or return; - - $self->_callbacks->$name( $code ) or return; - - return 1; - } - -# =head2 $bool = $internals->_add_callback( name => CALLBACK_NAME, code => CODEREF ); -# -# Adds a new callback to be used from anywhere in the system. If the callback -# is already known, an error is raised and false is returned. If the callback -# is not yet known, it is added, and the corresponding coderef is registered -# using the -# -# =cut -# -# sub _add_callback { -# my $self = shift or return; -# my %hash = @_; -# -# my ($name,$code); -# my $tmpl = { -# name => { required => 1, store => \$name, }, -# code => { required => 1, allow => IS_CODEREF, -# store => \$code }, -# }; -# -# check( $tmpl, \%hash ) or return; -# -# if( $callback->can( $name ) ) { -# error(loc("Callback '%1' is already registered")); -# return; -# } -# -# $callback->mk_accessor( $name ); -# -# $self->_register_callback( name => $name, code => $code ) or return; -# -# return 1; -# } - -} - -=pod - -=head2 $bool = $internals->_add_to_includepath( directories => \@dirs ) - -Adds a list of directories to the include path. -This means they get added to C<@INC> as well as C<$ENV{PERL5LIB}>. - -Returns true on success, false on failure. - -=cut - -sub _add_to_includepath { - my $self = shift; - my %hash = @_; - - my $dirs; - my $tmpl = { - directories => { required => 1, default => [], store => \$dirs, - strict_type => 1 }, - }; - - check( $tmpl, \%hash ) or return; - - my $s = $Config{'path_sep'}; - - ### only add if it's not added yet - for my $lib (@$dirs) { - push @INC, $lib unless grep { $_ eq $lib } @INC; - # - ### it will be complaining if $ENV{PERL5LIB] is not defined (yet). - local $^W; - $ENV{'PERL5LIB'} .= $s . $lib - unless $ENV{'PERL5LIB'} =~ qr|\Q$s$lib\E|; - } - - return 1; -} - -=pod - -=head2 $bool = $internals->_add_to_path( directories => \@dirs ) - -Adds a list of directories to the PATH, but only if they actually -contain anything. - -Returns true on success, false on failure. - -=cut - -sub _add_to_path { - my $self = shift; - my %hash = @_; - - my $dirs; - my $tmpl = { - directories => { required => 1, default => [], store => \$dirs, - strict_type => 1 }, - }; - - check( $tmpl, \%hash ) or return; - - my $s = $Config{'path_sep'}; - - require File::Glob; - - ### only add if it's not added yet - for my $dir (@$dirs) { - $dir =~ s![\\/]*$!!g; - next if $ENV{PATH} =~ qr|\Q$dir\E|; - next unless -d $dir; - next unless File::Glob::bsd_glob( $dir . q{/*} ); - $ENV{PATH} = join $s, $dir, $ENV{PATH}; - } - - return 1; -} - -=pod - -=head2 $id = CPANPLUS::Internals->_last_id - -Return the id of the last object stored. - -=head2 $id = CPANPLUS::Internals->_store_id( $internals ) - -Store this object; return its id. - -=head2 $obj = CPANPLUS::Internals->_retrieve_id( $ID ) - -Retrieve an object based on its ID -- return false on error. - -=head2 CPANPLUS::Internals->_remove_id( $ID ) - -Remove the object marked by $ID from storage. - -=head2 @objs = CPANPLUS::Internals->_return_all_objects - -Return all stored objects. - -=cut - - -### code for storing multiple objects -### -- although we only support one right now -### XXX when support for multiple objects comes, saving source will have -### to change -{ - my $idref = {}; - my $count = 0; - - sub _inc_id { return ++$count; } - - sub _last_id { $count } - - sub _store_id { - my $self = shift; - my $obj = shift or return; - - unless( IS_INTERNALS_OBJ->($obj) ) { - error( loc("The object you passed has the wrong ref type: '%1'", - ref $obj) ); - return; - } - - $idref->{ $obj->_id } = $obj; - return $obj->_id; - } - - sub _retrieve_id { - my $self = shift; - my $id = shift or return; - - my $obj = $idref->{$id}; - return $obj; - } - - sub _remove_id { - my $self = shift; - my $id = shift or return; - - return delete $idref->{$id}; - } - - sub _return_all_objects { return values %$idref } -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants.pm deleted file mode 100644 index 09501c78e84..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants.pm +++ /dev/null @@ -1,391 +0,0 @@ -package CPANPLUS::Internals::Constants; -use deprecate; - -use strict; - -use CPANPLUS::Error; - -use Config; -use File::Spec; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -require Exporter; -use vars qw[$VERSION @ISA @EXPORT]; - -use Package::Constants; - -$VERSION = "0.9135"; -@ISA = qw[Exporter]; -@EXPORT = Package::Constants->list( __PACKAGE__ ); - -sub constants { @EXPORT }; - -use constant INSTALLER_BUILD - => 'CPANPLUS::Dist::Build'; -use constant INSTALLER_MM => 'CPANPLUS::Dist::MM'; -use constant INSTALLER_SAMPLE - => 'CPANPLUS::Dist::Sample'; -use constant INSTALLER_BASE => 'CPANPLUS::Dist::Base'; -use constant INSTALLER_AUTOBUNDLE - => 'CPANPLUS::Dist::Autobundle'; - -use constant SHELL_DEFAULT => 'CPANPLUS::Shell::Default'; -use constant SHELL_CLASSIC => 'CPANPLUS::Shell::Classic'; - -use constant CONFIG => 'CPANPLUS::Config'; -use constant CONFIG_USER => 'CPANPLUS::Config::User'; -use constant CONFIG_SYSTEM => 'CPANPLUS::Config::System'; -use constant CONFIG_BOXED => 'CPANPLUS::Config::Boxed'; - -use constant DEFAULT_SOURCE_ENGINE - => 'CPANPLUS::Internals::Source::Memory'; - -use constant TARGET_INIT => 'init'; -use constant TARGET_CREATE => 'create'; -use constant TARGET_PREPARE => 'prepare'; -use constant TARGET_INSTALL => 'install'; -use constant TARGET_IGNORE => 'ignore'; - -use constant ON_WIN32 => $^O eq 'MSWin32'; -use constant ON_NETWARE => $^O eq 'NetWare'; -use constant ON_CYGWIN => $^O eq 'cygwin'; -use constant ON_VMS => $^O eq 'VMS'; - -use constant DOT_CPANPLUS => ON_VMS ? '_cpanplus' : '.cpanplus'; - -use constant OPT_AUTOFLUSH => '-MCPANPLUS::Internals::Utils::Autoflush'; - -use constant UNKNOWN_DL_LOCATION - => 'UNKNOWN-ORIGIN'; - -use constant NMAKE => 'nmake.exe'; -use constant NMAKE_URL => - 'ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe'; - -use constant INSTALL_VIA_PACKAGE_MANAGER - => sub { my $fmt = $_[0] or return; - return 1 if $fmt ne INSTALLER_BUILD and - $fmt ne INSTALLER_MM; - }; - -use constant IS_CODEREF => sub { ref $_[-1] eq 'CODE' }; -use constant IS_MODOBJ => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Module') }; -use constant IS_FAKE_MODOBJ => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Module::Fake') }; -use constant IS_AUTHOBJ => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Module::Author') }; -use constant IS_FAKE_AUTHOBJ - => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Module::Author::Fake') }; - -use constant IS_CONFOBJ => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Configure') }; - -use constant IS_RVOBJ => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Backend::RV') }; - -use constant IS_INTERNALS_OBJ - => sub { UNIVERSAL::isa($_[-1], - 'CPANPLUS::Internals') }; - -use constant IS_FILE => sub { return 1 if -e $_[-1] }; - -use constant FILE_EXISTS => sub { - my $file = $_[-1]; - return 1 if IS_FILE->($file); - local $Carp::CarpLevel = - $Carp::CarpLevel+2; - error(loc( q[File '%1' does not exist], - $file)); - return; - }; - -use constant FILE_READABLE => sub { - my $file = $_[-1]; - return 1 if -e $file && -r _; - local $Carp::CarpLevel = - $Carp::CarpLevel+2; - error( loc( q[File '%1' is not readable ]. - q[or does not exist], $file)); - return; - }; -use constant IS_DIR => sub { return 1 if -d $_[-1] }; - -use constant DIR_EXISTS => sub { - my $dir = $_[-1]; - return 1 if IS_DIR->($dir); - local $Carp::CarpLevel = - $Carp::CarpLevel+2; - error(loc(q[Dir '%1' does not exist], - $dir)); - return; - }; - - ### On VMS, if the $Config{make} is either MMK - ### or MMS, then the makefile is 'DESCRIP.MMS'. -use constant MAKEFILE => sub { my $file = - (ON_VMS and - $Config::Config{make} =~ /MM[S|K]/i) - ? 'DESCRIP.MMS' - : 'Makefile'; - - return @_ - ? File::Spec->catfile( @_, $file ) - : $file; - }; -use constant MAKEFILE_PL => sub { return @_ - ? File::Spec->catfile( @_, - 'Makefile.PL' ) - : 'Makefile.PL'; - }; -use constant BUILD_PL => sub { return @_ - ? File::Spec->catfile( @_, - 'Build.PL' ) - : 'Build.PL'; - }; - -use constant META_YML => sub { return @_ - ? File::Spec->catfile( @_, 'META.yml' ) - : 'META.yml'; - }; - -use constant MYMETA_YML => sub { return @_ - ? File::Spec->catfile( @_, 'MYMETA.yml' ) - : 'MYMETA.yml'; - }; - -use constant META_JSON => sub { return @_ - ? File::Spec->catfile( @_, 'META.json' ) - : 'META.json'; - }; - -use constant MYMETA_JSON => sub { return @_ - ? File::Spec->catfile( @_, 'MYMETA.json' ) - : 'MYMETA.json'; - }; - -use constant BLIB => sub { return @_ - ? File::Spec->catfile(@_, 'blib') - : 'blib'; - }; - -use constant LIB => 'lib'; -use constant LIB_DIR => sub { return @_ - ? File::Spec->catdir(@_, LIB) - : LIB; - }; -use constant AUTO => 'auto'; -use constant LIB_AUTO_DIR => sub { return @_ - ? File::Spec->catdir(@_, LIB, AUTO) - : File::Spec->catdir(LIB, AUTO) - }; -use constant ARCH => 'arch'; -use constant ARCH_DIR => sub { return @_ - ? File::Spec->catdir(@_, ARCH) - : ARCH; - }; -use constant ARCH_AUTO_DIR => sub { return @_ - ? File::Spec->catdir(@_,ARCH,AUTO) - : File::Spec->catdir(ARCH,AUTO) - }; - -use constant BLIB_LIBDIR => sub { return @_ - ? File::Spec->catdir( - @_, BLIB->(), LIB ) - : File::Spec->catdir( BLIB->(), LIB ); - }; - -use constant BIN => 'bin'; - -use constant SCRIPT => 'script'; - -use constant CONFIG_USER_LIB_DIR => sub { - require CPANPLUS::Internals::Utils; - LIB_DIR->( - CPANPLUS::Internals::Utils->_home_dir, - DOT_CPANPLUS - ); - }; -use constant CONFIG_USER_FILE => sub { - File::Spec->catfile( - CONFIG_USER_LIB_DIR->(), - split('::', CONFIG_USER), - ) . '.pm'; - }; -use constant CONFIG_SYSTEM_FILE => sub { - require CPANPLUS::Internals; - require File::Basename; - my $dir = File::Basename::dirname( - $INC{'CPANPLUS/Internals.pm'} - ); - - ### XXX use constants - File::Spec->catfile( - $dir, qw[Config System.pm] - ); - }; - -use constant README => sub { my $obj = $_[0]; - my $pkg = $obj->package_name; - $pkg .= '-' . $obj->package_version . - '.readme'; - return $pkg; - }; -use constant META_EXT => 'meta'; - -use constant META => sub { my $obj = $_[0]; - my $pkg = $obj->package_name; - $pkg .= '-' . $obj->package_version . - '.' . META_EXT; - return $pkg; - }; - -use constant OPEN_FILE => sub { - my($file, $mode) = (@_, ''); - my $fh; - open $fh, "$mode" . $file - or error(loc( - "Could not open file '%1': %2", - $file, $!)); - return $fh if $fh; - return; - }; - -use constant OPEN_DIR => sub { - my $dir = shift; - my $dh; - opendir $dh, $dir or error(loc( - "Could not open dir '%1': %2", $dir, $! - )); - - return $dh if $dh; - return; - }; - -use constant READ_DIR => sub { - my $dir = shift; - my $dh = OPEN_DIR->( $dir ) or return; - - ### exclude . and .. - my @files = grep { $_ !~ /^\.{1,2}/ } - readdir($dh); - - ### Remove trailing dot on VMS when - ### using VMS syntax. - if( ON_VMS ) { - s/(? sub { - my $file = $_[0] or return; - $file =~ s/.gz$//i; - return $file; - }; - -use constant CHECKSUMS => 'CHECKSUMS'; -use constant PGP_HEADER => '-----BEGIN PGP SIGNED MESSAGE-----'; -use constant ENV_CPANPLUS_CONFIG - => 'PERL5_CPANPLUS_CONFIG'; -use constant ENV_CPANPLUS_IS_EXECUTING - => 'PERL5_CPANPLUS_IS_EXECUTING'; -use constant DEFAULT_EMAIL => 'cpanplus@example.com'; -use constant CPANPLUS_UA => sub { ### for the version number ### - require CPANPLUS::Internals; - "CPANPLUS/$CPANPLUS::Internals::VERSION" - }; -use constant TESTERS_URL => sub { - 'http://cpantesters.org/distro/'. - uc(substr($_[0],0,1)) .'/'. $_[0] . '.yaml'; - }; -use constant TESTERS_DETAILS_URL - => sub { - 'http://cpantesters.org/distro/'. - uc(substr($_[0],0,1)) .'/'. $_[0]; - }; - -use constant CREATE_FILE_URI - => sub { - my $dir = $_[0] or return; - return $dir =~ m|^/| - ? 'file://' . $dir - : 'file:///' . $dir; - }; - -use constant EMPTY_DSLIP => ' '; - -use constant CUSTOM_AUTHOR_ID - => 'LOCAL'; - -use constant DOT_SHELL_DEFAULT_RC - => '.shell-default.rc'; - -use constant SOURCE_SQLITE_DB - => 'db.sql'; - -use constant PREREQ_IGNORE => 0; -use constant PREREQ_INSTALL => 1; -use constant PREREQ_ASK => 2; -use constant PREREQ_BUILD => 3; -use constant BOOLEANS => [0,1]; -use constant CALLING_FUNCTION - => sub { my $lvl = $_[0] || 0; - return join '::', (caller(2+$lvl))[3] - }; -use constant PERL_CORE => 'perl'; -use constant PERL_WRAPPER => 'use strict; BEGIN { my $old = select STDERR; $|++; select $old; $|++; $0 = shift(@ARGV); my $rv = do($0); die $@ if $@; }'; -use constant STORABLE_EXT => '.stored'; - -use constant GET_XS_FILES => sub { my $dir = $_[0] or return; - require File::Find; - my @files; - File::Find::find( - sub { push @files, $File::Find::name - if $File::Find::name =~ /\.xs$/i - }, $dir ); - - return @files; - }; - -use constant INSTALL_LOG_FILE - => sub { my $obj = shift or return; - my $name = $obj->name; $name =~ s/::/-/g; - $name .= '-'. $obj->version; - $name .= '-'. scalar(time) . '.log'; - return $name; - }; - -use constant ON_OLD_CYGWIN => do { ON_CYGWIN and $] < 5.008 - ? loc( - "Your perl version for %1 is too low; ". - "Require %2 or higher for this function", - $^O, '5.8.0' ) - : ''; - }; - -### XXX these 2 are probably obsolete -- check & remove; -use constant DOT_EXISTS => '.exists'; - -use constant QUOTE_PERL_ONE_LINER - => sub { my $line = shift or return; - - ### use double quotes on these systems - return qq["$line"] - if ON_WIN32 || ON_NETWARE || ON_VMS; - - ### single quotes on the rest - return qq['$line']; - }; - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants/Report.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants/Report.pm deleted file mode 100644 index dc92ec6c31d..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Constants/Report.pm +++ /dev/null @@ -1,426 +0,0 @@ -package CPANPLUS::Internals::Constants::Report; -use deprecate; - -use strict; -use CPANPLUS::Error; - -use File::Spec; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -require Exporter; -use vars qw[$VERSION @ISA @EXPORT]; - -use Package::Constants; - -### for the version -require CPANPLUS::Internals; - -$VERSION = "0.9135"; -@ISA = qw[Exporter]; -@EXPORT = Package::Constants->list( __PACKAGE__ ); - -### OS to regex map ### -my %OS = ( - Amiga => 'amigaos', - Atari => 'mint', - BSD => 'bsdos|darwin|freebsd|openbsd|netbsd', - Be => 'beos', - BeOS => 'beos', - Cygwin => 'cygwin', - Darwin => 'darwin', - EBCDIC => 'os390|os400|posix-bc|vmesa', - HPUX => 'hpux', - Linux => 'linux', - MSDOS => 'dos|os2|MSWin32|cygwin', - 'bin\\d*Mac'=> 'MacOS|darwin', # binMac, bin56Mac, bin58Mac... - Mac => 'MacOS|darwin', - MacPerl => 'MacOS', - MacOS => 'MacOS|darwin', - MacOSX => 'darwin', - MPE => 'mpeix', - MPEiX => 'mpeix', - OS2 => 'os2', - Plan9 => 'plan9', - RISCOS => 'riscos', - SGI => 'irix', - Solaris => 'solaris', - Unix => 'aix|bsdos|darwin|dgux|dynixptx|freebsd|'. - 'linux|hpux|machten|netbsd|next|openbsd|dec_osf|'. - 'svr4|sco_sv|unicos|unicosmk|solaris|sunos', - VMS => 'VMS', - VOS => 'VOS', - Win32 => 'MSWin32|cygwin', - Win32API => 'MSWin32|cygwin', -); - -use constant GRADE_FAIL => 'fail'; -use constant GRADE_PASS => 'pass'; -use constant GRADE_NA => 'na'; -use constant GRADE_UNKNOWN => 'unknown'; - -use constant MAX_REPORT_SEND - => 2; - -use constant CPAN_TESTERS_EMAIL - => 'cpan-testers@perl.org'; - -### the cpan mail account for this user ### -use constant CPAN_MAIL_ACCOUNT - => sub { - my $username = shift or return; - return $username . '@cpan.org'; - }; - -### check if this module is platform specific and if we're on that -### specific platform. Alternately, the module is not platform specific -### and we're always OK to send out test results. -use constant RELEVANT_TEST_RESULT - => sub { - my $mod = shift or return; - my $name = $mod->module; - my $specific; - for my $platform (keys %OS) { - if( $name =~ /^$platform\b/i ) { - # beware the Mac != MAC - next if($platform eq 'Mac' && - $name !~ /^$platform\b/); - $specific++; - return 1 if - $^O =~ /^(?:$OS{$platform})$/ - } - }; - return $specific ? 0 : 1; - }; - -use constant UNSUPPORTED_OS - => sub { - my $buffer = shift or return; - if( $buffer =~ - /No support for OS|OS unsupported/im ) { - return 1; - } - return 0; - }; - -use constant PERL_VERSION_TOO_LOW - => sub { - my $buffer = shift or return; - # ExtUtils::MakeMaker format - if( $buffer =~ - /Perl .*? required--this is only .*?/m ) { - return 1; - } - # Module::Build format - if( $buffer =~ - /ERROR:( perl:)? Version .*?( of perl)? is installed, but we need version >= .*?/m ) { - return 1; - } - return 0; - }; - -use constant NO_TESTS_DEFINED - => sub { - my $buffer = shift or return; - if( $buffer =~ - /(No tests defined( for [\w:]+ extension)?\.)/ - and $buffer !~ /\*\.t/m and - $buffer !~ /test\.pl/m - ) { - return $1 - } - - return; - }; - -### what stage did the test fail? ### -use constant TEST_FAIL_STAGE - => sub { - my $buffer = shift or return; - return $buffer =~ /(MAKE [A-Z]+).*/ - ? lc $1 : - 'fetch'; - }; - - -use constant MISSING_PREREQS_LIST - => sub { - my $buffer = shift; - my $last = ( split /\[ERROR\] .+? MAKE TEST/, $buffer )[-1]; - my @list = map { s/.pm$//; s|/|::|g; $_ } - ($last =~ - m/\bCan\'t locate (\S+) in \@INC/g); - - ### make sure every missing prereq is only - ### listed once - { my %seen; - @list = grep { !$seen{$_}++ } @list - } - - return @list; - }; - -use constant MISSING_EXTLIBS_LIST - => sub { - my $buffer = shift; - my @list = - ($buffer =~ - m/No library found for -l([-\w]+)/g); - - return @list; - }; - -use constant REPORT_MESSAGE_HEADER - => sub { - my ($version, $author) = @_; - return << "."; - -Dear $author, - -This is a computer-generated error report created automatically by -CPANPLUS, version $version. Testers personal comments may appear -at the end of this report. - -. - }; - -use constant REPORT_MESSAGE_FAIL_HEADER - => sub { - my($stage, $buffer) = @_; - return << "."; - -Thank you for uploading your work to CPAN. However, it appears that -there were some problems testing your distribution. - -TEST RESULTS: - -Below is the error stack from stage '$stage': - -$buffer - -. - }; - -use constant REPORT_MESSAGE_PASS_HEADER - => sub { - my($stage, $buffer) = @_; - return << "."; - -Thank you for uploading your work to CPAN. Congratulations! -All tests were successful. - -TEST RESULTS: - -Below is the error stack from stage '$stage': - -$buffer - -. - }; - -use constant REPORT_MISSING_PREREQS - => sub { - my ($author,$email,@missing) = @_; - $author = ($author && $email) - ? "$author ($email)" - : 'Your Name Here'; - - my $modules = join "\n", @missing; - my $prereqs = join "\n", - map {"\t'$_'\t=> '0',". - " # or a minimum working version"} - @missing; - - return << "."; - -MISSING PREREQUISITES: - -It was observed that the test suite seem to fail without these modules: - -$modules - -As such, adding the prerequisite module(s) to 'PREREQ_PM' in your -Makefile.PL should solve this problem. For example: - -WriteMakefile( - AUTHOR => '$author', - ... # other information - PREREQ_PM => { -$prereqs - } -); - -Thanks! :-) - -. - }; - -use constant REPORT_MISSING_TESTS - => sub { - return << "."; -RECOMMENDATIONS: - -It would be very helpful if you could include even a simple test -script in the next release, so people can verify which platforms -can successfully install them, as well as avoid regression bugs? - -A simple 't/use.t' that says: - -#!/usr/bin/env perl -w -use strict; -use Test; -BEGIN { plan tests => 1 } - -use Your::Module::Here; ok(1); -exit; -__END__ - -would be appreciated. If you are interested in making a more robust -test suite, please see the Test::Simple, Test::More and Test::Tutorial -documentation at . - -Thanks! :-) - -. - }; - -use constant REPORT_LOADED_PREREQS - => sub { - my $mod = shift; - my $cb = $mod->parent; - my $prq = $mod->status->prereqs || {}; - - ### not every prereq may be coming from CPAN - ### so maybe we wont find it in our module - ### tree at all... - ### skip ones that cant be found in teh list - ### as reported in #12723 - my @prq = grep { defined } - map { $cb->module_tree($_) } - sort keys %$prq; - - ### no prereqs? - return '' unless @prq; - - ### some apparently, list what we loaded - my $str = << "."; -PREREQUISITES: - -Here is a list of prerequisites you specified and versions we -managed to load: - -. - $str .= join '', - map { sprintf "\t%s %-30s %8s %8s\n", - @$_ - - } [' ', 'Module Name', 'Have', 'Want'], - map { my $want = $prq->{$_->name}; - [ do { $_->is_uptodate( - version => $want - ) ? ' ' : '!' - }, - $_->name, - $_->installed_version, - $want - ], - ### might be empty entries in there - } grep { $_ } @prq; - - return $str; - }; - -use constant REPORT_TOOLCHAIN_VERSIONS - => sub { - my $mod = shift; - my $cb = $mod->parent; - #die unless $cb->isa('CPANPLUS::Backend'); - - my @toolchain_modules= qw( - CPANPLUS - CPANPLUS::Dist::Build - Cwd - ExtUtils::CBuilder - ExtUtils::Command - ExtUtils::Install - ExtUtils::MakeMaker - ExtUtils::Manifest - ExtUtils::ParseXS - File::Spec - Module::Build - Pod::Parser - Pod::Simple - Test::Harness - Test::More - version - ); - - my @toolchain = - grep { $_ } #module_tree returns '' when module is not found - map { $cb->module_tree($_) } - sort @toolchain_modules; - - ### no prereqs? - return '' unless @toolchain; - - ### toolchain modules - my $str = << "."; - -Perl module toolchain versions installed: -. - $str .= join '', - map { sprintf "\t%-30s %8s\n", - @$_ - - } ['Module Name', 'Have'], - map { - [ $_->name, - $_->installed_version, - ], - ### might be empty entries in there - } @toolchain; - - return $str; - }; - - -use constant REPORT_TESTS_SKIPPED - => sub { - return << "."; - -******************************** NOTE ******************************** -*** *** -*** The tests for this module were skipped during this build *** -*** *** -********************************************************************** - -. - }; - -use constant REPORT_MESSAGE_FOOTER - => sub { - return << "."; - -******************************** NOTE ******************************** -The comments above are created mechanically, possibly without manual -checking by the sender. As there are many people performing automatic -tests on each upload to CPAN, it is likely that you will receive -identical messages about the same problem. - -If you believe that the message is mistaken, please reply to the first -one with correction and/or additional informations, and do not take -it personally. We appreciate your patience. :) -********************************************************************** - -Additional comments: - -. - }; - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Extract.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Extract.pm deleted file mode 100644 index 4028aacfa70..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Extract.pm +++ /dev/null @@ -1,247 +0,0 @@ -package CPANPLUS::Internals::Extract; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; - -use File::Spec (); -use File::Basename (); -use Archive::Extract; -use IPC::Cmd qw[run]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load check_install]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -local $Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -CPANPLUS::Internals::Extract - internals for archive extraction - -=head1 SYNOPSIS - - ### for source files ### - $self->_gunzip( file => 'foo.gz', output => 'blah.txt' ); - - ### for modules/packages ### - $dir = $self->_extract( module => $modobj, - extractdir => '/some/where' ); - -=head1 DESCRIPTION - -CPANPLUS::Internals::Extract extracts compressed files for CPANPLUS. -It can do this by either a pure perl solution (preferred) with the -use of C and C, or with binaries, like -C and C. - -The flow looks like this: - - $cb->_extract - Delegate to Archive::Extract - -=head1 METHODS - -=head2 $dir = _extract( module => $modobj, [perl => '/path/to/perl', extractdir => '/path/to/extract/to', prefer_bin => BOOL, verbose => BOOL, force => BOOL] ) - -C<_extract> will take a module object and extract it to C -if provided, or the default location which is obtained from your -config. - -The file name is obtained by looking at C<< $modobj->status->fetch >> -and will be parsed to see if it's a tar or zip archive. - -If it's a zip archive, C<__unzip> will be called, otherwise C<__untar> -will be called. In the unlikely event the file is of neither format, -an error will be thrown. - -C<_extract> takes the following options: - -=over 4 - -=item module - -A C object. This is required. - -=item extractdir - -The directory to extract the archive to. By default this looks -something like: - /CPANPLUS_BASE/PERL_VERSION/BUILD/MODULE_NAME - -=item prefer_bin - -A flag indicating whether you prefer a pure perl solution, ie -C or C respectively, or a binary solution -like C and C. - -=item perl - -The path to the perl executable to use for any perl calls. Also used -to determine the build version directory for extraction. - -=item verbose - -Specifies whether to be verbose or not. Defaults to your corresponding -config entry. - -=item force - -Specifies whether to force the extraction or not. Defaults to your -corresponding config entry. - -=back - -All other options are passed on verbatim to C<__unzip> or C<__untar>. - -Returns the directory the file was extracted to on success and false -on failure. - -=cut - -sub _extract { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - local $Params::Check::ALLOW_UNKNOWN = 1; - - my( $mod, $verbose, $force ); - my $tmpl = { - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - prefer_bin => { default => $conf->get_conf('prefer_bin') }, - extractdir => { default => $conf->get_conf('extractdir') }, - module => { required => 1, allow => IS_MODOBJ, store => \$mod }, - perl => { default => $^X }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### did we already extract it ? ### - my $loc = $mod->status->extract(); - - if( $loc && !$force ) { - msg(loc("Already extracted '%1' to '%2'. ". - "Won't extract again without force", - $mod->module, $loc), $verbose); - return $loc; - } - - ### did we already fetch the file? ### - my $file = $mod->status->fetch(); - unless( -s $file ) { - error( loc( "File '%1' has zero size: cannot extract", $file ) ); - return; - } - - ### the dir to extract to ### - my $to = $args->{'extractdir'} || - File::Spec->catdir( - $conf->get_conf('base'), - $self->_perl_version( perl => $args->{'perl'} ), - $conf->_get_build('moddir'), - ); - - ### delegate to Archive::Extract ### - ### set up some flags for archive::extract ### - local $Archive::Extract::PREFER_BIN = $args->{'prefer_bin'}; - local $Archive::Extract::DEBUG = $conf->get_conf('debug'); - local $Archive::Extract::WARN = $verbose; - - my $ae = Archive::Extract->new( archive => $file ); - - unless( $ae->extract( to => $to ) ) { - error( loc( "Unable to extract '%1' to '%2': %3", - $file, $to, $ae->error ) ); - return; - } - - ### if ->files is not filled, we dont know what the hell was - ### extracted.. try to offer a suggestion and bail :( - unless ( $ae->files ) { - error( loc( "'%1' was not able to determine extracted ". - "files from the archive. Install '%2' and ensure ". - "it works properly and try again", - $ae->is_zip ? 'Archive::Zip' : 'Archive::Tar' ) ); - return; - } - - - ### print out what files we extracted ### - msg(loc("Extracted '%1'",$_),$verbose) for @{$ae->files}; - - ### set them all to be +w for the owner, so we don't get permission - ### denied for overwriting files that are just +r - - ### this is too rigorous -- just change to +w for the owner [cpan #13358] - #chmod 0755, map { File::Spec->rel2abs( File::Spec->catdir($to, $_) ) } - # @{$ae->files}; - - for my $file ( @{$ae->files} ) { - my $path = File::Spec->rel2abs( File::Spec->catfile($to, $file) ); - - $self->_mode_plus_w( file => $path ); - } - - ### check the return value for the extracted path ### - ### Make an educated guess if we didn't get an extract_path - ### back - ### XXX apparently some people make their own dists and they - ### pack up '.' which means the leading directory is '.' - ### and only the second directory is the actual module directory - ### so, we'll have to check if our educated guess exists first, - ### then see if the extract path works.. and if nothing works... - ### well, then we really don't know. - - my $dir; - for my $try ( - File::Spec->rel2abs( - ### _safe_path must be called before catdir because catdir on - ### VMS currently will not handle the extra dots in the directories. - File::Spec->catdir( $self->_safe_path( path => $to ) , - $self->_safe_path( path => - $mod->package_name .'-'. - $mod->package_version - ) ) ) , - File::Spec->rel2abs( $ae->extract_path ), - ) { - ($dir = $try) && last if -d $try; - } - - ### test if the dir exists ### - unless( $dir && -d $dir ) { - error(loc("Unable to determine extract dir for '%1'",$mod->module)); - return; - - } else { - msg(loc("Extracted '%1' to '%2'", $mod->module, $dir), $verbose); - - ### register where we extracted the files to, - ### also store what files were extracted - $mod->status->extract( $dir ); - $mod->status->files( $ae->files ); - } - - ### also, figure out what kind of install we're dealing with ### - $mod->get_installer_type(); - - return $mod->status->extract(); -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Fetch.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Fetch.pm deleted file mode 100644 index 098d1e3761f..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Fetch.pm +++ /dev/null @@ -1,476 +0,0 @@ -package CPANPLUS::Internals::Fetch; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; - -use File::Fetch; -use File::Spec; -use Cwd qw[cwd]; -use IPC::Cmd qw[run]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -$Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -CPANPLUS::Internals::Fetch - internals for fetching files - -=head1 SYNOPSIS - - my $output = $cb->_fetch( - module => $modobj, - fetchdir => '/path/to/save/to', - verbose => BOOL, - force => BOOL, - ); - - $cb->_add_fail_host( host => 'foo.com' ); - $cb->_host_ok( host => 'foo.com' ); - - -=head1 DESCRIPTION - -CPANPLUS::Internals::Fetch fetches files from either ftp, http, file -or rsync mirrors. - -This is the rough flow: - - $cb->_fetch - Delegate to File::Fetch; - - -=head1 METHODS - -=cut - -=head1 $path = _fetch( module => $modobj, [fetchdir => '/path/to/save/to', fetch_from => 'scheme://path/to/fetch/from', verbose => BOOL, force => BOOL, prefer_bin => BOOL, ttl => $seconds] ) - -C<_fetch> will fetch files based on the information in a module -object. You always need a module object. If you want a fake module -object for a one-off fetch, look at C. - -C is the place to save the file to. Usually this -information comes from your configuration, but you can override it -expressly if needed. - -C lets you specify an URI to get this file from. If you -do not specify one, your list of configured hosts will be probed to -download the file from. - -C forces a new download, even if the file already exists. - -C simply indicates whether or not to print extra messages. - -C indicates whether you prefer the use of commandline -programs over perl modules. Defaults to your corresponding config -setting. - -C (in seconds) indicates how long a cached copy is valid for. If -the fetch time of the local copy is within the ttl, the cached copy is -returned. Otherwise, the file is refetched. - -C<_fetch> figures out, based on the host list, what scheme to use and -from there, delegates to C do the actual fetching. - -Returns the path of the output file on success, false on failure. - -Note that you can set a C on certain methods in the config. -Simply add the identifying name of the method (ie, C) to: - $conf->_set_fetch( blacklist => ['lwp'] ); - -And the C function will be skipped by C. - -=cut - -sub _fetch { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - local $Params::Check::NO_DUPLICATES = 0; - - my ($modobj, $verbose, $force, $fetch_from, $ttl); - my $tmpl = { - module => { required => 1, allow => IS_MODOBJ, store => \$modobj }, - fetchdir => { default => $conf->get_conf('fetchdir') }, - fetch_from => { default => '', store => \$fetch_from }, - force => { default => $conf->get_conf('force'), - store => \$force }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - prefer_bin => { default => $conf->get_conf('prefer_bin') }, - ttl => { default => 0, store => \$ttl }, - }; - - - my $args = check( $tmpl, \%hash ) or return; - - ### check if we already downloaded the thing ### - if( (my $where = $modobj->status->fetch()) and not $force and not $ttl ) { - - msg(loc("Already fetched '%1' to '%2', " . - "won't fetch again without force", - $modobj->module, $where ), $verbose ); - return $where; - } - - my ($remote_file, $local_file, $local_path); - - ### build the local path to download to ### - { - $local_path = $args->{fetchdir} || - File::Spec->catdir( - $conf->get_conf('base'), - $modobj->path, - ); - - ### create the path if it doesn't exist ### - unless( -d $local_path ) { - unless( $self->_mkdir( dir => $local_path ) ) { - msg( loc("Could not create path '%1'", $local_path), $verbose); - return; - } - } - - $local_file = File::Spec->rel2abs( - File::Spec->catfile( - $local_path, - $modobj->package, - ) - ); - - ### do we already have the file? if so, can we use the cached version, - ### or do we need to refetch? - if( -e $local_file ) { - - my $unlink = 0; - my $use_cached = 0; - - ### if force is in effect, we have to refetch - if( $force ) { - $unlink++ - - ### if you provided a ttl, and it was exceeded, we'll refetch, - } elsif( $ttl and ([stat $local_file]->[9] + $ttl > time) ) { - msg(loc("Using cached file '%1' on disk; ". - "ttl (%2s) is not exceeded", - $local_file, $ttl), $verbose ); - - $use_cached++; - - ### if you provided a ttl, and the above conditional didn't match, - ### we exceeded the ttl, so we refetch - } elsif ( $ttl ) { - $unlink++; - - ### otherwise we can use the cached version - } else { - $use_cached++; - } - - if( $unlink ) { - ### some fetches will fail if the files exist already, so let's - ### delete them first - 1 while unlink $local_file; - - msg(loc("Could not delete %1, some methods may " . - "fail to force a download", $local_file), $verbose) - if -e $local_file; - - } else { - - ### store where we fetched it ### - $modobj->status->fetch( $local_file ); - - return $local_file; - } - } - } - - - ### we got a custom URI - if ( $fetch_from ) { - my $abs = $self->__file_fetch( from => $fetch_from, - to => $local_path, - verbose => $verbose ); - - unless( $abs ) { - error(loc("Unable to download '%1'", $fetch_from)); - return; - } - - ### store where we fetched it ### - $modobj->status->fetch( $abs ); - - return $abs; - - ### we will get it from one of our mirrors - } else { - ### build the remote path to download from ### - { $remote_file = File::Spec::Unix->catfile( - $modobj->path, - $modobj->package, - ); - unless( $remote_file ) { - error( loc('No remote file given for download') ); - return; - } - } - - ### see if we even have a host or a method to use to download with ### - my $found_host; - my @maybe_bad_host; - - HOST: { - ### F*CKING PIECE OF F*CKING p4 SHIT makes - ### '$File :: Fetch::SOME_VAR' - ### into a meta variable and starts substituting the file name... - ### GRAAAAAAAAAAAAAAAAAAAAAAH! - ### use ' to combat it! - - ### set up some flags for File::Fetch ### - local $File'Fetch::BLACKLIST = $conf->_get_fetch('blacklist'); - local $File'Fetch::TIMEOUT = $conf->get_conf('timeout'); - local $File'Fetch::DEBUG = $conf->get_conf('debug'); - local $File'Fetch::FTP_PASSIVE = $conf->get_conf('passive'); - local $File'Fetch::FROM_EMAIL = $conf->get_conf('email'); - local $File'Fetch::PREFER_BIN = $conf->get_conf('prefer_bin'); - local $File'Fetch::WARN = $verbose; - - - ### loop over all hosts we have ### - for my $host ( @{$conf->get_conf('hosts')} ) { - $found_host++; - - my $where; - - ### file:// uris are special and need parsing - if( $host->{'scheme'} eq 'file' ) { - - ### the full path in the native format of the OS - my $host_spec = - File::Spec->file_name_is_absolute( $host->{'path'} ) - ? $host->{'path'} - : File::Spec->rel2abs( $host->{'path'} ); - - ### there might be volumes involved on vms/win32 - if( ON_WIN32 or ON_VMS ) { - - ### now extract the volume in order to be Win32 and - ### VMS friendly. - ### 'no_file' indicates that there's no file part - ### of this path, so we only get 2 bits returned. - my ($vol, $host_path) = File::Spec->splitpath( - $host_spec, 'no_file' - ); - - ### and split up the directories - my @host_dirs = File::Spec->splitdir( $host_path ); - - ### if we got a volume we pretend its a directory for - ### the sake of the file:// url - if( defined $vol and $vol ) { - - ### D:\foo\bar needs to be encoded as D|\foo\bar - ### For details, see the following link: - ### http://en.wikipedia.org/wiki/File:// - ### The RFC doesn't seem to address Windows volume - ### descriptors but it does address VMS volume - ### descriptors, however wikipedia covers a bit of - ### history regarding win32 - $vol =~ s/:$/|/ if ON_WIN32; - - $vol =~ s/:// if ON_VMS; - - ### XXX i'm not sure what cases this is addressing. - ### this comes straight from dmq's file:// patches - ### for win32. --kane - ### According to dmq, the best summary is: - ### "if file:// urls dont look right on VMS reuse - ### the win32 logic and see if that fixes things" - - ### first element not empty? Might happen on VMS. - ### prepend the volume in that case. - if( $host_dirs[0] ) { - unshift @host_dirs, $vol; - - ### element empty? reuse it to store the volume - ### encoded as a directory name. (Win32/VMS) - } else { - $host_dirs[0] = $vol; - } - } - - ### now it's in UNIX format, which is the same format - ### as used for URIs - $host_spec = File::Spec::Unix->catdir( @host_dirs ); - } - - ### now create the file:// uri from the components - $where = CREATE_FILE_URI->( - File::Spec::Unix->catfile( - $host->{'host'} || '', - $host_spec, - $remote_file, - ) - ); - - ### its components will be in unix format, for a http://, - ### ftp:// or any other style of URI - } else { - my $mirror_path = File::Spec::Unix->catfile( - $host->{'path'}, $remote_file - ); - - my %args = ( scheme => $host->{scheme}, - host => $host->{host}, - path => $mirror_path, - ); - - $where = $self->_host_to_uri( %args ); - } - - my $abs = $self->__file_fetch( from => $where, - to => $local_path, - verbose => $verbose ); - - ### we got a path back? - if( $abs ) { - ### store where we fetched it ### - $modobj->status->fetch( $abs ); - - ### this host is good, the previous ones are apparently - ### not, so mark them as such. - $self->_add_fail_host( host => $_ ) for @maybe_bad_host; - - return $abs; - } - - ### so we tried to get the file but didn't actually fetch it -- - ### there's a chance this host is bad. mark it as such and - ### actually flag it back if we manage to get the file - ### somewhere else - push @maybe_bad_host, $host; - } - } - - $found_host - ? error(loc("Fetch failed: host list exhausted " . - "-- are you connected today?")) - : error(loc("No hosts found to download from " . - "-- check your config")); - } - - return; -} - -sub __file_fetch { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my ($where, $local_path, $verbose); - my $tmpl = { - from => { required => 1, store => \$where }, - to => { required => 1, store => \$local_path }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - }; - - check( $tmpl, \%hash ) or return; - - msg(loc("Trying to get '%1'", $where ), $verbose ); - - ### build the object ### - my $ff = File::Fetch->new( uri => $where ); - - ### sanity check ### - error(loc("Bad uri '%1'",$where)), return unless $ff; - - if( my $file = $ff->fetch( to => $local_path ) ) { - unless( -e $file && -s _ ) { - msg(loc("'%1' said it fetched '%2', but it was not created", - 'File::Fetch', $file), $verbose); - - } else { - my $abs = File::Spec->rel2abs( $file ); - - ### so TTLs will work - $self->_update_timestamp( file => $abs ); - - return $abs; - } - - } else { - error(loc("Fetching of '%1' failed: %2", $where, $ff->error)); - } - - return; -} - -=pod - -=head2 _add_fail_host( host => $host_hashref ) - -Mark a particular host as bad. This makes C -skip it in fetches until this cache is flushed. - -=head2 _host_ok( host => $host_hashref ) - -Query the cache to see if this host is ok, or if it has been flagged -as bad. - -Returns true if the host is ok, false otherwise. - -=cut - -{ ### caching functions ### - - sub _add_fail_host { - my $self = shift; - my %hash = @_; - - my $host; - my $tmpl = { - host => { required => 1, default => {}, - strict_type => 1, store => \$host }, - }; - - check( $tmpl, \%hash ) or return; - - return $self->_hosts->{$host} = 1; - } - - sub _host_ok { - my $self = shift; - my %hash = @_; - - my $host; - my $tmpl = { - host => { required => 1, store => \$host }, - }; - - check( $tmpl, \%hash ) or return; - - return $self->_hosts->{$host} ? 0 : 1; - } -} - - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Report.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Report.pm deleted file mode 100644 index c5892f93bb6..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Report.pm +++ /dev/null @@ -1,696 +0,0 @@ -package CPANPLUS::Internals::Report; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; -use CPANPLUS::Internals::Constants::Report; - -use Data::Dumper; - -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use version; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -$Params::Check::VERBOSE = 1; - -### for the version ### -require CPANPLUS::Internals; - -=head1 NAME - -CPANPLUS::Internals::Report - internals for sending test reports - -=head1 SYNOPSIS - - ### enable test reporting - $cb->configure_object->set_conf( cpantest => 1 ); - - ### set custom mx host, shouldn't normally be needed - $cb->configure_object->set_conf( cpantest_mx => 'smtp.example.com' ); - -=head1 DESCRIPTION - -This module provides all the functionality to send test reports to -C using the C module. - -All methods will be called automatically if you have C -configured to enable test reporting (see the C). - -=head1 METHODS - -=head2 $bool = $cb->_have_query_report_modules - -This function checks if all the required modules are here for querying -reports. It returns true and loads them if they are, or returns false -otherwise. - -=head2 $bool = $cb->_have_send_report_modules - -This function checks if all the required modules are here for sending -reports. It returns true and loads them if they are, or returns false -otherwise. - -=cut - -### XXX remove this list and move it into selfupdate, somehow.. -### this is dual administration -{ my $query_list = { - 'File::Fetch' => '0.13_02', - 'Parse::CPAN::Meta' => '0.0', - 'File::Temp' => '0.0', - }; - - my $send_list = { - %$query_list, - 'Test::Reporter' => '1.54', - }; - - sub _have_query_report_modules { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my $tmpl = { - verbose => { default => $conf->get_conf('verbose') }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - return can_load( modules => $query_list, verbose => $args->{verbose} ) - ? 1 - : 0; - } - - sub _have_send_report_modules { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my $tmpl = { - verbose => { default => $conf->get_conf('verbose') }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - return can_load( modules => $send_list, verbose => $args->{verbose} ) - ? 1 - : 0; - } -} - -=head2 @list = $cb->_query_report( module => $modobj, [all_versions => BOOL, verbose => BOOL] ) - -This function queries the CPAN testers database at -I for test results of specified module objects, -module names or distributions. - -The optional argument C controls whether all versions of -a given distribution should be grabbed. It defaults to false -(fetching only reports for the current version). - -Returns the a list with the following data structures (for CPANPLUS -version 0.042) on success, or false on failure. The contents of the -data structure depends on what I returns, -but generally looks like this: - - { - 'grade' => 'PASS', - 'dist' => 'CPANPLUS-0.042', - 'platform' => 'i686-pld-linux-thread-multi' - 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/98316' - ... - }, - { - 'grade' => 'PASS', - 'dist' => 'CPANPLUS-0.042', - 'platform' => 'i686-linux-thread-multi' - 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99416' - ... - }, - { - 'grade' => 'FAIL', - 'dist' => 'CPANPLUS-0.042', - 'platform' => 'cygwin-multi-64int', - 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99371' - ... - }, - { - 'grade' => 'FAIL', - 'dist' => 'CPANPLUS-0.042', - 'platform' => 'i586-linux', - 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99396' - ... - }, - -The status of the test can be one of the following: -UNKNOWN, PASS, FAIL or NA (not applicable). - -=cut - -sub _query_report { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($mod, $verbose, $all); - my $tmpl = { - module => { required => 1, allow => IS_MODOBJ, - store => \$mod }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - all_versions => { default => 0, store => \$all }, - }; - - check( $tmpl, \%hash ) or return; - - ### check if we have the modules we need for querying - return unless $self->_have_query_report_modules( verbose => 1 ); - - - ### XXX no longer use LWP here. However, that means we don't - ### automagically set proxies anymore!!! - # my $ua = LWP::UserAgent->new; - # $ua->agent( CPANPLUS_UA->() ); - # - ### set proxies if we have them ### - # $ua->env_proxy(); - - my $url = TESTERS_URL->($mod->package_name); - my $ff = File::Fetch->new( uri => $url ); - - msg( loc("Fetching: '%1'", $url), $verbose ); - - my $res = do { - my $tempdir = File::Temp::tempdir(); - my $where = $ff->fetch( to => $tempdir ); - - unless( $where ) { - error( loc( "Fetching report for '%1' failed: %2", - $url, $ff->error ) ); - return; - } - - my $fh = OPEN_FILE->( $where ); - - do { local $/; <$fh> }; - }; - - my ($aref) = eval { Parse::CPAN::Meta::Load( $res ) }; - - if( $@ ) { - error(loc("Error reading result: %1", $@)); - return; - }; - - my $dist = $mod->package_name .'-'. $mod->package_version; - my $details = TESTERS_DETAILS_URL->($mod->package_name); - - my @rv; - for my $href ( @$aref ) { - next unless $all or defined $href->{'distversion'} && - $href->{'distversion'} eq $dist; - - $href->{'details'} = $details; - - ### backwards compatibility :( - $href->{'dist'} ||= $href->{'distversion'}; - $href->{'grade'} ||= $href->{'action'} || $href->{'status'}; - - push @rv, $href; - } - - return @rv if @rv; - return; -} - -=pod - -=head2 $bool = $cb->_send_report( module => $modobj, buffer => $make_output, failed => BOOL, [save => BOOL, address => $email_to, verbose => BOOL, force => BOOL]); - -This function sends a testers report to C for a -particular distribution. -It returns true on success, and false on failure. - -It takes the following options: - -=over 4 - -=item module - -The module object of this particular distribution - -=item buffer - -The output buffer from the 'make/make test' process - -=item failed - -Boolean indicating if the 'make/make test' went wrong - -=item save - -Boolean indicating if the report should be saved locally instead of -mailed out. If provided, this function will return the location the -report was saved to, rather than a simple boolean 'TRUE'. - -Defaults to false. - -=item address - -The email address to mail the report for. You should never need to -override this, but it might be useful for debugging purposes. - -Defaults to C. - -=item verbose - -Boolean indicating on whether or not to be verbose. - -Defaults to your configuration settings - -=item force - -Boolean indicating whether to force the sending, even if the max -amount of reports for fails have already been reached, or if you -may already have sent it before. - -Defaults to your configuration settings - -=back - -=cut - -sub _send_report { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - ### do you even /have/ test::reporter? ### - unless( $self->_have_send_report_modules(verbose => 1) ) { - error( loc( "You don't have '%1' (or modules required by '%2') ". - "installed, you cannot report test results.", - 'Test::Reporter', 'Test::Reporter' ) ); - return; - } - - ### check arguments ### - my ($buffer, $failed, $mod, $verbose, $force, $address, $save, - $tests_skipped, $status ); - my $tmpl = { - module => { required => 1, store => \$mod, allow => IS_MODOBJ }, - buffer => { required => 1, store => \$buffer }, - failed => { required => 1, store => \$failed }, - status => { default => {}, store => \$status, strict_type => 1 }, - address => { default => CPAN_TESTERS_EMAIL, store => \$address }, - save => { default => 0, store => \$save }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - force => { default => $conf->get_conf('force'), - store => \$force }, - tests_skipped - => { default => 0, store => \$tests_skipped }, - }; - - check( $tmpl, \%hash ) or return; - - ### get the data to fill the email with ### - my $name = $mod->module; - my $dist = $mod->package_name . '-' . $mod->package_version; - my $author = $mod->author->author; - my $distfile= $mod->author->cpanid . "/" . $mod->package; - my $email = $mod->author->email || CPAN_MAIL_ACCOUNT->( $author ); - my $cp_conf = $conf->get_conf('cpantest') || ''; - my $int_ver = $CPANPLUS::Internals::VERSION; - my $cb = $mod->parent; - - - ### will be 'fetch', 'make', 'test', 'install', etc ### - my $stage = TEST_FAIL_STAGE->($buffer); - - ### determine the grade now ### - - my $grade; - ### check if this is a platform specific module ### - ### if we failed the test, there may be reasons why - ### an 'NA' might have to be instead - GRADE: { if ( $failed ) { - - - ### XXX duplicated logic between this block - ### and REPORTED_LOADED_PREREQS :( - - ### figure out if the prereqs are on CPAN at all - ### -- if not, send NA grade - ### Also, if our version of prereqs is too low, - ### -- send NA grade. - ### This is to address bug: #25327: do not count - ### as FAIL modules where prereqs are not filled - { my $prq = $mod->status->prereqs || {}; - - PREREQ: while( my($prq_name,$prq_ver) = each %$prq ) { - - # 'perl' listed as prereq - - if ( $prq_name eq 'perl' ) { - my $req_ver = eval { version->new( $prq_ver ) }; - next PREREQ unless $req_ver; - if ( version->new( $] ) < $req_ver ) { - msg(loc("'%1' requires a higher version of perl than your current ". - "version -- sending N/A grade.", $name), $verbose); - - $grade = GRADE_NA; - last GRADE; - } - next PREREQ; - } - - my $obj = $cb->module_tree( $prq_name ); - my $sub = CPANPLUS::Module->can( - 'module_is_supplied_with_perl_core' ); - - ### if we can't find the module and it's not supplied with core. - ### this addresses: #32064: NA reports generated for failing - ### tests where core prereqs are specified - ### Note that due to a bug in Module::CoreList, in some released - ### version of perl (5.8.6+ and 5.9.2-4 at the time of writing) - ### 'Config' is not recognized as a core module. See this bug: - ### http://rt.cpan.org/Ticket/Display.html?id=32155 - if( !$obj and !defined $sub->( $prq_name ) ) { - msg(loc( "Prerequisite '%1' for '%2' could not be obtained". - " from CPAN -- sending N/A grade", - $prq_name, $name ), $verbose ); - - $grade = GRADE_NA; - last GRADE; - } - - if ( !$obj ) { - my $vcore = $sub->( $prq_name ); - if ( $cb->_vcmp( $prq_ver, $vcore ) > 0 ) { - msg(loc( "Version of core module '%1' ('%2') is too low for ". - "'%3' (needs '%4') -- sending N/A grade", - $prq_name, $vcore, - $name, $prq_ver ), $verbose ); - - $grade = GRADE_NA; - last GRADE; - } - } - - if( $obj and $cb->_vcmp( $prq_ver, $obj->installed_version ) > 0 ) { - msg(loc( "Installed version of '%1' ('%2') is too low for ". - "'%3' (needs '%4') -- sending N/A grade", - $prq_name, $obj->installed_version, - $name, $prq_ver ), $verbose ); - - $grade = GRADE_NA; - last GRADE; - } - } - } - - unless( RELEVANT_TEST_RESULT->($mod) ) { - msg(loc( - "'%1' is a platform specific module, and the test results on". - " your platform are not relevant --sending N/A grade.", - $name), $verbose); - - $grade = GRADE_NA; - - } elsif ( UNSUPPORTED_OS->( $buffer ) ) { - msg(loc( - "'%1' is a platform specific module, and the test results on". - " your platform are not relevant --sending N/A grade.", - $name), $verbose); - - $grade = GRADE_NA; - - ### you dont have a high enough perl version? - } elsif ( PERL_VERSION_TOO_LOW->( $buffer ) ) { - msg(loc("'%1' requires a higher version of perl than your current ". - "version -- sending N/A grade.", $name), $verbose); - - $grade = GRADE_NA; - - ### perhaps where were no tests... - ### see if the thing even had tests ### - } elsif ( NO_TESTS_DEFINED->( $buffer ) ) { - $grade = GRADE_UNKNOWN; - ### failures in PL or make/build stage are now considered UNKNOWN - } elsif ( $stage !~ /\btest\b/ ) { - - $grade = GRADE_UNKNOWN - - } else { - - $grade = GRADE_FAIL; - } - - ### if we got here, it didn't fail and tests were present.. so a PASS - ### is in order - } else { - $grade = GRADE_PASS; - } } - - ### so an error occurred, let's see what stage it went wrong in ### - - ### the header -- always include so the CPANPLUS version is apparent - my $message = REPORT_MESSAGE_HEADER->( $int_ver, $author ); - - if( $grade eq GRADE_FAIL or $grade eq GRADE_UNKNOWN) { - - ### return if one or more missing external libraries - if( my @missing = MISSING_EXTLIBS_LIST->($buffer) ) { - msg(loc("Not sending test report - " . - "external libraries not pre-installed")); - return 1; - } - - ### return if we're only supposed to report make_test failures ### - return 1 if $cp_conf =~ /\bmaketest_only\b/i - and ($stage !~ /\btest\b/); - - my $capture = ( $status && defined $status->{capture} ? $status->{capture} : $buffer ); - ### the bit where we inform what went wrong - $message .= REPORT_MESSAGE_FAIL_HEADER->( $stage, $capture ); - - ### was it missing prereqs? ### - if( my @missing = MISSING_PREREQS_LIST->($buffer) ) { - if(!$self->_verify_missing_prereqs( - module => $mod, - missing => \@missing - )) { - msg(loc("Not sending test report - " . - "bogus missing prerequisites report")); - return 1; - } - $message .= REPORT_MISSING_PREREQS->($author,$email,@missing); - } - - ### was it missing test files? ### - if( NO_TESTS_DEFINED->($buffer) ) { - $message .= REPORT_MISSING_TESTS->(); - } - - ### add a list of what modules have been loaded of your prereqs list - $message .= REPORT_LOADED_PREREQS->($mod); - - ### add a list of versions of toolchain modules - $message .= REPORT_TOOLCHAIN_VERSIONS->($mod); - - ### the footer - $message .= REPORT_MESSAGE_FOOTER->(); - - ### it may be another grade than fail/unknown.. may be worth noting - ### that tests got skipped, since the buffer is not added in - } elsif ( $tests_skipped ) { - $message .= REPORT_TESTS_SKIPPED->(); - } elsif( $grade eq GRADE_NA) { - - my $capture = ( $status && defined $status->{capture} ? $status->{capture} : $buffer ); - - ### add the reason for the NA to the buffer - $capture = join $/, $capture, map { - '[' . $_->tag . '] [' . $_->when . '] ' . - $_->message } ( CPANPLUS::Error->stack )[-1]; - - ### the bit where we inform what went wrong - $message .= REPORT_MESSAGE_FAIL_HEADER->( $stage, $capture ); - - ### add a list of what modules have been loaded of your prereqs list - $message .= REPORT_LOADED_PREREQS->($mod); - - ### add a list of versions of toolchain modules - $message .= REPORT_TOOLCHAIN_VERSIONS->($mod); - - ### the footer - $message .= REPORT_MESSAGE_FOOTER->(); - - } elsif ( $grade eq GRADE_PASS and ( $status and defined $status->{capture} ) ) { - ### the bit where we inform what went right - $message .= REPORT_MESSAGE_PASS_HEADER->( $stage, $status->{capture} ); - - ### add a list of what modules have been loaded of your prereqs list - $message .= REPORT_LOADED_PREREQS->($mod); - - ### add a list of versions of toolchain modules - $message .= REPORT_TOOLCHAIN_VERSIONS->($mod); - - ### the footer - $message .= REPORT_MESSAGE_FOOTER->(); - - } - - msg( loc("Sending test report for '%1'", $dist), $verbose); - - ### reporter object ### - my $reporter = do { - my $args = $conf->get_conf('cpantest_reporter_args') || {}; - - unless( UNIVERSAL::isa( $args, 'HASH' ) ) { - error(loc("'%1' must be a hashref, ignoring...", - 'cpantest_reporter_args')); - $args = {}; - } - - Test::Reporter->new( - grade => $grade, - distribution => $dist, - distfile => $distfile, - via => "CPANPLUS $int_ver", - timeout => $conf->get_conf('timeout') || 60, - debug => $conf->get_conf('debug'), - %$args, - ); - }; - - ### set a custom mx, if requested - $reporter->mx( [ $conf->get_conf('cpantest_mx') ] ) - if $conf->get_conf('cpantest_mx'); - - ### set the from address ### - $reporter->from( $conf->get_conf('email') ) - if $conf->get_conf('email') !~ /\@example\.\w+$/i; - - ### give the user a chance to programatically alter the message - $message = $self->_callbacks->munge_test_report->($mod, $message, $grade); - - ### add the body if we have any ### - $reporter->comments( $message ) if defined $message && length $message; - - ### do a callback to ask if we should send the report - unless ($self->_callbacks->send_test_report->($mod, $grade)) { - msg(loc("Ok, not sending test report")); - return 1; - } - - ### do a callback to ask if we should edit the report - if ($self->_callbacks->edit_test_report->($mod, $grade)) { - ### test::reporter 1.20 and lower don't have a way to set - ### the preferred editor with a method call, but it does - ### respect your env variable, so let's set that. - local $ENV{VISUAL} = $conf->get_program('editor') - if $conf->get_program('editor'); - - $reporter->edit_comments; - } - - ### allow to be overridden, but default to the normal address ### - $reporter->address( $address ); - - ### should we save it locally? ### - if( $save ) { - if( my $file = $reporter->write() ) { - msg(loc("Successfully wrote report for '%1' to '%2'", - $dist, $file), $verbose); - return $file; - - } else { - error(loc("Failed to write report for '%1'", $dist)); - return; - } - - ### XXX should we do an 'already sent' check? ### - ### something broke :( ### - } - else { - my $status; - eval { - $status = $reporter->send(); - }; - if ( $@ ) { - error(loc("Could not send '%1' report for '%2': %3", - $grade, $dist, $@)); - return; - } - if ( $status ) { - msg(loc("Successfully sent '%1' report for '%2'", $grade, $dist), - $verbose); - return 1; - } - error(loc("Could not send '%1' report for '%2': %3", - $grade, $dist, $reporter->errstr)); - return; - } -} - -sub _verify_missing_prereqs { - my $self = shift; - my %hash = @_; - - ### check arguments ### - my ($mod, $missing); - my $tmpl = { - module => { required => 1, store => \$mod }, - missing => { required => 1, store => \$missing }, - }; - - check( $tmpl, \%hash ) or return; - - - my %missing = map {$_ => 1} @$missing; - my $conf = $self->configure_object; - my $extract = $mod->status->extract; - - ### Read pre-requisites from Makefile.PL or Build.PL (if there is one), - ### of the form: - ### 'PREREQ_PM' => { - ### 'Compress::Zlib' => '1.20', - ### 'Test::More' => 0, - ### }, - ### Build.PL uses 'requires' instead of 'PREREQ_PM'. - - my @search; - push @search, ($extract ? MAKEFILE_PL->( $extract ) : MAKEFILE_PL->()); - push @search, ($extract ? BUILD_PL->( $extract ) : BUILD_PL->()); - - for my $file ( @search ) { - if(-e $file and -r $file) { - my $slurp = $self->_get_file_contents(file => $file); - my ($prereq) = - ($slurp =~ /'?(?:PREREQ_PM|requires)'?\s*=>\s*{(.*?)}/s); - my @prereq = - ($prereq =~ /'?([\w\:]+)'?\s*=>\s*'?\d[\d\.\-\_]*'?/sg); - delete $missing{$_} for(@prereq); - } - } - - return 1 if(keys %missing); # There ARE missing prerequisites - return; # All prerequisites accounted for -} - -1; - - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Search.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Search.pm deleted file mode 100644 index 2a99dbfde30..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Search.pm +++ /dev/null @@ -1,367 +0,0 @@ -package CPANPLUS::Internals::Search; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; -use CPANPLUS::Module; -use CPANPLUS::Module::Author; - -use File::Find; -use File::Spec; - -use Params::Check qw[check allow]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -$Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -CPANPLUS::Internals::Search - internals for searching for modules - -=head1 SYNOPSIS - - my $aref = $cpan->_search_module_tree( - type => 'package', - allow => [qr/DBI/], - ); - - my $aref = $cpan->_search_author_tree( - type => 'cpanid', - data => \@old_results, - verbose => 1, - allow => [qw|KANE AUTRIJUS|], - ); - - my $aref = $cpan->_all_installed( ); - -=head1 DESCRIPTION - -The functions in this module are designed to find module(objects) -based on certain criteria and return them. - -=head1 METHODS - -=head2 _search_module_tree( type => TYPE, allow => \@regexes, [data => \@previous_results ] ) - -Searches the moduletree for module objects matching the criteria you -specify. Returns an array ref of module objects on success, and false -on failure. - -It takes the following arguments: - -=over 4 - -=item type - -This can be any of the accessors for the C objects. -This is a required argument. - -=item allow - -A set of rules, or more precisely, a list of regexes (via C or -plain strings), that the C must adhere too. You can specify as -many as you like, and it will be treated as an C search. -For an C search, see the C argument. - -This is a required argument. - -=item data - -An arrayref of previous search results. This is the way to do an C -search -- C<_search_module_tree> will only search the module objects -specified in C if provided, rather than the moduletree itself. - -=back - -=cut - -# Although the Params::Check solution is more graceful, it is WAY too slow. -# -# This sample script: -# -# use CPANPLUS::Backend; -# my $cb = new CPANPLUS::Backend; -# $cb->module_tree; -# my @list = $cb->search( type => 'module', allow => [qr/^Acme/] ); -# print $_->module, $/ for @list; -# -# Produced the following output using Dprof WITH params::check code -# -# Total Elapsed Time = 3.670024 Seconds -# User+System Time = 3.390373 Seconds -# Exclusive Times -# %Time ExclSec CumulS #Calls sec/call Csec/c Name -# 88.7 3.008 4.463 20610 0.0001 0.0002 Params::Check::check -# 47.4 1.610 1.610 1 1.6100 1.6100 Storable::net_pstore -# 25.6 0.869 0.737 20491 0.0000 0.0000 Locale::Maketext::Simple::_default -# _gettext -# 23.2 0.789 0.524 40976 0.0000 0.0000 Params::Check::_who_was_it -# 23.2 0.789 0.677 20610 0.0000 0.0000 Params::Check::_sanity_check -# 19.7 0.670 0.670 1 0.6700 0.6700 Storable::pretrieve -# 14.1 0.480 0.211 41350 0.0000 0.0000 Params::Check::_convert_case -# 11.5 0.390 0.256 20610 0.0000 0.0000 Params::Check::_hashdefs -# 11.5 0.390 0.255 20697 0.0000 0.0000 Params::Check::_listreqs -# 11.4 0.389 0.177 20653 0.0000 0.0000 Params::Check::_canon_key -# 10.9 0.370 0.356 20697 0.0000 0.0000 Params::Check::_hasreq -# 8.02 0.272 4.750 1 0.2723 4.7501 CPANPLUS::Internals::Search::_sear -# ch_module_tree -# 6.49 0.220 0.086 20653 0.0000 0.0000 Params::Check::_iskey -# 6.19 0.210 0.077 20488 0.0000 0.0000 Params::Check::_store_error -# 5.01 0.170 0.036 20680 0.0000 0.0000 CPANPLUS::Module::__ANON__ -# -# and this output /without/ -# -# Total Elapsed Time = 2.803426 Seconds -# User+System Time = 2.493426 Seconds -# Exclusive Times -# %Time ExclSec CumulS #Calls sec/call Csec/c Name -# 56.9 1.420 1.420 1 1.4200 1.4200 Storable::net_pstore -# 25.6 0.640 0.640 1 0.6400 0.6400 Storable::pretrieve -# 9.22 0.230 0.096 20680 0.0000 0.0000 CPANPLUS::Module::__ANON__ -# 7.06 0.176 0.272 1 0.1762 0.2719 CPANPLUS::Internals::Search::_sear -# ch_module_tree -# 3.21 0.080 0.098 10 0.0080 0.0098 IPC::Cmd::BEGIN -# 1.60 0.040 0.205 13 0.0031 0.0158 CPANPLUS::Internals::BEGIN -# 1.20 0.030 0.030 29 0.0010 0.0010 vars::BEGIN -# 1.20 0.030 0.117 10 0.0030 0.0117 Log::Message::BEGIN -# 1.20 0.030 0.029 9 0.0033 0.0033 CPANPLUS::Internals::Search::BEGIN -# 0.80 0.020 0.020 5 0.0040 0.0040 DynaLoader::dl_load_file -# 0.80 0.020 0.127 10 0.0020 0.0127 CPANPLUS::Module::BEGIN -# 0.80 0.020 0.389 2 0.0099 0.1944 main::BEGIN -# 0.80 0.020 0.359 12 0.0017 0.0299 CPANPLUS::Backend::BEGIN -# 0.40 0.010 0.010 30 0.0003 0.0003 Config::FETCH -# 0.40 0.010 0.010 18 0.0006 0.0005 Locale::Maketext::Simple::load_loc -# - -sub _search_module_tree { - - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($mods,$list,$verbose,$type); - my $tmpl = { - data => { default => [], - strict_type=> 1, store => \$mods }, - allow => { required => 1, default => [ ], strict_type => 1, - store => \$list }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - type => { required => 1, allow => [CPANPLUS::Module->accessors()], - store => \$type }, - }; - - my $args = do { - ### don't check the template for sanity - ### -- we know it's good and saves a lot of performance - local $Params::Check::SANITY_CHECK_TEMPLATE = 0; - - check( $tmpl, \%hash ); - } or return; - - ### a list of module objects was supplied - if( @$mods ) { - local $Params::Check::VERBOSE = 0; - - my @rv; - for my $mod (@$mods) { - #push @rv, $mod if check( - # { $type => { allow => $list } }, - # { $type => $mod->$type() } - # ); - push @rv, $mod if allow( $mod->$type() => $list ); - - } - return \@rv; - - } else { - my @rv = $self->_source_search_module_tree( - allow => $list, - type => $type, - ); - return \@rv; - } -} - -=pod - -=head2 _search_author_tree( type => TYPE, allow => \@regexex, [data => \@previous_results ] ) - -Searches the authortree for author objects matching the criteria you -specify. Returns an array ref of author objects on success, and false -on failure. - -It takes the following arguments: - -=over 4 - -=item type - -This can be any of the accessors for the C -objects. This is a required argument. - -=item allow - - -A set of rules, or more precisely, a list of regexes (via C or -plain strings), that the C must adhere too. You can specify as -many as you like, and it will be treated as an C search. -For an C search, see the C argument. - -This is a required argument. - -=item data - -An arrayref of previous search results. This is the way to do an C -search -- C<_search_author_tree> will only search the author objects -specified in C if provided, rather than the authortree itself. - -=back - -=cut - -sub _search_author_tree { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($authors,$list,$verbose,$type); - my $tmpl = { - data => { default => [], - strict_type=> 1, store => \$authors }, - allow => { required => 1, default => [ ], strict_type => 1, - store => \$list }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - type => { required => 1, allow => [CPANPLUS::Module::Author->accessors()], - store => \$type }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - if( @$authors ) { - local $Params::Check::VERBOSE = 0; - - my @rv; - for my $auth (@$authors) { - #push @rv, $auth if check( - # { $type => { allow => $list } }, - # { $type => $auth->$type } - # ); - push @rv, $auth if allow( $auth->$type() => $list ); - } - return \@rv; - } else { - my @rv = $self->_source_search_author_tree( - allow => $list, - type => $type, - ); - return \@rv; - } -} - -=pod - -=head2 _all_installed() - -This function returns an array ref of module objects of modules that -are installed on this system. - -=cut - -sub _all_installed { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - ### File::Find uses follow_skip => 1 by default, which doesn't die - ### on duplicates, unless they are directories or symlinks. - ### Ticket #29796 shows this code dying on Alien::WxWidgets, - ### which uses symlinks. - ### File::Find doc says to use follow_skip => 2 to ignore duplicates - ### so this will stop it from dying. - my %find_args = ( follow_skip => 2 ); - - ### File::Find uses lstat, which quietly becomes stat on win32 - ### it then uses -l _ which is not allowed by the statbuffer because - ### you did a stat, not an lstat (duh!). so don't tell win32 to - ### follow symlinks, as that will break badly - $find_args{'follow_fast'} = 1 unless ON_WIN32; - - ### never use the @INC hooks to find installed versions of - ### modules -- they're just there in case they're not on the - ### perl install, but the user shouldn't trust them for *other* - ### modules! - ### XXX CPANPLUS::inc is now obsolete, remove the calls - #local @INC = CPANPLUS::inc->original_inc; - - my %seen; my @rv; - for my $dir (@INC ) { - next if $dir eq '.'; - - ### not a directory after all - ### may be coderef or some such - next unless -d $dir; - - ### make sure to clean up the directories just in case, - ### as we're making assumptions about the length - ### This solves rt.cpan issue #19738 - - ### John M. notes: On VMS cannonpath can not currently handle - ### the $dir values that are in UNIX format. - $dir = File::Spec->canonpath( $dir ) unless ON_VMS; - - ### have to use F::S::Unix on VMS, or things will break - my $file_spec = ON_VMS ? 'File::Spec::Unix' : 'File::Spec'; - - ### XXX in some cases File::Find can actually die! - ### so be safe and wrap it in an eval. - eval { File::Find::find( - { %find_args, - wanted => sub { - - return unless /\.pm$/i; - my $mod = $File::Find::name; - - ### make sure it's in Unix format, as it - ### may be in VMS format on VMS; - $mod = VMS::Filespec::unixify( $mod ) if ON_VMS; - - $mod = substr($mod, length($dir) + 1, -3); - $mod = join '::', $file_spec->splitdir($mod); - - return if $seen{$mod}++; - - my $modobj = $self->module_tree($mod); - - ### separate return, a list context return with one '' - ### in it, is also true! - return unless $modobj; - - push @rv, $modobj; - }, - }, $dir - ) }; - - ### report the error if file::find died - error(loc("Error finding installed files in '%1': %2", $dir, $@)) if $@; - } - - return \@rv; -} - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source.pm deleted file mode 100644 index 8f8ad7bd4c7..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source.pm +++ /dev/null @@ -1,1470 +0,0 @@ -package CPANPLUS::Internals::Source; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Module; -use CPANPLUS::Module::Fake; -use CPANPLUS::Module::Author; -use CPANPLUS::Internals::Constants; - -use File::Fetch; -use Archive::Extract; - -use IPC::Cmd qw[can_run]; -use File::Temp qw[tempdir]; -use File::Basename qw[dirname]; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -$Params::Check::VERBOSE = 1; - -### list of methods the parent class must implement -{ for my $sub ( qw[_init_trees _finalize_trees - _standard_trees_completed _custom_trees_completed - _add_module_object _add_author_object _save_state - ] - ) { - no strict 'refs'; - *$sub = sub { - my $self = shift; - my $class = ref $self || $self; - - require Carp; - Carp::croak( loc( "Class %1 must implement method '%2'", - $class, $sub ) ); - } - } -} - -{ - my $recurse; # flag to prevent recursive calls to *_tree functions - - ### lazy loading of module tree - sub _module_tree { - my $self = $_[0]; - - unless ($self->_mtree or $recurse++ > 0) { - my $uptodate = $self->_check_trees( @_[1..$#_] ); - $self->_build_trees(uptodate => $uptodate); - } - - $recurse--; - return $self->_mtree; - } - - ### lazy loading of author tree - sub _author_tree { - my $self = $_[0]; - - unless ($self->_atree or $recurse++ > 0) { - my $uptodate = $self->_check_trees( @_[1..$#_] ); - $self->_build_trees(uptodate => $uptodate); - } - - $recurse--; - return $self->_atree; - } - -} - - -=pod - -=head1 NAME - -CPANPLUS::Internals::Source - internals for updating source files - -=head1 SYNOPSIS - - ### lazy load author/module trees ### - - $cb->_author_tree; - $cb->_module_tree; - -=head1 DESCRIPTION - -CPANPLUS::Internals::Source controls the updating of source files and -the parsing of them into usable module/author trees to be used by -C. - -Functions exist to check if source files are still C as -well as update them, and then parse them. - -The flow looks like this: - - $cb->_author_tree || $cb->_module_tree - $cb->_check_trees - $cb->__check_uptodate - $cb->_update_source - $cb->__update_custom_module_sources - $cb->__update_custom_module_source - $cb->_build_trees - ### engine methods - { $cb->_init_trees; - $cb->_standard_trees_completed - $cb->_custom_trees_completed - } - $cb->__create_author_tree - ### engine methods - { $cb->_add_author_object } - $cb->__create_module_tree - $cb->__create_dslip_tree - ### engine methods - { $cb->_add_module_object } - $cb->__create_custom_module_entries - - $cb->_dslip_defs - -=head1 METHODS - -=cut - -=pod - -=head2 $cb->_build_trees( uptodate => BOOL, [use_stored => BOOL, path => $path, verbose => BOOL] ) - -This method rebuilds the author- and module-trees from source. - -It takes the following arguments: - -=over 4 - -=item uptodate - -Indicates whether any on disk caches are still ok to use. - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=item use_stored - -A boolean flag indicating whether or not it is ok to use previously -stored trees. Defaults to true. - -=back - -Returns a boolean indicating success. - -=cut - -### (re)build the trees ### -sub _build_trees { - my ($self, %hash) = @_; - my $conf = $self->configure_object; - - my($path,$uptodate,$use_stored,$verbose); - my $tmpl = { - path => { default => $conf->get_conf('base'), store => \$path }, - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - uptodate => { required => 1, store => \$uptodate }, - use_stored => { default => 1, store => \$use_stored }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - $self->_init_trees( - path => $path, - uptodate => $uptodate, - verbose => $verbose, - use_stored => $use_stored, - ) or do { - error( loc("Could not initialize trees" ) ); - return; - }; - - ### return if we weren't able to build the trees ### - return unless $self->_mtree && $self->_atree; - - ### did we get everything from a stored state? if not, - ### process them now. - if( not $self->_standard_trees_completed ) { - - ### first, prep the author tree - $self->__create_author_tree( - uptodate => $uptodate, - path => $path, - verbose => $verbose, - ) or return; - - ### and now the module tree - $self->_create_mod_tree( - uptodate => $uptodate, - path => $path, - verbose => $verbose, - ) or return; - } - - ### XXX unpleasant hack. since custom sources uses ->parse_module, we - ### already have a special module object with extra meta data. that - ### doesn't gelwell with the sqlite storage engine. So, we check 'normal' - ### trees from separate trees, so the engine can treat them differently. - ### Effectively this means that with the SQLite engine, for now, custom - ### sources are continuously reparsed =/ -kane - if( not $self->_custom_trees_completed ) { - - ### update them if the other sources are also deemed out of date - if( $conf->get_conf('enable_custom_sources') ) { - $self->__update_custom_module_sources( verbose => $verbose ) - or error(loc("Could not update custom module sources")); - } - - ### add custom sources here if enabled - if( $conf->get_conf('enable_custom_sources') ) { - $self->__create_custom_module_entries( verbose => $verbose ) - or error(loc("Could not create custom module entries")); - } - } - - ### give the source engine a chance to wrap up creation - $self->_finalize_trees( - path => $path, - uptodate => $uptodate, - verbose => $verbose, - use_stored => $use_stored, - ) or do { - error(loc( "Could not finalize trees" )); - return; - }; - - ### still necessary? can only run one instance now ### - ### will probably stay that way --kane -# my $id = $self->_store_id( $self ); -# -# unless ( $id == $self->_id ) { -# error( loc("IDs do not match: %1 != %2. Storage failed!", $id, $self->_id) ); -# } - - return 1; -} - -=pod - -=head2 $cb->_check_trees( [update_source => BOOL, path => PATH, verbose => BOOL] ) - -Retrieve source files and return a boolean indicating whether or not -the source files are up to date. - -Takes several arguments: - -=over 4 - -=item update_source - -A flag to force re-fetching of the source files, even -if they are still up to date. - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=back - -Will get information from the config file by default. - -=cut - -### retrieve source files, and returns a boolean indicating if it's up to date -sub _check_trees { - my ($self, %hash) = @_; - my $conf = $self->configure_object; - - my $update_source; - my $verbose; - my $path; - - my $tmpl = { - path => { default => $conf->get_conf('base'), - store => \$path - }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose - }, - update_source => { default => 0, store => \$update_source }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### if the user never wants to update their source without explicitly - ### telling us, shortcircuit here - return 1 if $conf->get_conf('no_update') && !$update_source; - - ### a check to see if our source files are still up to date ### - msg( loc("Checking if source files are up to date"), $verbose ); - - my $uptodate = 1; # default return value - - for my $name (qw[auth dslip mod]) { - for my $file ( $conf->_get_source( $name ) ) { - $self->__check_uptodate( - file => File::Spec->catfile( $path, $file ), - name => $name, - update_source => $update_source, - verbose => $verbose, - ) or $uptodate = 0; - } - } - - ### if we're explicitly asked to update the sources, or if the - ### standard source files are out of date, update the custom sources - ### as well - ### RT #47820: Don't try to update custom sources if they are disabled - ### in the configuration. - $self->__update_custom_module_sources( verbose => $verbose ) - if $conf->get_conf('enable_custom_sources') and ( $update_source or !$uptodate ); - - return $uptodate; -} - -=pod - -=head2 $cb->__check_uptodate( file => $file, name => $name, [update_source => BOOL, verbose => BOOL] ) - -C<__check_uptodate> checks if a given source file is still up-to-date -and if not, or when C is true, will re-fetch the source -file. - -Takes the following arguments: - -=over 4 - -=item file - -The source file to check. - -=item name - -The internal shortcut name for the source file (used for config -lookups). - -=item update_source - -Flag to force updating of sourcefiles regardless. - -=item verbose - -Boolean to indicate whether to be verbose or not. - -=back - -Returns a boolean value indicating whether the current files are up -to date or not. - -=cut - -### this method checks whether or not the source files we are using are still up to date -sub __check_uptodate { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - - my $tmpl = { - file => { required => 1 }, - name => { required => 1 }, - update_source => { default => 0 }, - verbose => { default => $conf->get_conf('verbose') }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my $flag; - unless ( -e $args->{'file'} && ( - ( stat $args->{'file'} )[9] - + $conf->_get_source('update') ) - > time ) { - $flag = 1; - } - - if ( $flag or $args->{'update_source'} ) { - - if ( $self->_update_source( name => $args->{'name'} ) ) { - return 0; # return 0 so 'uptodate' will be set to 0, meaning no - # use of previously stored hashrefs! - } else { - msg( loc("Unable to update source, attempting to get away with using old source file!"), $args->{verbose} ); - return 1; - } - - } else { - return 1; - } -} - -=pod - -=head2 $cb->_update_source( name => $name, [path => $path, verbose => BOOL] ) - -This method does the actual fetching of source files. - -It takes the following arguments: - -=over 4 - -=item name - -The internal shortcut name for the source file (used for config -lookups). - -=item path - -The full path where to write the files. - -=item verbose - -Boolean to indicate whether to be verbose or not. - -=back - -Returns a boolean to indicate success. - -=cut - -### this sub fetches new source files ### -sub _update_source { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - my $verbose; - my $tmpl = { - name => { required => 1 }, - path => { default => $conf->get_conf('base') }, - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - - my $path = $args->{path}; - { ### this could use a clean up - Kane - ### no worries about the / -> we get it from the _ftp configuration, so - ### it's not platform dependant. -kane - my ($dir, $file) = $conf->_get_mirror( $args->{'name'} ) =~ m|(.+/)(.+)$|sg; - - msg( loc("Updating source file '%1'", $file), $verbose ); - - my $fake = CPANPLUS::Module::Fake->new( - module => $args->{'name'}, - path => $dir, - package => $file, - _id => $self->_id, - ); - - ### can't use $fake->fetch here, since ->parent won't work -- - ### the sources haven't been saved yet - my $rv = $self->_fetch( - module => $fake, - fetchdir => $path, - force => 1, - ); - - - unless ($rv) { - error( loc("Couldn't fetch '%1'", $file) ); - return; - } - - $self->_update_timestamp( file => File::Spec->catfile($path, $file) ); - } - - return 1; -} - -=pod - -=head2 $cb->__create_author_tree([path => $path, uptodate => BOOL, verbose => BOOL]) - -This method opens a source files and parses its contents into a -searchable author-tree or restores a file-cached version of a -previous parse, if the sources are uptodate and the file-cache exists. - -It takes the following arguments: - -=over 4 - -=item uptodate - -A flag indicating whether the file-cache is uptodate or not. - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=back - -Will get information from the config file by default. - -Returns a tree on success, false on failure. - -=cut - -sub __create_author_tree { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - - my $tmpl = { - path => { default => $conf->get_conf('base') }, - verbose => { default => $conf->get_conf('verbose') }, - uptodate => { default => 0 }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my $file = File::Spec->catfile( - $args->{path}, - $conf->_get_source('auth') - ); - - msg(loc("Rebuilding author tree, this might take a while"), - $args->{verbose}); - - ### extract the file ### - my $ae = Archive::Extract->new( archive => $file ) or return; - my $out = STRIP_GZ_SUFFIX->($file); - - ### make sure to set the PREFER_BIN flag if desired ### - { local $Archive::Extract::PREFER_BIN = $conf->get_conf('prefer_bin'); - $ae->extract( to => $out ) or return; - } - - my $cont = $self->_get_file_contents( file => $out ) or return; - - ### don't need it anymore ### - unlink $out; - - my ($tot,$prce,$prc,$idx); - - if ( $args->{verbose} and local $|=1 ) { - no warnings; - $tot = scalar(split /\n/, $cont); - ($prce, $prc, $idx) = (int $tot / 25, 0, 0); - print "\t0%"; - } - - for ( split /\n/, $cont ) { - my($id, $name, $email) = m/^alias \s+ - (\S+) \s+ - "\s* ([^\"\<]+?) \s* <(.+)> \s*" - /x; - - $self->_add_author_object( - author => $name, #authors name - email => $email, #authors email address - cpanid => $id, #authors CPAN ID - ) or error( loc("Could not add author '%1'", $name ) ); - - $args->{verbose} - and ( - $idx++, - - ($idx==$prce - and ($prc+=4,$idx=0,print ".")), - - (($prc % 10) - or $idx - or print $prc,'%') - ); - - } - - $args->{verbose} - and print "\n"; - - - return $self->_atree; - -} #__create_author_tree - -=pod - -=head2 $cb->_create_mod_tree([path => $path, uptodate => BOOL, verbose => BOOL]) - -This method opens a source files and parses its contents into a -searchable module-tree or restores a file-cached version of a -previous parse, if the sources are uptodate and the file-cache exists. - -It takes the following arguments: - -=over 4 - -=item uptodate - -A flag indicating whether the file-cache is up-to-date or not. - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=back - -Will get information from the config file by default. - -Returns a tree on success, false on failure. - -=cut - -### this builds a hash reference with the structure of the cpan module tree ### -sub _create_mod_tree { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - my $base = $conf->_get_mirror('base'); - - my $tmpl = { - path => { default => $conf->get_conf('base') }, - verbose => { default => $conf->get_conf('verbose') }, - uptodate => { default => 0 }, - }; - - my $args = check( $tmpl, \%hash ) or return undef; - my $file = File::Spec->catfile($args->{path}, $conf->_get_source('mod')); - - msg(loc("Rebuilding module tree, this might take a while"), - $args->{verbose}); - - - my $dslip_tree = $self->__create_dslip_tree( %$args ); - - my $author_tree = $self->author_tree; - - ### extract the file ### - my $ae = Archive::Extract->new( archive => $file ) or return; - my $out = STRIP_GZ_SUFFIX->($file); - - ### make sure to set the PREFER_BIN flag if desired ### - { local $Archive::Extract::PREFER_BIN = $conf->get_conf('prefer_bin'); - $ae->extract( to => $out ) or return; - } - - my $content = $self->_get_file_contents( file => $out ) or return; - my $lines = $content =~ tr/\n/\n/; - - ### don't need it anymore ### - unlink $out; - - my($past_header, $count, $tot, $prce, $prc, $idx); - - if ( $args->{verbose} and local $|=1 ) { - no warnings; - $tot = scalar(split /\n/, $content); - ($prce, $prc, $idx) = (int $tot / 25, 0, 0); - print "\t0%"; - } - - for ( split /\n/, $content ) { - - ### we're still in the header -- find the amount of lines we expect - unless( $past_header ) { - - ### header has ended -- did we get the line count? - if( m|^\s*$| ) { - unless( $count ) { - error(loc("Could not determine line count from %1", $file)); - return; - } - $past_header = 1; - - ### if the line count doesn't match what we expect, bail out - ### this should address: #45644: detect broken index - } else { - $count = $1 if /^Line-Count:\s+(\d+)/; - if( $count ) { - if( $lines < $count ) { - error(loc("Expected to read at least %1 lines, but %2 ". - "contains only %3 lines!", - $count, $file, $lines )); - return; - } - } - } - - ### still in the header, keep moving - next; - } - - my @data = split /\s+/; - ### three fields expected on each line - next unless @data == 3; - - ### filter out the author and filename as well ### - ### authors can apparently have digits in their names, - ### and dirs can have dots... blah! - my ($author, $package) = $data[2] =~ - m| (?:[A-Z\d-]/)? - (?:[A-Z\d-]{2}/)? - ([A-Z\d-]+) (?:/[\S]+)?/ - ([^/]+)$ - |xsg; - - ### remove file name from the path - $data[2] =~ s|/[^/]+$||; - - my $aobj = $author_tree->{$author}; - unless( $aobj ) { - error( loc( "No such author '%1' -- can't make module object " . - "'%2' that is supposed to belong to this author", - $author, $data[0] ) ); - next; - } - - my $dslip_mod = $dslip_tree->{ $data[0] }; - - ### adding the dslip info - my $dslip; - for my $item ( qw[ statd stats statl stati statp ] ) { - ### checking if there's an entry in the dslip info before - ### catting it on. appeasing warnings this way - $dslip .= $dslip_mod->{$item} || ' '; - } - - ### XXX this could be sped up if we used author names, not author - ### objects in creation, and then look them up in the author tree - ### when needed. This will need a fix to all the places that create - ### fake author/module objects as well. - - ### callback to store the individual object - $self->_add_module_object( - module => $data[0], # full module name - version => ($data[1] eq 'undef' # version number - ? '0.0' - : $data[1]), - path => File::Spec::Unix->catfile( - $base, - $data[2], - ), # extended path on the cpan mirror, - # like /A/AB/ABIGAIL - comment => $data[3], # comment on the module - author => $aobj, - package => $package, # package name, like - # 'foo-bar-baz-1.03.tar.gz' - description => $dslip_mod->{'description'}, - dslip => $dslip, - mtime => '', - ) or error( loc( "Could not add module '%1'", $data[0] ) ); - - $args->{verbose} - and ( - $idx++, - - ($idx==$prce - and ($prc+=4,$idx=0,print ".")), - - (($prc % 10) - or $idx - or print $prc,'%') - ); - - } #for - - $args->{verbose} - and print "\n"; - - return $self->_mtree; - -} #_create_mod_tree - -=pod - -=head2 $cb->__create_dslip_tree([path => $path, uptodate => BOOL, verbose => BOOL]) - -This method opens a source files and parses its contents into a -searchable dslip-tree or restores a file-cached version of a -previous parse, if the sources are uptodate and the file-cache exists. - -It takes the following arguments: - -=over 4 - -=item uptodate - -A flag indicating whether the file-cache is uptodate or not. - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=back - -Will get information from the config file by default. - -Returns a tree on success, false on failure. - -=cut - -sub __create_dslip_tree { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - my $tmpl = { - path => { default => $conf->get_conf('base') }, - verbose => { default => $conf->get_conf('verbose') }, - uptodate => { default => 0 }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### get the file name of the source ### - my $file = File::Spec->catfile($args->{path}, $conf->_get_source('dslip')); - - ### extract the file ### - my $ae = Archive::Extract->new( archive => $file ) or return; - my $out = STRIP_GZ_SUFFIX->($file); - - ### make sure to set the PREFER_BIN flag if desired ### - { local $Archive::Extract::PREFER_BIN = $conf->get_conf('prefer_bin'); - $ae->extract( to => $out ) or return; - } - - my $in = $self->_get_file_contents( file => $out ) or return; - - ### don't need it anymore ### - unlink $out; - - - ### get rid of the comments and the code ### - ### need a smarter parser, some people have this in their dslip info: - # [ - # 'Statistics::LTU', - # 'R', - # 'd', - # 'p', - # 'O', - # '?', - # 'Implements Linear Threshold Units', - # ...skipping... - # "\x{c4}dd \x{fc}ml\x{e4}\x{fc}ts t\x{f6} \x{eb}v\x{eb}r\x{ff}th\x{ef}ng!", - # 'BENNIE', - # '11' - # ], - ### also, older versions say: - ### $cols = [....] - ### and newer versions say: - ### $CPANPLUS::Modulelist::cols = [...] - ### split '$cols' and '$data' into 2 variables ### - ### use this regex to make sure dslips with ';' in them don't cause - ### parser errors - my ($ds_one, $ds_two) = ($in =~ m|.+}\s+ - (\$(?:CPAN::Modulelist::)?cols.*?) - (\$(?:CPAN::Modulelist::)?data.*) - |sx); - - ### eval them into existence ### - ### still not too fond of this solution - kane ### - my ($cols, $data); - { #local $@; can't use this, it's buggy -kane - - $cols = eval $ds_one; - error( loc("Error in eval of dslip source files: %1", $@) ) if $@; - - $data = eval $ds_two; - error( loc("Error in eval of dslip source files: %1", $@) ) if $@; - - } - - my $tree = {}; - my $primary = "modid"; - - ### this comes from CPAN::Modulelist - ### which is in 03modlist.data.gz - for (@$data){ - my %hash; - @hash{@$cols} = @$_; - $tree->{$hash{$primary}} = \%hash; - } - - return $tree; - -} #__create_dslip_tree - -=pod - -=head2 $cb->_dslip_defs () - -This function returns the definition structure (ARRAYREF) of the -dslip tree. - -=cut - -### these are the definitions used for dslip info -### they shouldn't change over time.. so hardcoding them doesn't appear to -### be a problem. if it is, we need to parse 03modlist.data better to filter -### all this out. -### right now, this is just used to look up dslip info from a module -sub _dslip_defs { - my $self = shift; - - my $aref = [ - - # D - [ q|Development Stage|, { - i => loc('Idea, listed to gain consensus or as a placeholder'), - c => loc('under construction but pre-alpha (not yet released)'), - a => loc('Alpha testing'), - b => loc('Beta testing'), - R => loc('Released'), - M => loc('Mature (no rigorous definition)'), - S => loc('Standard, supplied with Perl 5'), - }], - - # S - [ q|Support Level|, { - m => loc('Mailing-list'), - d => loc('Developer'), - u => loc('Usenet newsgroup comp.lang.perl.modules'), - n => loc('None known, try comp.lang.perl.modules'), - a => loc('Abandoned; volunteers welcome to take over maintenance'), - }], - - # L - [ q|Language Used|, { - p => loc('Perl-only, no compiler needed, should be platform independent'), - c => loc('C and perl, a C compiler will be needed'), - h => loc('Hybrid, written in perl with optional C code, no compiler needed'), - '+' => loc('C++ and perl, a C++ compiler will be needed'), - o => loc('perl and another language other than C or C++'), - }], - - # I - [ q|Interface Style|, { - f => loc('plain Functions, no references used'), - h => loc('hybrid, object and function interfaces available'), - n => loc('no interface at all (huh?)'), - r => loc('some use of unblessed References or ties'), - O => loc('Object oriented using blessed references and/or inheritance'), - }], - - # P - [ q|Public License|, { - p => loc('Standard-Perl: user may choose between GPL and Artistic'), - g => loc('GPL: GNU General Public License'), - l => loc('LGPL: "GNU Lesser General Public License" (previously known as "GNU Library General Public License")'), - b => loc('BSD: The BSD License'), - a => loc('Artistic license alone'), - o => loc('other (but distribution allowed without restrictions)'), - }], - ]; - - return $aref; -} - -=head2 $file = $cb->_add_custom_module_source( uri => URI, [verbose => BOOL] ); - -Adds a custom source index and updates it based on the provided URI. - -Returns the full path to the index file on success or false on failure. - -=cut - -sub _add_custom_module_source { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($verbose,$uri); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - uri => { required => 1, store => \$uri } - }; - - check( $tmpl, \%hash ) or return; - - ### what index file should we use on disk? - my $index = $self->__custom_module_source_index_file( uri => $uri ); - - ### already have it. - if( IS_FILE->( $index ) ) { - msg(loc("Source '%1' already added", $uri)); - return 1; - } - - ### do we need to create the targe dir? - { my $dir = dirname( $index ); - unless( IS_DIR->( $dir ) ) { - $self->_mkdir( dir => $dir ) or return - } - } - - ### write the file - my $fh = OPEN_FILE->( $index => '>' ) or do { - error(loc("Could not open index file for '%1'", $uri)); - return; - }; - - ### basically we 'touched' it. Check the return value, may be - ### important on win32 and similar OS, where there's file length - ### limits - close $fh or do { - error(loc("Could not write index file to disk for '%1'", $uri)); - return; - }; - - $self->__update_custom_module_source( - remote => $uri, - local => $index, - verbose => $verbose, - ) or do { - ### we faild to update it, we probably have an empty - ### possibly silly filename on disk now -- remove it - 1 while unlink $index; - return; - }; - - return $index; -} - -=head2 $index = $cb->__custom_module_source_index_file( uri => $uri ); - -Returns the full path to the encoded index file for C<$uri>, as used by -all C routines. - -=cut - -sub __custom_module_source_index_file { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($verbose,$uri); - my $tmpl = { - uri => { required => 1, store => \$uri } - }; - - check( $tmpl, \%hash ) or return; - - my $index = File::Spec->catfile( - $conf->get_conf('base'), - $conf->_get_build('custom_sources'), - $self->_uri_encode( uri => $uri ), - ); - - return $index; -} - -=head2 $file = $cb->_remove_custom_module_source( uri => URI, [verbose => BOOL] ); - -Removes a custom index file based on the URI provided. - -Returns the full path to the index file on success or false on failure. - -=cut - -sub _remove_custom_module_source { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($verbose,$uri); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - uri => { required => 1, store => \$uri } - }; - - check( $tmpl, \%hash ) or return; - - ### use uri => local, instead of the other way around - my %files = reverse $self->__list_custom_module_sources; - - ### On VMS the case of key to %files can be either exact or lower case - ### XXX abstract this lookup out? --kane - my $file = $files{ $uri }; - $file = $files{ lc $uri } if !defined($file) && ON_VMS; - - unless (defined $file) { - error(loc("No such custom source '%1'", $uri)); - return; - }; - - 1 while unlink $file; - - if( IS_FILE->( $file ) ) { - error(loc("Could not remove index file '%1' for custom source '%2'", - $file, $uri)); - return; - } - - msg(loc("Successfully removed index file for '%1'", $uri), $verbose); - - return $file; -} - -=head2 %files = $cb->__list_custom_module_sources - -This method scans the 'custom-sources' directory in your base directory -for additional sources to include in your module tree. - -Returns a list of key value pairs as follows: - - /full/path/to/source/file%3Fencoded => http://decoded/mirror/path - -=cut - -sub __list_custom_module_sources { - my $self = shift; - my $conf = $self->configure_object; - - my($verbose); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - }; - - my $dir = File::Spec->catdir( - $conf->get_conf('base'), - $conf->_get_build('custom_sources'), - ); - - unless( IS_DIR->( $dir ) ) { - msg(loc("No '%1' dir, skipping custom sources", $dir), $verbose); - return; - } - - ### unencode the files - ### skip ones starting with # though - my %files = map { - my $org = $_; - my $dec = $self->_uri_decode( uri => $_ ); - File::Spec->catfile( $dir, $org ) => $dec - } grep { $_ !~ /^#/ } READ_DIR->( $dir ); - - return %files; -} - -=head2 $bool = $cb->__update_custom_module_sources( [verbose => BOOL] ); - -Attempts to update all the index files to your custom module sources. - -If the index is missing, and it's a C uri, it will generate -a new local index for you. - -Return true on success, false on failure. - -=cut - -sub __update_custom_module_sources { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my $verbose; - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose } - }; - - check( $tmpl, \%hash ) or return; - - my %files = $self->__list_custom_module_sources; - - ### uptodate check has been done a few levels up. - my $fail; - while( my($local,$remote) = each %files ) { - - $self->__update_custom_module_source( - remote => $remote, - local => $local, - verbose => $verbose, - ) or ( $fail++, next ); - } - - error(loc("Failed updating one or more remote sources files")) if $fail; - - return if $fail; - return 1; -} - -=head2 $ok = $cb->__update_custom_module_source - -Attempts to update all the index files to your custom module sources. - -If the index is missing, and it's a C uri, it will generate -a new local index for you. - -Return true on success, false on failure. - -=cut - -sub __update_custom_module_source { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($verbose,$local,$remote); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - local => { store => \$local, allow => FILE_EXISTS }, - remote => { required => 1, store => \$remote }, - }; - - check( $tmpl, \%hash ) or return; - - msg( loc("Updating sources from '%1'", $remote), $verbose); - - ### if you didn't provide a local file, we'll look in your custom - ### dir to find the local encoded version for you - $local ||= do { - ### find all files we know of - my %files = reverse $self->__list_custom_module_sources or do { - error(loc("No custom modules sources defined -- need '%1' argument", - 'local')); - return; - }; - - ### On VMS the case of key to %files can be either exact or lower case - ### XXX abstract this lookup out? --kane - my $file = $files{ $remote }; - $file = $files{ lc $remote } if !defined ($file) && ON_VMS; - - ### return the local file we're supposed to use - $file or do { - error(loc("Remote source '%1' unknown -- needs '%2' argument", - $remote, 'local')); - return; - }; - }; - - my $uri = join '/', $remote, $conf->_get_source('custom_index'); - my $ff = File::Fetch->new( uri => $uri ); - - ### tempdir doesn't clean up by default, as opposed to tempfile() - ### so add it explicitly. - my $dir = tempdir( CLEANUP => 1 ); - - my $res = do { - local $File::Fetch::WARN = 0; - local $File::Fetch::TIMEOUT = $conf->get_conf('timeout'); - $ff->fetch( to => $dir ); - }; - - ### couldn't get the file - unless( $res ) { - - ### it's not a local scheme, so can't auto index - unless( $ff->scheme eq 'file' ) { - error(loc("Could not update sources from '%1': %2", - $remote, $ff->error )); - return; - - ### it's a local uri, we can index it ourselves - } else { - msg(loc("No index file found at '%1', generating one", - $ff->uri), $verbose ); - - ### ON VMS, if you are working with a UNIX file specification, - ### you need currently use the UNIX variants of the File::Spec. - my $ff_path = do { - my $file_class = 'File::Spec'; - $file_class .= '::Unix' if ON_VMS; - $file_class->catdir( File::Spec::Unix->splitdir( $ff->path ) ); - }; - - $self->__write_custom_module_index( - path => $ff_path, - to => $local, - verbose => $verbose, - ) or return; - - ### XXX don't write that here, __write_custom_module_index - ### already prints this out - #msg(loc("Index file written to '%1'", $to), $verbose); - } - - ### copy it to the real spot and update its timestamp - } else { - $self->_move( file => $res, to => $local ) or return; - $self->_update_timestamp( file => $local ); - - msg(loc("Index file saved to '%1'", $local), $verbose); - } - - return $local; -} - -=head2 $bool = $cb->__write_custom_module_index( path => /path/to/packages, [to => /path/to/index/file, verbose => BOOL] ) - -Scans the C you provided for packages and writes an index with all -the available packages to C<$path/packages.txt>. If you'd like the index -to be written to a different file, provide the C argument. - -Returns true on success and false on failure. - -=cut - -sub __write_custom_module_index { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my ($verbose, $path, $to); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - path => { required => 1, allow => DIR_EXISTS, store => \$path }, - to => { store => \$to }, - }; - - check( $tmpl, \%hash ) or return; - - ### no explicit to? then we'll use our default - $to ||= File::Spec->catfile( $path, $conf->_get_source('custom_index') ); - - my @files; - require File::Find; - File::Find::find( sub { - ### let's see if A::E can even parse it - my $ae = do { - local $Archive::Extract::WARN = 0; - local $Archive::Extract::WARN = 0; - Archive::Extract->new( archive => $File::Find::name ) - } or return; - - ### it's a type A::E recognize, so we can add it - $ae->type or return; - - ### neither $_ nor $File::Find::name have the chunk of the path in - ### it starting $path -- it's either only the filename, or the full - ### path, so we have to strip it ourselves - ### make sure to remove the leading slash as well. - my $copy = $File::Find::name; - my $re = quotemeta($path); - $copy =~ s|^$re[\\/]?||i; - - push @files, $copy; - - }, $path ); - - ### does the dir exist? if not, create it. - { my $dir = dirname( $to ); - unless( IS_DIR->( $dir ) ) { - $self->_mkdir( dir => $dir ) or return - } - } - - ### create the index file - my $fh = OPEN_FILE->( $to => '>' ) or return; - - print $fh "$_\n" for @files; - close $fh; - - msg(loc("Successfully written index file to '%1'", $to), $verbose); - - return $to; -} - - -=head2 $bool = $cb->__create_custom_module_entries( [verbose => BOOL] ) - -Creates entries in the module tree based upon the files as returned -by C<__list_custom_module_sources>. - -Returns true on success, false on failure. - -=cut - -### use $auth_obj as a persistent version, so we don't have to recreate -### modules all the time -{ my $auth_obj; - - sub __create_custom_module_entries { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my $verbose; - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - }; - - check( $tmpl, \%hash ) or return undef; - - my %files = $self->__list_custom_module_sources; - - while( my($file,$name) = each %files ) { - - msg(loc("Adding packages from custom source '%1'", $name), $verbose); - - my $fh = OPEN_FILE->( $file ) or next; - - while( local $_ = <$fh> ) { - chomp; - next if /^#/; - next unless /\S+/; - - ### join on / -- it's a URI after all! - my $parse = join '/', $name, $_; - - ### try to make a module object out of it - my $mod = $self->parse_module( module => $parse ) or ( - error(loc("Could not parse '%1'", $_)), - next - ); - - ### mark this object with a custom author - $auth_obj ||= do { - my $id = CUSTOM_AUTHOR_ID; - - ### if the object is being created for the first time, - ### make sure there's an entry in the author tree as - ### well, so we can search on the CPAN ID - $self->author_tree->{ $id } = - CPANPLUS::Module::Author::Fake->new( cpanid => $id ); - }; - - $mod->author( $auth_obj ); - - ### and now add it to the module tree -- this MAY - ### override things of course - if( my $old_mod = $self->module_tree( $mod->module ) ) { - - ### On VMS use the old module name to get the real case - $mod->module( $old_mod->module ) if ON_VMS; - - msg(loc("About to overwrite module tree entry for '%1' with '%2'", - $mod->module, $mod->package), $verbose); - } - - ### mark where it came from - $mod->description( loc("Custom source from '%1'",$name) ); - - ### store it in the module tree - $self->module_tree->{ $mod->module } = $mod; - } - } - - return 1; - } -} - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/Memory.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/Memory.pm deleted file mode 100644 index a28532e02cd..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/Memory.pm +++ /dev/null @@ -1,381 +0,0 @@ -package CPANPLUS::Internals::Source::Memory; -use deprecate; - -use base 'CPANPLUS::Internals::Source'; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Module; -use CPANPLUS::Module::Fake; -use CPANPLUS::Module::Author; -use CPANPLUS::Internals::Constants; - -use File::Fetch; -use Archive::Extract; - -use IPC::Cmd qw[can_run]; -use File::Temp qw[tempdir]; -use File::Basename qw[dirname]; -use Params::Check qw[allow check]; -use Module::Load::Conditional qw[can_load]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -$Params::Check::VERBOSE = 1; - -=head1 NAME - -CPANPLUS::Internals::Source::Memory - In memory implementation - -=cut - -### flag to show if init_trees got its' data from storable. This allows -### us to not write an existing stored file back to disk -{ my $from_storable; - - sub _init_trees { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($path,$uptodate,$verbose,$use_stored); - my $tmpl = { - path => { default => $conf->get_conf('base'), store => \$path }, - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - uptodate => { required => 1, store => \$uptodate }, - use_stored => { default => 1, store => \$use_stored }, - }; - - check( $tmpl, \%hash ) or return; - - ### retrieve the stored source files ### - my $stored = $self->__memory_retrieve_source( - path => $path, - uptodate => $uptodate && $use_stored, - verbose => $verbose, - ) || {}; - - ### we got this from storable if $stored has keys.. - $from_storable = keys %$stored ? 1 : 0; - - ### set up the trees - $self->_atree( $stored->{_atree} || {} ); - $self->_mtree( $stored->{_mtree} || {} ); - - return 1; - } - - sub _standard_trees_completed { return $from_storable } - sub _custom_trees_completed { return $from_storable } - - sub _finalize_trees { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($path,$uptodate,$verbose); - my $tmpl = { - path => { default => $conf->get_conf('base'), store => \$path }, - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - uptodate => { required => 1, store => \$uptodate }, - }; - - { local $Params::Check::ALLOW_UNKNOWN = 1; - check( $tmpl, \%hash ) or return; - } - - ### write the stored files to disk, so we can keep using them - ### from now on, till they become invalid - ### write them if the original sources weren't uptodate, or - ### we didn't just load storable files - $self->__memory_save_source() if !$uptodate or not $from_storable; - - return 1; - } - - ### saves current memory state - sub _save_state { - my $self = shift; - return $self->_finalize_trees( @_, uptodate => 0 ); - } -} - -sub _add_author_object { - my $self = shift; - my %hash = @_; - - my $class; - my $tmpl = { - class => { default => 'CPANPLUS::Module::Author', store => \$class }, - map { $_ => { required => 1 } } - qw[ author cpanid email ] - }; - - my $href = do { - local $Params::Check::NO_DUPLICATES = 1; - check( $tmpl, \%hash ) or return; - }; - - my $obj = $class->new( %$href, _id => $self->_id ); - - $self->author_tree->{ $href->{'cpanid'} } = $obj or return; - - return $obj; -} - -{ - my $tmpl = { - class => { default => 'CPANPLUS::Module' }, - map { $_ => { required => 1 } } qw[ - module version path comment author package description dslip mtime - ], - }; - - sub _add_module_object { - my $self = shift; - my %hash = @_; - - my $href = do { - local $Params::Check::SANITY_CHECK_TEMPLATE = 0; - check( $tmpl, \%hash ) or return; - }; - my $class = delete $href->{class}; - - my $obj = $class->new( %$href, _id => $self->_id ); - - ### Every module get's stored as a module object ### - $self->module_tree->{ $href->{module} } = $obj or return; - - return $obj; - } -} - -{ my %map = ( - _source_search_module_tree => [ module_tree => 'CPANPLUS::Module' ], - _source_search_author_tree => [ author_tree => 'CPANPLUS::Module::Author' ], - ); - - while( my($sub, $aref) = each %map ) { - no strict 'refs'; - - my($meth, $class) = @$aref; - - *$sub = sub { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($authors,$list,$verbose,$type); - my $tmpl = { - data => { default => [], - strict_type=> 1, store => \$authors }, - allow => { required => 1, default => [ ], strict_type => 1, - store => \$list }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - type => { required => 1, allow => [$class->accessors()], - store => \$type }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my @rv; - for my $obj ( values %{ $self->$meth } ) { - #push @rv, $auth if check( - # { $type => { allow => $list } }, - # { $type => $auth->$type } - # ); - push @rv, $obj if allow( $obj->$type() => $list ); - } - - return @rv; - } - } -} - -=pod - -=head2 $cb->__memory_retrieve_source(name => $name, [path => $path, uptodate => BOOL, verbose => BOOL]) - -This method retrieves a Id tree identified by C<$name>. - -It takes the following arguments: - -=over 4 - -=item name - -The internal name for the source file to retrieve. - -=item uptodate - -A flag indicating whether the file-cache is up-to-date or not. - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=back - -Will get information from the config file by default. - -Returns a tree on success, false on failure. - -=cut - -sub __memory_retrieve_source { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - my $tmpl = { - path => { default => $conf->get_conf('base') }, - verbose => { default => $conf->get_conf('verbose') }, - uptodate => { default => 0 }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### check if we can retrieve a frozen data structure with storable ### - my $storable = can_load( modules => {'Storable' => '0.0'} ) - if $conf->get_conf('storable'); - - return unless $storable; - - ### $stored is the name of the frozen data structure ### - my $stored = $self->__memory_storable_file( $args->{path} ); - - if ($storable && -e $stored && -s _ && $args->{'uptodate'}) { - msg( loc("Retrieving %1", $stored), $args->{'verbose'} ); - - my $href = Storable::retrieve($stored); - return $href; - } else { - return; - } -} - -=pod - -=head2 $cb->__memory_save_source([verbose => BOOL, path => $path]) - -This method saves all the parsed trees in Id format if -C is available. - -It takes the following arguments: - -=over 4 - -=item path - -The absolute path to the directory holding the source files. - -=item verbose - -A boolean flag indicating whether or not to be verbose. - -=back - -Will get information from the config file by default. - -Returns true on success, false on failure. - -=cut - -sub __memory_save_source { - my $self = shift; - my %hash = @_; - my $conf = $self->configure_object; - - - my $tmpl = { - path => { default => $conf->get_conf('base'), allow => DIR_EXISTS }, - verbose => { default => $conf->get_conf('verbose') }, - force => { default => 1 }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - my $aref = [qw[_mtree _atree]]; - - ### check if we can retrieve a frozen data structure with storable ### - my $storable; - $storable = can_load( modules => {'Storable' => '0.0'} ) - if $conf->get_conf('storable'); - return unless $storable; - - my $to_write = {}; - foreach my $key ( @$aref ) { - next unless ref( $self->$key ); - $to_write->{$key} = $self->$key; - } - - return unless keys %$to_write; - - ### $stored is the name of the frozen data structure ### - my $stored = $self->__memory_storable_file( $args->{path} ); - - if (-e $stored && not -w $stored) { - msg( loc("%1 not writable; skipped.", $stored), $args->{'verbose'} ); - return; - } - - msg( loc("Writing compiled source information to disk. This might take a little while."), - $args->{'verbose'} ); - - my $flag; - unless( Storable::nstore( $to_write, $stored ) ) { - error( loc("could not store %1!", $stored) ); - $flag++; - } - - return $flag ? 0 : 1; -} - -sub __memory_storable_file { - my $self = shift; - my $conf = $self->configure_object; - my $path = shift or return; - - ### check if we can retrieve a frozen data structure with storable ### - my $storable = $conf->get_conf('storable') - ? can_load( modules => {'Storable' => '0.0'} ) - : 0; - - return unless $storable; - - ### $stored is the name of the frozen data structure ### - ### changed to use File::Spec->catfile -jmb - my $stored = File::Spec->rel2abs( - File::Spec->catfile( - $path, #base dir - $conf->_get_source('stored') #file - . '.s' . - $Storable::VERSION #the version of storable - . '.c' . - $self->VERSION #the version of CPANPLUS - . STORABLE_EXT #append a suffix - ) - ); - - return $stored; -} - - - - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite.pm deleted file mode 100644 index 50f82f485c9..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite.pm +++ /dev/null @@ -1,383 +0,0 @@ -package CPANPLUS::Internals::Source::SQLite; -use deprecate; - -use strict; -use warnings; - -use base 'CPANPLUS::Internals::Source'; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; -use CPANPLUS::Internals::Source::SQLite::Tie; - -use Data::Dumper; -use DBIx::Simple; -use DBD::SQLite; - -use Params::Check qw[allow check]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -use constant TXN_COMMIT => 1000; - -=head1 NAME - -CPANPLUS::Internals::Source::SQLite - SQLite implementation - -=cut - -{ my $Dbh; - my $DbFile; - - sub __sqlite_file { - return $DbFile if $DbFile; - - my $self = shift; - my $conf = $self->configure_object; - - $DbFile = File::Spec->catdir( - $conf->get_conf('base'), - SOURCE_SQLITE_DB - ); - - return $DbFile; - }; - - sub __sqlite_dbh { - return $Dbh if $Dbh; - - my $self = shift; - $Dbh = DBIx::Simple->connect( - "dbi:SQLite:dbname=" . $self->__sqlite_file, - '', '', - { AutoCommit => 1 } - ); - #$Dbh->dbh->trace(1); - $Dbh->query(qq{PRAGMA synchronous = OFF}); - - return $Dbh; - }; - - sub __sqlite_disconnect { - return unless $Dbh; - $Dbh->disconnect; - $Dbh = undef; - return; - } -} - -{ my $used_old_copy = 0; - - sub _init_trees { - my $self = shift; - my $conf = $self->configure_object; - my %hash = @_; - - my($path,$uptodate,$verbose,$use_stored); - my $tmpl = { - path => { default => $conf->get_conf('base'), store => \$path }, - verbose => { default => $conf->get_conf('verbose'), store => \$verbose }, - uptodate => { required => 1, store => \$uptodate }, - use_stored => { default => 1, store => \$use_stored }, - }; - - check( $tmpl, \%hash ) or return; - - ### if it's not uptodate, or the file doesn't exist, we need to create - ### a new sqlite db - if( not $uptodate or not -e $self->__sqlite_file ) { - $used_old_copy = 0; - - ### chuck the file - $self->__sqlite_disconnect; - 1 while unlink $self->__sqlite_file; - - ### and create a new one - $self->__sqlite_create_db or do { - error(loc("Could not create new SQLite DB")); - return; - } - } else { - $used_old_copy = 1; - } - - ### set up the author tree - { my %at; - tie %at, 'CPANPLUS::Internals::Source::SQLite::Tie', - dbh => $self->__sqlite_dbh, table => 'author', - key => 'cpanid', cb => $self; - - $self->_atree( \%at ); - } - - ### set up the author tree - { my %mt; - tie %mt, 'CPANPLUS::Internals::Source::SQLite::Tie', - dbh => $self->__sqlite_dbh, table => 'module', - key => 'module', cb => $self; - - $self->_mtree( \%mt ); - } - - ### start a transaction - $self->__sqlite_dbh->query('BEGIN'); - - return 1; - - } - - sub _standard_trees_completed { return $used_old_copy } - sub _custom_trees_completed { return } - ### finish transaction - sub _finalize_trees { $_[0]->__sqlite_dbh->commit; return 1 } - - ### saves current memory state, but not implemented in sqlite - sub _save_state { - error(loc("%1 has not implemented writing state to disk", __PACKAGE__)); - return; - } -} - -{ my $txn_count = 0; - - ### XXX move this outside the sub, so we only compute it once - my $class; - my @keys = qw[ author cpanid email ]; - my $tmpl = { - class => { default => 'CPANPLUS::Module::Author', store => \$class }, - map { $_ => { required => 1 } } @keys - }; - - ### dbix::simple's expansion of (??) is REALLY expensive, so do it manually - my $ph = join ',', map { '?' } @keys; - - - sub _add_author_object { - my $self = shift; - my %hash = @_; - my $dbh = $self->__sqlite_dbh; - - my $href = do { - local $Params::Check::NO_DUPLICATES = 1; - local $Params::Check::SANITY_CHECK_TEMPLATE = 0; - check( $tmpl, \%hash ) or return; - }; - - ### keep counting how many we inserted - unless( ++$txn_count % TXN_COMMIT ) { - #warn "Committing transaction $txn_count"; - $dbh->commit or error( $dbh->error ); # commit previous transaction - $dbh->begin_work or error( $dbh->error ); # and start a new one - } - - $dbh->query( - "INSERT INTO author (". join(',',keys(%$href)) .") VALUES ($ph)", - values %$href - ) or do { - error( $dbh->error ); - return; - }; - - return 1; - } -} - -{ my $txn_count = 0; - - ### XXX move this outside the sub, so we only compute it once - my $class; - my @keys = qw[ module version path comment author package description dslip mtime ]; - my $tmpl = { - class => { default => 'CPANPLUS::Module', store => \$class }, - map { $_ => { required => 1 } } @keys - }; - - ### dbix::simple's expansion of (??) is REALLY expensive, so do it manually - my $ph = join ',', map { '?' } @keys; - - sub _add_module_object { - my $self = shift; - my %hash = @_; - my $dbh = $self->__sqlite_dbh; - - my $href = do { - local $Params::Check::NO_DUPLICATES = 1; - local $Params::Check::SANITY_CHECK_TEMPLATE = 0; - check( $tmpl, \%hash ) or return; - }; - - ### fix up author to be 'plain' string - $href->{'author'} = $href->{'author'}->cpanid; - - ### keep counting how many we inserted - unless( ++$txn_count % TXN_COMMIT ) { - #warn "Committing transaction $txn_count"; - $dbh->commit or error( $dbh->error ); # commit previous transaction - $dbh->begin_work or error( $dbh->error ); # and start a new one - } - - $dbh->query( - "INSERT INTO module (". join(',',keys(%$href)) .") VALUES ($ph)", - values %$href - ) or do { - error( $dbh->error ); - return; - }; - - return 1; - } -} - -{ my %map = ( - _source_search_module_tree - => [ module => module => 'CPANPLUS::Module' ], - _source_search_author_tree - => [ author => cpanid => 'CPANPLUS::Module::Author' ], - ); - - while( my($sub, $aref) = each %map ) { - no strict 'refs'; - - my($table, $key, $class) = @$aref; - *$sub = sub { - my $self = shift; - my %hash = @_; - - my($list,$type); - my $tmpl = { - allow => { required => 1, default => [ ], strict_type => 1, - store => \$list }, - type => { required => 1, allow => [$class->accessors()], - store => \$type }, - }; - - check( $tmpl, \%hash ) or return; - - - ### we aliased 'module' to 'name', so change that here too - $type = 'module' if $type eq 'name'; - - my $meth = $table .'_tree'; - - { - my $throw = $self->$meth; - } - - my $dbh = $self->__sqlite_dbh; - my $res = $dbh->query( "SELECT * from $table" ); - - my @rv = map { $self->$meth( $_->{$key} ) } - grep { allow( $_->{$type} => $list ) } $res->hashes; - - return @rv; - } - } -} - - - -sub __sqlite_create_db { - my $self = shift; - my $dbh = $self->__sqlite_dbh; - - ### we can ignore the result/error; not all sqlite implementations - ### support this - $dbh->query( qq[ - DROP TABLE IF EXISTS author; - \n] - ) or do { - msg( $dbh->error ); - }; - $dbh->query( qq[ - DROP TABLE IF EXISTS module; - \n] - ) or do { - msg( $dbh->error ); - }; - - - - $dbh->query( qq[ - /* the author information */ - CREATE TABLE author ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - - author varchar(255), - email varchar(255), - cpanid varchar(255) - ); - \n] - - ) or do { - error( $dbh->error ); - return; - }; - - $dbh->query( qq[ - /* the module information */ - CREATE TABLE module ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - - module varchar(255), - version varchar(255), - path varchar(255), - comment varchar(255), - author varchar(255), - package varchar(255), - description varchar(255), - dslip varchar(255), - mtime varchar(255) - ); - - \n] - - ) or do { - error( $dbh->error ); - return; - }; - - $dbh->query( qq[ - /* the module index */ - CREATE INDEX IX_module_module ON module ( - module - ); - - \n] - - ) or do { - error( $dbh->error ); - return; - }; - - $dbh->query( qq[ - /* the version index */ - CREATE INDEX IX_module_version ON module ( - version - ); - - \n] - - ) or do { - error( $dbh->error ); - return; - }; - - $dbh->query( qq[ - /* the module-version index */ - CREATE INDEX IX_module_module_version ON module ( - module, version - ); - - \n] - - ) or do { - error( $dbh->error ); - return; - }; - - return 1; -} - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm deleted file mode 100644 index b44b04bd58e..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Source/SQLite/Tie.pm +++ /dev/null @@ -1,143 +0,0 @@ -package CPANPLUS::Internals::Source::SQLite::Tie; -use deprecate; - -use strict; -use warnings; - -use CPANPLUS::Error; -use CPANPLUS::Module; -use CPANPLUS::Module::Fake; -use CPANPLUS::Module::Author::Fake; -use CPANPLUS::Internals::Constants; - -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; - -use vars qw[@ISA $VERSION]; -$VERSION = "0.9135"; - -require Tie::Hash; -push @ISA, 'Tie::StdHash'; - - -sub TIEHASH { - my $class = shift; - my %hash = @_; - - my $tmpl = { - dbh => { required => 1 }, - table => { required => 1 }, - key => { required => 1 }, - cb => { required => 1 }, - offset => { default => 0 }, - }; - - my $args = check( $tmpl, \%hash ) or return; - my $obj = bless { %$args, store => {} } , $class; - - return $obj; -} - -sub FETCH { - my $self = shift; - my $key = shift or return; - my $dbh = $self->{dbh}; - my $cb = $self->{cb}; - my $table = $self->{table}; - - - ### did we look this one up before? - if( my $obj = $self->{store}->{$key} ) { - return $obj; - } - - my $res = $dbh->query( - "SELECT * from $table where $self->{key} = ?", $key - ) or do { - error( $dbh->error ); - return; - }; - - my $href = $res->hash; - - ### get rid of the primary key - delete $href->{'id'}; - - ### no results? - return unless keys %$href; - - ### expand author if needed - ### XXX no longer generic :( - if( $table eq 'module' ) { - $href->{author} = $cb->author_tree( $href->{author } ) or return; - } - - my $class = { - module => 'CPANPLUS::Module', - author => 'CPANPLUS::Module::Author', - }->{ $table }; - - my $obj = $self->{store}->{$key} = $class->new( %$href, _id => $cb->_id ); - - return $obj; -} - -sub STORE { - my $self = shift; - my $key = shift; - my $val = shift; - - $self->{store}->{$key} = $val; -} - -1; - -sub FIRSTKEY { - my $self = shift; - my $dbh = $self->{'dbh'}; - - my $res = $dbh->query( - "select $self->{key} from $self->{table} order by $self->{key} limit 1" - ); - - $self->{offset} = 0; - - my $key = $res->flat->[0]; - - return $key; -} - -sub NEXTKEY { - my $self = shift; - my $dbh = $self->{'dbh'}; - - my $res = $dbh->query( - "select $self->{key} from $self->{table} ". - "order by $self->{key} limit 1 offset $self->{offset}" - ); - - $self->{offset} +=1; - - my $key = $res->flat->[0]; - my $val = $self->FETCH( $key ); - - ### use each() semantics - return wantarray ? ( $key, $val ) : $key; -} - -sub EXISTS { !!$_[0]->FETCH( $_[1] ) } - -sub SCALAR { - my $self = shift; - my $dbh = $self->{'dbh'}; - - my $res = $dbh->query( "select count(*) from $self->{table}" ); - - return $res->flat; -} - -### intentionally left blank -sub DELETE { } -sub CLEAR { } - diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils.pm deleted file mode 100644 index 58ece81ee6a..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils.pm +++ /dev/null @@ -1,680 +0,0 @@ -package CPANPLUS::Internals::Utils; -use deprecate; - -use strict; - -use CPANPLUS::Error; -use CPANPLUS::Internals::Constants; - -use Cwd qw[chdir cwd]; -use File::Copy; -use Params::Check qw[check]; -use Module::Load::Conditional qw[can_load]; -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use version; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -local $Params::Check::VERBOSE = 1; - -=pod - -=head1 NAME - -CPANPLUS::Internals::Utils - convenience functions for CPANPLUS - -=head1 SYNOPSIS - - my $bool = $cb->_mkdir( dir => 'blah' ); - my $bool = $cb->_chdir( dir => 'blah' ); - my $bool = $cb->_rmdir( dir => 'blah' ); - - my $bool = $cb->_move( from => '/some/file', to => '/other/file' ); - my $bool = $cb->_move( from => '/some/dir', to => '/other/dir' ); - - my $cont = $cb->_get_file_contents( file => '/path/to/file' ); - - - my $version = $cb->_perl_version( perl => $^X ); - -=head1 DESCRIPTION - -C holds a few convenience functions for -CPANPLUS libraries. - -=head1 METHODS - -=head2 $cb->_mkdir( dir => '/some/dir' ) - -C<_mkdir> creates a full path to a directory. - -Returns true on success, false on failure. - -=cut - -sub _mkdir { - my $self = shift; - - my %hash = @_; - - my $tmpl = { - dir => { required => 1 }, - }; - - my $args = check( $tmpl, \%hash ) or ( - error(loc( Params::Check->last_error ) ), return - ); - - unless( can_load( modules => { 'File::Path' => 0.0 } ) ) { - error( loc("Could not use File::Path! This module should be core!") ); - return; - } - - eval { File::Path::mkpath($args->{dir}) }; - - if($@) { - chomp($@); - error(loc(qq[Could not create directory '%1': %2], $args->{dir}, $@ )); - return; - } - - return 1; -} - -=pod - -=head2 $cb->_chdir( dir => '/some/dir' ) - -C<_chdir> changes directory to a dir. - -Returns true on success, false on failure. - -=cut - -sub _chdir { - my $self = shift; - my %hash = @_; - - my $tmpl = { - dir => { required => 1, allow => DIR_EXISTS }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - unless( chdir $args->{dir} ) { - error( loc(q[Could not chdir into '%1'], $args->{dir}) ); - return; - } - - return 1; -} - -=pod - -=head2 $cb->_rmdir( dir => '/some/dir' ); - -Removes a directory completely, even if it is non-empty. - -Returns true on success, false on failure. - -=cut - -sub _rmdir { - my $self = shift; - my %hash = @_; - - my $tmpl = { - dir => { required => 1, allow => IS_DIR }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - unless( can_load( modules => { 'File::Path' => 0.0 } ) ) { - error( loc("Could not use File::Path! This module should be core!") ); - return; - } - - eval { File::Path::rmtree($args->{dir}) }; - - if($@) { - chomp($@); - error(loc(qq[Could not delete directory '%1': %2], $args->{dir}, $@ )); - return; - } - - return 1; -} - -=pod - -=head2 $cb->_perl_version ( perl => 'some/perl/binary' ); - -C<_perl_version> returns the version of a certain perl binary. -It does this by actually running a command. - -Returns the perl version on success and false on failure. - -=cut - -sub _perl_version { - my $self = shift; - my %hash = @_; - - my $perl; - my $tmpl = { - perl => { required => 1, store => \$perl }, - }; - - check( $tmpl, \%hash ) or return; - - my $perl_version; - ### special perl, or the one we are running under? - if( $perl eq $^X ) { - ### just load the config - require Config; - $perl_version = $Config::Config{version}; - - } else { - my $cmd = $perl . - ' -MConfig -eprint+Config::config_vars+version'; - ($perl_version) = (`$cmd` =~ /version='(.*)'/); - } - - return $perl_version if defined $perl_version; - return; -} - -=pod - -=head2 $cb->_version_to_number( version => $version ); - -Returns a proper module version, or '0.0' if none was available. - -=cut - -sub _version_to_number { - my $self = shift; - my %hash = @_; - - my $version; - my $tmpl = { - version => { default => '0.0', store => \$version }, - }; - - check( $tmpl, \%hash ) or return; - - $version =~ s!_!!g; # *sigh* - return $version if $version =~ /^\d*(?:\.\d+)?$/; - if ( my ($vers) = $version =~ /^(v?\d+(?:\.\d+(?:\.\d+)?)?)/ ) { - return eval { version->parse($vers)->numify }; - } - return '0.0'; -} - -=pod - -=head2 $cb->_whoami - -Returns the name of the subroutine you're currently in. - -=cut - -sub _whoami { my $name = (caller 1)[3]; $name =~ s/.+:://; $name } - -=pod - -=head2 _get_file_contents( file => $file ); - -Returns the contents of a file - -=cut - -sub _get_file_contents { - my $self = shift; - my %hash = @_; - - my $file; - my $tmpl = { - file => { required => 1, store => \$file } - }; - - check( $tmpl, \%hash ) or return; - - my $fh = OPEN_FILE->($file) or return; - my $contents = do { local $/; <$fh> }; - - return $contents; -} - -=pod - -=head2 $cb->_move( from => $file|$dir, to => $target ); - -Moves a file or directory to the target. - -Returns true on success, false on failure. - -=cut - -sub _move { - my $self = shift; - my %hash = @_; - - my $from; my $to; - my $tmpl = { - file => { required => 1, allow => [IS_FILE,IS_DIR], - store => \$from }, - to => { required => 1, store => \$to } - }; - - check( $tmpl, \%hash ) or return; - - if( File::Copy::move( $from, $to ) ) { - return 1; - } else { - error(loc("Failed to move '%1' to '%2': %3", $from, $to, $!)); - return; - } -} - -=pod - -=head2 $cb->_copy( from => $file|$dir, to => $target ); - -Moves a file or directory to the target. - -Returns true on success, false on failure. - -=cut - -sub _copy { - my $self = shift; - my %hash = @_; - - my($from,$to); - my $tmpl = { - file =>{ required => 1, allow => [IS_FILE,IS_DIR], - store => \$from }, - to => { required => 1, store => \$to } - }; - - check( $tmpl, \%hash ) or return; - - if( File::Copy::copy( $from, $to ) ) { - return 1; - } else { - error(loc("Failed to copy '%1' to '%2': %3", $from, $to, $!)); - return; - } -} - -=head2 $cb->_mode_plus_w( file => '/path/to/file' ); - -Sets the +w bit for the file. - -Returns true on success, false on failure. - -=cut - -sub _mode_plus_w { - my $self = shift; - my %hash = @_; - - require File::stat; - - my $file; - my $tmpl = { - file => { required => 1, allow => IS_FILE, store => \$file }, - }; - - check( $tmpl, \%hash ) or return; - - ### set the mode to +w for a file and +wx for a dir - my $x = File::stat::stat( $file ); - my $mask = -d $file ? 0100 : 0200; - - if( $x and chmod( $x->mode|$mask, $file ) ) { - return 1; - - } else { - error(loc("Failed to '%1' '%2': '%3'", 'chmod +w', $file, $!)); - return; - } -} - -=head2 $uri = $cb->_host_to_uri( scheme => SCHEME, host => HOST, path => PATH ); - -Turns a CPANPLUS::Config style C entry into an URI string. - -Returns the uri on success, and false on failure - -=cut - -sub _host_to_uri { - my $self = shift; - my %hash = @_; - - my($scheme, $host, $path); - my $tmpl = { - scheme => { required => 1, store => \$scheme }, - host => { default => 'localhost', store => \$host }, - path => { default => '', store => \$path }, - }; - - check( $tmpl, \%hash ) or return; - - ### it's an URI, so unixify the path. - ### VMS has a special method for just that - $path = ON_VMS - ? VMS::Filespec::unixify($path) - : File::Spec::Unix->catdir( File::Spec->splitdir( $path ) ); - - return "$scheme://" . File::Spec::Unix->catdir( $host, $path ); -} - -=head2 $cb->_vcmp( VERSION, VERSION ); - -Normalizes the versions passed and does a '<=>' on them, returning the result. - -=cut - -sub _vcmp { - my $self = shift; - my ($x, $y) = @_; - - $x = $self->_version_to_number(version => $x); - $y = $self->_version_to_number(version => $y); - - return $x <=> $y; -} - -=head2 $cb->_home_dir - -Returns the user's homedir, or C if it could not be found - -=cut - -sub _home_dir { - - if ( can_load( modules => { 'File::HomeDir' => 0.0 } ) ) { - if ( defined $ENV{APPDATA} && length $ENV{APPDATA} && !ON_WIN32 ) { - msg("'APPDATA' env var is set and not on MSWin32, " . - "please use 'PERL5_CPANPLUS_HOME' instead to change .cpanplus location", 1 ); - } - return File::HomeDir->my_home if -d File::HomeDir->my_home; - } - - my @os_home_envs = qw( APPDATA HOME USERPROFILE WINDIR SYS$LOGIN ); - - for my $env ( @os_home_envs ) { - next unless exists $ENV{ $env }; - next unless defined $ENV{ $env } && length $ENV{ $env }; - return $ENV{ $env } if -d $ENV{ $env }; - } - - return cwd(); -} - -=head2 $path = $cb->_safe_path( path => $path ); - -Returns a path that's safe to us on Win32 and VMS. - -Only cleans up the path on Win32 if the path exists. - -On VMS, it encodes dots to _ using C - -=cut - -sub _safe_path { - my $self = shift; - - my %hash = @_; - - my $path; - my $tmpl = { - path => { required => 1, store => \$path }, - }; - - check( $tmpl, \%hash ) or return; - - if( ON_WIN32 ) { - ### only need to fix it up if there's spaces in the path - return $path unless $path =~ /\s+/; - - ### clean up paths if we are on win32 - return Win32::GetShortPathName( $path ) || $path; - - } elsif ( ON_VMS ) { - ### XXX According to John Malmberg, there's an VMS issue: - ### catdir on VMS can not currently deal with directory components - ### with dots in them. - ### Fixing this is a a three step procedure, which will work for - ### VMS in its traditional ODS-2 mode, and it will also work if - ### VMS is in the ODS-5 mode that is being implemented. - ### If the path is already in VMS syntax, assume that we are done. - - ### VMS format is a path with a trailing ']' or ':' - return $path if $path =~ /\:|\]$/; - - ### 1. Make sure that the value to be converted, $path is - ### in UNIX directory syntax by appending a '/' to it. - $path .= '/' unless $path =~ m|/$|; - - ### 2. Use VMS::Filespec::vmsify($path . '/') to convert the dots to - ### underscores if needed. The trailing '/' is needed as so that - ### C knows that it should use directory translation instead of - ### filename translation, as filename translation leaves one dot. - $path = VMS::Filespec::vmsify( $path ); - - ### 3. Use $path = File::Spec->splitdir( VMS::Filespec::vmsify( - ### $path . '/') to remove the directory delimiters. - - ### From John Malmberg: - ### File::Spec->catdir will put the path back together. - ### The '/' trick only works if the string is a directory name - ### with UNIX style directory delimiters or no directory delimiters. - ### It is to force vmsify to treat the input specification as UNIX. - ### - ### There is a VMS::Filespec::unixpath() to do the appending of the '/' - ### to the specification, which will do a VMS::Filespec::vmsify() - ### if needed. - ### However it is not a good idea to call vmsify() on a pathname - ### returned by unixify(), and it is not a good idea to call unixify() - ### on a pathname returned by vmsify(). Because of the nature of the - ### conversion, not all file specifications can make the round trip. - ### - ### I think that directory specifications can safely make the round - ### trip, but not ones containing filenames. - $path = File::Spec->catdir( File::Spec->splitdir( $path ) ) - } - - return $path; -} - - -=head2 ($pkg, $version, $ext) = $cb->_split_package_string( package => PACKAGE_STRING ); - -Splits the name of a CPAN package string up into its package, version -and extension parts. - -For example, C would return the following parts: - - Package: Foo-Bar - Version: 1.2 - Extension: tar.gz - -=cut - -{ my $del_re = qr/[-_\+]/i; # delimiter between elements - my $pkg_re = qr/[a-z] # any letters followed by - [a-z\d]* # any letters, numbers - (?i:\.pm)? # followed by '.pm'--authors do this :( - (?: # optionally repeating: - $del_re # followed by a delimiter - [a-z] # any letters followed by - [a-z\d]* # any letters, numbers - (?i:\.pm)? # followed by '.pm'--authors do this :( - )* - /xi; - - my $ver_re = qr/[a-z]*\d*?[a-z]* # contains a digit and possibly letters - (?: # however, some start with a . only :( - [-._] # followed by a delimiter - [a-z\d]+ # and more digits and or letters - )*? - /xi; - - my $ext_re = qr/[a-z] # a letter, followed by - [a-z\d]* # letters and or digits, optionally - (?: - \. # followed by a dot and letters - [a-z\d]+ # and or digits (like .tar.bz2) - )? # optionally - /xi; - - my $ver_ext_re = qr/ - ($ver_re+) # version, optional - (?: - \. # a literal . - ($ext_re) # extension, - )? # optional, but requires version - /xi; - - ### composed regex for CPAN packages - my $full_re = qr/ - ^ - ( # the whole thing - ($pkg_re+) # package - (?: - $del_re # delimiter - $ver_ext_re # version + extension - )? - ) - $ - /xi; - - ### composed regex for perl packages - my $perl = PERL_CORE; - my $perl_re = qr/ - ^ - ( # the whole thing - ($perl) # package name for 'perl' - (?: - $ver_ext_re # version + extension - )? - ) - $ - /xi; - - -sub _split_package_string { - my $self = shift; - my %hash = @_; - - my $str; - my $tmpl = { package => { required => 1, store => \$str } }; - check( $tmpl, \%hash ) or return; - - - ### 2 different regexes, one for the 'perl' package, - ### one for ordinary CPAN packages.. try them both, - ### first match wins. - for my $re ( $full_re, $perl_re ) { - - ### try the next if the match fails - $str =~ $re or next; - - my $full = $1 || ''; - my $pkg = $2 || ''; - my $ver = $3 || ''; - my $ext = $4 || ''; - - ### this regex resets the capture markers! - ### strip the trailing delimiter - $pkg =~ s/$del_re$//; - - ### strip the .pm package suffix some authors insist on adding - $pkg =~ s/\.pm$//i; - - return ($pkg, $ver, $ext, $full ); - } - - return; - } -} - -{ my %escapes = map { - chr($_) => sprintf("%%%02X", $_) - } 0 .. 255; - - sub _uri_encode { - my $self = shift; - my %hash = @_; - - my $str; - my $tmpl = { - uri => { store => \$str, required => 1 } - }; - - check( $tmpl, \%hash ) or return; - - ### XXX taken straight from URI::Encode - ### Default unsafe characters. RFC 2732 ^(uric - reserved) - $str =~ s|([^A-Za-z0-9\-_.!~*'()])|$escapes{$1}|g; - - return $str; - } - - - sub _uri_decode { - my $self = shift; - my %hash = @_; - - my $str; - my $tmpl = { - uri => { store => \$str, required => 1 } - }; - - check( $tmpl, \%hash ) or return; - - ### XXX use unencode routine in utils? - $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; - - return $str; - } -} - -sub _update_timestamp { - my $self = shift; - my %hash = @_; - - my $file; - my $tmpl = { - file => { required => 1, store => \$file, allow => FILE_EXISTS } - }; - - check( $tmpl, \%hash ) or return; - - ### `touch` the file, so windoze knows it's new -jmb - ### works on *nix too, good fix -Kane - ### make sure it is writable first, otherwise the `touch` will fail - - my $now = time; - unless( chmod( 0644, $file) && utime ($now, $now, $file) ) { - error( loc("Couldn't touch %1", $file) ); - return; - } - - return 1; -} - - -1; - -# Local variables: -# c-indentation-style: bsd -# c-basic-offset: 4 -# indent-tabs-mode: nil -# End: -# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils/Autoflush.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils/Autoflush.pm deleted file mode 100644 index 8aa9030dfa3..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Internals/Utils/Autoflush.pm +++ /dev/null @@ -1,9 +0,0 @@ -package CPANPLUS::Internals::Utils::Autoflush; -use deprecate; - -use vars qw[$VERSION]; -$VERSION = "0.9135"; - -BEGIN { $|++ }; - -1; diff --git a/Master/tlpkg/tlperl/lib/CPANPLUS/Module.pm b/Master/tlpkg/tlperl/lib/CPANPLUS/Module.pm deleted file mode 100644 index 4eda894629a..00000000000 --- a/Master/tlpkg/tlperl/lib/CPANPLUS/Module.pm +++ /dev/null @@ -1,1839 +0,0 @@ -package CPANPLUS::Module; -use deprecate; - -use strict; -use vars qw[@ISA $VERSION]; -$VERSION = "0.9135"; - -use CPANPLUS::Dist; -use CPANPLUS::Error; -use CPANPLUS::Module::Signature; -use CPANPLUS::Module::Checksums; -use CPANPLUS::Internals::Constants; - -use FileHandle; - -use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; -use IPC::Cmd qw[can_run run]; -use File::Find qw[find]; -use Params::Check qw[check]; -use File::Basename qw[dirname]; -use Module::Load::Conditional qw[can_load check_install]; - -$Params::Check::VERBOSE = 1; - -@ISA = qw[ CPANPLUS::Module::Signature CPANPLUS::Module::Checksums]; - -=pod - -=head1 NAME - -CPANPLUS::Module - CPAN module objects for CPANPLUS - -=head1 SYNOPSIS - - ### get a module object from the CPANPLUS::Backend object - my $mod = $cb->module_tree('Some::Module'); - - ### accessors - $mod->version; - $mod->package; - - ### methods - $mod->fetch; - $mod->extract; - $mod->install; - - -=head1 DESCRIPTION - -C creates objects from the information in the -source files. These can then be used to query and perform actions -on, like fetching or installing. - -These objects should only be created internally. For C objects, -there's the C class. To obtain a module object -consult the C documentation. - -=cut - -my $tmpl = { - module => { default => '', required => 1 }, # full module name - version => { default => '0.0' }, # version number - path => { default => '', required => 1 }, # extended path on the - # cpan mirror, like - # /author/id/K/KA/KANE - comment => { default => ''}, # comment on module - package => { default => '', required => 1 }, # package name, like - # 'bar-baz-1.03.tgz' - description => { default => '' }, # description of the - # module - dslip => { default => EMPTY_DSLIP }, # dslip information - _id => { required => 1 }, # id of the Internals - # parent object - _status => { no_override => 1 }, # stores status object - author => { default => '', required => 1, - allow => IS_AUTHOBJ }, # module author - mtime => { default => '' }, -}; - -### some of these will be resolved by wrapper functions that -### do Clever Things to find the actual value, so don't create -### an autogenerated sub for that just here, take an alternate -### name to allow for a wrapper -{ my %rename = ( - dslip => '_dslip' - ); - - ### autogenerate accessors ### - for my $key ( keys %$tmpl ) { - no strict 'refs'; - - my $sub = $rename{$key} || $key; - - *{__PACKAGE__."::$sub"} = sub { - $_[0]->{$key} = $_[1] if @_ > 1; - return $_[0]->{$key}; - } - } -} - - -=pod - -=head1 CLASS METHODS - -=head2 accessors () - -Returns a list of all accessor methods to the object - -=cut - -### *name is an alias, include it explicitly -sub accessors { return ('name', keys %$tmpl) }; - -=head1 ACCESSORS - -An objects of this class has the following accessors: - -=over 4 - -=item name - -Name of the module. - -=item module - -Name of the module. - -=item version - -Version of the module. Defaults to '0.0' if none was provided. - -=item path - -Extended path on the mirror. - -=item comment - -Any comment about the module -- largely unused. - -=item package - -The name of the package. - -=item description - -Description of the module -- only registered modules have this. - -=item dslip - -The five character dslip string, that represents meta-data of the -module -- again, only registered modules have this. - -=cut - -sub dslip { - my $self = shift; - - ### if this module has relevant dslip info, return it - return $self->_dslip if $self->_dslip ne EMPTY_DSLIP; - - ### if not, look at other modules in the same package, - ### see if *they* have any dslip info - for my $mod ( $self->contains ) { - return $mod->_dslip if $mod->_dslip ne EMPTY_DSLIP; - } - - ### ok, really no dslip info found, return the default - return EMPTY_DSLIP; -} - - -=pod - -=item status - -The C object associated with this object. -(see below). - -=item author - -The C object associated with this object. - -=item parent - -The C object that spawned this module object. - -=back - -=cut - -### Alias ->name to ->module, for human beings. -*name = *module; - -sub parent { - my $self = shift; - my $obj = CPANPLUS::Internals->_retrieve_id( $self->_id ); - - return $obj; -} - -=head1 STATUS ACCESSORS - -C caches a lot of results from method calls and saves data -it collected along the road for later reuse. - -C uses this internally, but it is also available for the end -user. You can get a status object by calling: - - $modobj->status - -You can then query the object as follows: - -=over 4 - -=item installer_type - -The installer type used for this distribution. Will be one of -'makemaker' or 'build'. This determines whether C -or C will be used to build this distribution. - -=item dist_cpan - -The dist object used to do the CPAN-side of the installation. Either -a C or C object. - -=item dist - -The custom dist object used to do the operating specific side of the -installation, if you've chosen to use this. For example, if you've -chosen to install using the C format, this may be a -C object. - -Undefined if you didn't specify a separate format to install through. - -=item prereqs | requires - -A hashref of prereqs this distribution was found to have. Will look -something like this: - - { Carp => 0.01, strict => 0 } - -Might be undefined if the distribution didn't have any prerequisites. - -=item configure_requires - -Like prereqs, but these are necessary to be installed before the -build process can even begin. - -=item signature - -Flag indicating, if a signature check was done, whether it was OK or -not. - -=item extract - -The directory this distribution was extracted to. - -=item fetch - -The location this distribution was fetched to. - -=item readme - -The text of this distributions README file. - -=item uninstall - -Flag indicating if an uninstall call was done successfully. - -=item created - -Flag indicating if the C call to your dist object was done -successfully. - -=item installed - -Flag indicating if the C call to your dist object was done -successfully. - -=item checksums - -The location of this distributions CHECKSUMS file. - -=item checksum_ok - -Flag indicating if the checksums check was done successfully. - -=item checksum_value - -The checksum value this distribution is expected to have - -=back - -=head1 METHODS - -=head2 $self = CPANPLUS::Module->new( OPTIONS ) - -This method returns a C object. Normal users -should never call this method directly, but instead use the -C to obtain module objects. - -This example illustrates a C call with all required arguments: - - CPANPLUS::Module->new( - module => 'Foo', - path => 'authors/id/A/AA/AAA', - package => 'Foo-1.0.tgz', - author => $author_object, - _id => INTERNALS_OBJECT_ID, - ); - -Every accessor is also a valid option to pass to C. - -Returns a module object on success and false on failure. - -=cut - - -sub new { - my($class, %hash) = @_; - - ### don't check the template for sanity - ### -- we know it's good and saves a lot of performance - local $Params::Check::SANITY_CHECK_TEMPLATE = 0; - - my $object = check( $tmpl, \%hash ) or return; - - bless $object, $class; - - return $object; -} - -### only create status objects when they're actually asked for -sub status { - my $self = shift; - return $self->_status if $self->_status; - - my $acc = Object::Accessor->new; - $acc->mk_accessors( qw[ installer_type dist_cpan dist prereqs - signature extract fetch readme uninstall - created installed prepared checksums files - checksum_ok checksum_value _fetch_from - configure_requires - ] ); - - ### create an alias from 'requires' to 'prereqs', so it's more in - ### line with 'configure_requires'; - $acc->mk_aliases( requires => 'prereqs' ); - - $self->_status( $acc ); - - return $self->_status; -} - - -### flush the cache of this object ### -sub _flush { - my $self = shift; - $self->status->mk_flush; - return 1; -} - -=head2 $mod->package_name( [$package_string] ) - -Returns the name of the package a module is in. For C -that might be C. - -=head2 $mod->package_version( [$package_string] ) - -Returns the version of the package a module is in. For a module -in the package C this would be C<1.1>. - -=head2 $mod->package_extension( [$package_string] ) - -Returns the suffix added by the compression method of a package a -certain module is in. For a module in C, this -would be C. - -=head2 $mod->package_is_perl_core - -Returns a boolean indicating of the package a particular module is in, -is actually a core perl distribution. - -=head2 $mod->module_is_supplied_with_perl_core( [version => $]] ) - -Returns a boolean indicating whether C of this module -was supplied with the current running perl's core package. - -=head2 $mod->is_bundle - -Returns a boolean indicating if the module you are looking at, is -actually a bundle. Bundles are identified as modules whose name starts -with C. - -=head2 $mod->is_autobundle; - -Returns a boolean indicating if the module you are looking at, is -actually an autobundle as generated by C<< $cb->autobundle >>. - -=head2 $mod->is_third_party - -Returns a boolean indicating whether the package is a known third-party -module (i.e. it's not provided by the standard Perl distribution and -is not available on the CPAN, but on a third party software provider). -See L for more details. - -=head2 $mod->third_party_information - -Returns a reference to a hash with more information about a third-party -module. See the documentation about C in -L for more details. - -=cut - -{ ### fetches the test reports for a certain module ### - my %map = ( - name => 0, - version => 1, - extension => 2, - ); - - while ( my($type, $index) = each %map ) { - my $name = 'package_' . $type; - - no strict 'refs'; - *$name = sub { - my $self = shift; - my $val = shift || $self->package; - my @res = $self->parent->_split_package_string( package => $val ); - - ### return the corresponding index from the result - return $res[$index] if @res; - return; - }; - } - - sub package_is_perl_core { - my $self = shift; - my $cb = $self->parent; - - ### check if the package looks like a perl core package - return 1 if $self->package_name eq PERL_CORE; - - ### address #44562: ::Module->package_is_perl_code : problem comparing - ### version strings -- use $cb->_vcmp to avoid warnings when version - ### have _ in them - - my $core = $self->module_is_supplied_with_perl_core; - ### ok, so it's found in the core, BUT it could be dual-lifed - if (defined $core) { - ### if the package is newer than installed, then it's dual-lifed - return if $cb->_vcmp($self->version, $self->installed_version) > 0; - - ### if the package is newer or equal to the corelist, - ### then it's dual-lifed - return if $cb->_vcmp( $self->version, $core ) >= 0; - - ### otherwise, it's older than corelist, thus unsuitable. - return 1; - } - - ### not in corelist, not a perl core package. - return; - } - - sub module_is_supplied_with_perl_core { - my $self = shift; - my $ver = shift || $]; - - ### allow it to be called as a package function as well like: - ### CPANPLUS::Module::module_is_supplied_with_perl_core('Config') - ### so that we can check the status of modules that aren't released - ### to CPAN, but are part of the core. - my $name = ref $self ? $self->module : $self; - - ### check Module::CoreList to see if it's a core package - require Module::CoreList; - - ### Address #41157: Module::module_is_supplied_with_perl_core() - ### broken for perl 5.10: Module::CoreList's version key for the - ### hash has a different number of trailing zero than $] aka - ### $PERL_VERSION. - - my $core; - - if ( exists $Module::CoreList::version{ 0+$ver }->{ $name } ) { - $core = $Module::CoreList::version{ 0+$ver }->{ $name }; - $core = 0 unless $core; - } - return $core; - } - - ### make sure Bundle-Foo also gets flagged as bundle - sub is_bundle { - my $self = shift; - - ### cpan'd bundle - return 1 if $self->module =~ /^bundle(?:-|::)/i; - - ### autobundle - return 1 if $self->is_autobundle; - - ### neither - return; - } - - ### full path to a generated autobundle - sub is_autobundle { - my $self = shift; - my $conf = $self->parent->configure_object; - my $prefix = $conf->_get_build('autobundle_prefix'); - - return 1 if $self->module eq $prefix; - return; - } - - sub is_third_party { - my $self = shift; - - return unless can_load( modules => { 'Module::ThirdParty' => 0 } ); - - return Module::ThirdParty::is_3rd_party( $self->name ); - } - - sub third_party_information { - my $self = shift; - - return unless $self->is_third_party; - - return Module::ThirdParty::module_information( $self->name ); - } -} - -=pod - -=head2 $clone = $self->clone - -Clones the current module object for tinkering with. -It will have a clean C object, as well as -a fake C object. - -=cut - -{ ### accessors dont change during run time, so only compute once - my @acc = grep !/status/, __PACKAGE__->accessors(); - - sub clone { - my $self = shift; - - ### clone the object ### - my %data = map { $_ => $self->$_ } @acc; - - my $obj = CPANPLUS::Module::Fake->new( %data ); - - return $obj; - } -} - -=pod - -=head2 $where = $self->fetch - -Fetches the module from a CPAN mirror. -Look at L for details on the -options you can pass. - -=cut - -sub fetch { - my $self = shift; - my $cb = $self->parent; - - ### custom args - my %args = ( module => $self ); - - ### if a custom fetch location got specified before, add that here - $args{fetch_from} = $self->status->_fetch_from - if $self->status->_fetch_from; - - my $where = $cb->_fetch( @_, %args ) or return; - - ### do an md5 check ### - if( !$self->status->_fetch_from and - $cb->configure_object->get_conf('md5') and - $self->package ne CHECKSUMS - ) { - unless( $self->_validate_checksum ) { - error( loc( "Checksum error for '%1' -- will not trust package", - $self->package) ); - return; - } - } - - return $where; -} - -=pod - -=head2 $path = $self->extract - -Extracts the fetched module. -Look at L for details on -the options you can pass. - -=cut - -sub extract { - my $self = shift; - my $cb = $self->parent; - - unless( $self->status->fetch ) { - error( loc( "You have not fetched '%1' yet -- cannot extract", - $self->module) ); - return; - } - - ### can't extract these, so just use the basedir for the file - if( $self->is_autobundle ) { - - ### this is expected to be set after an extract call - $self->get_installer_type; - - return $self->status->extract( dirname( $self->status->fetch ) ); - } - - return $cb->_extract( @_, module => $self ); -} - -=head2 $type = $self->get_installer_type([prefer_makefile => BOOL]) - -Gets the installer type for this module. This may either be C or -C. If C is unavailable or no installer type -is available, it will fall back to C. If both are available, -it will pick the one indicated by your config, or by the -C option you can pass to this function. - -Returns the installer type on success, and false on error. - -=cut - -sub get_installer_type { - my $self = shift; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my ($prefer_makefile,$verbose); - my $tmpl = { - prefer_makefile => { default => $conf->get_conf('prefer_makefile'), - store => \$prefer_makefile, allow => BOOLEANS }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - }; - - check( $tmpl, \%hash ) or return; - - my $type; - - ### autobundles use their own installer, so return that - if( $self->is_autobundle ) { - $type = INSTALLER_AUTOBUNDLE; - - } else { - my $extract = $self->status->extract(); - unless( $extract ) { - error(loc( - "Cannot determine installer type of unextracted module '%1'", - $self->module - )); - return; - } - - ### check if it's a makemaker or a module::build type dist ### - my $found_build = -e BUILD_PL->( $extract ); - my $found_makefile = -e MAKEFILE_PL->( $extract ); - - $type = INSTALLER_BUILD if !$prefer_makefile && $found_build; - $type = INSTALLER_BUILD if $found_build && !$found_makefile; - $type = INSTALLER_MM if $prefer_makefile && $found_makefile; - $type = INSTALLER_MM if $found_makefile && !$found_build; - # Special case Module::Build to always use INSTALLER_MM - $type = INSTALLER_MM if $self->package =~ m{^Module-Build-\d}; - - } - - ### ok, so it's a 'build' installer, but you don't /have/ module build - ### XXX duplicated from CPANPLUS::Selfupdate. fix somehow? - if( $type and $type eq INSTALLER_BUILD and ( - not CPANPLUS::Dist->has_dist_type( INSTALLER_BUILD ) - or not $cb->module_tree( INSTALLER_BUILD ) - ->is_uptodate( version => '0.60' ) - ) ) { - - ### XXX this is for recording purposes only. We *have* to install - ### these before even creating a dist object, or we'll get an error - ### saying 'no such dist type'; - ### XXX duplicated from CPANPLUS::Selfupdate. fix somehow? - my $href = $self->status->configure_requires || {}; - my $deps = { INSTALLER_BUILD, '0.60', %$href }; - - $self->status->configure_requires( $deps ); - - msg(loc("This module requires '%1' and '%2' to be installed first. ". - "Adding these modules to your prerequisites list", - 'Module::Build', INSTALLER_BUILD - ), $verbose ); - - - ### ok, actually we found neither ### - } elsif ( !$type ) { - error( loc( "Unable to find '%1' or '%2' for '%3'; ". - "Will default to '%4' but might be unable ". - "to install!", BUILD_PL->(), MAKEFILE_PL->(), - $self->module, INSTALLER_MM ) ); - $type = INSTALLER_MM; - } - - return $self->status->installer_type( $type ) if $type; - return; -} - -=pod - -=head2 $dist = $self->dist([target => 'prepare|create', format => DISTRIBUTION_TYPE, args => {key => val}]); - -Create a distribution object, ready to be installed. -Distribution type defaults to your config settings - -The optional C hashref is passed on to the specific distribution -types' C method after being dereferenced. - -Returns a distribution object on success, false on failure. - -See C for details. - -=cut - -sub dist { - my $self = shift; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - ### have you determined your installer type yet? if not, do it here, - ### we need the info - $self->get_installer_type unless $self->status->installer_type; - - my($type,$args,$target); - my $tmpl = { - format => { default => $conf->get_conf('dist_type') || - $self->status->installer_type, - store => \$type }, - target => { default => TARGET_CREATE, store => \$target }, - args => { default => {}, store => \$args }, - }; - - check( $tmpl, \%hash ) or return; - - ### ok, check for $type. Do we have it? - unless( CPANPLUS::Dist->has_dist_type( $type ) ) { - - ### ok, we don't have it. Is it C::D::Build? if so we can install the - ### whole thing now - ### XXX we _could_ do this for any type we dont have actually... - if( $type eq INSTALLER_BUILD ) { - msg(loc("Bootstrapping installer '%1'", $type)); - - ### don't propagate the format, it's the one we're trying to - ### bootstrap, so it'll be an infinite loop if we do - - $cb->module_tree( $type )->install( target => $target, %$args ) or - do { - error(loc("Could not bootstrap installer '%1' -- ". - "can not continue", $type)); - return; - }; - - ### re-scan for available modules now - CPANPLUS::Dist->rescan_dist_types; - - unless( CPANPLUS::Dist->has_dist_type( $type ) ) { - error(loc("Newly installed installer type '%1' should be ". - "available, but is not! -- aborting", $type)); - return; - } else { - msg(loc("Installer '%1' successfully bootstrapped", $type)); - } - - ### some other plugin you dont have. Abort - } else { - error(loc("Installer type '%1' not found. Please verify your ". - "installation -- aborting", $type )); - return; - } - } - - ### make sure we don't overwrite it, just in case we came - ### back from a ->save_state. This allows restoration to - ### work correctly - my( $dist, $dist_cpan ); - - unless( $dist = $self->status->dist ) { - $dist = $type->new( module => $self ) or return; - $self->status->dist( $dist ); - } - - unless( $dist_cpan = $self->status->dist_cpan ) { - - $dist_cpan = $type eq $self->status->installer_type - ? $self->status->dist - : $self->status->installer_type->new( module => $self ); - - - $self->status->dist_cpan( $dist_cpan ); - } - - - DIST: { - ### just wanted the $dist object? - last DIST if $target eq TARGET_INIT; - - ### first prepare the dist - $dist->prepare( %$args ) or return; - $self->status->prepared(1); - - ### you just wanted us to prepare? - last DIST if $target eq TARGET_PREPARE; - - $dist->create( %$args ) or return; - $self->status->created(1); - } - - return $dist; -} - -=pod - -=head2 $bool = $mod->prepare( ) - -Convenience method around C that prepares a module -without actually building it. This is equivalent to invoking C -with C set to C - -Returns true on success, false on failure. - -=cut - -sub prepare { - my $self = shift; - return $self->install( @_, target => TARGET_PREPARE ); -} - -=head2 $bool = $mod->create( ) - -Convenience method around C that creates a module. -This is equivalent to invoking C with C set to -C - -Returns true on success, false on failure. - -=cut - -sub create { - my $self = shift; - return $self->install( @_, target => TARGET_CREATE ); -} - -=head2 $bool = $mod->test( ) - -Convenience wrapper around C that tests a module, without -installing it. -It's the equivalent to invoking C with C set to -C and C set to C<0>. - -Returns true on success, false on failure. - -=cut - -sub test { - my $self = shift; - return $self->install( @_, target => TARGET_CREATE, skiptest => 0 ); -} - -=pod - -=head2 $bool = $self->install([ target => 'init|prepare|create|install', format => FORMAT_TYPE, extractdir => DIRECTORY, fetchdir => DIRECTORY, prefer_bin => BOOL, force => BOOL, verbose => BOOL, ..... ]); - -Installs the current module. This includes fetching it and extracting -it, if this hasn't been done yet, as well as creating a distribution -object for it. - -This means you can pass it more arguments than described above, which -will be passed on to the relevant methods as they are called. - -See C, C and -C for details. - -Returns true on success, false on failure. - -=cut - -sub install { - my $self = shift; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my %hash = @_; - - my $args; my $target; my $format; - { ### so we can use the rest of the args to the create calls etc ### - local $Params::Check::NO_DUPLICATES = 1; - local $Params::Check::ALLOW_UNKNOWN = 1; - - ### targets 'dist' and 'test' are now completely ignored ### - my $tmpl = { - ### match this allow list with Dist->_resolve_prereqs - target => { default => TARGET_INSTALL, store => \$target, - allow => [TARGET_PREPARE, TARGET_CREATE, - TARGET_INSTALL, TARGET_INIT ] }, - force => { default => $conf->get_conf('force'), }, - verbose => { default => $conf->get_conf('verbose'), }, - format => { default => $conf->get_conf('dist_type'), - store => \$format }, - }; - - $args = check( $tmpl, \%hash ) or return; - } - - - ### if this target isn't 'install', we will need to at least 'create' - ### every prereq, so it can build - ### XXX prereq_target of 'prepare' will do weird things here, and is - ### not supported. - $args->{'prereq_target'} ||= TARGET_CREATE if $target ne TARGET_INSTALL; - - ### check if it's already upto date ### - if( $target eq TARGET_INSTALL and !$args->{'force'} and - !$self->package_is_perl_core() and # separate rules apply - ( $self->status->installed() or $self->is_uptodate ) and - !INSTALL_VIA_PACKAGE_MANAGER->($format) - ) { - msg(loc("Module '%1' already up to date, won't install without force", - $self->module), $args->{'verbose'} ); - return $self->status->installed(1); - } - - # if it's a non-installable core package, abort the install. - if( $self->package_is_perl_core() ) { - # if the installed is newer, say so. - if( $self->installed_version > $self->version ) { - error(loc("The core Perl %1 module '%2' (%3) is more ". - "recent than the latest release on CPAN (%4). ". - "Aborting install.", - $], $self->module, $self->installed_version, - $self->version ) ); - # if the installed matches, say so. - } elsif( $self->installed_version == $self->version ) { - error(loc("The core Perl %1 module '%2' (%3) can only ". - "be installed by Perl itself. ". - "Aborting install.", - $], $self->module, $self->installed_version ) ); - # otherwise, the installed is older; say so. - } else { - error(loc("The core Perl %1 module '%2' can only be ". - "upgraded from %3 to %4 by Perl itself (%5). ". - "Aborting install.", - $], $self->module, $self->installed_version, - $self->version, $self->package ) ); - } - return; - - ### it might be a known 3rd party module - } elsif ( $self->is_third_party ) { - my $info = $self->third_party_information; - error(loc( - "%1 is a known third-party module.\n\n". - "As it isn't available on the CPAN, CPANPLUS can't install " . - "it automatically. Therefore you need to install it manually " . - "before proceeding.\n\n". - "%2 is part of %3, published by %4, and should be available ". - "for download at the following address:\n\t%5", - $self->name, $self->name, $info->{name}, $info->{author}, - $info->{url} - )); - - return; - } - - ### fetch it if need be ### - unless( $self->status->fetch ) { - my $params; - for (qw[prefer_bin fetchdir]) { - $params->{$_} = $args->{$_} if exists $args->{$_}; - } - for (qw[force verbose]) { - $params->{$_} = $args->{$_} if defined $args->{$_}; - } - $self->fetch( %$params ) or return; - } - - ### extract it if need be ### - unless( $self->status->extract ) { - my $params; - for (qw[prefer_bin extractdir]) { - $params->{$_} = $args->{$_} if exists $args->{$_}; - } - for (qw[force verbose]) { - $params->{$_} = $args->{$_} if defined $args->{$_}; - } - $self->extract( %$params ) or return; - } - - $args->{'prereq_format'} = $format if $format; - $format ||= $self->status->installer_type; - - unless( $format ) { - error( loc( "Don't know what installer to use; " . - "Couldn't find either '%1' or '%2' in the extraction " . - "directory '%3' -- will be unable to install", - BUILD_PL->(), MAKEFILE_PL->(), $self->status->extract ) ); - - $self->status->installed(0); - return; - } - - - ### do SIGNATURE checks? ### - ### XXX check status and not recheck EVERY time? - if( $conf->get_conf('signature') ) { - unless( $self->check_signature( verbose => $args->{verbose} ) ) { - error( loc( "Signature check failed for module '%1' ". - "-- Not trusting this module, aborting install", - $self->module ) ); - $self->status->signature(0); - - ### send out test report on broken sig - if( $conf->get_conf('cpantest') ) { - $cb->_send_report( - module => $self, - failed => 1, - buffer => CPANPLUS::Error->stack_as_string, - verbose => $args->{verbose}, - force => $args->{force}, - ) or error(loc("Failed to send test report for '%1'", - $self->module ) ); - } - - return; - - } else { - ### signature OK ### - $self->status->signature(1); - } - } - - ### a target of 'create' basically means not to run make test ### - ### eh, no it /doesn't/.. skiptest => 1 means skiptest => 1. - #$args->{'skiptest'} = 1 if $target eq 'create'; - - ### bundle rules apply ### - if( $self->is_bundle ) { - ### check what we need to install ### - my @prereqs = $self->bundle_modules(); - unless( @prereqs ) { - error( loc( "Bundle '%1' does not specify any modules to install", - $self->module ) ); - - ### XXX mark an error here? ### - } - } - - my $dist = $self->dist( format => $format, - target => $target, - args => $args ); - unless( $dist ) { - error( loc( "Unable to create a new distribution object for '%1' " . - "-- cannot continue", $self->module ) ); - return; - } - - return 1 if $target ne TARGET_INSTALL; - - my $ok = $dist->install( %$args ) ? 1 : 0; - - $self->status->installed($ok); - - return 1 if $ok; - return; -} - -=pod @list = $self->bundle_modules() - -Returns a list of module objects the Bundle specifies. - -This requires you to have extracted the bundle already, using the -C method. - -Returns false on error. - -=cut - -sub bundle_modules { - my $self = shift; - my $cb = $self->parent; - - unless( $self->is_bundle ) { - error( loc("'%1' is not a bundle", $self->module ) ); - return; - } - - my @files; - - ### autobundles are special files generated by CPANPLUS. If we can - ### read the file, we can determine the prereqs - if( $self->is_autobundle ) { - my $where; - unless( $where = $self->status->fetch ) { - error(loc("Don't know where '%1' was fetched to", $self->package)); - return; - } - - push @files, $where - - ### regular bundle::* upload - } else { - my $dir; - unless( $dir = $self->status->extract ) { - error(loc("Don't know where '%1' was extracted to", $self->module)); - return; - } - - find( { - wanted => sub { push @files, File::Spec->rel2abs($_) if /\.pm/i }, - no_chdir => 1, - }, $dir ); - } - - my $prereqs = {}; my @list; my $seen = {}; - for my $file ( @files ) { - my $fh = FileHandle->new($file) - or( error(loc("Could not open '%1' for reading: %2", - $file,$!)), next ); - - my $flag; - while( local $_ = <$fh> ) { - ### quick hack to read past the header of the file ### - last if $flag && m|^=head|i; - - ### from perldoc cpan: - ### =head1 CONTENTS - ### In this pod section each line obeys the format - ### Module_Name [Version_String] [- optional text] - $flag = 1 if m|^=head1 CONTENTS|i; - - if ($flag && /^(?!=)(\S+)\s*(\S+)?/) { - my $module = $1; - my $version = $cb->_version_to_number( version => $2 ); - - my $obj = $cb->module_tree($module); - - unless( $obj ) { - error(loc("Cannot find bundled module '%1'", $module), - loc("-- it does not seem to exist") ); - next; - } - - ### make sure we list no duplicates ### - unless( $seen->{ $obj->module }++ ) { - push @list, $obj; - $prereqs->{ $module } = - $cb->_version_to_number( version => $version ); - } - } - } - } - - ### store the prereqs we just found ### - $self->status->prereqs( $prereqs ); - - return @list; -} - -=pod - -=head2 $text = $self->readme - -Fetches the readme belonging to this module and stores it under -C<< $obj->status->readme >>. Returns the readme as a string on -success and returns false on failure. - -=cut - -sub readme { - my $self = shift; - my $conf = $self->parent->configure_object; - - ### did we already dl the readme once? ### - return $self->status->readme() if $self->status->readme(); - - ### this should be core ### - return unless can_load( modules => { FileHandle => '0.0' }, - verbose => 1, - ); - - ### get a clone of the current object, with a fresh status ### - my $obj = $self->clone or return; - - ### munge the package name - my $pkg = README->( $obj ); - $obj->package($pkg); - - my $file; - { ### disable checksum fetches on readme downloads - - my $tmp = $conf->get_conf( 'md5' ); - $conf->set_conf( md5 => 0 ); - - $file = $obj->fetch; - - $conf->set_conf( md5 => $tmp ); - - return unless $file; - } - - ### read the file into a scalar, to store in the original object ### - my $fh = new FileHandle; - unless( $fh->open($file) ) { - error( loc( "Could not open file '%1': %2", $file, $! ) ); - return; - } - - my $in = do{ local $/; <$fh> }; - $fh->close; - - return $self->status->readme( $in ); -} - -=pod - -=head2 $version = $self->installed_version() - -Returns the currently installed version of this module, if any. - -=head2 $where = $self->installed_file() - -Returns the location of the currently installed file of this module, -if any. - -=head2 $dir = $self->installed_dir() - -Returns the directory (or more accurately, the C<@INC> handle) from -which this module was loaded, if any. - -=head2 $bool = $self->is_uptodate([version => VERSION_NUMBER]) - -Returns a boolean indicating if this module is uptodate or not. - -=cut - -### uptodate/installed functions -{ my $map = { # hashkey, alternate rv - installed_version => ['version', 0 ], - installed_file => ['file', ''], - installed_dir => ['dir', ''], - is_uptodate => ['uptodate', 0 ], - }; - - while( my($method, $aref) = each %$map ) { - my($key,$alt_rv) = @$aref; - - no strict 'refs'; - *$method = sub { - ### never use the @INC hooks to find installed versions of - ### modules -- they're just there in case they're not on the - ### perl install, but the user shouldn't trust them for *other* - ### modules! - ### XXX CPANPLUS::inc is now obsolete, so this should not - ### be needed anymore - #local @INC = CPANPLUS::inc->original_inc; - - my $self = shift; - - ### make sure check_install is not looking in %INC, as - ### that may contain some of our sneakily loaded modules - ### that aren't installed as such. -- kane - local $Module::Load::Conditional::CHECK_INC_HASH = 0; - ### this should all that is required for deprecated core modules - local $Module::Load::Conditional::DEPRECATED = 1; - my $href = check_install( - module => $self->module, - version => $self->version, - @_, - ); - - ### Don't trust modules which are the result of @INC hooks - ### FatPacker uses this trickery and it causes WTF moments - return $alt_rv if defined $href->{dir} && ref $href->{dir}; - - return $href->{$key} || $alt_rv; - } - } -} - - - -=pod - -=head2 $href = $self->details() - -Returns a hashref with key/value pairs offering more information about -a particular module. For example, for C it might look like -this: - - Author Jarkko Hietaniemi (jhi@iki.fi) - Description High resolution time, sleep, and alarm - Development Stage Released - Installed File /usr/local/perl/lib/Time/Hires.pm - Interface Style plain Functions, no references used - Language Used C and perl, a C compiler will be needed - Package Time-HiRes-1.65.tar.gz - Public License Unknown - Support Level Developer - Version Installed 1.52 - Version on CPAN 1.65 - -=cut - -sub details { - my $self = shift; - my $conf = $self->parent->configure_object(); - my $cb = $self->parent; - my %hash = @_; - - my $res = { - Author => loc("%1 (%2)", $self->author->author(), - $self->author->email() ), - Package => $self->package, - Description => $self->description || loc('None given'), - 'Version on CPAN' => $self->version, - }; - - ### check if we have the module installed - ### if so, add version have and version on cpan - $res->{'Version Installed'} = $self->installed_version - if $self->installed_version; - $res->{'Installed File'} = $self->installed_file if $self->installed_file; - - my $i = 0; - for my $item( split '', $self->dslip ) { - $res->{ $cb->_dslip_defs->[$i]->[0] } = - $cb->_dslip_defs->[$i]->[1]->{$item} || loc('Unknown'); - $i++; - } - - return $res; -} - -=head2 @list = $self->contains() - -Returns a list of module objects that represent the modules also -present in the package of this module. - -For example, for C this might return: - - Archive::Tar - Archive::Tar::Constant - Archive::Tar::File - -=cut - -sub contains { - my $self = shift; - my $cb = $self->parent; - my $pkg = $self->package; - - my @mods = $cb->search( type => 'package', allow => [qr/^$pkg$/] ); - - return @mods; -} - -=pod - -=head2 @list_of_hrefs = $self->fetch_report() - -This function queries the CPAN testers database at -I for test results of specified module -objects, module names or distributions. - -Look at L for details on -the options you can pass and the return value to expect. - -=cut - -sub fetch_report { - my $self = shift; - my $cb = $self->parent; - - return $cb->_query_report( @_, module => $self ); -} - -=pod - -=head2 $bool = $self->uninstall([type => [all|man|prog]) - -This function uninstalls the specified module object. - -You can install 2 types of files, either C pages or Cram -files. Alternately you can specify C to uninstall both (which -is the default). - -Returns true on success and false on failure. - -Do note that this does an uninstall via the so-called C<.packlist>, -so if you used a module installer like say, C or C, you -should not use this, but use your package manager instead. - -=cut - -sub uninstall { - my $self = shift; - my $conf = $self->parent->configure_object(); - my %hash = @_; - - my ($type,$verbose); - my $tmpl = { - type => { default => 'all', allow => [qw|man prog all|], - store => \$type }, - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose }, - force => { default => $conf->get_conf('force') }, - }; - - ### XXX add a warning here if your default install dist isn't - ### makefile or build -- that means you are using a package manager - ### and this will not do what you think! - - my $args = check( $tmpl, \%hash ) or return; - - if( $conf->get_conf('dist_type') and ( - ($conf->get_conf('dist_type') ne INSTALLER_BUILD) or - ($conf->get_conf('dist_type') ne INSTALLER_MM)) - ) { - msg(loc("You have a default installer type set (%1) ". - "-- you should probably use that package manager to " . - "uninstall modules", $conf->get_conf('dist_type')), $verbose); - } - - ### check if we even have the module installed -- no point in continuing - ### otherwise - unless( $self->installed_version ) { - error( loc( "Module '%1' is not installed, so cannot uninstall", - $self->module ) ); - return; - } - - ### nothing to uninstall ### - my $files = $self->files( type => $type ) or return; - my $dirs = $self->directory_tree( type => $type ) or return; - my $sudo = $conf->get_program('sudo'); - - ### just in case there's no file; M::B doesn't provide .packlists yet ### - my $pack = $self->packlist; - $pack = $pack->[0]->packlist_file() if $pack; - - ### first remove the files, then the dirs if they are empty ### - my $flag = 0; - for my $file( @$files, $pack ) { - next unless defined $file && -f $file; - - msg(loc("Unlinking '%1'", $file), $verbose); - - my @cmd = ($^X, "-eunlink+q[$file]"); - unshift @cmd, $sudo if $sudo; - - my $buffer; - unless ( run( command => \@cmd, - verbose => $verbose, - buffer => \$buffer ) - ) { - error(loc("Failed to unlink '%1': '%2'",$file, $buffer)); - $flag++; - } - } - - for my $dir ( sort @$dirs ) { - local *DIR; - opendir DIR, $dir or next; - my @count = readdir(DIR); - close DIR; - - next unless @count == 2; # . and .. - - msg(loc("Removing '%1'", $dir), $verbose); - - ### this fails on my win2k machines.. it indeed leaves the - ### dir, but it's not a critical error, since the files have - ### been removed. --kane - #unless( rmdir $dir ) { - # error( loc( "Could not remove '%1': %2", $dir, $! ) ) - # unless $^O eq 'MSWin32'; - #} - - my @cmd = ($^X, "-e", "rmdir q[$dir]"); - unshift @cmd, $sudo if $sudo; - - my $buffer; - unless ( run( command => \@cmd, - verbose => $verbose, - buffer => \$buffer ) - ) { - error(loc("Failed to rmdir '%1': %2",$dir,$buffer)); - $flag++; - } - } - - $self->status->uninstall(!$flag); - $self->status->installed( $flag ? 1 : undef); - - return !$flag; -} - -=pod - -=head2 @modobj = $self->distributions() - -Returns a list of module objects representing all releases for this -module on success, false on failure. - -=cut - -sub distributions { - my $self = shift; - my %hash = @_; - - my @list = $self->author->distributions( %hash, module => $self ) or return; - - ### it's another release then by the same author ### - return grep { $_->package_name eq $self->package_name } @list; -} - -=pod - -=head2 @list = $self->files () - -Returns a list of files used by this module, if it is installed. - -=head2 @list = $self->directory_tree () - -Returns a list of directories used by this module. - -=head2 @list = $self->packlist () - -Returns the C object for this module. - -=head2 @list = $self->validate () - -Returns a list of files that are missing for this modules, but -are present in the .packlist file. - -=cut - -for my $sub (qw[files directory_tree packlist validate]) { - no strict 'refs'; - *$sub = sub { - return shift->_extutils_installed( @_, method => $sub ); - } -} - -### generic method to call an ExtUtils::Installed method ### -sub _extutils_installed { - my $self = shift; - my $cb = $self->parent; - my $conf = $cb->configure_object; - my $home = $cb->_home_dir; # may be needed to fix up prefixes - my %hash = @_; - - my ($verbose,$type,$method); - my $tmpl = { - verbose => { default => $conf->get_conf('verbose'), - store => \$verbose, }, - type => { default => 'all', - allow => [qw|prog man all|], - store => \$type, }, - method => { required => 1, - store => \$method, - allow => [qw|files directory_tree packlist - validate|], - }, - }; - - my $args = check( $tmpl, \%hash ) or return; - - ### old versions of cygwin + perl < 5.8 are buggy here. bail out if we - ### find we're being used by them - { my $err = ON_OLD_CYGWIN; - if($err) { error($err); return }; - } - - return unless can_load( - modules => { 'ExtUtils::Installed' => '0.0' }, - verbose => $verbose, - ); - - my @config_names = ( - ### lib - { lib => 'privlib', # perl-only - arch => 'archlib', # compiled code - prefix => 'prefix', # prefix to both - }, - ### site - { lib => 'sitelib', - arch => 'sitearch', - prefix => 'siteprefix', - }, - ### vendor - { lib => 'vendorlib', - arch => 'vendorarch', - prefix => 'vendorprefix', - }, - ); - - ### search in your regular @INC, and anything you added to your config. - ### this lets EU::Installed find .packlists that are *not* in the standard - ### compiled in @INC path. Requires EU::I 1.42 or up. this addresses #33438 - ### make sure the archname path is also added, as that's where the .packlist - ### files are written - my @libs; - for my $lib ( @{ $conf->get_conf('lib') } ) { - require Config; - - ### and just the standard dir - push @libs, $lib; - - ### figure out what an MM prefix expands to. Basically, it's the - ### site install target from %Config, ie: /opt/lib/perl5/site_perl/5.8.8 - ### minus the site wide prefix, ie: /opt - ### this lets users add the dir they have set as their EU::MM PREFIX - ### to our 'lib' config and it Just Works - ### the arch specific dir, ie: - ### /opt/lib/perl5/site_perl/5.8.8/darwin-2level - ### XXX is this the right thing to do? - - ### we add all 6 dir combos for prefixes: - ### /foo/lib - ### /foo/lib/arch - ### /foo/site/lib - ### /foo/site/lib/arch - ### /foo/vendor/lib - ### /foo/vendor/lib/arch - for my $href ( @config_names ) { - for my $key ( qw[lib arch] ) { - - ### look up the config value -- use EXP for the EXPANDED - ### version, so no ~ etc are found in there - my $dir = $Config::Config{ $href->{ $key } .'exp' } or next; - my $prefix = $Config::Config{ $href->{prefix} }; - - ### prefix may be relative to home, and contain a ~ - ### if so, fix it up. - $prefix =~ s/^~/$home/; - - ### remove the prefix from it, so we can append to our $lib - $dir =~ s/^\Q$prefix\E//; - - ### do the appending - push @libs, File::Spec->catdir( $lib, $dir ); - - } - } - } - - my $inst; - unless( $inst = ExtUtils::Installed->new( extra_libs => \@libs ) ) { - error( loc("Could not create an '%1' object", 'ExtUtils::Installed' ) ); - - ### in case it's being used directly... ### - return; - } - - - { ### EU::Installed can die =/ - my @files; - eval { @files = $inst->$method( $self->module, $type ) }; - - if( $@ ) { - chomp $@; - error( loc("Could not get '%1' for '%2': %3", - $method, $self->module, $@ ) ); - return; - } - - return wantarray ? @files : \@files; - } -} - -=head2 $bool = $self->add_to_includepath; - -Adds the current modules path to C<@INC> and C<$PERL5LIB>. This allows -you to add the module from its build dir to your path. - -It also adds the current modules C and/or C