From 8977e561d8a9eae6959218b0306c9df2056a38a9 Mon Sep 17 00:00:00 2001 From: Nito Martinez Date: Sun, 11 Apr 2010 18:56:07 +0100 Subject: [PATCH] Add the original source packages to maemo, source lenny --- dev/i386/dh-make-perl/dh-make-perl-0.47/COPYING | 340 ++ dev/i386/dh-make-perl/dh-make-perl-0.47/README | 19 + .../dh-make-perl-0.47/Strange-0.1/Changes | 5 + .../dh-make-perl-0.47/Strange-0.1/MANIFEST | 5 + .../dh-make-perl-0.47/Strange-0.1/Makefile.PL | 7 + .../dh-make-perl-0.47/Strange-0.1/Strange.pm | 52 + .../dh-make-perl-0.47/Strange-0.1/test.pl | 20 + .../dh-make-perl-0.47/Strange-2.1/Changes | 5 + .../dh-make-perl-0.47/Strange-2.1/MANIFEST | 6 + .../dh-make-perl-0.47/Strange-2.1/Makefile.PL | 10 + .../dh-make-perl-0.47/Strange-2.1/README | 1 + .../dh-make-perl-0.47/Strange-2.1/Strange.pm | 78 + .../dh-make-perl-0.47/Strange-2.1/Strange.xs | 34 + .../dh-make-perl-0.47/Strange-2.1/test.pl | 20 + .../dh-make-perl-0.47/debian/changelog | 679 +++ .../dh-make-perl/dh-make-perl-0.47/debian/compat | 1 + .../dh-make-perl/dh-make-perl-0.47/debian/control | 28 + .../dh-make-perl-0.47/debian/copyright | 16 + .../dh-make-perl/dh-make-perl-0.47/debian/rules | 76 + .../dh-make-perl/dh-make-perl-0.47/dh-make-perl | 1557 ++++++ dev/i386/dh-make-perl/dh-make-perl-0.47/overrides | 39 + .../dh-make-perl-0.47/rules.MakeMaker.noxs | 64 + .../dh-make-perl-0.47/rules.MakeMaker.xs | 77 + .../dh-make-perl-0.47/rules.Module-Build.noxs | 64 + .../dh-make-perl-0.47/rules.Module-Build.xs | 74 + .../dh-make-perl/dh-make-perl-0.47/rules.dh7.noxs | 23 + .../dh-make-perl/dh-make-perl-0.47/rules.dh7.xs | 23 + dev/i386/dh-make-perl/dh-make-perl_0.47.dsc | 29 + dev/i386/dh-make-perl/dh-make-perl_0.47.tar.gz | Bin 0 -> 37455 bytes .../libarchive-zip-perl-1.18/Changes | 229 + .../libarchive-zip-perl-1.18/INSTALL | 43 + .../libarchive-zip-perl-1.18/LICENSE | 378 ++ .../libarchive-zip-perl-1.18/MANIFEST | 53 + .../libarchive-zip-perl-1.18/META.yml | 27 + .../libarchive-zip-perl-1.18/Makefile.PL | 45 + .../libarchive-zip-perl-1.18/README | 28 + .../libarchive-zip-perl-1.18/bin/crc32 | 28 + .../libarchive-zip-perl-1.18/debian/changelog | 90 + .../libarchive-zip-perl-1.18/debian/compat | 1 + .../libarchive-zip-perl-1.18/debian/control | 25 + .../libarchive-zip-perl-1.18/debian/copyright | 43 + .../libarchive-zip-perl-1.18/debian/crc32.1 | 22 + .../libarchive-zip-perl-1.18/debian/docs | 1 + .../libarchive-zip-perl-1.18/debian/examples | 1 + .../libarchive-zip-perl-1.18/debian/manpages | 1 + .../libarchive-zip-perl-1.18/debian/rules | 90 + .../libarchive-zip-perl-1.18/debian/watch | 2 + .../libarchive-zip-perl-1.18/docs/Archive-Zip.pdf | Bin 0 -> 2226 bytes .../libarchive-zip-perl-1.18/docs/ideas.txt | 150 + .../libarchive-zip-perl-1.18/examples/calcSizes.pl | 31 + .../libarchive-zip-perl-1.18/examples/copy.pl | 17 + .../libarchive-zip-perl-1.18/examples/extract.pl | 40 + .../libarchive-zip-perl-1.18/examples/mailZip.pl | 67 + .../libarchive-zip-perl-1.18/examples/mfh.pl | 29 + .../examples/readScalar.pl | 26 + .../libarchive-zip-perl-1.18/examples/selfex.pl | 68 + .../libarchive-zip-perl-1.18/examples/unzipAll.pl | 30 + .../examples/updateTree.pl | 35 + .../libarchive-zip-perl-1.18/examples/updateZip.pl | 42 + .../examples/writeScalar.pl | 22 + .../examples/writeScalar2.pl | 22 + .../libarchive-zip-perl-1.18/examples/zip.pl | 30 + .../libarchive-zip-perl-1.18/examples/zipGrep.pl | 57 + .../libarchive-zip-perl-1.18/examples/zipcheck.pl | 39 + .../libarchive-zip-perl-1.18/examples/zipinfo.pl | 147 + .../libarchive-zip-perl-1.18/examples/ziprecent.pl | 329 ++ .../libarchive-zip-perl-1.18/examples/ziptest.pl | 82 + .../libarchive-zip-perl-1.18/lib/Archive/Zip.pm | 2042 +++++++ .../lib/Archive/Zip/Archive.pm | 786 +++ .../lib/Archive/Zip/BufferedFileHandle.pm | 131 + .../lib/Archive/Zip/DirectoryMember.pm | 82 + .../lib/Archive/Zip/FAQ.pod | 467 ++ .../lib/Archive/Zip/FileMember.pm | 64 + .../lib/Archive/Zip/Member.pm | 950 ++++ .../lib/Archive/Zip/MemberRead.pm | 280 + .../lib/Archive/Zip/MockFileHandle.pm | 69 + .../lib/Archive/Zip/NewFileMember.pm | 79 + .../lib/Archive/Zip/StringMember.pm | 64 + .../lib/Archive/Zip/Tree.pm | 40 + .../lib/Archive/Zip/ZipFileMember.pm | 413 ++ .../libarchive-zip-perl-1.18/t/01_compile.t | 6 + .../libarchive-zip-perl-1.18/t/02_main.t | 581 ++ .../libarchive-zip-perl-1.18/t/03_ex.t | 83 + .../libarchive-zip-perl-1.18/t/04_readmember.t | 51 + .../libarchive-zip-perl-1.18/t/05_tree.t | 41 + .../libarchive-zip-perl-1.18/t/06_update.t | 60 + .../libarchive-zip-perl-1.18/t/99_author.t | 61 + .../t/badjpeg/expected.jpg | Bin 0 -> 56897 bytes .../libarchive-zip-perl-1.18/t/badjpeg/source.zip | Bin 0 -> 52476 bytes .../libarchive-zip-perl-1.18/t/common.pl | 107 + .../libarray-compare-perl-1.16/Build.PL | 18 + .../libarray-compare-perl-1.16/Changes | 68 + .../libarray-compare-perl-1.16/MANIFEST | 10 + .../libarray-compare-perl-1.16/META.yml | 20 + .../libarray-compare-perl-1.16/Makefile.PL | 15 + .../libarray-compare-perl-1.16/README | 72 + .../libarray-compare-perl-1.16/debian/changelog | 87 + .../libarray-compare-perl-1.16/debian/compat | 1 + .../libarray-compare-perl-1.16/debian/control | 21 + .../libarray-compare-perl-1.16/debian/copyright | 16 + .../libarray-compare-perl-1.16/debian/rules | 56 + .../libarray-compare-perl-1.16/debian/watch | 2 + .../lib/Array/Compare.pm | 505 ++ .../libarray-compare-perl-1.16/t/pod.t | 4 + .../libarray-compare-perl-1.16/t/pod_coverage.t | 4 + .../libarray-compare-perl-1.16/t/test.t | 136 + .../Build.PL | 15 + .../Changes | 2 + .../MANIFEST | 10 + .../META.yml | 18 + .../Makefile.PL | 14 + .../README | 57 + .../debian/changelog | 22 + .../debian/compat | 1 + .../debian/control | 20 + .../debian/copyright | 21 + .../debian/rules | 90 + .../debian/watch | 2 + .../lib/Class/Accessor/Chained.pm | 82 + .../lib/Class/Accessor/Chained/Fast.pm | 70 + .../t/00compile.t | 5 + .../t/chained.t | 24 + .../libclass-accessor-perl-0.31/Changes | 80 + .../libclass-accessor-perl-0.31/INSTALL | 15 + .../libclass-accessor-perl-0.31/MANIFEST | 15 + .../libclass-accessor-perl-0.31/META.yml | 11 + .../libclass-accessor-perl-0.31/Makefile.PL | 10 + .../libclass-accessor-perl-0.31/README | 78 + .../libclass-accessor-perl-0.31/debian/changelog | 81 + .../libclass-accessor-perl-0.31/debian/compat | 1 + .../libclass-accessor-perl-0.31/debian/control | 23 + .../libclass-accessor-perl-0.31/debian/copyright | 22 + .../debian/patches/manpage_typo.diff | 55 + .../debian/patches/series | 1 + .../libclass-accessor-perl-0.31/debian/rules | 76 + .../libclass-accessor-perl-0.31/debian/watch | 6 + .../libclass-accessor-perl-0.31/examples/benchmark | 73 + .../lib/Class/Accessor.pm | 675 +++ .../lib/Class/Accessor/Fast.pm | 94 + .../lib/Class/Accessor/Faster.pm | 105 + .../libclass-accessor-perl-0.31/t/accessors.t | 74 + .../libclass-accessor-perl-0.31/t/aliases.t | 39 + .../libclass-accessor-perl-0.31/t/bestpractice.t | 38 + .../libclass-accessor-perl-0.31/t/croak.t | 24 + .../libclass-accessor-perl-0.31/t/getset.t | 14 + .../libcompress-raw-zlib-perl-2.012/Changes | 132 + .../libcompress-raw-zlib-perl-2.012/MANIFEST | 47 + .../libcompress-raw-zlib-perl-2.012/META.yml | 13 + .../libcompress-raw-zlib-perl-2.012/Makefile.PL | 399 ++ .../libcompress-raw-zlib-perl-2.012/README | 348 ++ .../libcompress-raw-zlib-perl-2.012/Zlib.xs | 1898 +++++++ .../libcompress-raw-zlib-perl-2.012/config.in | 27 + .../debian/README.source | 4 + .../debian/changelog | 99 + .../libcompress-raw-zlib-perl-2.012/debian/compat | 1 + .../libcompress-raw-zlib-perl-2.012/debian/control | 19 + .../debian/copyright | 66 + .../debian/libcompress-raw-zlib-perl.examples | 1 + .../debian/patches/CVE-2009-1391 | 18 + .../debian/patches/series | 2 + .../debian/patches/use-debian-zlib.patch | 15 + .../libcompress-raw-zlib-perl-2.012/debian/rules | 25 + .../libcompress-raw-zlib-perl-2.012/debian/watch | 2 + .../examples/filtdef | 27 + .../examples/filtinf | 30 + .../fallback/constants.h | 529 ++ .../fallback/constants.xs | 87 + .../lib/Compress/Raw/Zlib.pm | 1202 ++++ .../libcompress-raw-zlib-perl-2.012/pod/FAQ.pod | 142 + .../libcompress-raw-zlib-perl-2.012/ppport.h | 5820 ++++++++++++++++++++ .../private/MakeUtil.pm | 304 + .../libcompress-raw-zlib-perl-2.012/t/000prereq.t | 57 + .../libcompress-raw-zlib-perl-2.012/t/01version.t | 42 + .../libcompress-raw-zlib-perl-2.012/t/02zlib.t | 962 ++++ .../libcompress-raw-zlib-perl-2.012/t/07bufsize.t | 107 + .../libcompress-raw-zlib-perl-2.012/t/18lvalue.t | 74 + .../libcompress-raw-zlib-perl-2.012/t/99pod.t | 16 + .../t/Test/Builder.pm | 1625 ++++++ .../libcompress-raw-zlib-perl-2.012/t/Test/More.pm | 1493 +++++ .../t/Test/Simple.pm | 236 + .../t/compress/CompTestUtils.pm | 669 +++ .../libcompress-raw-zlib-perl-2.012/typemap | 61 + .../zlib-src/adler32.c | 149 + .../zlib-src/compress.c | 79 + .../zlib-src/crc32.c | 423 ++ .../zlib-src/crc32.h | 441 ++ .../zlib-src/deflate.c | 1736 ++++++ .../zlib-src/deflate.h | 331 ++ .../zlib-src/infback.c | 623 +++ .../zlib-src/inffast.c | 318 ++ .../zlib-src/inffast.h | 11 + .../zlib-src/inffixed.h | 94 + .../zlib-src/inflate.c | 1368 +++++ .../zlib-src/inflate.h | 115 + .../zlib-src/inftrees.c | 329 ++ .../zlib-src/inftrees.h | 55 + .../zlib-src/trees.c | 1233 +++++ .../zlib-src/trees.h | 128 + .../zlib-src/uncompr.c | 61 + .../zlib-src/zconf.h | 329 ++ .../zlib-src/zlib.h | 1357 +++++ .../zlib-src/zutil.c | 318 ++ .../zlib-src/zutil.h | 269 + ...compress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz | Bin 3727 -> 0 bytes .../libcompress-raw-zlib-perl_2.011-2ubuntu0.1.dsc | 33 - .../libcompress-raw-zlib-perl_2.011.orig.tar.gz | Bin 207842 -> 0 bytes ...libcompress-raw-zlib-perl_2.012-1lenny1.diff.gz | Bin 0 -> 3689 bytes .../libcompress-raw-zlib-perl_2.012-1lenny1.dsc | 32 + .../libcompress-raw-zlib-perl_2.012.orig.tar.gz | Bin 0 -> 208481 bytes .../libdevel-symdump-perl-2.08/ChangeLog | 192 + .../libdevel-symdump-perl-2.08/ChangeLog.svn | 222 + .../libdevel-symdump-perl-2.08/MANIFEST | 17 + .../libdevel-symdump-perl-2.08/META.yml | 12 + .../libdevel-symdump-perl-2.08/Makefile.PL | 169 + .../libdevel-symdump-perl-2.08/README | 140 + .../libdevel-symdump-perl-2.08/SIGNATURE | 39 + .../libdevel-symdump-perl-2.08/debian/changelog | 97 + .../libdevel-symdump-perl-2.08/debian/compat | 1 + .../libdevel-symdump-perl-2.08/debian/control | 15 + .../libdevel-symdump-perl-2.08/debian/copyright | 35 + .../libdevel-symdump-perl-2.08/debian/docs | 1 + .../libdevel-symdump-perl-2.08/debian/rules | 69 + .../libdevel-symdump-perl-2.08/debian/substvars | 1 + .../libdevel-symdump-perl-2.08/debian/watch | 2 + .../lib/Devel/Symdump.pm | 468 ++ .../lib/Devel/Symdump/Export.pm | 39 + .../libdevel-symdump-perl-2.08/t/autogen.t | 23 + .../libdevel-symdump-perl-2.08/t/diff.t | 72 + .../libdevel-symdump-perl-2.08/t/export.t | 16 + .../libdevel-symdump-perl-2.08/t/pod.t | 6 + .../libdevel-symdump-perl-2.08/t/podcover.t | 5 + .../libdevel-symdump-perl-2.08/t/recur.t | 32 + .../libdevel-symdump-perl-2.08/t/symdump.t | 221 + .../libdevel-symdump-perl-2.08/t/tree.t | 28 + .../libemail-date-format-perl-1.002/Changes | 10 + .../libemail-date-format-perl-1.002/LICENSE | 378 ++ .../libemail-date-format-perl-1.002/MANIFEST | 10 + .../libemail-date-format-perl-1.002/META.yml | 15 + .../libemail-date-format-perl-1.002/Makefile.PL | 14 + .../libemail-date-format-perl-1.002/README | 3 + .../debian/changelog | 5 + .../libemail-date-format-perl-1.002/debian/compat | 1 + .../libemail-date-format-perl-1.002/debian/control | 19 + .../debian/copyright | 17 + .../libemail-date-format-perl-1.002/debian/rules | 81 + .../libemail-date-format-perl-1.002/debian/watch | 3 + .../lib/Email/Date/Format.pm | 128 + .../libemail-date-format-perl-1.002/t/basic.t | 31 + .../t/pod-coverage.t | 10 + .../libemail-date-format-perl-1.002/t/pod.t | 6 + .../libextutils-cbuilder-perl-0.23/Build.PL | 34 + .../libextutils-cbuilder-perl-0.23/Changes | 225 + .../libextutils-cbuilder-perl-0.23/INSTALL | 21 + .../libextutils-cbuilder-perl-0.23/MANIFEST | 21 + .../libextutils-cbuilder-perl-0.23/META.yml | 59 + .../libextutils-cbuilder-perl-0.23/Makefile.PL | 19 + .../libextutils-cbuilder-perl-0.23/README | 188 + .../libextutils-cbuilder-perl-0.23/SIGNATURE | 43 + .../libextutils-cbuilder-perl-0.23/bleadcheck.pl | 30 + .../debian/README.source | 4 + .../debian/changelog | 52 + .../libextutils-cbuilder-perl-0.23/debian/compat | 1 + .../libextutils-cbuilder-perl-0.23/debian/control | 24 + .../debian/copyright | 24 + .../debian/patches/10_fix-gnukfreebsd-hurd.patch | 15 + .../debian/patches/series | 1 + .../libextutils-cbuilder-perl-0.23/debian/rules | 12 + .../libextutils-cbuilder-perl-0.23/debian/watch | 2 + .../lib/ExtUtils/CBuilder.pm | 318 ++ .../lib/ExtUtils/CBuilder/Base.pm | 278 + .../lib/ExtUtils/CBuilder/Platform/Unix.pm | 37 + .../lib/ExtUtils/CBuilder/Platform/VMS.pm | 102 + .../lib/ExtUtils/CBuilder/Platform/Windows.pm | 684 +++ .../lib/ExtUtils/CBuilder/Platform/aix.pm | 31 + .../lib/ExtUtils/CBuilder/Platform/cygwin.pm | 30 + .../lib/ExtUtils/CBuilder/Platform/darwin.pm | 22 + .../lib/ExtUtils/CBuilder/Platform/dec_osf.pm | 18 + .../lib/ExtUtils/CBuilder/Platform/os2.pm | 80 + .../libextutils-cbuilder-perl-0.23/t/01-basic.t | 68 + .../libextutils-cbuilder-perl-0.23/t/02-link.t | 77 + .../libextutils-parsexs-perl-2.19/Build.PL | 24 + .../libextutils-parsexs-perl-2.19/Changes | 191 + .../libextutils-parsexs-perl-2.19/INSTALL | 14 + .../libextutils-parsexs-perl-2.19/MANIFEST | 12 + .../libextutils-parsexs-perl-2.19/META.yml | 25 + .../libextutils-parsexs-perl-2.19/Makefile.PL | 19 + .../libextutils-parsexs-perl-2.19/README | 108 + .../libextutils-parsexs-perl-2.19/debian/changelog | 103 + .../libextutils-parsexs-perl-2.19/debian/compat | 1 + .../libextutils-parsexs-perl-2.19/debian/control | 25 + .../libextutils-parsexs-perl-2.19/debian/copyright | 26 + .../libextutils-parsexs-perl-2.19/debian/rules | 60 + .../libextutils-parsexs-perl-2.19/debian/watch | 2 + .../lib/ExtUtils/ParseXS.pm | 2046 +++++++ .../lib/ExtUtils/xsubpp | 156 + .../libextutils-parsexs-perl-2.19/t/XSTest.pm | 8 + .../libextutils-parsexs-perl-2.19/t/XSTest.xs | 67 + .../libextutils-parsexs-perl-2.19/t/basic.t | 79 + .../libfile-chdir-perl-0.06/Changes | 27 + .../libfile-chdir-perl-0.06/MANIFEST | 11 + .../libfile-chdir-perl-0.06/META.yml | 12 + .../libfile-chdir-perl-0.06/Makefile.PL | 73 + .../libfile-chdir-perl-0.06/debian/changelog | 20 + .../libfile-chdir-perl-0.06/debian/compat | 1 + .../libfile-chdir-perl-0.06/debian/control | 21 + .../libfile-chdir-perl-0.06/debian/copyright | 25 + .../libfile-chdir-perl-0.06/debian/rules | 90 + .../libfile-chdir-perl-0.06/debian/watch | 2 + .../libfile-chdir-perl-0.06/lib/File/chdir.pm | 352 ++ .../libfile-chdir-perl-0.06/t/array.t | 101 + .../libfile-chdir-perl-0.06/t/chdir.t | 46 + .../libfile-chdir-perl-0.06/t/lib/Test/Builder.pm | 978 ++++ .../libfile-chdir-perl-0.06/t/lib/Test/More.pm | 1023 ++++ .../libfile-chdir-perl-0.06/t/lib/Test/Simple.pm | 234 + .../libfile-chdir-perl-0.06/t/var.t | 44 + .../libfile-which-perl-0.05/Changes | 44 + .../libfile-which-perl-0.05/MANIFEST | 17 + .../libfile-which-perl-0.05/Makefile.PL | 13 + .../libfile-which-perl-0.05/README | 56 + .../libfile-which-perl-0.05/Which.pm | 225 + .../libfile-which-perl-0.05/bin/pwhich | 101 + .../libfile-which-perl-0.05/debian/changelog | 51 + .../libfile-which-perl-0.05/debian/compat | 1 + .../libfile-which-perl-0.05/debian/control | 18 + .../libfile-which-perl-0.05/debian/copyright | 25 + .../debian/libfile-which-perl.docs | 1 + .../debian/libfile-which-perl.examples | 1 + .../debian/libfile-which-perl.install | 1 + .../libfile-which-perl-0.05/debian/rules | 62 + .../libfile-which-perl-0.05/debian/watch | 4 + .../libfile-which-perl-0.05/t/all.t | 28 + .../libfile-which-perl-0.05/t/load.t | 7 + .../libfile-which-perl-0.05/t/simple.t | 66 + .../libfile-which-perl-0.05/t/test-bin/README.txt | 5 + .../libfile-which-perl-0.05/t/test-bin/all | 2 + .../libfile-which-perl-0.05/t/test-bin/test1.exe | 2 + .../libfile-which-perl-0.05/t/test-bin/test2.bat | 3 + .../libfile-which-perl-0.05/t/test-bin/test3 | 5 + .../t/test-bin/test4/foo.txt | 1 + .../libhtml-parser-perl-3.56/Changes | 1468 +++++ .../libhtml-parser-perl-3.56/MANIFEST | 78 + .../libhtml-parser-perl-3.56/Makefile.PL | 30 + .../libhtml-parser-perl-3.56/Parser.pm | 1234 +++++ .../libhtml-parser-perl-3.56/Parser.xs | 672 +++ .../libhtml-parser-perl-3.56/README | 65 + .../libhtml-parser-perl-3.56/TODO | 31 + .../libhtml-parser-perl-3.56/debian/changelog | 440 ++ .../libhtml-parser-perl-3.56/debian/compat | 1 + .../libhtml-parser-perl-3.56/debian/control | 18 + .../libhtml-parser-perl-3.56/debian/copyright | 26 + .../libhtml-parser-perl-3.56/debian/rules | 53 + .../libhtml-parser-perl-3.56/debian/watch | 2 + .../libhtml-parser-perl-3.56/eg/hanchors | 46 + .../libhtml-parser-perl-3.56/eg/hdump | 23 + .../libhtml-parser-perl-3.56/eg/hform | 83 + .../libhtml-parser-perl-3.56/eg/hlc | 20 + .../libhtml-parser-perl-3.56/eg/hrefsub | 93 + .../libhtml-parser-perl-3.56/eg/hstrip | 65 + .../libhtml-parser-perl-3.56/eg/htext | 29 + .../libhtml-parser-perl-3.56/eg/htextsub | 26 + .../libhtml-parser-perl-3.56/eg/htitle | 21 + .../libhtml-parser-perl-3.56/hints/solaris.pl | 4 + .../libhtml-parser-perl-3.56/hparser.c | 1916 +++++++ .../libhtml-parser-perl-3.56/hparser.h | 132 + .../libhtml-parser-perl-3.56/lib/HTML/Entities.pm | 491 ++ .../libhtml-parser-perl-3.56/lib/HTML/Filter.pm | 112 + .../lib/HTML/HeadParser.pm | 259 + .../libhtml-parser-perl-3.56/lib/HTML/LinkExtor.pm | 187 + .../lib/HTML/PullParser.pm | 211 + .../lib/HTML/TokeParser.pm | 371 ++ .../libhtml-parser-perl-3.56/mkhctype | 57 + .../libhtml-parser-perl-3.56/mkpfunc | 28 + .../libhtml-parser-perl-3.56/t/api_version.t | 22 + .../libhtml-parser-perl-3.56/t/argspec-bad.t | 40 + .../libhtml-parser-perl-3.56/t/argspec.t | 148 + .../libhtml-parser-perl-3.56/t/argspec2.t | 21 + .../libhtml-parser-perl-3.56/t/attr-encoded.t | 32 + .../libhtml-parser-perl-3.56/t/callback.t | 49 + .../libhtml-parser-perl-3.56/t/case-sensitive.t | 85 + .../libhtml-parser-perl-3.56/t/cases.t | 105 + .../libhtml-parser-perl-3.56/t/comment.t | 24 + .../libhtml-parser-perl-3.56/t/crashme.t | 43 + .../libhtml-parser-perl-3.56/t/declaration.t | 62 + .../libhtml-parser-perl-3.56/t/default.t | 43 + .../libhtml-parser-perl-3.56/t/document.t | 41 + .../libhtml-parser-perl-3.56/t/dtext.t | 72 + .../libhtml-parser-perl-3.56/t/entities.t | 195 + .../libhtml-parser-perl-3.56/t/entities2.t | 57 + .../libhtml-parser-perl-3.56/t/filter-methods.t | 205 + .../libhtml-parser-perl-3.56/t/filter.t | 60 + .../libhtml-parser-perl-3.56/t/handler-eof.t | 54 + .../libhtml-parser-perl-3.56/t/handler.t | 67 + .../libhtml-parser-perl-3.56/t/headparser-http.t | 20 + .../libhtml-parser-perl-3.56/t/headparser.t | 154 + .../libhtml-parser-perl-3.56/t/ignore.t | 27 + .../libhtml-parser-perl-3.56/t/largetags.t | 38 + .../libhtml-parser-perl-3.56/t/linkextor-base.t | 41 + .../libhtml-parser-perl-3.56/t/linkextor-rel.t | 36 + .../libhtml-parser-perl-3.56/t/magic.t | 41 + .../libhtml-parser-perl-3.56/t/marked-sect.t | 121 + .../libhtml-parser-perl-3.56/t/msie-compat.t | 58 + .../libhtml-parser-perl-3.56/t/offset.t | 58 + .../libhtml-parser-perl-3.56/t/options.t | 36 + .../libhtml-parser-perl-3.56/t/parsefile.t | 45 + .../libhtml-parser-perl-3.56/t/parser.t | 184 + .../libhtml-parser-perl-3.56/t/plaintext.t | 45 + .../libhtml-parser-perl-3.56/t/pod.t | 4 + .../libhtml-parser-perl-3.56/t/process.t | 43 + .../libhtml-parser-perl-3.56/t/pullparser.t | 55 + .../libhtml-parser-perl-3.56/t/script.t | 41 + .../libhtml-parser-perl-3.56/t/skipped-text.t | 74 + .../libhtml-parser-perl-3.56/t/stack-realloc.t | 17 + .../libhtml-parser-perl-3.56/t/textarea.t | 70 + .../libhtml-parser-perl-3.56/t/threads.t | 39 + .../libhtml-parser-perl-3.56/t/tokeparser.t | 164 + .../libhtml-parser-perl-3.56/t/uentities.t | 67 + .../libhtml-parser-perl-3.56/t/unbroken-text.t | 60 + .../libhtml-parser-perl-3.56/t/unicode-bom.t | 59 + .../libhtml-parser-perl-3.56/t/unicode.t | 183 + .../libhtml-parser-perl-3.56/t/xml-mode.t | 112 + .../libhtml-parser-perl-3.56/tokenpos.h | 49 + .../libhtml-parser-perl-3.56/typemap | 5 + .../libhtml-parser-perl-3.56/util.c | 312 ++ .../libhtml-parser-perl_3.56-1+lenny1.diff.gz | Bin 0 -> 6147 bytes .../libhtml-parser-perl_3.56-1+lenny1.dsc | 29 + .../libhtml-parser-perl_3.56-1ubuntu2.1.diff.gz | Bin 6447 -> 0 bytes .../libhtml-parser-perl_3.56-1ubuntu2.1.dsc | 30 - .../libhtml-tagset-perl-3.20/Changes | 32 + .../libhtml-tagset-perl-3.20/MANIFEST | 10 + .../libhtml-tagset-perl-3.20/MANIFEST.SKIP | 7 + .../libhtml-tagset-perl-3.20/META.yml | 13 + .../libhtml-tagset-perl-3.20/Makefile.PL | 19 + .../libhtml-tagset-perl-3.20/README | 66 + .../libhtml-tagset-perl-3.20/Tagset.pm | 471 ++ .../libhtml-tagset-perl-3.20/debian/changelog | 90 + .../libhtml-tagset-perl-3.20/debian/compat | 1 + .../libhtml-tagset-perl-3.20/debian/control | 22 + .../libhtml-tagset-perl-3.20/debian/copyright | 26 + .../debian/patches/isbodyelement.patch | 11 + .../libhtml-tagset-perl-3.20/debian/patches/series | 1 + .../libhtml-tagset-perl-3.20/debian/rules | 62 + .../libhtml-tagset-perl-3.20/debian/watch | 2 + .../libhtml-tagset-perl-3.20/t/00_about_verbose.t | 85 + .../libhtml-tagset-perl-3.20/t/01_old_junk.t | 8 + .../libhtml-tagset-perl-3.20/t/pod.t | 6 + .../libhtml-tree-perl-3.23/Changes | 683 +++ .../libhtml-tree-perl-3.23/MANIFEST | 34 + .../libhtml-tree-perl-3.23/META.yml | 12 + .../libhtml-tree-perl-3.23/Makefile.PL | 16 + .../libhtml-tree-perl-3.23/README | 97 + .../libhtml-tree-perl/libhtml-tree-perl-3.23/TODO | 31 + .../libhtml-tree-perl-3.23/debian/changelog | 182 + .../libhtml-tree-perl-3.23/debian/compat | 1 + .../libhtml-tree-perl-3.23/debian/control | 19 + .../libhtml-tree-perl-3.23/debian/copyright | 36 + .../debian/libhtml-tree-perl.examples | 1 + .../libhtml-tree-perl-3.23/debian/rules | 50 + .../libhtml-tree-perl-3.23/debian/watch | 2 + .../libhtml-tree-perl-3.23/htmltree | 50 + .../libhtml-tree-perl-3.23/lib/HTML/AsSubs.pm | 136 + .../libhtml-tree-perl-3.23/lib/HTML/Element.pm | 3848 +++++++++++++ .../lib/HTML/Element/traverse.pm | 329 ++ .../libhtml-tree-perl-3.23/lib/HTML/Parse.pm | 155 + .../libhtml-tree-perl-3.23/lib/HTML/Tree.pm | 182 + .../lib/HTML/Tree/AboutObjects.pod | 686 +++ .../lib/HTML/Tree/AboutTrees.pod | 1369 +++++ .../lib/HTML/Tree/Scanning.pod | 709 +++ .../libhtml-tree-perl-3.23/lib/HTML/TreeBuilder.pm | 1869 +++++++ .../libhtml-tree-perl-3.23/t/00system.t | 28 + .../libhtml-tree-perl-3.23/t/assubs.t | 46 + .../libhtml-tree-perl-3.23/t/attributes.t | 28 + .../libhtml-tree-perl-3.23/t/body.t | 82 + .../libhtml-tree-perl-3.23/t/building.t | 125 + .../libhtml-tree-perl-3.23/t/children.t | 25 + .../libhtml-tree-perl-3.23/t/clonei.t | 19 + .../libhtml-tree-perl-3.23/t/construct_tree.t | 128 + .../libhtml-tree-perl-3.23/t/doctype.t | 48 + .../libhtml-tree-perl-3.23/t/escape.t | 57 + .../libhtml-tree-perl-3.23/t/oldparse.html | 37 + .../libhtml-tree-perl-3.23/t/oldparse.t | 62 + .../libhtml-tree-perl-3.23/t/parse.t | 167 + .../libhtml-tree-perl-3.23/t/parsefile.t | 63 + .../libhtml-tree-perl-3.23/t/pod.t | 6 + .../libhtml-tree-perl-3.23/t/split.t | 90 + .../libhtml-tree-perl-3.23/t/tag-rendering.t | 40 + .../libhtml-tree-perl-3.23/t/unicode.t | 115 + .../libio-compress-base-perl-2.012/Changes | 180 + .../libio-compress-base-perl-2.012/MANIFEST | 32 + .../libio-compress-base-perl-2.012/META.yml | 14 + .../libio-compress-base-perl-2.012/Makefile.PL | 53 + .../libio-compress-base-perl-2.012/README | 90 + .../debian/changelog | 77 + .../libio-compress-base-perl-2.012/debian/compat | 1 + .../libio-compress-base-perl-2.012/debian/control | 20 + .../debian/copyright | 39 + .../libio-compress-base-perl-2.012/debian/rules | 44 + .../libio-compress-base-perl-2.012/debian/watch | 2 + .../lib/File/GlobMapper.pm | 679 +++ .../lib/IO/Compress/Base.pm | 979 ++++ .../lib/IO/Compress/Base/Common.pm | 914 +++ .../lib/IO/Uncompress/AnyUncompress.pm | 922 ++++ .../lib/IO/Uncompress/Base.pm | 1455 +++++ .../libio-compress-base-perl-2.012/pod/FAQ.pod | 346 ++ .../private/MakeUtil.pm | 304 + .../libio-compress-base-perl-2.012/t/000prereq.t | 54 + .../libio-compress-base-perl-2.012/t/01misc.t | 258 + .../libio-compress-base-perl-2.012/t/99pod.t | 16 + .../t/Test/Builder.pm | 1625 ++++++ .../libio-compress-base-perl-2.012/t/Test/More.pm | 1493 +++++ .../t/Test/Simple.pm | 236 + .../t/compress/CompTestUtils.pm | 669 +++ .../t/compress/any.pl | 98 + .../t/compress/anyunc.pl | 93 + .../t/compress/destroy.pl | 115 + .../t/compress/generic.pl | 1603 ++++++ .../t/compress/merge.pl | 330 ++ .../t/compress/multi.pl | 217 + .../t/compress/newtied.pl | 374 ++ .../t/compress/oneshot.pl | 1560 ++++++ .../t/compress/prime.pl | 90 + .../t/compress/tied.pl | 492 ++ .../t/compress/truncate.pl | 169 + .../t/compress/zlib-generic.pl | 233 + .../libio-compress-base-perl-2.012/t/globmapper.t | 304 + .../libio-compress-base-perl_2.011-1.diff.gz | Bin 2686 -> 0 bytes .../libio-compress-base-perl_2.011-1.dsc | 33 - .../libio-compress-base-perl_2.011.orig.tar.gz | Bin 94578 -> 0 bytes .../libio-compress-base-perl_2.012-1.diff.gz | Bin 0 -> 2631 bytes .../libio-compress-base-perl_2.012-1.dsc | 33 + .../libio-compress-base-perl_2.012.orig.tar.gz | Bin 0 -> 95022 bytes .../libio-compress-zlib-perl-2.012/Changes | 184 + .../libio-compress-zlib-perl-2.012/MANIFEST | 111 + .../libio-compress-zlib-perl-2.012/META.yml | 16 + .../libio-compress-zlib-perl-2.012/Makefile.PL | 67 + .../libio-compress-zlib-perl-2.012/README | 107 + .../debian/changelog | 89 + .../libio-compress-zlib-perl-2.012/debian/compat | 1 + .../libio-compress-zlib-perl-2.012/debian/control | 28 + .../debian/copyright | 39 + .../debian/lintian-overrides | 1 + .../libio-compress-zlib-perl-2.012/debian/rules | 66 + .../libio-compress-zlib-perl-2.012/debian/watch | 2 + .../libio-compress-zlib-perl-2.012/examples/anycat | 17 + .../examples/gzappend | 24 + .../libio-compress-zlib-perl-2.012/examples/gzcat | 29 + .../libio-compress-zlib-perl-2.012/examples/gzgrep | 40 + .../examples/gzstream | 24 + .../lib/IO/Compress/Adapter/Deflate.pm | 165 + .../lib/IO/Compress/Adapter/Identity.pm | 101 + .../lib/IO/Compress/Deflate.pm | 889 +++ .../lib/IO/Compress/Gzip.pm | 1201 ++++ .../lib/IO/Compress/Gzip/Constants.pm | 148 + .../lib/IO/Compress/RawDeflate.pm | 976 ++++ .../lib/IO/Compress/Zip.pm | 1512 +++++ .../lib/IO/Compress/Zip/Constants.pm | 102 + .../lib/IO/Compress/Zlib/Constants.pm | 77 + .../lib/IO/Compress/Zlib/Extra.pm | 198 + .../lib/IO/Uncompress/Adapter/Identity.pm | 102 + .../lib/IO/Uncompress/Adapter/Inflate.pm | 161 + .../lib/IO/Uncompress/AnyInflate.pm | 946 ++++ .../lib/IO/Uncompress/Gunzip.pm | 1070 ++++ .../lib/IO/Uncompress/Inflate.pm | 941 ++++ .../lib/IO/Uncompress/RawInflate.pm | 1052 ++++ .../lib/IO/Uncompress/Unzip.pm | 1485 +++++ .../libio-compress-zlib-perl-2.012/pod/FAQ.pod | 506 ++ .../private/MakeUtil.pm | 304 + .../libio-compress-zlib-perl-2.012/t/000prereq.t | 59 + .../t/001zlib-generic-deflate.t | 20 + .../t/001zlib-generic-gzip.t | 20 + .../t/001zlib-generic-rawdeflate.t | 20 + .../t/001zlib-generic-zip.t | 20 + .../t/002any-deflate.t | 29 + .../libio-compress-zlib-perl-2.012/t/002any-gzip.t | 29 + .../t/002any-rawdeflate.t | 28 + .../t/002any-transparent.t | 72 + .../libio-compress-zlib-perl-2.012/t/002any-zip.t | 29 + .../libio-compress-zlib-perl-2.012/t/004gziphdr.t | 962 ++++ .../libio-compress-zlib-perl-2.012/t/005defhdr.t | 349 ++ .../libio-compress-zlib-perl-2.012/t/006zip.t | 276 + .../libio-compress-zlib-perl-2.012/t/010examples.t | 145 + .../libio-compress-zlib-perl-2.012/t/020isize.t | 158 + .../t/050interop-gzip.t | 143 + .../t/100generic-deflate.t | 22 + .../t/100generic-gzip.t | 21 + .../t/100generic-rawdeflate.t | 21 + .../t/100generic-zip.t | 21 + .../t/101truncate-deflate.t | 37 + .../t/101truncate-gzip.t | 36 + .../t/101truncate-rawdeflate.t | 130 + .../t/101truncate-zip.t | 38 + .../t/102tied-deflate.t | 21 + .../t/102tied-gzip.t | 21 + .../t/102tied-rawdeflate.t | 21 + .../libio-compress-zlib-perl-2.012/t/102tied-zip.t | 21 + .../t/103newtied-deflate.t | 21 + .../t/103newtied-gzip.t | 21 + .../t/103newtied-rawdeflate.t | 21 + .../t/103newtied-zip.t | 21 + .../t/104destroy-deflate.t | 21 + .../t/104destroy-gzip.t | 21 + .../t/104destroy-rawdeflate.t | 21 + .../t/104destroy-zip.t | 21 + .../t/105oneshot-deflate.t | 21 + .../t/105oneshot-gzip-only.t | 134 + .../t/105oneshot-gzip.t | 21 + .../t/105oneshot-rawdeflate.t | 21 + .../t/105oneshot-zip-bzip2-only.t | 168 + .../t/105oneshot-zip-only.t | 237 + .../t/105oneshot-zip.t | 21 + .../t/106prime-deflate.t | 21 + .../t/106prime-gzip.t | 21 + .../t/106prime-rawdeflate.t | 21 + .../t/106prime-zip.t | 21 + .../t/107multi-deflate.t | 21 + .../t/107multi-gzip.t | 21 + .../t/107multi-rawdeflate.t | 21 + .../t/107multi-zip.t | 21 + .../t/108anyunc-deflate.t | 29 + .../t/108anyunc-gzip.t | 29 + .../t/108anyunc-rawdeflate.t | 29 + .../t/108anyunc-transparent.t | 72 + .../t/108anyunc-zip.t | 29 + .../t/109merge-deflate.t | 21 + .../t/109merge-gzip.t | 21 + .../t/109merge-rawdeflate.t | 21 + .../t/109merge-zip.t | 24 + .../t/110encode-deflate.t | 21 + .../t/110encode-gzip.t | 21 + .../t/110encode-rawdeflate.t | 21 + .../t/110encode-zip.t | 21 + .../libio-compress-zlib-perl-2.012/t/999pod.t | 16 + .../t/Test/Builder.pm | 1625 ++++++ .../libio-compress-zlib-perl-2.012/t/Test/More.pm | 1493 +++++ .../t/Test/Simple.pm | 236 + .../t/compress/CompTestUtils.pm | 669 +++ .../t/compress/any.pl | 98 + .../t/compress/anyunc.pl | 93 + .../t/compress/destroy.pl | 115 + .../t/compress/encode.pl | 123 + .../t/compress/generic.pl | 1603 ++++++ .../t/compress/merge.pl | 330 ++ .../t/compress/multi.pl | 217 + .../t/compress/newtied.pl | 374 ++ .../t/compress/oneshot.pl | 1560 ++++++ .../t/compress/prime.pl | 90 + .../t/compress/tied.pl | 492 ++ .../t/compress/truncate.pl | 169 + .../t/compress/zlib-generic.pl | 233 + .../libio-compress-zlib-perl_2.011-1.diff.gz | Bin 2996 -> 0 bytes .../libio-compress-zlib-perl_2.011-1.dsc | 33 - .../libio-compress-zlib-perl_2.011.orig.tar.gz | Bin 140709 -> 0 bytes .../libio-compress-zlib-perl_2.012-1.diff.gz | Bin 0 -> 3042 bytes .../libio-compress-zlib-perl_2.012-1.dsc | 33 + .../libio-compress-zlib-perl_2.012.orig.tar.gz | Bin 0 -> 141182 bytes .../libio-socket-ssl-perl-1.16/BUGS | 94 + .../libio-socket-ssl-perl-1.16/Changes | 427 ++ .../libio-socket-ssl-perl-1.16/MANIFEST | 42 + .../libio-socket-ssl-perl-1.16/META.yml | 12 + .../libio-socket-ssl-perl-1.16/Makefile.PL | 99 + .../libio-socket-ssl-perl-1.16/README | 39 + .../libio-socket-ssl-perl-1.16/SSL.pm | 2194 ++++++++ .../certs/client-cert.pem | 61 + .../certs/client-key.enc | 12 + .../certs/client-key.pem | 9 + .../libio-socket-ssl-perl-1.16/certs/my-ca.pem | 19 + .../certs/server-cert.pem | 61 + .../certs/server-key.enc | 12 + .../certs/server-key.pem | 9 + .../certs/server-rsa384-dh.pem | 20 + .../certs/server-wildcard.pem | 87 + .../libio-socket-ssl-perl-1.16/certs/test-ca.pem | 19 + .../debian/README.source | 3 + .../libio-socket-ssl-perl-1.16/debian/changelog | 203 + .../libio-socket-ssl-perl-1.16/debian/compat | 1 + .../libio-socket-ssl-perl-1.16/debian/control | 28 + .../libio-socket-ssl-perl-1.16/debian/copyright | 39 + .../debian/libio-socket-ssl-perl.docs | 2 + .../debian/libio-socket-ssl-perl.examples | 1 + .../debian/patches/disable_timebomb_tests.patch | 70 + .../debian/patches/partial_hostname_fix.patch | 34 + .../debian/patches/series | 2 + .../libio-socket-ssl-perl-1.16/debian/rules | 25 + .../libio-socket-ssl-perl-1.16/debian/watch | 2 + .../libio-socket-ssl-perl-1.16/docs/debugging.txt | 25 + .../example/async_https_server.pl | 156 + .../example/lwp-with-verifycn.pl | 18 + .../example/ssl_client.pl | 53 + .../example/ssl_server.pl | 70 + .../patches/Net_SSLeay.patch | 47 + .../libio-socket-ssl-perl-1.16/t/01loadmodule.t | 28 + .../libio-socket-ssl-perl-1.16/t/02settings.t | 27 + .../t/acceptSSL-timeout.t | 55 + .../t/auto_verify_hostname.t | 108 + .../libio-socket-ssl-perl-1.16/t/cert_no_file.t | 117 + .../libio-socket-ssl-perl-1.16/t/compatibility.t | 83 + .../t/connectSSL-timeout.t | 58 + .../libio-socket-ssl-perl-1.16/t/core.t | 395 ++ .../libio-socket-ssl-perl-1.16/t/dhe.t | 70 + .../libio-socket-ssl-perl-1.16/t/nonblock.t | 374 ++ .../libio-socket-ssl-perl-1.16/t/readline.t | 152 + .../libio-socket-ssl-perl-1.16/t/sessions.t | 243 + .../libio-socket-ssl-perl-1.16/t/ssl_settings.req | 3 + .../libio-socket-ssl-perl-1.16/t/start-stopssl.t | 120 + .../libio-socket-ssl-perl-1.16/t/startssl.t | 118 + .../libio-socket-ssl-perl-1.16/t/sysread_write.t | 153 + .../libio-socket-ssl-perl-1.16/t/testlib.pl | 187 + .../libio-socket-ssl-perl-1.16/t/verify_hostname.t | 118 + .../util/export_certs.pl | 60 + .../libio-socket-ssl-perl_1.13-1.diff.gz | Bin 3600 -> 0 bytes .../libio-socket-ssl-perl_1.13-1.dsc | 33 - .../libio-socket-ssl-perl_1.13.orig.tar.gz | Bin 52531 -> 0 bytes .../libio-socket-ssl-perl_1.16-1+lenny1.dsc | 30 + .../libio-socket-ssl-perl_1.16-1+lenny1.tar.gz | Bin 0 -> 66657 bytes .../libio-stringy-perl/io-stringy-2.110/COPYING | 41 + .../libio-stringy-perl/io-stringy-2.110/MANIFEST | 23 + .../libio-stringy-perl/io-stringy-2.110/META.yml | 10 + .../io-stringy-2.110/Makefile.PL | 21 + .../libio-stringy-perl/io-stringy-2.110/README | 311 ++ .../io-stringy-2.110/contrib/Clever.pm | 36 + .../io-stringy-2.110/debian/changelog | 151 + .../io-stringy-2.110/debian/compat | 1 + .../io-stringy-2.110/debian/control | 21 + .../io-stringy-2.110/debian/copyright | 57 + .../io-stringy-2.110/debian/doc-base | 12 + .../io-stringy-2.110/debian/install | 1 + .../io-stringy-2.110/debian/links | 1 + .../io-stringy-2.110/debian/patches/01_close.diff | 25 + .../io-stringy-2.110/debian/rules | 8 + .../io-stringy-2.110/debian/watch | 2 + .../io-stringy-2.110/docs/IO/AtomicFile.pm.html | 104 + .../io-stringy-2.110/docs/IO/InnerFile.pm.html | 156 + .../io-stringy-2.110/docs/IO/Lines.pm.html | 108 + .../io-stringy-2.110/docs/IO/Scalar.pm.html | 501 ++ .../io-stringy-2.110/docs/IO/ScalarArray.pm.html | 454 ++ .../io-stringy-2.110/docs/IO/Stringy.pm.html | 504 ++ .../io-stringy-2.110/docs/IO/Wrap.pm.html | 178 + .../io-stringy-2.110/docs/IO/WrapTie.pm.html | 435 ++ .../io-stringy-2.110/docs/IO/icons/h1bullet.gif | Bin 0 -> 421 bytes .../io-stringy-2.110/docs/IO/icons/h2bullet.gif | Bin 0 -> 345 bytes .../io-stringy-2.110/docs/IO/icons/itembullet.gif | Bin 0 -> 68 bytes .../io-stringy-2.110/docs/IO/icons/zeegee.gif | Bin 0 -> 5269 bytes .../io-stringy-2.110/docs/IO_Scalar_synopsis.html | 34 + .../io-stringy-2.110/docs/icons/h1bullet.gif | Bin 0 -> 421 bytes .../io-stringy-2.110/docs/icons/h2bullet.gif | Bin 0 -> 345 bytes .../io-stringy-2.110/docs/icons/itembullet.gif | Bin 0 -> 68 bytes .../io-stringy-2.110/docs/icons/zeegee.gif | Bin 0 -> 5269 bytes .../io-stringy-2.110/docs/index-menu.html | 37 + .../io-stringy-2.110/docs/index.html | 13 + .../io-stringy-2.110/docs/index.menu | 35 + .../io-stringy-2.110/examples/IO_Scalar_synopsis | 112 + .../io-stringy-2.110/lib/IO/AtomicFile.pm | 196 + .../io-stringy-2.110/lib/IO/InnerFile.pm | 282 + .../io-stringy-2.110/lib/IO/Lines.pm | 184 + .../io-stringy-2.110/lib/IO/Scalar.pm | 778 +++ .../io-stringy-2.110/lib/IO/ScalarArray.pm | 791 +++ .../io-stringy-2.110/lib/IO/Stringy.pm | 446 ++ .../io-stringy-2.110/lib/IO/Wrap.pm | 222 + .../io-stringy-2.110/lib/IO/WrapTie.pm | 491 ++ .../io-stringy-2.110/t/Common.pm | 365 ++ .../io-stringy-2.110/t/ExtUtils/TBone.pm | 612 ++ .../io-stringy-2.110/t/IO_Lines.t | 45 + .../io-stringy-2.110/t/IO_Scalar.t | 48 + .../io-stringy-2.110/t/IO_ScalarArray.t | 51 + .../io-stringy-2.110/t/IO_WrapTie.t | 66 + .../libio-stringy-perl/io-stringy-2.110/t/simple.t | 63 + .../libio-stringy-perl/io-stringy-2.110/t/two.t | 53 + .../libmodule-build-perl-0.2808.01/Build.PL | 85 + .../libmodule-build-perl-0.2808.01/Changes | 1808 ++++++ .../libmodule-build-perl-0.2808.01/INSTALL | 38 + .../libmodule-build-perl-0.2808.01/MANIFEST | 71 + .../libmodule-build-perl-0.2808.01/META.yml | 125 + .../libmodule-build-perl-0.2808.01/Makefile.PL | 9 + .../libmodule-build-perl-0.2808.01/README | 825 +++ .../libmodule-build-perl-0.2808.01/SIGNATURE | 92 + .../contrib/bash_completion.module-build | 39 + .../debian/changelog | 172 + .../libmodule-build-perl-0.2808.01/debian/compat | 1 + .../libmodule-build-perl-0.2808.01/debian/control | 25 + .../debian/copyright | 63 + .../debian/patches/man-ext | 22 + .../debian/patches/series | 1 + .../libmodule-build-perl-0.2808.01/debian/rules | 63 + .../libmodule-build-perl-0.2808.01/debian/watch | 8 + .../lib/Module/Build.pm | 1071 ++++ .../lib/Module/Build/API.pod | 1734 ++++++ .../lib/Module/Build/Authoring.pod | 319 ++ .../lib/Module/Build/Base.pm | 4286 ++++++++++++++ .../lib/Module/Build/Compat.pm | 460 ++ .../lib/Module/Build/Config.pm | 59 + .../lib/Module/Build/Cookbook.pm | 449 ++ .../lib/Module/Build/Dumper.pm | 16 + .../lib/Module/Build/ModuleInfo.pm | 455 ++ .../lib/Module/Build/Notes.pm | 295 + .../lib/Module/Build/PPMMaker.pm | 194 + .../lib/Module/Build/Platform/Amiga.pm | 34 + .../lib/Module/Build/Platform/Default.pm | 33 + .../lib/Module/Build/Platform/EBCDIC.pm | 34 + .../lib/Module/Build/Platform/MPEiX.pm | 34 + .../lib/Module/Build/Platform/MacOS.pm | 152 + .../lib/Module/Build/Platform/RiscOS.pm | 34 + .../lib/Module/Build/Platform/Unix.pm | 76 + .../lib/Module/Build/Platform/VMS.pm | 375 ++ .../lib/Module/Build/Platform/VOS.pm | 34 + .../lib/Module/Build/Platform/Windows.pm | 258 + .../lib/Module/Build/Platform/aix.pm | 40 + .../lib/Module/Build/Platform/cygwin.pm | 39 + .../lib/Module/Build/Platform/darwin.pm | 40 + .../lib/Module/Build/Platform/os2.pm | 39 + .../lib/Module/Build/PodParser.pm | 106 + .../lib/Module/Build/Version.pm | 589 ++ .../lib/Module/Build/YAML.pm | 163 + .../scripts/config_data | 249 + .../libmodule-build-perl-0.2808.01/t/basic.t | 220 + .../t/bundled/Test/Builder.pm | 1499 +++++ .../t/bundled/Test/More.pm | 1330 +++++ .../t/bundled/Test/Simple.pm | 235 + .../t/bundled/Tie/CPHash.pm | 194 + .../libmodule-build-perl-0.2808.01/t/compat.t | 345 ++ .../t/destinations.t | 326 ++ .../libmodule-build-perl-0.2808.01/t/ext.t | 116 + .../libmodule-build-perl-0.2808.01/t/extend.t | 283 + .../libmodule-build-perl-0.2808.01/t/files.t | 67 + .../libmodule-build-perl-0.2808.01/t/help.t | 279 + .../libmodule-build-perl-0.2808.01/t/install.t | 253 + .../t/lib/DistGen.pm | 560 ++ .../libmodule-build-perl-0.2808.01/t/lib/MBTest.pm | 167 + .../libmodule-build-perl-0.2808.01/t/manifypods.t | 171 + .../libmodule-build-perl-0.2808.01/t/mbyaml.t | 260 + .../libmodule-build-perl-0.2808.01/t/metadata.t | 589 ++ .../libmodule-build-perl-0.2808.01/t/metadata2.t | 150 + .../libmodule-build-perl-0.2808.01/t/moduleinfo.t | 434 ++ .../t/new_from_context.t | 35 + .../libmodule-build-perl-0.2808.01/t/notes.t | 75 + .../libmodule-build-perl-0.2808.01/t/par.t | 90 + .../libmodule-build-perl-0.2808.01/t/parents.t | 62 + .../libmodule-build-perl-0.2808.01/t/pod_parser.t | 70 + .../libmodule-build-perl-0.2808.01/t/ppm.t | 226 + .../libmodule-build-perl-0.2808.01/t/runthrough.t | 253 + .../libmodule-build-perl-0.2808.01/t/signature.t | 77 + .../libmodule-build-perl-0.2808.01/t/test_type.t | 72 + .../libmodule-build-perl-0.2808.01/t/test_types.t | 186 + .../libmodule-build-perl-0.2808.01/t/tilde.t | 98 + .../libmodule-build-perl-0.2808.01/t/versions.t | 30 + .../libmodule-build-perl-0.2808.01/t/xs.t | 229 + .../libmodule-depends-perl-0.14/Build.PL | 17 + .../libmodule-depends-perl-0.14/Changes | 54 + .../libmodule-depends-perl-0.14/MANIFEST | 24 + .../libmodule-depends-perl-0.14/MANIFEST.SKIP | 9 + .../libmodule-depends-perl-0.14/META.yml | 14 + .../libmodule-depends-perl-0.14/Makefile.PL | 17 + .../libmodule-depends-perl-0.14/NINJA | 8 + .../libmodule-depends-perl-0.14/README | 73 + .../libmodule-depends-perl-0.14/debian/changelog | 34 + .../libmodule-depends-perl-0.14/debian/compat | 1 + .../libmodule-depends-perl-0.14/debian/control | 21 + .../libmodule-depends-perl-0.14/debian/copyright | 22 + .../libmodule-depends-perl-0.14/debian/rules | 90 + .../libmodule-depends-perl-0.14/debian/watch | 2 + .../lib/Module/Depends.pm | 127 + .../lib/Module/Depends/Intrusive.pm | 140 + .../t/build_version/Build.PL | 11 + .../libmodule-depends-perl-0.14/t/depends.t | 109 + .../t/inline-makemaker/Makefile.PL | 12 + .../t/mmish/Makefile.PL | 7 + .../t/module-install/Makefile.PL | 20 + .../libmodule-depends-perl-0.14/t/old/Build.PL | 18 + .../libmodule-depends-perl-0.14/t/old/META.yml | 24 + .../libmodule-depends-perl-0.14/t/old/Makefile.PL | 17 + .../t/template-extract/Build.PL | 2 + .../t/template-extract/META.yml | 15 + .../t/template-extract/Makefile.PL | 18 + .../t/uses-findbin/Makefile.PL | 8 + .../t/with-yaml/META.yml | 24 + .../libmodule-depends-perl_0.10-1.1.diff.gz | Bin 2357 -> 0 bytes .../libmodule-depends-perl_0.10-1.1.dsc | 23 - .../libmodule-depends-perl_0.10.orig.tar.gz | Bin 5351 -> 0 bytes .../libmodule-depends-perl_0.14-1.diff.gz | Bin 0 -> 2352 bytes .../libmodule-depends-perl_0.14-1.dsc | 29 + .../libmodule-depends-perl_0.14.orig.tar.gz | Bin 0 -> 6702 bytes .../libnet-ssleay-perl-1.35/Changes | 297 + .../libnet-ssleay-perl-1.35/Credits | 8 + .../libnet-ssleay-perl-1.35/MANIFEST | 76 + .../libnet-ssleay-perl-1.35/MANIFEST.SKIP | 31 + .../libnet-ssleay-perl-1.35/META.yml | 21 + .../libnet-ssleay-perl-1.35/Makefile.PL | 29 + .../libnet-ssleay-perl-1.35/QuickRef | 278 + .../libnet-ssleay-perl-1.35/README | 383 ++ .../libnet-ssleay-perl-1.35/README.Win32 | 126 + .../libnet-ssleay-perl-1.35/RECIPE.Win32 | 2 + .../libnet-ssleay-perl-1.35/SSLeay.xs | 2674 +++++++++ .../libnet-ssleay-perl-1.35/TODO | 42 + .../libnet-ssleay-perl-1.35/constants.c | 2681 +++++++++ .../libnet-ssleay-perl-1.35/debian/README.source | 3 + .../libnet-ssleay-perl-1.35/debian/changelog | 203 + .../libnet-ssleay-perl-1.35/debian/compat | 1 + .../libnet-ssleay-perl-1.35/debian/control | 24 + .../libnet-ssleay-perl-1.35/debian/copyright | 164 + .../debian/libnet-ssleay-perl.docs | 4 + .../debian/libnet-ssleay-perl.examples | 1 + .../debian/libnet-ssleay-perl.lintian-overrides | 1 + .../debian/patches/10fix_pod.patch | 14 + .../debian/patches/20no-stray-libz-link.patch | 13 + .../libnet-ssleay-perl-1.35/debian/patches/series | 2 + .../libnet-ssleay-perl-1.35/debian/rules | 25 + .../libnet-ssleay-perl-1.35/debian/watch | 3 + .../libnet-ssleay-perl-1.35/examples/bio.pl | 47 + .../libnet-ssleay-perl-1.35/examples/bulk.pl | 55 + .../libnet-ssleay-perl-1.35/examples/callback.pl | 101 + .../libnet-ssleay-perl-1.35/examples/cb-testi.pl | 24 + .../libnet-ssleay-perl-1.35/examples/cli-cert.pl | 116 + .../libnet-ssleay-perl-1.35/examples/ephemeral.pl | 22 + .../examples/get_authenticated_page.pl | 27 + .../libnet-ssleay-perl-1.35/examples/get_page.pl | 20 + .../examples/get_page_cert.pl | 33 + .../examples/https-proxy-snif.pl | 135 + .../libnet-ssleay-perl-1.35/examples/makecert.pl | 55 + .../libnet-ssleay-perl-1.35/examples/minicli.pl | 39 + .../libnet-ssleay-perl-1.35/examples/passwd-cb.pl | 34 + .../libnet-ssleay-perl-1.35/examples/req.conf | 42 + .../examples/server_key.pem | 18 + .../examples/ssl-inetd-serv.pl | 61 + .../libnet-ssleay-perl-1.35/examples/ssl_diff.pl | 23 + .../libnet-ssleay-perl-1.35/examples/sslcat.pl | 17 + .../libnet-ssleay-perl-1.35/examples/sslecho.pl | 100 + .../libnet-ssleay-perl-1.35/examples/stdio_bulk.pl | 82 + .../libnet-ssleay-perl-1.35/examples/tcpcat.pl | 16 + .../libnet-ssleay-perl-1.35/examples/tcpecho.pl | 58 + .../libnet-ssleay-perl-1.35/inc/Module/Install.pm | 364 ++ .../inc/Module/Install/Base.pm | 72 + .../inc/Module/Install/Can.pm | 82 + .../inc/Module/Install/Compiler.pm | 68 + .../inc/Module/Install/External.pm | 66 + .../inc/Module/Install/Fetch.pm | 93 + .../inc/Module/Install/Makefile.pm | 251 + .../inc/Module/Install/Metadata.pm | 487 ++ .../inc/Module/Install/PRIVATE/Net/SSLeay.pm | 210 + .../inc/Module/Install/Win32.pm | 64 + .../inc/Module/Install/WriteAll.pm | 40 + .../libnet-ssleay-perl-1.35/lib/Net/SSLeay.pm | 2610 +++++++++ .../lib/Net/SSLeay/Handle.pm | 394 ++ .../libnet-ssleay-perl-1.35/ppport.h | 4954 +++++++++++++++++ .../libnet-ssleay-perl-1.35/t/data/0f89dbb5.0 | 23 + .../libnet-ssleay-perl-1.35/t/data/cert.pem | 23 + .../libnet-ssleay-perl-1.35/t/data/key.pem | 15 + .../libnet-ssleay-perl-1.35/t/data/key.pem.e | 18 + .../t/external/08_external.t | 31 + .../t/external/15_altnames.t | 32 + .../t/handle/external/10_destroy.t | 54 + .../t/handle/external/50_external.t | 71 + .../t/handle/local/05_use.t | 9 + .../libnet-ssleay-perl-1.35/t/local/00_ptr_cast.t | 36 + .../libnet-ssleay-perl-1.35/t/local/01_pod.t | 12 + .../t/local/02_pod_coverage.t | 13 + .../libnet-ssleay-perl-1.35/t/local/03_use.t | 9 + .../libnet-ssleay-perl-1.35/t/local/04_basic.t | 17 + .../libnet-ssleay-perl-1.35/t/local/05_passwd_cb.t | 82 + .../libnet-ssleay-perl-1.35/t/local/06_tcpecho.t | 61 + .../libnet-ssleay-perl-1.35/t/local/07_sslecho.t | 323 ++ .../libnet-ssleay-perl-1.35/t/local/08_pipe.t | 102 + .../libnet-ssleay-perl-1.35/t/local/15_bio.t | 21 + .../libnet-ssleay-perl-1.35/t/local/20_autoload.t | 38 + .../libnet-ssleay-perl-1.35/t/local/30_error.t | 68 + .../t/local/31_rsa_generate_key.t | 73 + .../libnet-ssleay-perl-1.35/t/local/35_ephemeral.t | 15 + .../libnet-ssleay-perl-1.35/t/local/50_digest.t | 57 + .../libnet-ssleay-perl-1.35/t/local/kwalitee.t | 8 + .../t/local/ptr_cast_test.c | 43 + .../libnet-ssleay-perl-1.35/typemap | 50 + .../libnet-ssleay-perl_1.35-1.diff.gz | Bin 0 -> 6306 bytes .../libnet-ssleay-perl_1.35-1.dsc | 32 + .../libnet-ssleay-perl_1.35-1ubuntu1.diff.gz | Bin 6985 -> 0 bytes .../libnet-ssleay-perl_1.35-1ubuntu1.dsc | 33 - .../libpar-dist-perl/libpar-dist-perl-0.31/Changes | 246 + .../libpar-dist-perl-0.31/MANIFEST | 10 + .../libpar-dist-perl-0.31/META.yml | 17 + .../libpar-dist-perl-0.31/Makefile.PL | 17 + .../libpar-dist-perl/libpar-dist-perl-0.31/README | 33 + .../libpar-dist-perl-0.31/debian/changelog | 90 + .../libpar-dist-perl-0.31/debian/compat | 1 + .../libpar-dist-perl-0.31/debian/control | 24 + .../libpar-dist-perl-0.31/debian/copyright | 16 + .../libpar-dist-perl-0.31/debian/rules | 60 + .../libpar-dist-perl-0.31/debian/watch | 2 + .../libpar-dist-perl-0.31/lib/PAR/Dist.pm | 1191 ++++ .../libpar-dist-perl-0.31/t/00pod.t | 10 + .../libpar-dist-perl-0.31/t/00podcover.t | 11 + .../libpar-dist-perl-0.31/t/01basic.t | 10 + .../libpar-dist-perl-0.31/t/02parsedistname.t | 29 + .../libpod-coverage-perl-0.19/Build.PL | 18 + .../libpod-coverage-perl-0.19/Changes | 146 + .../libpod-coverage-perl-0.19/MANIFEST | 40 + .../libpod-coverage-perl-0.19/META.yml | 33 + .../libpod-coverage-perl-0.19/Makefile.PL | 19 + .../libpod-coverage-perl-0.19/README | 95 + .../libpod-coverage-perl-0.19/bin/pod_cover | 49 + .../libpod-coverage-perl-0.19/debian/changelog | 123 + .../libpod-coverage-perl-0.19/debian/compat | 1 + .../libpod-coverage-perl-0.19/debian/control | 19 + .../libpod-coverage-perl-0.19/debian/copyright | 19 + .../libpod-coverage-perl-0.19/debian/rules | 58 + .../libpod-coverage-perl-0.19/debian/watch | 2 + .../examples/check_installed | 27 + .../examples/script-covered | 27 + .../libpod-coverage-perl-0.19/lib/Pod/Coverage.pm | 486 ++ .../lib/Pod/Coverage/CountParents.pm | 77 + .../lib/Pod/Coverage/ExportOnly.pm | 53 + .../lib/Pod/Coverage/Overloader.pm | 37 + .../libpod-coverage-perl-0.19/t/01compile.t | 8 + .../libpod-coverage-perl-0.19/t/02simple.t | 84 + .../libpod-coverage-perl-0.19/t/03import.t | 32 + .../libpod-coverage-perl-0.19/t/04cvgv.t | 19 + .../libpod-coverage-perl-0.19/t/05parentage.t | 19 + .../libpod-coverage-perl-0.19/t/06trustme.t | 30 + .../libpod-coverage-perl-0.19/t/07pod.t | 4 + .../libpod-coverage-perl-0.19/t/08tie.t | 13 + .../libpod-coverage-perl-0.19/t/lib/Args.pm | 12 + .../libpod-coverage-perl-0.19/t/lib/Child.pm | 10 + .../libpod-coverage-perl-0.19/t/lib/Earle.pm | 16 + .../t/lib/Fully/Qualified.pm | 44 + .../libpod-coverage-perl-0.19/t/lib/GrandParent.pm | 14 + .../libpod-coverage-perl-0.19/t/lib/Parent.pm | 18 + .../libpod-coverage-perl-0.19/t/lib/Sibling.pm | 9 + .../libpod-coverage-perl-0.19/t/lib/Simple1.pm | 27 + .../libpod-coverage-perl-0.19/t/lib/Simple2.pm | 31 + .../libpod-coverage-perl-0.19/t/lib/Simple3.pm | 16 + .../libpod-coverage-perl-0.19/t/lib/Simple4.pm | 7 + .../libpod-coverage-perl-0.19/t/lib/Simple4.pod | 9 + .../libpod-coverage-perl-0.19/t/lib/Simple5.pm | 15 + .../libpod-coverage-perl-0.19/t/lib/Simple6.pm | 23 + .../libpod-coverage-perl-0.19/t/lib/Simple7.pm | 13 + .../libpod-coverage-perl-0.19/t/lib/Simple8.pm | 5 + .../libpod-coverage-perl-0.19/t/lib/Tie.pm | 53 + .../libpod-coverage-perl-0.19/t/lib/Trustme.pm | 40 + .../libpod-coverage-perl-0.19/t/lib/XS4ALL.pm | 30 + .../libpod-escapes-perl-1.04/ChangeLog | 26 + .../libpod-escapes-perl-1.04/MANIFEST | 10 + .../libpod-escapes-perl-1.04/MANIFEST.SKIP | 7 + .../libpod-escapes-perl-1.04/META.yml | 10 + .../libpod-escapes-perl-1.04/Makefile.PL | 24 + .../libpod-escapes-perl-1.04/README | 91 + .../libpod-escapes-perl-1.04/debian/changelog | 12 + .../libpod-escapes-perl-1.04/debian/compat | 1 + .../libpod-escapes-perl-1.04/debian/control | 15 + .../libpod-escapes-perl-1.04/debian/copyright | 26 + .../libpod-escapes-perl-1.04/debian/rules | 53 + .../libpod-escapes-perl-1.04/debian/watch | 2 + .../libpod-escapes-perl-1.04/lib/Pod/Escapes.pm | 721 +++ .../libpod-escapes-perl-1.04/t/01_about_verbose.t | 87 + .../libpod-escapes-perl-1.04/t/10_main.t | 114 + .../libpod-escapes-perl-1.04/t/15_name2charnum.t | 81 + .../libpod-simple-perl-3.07/ChangeLog | 292 + .../libpod-simple-perl-3.07/MANIFEST | 180 + .../libpod-simple-perl-3.07/MANIFEST.SKIP | 9 + .../libpod-simple-perl-3.07/META.yml | 25 + .../libpod-simple-perl-3.07/Makefile.PL | 44 + .../libpod-simple-perl-3.07/README | 7 + .../libpod-simple-perl-3.07/debian/changelog | 93 + .../libpod-simple-perl-3.07/debian/compat | 1 + .../libpod-simple-perl-3.07/debian/control | 21 + .../libpod-simple-perl-3.07/debian/copyright | 28 + .../libpod-simple-perl-3.07/debian/rules | 13 + .../libpod-simple-perl-3.07/debian/watch | 2 + .../libpod-simple-perl-3.07/lib/Pod/Simple.pm | 1536 ++++++ .../libpod-simple-perl-3.07/lib/Pod/Simple.pod | 226 + .../lib/Pod/Simple/BlackBox.pm | 1919 +++++++ .../lib/Pod/Simple/Checker.pm | 171 + .../lib/Pod/Simple/Debug.pm | 151 + .../lib/Pod/Simple/DumpAsText.pm | 130 + .../lib/Pod/Simple/DumpAsXML.pm | 146 + .../libpod-simple-perl-3.07/lib/Pod/Simple/HTML.pm | 889 +++ .../lib/Pod/Simple/HTMLBatch.pm | 1342 +++++ .../lib/Pod/Simple/HTMLLegacy.pm | 104 + .../lib/Pod/Simple/LinkSection.pm | 145 + .../lib/Pod/Simple/Methody.pm | 127 + .../lib/Pod/Simple/Progress.pm | 93 + .../lib/Pod/Simple/PullParser.pm | 795 +++ .../lib/Pod/Simple/PullParserEndToken.pm | 93 + .../lib/Pod/Simple/PullParserStartToken.pm | 130 + .../lib/Pod/Simple/PullParserTextToken.pm | 101 + .../lib/Pod/Simple/PullParserToken.pm | 138 + .../libpod-simple-perl-3.07/lib/Pod/Simple/RTF.pm | 674 +++ .../lib/Pod/Simple/Search.pm | 1016 ++++ .../lib/Pod/Simple/SimpleTree.pm | 155 + .../lib/Pod/Simple/Subclassing.pod | 922 ++++ .../libpod-simple-perl-3.07/lib/Pod/Simple/Text.pm | 152 + .../lib/Pod/Simple/TextContent.pm | 87 + .../lib/Pod/Simple/TiedOutFH.pm | 103 + .../lib/Pod/Simple/Transcode.pm | 33 + .../lib/Pod/Simple/TranscodeDumb.pm | 63 + .../lib/Pod/Simple/TranscodeSmart.pm | 42 + .../lib/Pod/Simple/XHTML.pm | 400 ++ .../lib/Pod/Simple/XMLOutStream.pm | 157 + .../libpod-simple-perl-3.07/lib/perlpod.pod | 685 +++ .../libpod-simple-perl-3.07/lib/perlpodspec.pod | 1876 +++++++ .../libpod-simple-perl-3.07/t/00about.t | 123 + .../libpod-simple-perl-3.07/t/20_skip.t | 19 + .../libpod-simple-perl-3.07/t/ac_d.t | 93 + .../libpod-simple-perl-3.07/t/accept01.t | 95 + .../libpod-simple-perl-3.07/t/accept05.t | 144 + .../libpod-simple-perl-3.07/t/basic.t | 95 + .../libpod-simple-perl-3.07/t/begin.t | 462 ++ .../libpod-simple-perl-3.07/t/cbacks.t | 83 + .../libpod-simple-perl-3.07/t/chunking.t | 49 + .../libpod-simple-perl-3.07/t/closeys.t | 39 + .../libpod-simple-perl-3.07/t/corpus.t | 182 + .../libpod-simple-perl-3.07/t/corpus/2202jp.txt | 101 + .../libpod-simple-perl-3.07/t/corpus/2202jp.xml | 133 + .../libpod-simple-perl-3.07/t/corpus/2202jpx.txt | 101 + .../libpod-simple-perl-3.07/t/corpus/2202jpx.xml | 133 + .../libpod-simple-perl-3.07/t/corpus/2202jpy.txt | 101 + .../libpod-simple-perl-3.07/t/corpus/2202jpy.xml | 133 + .../libpod-simple-perl-3.07/t/corpus/2202jpz.txt | 14 + .../libpod-simple-perl-3.07/t/corpus/2202jpz.xml | 14 + .../libpod-simple-perl-3.07/t/corpus/8859_7.pod | 33 + .../libpod-simple-perl-3.07/t/corpus/8859_7.xml | 59 + .../libpod-simple-perl-3.07/t/corpus/cp1256.txt | 39 + .../libpod-simple-perl-3.07/t/corpus/cp1256.xml | 98 + .../libpod-simple-perl-3.07/t/corpus/fet_cont.txt | 22 + .../libpod-simple-perl-3.07/t/corpus/fet_cont.xml | 42 + .../libpod-simple-perl-3.07/t/corpus/fet_dup.txt | 56 + .../libpod-simple-perl-3.07/t/corpus/fet_dup.xml | 121 + .../libpod-simple-perl-3.07/t/corpus/iso6.txt | 39 + .../libpod-simple-perl-3.07/t/corpus/iso6.xml | 100 + .../libpod-simple-perl-3.07/t/corpus/koi8r.txt | 51 + .../libpod-simple-perl-3.07/t/corpus/koi8r.xml | 122 + .../libpod-simple-perl-3.07/t/corpus/laozi38.txt | 37 + .../libpod-simple-perl-3.07/t/corpus/laozi38.xml | 52 + .../libpod-simple-perl-3.07/t/corpus/laozi38b.txt | 37 + .../libpod-simple-perl-3.07/t/corpus/laozi38b.xml | 52 + .../libpod-simple-perl-3.07/t/corpus/laozi38p.pod | 46 + .../libpod-simple-perl-3.07/t/corpus/laozi38p.xml | 69 + .../libpod-simple-perl-3.07/t/corpus/lat1fr.txt | 38 + .../libpod-simple-perl-3.07/t/corpus/lat1fr.xml | 70 + .../libpod-simple-perl-3.07/t/corpus/lat1frim.txt | 36 + .../libpod-simple-perl-3.07/t/corpus/lat1frim.xml | 70 + .../libpod-simple-perl-3.07/t/corpus/nonesuch.txt | 11 + .../libpod-simple-perl-3.07/t/corpus/nonesuch.xml | 49 + .../t/corpus/pasternak_cp1251.txt | 108 + .../t/corpus/pasternak_cp1251.xml | 211 + .../libpod-simple-perl-3.07/t/corpus/plain.txt | 20 + .../libpod-simple-perl-3.07/t/corpus/plain.xml | 26 + .../t/corpus/plain_explicit.txt | 22 + .../t/corpus/plain_explicit.xml | 26 + .../t/corpus/plain_latin1.txt | 24 + .../t/corpus/plain_latin1.xml | 27 + .../t/corpus/plain_utf8.txt | 24 + .../t/corpus/plain_utf8.xml | 27 + .../t/corpus/polish_utf8.txt | 69 + .../t/corpus/polish_utf8.xml | 94 + .../t/corpus/s2763_sjis.txt | 48 + .../t/corpus/s2763_sjis.xml | 64 + .../t/corpus/thai_iso11.txt | 64 + .../t/corpus/thai_iso11.xml | 93 + .../t/corpus2/fiqhakbar_iso6.txt | 84 + .../t/corpus2/fiqhakbar_iso6.xml | 168 + .../t/corpus2/polish_implicit_utf8.txt | 67 + .../t/corpus2/polish_utf16be_bom.txt | Bin 0 -> 3058 bytes .../t/corpus2/polish_utf16le_bom.txt | Bin 0 -> 3058 bytes .../t/corpus2/polish_utf8_bom.txt | 67 + .../t/corpus2/polish_utf8_bom.xml | 101 + .../t/corpus2/polish_utf8_bom2.txt | 67 + .../t/corpus2/polish_utf8_bom2.xml | 101 + .../libpod-simple-perl-3.07/t/encod01.t | 75 + .../libpod-simple-perl-3.07/t/encod02.t | 77 + .../libpod-simple-perl-3.07/t/encod03.t | 77 + .../libpod-simple-perl-3.07/t/end_over.t | 50 + .../libpod-simple-perl-3.07/t/fcodes.t | 112 + .../libpod-simple-perl-3.07/t/fcodes_e.t | 99 + .../libpod-simple-perl-3.07/t/fcodes_l.t | 434 ++ .../libpod-simple-perl-3.07/t/fcodes_s.t | 108 + .../libpod-simple-perl-3.07/t/for.t | 107 + .../libpod-simple-perl-3.07/t/fornot.t | 109 + .../libpod-simple-perl-3.07/t/fullstop.t | 58 + .../libpod-simple-perl-3.07/t/heads.t | 92 + .../libpod-simple-perl-3.07/t/html01.t | 77 + .../libpod-simple-perl-3.07/t/html02.t | 40 + .../libpod-simple-perl-3.07/t/html03.t | 35 + .../libpod-simple-perl-3.07/t/htmlbat.t | 97 + .../libpod-simple-perl-3.07/t/items.t | 226 + .../libpod-simple-perl-3.07/t/items02.t | 44 + .../libpod-simple-perl-3.07/t/itemstar.t | 51 + .../libpod-simple-perl-3.07/t/junk1.pod | 8 + .../libpod-simple-perl-3.07/t/junk1o.txt | 13 + .../libpod-simple-perl-3.07/t/junk2.pod | 6 + .../libpod-simple-perl-3.07/t/junk2o.txt | 13 + .../libpod-simple-perl-3.07/t/linkclas.t | 71 + .../libpod-simple-perl-3.07/t/perlcyg.pod | 592 ++ .../libpod-simple-perl-3.07/t/perlcygo.txt | 249 + .../libpod-simple-perl-3.07/t/perlfaq.pod | 814 +++ .../libpod-simple-perl-3.07/t/perlfaqo.txt | 266 + .../libpod-simple-perl-3.07/t/perlvar.pod | 1234 +++++ .../libpod-simple-perl-3.07/t/perlvaro.txt | 406 ++ .../libpod-simple-perl-3.07/t/puller.t | 358 ++ .../libpod-simple-perl-3.07/t/pulltitl.t | 388 ++ .../libpod-simple-perl-3.07/t/reinit.t | 91 + .../libpod-simple-perl-3.07/t/render.t | 164 + .../libpod-simple-perl-3.07/t/search05.t | 40 + .../libpod-simple-perl-3.07/t/search10.t | 86 + .../libpod-simple-perl-3.07/t/search12.t | 79 + .../libpod-simple-perl-3.07/t/search20.t | 87 + .../libpod-simple-perl-3.07/t/search22.t | 115 + .../libpod-simple-perl-3.07/t/search25.t | 112 + .../libpod-simple-perl-3.07/t/search26.t | 95 + .../libpod-simple-perl-3.07/t/search27.t | 109 + .../libpod-simple-perl-3.07/t/search28.t | 85 + .../libpod-simple-perl-3.07/t/search29.t | 85 + .../libpod-simple-perl-3.07/t/search50.t | 89 + .../libpod-simple-perl-3.07/t/stree.t | 151 + .../libpod-simple-perl-3.07/t/testlib1/Blorm.pm | 10 + .../t/testlib1/Zonk/Fiddle.txt | 4 + .../t/testlib1/Zonk/Pronk.pm | 43 + .../t/testlib1/Zonk/Veng.pm | 4 + .../t/testlib1/hinkhonk/Glunk.pod | 11 + .../t/testlib1/hinkhonk/Vliff.pm | 14 + .../t/testlib1/hinkhonk/readme.txt | 1 + .../t/testlib1/pod/perlflif.pod | 7 + .../t/testlib1/pod/perlthng.pod | 7 + .../libpod-simple-perl-3.07/t/testlib1/squaa.pm | 12 + .../t/testlib1/squaa/Glunk.pod | 11 + .../t/testlib1/squaa/Vliff.pm | 14 + .../libpod-simple-perl-3.07/t/testlib1/zikzik.pod | 10 + .../libpod-simple-perl-3.07/t/testlib2/Suzzle.pm | 10 + .../t/testlib2/hinkhonk/Glunk.pod | 11 + .../t/testlib2/hinkhonk/Vliff.pm | 14 + .../t/testlib2/hinkhonk/readme.txt | 1 + .../t/testlib2/pod/perlthng.pod | 7 + .../t/testlib2/pod/perlzuk.pod | 7 + .../t/testlib2/squaa/Vliff.pm | 14 + .../t/testlib2/squaa/Wowo.pod | 11 + .../t/testlib3/squaa/Vliff.pm | 14 + .../libpod-simple-perl-3.07/t/tiedfh.t | 58 + .../libpod-simple-perl-3.07/t/verb_fmt.t | 308 ++ .../libpod-simple-perl-3.07/t/verbatim.t | 363 ++ .../libpod-simple-perl-3.07/t/x_nixer.t | 218 + .../libpod-simple-perl-3.07/t/xhtml01.t | 351 ++ .../libpod-simple-perl-3.07/t/xhtml05.t | 67 + .../libsub-uplevel-perl-0.1901/Build.PL | 30 + .../libsub-uplevel-perl-0.1901/Changes | 95 + .../libsub-uplevel-perl-0.1901/INSTALL | 18 + .../libsub-uplevel-perl-0.1901/LICENSE | 321 ++ .../libsub-uplevel-perl-0.1901/MANIFEST | 27 + .../libsub-uplevel-perl-0.1901/MANIFEST.SKIP | 25 + .../libsub-uplevel-perl-0.1901/META.yml | 30 + .../libsub-uplevel-perl-0.1901/Makefile.PL | 16 + .../libsub-uplevel-perl-0.1901/README | 109 + .../libsub-uplevel-perl-0.1901/Todo | 12 + .../libsub-uplevel-perl-0.1901/debian/changelog | 111 + .../libsub-uplevel-perl-0.1901/debian/compat | 1 + .../libsub-uplevel-perl-0.1901/debian/control | 22 + .../libsub-uplevel-perl-0.1901/debian/copyright | 21 + .../debian/patches/examples-shebang.patch | 12 + .../debian/patches/series | 1 + .../libsub-uplevel-perl-0.1901/debian/rules | 56 + .../libsub-uplevel-perl-0.1901/debian/watch | 3 + .../examples/uplevel-demo.pl | 23 + .../inc/Module/Build/WikiDoc.pm | 56 + .../libsub-uplevel-perl-0.1901/lib/Sub/Uplevel.pm | 301 + .../libsub-uplevel-perl-0.1901/lib/Sub/Uplevel.pod | 179 + .../libsub-uplevel-perl-0.1901/t/01_die_check.t | 16 + .../libsub-uplevel-perl-0.1901/t/02_uplevel.t | 196 + .../t/03_nested_uplevels.t | 78 + .../t/04_honor_later_override.t | 82 + .../t/05_honor_prior_override.t | 84 + .../libsub-uplevel-perl-0.1901/t/06_db_args.t | 31 + .../libsub-uplevel-perl-0.1901/t/lib/Foo.pm | 8 + .../libsub-uplevel-perl-0.1901/xt/critic.t | 9 + .../libsub-uplevel-perl-0.1901/xt/perlcriticrc | 20 + .../libsub-uplevel-perl-0.1901/xt/pod-coverage.t | 22 + .../libsub-uplevel-perl-0.1901/xt/pod.t | 7 + .../libsub-uplevel-perl-0.1901/xt/spelling.t | 15 + .../libsub-uplevel-perl-0.1901/xt/stopwords.txt | 25 + .../libsub-uplevel-perl_0.1901-1.diff.gz | Bin 0 -> 3347 bytes .../libsub-uplevel-perl_0.1901-1.dsc | 27 + .../libsub-uplevel-perl_0.1901-1ubuntu1.diff.gz | Bin 3528 -> 0 bytes .../libsub-uplevel-perl_0.1901-1ubuntu1.dsc | 34 - .../libtest-exception-perl-0.27/Build.PL | 19 + .../libtest-exception-perl-0.27/Changes | 180 + .../libtest-exception-perl-0.27/MANIFEST | 23 + .../libtest-exception-perl-0.27/META.yml | 25 + .../libtest-exception-perl-0.27/Makefile.PL | 20 + .../libtest-exception-perl-0.27/README | 299 + .../libtest-exception-perl-0.27/debian/changelog | 73 + .../libtest-exception-perl-0.27/debian/compat | 1 + .../libtest-exception-perl-0.27/debian/control | 24 + .../libtest-exception-perl-0.27/debian/copyright | 24 + .../libtest-exception-perl-0.27/debian/rules | 70 + .../libtest-exception-perl-0.27/debian/watch | 2 + .../lib/Test/Exception.pm | 462 ++ .../libtest-exception-perl-0.27/t/Exception.t | 159 + .../libtest-exception-perl-0.27/t/caller.t | 14 + .../t/developer/documented.t | 9 + .../t/developer/perlcritic.t | 11 + .../t/developer/perlcriticrc | 1 + .../libtest-exception-perl-0.27/t/developer/pod.t | 9 + .../t/developer/spelling.t | 47 + .../libtest-exception-perl-0.27/t/edge-cases.t | 67 + .../libtest-exception-perl-0.27/t/import.t | 9 + .../libtest-exception-perl-0.27/t/isa.t | 21 + .../libtest-exception-perl-0.27/t/lives_and.t | 31 + .../libtest-exception-perl-0.27/t/preserve.t | 19 + .../libtest-exception-perl-0.27/t/return.t | 64 + .../libtest-exception-perl-0.27/t/rt.t | 20 + .../libtest-exception-perl-0.27/t/stacktrace.t | 17 + .../libtest-exception-perl-0.27/t/throws_ok.t | 9 + .../libtest-harness-perl-3.12/Build.PL | 37 + .../libtest-harness-perl-3.12/Changes | 630 +++ .../libtest-harness-perl-3.12/Changes-2.64 | 731 +++ .../libtest-harness-perl-3.12/HACKING.pod | 262 + .../libtest-harness-perl-3.12/MANIFEST | 192 + .../libtest-harness-perl-3.12/META.yml | 13 + .../libtest-harness-perl-3.12/Makefile.PL | 41 + .../libtest-harness-perl-3.12/README | 31 + .../libtest-harness-perl-3.12/bin/prove | 258 + .../libtest-harness-perl-3.12/debian/README.source | 3 + .../libtest-harness-perl-3.12/debian/TODO | 1 + .../libtest-harness-perl-3.12/debian/changelog | 133 + .../libtest-harness-perl-3.12/debian/compat | 1 + .../libtest-harness-perl-3.12/debian/control | 34 + .../libtest-harness-perl-3.12/debian/copyright | 45 + .../debian/patches/manpage-error.patch | 11 + .../debian/patches/series | 1 + .../libtest-harness-perl-3.12/debian/postrm | 13 + .../libtest-harness-perl-3.12/debian/preinst | 13 + .../libtest-harness-perl-3.12/debian/rules | 73 + .../libtest-harness-perl-3.12/debian/watch | 2 + .../libtest-harness-perl-3.12/examples/README | 54 + .../examples/bin/forked_tests.pl | 72 + .../examples/bin/test_html.pl | 14 + .../examples/bin/tprove_gtk | 475 ++ .../examples/harness-hook/hook.pl | 18 + .../examples/harness-hook/lib/Harness/Hook.pm | 30 + .../libtest-harness-perl-3.12/examples/my_exec | 22 + .../examples/silent-harness.pl | 16 + .../examples/t/10-stuff.t | 17 + .../libtest-harness-perl-3.12/examples/t/ruby.t | 3 + .../examples/test_urls.txt | 2 + .../libtest-harness-perl-3.12/inc/MyBuilder.pm | 120 + .../libtest-harness-perl-3.12/lib/App/Prove.pm | 636 +++ .../lib/App/Prove/State.pm | 438 ++ .../libtest-harness-perl-3.12/lib/TAP/Base.pm | 139 + .../lib/TAP/Formatter/Color.pm | 148 + .../lib/TAP/Formatter/Console.pm | 469 ++ .../lib/TAP/Formatter/Console/ParallelSession.pm | 186 + .../lib/TAP/Formatter/Console/Session.pm | 327 ++ .../libtest-harness-perl-3.12/lib/TAP/Harness.pm | 822 +++ .../libtest-harness-perl-3.12/lib/TAP/Object.pm | 97 + .../libtest-harness-perl-3.12/lib/TAP/Parser.pm | 1847 +++++++ .../lib/TAP/Parser/Aggregator.pm | 412 ++ .../lib/TAP/Parser/Grammar.pm | 581 ++ .../lib/TAP/Parser/Iterator.pm | 169 + .../lib/TAP/Parser/Iterator/Array.pm | 107 + .../lib/TAP/Parser/Iterator/Process.pm | 373 ++ .../lib/TAP/Parser/Iterator/Stream.pm | 112 + .../lib/TAP/Parser/IteratorFactory.pm | 173 + .../lib/TAP/Parser/Multiplexer.pm | 195 + .../lib/TAP/Parser/Result.pm | 297 + .../lib/TAP/Parser/Result/Bailout.pm | 63 + .../lib/TAP/Parser/Result/Comment.pm | 61 + .../lib/TAP/Parser/Result/Plan.pm | 120 + .../lib/TAP/Parser/Result/Pragma.pm | 63 + .../lib/TAP/Parser/Result/Test.pm | 274 + .../lib/TAP/Parser/Result/Unknown.pm | 51 + .../lib/TAP/Parser/Result/Version.pm | 63 + .../lib/TAP/Parser/Result/YAML.pm | 62 + .../lib/TAP/Parser/ResultFactory.pm | 187 + .../lib/TAP/Parser/Scheduler.pm | 241 + .../lib/TAP/Parser/Scheduler/Job.pm | 107 + .../lib/TAP/Parser/Scheduler/Spinner.pm | 53 + .../lib/TAP/Parser/Source.pm | 171 + .../lib/TAP/Parser/Source/Perl.pm | 322 ++ .../lib/TAP/Parser/Utils.pm | 72 + .../lib/TAP/Parser/YAMLish/Reader.pm | 333 ++ .../lib/TAP/Parser/YAMLish/Writer.pm | 255 + .../libtest-harness-perl-3.12/lib/Test/Harness.pm | 601 ++ .../libtest-harness-perl-3.12/perlcriticrc | 28 + .../libtest-harness-perl-3.12/t/000-load.t | 59 + .../libtest-harness-perl-3.12/t/aggregator.t | 301 + .../libtest-harness-perl-3.12/t/bailout.t | 114 + .../libtest-harness-perl-3.12/t/base.t | 173 + .../libtest-harness-perl-3.12/t/callbacks.t | 115 + .../libtest-harness-perl-3.12/t/compat/env.t | 39 + .../libtest-harness-perl-3.12/t/compat/failure.t | 59 + .../t/compat/inc-propagation.t | 54 + .../libtest-harness-perl-3.12/t/compat/inc_taint.t | 45 + .../libtest-harness-perl-3.12/t/compat/nonumbers.t | 14 + .../t/compat/regression.t | 17 + .../t/compat/test-harness-compat.t | 857 +++ .../libtest-harness-perl-3.12/t/compat/version.t | 11 + .../libtest-harness-perl-3.12/t/console.t | 47 + .../libtest-harness-perl-3.12/t/data/catme.1 | 2 + .../libtest-harness-perl-3.12/t/data/proverc | 7 + .../libtest-harness-perl-3.12/t/data/sample.yml | 29 + .../libtest-harness-perl-3.12/t/errors.t | 183 + .../libtest-harness-perl-3.12/t/grammar.t | 452 ++ .../libtest-harness-perl-3.12/t/harness.t | 889 +++ .../libtest-harness-perl-3.12/t/iterators.t | 212 + .../t/lib/App/Prove/Plugin/Dummy.pm | 7 + .../libtest-harness-perl-3.12/t/lib/Dev/Null.pm | 18 + .../libtest-harness-perl-3.12/t/lib/EmptyParser.pm | 30 + .../t/lib/IO/c55Capture.pm | 120 + .../libtest-harness-perl-3.12/t/lib/MyCustom.pm | 12 + .../libtest-harness-perl-3.12/t/lib/MyGrammar.pm | 21 + .../libtest-harness-perl-3.12/t/lib/MyIterator.pm | 26 + .../t/lib/MyIteratorFactory.pm | 19 + .../t/lib/MyPerlSource.pm | 27 + .../libtest-harness-perl-3.12/t/lib/MyResult.pm | 21 + .../t/lib/MyResultFactory.pm | 22 + .../libtest-harness-perl-3.12/t/lib/MySource.pm | 34 + .../libtest-harness-perl-3.12/t/lib/NoFork.pm | 21 + .../t/lib/TAP/Parser/SubclassTest.pm | 39 + .../t/lib/Test/Builder.pm | 1850 +++++++ .../t/lib/Test/Builder/Module.pm | 177 + .../libtest-harness-perl-3.12/t/lib/Test/More.pm | 1546 ++++++ .../libtest-harness-perl-3.12/t/lib/Test/Simple.pm | 228 + .../libtest-harness-perl-3.12/t/lib/if.pm | 57 + .../libtest-harness-perl-3.12/t/multiplexer.t | 167 + .../libtest-harness-perl-3.12/t/nofork-mux.t | 17 + .../libtest-harness-perl-3.12/t/nofork.t | 68 + .../libtest-harness-perl-3.12/t/object.t | 37 + .../libtest-harness-perl-3.12/t/parse.t | 1040 ++++ .../libtest-harness-perl-3.12/t/parser-config.t | 46 + .../libtest-harness-perl-3.12/t/parser-subclass.t | 88 + .../t/premature-bailout.t | 126 + .../libtest-harness-perl-3.12/t/process.t | 52 + .../libtest-harness-perl-3.12/t/prove.t | 1387 +++++ .../libtest-harness-perl-3.12/t/proverc.t | 32 + .../libtest-harness-perl-3.12/t/proverun.t | 165 + .../libtest-harness-perl-3.12/t/regression.t | 3181 +++++++++++ .../libtest-harness-perl-3.12/t/results.t | 294 + .../t/sample-tests/bailout | 11 + .../t/sample-tests/bignum | 7 + .../t/sample-tests/bignum_many | 14 + .../t/sample-tests/combined | 13 + .../t/sample-tests/combined_compat | 13 + .../t/sample-tests/delayed | 33 + .../t/sample-tests/descriptive | 8 + .../t/sample-tests/descriptive_trailing | 8 + .../libtest-harness-perl-3.12/t/sample-tests/die | 2 + .../t/sample-tests/die_head_end | 9 + .../t/sample-tests/die_last_minute | 10 + .../t/sample-tests/die_unfinished | 9 + .../t/sample-tests/duplicates | 14 + .../libtest-harness-perl-3.12/t/sample-tests/echo | 2 + .../libtest-harness-perl-3.12/t/sample-tests/empty | 2 + .../t/sample-tests/escape_eol | 5 + .../t/sample-tests/escape_hash | 6 + .../t/sample-tests/head_end | 11 + .../t/sample-tests/head_fail | 11 + .../t/sample-tests/inc_taint | 15 + .../t/sample-tests/junk_before_plan | 6 + .../t/sample-tests/lone_not_bug | 9 + .../t/sample-tests/no_nums | 8 + .../t/sample-tests/no_output | 3 + .../t/sample-tests/out_err_mix | 13 + .../t/sample-tests/out_of_order | 22 + .../t/sample-tests/schwern | 3 + .../t/sample-tests/schwern-todo-quiet | 13 + .../t/sample-tests/segfault | 5 + .../t/sample-tests/sequence_misparse | 14 + .../t/sample-tests/shbang_misparse | 12 + .../t/sample-tests/simple | 8 + .../t/sample-tests/simple_fail | 8 + .../t/sample-tests/simple_yaml | 27 + .../libtest-harness-perl-3.12/t/sample-tests/skip | 8 + .../t/sample-tests/skip_nomsg | 4 + .../t/sample-tests/skipall | 3 + .../t/sample-tests/skipall_nomsg | 2 + .../t/sample-tests/skipall_v13 | 4 + .../t/sample-tests/space_after_plan | 3 + .../t/sample-tests/stdout_stderr | 14 + .../t/sample-tests/strict | 9 + .../t/sample-tests/switches | 2 + .../libtest-harness-perl-3.12/t/sample-tests/taint | 7 + .../t/sample-tests/taint_warn | 11 + .../libtest-harness-perl-3.12/t/sample-tests/todo | 8 + .../t/sample-tests/todo_inline | 6 + .../t/sample-tests/todo_misparse | 5 + .../t/sample-tests/too_many | 14 + .../t/sample-tests/version_good | 9 + .../t/sample-tests/version_late | 9 + .../t/sample-tests/version_old | 9 + .../t/sample-tests/vms_nit | 6 + .../t/sample-tests/with_comments | 14 + .../libtest-harness-perl-3.12/t/scheduler.t | 225 + .../libtest-harness-perl-3.12/t/source.t | 98 + .../t/source_tests/harness | 6 + .../t/source_tests/harness_badtap | 8 + .../t/source_tests/harness_complain | 7 + .../t/source_tests/harness_directives | 8 + .../t/source_tests/harness_failure | 7 + .../t/source_tests/source | 15 + .../libtest-harness-perl-3.12/t/spool.t | 145 + .../libtest-harness-perl-3.12/t/state.t | 252 + .../libtest-harness-perl-3.12/t/streams.t | 171 + .../t/subclass_tests/non_perl_source | 3 + .../t/subclass_tests/perl_source | 6 + .../libtest-harness-perl-3.12/t/taint.t | 79 + .../libtest-harness-perl-3.12/t/testargs.t | 131 + .../libtest-harness-perl-3.12/t/unicode.t | 125 + .../libtest-harness-perl-3.12/t/utils.t | 65 + .../libtest-harness-perl-3.12/t/yamlish-output.t | 100 + .../libtest-harness-perl-3.12/t/yamlish-writer.t | 274 + .../libtest-harness-perl-3.12/t/yamlish.t | 529 ++ .../xt/author/pod-coverage.t | 21 + .../libtest-harness-perl-3.12/xt/author/pod.t | 11 + .../libtest-harness-perl-3.12/xt/author/stdin.t | 8 + .../xt/perls/harness_perl.t | 73 + .../xt/perls/sample-tests/perl_version | 5 + .../libtest-pod-coverage-perl-1.08/Changes | 60 + .../libtest-pod-coverage-perl-1.08/Coverage.pm | 305 + .../libtest-pod-coverage-perl-1.08/MANIFEST | 22 + .../libtest-pod-coverage-perl-1.08/META.yml | 13 + .../libtest-pod-coverage-perl-1.08/Makefile.PL | 16 + .../debian/changelog | 56 + .../libtest-pod-coverage-perl-1.08/debian/compat | 1 + .../libtest-pod-coverage-perl-1.08/debian/control | 25 + .../debian/copyright | 22 + .../libtest-pod-coverage-perl-1.08/debian/rules | 75 + .../libtest-pod-coverage-perl-1.08/debian/watch | 2 + .../libtest-pod-coverage-perl-1.08/t/00.load.t | 7 + .../libtest-pod-coverage-perl-1.08/t/Nopod.pm | 9 + .../libtest-pod-coverage-perl-1.08/t/Nosymbols.pm | 13 + .../t/PC_Inherited.pm | 15 + .../t/PC_Inherits.pm | 13 + .../libtest-pod-coverage-perl-1.08/t/Privates.pm | 33 + .../libtest-pod-coverage-perl-1.08/t/Simple.pm | 31 + .../libtest-pod-coverage-perl-1.08/t/all_modules.t | 18 + .../t/all_pod_coverage_ok.t | 6 + .../libtest-pod-coverage-perl-1.08/t/alt_class.t | 21 + .../libtest-pod-coverage-perl-1.08/t/nopod.t | 16 + .../libtest-pod-coverage-perl-1.08/t/nosymbols.t | 24 + .../libtest-pod-coverage-perl-1.08/t/parms.t | 16 + .../libtest-pod-coverage-perl-1.08/t/pod.t | 6 + .../libtest-pod-coverage-perl-1.08/t/privates.t | 37 + .../libtest-pod-coverage-perl-1.08/t/self.t | 7 + .../libtest-pod-coverage-perl-1.08/t/simple.t | 21 + .../libtest-pod-perl/libtest-pod-perl-1.26/Changes | 132 + .../libtest-pod-perl-1.26/MANIFEST | 26 + .../libtest-pod-perl-1.26/META.yml | 14 + .../libtest-pod-perl-1.26/Makefile.PL | 15 + .../libtest-pod-perl/libtest-pod-perl-1.26/Pod.pm | 270 + .../libtest-pod-perl-1.26/debian/changelog | 93 + .../libtest-pod-perl-1.26/debian/compat | 1 + .../libtest-pod-perl-1.26/debian/control | 23 + .../libtest-pod-perl-1.26/debian/copyright | 36 + .../libtest-pod-perl-1.26/debian/rules | 70 + .../libtest-pod-perl-1.26/debian/watch | 2 + .../libtest-pod-perl-1.26/t/00-load.t | 11 + .../libtest-pod-perl-1.26/t/all_pod_files.t | 33 + .../libtest-pod-perl-1.26/t/cut-outside-block.pod | 13 + .../libtest-pod-perl-1.26/t/cut-outside-block.t | 21 + .../libtest-pod-perl-1.26/t/good.t | 24 + .../libtest-pod-perl-1.26/t/item-ordering.pod | 45 + .../libtest-pod-perl-1.26/t/item-ordering.t | 19 + .../libtest-pod-perl-1.26/t/load.t | 7 + .../libtest-pod-perl-1.26/t/missing-file.t | 29 + .../libtest-pod-perl/libtest-pod-perl-1.26/t/pod.t | 5 + .../libtest-pod-perl-1.26/t/pod/good-pod-script | 19 + .../libtest-pod-perl-1.26/t/pod/good.pod | 17 + .../libtest-pod-perl-1.26/t/pod/no_pod.pod | 7 + .../libtest-pod-perl-1.26/t/selftest.t | 12 + .../libtest-pod-perl-1.26/t/spaced-directives.pod | 20 + .../libtest-pod-perl-1.26/t/spaced-directives.t | 22 + .../libtest-pod-perl-1.26/t/unknown-directive.pod | 25 + .../libtest-pod-perl-1.26/t/unknown-directive.t | 21 + .../libtest-simple-perl-0.80/Changes | 597 ++ .../libtest-simple-perl-0.80/MANIFEST | 107 + .../libtest-simple-perl-0.80/META.yml | 14 + .../libtest-simple-perl-0.80/Makefile.PL | 56 + .../libtest-simple-perl-0.80/README | 15 + .../libtest-simple-perl-0.80/SIGNATURE | 129 + .../libtest-simple-perl-0.80/TODO | 18 + .../libtest-simple-perl-0.80/debian/changelog | 42 + .../libtest-simple-perl-0.80/debian/compat | 1 + .../libtest-simple-perl-0.80/debian/control | 29 + .../libtest-simple-perl-0.80/debian/copyright | 19 + .../debian/libtest-simple-perl.docs | 1 + .../libtest-simple-perl-0.80/debian/rules | 3 + .../libtest-simple-perl-0.80/debian/watch | 2 + .../libtest-simple-perl-0.80/lib/Test/Builder.pm | 1873 +++++++ .../lib/Test/Builder/Module.pm | 185 + .../lib/Test/Builder/Tester.pm | 646 +++ .../lib/Test/Builder/Tester/Color.pm | 50 + .../libtest-simple-perl-0.80/lib/Test/More.pm | 1569 ++++++ .../libtest-simple-perl-0.80/lib/Test/Simple.pm | 230 + .../libtest-simple-perl-0.80/lib/Test/Tutorial.pod | 603 ++ .../t/00test_harness_check.t | 26 + .../libtest-simple-perl-0.80/t/BEGIN_require_ok.t | 24 + .../libtest-simple-perl-0.80/t/BEGIN_use_ok.t | 28 + .../libtest-simple-perl-0.80/t/Builder.t | 30 + .../libtest-simple-perl-0.80/t/More.t | 174 + .../libtest-simple-perl-0.80/t/bad_plan.t | 38 + .../libtest-simple-perl-0.80/t/bail_out.t | 51 + .../libtest-simple-perl-0.80/t/buffer.t | 22 + .../libtest-simple-perl-0.80/t/carp.t | 32 + .../libtest-simple-perl-0.80/t/circular_data.t | 71 + .../libtest-simple-perl-0.80/t/cmp_ok.t | 82 + .../libtest-simple-perl-0.80/t/create.t | 45 + .../libtest-simple-perl-0.80/t/curr_test.t | 11 + .../libtest-simple-perl-0.80/t/details.t | 107 + .../libtest-simple-perl-0.80/t/diag.t | 72 + .../t/dont_overwrite_die_handler.t | 19 + .../libtest-simple-perl-0.80/t/eq_set.t | 34 + .../libtest-simple-perl-0.80/t/exit.t | 97 + .../libtest-simple-perl-0.80/t/extra.t | 59 + .../libtest-simple-perl-0.80/t/extra_one.t | 52 + .../libtest-simple-perl-0.80/t/fail-like.t | 67 + .../libtest-simple-perl-0.80/t/fail-more.t | 325 ++ .../libtest-simple-perl-0.80/t/fail.t | 72 + .../libtest-simple-perl-0.80/t/fail_one.t | 62 + .../libtest-simple-perl-0.80/t/filehandles.t | 18 + .../libtest-simple-perl-0.80/t/fork.t | 32 + .../libtest-simple-perl-0.80/t/harness_active.t | 88 + .../libtest-simple-perl-0.80/t/has_plan.t | 23 + .../libtest-simple-perl-0.80/t/has_plan2.t | 22 + .../libtest-simple-perl-0.80/t/import.t | 12 + .../libtest-simple-perl-0.80/t/is_deeply_dne_bug.t | 56 + .../libtest-simple-perl-0.80/t/is_deeply_fail.t | 373 ++ .../t/is_deeply_with_threads.t | 65 + .../libtest-simple-perl-0.80/t/is_fh.t | 48 + .../libtest-simple-perl-0.80/t/lib/Dev/Null.pm | 6 + .../libtest-simple-perl-0.80/t/lib/Dummy.pm | 5 + .../libtest-simple-perl-0.80/t/lib/MyOverload.pm | 29 + .../libtest-simple-perl-0.80/t/lib/NoExporter.pm | 10 + .../t/lib/Test/Simple/Catch.pm | 18 + .../t/lib/Test/Simple/sample_tests/death.plx | 15 + .../lib/Test/Simple/sample_tests/death_in_eval.plx | 22 + .../Simple/sample_tests/death_with_handler.plx | 18 + .../t/lib/Test/Simple/sample_tests/exit.plx | 3 + .../t/lib/Test/Simple/sample_tests/extras.plx | 16 + .../t/lib/Test/Simple/sample_tests/five_fail.plx | 13 + .../Test/Simple/sample_tests/last_minute_death.plx | 18 + .../t/lib/Test/Simple/sample_tests/one_fail.plx | 14 + .../Test/Simple/sample_tests/pre_plan_death.plx | 17 + .../t/lib/Test/Simple/sample_tests/require.plx | 1 + .../t/lib/Test/Simple/sample_tests/success.plx | 13 + .../t/lib/Test/Simple/sample_tests/too_few.plx | 11 + .../lib/Test/Simple/sample_tests/too_few_fail.plx | 12 + .../t/lib/Test/Simple/sample_tests/two_fail.plx | 14 + .../libtest-simple-perl-0.80/t/lib/TieOut.pm | 28 + .../libtest-simple-perl-0.80/t/maybe_regex.t | 60 + .../libtest-simple-perl-0.80/t/missing.t | 52 + .../libtest-simple-perl-0.80/t/no_diag.t | 8 + .../libtest-simple-perl-0.80/t/no_ending.t | 21 + .../libtest-simple-perl-0.80/t/no_header.t | 21 + .../libtest-simple-perl-0.80/t/no_plan.t | 28 + .../libtest-simple-perl-0.80/t/ok_obj.t | 29 + .../libtest-simple-perl-0.80/t/output.t | 95 + .../libtest-simple-perl-0.80/t/overload.t | 74 + .../libtest-simple-perl-0.80/t/overload_threads.t | 69 + .../libtest-simple-perl-0.80/t/plan.t | 21 + .../libtest-simple-perl-0.80/t/plan_bad.t | 34 + .../libtest-simple-perl-0.80/t/plan_is_noplan.t | 54 + .../libtest-simple-perl-0.80/t/plan_no_plan.t | 40 + .../t/plan_shouldnt_import.t | 16 + .../libtest-simple-perl-0.80/t/plan_skip_all.t | 12 + .../libtest-simple-perl-0.80/t/pod-coverage.t | 27 + .../libtest-simple-perl-0.80/t/pod.t | 6 + .../libtest-simple-perl-0.80/t/require_ok.t | 29 + .../libtest-simple-perl-0.80/t/reset.t | 89 + .../libtest-simple-perl-0.80/t/simple.t | 17 + .../libtest-simple-perl-0.80/t/skip.t | 98 + .../libtest-simple-perl-0.80/t/skipall.t | 44 + .../t/tbm_doesnt_set_exported_to.t | 24 + .../libtest-simple-perl-0.80/t/tbt_01basic.t | 55 + .../libtest-simple-perl-0.80/t/tbt_02fhrestore.t | 58 + .../libtest-simple-perl-0.80/t/tbt_03die.t | 12 + .../libtest-simple-perl-0.80/t/tbt_04line_num.t | 8 + .../libtest-simple-perl-0.80/t/tbt_05faildiag.t | 44 + .../libtest-simple-perl-0.80/t/tbt_06errormess.t | 120 + .../libtest-simple-perl-0.80/t/tbt_07args.t | 215 + .../libtest-simple-perl-0.80/t/thread_taint.t | 5 + .../libtest-simple-perl-0.80/t/threads.t | 33 + .../libtest-simple-perl-0.80/t/todo.t | 88 + .../libtest-simple-perl-0.80/t/try.t | 35 + .../libtest-simple-perl-0.80/t/undef.t | 92 + .../libtest-simple-perl-0.80/t/use_ok.t | 60 + .../libtest-simple-perl-0.80/t/useing.t | 19 + .../libtest-simple-perl-0.80/t/utf8.t | 69 + .../libtest-warn-perl-0.11/Changes | 61 + .../libtest-warn-perl-0.11/MANIFEST | 13 + .../libtest-warn-perl-0.11/META.yml | 21 + .../libtest-warn-perl-0.11/Makefile.PL | 23 + .../libtest-warn-perl-0.11/README | 76 + .../libtest-warn-perl-0.11/Warn.pm | 487 ++ .../libtest-warn-perl-0.11/debian/README.source | 3 + .../libtest-warn-perl-0.11/debian/changelog | 57 + .../libtest-warn-perl-0.11/debian/compat | 1 + .../libtest-warn-perl-0.11/debian/control | 22 + .../libtest-warn-perl-0.11/debian/copyright | 16 + .../debian/patches/language.patch | 297 + .../libtest-warn-perl-0.11/debian/patches/series | 1 + .../libtest-warn-perl-0.11/debian/rules | 62 + .../libtest-warn-perl-0.11/debian/watch | 2 + .../libtest-warn-perl/libtest-warn-perl-0.11/t/1.t | 17 + .../libtest-warn-perl-0.11/t/carped.t | 66 + .../libtest-warn-perl-0.11/t/pod.t | 6 + .../libtest-warn-perl-0.11/t/warning_is.t | 104 + .../libtest-warn-perl-0.11/t/warning_like.t | 106 + .../libtest-warn-perl-0.11/t/warnings_are.t | 101 + .../libtest-warn-perl-0.11/t/warnings_like.t | 103 + .../libtest-warn-perl_0.10-1.diff.gz | Bin 5351 -> 0 bytes .../libtest-warn-perl/libtest-warn-perl_0.10-1.dsc | 22 - .../libtest-warn-perl_0.10.orig.tar.gz | Bin 9624 -> 0 bytes .../libtest-warn-perl_0.11-1.diff.gz | Bin 0 -> 6133 bytes .../libtest-warn-perl/libtest-warn-perl_0.11-1.dsc | 33 + .../libtest-warn-perl_0.11.orig.tar.gz | Bin 0 -> 9661 bytes .../libtree-dagnode-perl-1.06/ChangeLog | 88 + .../libtree-dagnode-perl-1.06/MANIFEST | 9 + .../libtree-dagnode-perl-1.06/MANIFEST.SKIP | 7 + .../libtree-dagnode-perl-1.06/META.yml | 16 + .../libtree-dagnode-perl-1.06/Makefile.PL | 25 + .../libtree-dagnode-perl-1.06/README | 125 + .../libtree-dagnode-perl-1.06/debian/changelog | 46 + .../libtree-dagnode-perl-1.06/debian/compat | 1 + .../libtree-dagnode-perl-1.06/debian/control | 26 + .../libtree-dagnode-perl-1.06/debian/copyright | 25 + .../libtree-dagnode-perl-1.06/debian/rules | 56 + .../libtree-dagnode-perl-1.06/debian/watch | 2 + .../libtree-dagnode-perl-1.06/lib/Tree/DAG_Node.pm | 2942 ++++++++++ .../libtree-dagnode-perl-1.06/t/00_about_verbose.t | 84 + .../libtree-dagnode-perl-1.06/t/01_old_junk.t | 21 + .../liburi-perl/liburi-perl-1.35.dfsg.1/Changes | 646 +++ .../liburi-perl/liburi-perl-1.35.dfsg.1/MANIFEST | 92 + .../liburi-perl-1.35.dfsg.1/Makefile.PL | 26 + .../liburi-perl/liburi-perl-1.35.dfsg.1/README | 30 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI.pm | 1019 ++++ .../liburi-perl-1.35.dfsg.1/URI/Escape.pm | 218 + .../liburi-perl-1.35.dfsg.1/URI/Heuristic.pm | 224 + .../liburi-perl-1.35.dfsg.1/URI/QueryParam.pm | 200 + .../liburi-perl-1.35.dfsg.1/URI/Split.pm | 96 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/URL.pm | 305 + .../liburi-perl-1.35.dfsg.1/URI/WithBase.pm | 171 + .../liburi-perl-1.35.dfsg.1/URI/_foreign.pm | 6 + .../liburi-perl-1.35.dfsg.1/URI/_generic.pm | 249 + .../liburi-perl-1.35.dfsg.1/URI/_ldap.pm | 140 + .../liburi-perl-1.35.dfsg.1/URI/_login.pm | 10 + .../liburi-perl-1.35.dfsg.1/URI/_query.pm | 81 + .../liburi-perl-1.35.dfsg.1/URI/_segment.pm | 20 + .../liburi-perl-1.35.dfsg.1/URI/_server.pm | 106 + .../liburi-perl-1.35.dfsg.1/URI/_userpass.pm | 51 + .../liburi-perl-1.35.dfsg.1/URI/data.pm | 139 + .../liburi-perl-1.35.dfsg.1/URI/file.pm | 329 ++ .../liburi-perl-1.35.dfsg.1/URI/file/Base.pm | 80 + .../liburi-perl-1.35.dfsg.1/URI/file/FAT.pm | 23 + .../liburi-perl-1.35.dfsg.1/URI/file/Mac.pm | 120 + .../liburi-perl-1.35.dfsg.1/URI/file/OS2.pm | 28 + .../liburi-perl-1.35.dfsg.1/URI/file/QNX.pm | 18 + .../liburi-perl-1.35.dfsg.1/URI/file/Unix.pm | 55 + .../liburi-perl-1.35.dfsg.1/URI/file/Win32.pm | 84 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/ftp.pm | 45 + .../liburi-perl-1.35.dfsg.1/URI/gopher.pm | 94 + .../liburi-perl-1.35.dfsg.1/URI/http.pm | 25 + .../liburi-perl-1.35.dfsg.1/URI/https.pm | 7 + .../liburi-perl-1.35.dfsg.1/URI/ldap.pm | 122 + .../liburi-perl-1.35.dfsg.1/URI/ldapi.pm | 30 + .../liburi-perl-1.35.dfsg.1/URI/ldaps.pm | 7 + .../liburi-perl-1.35.dfsg.1/URI/mailto.pm | 72 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/mms.pm | 8 + .../liburi-perl-1.35.dfsg.1/URI/news.pm | 68 + .../liburi-perl-1.35.dfsg.1/URI/nntp.pm | 6 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/pop.pm | 68 + .../liburi-perl-1.35.dfsg.1/URI/rlogin.pm | 7 + .../liburi-perl-1.35.dfsg.1/URI/rsync.pm | 12 + .../liburi-perl-1.35.dfsg.1/URI/rtsp.pm | 8 + .../liburi-perl-1.35.dfsg.1/URI/rtspu.pm | 8 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/sip.pm | 86 + .../liburi-perl-1.35.dfsg.1/URI/sips.pm | 7 + .../liburi-perl-1.35.dfsg.1/URI/snews.pm | 8 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/ssh.pm | 9 + .../liburi-perl-1.35.dfsg.1/URI/telnet.pm | 7 + .../liburi-perl-1.35.dfsg.1/URI/tn3270.pm | 7 + .../liburi-perl/liburi-perl-1.35.dfsg.1/URI/urn.pm | 97 + .../liburi-perl-1.35.dfsg.1/URI/urn/isbn.pm | 58 + .../liburi-perl-1.35.dfsg.1/URI/urn/oid.pm | 18 + .../liburi-perl-1.35.dfsg.1/debian/README.debian | 16 + .../liburi-perl-1.35.dfsg.1/debian/changelog | 164 + .../liburi-perl-1.35.dfsg.1/debian/compat | 1 + .../liburi-perl-1.35.dfsg.1/debian/control | 29 + .../liburi-perl-1.35.dfsg.1/debian/copyright | 17 + .../liburi-perl-1.35.dfsg.1/debian/dirs | 1 + .../liburi-perl-1.35.dfsg.1/debian/docs | 1 + .../debian/postinst.debhelper | 7 + .../liburi-perl-1.35.dfsg.1/debian/prerm.debhelper | 5 + .../liburi-perl-1.35.dfsg.1/debian/rules | 83 + .../liburi-perl-1.35.dfsg.1/debian/watch | 2 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/abs.t | 171 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/clone.t | 21 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/data.t | 108 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/escape.t | 48 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/file.t | 62 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/ftp.t | 53 + .../liburi-perl-1.35.dfsg.1/t/generic.t | 218 + .../liburi-perl-1.35.dfsg.1/t/heuristic.t | 96 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/http.t | 57 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/ldap.t | 114 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/mailto.t | 47 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/mix.t | 79 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/mms.t | 37 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/news.t | 50 + .../liburi-perl-1.35.dfsg.1/t/old-absconf.t | 37 + .../liburi-perl-1.35.dfsg.1/t/old-base.t | 1023 ++++ .../liburi-perl-1.35.dfsg.1/t/old-file.t | 80 + .../liburi-perl-1.35.dfsg.1/t/old-relbase.t | 36 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/pop.t | 49 + .../liburi-perl-1.35.dfsg.1/t/query-param.t | 87 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/query.t | 87 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/rel.t | 21 + .../liburi-perl-1.35.dfsg.1/t/rfc2732.t | 46 + .../liburi-perl-1.35.dfsg.1/t/roy-test.t | 50 + .../liburi-perl-1.35.dfsg.1/t/roytest1.html | 194 + .../liburi-perl-1.35.dfsg.1/t/roytest2.html | 100 + .../liburi-perl-1.35.dfsg.1/t/roytest3.html | 89 + .../liburi-perl-1.35.dfsg.1/t/roytest4.html | 98 + .../liburi-perl-1.35.dfsg.1/t/roytest5.html | 92 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/rsync.t | 23 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/rtsp.t | 42 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/sip.t | 69 + .../liburi-perl/liburi-perl-1.35.dfsg.1/t/split.t | 59 + .../liburi-perl-1.35.dfsg.1/t/storable-test.pl | 28 + .../liburi-perl-1.35.dfsg.1/t/storable.t | 15 + .../liburi-perl-1.35.dfsg.1/t/urn-isbn.t | 61 + .../liburi-perl-1.35.dfsg.1/t/urn-oid.t | 24 + .../liburi-perl/liburi-perl-1.35.dfsg.1/uri-test | 55 + .../libwww-mechanize-perl-1.34/Changes | 1088 ++++ .../libwww-mechanize-perl-1.34/MANIFEST | 82 + .../libwww-mechanize-perl-1.34/META.yml | 37 + .../libwww-mechanize-perl-1.34/Makefile.PL | 117 + .../libwww-mechanize-perl-1.34/bin/mech-dump | 116 + .../libwww-mechanize-perl-1.34/debian/changelog | 170 + .../libwww-mechanize-perl-1.34/debian/compat | 1 + .../libwww-mechanize-perl-1.34/debian/control | 22 + .../libwww-mechanize-perl-1.34/debian/copyright | 38 + .../debian/patches/adding_pod_see_also.patch | 56 + .../debian/patches/no_internet.patch | 31 + .../debian/patches/series | 2 + .../libwww-mechanize-perl-1.34/debian/rules | 63 + .../libwww-mechanize-perl-1.34/debian/watch | 2 + .../etc/www-mechanize-logo.png | Bin 0 -> 38991 bytes .../lib/WWW/Mechanize.pm | 2732 +++++++++ .../lib/WWW/Mechanize/Cookbook.pod | 81 + .../lib/WWW/Mechanize/Examples.pod | 561 ++ .../lib/WWW/Mechanize/FAQ.pod | 395 ++ .../lib/WWW/Mechanize/Image.pm | 127 + .../lib/WWW/Mechanize/Link.pm | 125 + .../libwww-mechanize-perl-1.34/perlcriticrc | 28 + .../libwww-mechanize-perl-1.34/t/00-load.t | 10 + .../libwww-mechanize-perl-1.34/t/add_header.t | 23 + .../libwww-mechanize-perl-1.34/t/aliases.t | 16 + .../libwww-mechanize-perl-1.34/t/area_link.html | 20 + .../libwww-mechanize-perl-1.34/t/area_link.t | 74 + .../libwww-mechanize-perl-1.34/t/autocheck.t | 41 + .../libwww-mechanize-perl-1.34/t/clone.t | 15 + .../libwww-mechanize-perl-1.34/t/die.t | 34 + .../libwww-mechanize-perl-1.34/t/field.html | 14 + .../libwww-mechanize-perl-1.34/t/field.t | 30 + .../libwww-mechanize-perl-1.34/t/find_frame.html | 9 + .../libwww-mechanize-perl-1.34/t/find_frame.t | 24 + .../libwww-mechanize-perl-1.34/t/find_image.t | 44 + .../libwww-mechanize-perl-1.34/t/find_inputs.html | 26 + .../libwww-mechanize-perl-1.34/t/find_inputs.t | 52 + .../t/find_link-warnings.t | 62 + .../libwww-mechanize-perl-1.34/t/find_link.html | 40 + .../libwww-mechanize-perl-1.34/t/find_link.t | 146 + .../libwww-mechanize-perl-1.34/t/find_link_id.html | 32 + .../libwww-mechanize-perl-1.34/t/find_link_id.t | 43 + .../libwww-mechanize-perl-1.34/t/form-parsing.t | 25 + .../libwww-mechanize-perl-1.34/t/frames.html | 13 + .../libwww-mechanize-perl-1.34/t/frames.t | 29 + .../libwww-mechanize-perl-1.34/t/google.html | 14 + .../libwww-mechanize-perl-1.34/t/image-new.t | 31 + .../libwww-mechanize-perl-1.34/t/image-parse.html | 19 + .../libwww-mechanize-perl-1.34/t/image-parse.t | 40 + .../libwww-mechanize-perl-1.34/t/link-base.t | 20 + .../libwww-mechanize-perl-1.34/t/link-relative.t | 29 + .../libwww-mechanize-perl-1.34/t/link.t | 58 + .../t/live/computers4sure.t | 44 + .../libwww-mechanize-perl-1.34/t/live/wikipedia.t | 33 + .../t/local/LocalServer.pm | 198 + .../libwww-mechanize-perl-1.34/t/local/back.t | 174 + .../libwww-mechanize-perl-1.34/t/local/click.t | 35 + .../t/local/click_button.t | 56 + .../libwww-mechanize-perl-1.34/t/local/failure.t | 58 + .../libwww-mechanize-perl-1.34/t/local/follow.t | 49 + .../libwww-mechanize-perl-1.34/t/local/form.t | 35 + .../libwww-mechanize-perl-1.34/t/local/get.t | 74 + .../libwww-mechanize-perl-1.34/t/local/log-server | 111 + .../libwww-mechanize-perl-1.34/t/local/overload.t | 91 + .../t/local/page_stack.t | 49 + .../t/local/referer-server | 21 + .../libwww-mechanize-perl-1.34/t/local/referer.t | 70 + .../libwww-mechanize-perl-1.34/t/local/reload.t | 54 + .../libwww-mechanize-perl-1.34/t/local/submit.t | 44 + .../t/mech-dump/mech-dump.t | 65 + .../libwww-mechanize-perl-1.34/t/new.t | 45 + .../libwww-mechanize-perl-1.34/t/pod-coverage.t | 8 + .../libwww-mechanize-perl-1.34/t/pod.t | 8 + .../libwww-mechanize-perl-1.34/t/regex-error.t | 27 + .../libwww-mechanize-perl-1.34/t/save_content.t | 39 + .../libwww-mechanize-perl-1.34/t/select.html | 22 + .../libwww-mechanize-perl-1.34/t/select.t | 82 + .../libwww-mechanize-perl-1.34/t/taint.t | 30 + .../libwww-mechanize-perl-1.34/t/tick.html | 14 + .../libwww-mechanize-perl-1.34/t/tick.t | 37 + .../libwww-mechanize-perl-1.34/t/upload.html | 10 + .../libwww-mechanize-perl-1.34/t/upload.t | 42 + .../libwww-mechanize-perl-1.34/t/warn.t | 33 + .../libwww-mechanize-perl-1.34/t/warnings.t | 24 + dev/i386/libwww-perl/libwww-perl-5.813/AUTHORS | 120 + dev/i386/libwww-perl/libwww-perl-5.813/Changes | 3099 +++++++++++ dev/i386/libwww-perl/libwww-perl-5.813/MANIFEST | 124 + dev/i386/libwww-perl/libwww-perl-5.813/META.yml | 19 + dev/i386/libwww-perl/libwww-perl-5.813/Makefile.PL | 318 ++ dev/i386/libwww-perl/libwww-perl-5.813/README | 130 + dev/i386/libwww-perl/libwww-perl-5.813/README.SSL | 24 + .../libwww-perl/libwww-perl-5.813/bin/lwp-download | 320 ++ .../libwww-perl/libwww-perl-5.813/bin/lwp-mirror | 103 + .../libwww-perl/libwww-perl-5.813/bin/lwp-request | 549 ++ .../libwww-perl/libwww-perl-5.813/bin/lwp-rget | 607 ++ .../libwww-perl/libwww-perl-5.813/debian/changelog | 471 ++ .../libwww-perl/libwww-perl-5.813/debian/compat | 1 + .../libwww-perl/libwww-perl-5.813/debian/control | 32 + .../libwww-perl/libwww-perl-5.813/debian/copyright | 157 + .../libwww-perl-5.813/debian/libwww-perl.links | 6 + .../libwww-perl/libwww-perl-5.813/debian/rules | 64 + .../libwww-perl/libwww-perl-5.813/debian/watch | 2 + .../libwww-perl-5.813/lib/Bundle/LWP.pm | 43 + .../libwww-perl-5.813/lib/File/Listing.pm | 409 ++ .../libwww-perl/libwww-perl-5.813/lib/HTML/Form.pm | 1400 +++++ .../libwww-perl-5.813/lib/HTTP/Cookies.pm | 775 +++ .../lib/HTTP/Cookies/Microsoft.pm | 328 ++ .../libwww-perl-5.813/lib/HTTP/Cookies/Netscape.pm | 116 + .../libwww-perl-5.813/lib/HTTP/Daemon.pm | 885 +++ .../libwww-perl/libwww-perl-5.813/lib/HTTP/Date.pm | 389 ++ .../libwww-perl-5.813/lib/HTTP/Headers.pm | 737 +++ .../libwww-perl-5.813/lib/HTTP/Headers/Auth.pm | 98 + .../libwww-perl-5.813/lib/HTTP/Headers/ETag.pm | 94 + .../libwww-perl-5.813/lib/HTTP/Headers/Util.pm | 184 + .../libwww-perl-5.813/lib/HTTP/Message.pm | 762 +++ .../libwww-perl-5.813/lib/HTTP/Negotiate.pm | 529 ++ .../libwww-perl-5.813/lib/HTTP/Request.pm | 210 + .../libwww-perl-5.813/lib/HTTP/Request/Common.pm | 493 ++ .../libwww-perl-5.813/lib/HTTP/Response.pm | 559 ++ .../libwww-perl-5.813/lib/HTTP/Status.pm | 247 + dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP.pm | 655 +++ .../libwww-perl-5.813/lib/LWP/Authen/Basic.pm | 36 + .../libwww-perl-5.813/lib/LWP/Authen/Digest.pm | 90 + .../libwww-perl-5.813/lib/LWP/Authen/Ntlm.pm | 195 + .../libwww-perl-5.813/lib/LWP/ConnCache.pm | 310 ++ .../libwww-perl/libwww-perl-5.813/lib/LWP/Debug.pm | 134 + .../libwww-perl-5.813/lib/LWP/DebugFile.pm | 220 + .../libwww-perl-5.813/lib/LWP/MediaTypes.pm | 299 + .../libwww-perl-5.813/lib/LWP/MemberMixin.pm | 44 + .../libwww-perl-5.813/lib/LWP/Protocol.pm | 290 + .../libwww-perl-5.813/lib/LWP/Protocol/GHTTP.pm | 73 + .../libwww-perl-5.813/lib/LWP/Protocol/cpan.pm | 72 + .../libwww-perl-5.813/lib/LWP/Protocol/data.pm | 52 + .../libwww-perl-5.813/lib/LWP/Protocol/file.pm | 148 + .../libwww-perl-5.813/lib/LWP/Protocol/ftp.pm | 562 ++ .../libwww-perl-5.813/lib/LWP/Protocol/gopher.pm | 214 + .../libwww-perl-5.813/lib/LWP/Protocol/http.pm | 471 ++ .../libwww-perl-5.813/lib/LWP/Protocol/http10.pm | 303 + .../libwww-perl-5.813/lib/LWP/Protocol/https.pm | 46 + .../libwww-perl-5.813/lib/LWP/Protocol/https10.pm | 75 + .../libwww-perl-5.813/lib/LWP/Protocol/loopback.pm | 26 + .../libwww-perl-5.813/lib/LWP/Protocol/mailto.pm | 183 + .../libwww-perl-5.813/lib/LWP/Protocol/nntp.pm | 150 + .../libwww-perl-5.813/lib/LWP/Protocol/nogo.pm | 24 + .../libwww-perl-5.813/lib/LWP/RobotUA.pm | 317 ++ .../libwww-perl-5.813/lib/LWP/Simple.pm | 352 ++ .../libwww-perl-5.813/lib/LWP/UserAgent.pm | 1424 +++++ .../libwww-perl-5.813/lib/LWP/media.types | 118 + .../libwww-perl/libwww-perl-5.813/lib/Net/HTTP.pm | 276 + .../libwww-perl-5.813/lib/Net/HTTP/Methods.pm | 558 ++ .../libwww-perl-5.813/lib/Net/HTTP/NB.pm | 105 + .../libwww-perl/libwww-perl-5.813/lib/Net/HTTPS.pm | 56 + .../libwww-perl-5.813/lib/WWW/RobotRules.pm | 444 ++ .../lib/WWW/RobotRules/AnyDBM_File.pm | 170 + dev/i386/libwww-perl/libwww-perl-5.813/lwpcook.pod | 309 ++ dev/i386/libwww-perl/libwww-perl-5.813/lwptut.pod | 837 +++ dev/i386/libwww-perl/libwww-perl-5.813/t/README | 24 + dev/i386/libwww-perl/libwww-perl-5.813/t/TEST | 44 + .../libwww-perl-5.813/t/base/common-req.t | 225 + .../libwww-perl/libwww-perl-5.813/t/base/cookies.t | 694 +++ .../libwww-perl/libwww-perl-5.813/t/base/date.t | 193 + .../libwww-perl-5.813/t/base/headers-auth.t | 41 + .../libwww-perl-5.813/t/base/headers-etag.t | 28 + .../libwww-perl-5.813/t/base/headers-util.t | 61 + .../libwww-perl/libwww-perl-5.813/t/base/headers.t | 428 ++ .../libwww-perl/libwww-perl-5.813/t/base/http.t | 203 + .../libwww-perl/libwww-perl-5.813/t/base/listing.t | 86 + .../libwww-perl-5.813/t/base/mediatypes.t | 113 + .../libwww-perl-5.813/t/base/message-old.t | 97 + .../libwww-perl-5.813/t/base/message-parts.t | 113 + .../libwww-perl/libwww-perl-5.813/t/base/message.t | 404 ++ .../libwww-perl-5.813/t/base/negotiate.t | 138 + .../libwww-perl-5.813/t/base/protocols.t | 28 + .../libwww-perl-5.813/t/base/response.t | 91 + .../libwww-perl/libwww-perl-5.813/t/base/status.t | 32 + dev/i386/libwww-perl/libwww-perl-5.813/t/base/ua.t | 53 + .../libwww-perl-5.813/t/html/form-maxlength.t | 68 + .../libwww-perl-5.813/t/html/form-multi-select.t | 97 + .../libwww-perl-5.813/t/html/form-param.t | 78 + .../libwww-perl/libwww-perl-5.813/t/html/form.t | 537 ++ .../libwww-perl-5.813/t/live/apache-listing.t | 24 + .../libwww-perl/libwww-perl-5.813/t/live/apache.t | 50 + .../libwww-perl/libwww-perl-5.813/t/live/https.t | 23 + .../libwww-perl-5.813/t/live/jigsaw-auth-b.t | 51 + .../libwww-perl-5.813/t/live/jigsaw-auth-d.t | 33 + .../libwww-perl-5.813/t/live/jigsaw-chunk.t | 37 + .../libwww-perl-5.813/t/live/jigsaw-md5-get.t | 29 + .../libwww-perl-5.813/t/live/jigsaw-md5.t | 26 + .../libwww-perl-5.813/t/live/jigsaw-neg-get.t | 16 + .../libwww-perl-5.813/t/live/jigsaw-neg.t | 15 + .../libwww-perl-5.813/t/live/jigsaw-te.t | 48 + .../libwww-perl-5.813/t/local/autoload-get.t | 26 + .../libwww-perl-5.813/t/local/autoload.t | 28 + .../libwww-perl-5.813/t/local/chunked.t | 164 + .../libwww-perl/libwww-perl-5.813/t/local/get.t | 94 + .../libwww-perl-5.813/t/local/http-get.t | 422 ++ .../libwww-perl/libwww-perl-5.813/t/local/http.t | 348 ++ .../libwww-perl-5.813/t/local/protosub.t | 75 + .../libwww-perl-5.813/t/net/cgi-bin/moved | 4 + .../libwww-perl-5.813/t/net/cgi-bin/nph-slowdata | 26 + .../libwww-perl-5.813/t/net/cgi-bin/slowread | 31 + .../libwww-perl-5.813/t/net/cgi-bin/test | 28 + .../libwww-perl-5.813/t/net/cgi-bin/timeout | 7 + .../libwww-perl-5.813/t/net/config.pl.dist | 10 + .../libwww-perl/libwww-perl-5.813/t/net/http-get.t | 45 + .../libwww-perl-5.813/t/net/http-post.t | 46 + .../libwww-perl-5.813/t/net/http-timeout.t | 41 + .../libwww-perl/libwww-perl-5.813/t/net/mirror.t | 36 + .../libwww-perl/libwww-perl-5.813/t/net/moved.t | 35 + .../libwww-perl/libwww-perl-5.813/t/net/proxy.t | 37 + .../libwww-perl-5.813/t/robot/rules-dbm.t | 128 + .../libwww-perl/libwww-perl-5.813/t/robot/rules.t | 228 + .../libwww-perl/libwww-perl-5.813/t/robot/ua-get.t | 156 + .../libwww-perl/libwww-perl-5.813/t/robot/ua.t | 151 + .../libwww-perl/libwww-perl-5.813/talk-to-ourself | 49 + dev/i386/libwww-perl/libwww-perl_5.812-1.diff.gz | Bin 8924 -> 0 bytes dev/i386/libwww-perl/libwww-perl_5.812-1.dsc | 33 - dev/i386/libwww-perl/libwww-perl_5.812.orig.tar.gz | Bin 242458 -> 0 bytes dev/i386/libwww-perl/libwww-perl_5.813-1.diff.gz | Bin 0 -> 9117 bytes dev/i386/libwww-perl/libwww-perl_5.813-1.dsc | 33 + dev/i386/libwww-perl/libwww-perl_5.813.orig.tar.gz | Bin 0 -> 244351 bytes 2045 files changed, 316199 insertions(+), 307 deletions(-) create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/COPYING create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/README create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Changes create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/MANIFEST create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Makefile.PL create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Strange.pm create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/test.pl create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Changes create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/MANIFEST create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Makefile.PL create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/README create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.pm create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.xs create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/test.pl create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/debian/changelog create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/debian/compat create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/debian/control create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/debian/copyright create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/debian/rules create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/dh-make-perl create mode 100644 dev/i386/dh-make-perl/dh-make-perl-0.47/overrides create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.noxs create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.xs create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.noxs create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.xs create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.noxs create mode 100755 dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.xs create mode 100644 dev/i386/dh-make-perl/dh-make-perl_0.47.dsc create mode 100644 dev/i386/dh-make-perl/dh-make-perl_0.47.tar.gz create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/Changes create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/INSTALL create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/LICENSE create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/MANIFEST create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/META.yml create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/Makefile.PL create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/README create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/bin/crc32 create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/changelog create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/compat create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/control create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/copyright create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/crc32.1 create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/docs create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/examples create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/manpages create mode 100755 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/rules create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/watch create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/Archive-Zip.pdf create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/ideas.txt create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/calcSizes.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/copy.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/extract.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mailZip.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mfh.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/readScalar.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/selfex.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/unzipAll.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateTree.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateZip.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar2.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zip.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipGrep.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipcheck.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipinfo.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziprecent.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziptest.pl create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Archive.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/BufferedFileHandle.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/DirectoryMember.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FAQ.pod create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FileMember.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Member.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MemberRead.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MockFileHandle.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/NewFileMember.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/StringMember.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Tree.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/ZipFileMember.pm create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/01_compile.t create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/02_main.t create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/03_ex.t create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/04_readmember.t create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/05_tree.t create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/06_update.t create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/99_author.t create mode 100755 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/badjpeg/expected.jpg create mode 100755 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/badjpeg/source.zip create mode 100644 dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/common.pl create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Build.PL create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Changes create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/MANIFEST create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/META.yml create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Makefile.PL create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/README create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/changelog create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/compat create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/control create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/copyright create mode 100755 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/rules create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/watch create mode 100755 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/lib/Array/Compare.pm create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod.t create mode 100644 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod_coverage.t create mode 100755 dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/test.t create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Build.PL create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Changes create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/MANIFEST create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/META.yml create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Makefile.PL create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/README create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/changelog create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/compat create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/control create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/copyright create mode 100755 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/rules create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/watch create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained.pm create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained/Fast.pm create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/00compile.t create mode 100644 dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/chained.t create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Changes create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/INSTALL create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/MANIFEST create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/META.yml create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Makefile.PL create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/README create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/changelog create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/compat create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/control create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/copyright create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/manpage_typo.diff create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/series create mode 100755 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/rules create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/watch create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/examples/benchmark create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor.pm create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Fast.pm create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Faster.pm create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/accessors.t create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/aliases.t create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/bestpractice.t create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/croak.t create mode 100644 dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/getset.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Changes create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/MANIFEST create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/META.yml create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Makefile.PL create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/README create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Zlib.xs create mode 100755 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/config.in create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/README.source create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/changelog create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/compat create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/control create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/copyright create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/libcompress-raw-zlib-perl.examples create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/CVE-2009-1391 create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/series create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/use-debian-zlib.patch create mode 100755 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/rules create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/watch create mode 100755 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtdef create mode 100755 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtinf create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.xs create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/lib/Compress/Raw/Zlib.pm create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/pod/FAQ.pod create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/ppport.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/private/MakeUtil.pm create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/000prereq.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/01version.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/02zlib.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/07bufsize.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/18lvalue.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/99pod.t create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Builder.pm create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/More.pm create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Simple.pm create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/compress/CompTestUtils.pm create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/typemap create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/adler32.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/compress.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/infback.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffixed.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/uncompr.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zconf.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zlib.h create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.c create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.h delete mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz delete mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.dsc delete mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011.orig.tar.gz create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.012-1lenny1.diff.gz create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.012-1lenny1.dsc create mode 100644 dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.012.orig.tar.gz create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog.svn create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/MANIFEST create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/META.yml create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/Makefile.PL create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/README create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/SIGNATURE create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/changelog create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/compat create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/control create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/copyright create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/docs create mode 100755 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/rules create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/substvars create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/watch create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump.pm create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump/Export.pm create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/autogen.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/diff.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/export.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/pod.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/podcover.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/recur.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/symdump.t create mode 100644 dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/tree.t create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Changes create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/LICENSE create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/MANIFEST create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/META.yml create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Makefile.PL create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/README create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/changelog create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/compat create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/control create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/copyright create mode 100755 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/rules create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/watch create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/lib/Email/Date/Format.pm create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/t/basic.t create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/t/pod-coverage.t create mode 100644 dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/t/pod.t create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/Build.PL create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/Changes create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/INSTALL create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/MANIFEST create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/META.yml create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/Makefile.PL create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/README create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/SIGNATURE create mode 100755 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/bleadcheck.pl create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/README.source create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/changelog create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/compat create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/control create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/copyright create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/patches/10_fix-gnukfreebsd-hurd.patch create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/patches/series create mode 100755 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/rules create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/debian/watch create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Base.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/Unix.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/VMS.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/Windows.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/aix.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/cygwin.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/darwin.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/dec_osf.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/lib/ExtUtils/CBuilder/Platform/os2.pm create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/t/01-basic.t create mode 100644 dev/i386/libextutils-cbuilder-perl/libextutils-cbuilder-perl-0.23/t/02-link.t create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/Build.PL create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/Changes create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/INSTALL create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/MANIFEST create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/META.yml create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/Makefile.PL create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/README create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/debian/changelog create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/debian/compat create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/debian/control create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/debian/copyright create mode 100755 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/debian/rules create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/debian/watch create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/lib/ExtUtils/ParseXS.pm create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/lib/ExtUtils/xsubpp create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/t/XSTest.pm create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/t/XSTest.xs create mode 100644 dev/i386/libextutils-parsexs-perl/libextutils-parsexs-perl-2.19/t/basic.t create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/Changes create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/MANIFEST create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/META.yml create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/Makefile.PL create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/debian/changelog create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/debian/compat create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/debian/control create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/debian/copyright create mode 100755 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/debian/rules create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/debian/watch create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/lib/File/chdir.pm create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/array.t create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/chdir.t create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/Builder.pm create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/More.pm create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/Simple.pm create mode 100644 dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/var.t create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/Changes create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/MANIFEST create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/Makefile.PL create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/README create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/Which.pm create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/bin/pwhich create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/changelog create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/compat create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/control create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/copyright create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.docs create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.examples create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.install create mode 100755 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/rules create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/watch create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/all.t create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/load.t create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/simple.t create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/README.txt create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all create mode 100755 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all.bat create mode 100755 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all.exe create mode 100755 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test1.exe create mode 100755 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test2.bat create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test3 create mode 100644 dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test4/foo.txt create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Changes create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/MANIFEST create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Makefile.PL create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Parser.pm create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Parser.xs create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/README create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/TODO create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/debian/changelog create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/debian/compat create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/debian/control create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/debian/copyright create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/debian/rules create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/debian/watch create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/hanchors create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/hdump create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/hform create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/hlc create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/hrefsub create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/hstrip create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/htext create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/htextsub create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/eg/htitle create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/hints/solaris.pl create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/hparser.c create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/hparser.h create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/lib/HTML/Entities.pm create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/lib/HTML/Filter.pm create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/lib/HTML/HeadParser.pm create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/lib/HTML/LinkExtor.pm create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/lib/HTML/PullParser.pm create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/lib/HTML/TokeParser.pm create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/mkhctype create mode 100755 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/mkpfunc create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/api_version.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/argspec-bad.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/argspec.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/argspec2.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/attr-encoded.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/callback.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/case-sensitive.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/cases.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/comment.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/crashme.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/declaration.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/default.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/document.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/dtext.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities2.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/filter-methods.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/filter.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/handler-eof.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/handler.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/headparser-http.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/headparser.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/ignore.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/largetags.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-base.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-rel.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/magic.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/marked-sect.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/msie-compat.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/offset.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/options.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parsefile.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parser.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/plaintext.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/pod.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/process.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/pullparser.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/script.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/skipped-text.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/stack-realloc.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/textarea.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/threads.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/tokeparser.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/uentities.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/unbroken-text.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/unicode-bom.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/unicode.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/xml-mode.t create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/tokenpos.h create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/typemap create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/util.c create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl_3.56-1+lenny1.diff.gz create mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl_3.56-1+lenny1.dsc delete mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl_3.56-1ubuntu2.1.diff.gz delete mode 100644 dev/i386/libhtml-parser-perl/libhtml-parser-perl_3.56-1ubuntu2.1.dsc create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/Changes create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/MANIFEST create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/MANIFEST.SKIP create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/META.yml create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/Makefile.PL create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/README create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/Tagset.pm create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/changelog create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/compat create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/control create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/copyright create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/patches/isbodyelement.patch create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/patches/series create mode 100755 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/rules create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/debian/watch create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/t/00_about_verbose.t create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/t/01_old_junk.t create mode 100644 dev/i386/libhtml-tagset-perl/libhtml-tagset-perl-3.20/t/pod.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/Changes create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/MANIFEST create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/META.yml create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/Makefile.PL create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/README create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/TODO create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/changelog create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/compat create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/control create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/copyright create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/libhtml-tree-perl.examples create mode 100755 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/rules create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/debian/watch create mode 100755 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/htmltree create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/AsSubs.pm create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Element.pm create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Element/traverse.pm create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Parse.pm create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Tree.pm create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Tree/AboutObjects.pod create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Tree/AboutTrees.pod create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/Tree/Scanning.pod create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/lib/HTML/TreeBuilder.pm create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/00system.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/assubs.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/attributes.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/body.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/building.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/children.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/clonei.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/construct_tree.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/doctype.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/escape.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/oldparse.html create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/oldparse.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/parse.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/parsefile.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/pod.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/split.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/tag-rendering.t create mode 100644 dev/i386/libhtml-tree-perl/libhtml-tree-perl-3.23/t/unicode.t create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/Changes create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/MANIFEST create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/META.yml create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/Makefile.PL create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/README create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/debian/changelog create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/debian/compat create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/debian/control create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/debian/copyright create mode 100755 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/debian/rules create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/debian/watch create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/lib/File/GlobMapper.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/lib/IO/Compress/Base.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/lib/IO/Compress/Base/Common.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/lib/IO/Uncompress/AnyUncompress.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/lib/IO/Uncompress/Base.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/pod/FAQ.pod create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/private/MakeUtil.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/000prereq.t create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/01misc.t create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/99pod.t create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/Test/Builder.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/Test/More.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/Test/Simple.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/CompTestUtils.pm create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/any.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/anyunc.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/destroy.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/generic.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/merge.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/multi.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/newtied.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/oneshot.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/prime.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/tied.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/truncate.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/compress/zlib-generic.pl create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl-2.012/t/globmapper.t delete mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl_2.011-1.diff.gz delete mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl_2.011-1.dsc delete mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl_2.011.orig.tar.gz create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl_2.012-1.diff.gz create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl_2.012-1.dsc create mode 100644 dev/i386/libio-compress-base-perl/libio-compress-base-perl_2.012.orig.tar.gz create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/Changes create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/MANIFEST create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/META.yml create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/Makefile.PL create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/README create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/changelog create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/compat create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/control create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/copyright create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/lintian-overrides create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/rules create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/debian/watch create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/examples/anycat create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/examples/gzappend create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/examples/gzcat create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/examples/gzgrep create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/examples/gzstream create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Adapter/Deflate.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Adapter/Identity.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Deflate.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Gzip.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Gzip/Constants.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/RawDeflate.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Zip.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Zip/Constants.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Zlib/Constants.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Compress/Zlib/Extra.pm create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/Adapter/Identity.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/Adapter/Inflate.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/AnyInflate.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/Gunzip.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/Inflate.pm create mode 100755 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/RawInflate.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/lib/IO/Uncompress/Unzip.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/pod/FAQ.pod create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/private/MakeUtil.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/000prereq.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/001zlib-generic-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/001zlib-generic-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/001zlib-generic-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/001zlib-generic-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/002any-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/002any-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/002any-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/002any-transparent.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/002any-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/004gziphdr.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/005defhdr.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/006zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/010examples.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/020isize.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/050interop-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/100generic-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/100generic-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/100generic-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/100generic-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/101truncate-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/101truncate-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/101truncate-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/101truncate-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/102tied-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/102tied-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/102tied-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/102tied-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/103newtied-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/103newtied-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/103newtied-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/103newtied-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/104destroy-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/104destroy-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/104destroy-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/104destroy-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-gzip-only.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-zip-bzip2-only.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-zip-only.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/105oneshot-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/106prime-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/106prime-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/106prime-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/106prime-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/107multi-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/107multi-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/107multi-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/107multi-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/108anyunc-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/108anyunc-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/108anyunc-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/108anyunc-transparent.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/108anyunc-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/109merge-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/109merge-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/109merge-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/109merge-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/110encode-deflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/110encode-gzip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/110encode-rawdeflate.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/110encode-zip.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/999pod.t create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/Test/Builder.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/Test/More.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/Test/Simple.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/CompTestUtils.pm create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/any.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/anyunc.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/destroy.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/encode.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/generic.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/merge.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/multi.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/newtied.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/oneshot.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/prime.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/tied.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/truncate.pl create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl-2.012/t/compress/zlib-generic.pl delete mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl_2.011-1.diff.gz delete mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl_2.011-1.dsc delete mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl_2.011.orig.tar.gz create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl_2.012-1.diff.gz create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl_2.012-1.dsc create mode 100644 dev/i386/libio-compress-zlib-perl/libio-compress-zlib-perl_2.012.orig.tar.gz create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/BUGS create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/Changes create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/MANIFEST create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/META.yml create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/Makefile.PL create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/README create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/SSL.pm create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/client-cert.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/client-key.enc create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/client-key.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/my-ca.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/server-cert.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/server-key.enc create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/server-key.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/server-rsa384-dh.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/server-wildcard.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/certs/test-ca.pem create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/README.source create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/changelog create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/compat create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/control create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/copyright create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/libio-socket-ssl-perl.docs create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/libio-socket-ssl-perl.examples create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/patches/disable_timebomb_tests.patch create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/patches/partial_hostname_fix.patch create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/patches/series create mode 100755 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/rules create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/debian/watch create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/docs/debugging.txt create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/example/async_https_server.pl create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/example/lwp-with-verifycn.pl create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/example/ssl_client.pl create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/example/ssl_server.pl create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/patches/Net_SSLeay.patch create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/01loadmodule.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/02settings.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/acceptSSL-timeout.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/auto_verify_hostname.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/cert_no_file.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/compatibility.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/connectSSL-timeout.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/core.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/dhe.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/nonblock.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/readline.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/sessions.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/ssl_settings.req create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/start-stopssl.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/startssl.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/sysread_write.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/testlib.pl create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/t/verify_hostname.t create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl-1.16/util/export_certs.pl delete mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl_1.13-1.diff.gz delete mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl_1.13-1.dsc delete mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl_1.13.orig.tar.gz create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl_1.16-1+lenny1.dsc create mode 100644 dev/i386/libio-socket-ssl-perl/libio-socket-ssl-perl_1.16-1+lenny1.tar.gz create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/COPYING create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/MANIFEST create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/META.yml create mode 100755 dev/i386/libio-stringy-perl/io-stringy-2.110/Makefile.PL create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/README create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/contrib/Clever.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/changelog create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/compat create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/control create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/copyright create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/doc-base create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/install create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/links create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/patches/01_close.diff create mode 100755 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/rules create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/debian/watch create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/AtomicFile.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/InnerFile.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/Lines.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/Scalar.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/ScalarArray.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/Stringy.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/Wrap.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/WrapTie.pm.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/icons/h1bullet.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/icons/h2bullet.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/icons/itembullet.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO/icons/zeegee.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/IO_Scalar_synopsis.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/icons/h1bullet.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/icons/h2bullet.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/icons/itembullet.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/icons/zeegee.gif create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/index-menu.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/index.html create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/docs/index.menu create mode 100755 dev/i386/libio-stringy-perl/io-stringy-2.110/examples/IO_Scalar_synopsis create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/AtomicFile.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/InnerFile.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/Lines.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/Scalar.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/ScalarArray.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/Stringy.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/Wrap.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/lib/IO/WrapTie.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/Common.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/ExtUtils/TBone.pm create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/IO_Lines.t create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/IO_Scalar.t create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/IO_ScalarArray.t create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/IO_WrapTie.t create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/simple.t create mode 100644 dev/i386/libio-stringy-perl/io-stringy-2.110/t/two.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/Build.PL create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/Changes create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/INSTALL create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/MANIFEST create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/META.yml create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/Makefile.PL create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/README create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/SIGNATURE create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/contrib/bash_completion.module-build create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/changelog create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/compat create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/control create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/copyright create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/patches/man-ext create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/patches/series create mode 100755 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/rules create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/debian/watch create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/API.pod create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Authoring.pod create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Base.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Compat.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Config.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Cookbook.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Dumper.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/ModuleInfo.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Notes.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/PPMMaker.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/Amiga.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/Default.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/EBCDIC.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/MPEiX.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/MacOS.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/RiscOS.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/Unix.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/VMS.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/VOS.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/Windows.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/aix.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/cygwin.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/darwin.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/os2.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/PodParser.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Version.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/YAML.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/scripts/config_data create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/basic.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/bundled/Test/Builder.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/bundled/Test/More.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/bundled/Test/Simple.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/bundled/Tie/CPHash.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/compat.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/destinations.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/ext.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/extend.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/files.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/help.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/install.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/lib/DistGen.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/lib/MBTest.pm create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/manifypods.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/mbyaml.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/metadata.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/metadata2.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/moduleinfo.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/new_from_context.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/notes.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/par.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/parents.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/pod_parser.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/ppm.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/runthrough.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/signature.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/test_type.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/test_types.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/tilde.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/versions.t create mode 100644 dev/i386/libmodule-build-perl/libmodule-build-perl-0.2808.01/t/xs.t create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/Build.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/Changes create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/MANIFEST create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/MANIFEST.SKIP create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/META.yml create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/Makefile.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/NINJA create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/README create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/debian/changelog create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/debian/compat create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/debian/control create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/debian/copyright create mode 100755 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/debian/rules create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/debian/watch create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/lib/Module/Depends.pm create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/lib/Module/Depends/Intrusive.pm create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/build_version/Build.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/depends.t create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/empty/.exists create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/inline-makemaker/Makefile.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/mmish/Makefile.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/module-install/Makefile.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/old/Build.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/old/META.yml create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/old/Makefile.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/template-extract/Build.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/template-extract/META.yml create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/template-extract/Makefile.PL create mode 100755 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/uses-findbin/Makefile.PL create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl-0.14/t/with-yaml/META.yml delete mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl_0.10-1.1.diff.gz delete mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl_0.10-1.1.dsc delete mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl_0.10.orig.tar.gz create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl_0.14-1.diff.gz create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl_0.14-1.dsc create mode 100644 dev/i386/libmodule-depends-perl/libmodule-depends-perl_0.14.orig.tar.gz create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/Changes create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/Credits create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/MANIFEST create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/MANIFEST.SKIP create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/META.yml create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/Makefile.PL create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/QuickRef create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/README create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/README.Win32 create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/RECIPE.Win32 create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/SSLeay.xs create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/TODO create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/constants.c create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/README.source create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/changelog create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/compat create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/control create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/copyright create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/libnet-ssleay-perl.docs create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/libnet-ssleay-perl.examples create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/libnet-ssleay-perl.lintian-overrides create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/patches/10fix_pod.patch create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/patches/20no-stray-libz-link.patch create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/patches/series create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/rules create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/debian/watch create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/bio.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/bulk.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/callback.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/cb-testi.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/cli-cert.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/ephemeral.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/get_authenticated_page.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/get_page.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/get_page_cert.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/https-proxy-snif.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/makecert.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/minicli.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/passwd-cb.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/req.conf create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/server_key.pem create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/ssl-inetd-serv.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/ssl_diff.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/sslcat.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/sslecho.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/stdio_bulk.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/tcpcat.pl create mode 100755 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/examples/tcpecho.pl create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Base.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Can.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Compiler.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/External.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Fetch.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Makefile.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Metadata.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/PRIVATE/Net/SSLeay.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/Win32.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/inc/Module/Install/WriteAll.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/lib/Net/SSLeay.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/lib/Net/SSLeay/Handle.pm create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/ppport.h create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/data/0f89dbb5.0 create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/data/cert.pem create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/data/key.pem create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/data/key.pem.e create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/external/08_external.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/external/15_altnames.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/handle/external/10_destroy.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/handle/external/50_external.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/handle/local/05_use.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/00_ptr_cast.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/01_pod.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/02_pod_coverage.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/03_use.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/04_basic.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/05_passwd_cb.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/06_tcpecho.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/07_sslecho.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/08_pipe.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/15_bio.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/20_autoload.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/30_error.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/31_rsa_generate_key.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/35_ephemeral.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/50_digest.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/kwalitee.t create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/t/local/ptr_cast_test.c create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl-1.35/typemap create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl_1.35-1.diff.gz create mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl_1.35-1.dsc delete mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl_1.35-1ubuntu1.diff.gz delete mode 100644 dev/i386/libnet-ssleay-perl/libnet-ssleay-perl_1.35-1ubuntu1.dsc create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/Changes create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/MANIFEST create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/META.yml create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/Makefile.PL create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/README create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/debian/changelog create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/debian/compat create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/debian/control create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/debian/copyright create mode 100755 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/debian/rules create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/debian/watch create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/lib/PAR/Dist.pm create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/t/00pod.t create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/t/00podcover.t create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/t/01basic.t create mode 100644 dev/i386/libpar-dist-perl/libpar-dist-perl-0.31/t/02parsedistname.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/Build.PL create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/Changes create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/MANIFEST create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/META.yml create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/Makefile.PL create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/README create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/bin/pod_cover create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/debian/changelog create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/debian/compat create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/debian/control create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/debian/copyright create mode 100755 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/debian/rules create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/debian/watch create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/examples/check_installed create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/examples/script-covered create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/lib/Pod/Coverage.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/lib/Pod/Coverage/CountParents.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/lib/Pod/Coverage/ExportOnly.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/lib/Pod/Coverage/Overloader.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/01compile.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/02simple.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/03import.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/04cvgv.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/05parentage.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/06trustme.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/07pod.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/08tie.t create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Args.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Child.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Earle.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Fully/Qualified.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/GrandParent.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Parent.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Sibling.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple1.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple2.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple3.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple4.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple4.pod create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple5.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple6.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple7.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Simple8.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Tie.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/Trustme.pm create mode 100644 dev/i386/libpod-coverage-perl/libpod-coverage-perl-0.19/t/lib/XS4ALL.pm create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/ChangeLog create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/MANIFEST create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/MANIFEST.SKIP create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/META.yml create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/Makefile.PL create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/README create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/debian/changelog create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/debian/compat create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/debian/control create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/debian/copyright create mode 100755 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/debian/rules create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/debian/watch create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/lib/Pod/Escapes.pm create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/t/01_about_verbose.t create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/t/10_main.t create mode 100644 dev/i386/libpod-escapes-perl/libpod-escapes-perl-1.04/t/15_name2charnum.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/ChangeLog create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/MANIFEST create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/MANIFEST.SKIP create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/META.yml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/Makefile.PL create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/README create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/debian/changelog create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/debian/compat create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/debian/control create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/debian/copyright create mode 100755 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/debian/rules create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/debian/watch create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/BlackBox.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Checker.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Debug.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/DumpAsText.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/DumpAsXML.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/HTML.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/HTMLBatch.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/HTMLLegacy.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/LinkSection.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Methody.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Progress.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/PullParser.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/PullParserEndToken.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/PullParserStartToken.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/PullParserTextToken.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/PullParserToken.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/RTF.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Search.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/SimpleTree.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Subclassing.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Text.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/TextContent.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/TiedOutFH.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/Transcode.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/TranscodeDumb.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/TranscodeSmart.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/XHTML.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/Pod/Simple/XMLOutStream.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/perlpod.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/lib/perlpodspec.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/00about.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/20_skip.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/ac_d.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/accept01.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/accept05.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/basic.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/begin.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/cbacks.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/chunking.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/closeys.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jp.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jp.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jpx.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jpx.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jpy.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jpy.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jpz.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/2202jpz.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/8859_7.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/8859_7.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/cp1256.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/cp1256.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/fet_cont.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/fet_cont.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/fet_dup.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/fet_dup.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/iso6.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/iso6.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/koi8r.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/koi8r.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/laozi38.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/laozi38.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/laozi38b.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/laozi38b.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/laozi38p.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/laozi38p.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/lat1fr.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/lat1fr.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/lat1frim.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/lat1frim.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/nonesuch.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/nonesuch.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/pasternak_cp1251.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/pasternak_cp1251.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain_explicit.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain_explicit.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain_latin1.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain_latin1.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain_utf8.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/plain_utf8.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/polish_utf8.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/polish_utf8.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/s2763_sjis.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/s2763_sjis.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/thai_iso11.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus/thai_iso11.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/fiqhakbar_iso6.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/fiqhakbar_iso6.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_implicit_utf8.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_utf16be_bom.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_utf16le_bom.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_utf8_bom.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_utf8_bom.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_utf8_bom2.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/corpus2/polish_utf8_bom2.xml create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/encod01.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/encod02.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/encod03.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/end_over.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/fcodes.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/fcodes_e.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/fcodes_l.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/fcodes_s.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/for.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/fornot.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/fullstop.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/heads.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/html01.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/html02.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/html03.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/htmlbat.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/items.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/items02.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/itemstar.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/junk1.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/junk1o.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/junk2.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/junk2o.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/linkclas.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/perlcyg.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/perlcygo.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/perlfaq.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/perlfaqo.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/perlvar.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/perlvaro.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/puller.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/pulltitl.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/reinit.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/render.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search05.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search10.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search12.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search20.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search22.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search25.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search26.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search27.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search28.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search29.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/search50.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/stree.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/Blorm.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/Zonk/Fiddle.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/Zonk/Pronk.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/Zonk/Veng.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/hinkhonk/Glunk.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/hinkhonk/Vliff.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/hinkhonk/readme.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/pod/perlflif.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/pod/perlthng.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/squaa.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/squaa/Glunk.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/squaa/Vliff.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib1/zikzik.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/Suzzle.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/hinkhonk/Glunk.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/hinkhonk/Vliff.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/hinkhonk/readme.txt create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/pod/perlthng.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/pod/perlzuk.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/squaa/Vliff.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib2/squaa/Wowo.pod create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/testlib3/squaa/Vliff.pm create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/tiedfh.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/verb_fmt.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/verbatim.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/x_nixer.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/xhtml01.t create mode 100644 dev/i386/libpod-simple-perl/libpod-simple-perl-3.07/t/xhtml05.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/Build.PL create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/Changes create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/INSTALL create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/LICENSE create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/MANIFEST create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/MANIFEST.SKIP create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/META.yml create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/Makefile.PL create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/README create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/Todo create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/changelog create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/compat create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/control create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/copyright create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/patches/examples-shebang.patch create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/patches/series create mode 100755 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/rules create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/debian/watch create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/examples/uplevel-demo.pl create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/inc/Module/Build/WikiDoc.pm create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/lib/Sub/Uplevel.pm create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/lib/Sub/Uplevel.pod create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/01_die_check.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/02_uplevel.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/03_nested_uplevels.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/04_honor_later_override.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/05_honor_prior_override.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/06_db_args.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/t/lib/Foo.pm create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/xt/critic.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/xt/perlcriticrc create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/xt/pod-coverage.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/xt/pod.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/xt/spelling.t create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl-0.1901/xt/stopwords.txt create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl_0.1901-1.diff.gz create mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl_0.1901-1.dsc delete mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl_0.1901-1ubuntu1.diff.gz delete mode 100644 dev/i386/libsub-uplevel-perl/libsub-uplevel-perl_0.1901-1ubuntu1.dsc create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/Build.PL create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/Changes create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/MANIFEST create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/META.yml create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/Makefile.PL create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/README create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/debian/changelog create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/debian/compat create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/debian/control create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/debian/copyright create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/debian/rules create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/debian/watch create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/lib/Test/Exception.pm create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/Exception.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/caller.t create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/developer/documented.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/developer/perlcritic.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/developer/perlcriticrc create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/developer/pod.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/developer/spelling.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/edge-cases.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/import.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/isa.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/lives_and.t create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/preserve.t create mode 100755 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/return.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/rt.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/stacktrace.t create mode 100644 dev/i386/libtest-exception-perl/libtest-exception-perl-0.27/t/throws_ok.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/Build.PL create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/Changes create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/Changes-2.64 create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/HACKING.pod create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/MANIFEST create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/META.yml create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/Makefile.PL create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/README create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/bin/prove create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/README.source create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/TODO create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/changelog create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/compat create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/control create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/copyright create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/patches/manpage-error.patch create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/patches/series create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/postrm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/preinst create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/rules create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/debian/watch create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/README create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/bin/forked_tests.pl create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/bin/test_html.pl create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/bin/tprove_gtk create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/harness-hook/hook.pl create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/harness-hook/lib/Harness/Hook.pm create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/my_exec create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/silent-harness.pl create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/t/10-stuff.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/t/ruby.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/examples/test_urls.txt create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/inc/MyBuilder.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/App/Prove.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/App/Prove/State.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Base.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Formatter/Color.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Formatter/Console.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Formatter/Console/ParallelSession.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Formatter/Console/Session.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Harness.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Object.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Aggregator.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Grammar.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Iterator.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Iterator/Array.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Iterator/Process.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Iterator/Stream.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/IteratorFactory.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Multiplexer.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Bailout.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Comment.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Plan.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Pragma.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Test.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Unknown.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/Version.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Result/YAML.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/ResultFactory.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Scheduler.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Scheduler/Job.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Scheduler/Spinner.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Source.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Source/Perl.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/Utils.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/YAMLish/Reader.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/TAP/Parser/YAMLish/Writer.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/lib/Test/Harness.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/perlcriticrc create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/000-load.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/aggregator.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/bailout.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/base.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/callbacks.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/env.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/failure.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/inc-propagation.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/inc_taint.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/nonumbers.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/regression.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/test-harness-compat.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/compat/version.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/console.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/data/catme.1 create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/data/proverc create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/data/sample.yml create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/errors.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/grammar.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/harness.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/iterators.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/App/Prove/Plugin/Dummy.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/Dev/Null.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/EmptyParser.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/IO/c55Capture.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyCustom.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyGrammar.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyIterator.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyIteratorFactory.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyPerlSource.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyResult.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MyResultFactory.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/MySource.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/NoFork.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/TAP/Parser/SubclassTest.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/Test/Builder.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/Test/Builder/Module.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/Test/More.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/Test/Simple.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/lib/if.pm create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/multiplexer.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/nofork-mux.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/nofork.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/object.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/parse.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/parser-config.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/parser-subclass.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/premature-bailout.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/process.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/prove.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/proverc.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/proverun.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/regression.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/results.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/bailout create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/bignum create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/bignum_many create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/combined create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/combined_compat create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/delayed create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/descriptive create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/descriptive_trailing create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/die create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/die_head_end create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/die_last_minute create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/die_unfinished create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/duplicates create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/echo create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/empty create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/escape_eol create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/escape_hash create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/head_end create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/head_fail create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/inc_taint create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/junk_before_plan create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/lone_not_bug create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/no_nums create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/no_output create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/out_err_mix create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/out_of_order create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/schwern create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/schwern-todo-quiet create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/segfault create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/sequence_misparse create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/shbang_misparse create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/simple create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/simple_fail create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/simple_yaml create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/skip create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/skip_nomsg create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/skipall create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/skipall_nomsg create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/skipall_v13 create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/space_after_plan create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/stdout_stderr create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/strict create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/switches create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/taint create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/taint_warn create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/todo create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/todo_inline create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/todo_misparse create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/too_many create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/version_good create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/version_late create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/version_old create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/vms_nit create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/sample-tests/with_comments create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/scheduler.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source_tests/harness create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source_tests/harness_badtap create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source_tests/harness_complain create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source_tests/harness_directives create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source_tests/harness_failure create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/source_tests/source create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/spool.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/state.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/streams.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/subclass_tests/non_perl_source create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/subclass_tests/perl_source create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/taint.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/testargs.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/unicode.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/utils.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/yamlish-output.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/yamlish-writer.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/t/yamlish.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/xt/author/pod-coverage.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/xt/author/pod.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/xt/author/stdin.t create mode 100755 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/xt/perls/harness_perl.t create mode 100644 dev/i386/libtest-harness-perl/libtest-harness-perl-3.12/xt/perls/sample-tests/perl_version create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/Changes create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/Coverage.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/MANIFEST create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/META.yml create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/Makefile.PL create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/debian/changelog create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/debian/compat create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/debian/control create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/debian/copyright create mode 100755 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/debian/rules create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/debian/watch create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/00.load.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/Nopod.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/Nosymbols.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/PC_Inherited.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/PC_Inherits.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/Privates.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/Simple.pm create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/all_modules.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/all_pod_coverage_ok.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/alt_class.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/nopod.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/nosymbols.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/parms.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/pod.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/privates.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/self.t create mode 100644 dev/i386/libtest-pod-coverage-perl/libtest-pod-coverage-perl-1.08/t/simple.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/Changes create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/MANIFEST create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/META.yml create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/Makefile.PL create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/Pod.pm create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/debian/changelog create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/debian/compat create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/debian/control create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/debian/copyright create mode 100755 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/debian/rules create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/debian/watch create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/00-load.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/all_pod_files.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/cut-outside-block.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/cut-outside-block.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/empty-file.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/good.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/item-ordering.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/item-ordering.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/load.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/missing-file.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/pod.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/pod/good-pod-script create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/pod/good.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/pod/no_pod.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/selftest.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/spaced-directives.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/spaced-directives.t create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/unknown-directive.pod create mode 100644 dev/i386/libtest-pod-perl/libtest-pod-perl-1.26/t/unknown-directive.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/Changes create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/MANIFEST create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/META.yml create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/Makefile.PL create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/README create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/SIGNATURE create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/TODO create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/changelog create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/compat create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/control create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/copyright create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/libtest-simple-perl.docs create mode 100755 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/rules create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/debian/watch create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/Builder.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/Builder/Module.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/Builder/Tester.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/Builder/Tester/Color.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/More.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/Simple.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/lib/Test/Tutorial.pod create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/00test_harness_check.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/BEGIN_require_ok.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/BEGIN_use_ok.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/Builder.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/More.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/bad_plan.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/bail_out.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/buffer.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/carp.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/circular_data.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/cmp_ok.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/create.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/curr_test.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/details.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/diag.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/dont_overwrite_die_handler.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/eq_set.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/exit.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/extra.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/extra_one.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/fail-like.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/fail-more.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/fail.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/fail_one.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/filehandles.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/fork.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/harness_active.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/has_plan.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/has_plan2.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/import.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/is_deeply_dne_bug.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/is_deeply_fail.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/is_deeply_with_threads.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/is_fh.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Dev/Null.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Dummy.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/MyOverload.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/NoExporter.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/Catch.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/death.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/death_in_eval.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/death_with_handler.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/exit.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/extras.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/five_fail.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/last_minute_death.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/one_fail.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/pre_plan_death.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/require.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/success.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/too_few.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/too_few_fail.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/Test/Simple/sample_tests/two_fail.plx create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/lib/TieOut.pm create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/maybe_regex.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/missing.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/no_diag.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/no_ending.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/no_header.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/no_plan.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/ok_obj.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/output.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/overload.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/overload_threads.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/plan.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/plan_bad.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/plan_is_noplan.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/plan_no_plan.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/plan_shouldnt_import.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/plan_skip_all.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/pod-coverage.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/pod.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/require_ok.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/reset.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/simple.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/skip.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/skipall.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbm_doesnt_set_exported_to.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_01basic.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_02fhrestore.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_03die.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_04line_num.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_05faildiag.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_06errormess.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/tbt_07args.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/thread_taint.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/threads.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/todo.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/try.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/undef.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/use_ok.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/useing.t create mode 100644 dev/i386/libtest-simple-perl/libtest-simple-perl-0.80/t/utf8.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/Changes create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/MANIFEST create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/META.yml create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/Makefile.PL create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/README create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/Warn.pm create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/README.source create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/changelog create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/compat create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/control create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/copyright create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/patches/language.patch create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/patches/series create mode 100755 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/rules create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/debian/watch create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/1.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/carped.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/pod.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/warning_is.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/warning_like.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/warnings_are.t create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl-0.11/t/warnings_like.t delete mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl_0.10-1.diff.gz delete mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl_0.10-1.dsc delete mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl_0.10.orig.tar.gz create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl_0.11-1.diff.gz create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl_0.11-1.dsc create mode 100644 dev/i386/libtest-warn-perl/libtest-warn-perl_0.11.orig.tar.gz create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/ChangeLog create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/MANIFEST create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/MANIFEST.SKIP create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/META.yml create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/Makefile.PL create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/README create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/debian/changelog create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/debian/compat create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/debian/control create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/debian/copyright create mode 100755 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/debian/rules create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/debian/watch create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/lib/Tree/DAG_Node.pm create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/t/00_about_verbose.t create mode 100644 dev/i386/libtree-dagnode-perl/libtree-dagnode-perl-1.06/t/01_old_junk.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/Changes create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/MANIFEST create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/Makefile.PL create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/README create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/Escape.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/Heuristic.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/QueryParam.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/Split.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/URL.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/WithBase.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_foreign.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_generic.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_ldap.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_login.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_query.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_segment.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_server.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/_userpass.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/data.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/Base.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/FAT.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/Mac.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/OS2.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/QNX.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/Unix.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/file/Win32.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/ftp.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/gopher.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/http.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/https.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/ldap.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/ldapi.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/ldaps.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/mailto.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/mms.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/news.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/nntp.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/pop.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/rlogin.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/rsync.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/rtsp.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/rtspu.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/sip.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/sips.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/snews.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/ssh.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/telnet.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/tn3270.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/urn.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/urn/isbn.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/URI/urn/oid.pm create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/README.debian create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/changelog create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/compat create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/control create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/copyright create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/dirs create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/docs create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/postinst.debhelper create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/prerm.debhelper create mode 100755 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/rules create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/debian/watch create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/abs.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/clone.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/data.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/escape.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/file.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/ftp.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/generic.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/heuristic.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/http.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/ldap.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/mailto.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/mix.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/mms.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/news.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/old-absconf.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/old-base.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/old-file.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/old-relbase.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/pop.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/query-param.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/query.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/rel.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/rfc2732.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/roy-test.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/roytest1.html create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/roytest2.html create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/roytest3.html create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/roytest4.html create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/roytest5.html create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/rsync.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/rtsp.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/sip.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/split.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/storable-test.pl create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/storable.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/urn-isbn.t create mode 100644 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/t/urn-oid.t create mode 100755 dev/i386/liburi-perl/liburi-perl-1.35.dfsg.1/uri-test create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/Changes create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/MANIFEST create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/META.yml create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/Makefile.PL create mode 100755 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/bin/mech-dump create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/changelog create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/compat create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/control create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/copyright create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/patches/adding_pod_see_also.patch create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/patches/no_internet.patch create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/patches/series create mode 100755 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/rules create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/debian/watch create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/etc/www-mechanize-logo.png create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/lib/WWW/Mechanize.pm create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/lib/WWW/Mechanize/Cookbook.pod create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/lib/WWW/Mechanize/Examples.pod create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/lib/WWW/Mechanize/FAQ.pod create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/lib/WWW/Mechanize/Image.pm create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/lib/WWW/Mechanize/Link.pm create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/perlcriticrc create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/00-load.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/add_header.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/aliases.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/area_link.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/area_link.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/autocheck.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/clone.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/die.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/field.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/field.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_frame.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_frame.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_image.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_inputs.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_inputs.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_link-warnings.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_link.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_link.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_link_id.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/find_link_id.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/form-parsing.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/frames.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/frames.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/google.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/image-new.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/image-parse.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/image-parse.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/link-base.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/link-relative.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/link.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/live/computers4sure.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/live/wikipedia.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/LocalServer.pm create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/back.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/click.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/click_button.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/failure.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/follow.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/form.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/get.t create mode 100755 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/log-server create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/overload.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/page_stack.t create mode 100755 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/referer-server create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/referer.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/reload.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/local/submit.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/mech-dump/mech-dump.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/new.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/pod-coverage.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/pod.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/regex-error.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/save_content.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/select.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/select.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/taint.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/tick.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/tick.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/upload.html create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/upload.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/warn.t create mode 100644 dev/i386/libwww-mechanize-perl/libwww-mechanize-perl-1.34/t/warnings.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/AUTHORS create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/Changes create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/MANIFEST create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/META.yml create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/Makefile.PL create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/README create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/README.SSL create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/bin/lwp-download create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/bin/lwp-mirror create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/bin/lwp-request create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/bin/lwp-rget create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/debian/changelog create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/debian/compat create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/debian/control create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/debian/copyright create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/debian/libwww-perl.links create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/debian/rules create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/debian/watch create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/Bundle/LWP.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/File/Listing.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTML/Form.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Cookies.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Cookies/Microsoft.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Cookies/Netscape.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Daemon.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Date.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Headers.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Headers/Auth.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Headers/ETag.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Headers/Util.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Message.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Negotiate.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Request.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Request/Common.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Response.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/HTTP/Status.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Authen/Basic.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Authen/Digest.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Authen/Ntlm.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/ConnCache.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Debug.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/DebugFile.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/MediaTypes.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/MemberMixin.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/GHTTP.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/cpan.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/data.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/file.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/ftp.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/gopher.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/http.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/http10.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/https.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/https10.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/loopback.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/mailto.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/nntp.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Protocol/nogo.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/RobotUA.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/Simple.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/UserAgent.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/LWP/media.types create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/Net/HTTP.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/Net/HTTP/Methods.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/Net/HTTP/NB.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/Net/HTTPS.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/WWW/RobotRules.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lib/WWW/RobotRules/AnyDBM_File.pm create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lwpcook.pod create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/lwptut.pod create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/README create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/t/TEST create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/common-req.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/cookies.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/date.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/headers-auth.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/headers-etag.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/headers-util.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/headers.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/http.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/listing.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/mediatypes.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/message-old.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/message-parts.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/message.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/negotiate.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/protocols.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/response.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/status.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/base/ua.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/html/form-maxlength.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/html/form-multi-select.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/html/form-param.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/html/form.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/apache-listing.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/apache.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/https.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-auth-b.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-auth-d.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-chunk.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-md5-get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-md5.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-neg-get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-neg.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/live/jigsaw-te.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/autoload-get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/autoload.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/chunked.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/http-get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/http.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/local/protosub.t create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/t/net/cgi-bin/moved create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/t/net/cgi-bin/nph-slowdata create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/t/net/cgi-bin/slowread create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/t/net/cgi-bin/test create mode 100755 dev/i386/libwww-perl/libwww-perl-5.813/t/net/cgi-bin/timeout create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/config.pl.dist create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/http-get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/http-post.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/http-timeout.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/mirror.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/moved.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/net/proxy.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/robot/rules-dbm.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/robot/rules.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/robot/ua-get.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/t/robot/ua.t create mode 100644 dev/i386/libwww-perl/libwww-perl-5.813/talk-to-ourself delete mode 100644 dev/i386/libwww-perl/libwww-perl_5.812-1.diff.gz delete mode 100644 dev/i386/libwww-perl/libwww-perl_5.812-1.dsc delete mode 100644 dev/i386/libwww-perl/libwww-perl_5.812.orig.tar.gz create mode 100644 dev/i386/libwww-perl/libwww-perl_5.813-1.diff.gz create mode 100644 dev/i386/libwww-perl/libwww-perl_5.813-1.dsc create mode 100644 dev/i386/libwww-perl/libwww-perl_5.813.orig.tar.gz diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/COPYING b/dev/i386/dh-make-perl/dh-make-perl-0.47/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/README b/dev/i386/dh-make-perl/dh-make-perl-0.47/README new file mode 100644 index 0000000..ed9f7e2 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/README @@ -0,0 +1,19 @@ +dh-make-perl + +Create debian packages from perl modules + +dh-make-perl will create the files required to build +a debian source package out of a perl package. +This works for most simple packages and is also useful +for getting started with packaging perl modules. + +There is an override mechanism in place to handle most of +the little changes that may be needed for some modules +(this hasn't been tested much, though). + +Using this program is no excuse for not reading the +debian developer documentation, including the policy, +the perl policy, the packaging manual and so on. + +lupus@debian.org + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Changes b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Changes new file mode 100644 index 0000000..9286d94 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Changes @@ -0,0 +1,5 @@ +Revision history for Perl extension Strange. + +0.1 Tue Oct 24 16:25:04 2000 + - original version; created by h2xs 1.19 + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/MANIFEST b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/MANIFEST new file mode 100644 index 0000000..1c88ddb --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/MANIFEST @@ -0,0 +1,5 @@ +Changes +MANIFEST +Makefile.PL +Strange.pm +test.pl diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Makefile.PL b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Makefile.PL new file mode 100644 index 0000000..5f9529c --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Makefile.PL @@ -0,0 +1,7 @@ +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + 'NAME' => 'Strange', + 'VERSION_FROM' => 'Strange.pm', # finds $VERSION +); diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Strange.pm b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Strange.pm new file mode 100644 index 0000000..e49a06f --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/Strange.pm @@ -0,0 +1,52 @@ +package Strange; + +use strict; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); + +require Exporter; +require AutoLoader; + +@ISA = qw(Exporter AutoLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + +); +$VERSION = '0.1'; + + +# Preloaded methods go here. + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ +# Below is the stub of documentation for your module. You better edit it! + +=head1 NAME + +Strange - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use Strange; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for Strange was created by C. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head1 AUTHOR + +A. U. Thor, a.u.thor@a.galaxy.far.far.away + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/test.pl b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/test.pl new file mode 100644 index 0000000..2db141a --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-0.1/test.pl @@ -0,0 +1,20 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..1\n"; } +END {print "not ok 1\n" unless $loaded;} +use Strange; +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Changes b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Changes new file mode 100644 index 0000000..82b4832 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Changes @@ -0,0 +1,5 @@ +Revision history for Perl extension Strange. + +2.1 Tue Oct 24 16:24:40 2000 + - original version; created by h2xs 1.19 + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/MANIFEST b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/MANIFEST new file mode 100644 index 0000000..3fdba67 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/MANIFEST @@ -0,0 +1,6 @@ +Changes +MANIFEST +Makefile.PL +Strange.pm +Strange.xs +test.pl diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Makefile.PL b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Makefile.PL new file mode 100644 index 0000000..ae97c05 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Makefile.PL @@ -0,0 +1,10 @@ +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + 'NAME' => 'Strange', + 'VERSION_FROM' => 'Strange.pm', # finds $VERSION + 'LIBS' => [''], # e.g., '-lm' + 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' + 'INC' => '', # e.g., '-I/usr/include/other' +); diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/README b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/README new file mode 100644 index 0000000..56900a9 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/README @@ -0,0 +1 @@ +burp diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.pm b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.pm new file mode 100644 index 0000000..f41fa4c --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.pm @@ -0,0 +1,78 @@ +package Strange; + +use strict; +use Carp; +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD); + +require Exporter; +require DynaLoader; +require AutoLoader; + +@ISA = qw(Exporter DynaLoader); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + +); +$VERSION = '2.1'; + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + croak "& not defined" if $constname eq 'constant'; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + croak "Your vendor has not defined Strange macro $constname"; + } + } + no strict 'refs'; + *$AUTOLOAD = sub () { $val }; + goto &$AUTOLOAD; +} + +bootstrap Strange $VERSION; + +# Preloaded methods go here. + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ +# Below is the stub of documentation for your module. You better edit it! + +=head1 NAME + +Strange - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use Strange; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for Strange was created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head1 AUTHOR + +A. U. Thor, a.u.thor@a.galaxy.far.far.away + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.xs b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.xs new file mode 100644 index 0000000..1e11158 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/Strange.xs @@ -0,0 +1,34 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +static int +not_here(char *s) +{ + croak("%s not implemented on this architecture", s); + return -1; +} + +static double +constant(char *name, int arg) +{ + errno = 0; + switch (*name) { + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + + +MODULE = Strange PACKAGE = Strange + + +double +constant(name,arg) + char * name + int arg + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/test.pl b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/test.pl new file mode 100644 index 0000000..2db141a --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/Strange-2.1/test.pl @@ -0,0 +1,20 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..1\n"; } +END {print "not ok 1\n" unless $loaded;} +use Strange; +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/changelog b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/changelog new file mode 100644 index 0000000..91110b2 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/changelog @@ -0,0 +1,679 @@ +dh-make-perl (0.47) unstable; urgency=low + + * rules.Module-Build.xs: add config=optimize="$(CFLAGS)" to Build.PL + invocation, causing honoring DEB_BUILD_OPTS=noopt. Thanks to Niko Tyni. + Closes: #480110 + + -- Damyan Ivanov Wed, 18 Jun 2008 21:38:20 +0300 + +dh-make-perl (0.46) unstable; urgency=low + + [ gregor herrmann ] + * Replace "::" with "-" in $perlname in all cases, otherwise the URLs in + debian/watch and debian/control's Homepage field are wrong. + + [ Damyan Ivanov ] + * add --dh switch, controlling the set of rules files to use and + desired debhelper compatibility level. Defaults to 5 + * add rules.dh7.{xs,noxs} + * fix not detecting arch-dep packages in refresh mode (-R) + * Bump Standards-Version to 3.8.0 (both in dh-make-perl and generated + packages) + * replace a call to `date -R` with a call to Email::Date::Format's + email_date function. Avoids a fork. Thanks to Stephen Gran. + + Add libemail-date-format-perl to Depends. + + [ gregor herrmann ] + * Add stamp-files to rules.dh7.{xs,noxs} (cf. + /usr/share/doc/debhelper/examples/rules.simple from debhelper 7.0.11) + * Call process_meta also in refresh mode to get package name more easily. + + -- Damyan Ivanov Wed, 18 Jun 2008 21:09:48 +0300 + +dh-make-perl (0.45) unstable; urgency=low + + * Fix mangling of long description, which was broken in 0.44; thanks to + Kevin Ryde for the bugreport (closes: #481560). + * Tighten regexp when checking for empty long description, avoids spurious + warnings. + + -- gregor herrmann Sat, 17 May 2008 15:09:59 +0200 + +dh-make-perl (0.44) unstable; urgency=low + + [ gregor herrmann ] + * Fix check_for_xs(), thanks to Kevin Ryde for the bug report and the + patch (closes: #480420). + * Escape dot in exclude pattern, also reported by Kevin Ryde in the same + bugreport. + * CPAN.pm creates build directories with a random part since 1.88_59; use + the new CPAN::Distribution::base_id method to get nice directory names + again (introduced in 1.91_53), if our CPAN.pm is new enough. + * Initialize $desc to avoid a warning. + * Only mangle $longdesc if it is not empty, avoids results like " .". + * If the directory containing the unpacked tarball already exists rename + it instead of moving the contents beneath it. + * Slightly improve wording when searching with apt-file. + * Handle errors from moving directories. + * Change my email address in several files. + * debian/copyright: update years of contributions. + + [ Damyan Ivanov ] + * Remove Roberto C. Sanchez from Uploaders on his request. + + -- gregor herrmann Sat, 10 May 2008 22:41:06 +0200 + +dh-make-perl (0.43) unstable; urgency=low + + [ gregor herrmann ] + * Evaluate --arch command line option earlier. + * Improve searching for dependencies with apt-file by using regexps; needs + a recent version of apt-file. + * Rank packages not ending in -perl lower in apt-file search results. + * Improve documentation of the --build option, thanks to Antony Gelberg + for the proposal. + + -- Damyan Ivanov Thu, 08 May 2008 09:58:23 +0300 + +dh-make-perl (0.42) unstable; urgency=low + + * Add a line to actually use the command line option --arch; thanks to + Jack Bates for reporting the problem (closes: #474180). + + -- gregor herrmann Fri, 04 Apr 2008 00:55:56 +0200 + +dh-make-perl (0.41) unstable; urgency=low + + [ Damyan Ivanov ] + * new command line switch, --refresh, causing re-creation of debian/rules + using the current templates. Useful when updating packages with ancient + debian/rules. + * remove trailing blank from usage text + * create debian/watch whenever upstream URL is available, not only if --cpan + is given + * when module has no specific perl version requirements, fall back to "perl + (>= 5.6.0-12)" for B-D-I, like dh_perl. Remove retrieval of (now unised) + information about the available perl version. + + [ Ivan Kohler ] + * Add "--allow_mb_mismatch 1" to M:B invocation of "Build distclean" in + rules.Module-Build.* templates. + + -- Damyan Ivanov Mon, 31 Mar 2008 21:51:24 +0300 + +dh-make-perl (0.40) unstable; urgency=low + + * use debhelper compatibility level 5 (and respective build-dependency on + debhelper) for generated packages + * all rules.* templates: drop obsolete 'source' and 'diff' targets + + -- Damyan Ivanov Wed, 19 Mar 2008 12:29:54 +0200 + +dh-make-perl (0.39) unstable; urgency=low + + [ gregor herrmann ] + * Set debhelper compatibility level of the created package to 6. + * Add comment and additional spaces to the created watch files to make the + pattern easier to read and understand. + * Fix small error in output of create_copyright(). + * Automatically find examples/eg/samples/sample directories for + dh_installexamples; otherwise remove empty dh_installexamples line from + debian/rules. + * Format the contributors' section in the POD with over/item/back, in the + verbatim paragraph the formatting codes were not rendered; thanks to + Nacho Barrientos Arias for spotting. + * Don't add a trailing comma to Depends: if there are no extra + dependencies. + + [ Damyan Ivanov ] + * rules.* templates: add "install" to phony targets list + * dh-make-perl: when storing versioned dependencies, remove any leading 'v' + + [ Martín Ferrari ] + * rules.* templates: Make source and diff .PHONY targets too, prettify a + little: remove unneeded whitespace, make PERL a conditional assignment + instead of an "#if" block, align the assignment of the variables. + + [ Roberto C. Sanchez ] + * Add /me to uploaders + * Remove obsolete README.Debian + * Update copyright to name GPL-2 explicitly (GPL now links to GPL-3 on sid) + + -- Roberto C. Sanchez Tue, 18 Mar 2008 18:47:31 -0400 + +dh-make-perl (0.38) unstable; urgency=low + + [ gregor herrmann ] + * Fix inline documentation: it's Vcs-Svn and Vcs-Browser nowadays. + + [ Damyan Ivanov ] + * all templates: use $(TMP) in the comment before the install + * MakeMaker templates: do not set INSTALLVENDORARCH and VENDORARCHEXP when + configuring. Instead, verbosely remove the empty dirs if they exist. Perl + 5.10's MakeMaker is reported to be fixed. + + -- Damyan Ivanov Thu, 10 Jan 2008 17:00:03 +0200 + +dh-make-perl (0.37) unstable; urgency=low + + [ Martín Ferrari ] + * Replace erroneous reference to $opts{basepkgs} in extract_depends, thanks + to Hilko Bengen for the correction. (Closes: #452122). + * Obtain a list of matching modules when querying CPAN (instead of just the + first match) to allow it to correctly choose between module names that + only differ in case. (Closes: #451838). + + [ Gunnar Wolf ] + * Now generates packages with standards-version: 3.7.3 + (i.e. meta-bumped-up standards-version) + + [ gregor herrmann ] + * Extend regex for matching upstream versions on the creation of + debian/watch. + + -- Damyan Ivanov Fri, 28 Dec 2007 15:16:51 +0200 + +dh-make-perl (0.36) unstable; urgency=low + + * Fix install dependencies in rules templates + Before: + install: build install-stamp + install-stamp: + After: + install: install-stamp + install-stamp: build-stamp + Avoids problems with parallel builds + * Use "$@" when touching stamps + * Bump standards-version to 3.7.3 (no changes) + + -- Damyan Ivanov Fri, 07 Dec 2007 11:28:18 +0200 + +dh-make-perl (0.35) unstable; urgency=low + + [ Oliver Gorwits ] + * Try Module::Depends if M::D::Intrusive fails (Closes: #447520). This + helps Module::Install modules (with META.yml) to work with dh-make-perl. + + -- Damyan Ivanov Wed, 14 Nov 2007 16:46:02 +0200 + +dh-make-perl (0.34) unstable; urgency=low + + * Add Vcs-* fields instead of the obsolete XS-Vcs-* fields when invoked + with --pkg-perl. + + -- gregor herrmann Wed, 17 Oct 2007 17:51:46 +0200 + +dh-make-perl (0.33) unstable; urgency=low + + [ David Paleino ] + * Added --email|-e and --packagename|-p switches (Closes: #443170). + + [ gregor herrmann ] + * Create Homepage: field in source stanza instead of pseudo-field in long + description. + * Add "--pkg-perl" to output of usage instructions. + * debian/control: Added: Vcs-Svn field (source stanza); Vcs-Browser + field (source stanza). Removed: XS-Vcs-Svn fields. + + [ Damyan Ivanov ] + * Add "create_packlist=0" to Module-Build templates + * Replace `pwd` with $(CURDIR) in debian/rules + + -- Damyan Ivanov Mon, 15 Oct 2007 11:23:06 +0300 + +dh-make-perl (0.32) unstable; urgency=low + + [ Frank Lichtenheld ] + * Unbreak handling of --version which was broken by the + getopts overhaul in 0.27 + + [ David Paleino ] + * Added new command line switch (--closes), to specify the ITP that + the new package is going to close + * Now dh-make-perl automagically fetches the ITP bug number from WNPP! + + -- Damyan Ivanov Mon, 17 Sep 2007 15:02:54 +0300 + +dh-make-perl (0.31) unstable; urgency=low + + [ David Paleino ] + * rules.MakeMaker.*: changed approach to the removal of unneeded (and + unwanted) dirs: + - /usr/lib/perl5/ for architecture-independent packages; + - /usr/share/perl5/ for architecture-dependent packages + + [ Damyan Ivanov ] + * Use http://search.cpan.org/dist/$perlname/ for upstream URL, watch and + Homepage. Idea borrowed from David Paleino. + * Document --pkg-perl option + + -- Damyan Ivanov Fri, 14 Sep 2007 11:38:10 +0300 + +dh-make-perl (0.30) unstable; urgency=low + + [ Gunnar Wolf ] + * Added warning when the extracted copyright information is incomplete + Closes: #439328 -- Stricter checks for debian/copyright + + [ Damyan Ivanov ] + * rules* clean: Move dh_clean $stamp_files call before the $(MAKE) clean + call as that may fail half-way, leaving the stamps in place + + -- Damyan Ivanov Tue, 11 Sep 2007 11:53:18 +0300 + +dh-make-perl (0.29) unstable; urgency=low + + * rules*.xs: add a call to dh_shlibdeps for arch-dependent packages + Thanks to Martín Ferrari for spotting + + -- Damyan Ivanov Tue, 21 Aug 2007 09:47:49 +0300 + +dh-make-perl (0.28) unstable; urgency=low + + [ Gunnar Wolf ] + * Added "basepkgs" option to specify which packages should be + considered base + * The list of base modules is no longer specified by hand - Base + packages are now queried and this list is generated from it. + * Pragmas and base modules are handled the same way - There is no real + way to differentiate them... And they were used interchangeably, so + there ;-) + * Homogeneized the usage of dh_* helpers in the different cases of + generated debian/rules + + [ Damyan Ivanov ] + * current watch file version is 3, this is what we generate too + stricter debian/watch patterns, omit capturing file extension + * Move tests from install to build target + * better explaination in binary-arch target for arch-indep packages and in + binary-indep target of arch-dep packages why the target is empty + * Add new option "--pkg-perl" which adds some functionality useful when + packages are created for the Debian Perl Group. Currently adds XS-Vcs-* + fields to debian/control and sets the Maintainer and Uploaders fields + accordingly + + -- Damyan Ivanov Mon, 20 Aug 2007 10:26:31 +0300 + +dh-make-perl (0.27) unstable; urgency=low + + [ Gunnar Wolf ] + * Moved all the options received from the user to %opts, for better + code readability + * When the module to be packaged declares a dependency on a specific + Perl version, reflect it in the output dependency/build dependency + information, rather than complaining that no such module exists + + [ gregor herrmann ] + * Add "It was downloaded from ..." to debian/copyright if called with + "--cpan $modulename". + * Define $dir before using it in "$modulepm =" in + extract_name_ver_from_makefile(). + * Replace q[quotes] by "quotes" when parsing Makefile.PL in + extract_name_ver_from_makefile(). + * Actually use command line option "--desc". + + [ Damyan Ivanov ] + * Added packaging copyright/licensing to the generated debian/copyright + * Added myself to Uploaders + * Wrap long fields in debian/control + * Add detailed copyright info in debian/copyright according to SVN logs and + debian/changelog + + [ Gunnar Wolf ] + * Clarified the messages when called in a system where apt-file + (recommended but not depended upon) is not present (Closes: #428415) + * Added some modules should be part of @stdmodules; the list is hand- + crafted and incomplete - we need a better solution! + + -- Gunnar Wolf Tue, 07 Aug 2007 10:50:45 -0500 + +dh-make-perl (0.26) unstable; urgency=low + + [ Frank Lichtenheld ] + * s/debian/Debian/ in Description + + [ Gunnar Wolf ] + * Trimmed unneeded whitespace from generated files - Thanks to Kees + Cook for the patch! (Closes: #411282) + * Patched regex for finding the module name when unde Module::Install, + allowing for whitespace between the "name" string and the module + name. Thanks to Marc Chantreux for the patch (and the patience ;-) ) + * Replaced the (now deprecated) call to the external program 822-date + for date -R + * Started reorganizing the code - All bare open() calls are now + handled through IO::File; shuffled some functions around so the code + is more followable + * Added --core-ok option to allow building core modules (Closes: + #409017) + + -- Gunnar Wolf Wed, 09 May 2007 19:24:16 -0500 + +dh-make-perl (0.25) unstable; urgency=low + + * Fixed the Perl package data parsing function, fixing an unneeded + warning. Thanks to Johnny Morano for the patch! (Closes: #396846) + * Generated dependency on Perl was incomplete (it _only_ missed the + package name :-/ ) - Thanks to Hilko Bengen for pointing it out. + (Closes: #400400) + * No longer dies when building Module::Install modules - It now asks + the user to manually specify the dependencies. (Closes: #396536) + * Can now specify via command line depends, build-depends and build- + depends-indep + * A bit of basic cleaning, trying to deuglify this very much love- + needing source code + * Added patch by Jesper Krogh which allows dh-make-perl to generate + versioned dependency strings (Closes: #364325) + + -- Gunnar Wolf Tue, 28 Nov 2006 11:47:32 -0600 + +dh-make-perl (0.24) unstable; urgency=low + + * Transferred package ownership to the Debian Perl Group + * Added patch by Fermin Galan, allowing to specify the maintainer from + the overrides file + * Fixed Perl package version parsing (Closes: #386086, #393438) + * Fixed: Was not properly ignoring Subversion/CVS directories when + called with an implicit --exclude/-i (Closes: #394314) + * Fixes the cases where Makefile.PL depends on FindBin (Closes: + #375146) + + -- Gunnar Wolf Fri, 27 Oct 2006 13:22:17 -0500 + +dh-make-perl (0.23) unstable; urgency=low + + * Added --requiredeps option, to force dh-make-perl to choke on + unresolvable dependencies (Closes: #382027) + * Packages which are not arch-indep will correctly list perl as build- + depends, not build-depends-indep (Closes: #381148) + * The version of Perl depended upon for building is the one currently + installed in the system, as reported by dpkg + + -- Gunnar Wolf Mon, 28 Aug 2006 20:57:15 -0500 + +dh-make-perl (0.22) unstable; urgency=low + + * Added patch by Peter Morch allowing user again + to specify packaging version number (which we had, but was trampled upon + by autodetection code). (Closes: #382039) + * Updated generated standards-version to 3.7.2, after checking nothing + specifically refers to Perl packaging. Updated debhelper required + version to >= 5.0.0 (Closes: #381130) + * Updated this package's standards-version to 3.7.2 and debhelper + required version to >= 5.0.0 + + -- Gunnar Wolf Sun, 13 Aug 2006 20:09:12 -0500 + +dh-make-perl (0.21) unstable; urgency=low + + * Added patch by Adam Sjoegren/Damyan Ivanov fixing newlines in + descriptions that broke the generated debian/control files (Closes: + #350728) + + -- Gunnar Wolf Wed, 8 Mar 2006 12:56:03 -0600 + +dh-make-perl (0.20) unstable; urgency=low + + * No longer ignores META.yml due to the silly oversight of yours + truly, that was handing back an empty hashref :-/ Thanks to Adam + Sj�gren and to Noel Maddy for two equivalent reports and two + identical patches. (Closes: #331658, #328687) + * Added yet-another-case of how to get version information - Thanks to + Noel Maddy for the patch (Closes: #328700) + + -- Gunnar Wolf Mon, 24 Oct 2005 12:31:59 -0500 + +dh-make-perl (0.19) unstable; urgency=low + + * Generated debian/watch was including the trailing dot as part of the + version number - fixed + * Does not die anymore when META.yml is wrongly formed (Closes: + #326807) + + -- Gunnar Wolf Tue, 6 Sep 2005 16:50:14 -0500 + +dh-make-perl (0.18) unstable; urgency=low + + * Generated modules don't ignore the result of the cleaning process in + the presence of a Makefile/Build (Closes: #325452) + * Supports also getting information from modules that use + Module::Install + * Better support for getting information out of the META.yml file, + needed for correct building of Module::Build-based modules (Closes: + #315798) + + -- Gunnar Wolf Mon, 29 Aug 2005 11:56:28 -0500 + +dh-make-perl (0.17) unstable; urgency=low + + * Fixed: Module::Depends::Intrusive was unable to find files because + the build dir was not part of @INC (Closes: #303806) + * Fixed: Oversight in previous version breaks information gathering + from modules including a valid META.yml (Closes: #309552) + + -- Gunnar Wolf Wed, 18 May 2005 09:36:11 -0500 + +dh-make-perl (0.16) unstable; urgency=low + + * dh-make-perl: Die on error from Module::Depends::Intrusive + * Fixed extract_name_ver to correctly deal with empty META.yml files + + -- Gunnar Wolf Sat, 14 May 2005 17:20:30 -0500 + +dh-make-perl (0.15) unstable; urgency=low + + * dh-make-perl: Fix documentation to respect the new names for the rules + templates. + * dh-make-perl: Check if module from cpan is a standard module + (Closes: #136732) + * dh-make-perl: Uses Module::Depends::Intrusive in extract_depends() to find + dependencies now. This simulates a build of the module ensuring that you + get all the dependencies. (Closes: #297537) + * debian/control: Added dependency on libmodule-depends-perl for dependency + detection fix. + * dh-make-perl: Added a function to make a watch file for modules from + CPAN. (Closes: #253919) + + -- Gunnar Wolf Fri, 1 Apr 2005 18:05:14 -0600 + +dh-make-perl (0.14) unstable; urgency=medium + + * rules.ModuleBuild.{noxs,xs}: Add rules templates for Module::Build + based packages. Thanks for the (slightly modified) patch from + Jason Kohles . (Closes: #258123, #285941, #300121). + Thanks to Marc 'HE' Brockschmidt for incorporating this work. + * Now performs tests as part of the build process. Added the --notest + switch to revert the behavior to the old one. + * Added a Recommends: libmodule-build-perl relationship + + -- Gunnar Wolf Wed, 23 Mar 2005 19:32:08 -0600 + +dh-make-perl (0.13) unstable; urgency=low + + * New maintainer, Gunnar Wolf , with Wolfgang Schemmel + as a co-maintainer. + * Fixed bug which made dh-make-perl get the module name wrong when it ended + in ::Perl. Applied patch by David Pashley - Thanks! (Closes: #249472) + * Fixed an uninitialized substitution warning if there is no + changelog. Applied patch semantically equivalent to Edward Bett's, + thanks! (Closes: #243338) + * Handles the cases where POD has DETAILS instead of DESCRIPTION, as + well as cases where the POD files are DOS-like (i.e., lines end with + \r\n). Applied Edward Betts' patch, thanks! (Closes: #267899) + * Documented the --build and --install switches in the synopsis, + forced the module to be built if only --install is specified. + (Closes: #269606) + + -- Gunnar Wolf Mon, 14 Mar 2005 14:03:17 -0600 + +dh-make-perl (0.12) unstable; urgency=low + + * debian/rules: Make make clean cleaner. + * debian/control: I'm a DD now! + * dh-make-perl: + + Don't use rename, as it won't work across devices. + + Rewrite the ugly stuff that inserts the found docs and the changes file + into the rules file. IMO this whole thing has to be rewritten *sigh* + + Fix --build switch by calling make directly with the -C switch. Thanks + for the report to Emanuele Zeppieri (Closes: + #241159) + + Work with DEBEMAIL and DEBFULLNAME as dch does. + + Fix regexp finding the used modules to allow stuff like use Gtk2"-init" + and Foobar(). Thanks for the report to Eric Schwartz + . (Closes: #234774) + . + ### I'm planning to rewrite dh-make-perl over the next few weeks. Please + ### mail me if you want to contribute or have ideas for new features. + + -- Marc 'HE' Brockschmidt Wed, 31 Mar 2004 17:30:44 +0200 + +dh-make-perl (0.11) unstable; urgency=low + + * Let dh-make-perl also work on directories other than ".". (Closes: + #230382) + * Apply patch from Gaal Yahas to the CPAN code, now + CPAN.pm itself chooses the default mirror. Thanks Gaal! (Closes: #230409) + * Fixed "Use of uninitialized value" warnings in the default override file. + * Introducing the --exclude|i switch to allow people to exclude some files + from the search for docs and stuff. This defaults to the exclusion of + CVS/.svn dirs. (Closes: #223411, #227183, #227113) + * Now prints out the Perl error message when failing to open a file. + * Add a note to the end of the long description to state that it was + automagically extracted from the source. (Closes: #226146) + * Updated both rules.noxs and rules.xs. + * Updated manpage. + + -- Marc Brockschmidt Mon, 9 Feb 2004 20:39:46 +0100 + +dh-make-perl (0.10) unstable; urgency=low + + * New maintainer. (Closes: #206877) + * Acknowledge fixes in the 3 NMUs. (Closes: #153311, #138517, #149295, + #158427, #131937, #134404, #143631) + * Changed debhelper version number in the generated debian/rules file to + woody standard 4.0.2. (Closes: #188313) + * Changed some CPAN things: The package will be build in ./$packagename/, + a tarball will be moved to ./$packagename_$version.orig.tar.gz. + * Use Build-Depends-Indep for perl instead of Build-Depends to make packages + lintian clean. + * Search for packages containing needed perl modules with apt-file (if + installed), otherwise just output the list of needed modules. (Closes: + #194755) + * Applied patch to enable overrides again. Thanks to Adrian Phillips + . (Closes: #207822) + * Applied patch to parse Makefile.PL right (Sometimes we need DISTNAME and + not NAME). Thanks to Adrian Phillips . (Closes: #207833) + * Applied patch to get information from META.yml instead of Makefile.PL. + Thanks to Ilya Martynov . (Closes: #209059) + + -- Marc Brockschmidt Fri, 24 Oct 2003 13:03:11 +0200 + +dh-make-perl (0.9-0.4) unstable; urgency=low + + * Non-maintainer upload + * Change from section "interpreters" to "perl" in boilerplate. + * changed to debian/compat instead of DH_COMPAT + * change to debhelper compatibility level v4 from v3: added ${misc:Depends} + + -- Ivan Kohler Mon, 31 Mar 2003 13:16:29 -0800 + +dh-make-perl (0.9-0.3) unstable; urgency=low + + * Non-maintainer upload + * Use version from CPAN if --cpan was used and Paolo's parsing fails, + as per suggestion from joeyh (closes: Bug#158427) + + -- Ivan Kohler Mon, 2 Sep 2002 03:57:49 -0700 + +dh-make-perl (0.9-0.2) unstable; urgency=low + + * Non-maintainer upload + * Reformat description (closes: Bug#134404) + * Fix binary-arch vs. binary-indep in package's own debian/rules + * Don't create a README.Debian file or use Emacs vars in changelog + (closes: Bug#153311) + * Use an extension on perl -pi invocations (closes: Bug#149295) + * Better $VERSION parsing, perhaps (closes: Bug#138517) might be better to + just ask CPAN(PLUS)? + * fix typo in manpage (closes: Bug#131937) + * CPANPLUS option (closes: Bug#143631) + * Fix binary-arch vs. binary-indep in rules.noxs + * Automatically add links to /usr/share/common-licenses for some common + licenses. + + -- Ivan Kohler Thu, 22 Aug 2002 18:18:51 -0700 + +dh-make-perl (0.9) unstable; urgency=low + + * Handle better files without pod info (Closes: bug#109437). + * Require the user to specify the version if the euristics don't work: + closes: bug#112373. + * Use dh_installman in the rules files instead of dh_installmanpages: + closes: bug#118130. + + -- Paolo Molaro Sun, 11 Nov 2001 19:36:06 +0100 + +dh-make-perl (0.8) unstable; urgency=low + + * Quick, before anyone notices. + + -- Paolo Molaro Wed, 13 Jun 2001 09:49:38 +0200 + +dh-make-perl (0.7) unstable; urgency=low + + * gzclose error was on CPAN module (Closes: bug#86644). + * Fixed descriptions (Closes: bug#94570). + * Updates for new version of CPAN.pm. + * Limit somewhat the lines of text in the descriptions. + * Handle better some weird situations (Closes: bug#89733). + * Also consider $ENV{DEBFULLNAME) for the maintainer's name (Closes: bug#98316). + + -- Paolo Molaro Tue, 12 Jun 2001 15:39:50 +0200 + +dh-make-perl (0.6) unstable; urgency=low + + * Handle correctly interior sequences in pod parser. + * Shut up some warnings. + * Correctly set maintainer email in some cases. + * Better copyright guesses. + * Ensure policy compliant names and version numbers. + * Fixes in rules files (support DEB_BUILD_OPTIONS). + * Better checks for binary modules (added a --arch option, too). + + -- Paolo Molaro Mon, 19 Feb 2001 13:52:39 +0100 + +dh-make-perl (0.5) unstable; urgency=low + + * Do not use install-stamp in sample rules files (Closes: bug#84509). + * Updates to policy 3.5.1. + + -- Paolo Molaro Sun, 18 Feb 2001 21:42:27 +0100 + +dh-make-perl (0.4) unstable; urgency=low + + * Use Pod::Parser to parse the pod tags. + * Build package in current directory. + * Updated generated rules files to new perl policy. + + -- Paolo Molaro Fri, 16 Feb 2001 23:39:08 +0100 + +dh-make-perl (0.3) unstable; urgency=low + + * Fix typo in README.Debian filename (Closes: bug#77499). + * Handle description creation better (Closes: bug#78970). + * Fixed docs about DEBEMAIL env var (Closes: bug#80607). + + -- Paolo Molaro Sun, 28 Jan 2001 13:20:52 +0100 + +dh-make-perl (0.2) unstable; urgency=low + + * Added support for downloading modules from CPAN. + * Added switches to build and install the resulting package. + + -- Paolo Molaro Wed, 25 Oct 2000 15:52:55 +0200 + +dh-make-perl (0.1) unstable; urgency=low + + * Initial Release. + + -- Paolo Molaro Mon, 16 Oct 2000 19:14:24 +0200 + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/compat b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/control b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/control new file mode 100644 index 0000000..4c4dca7 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/control @@ -0,0 +1,28 @@ +Source: dh-make-perl +Section: devel +Priority: optional +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl +Maintainer: Debian Perl Group +Uploaders: Gunnar Wolf , Wolfgang Schemmel , + Christopher Sacca , + Damyan Ivanov , gregor herrmann , + David Paleino , + Oliver Gorwits +Standards-Version: 3.8.0 +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/dh-make-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/dh-make-perl/ + +Package: dh-make-perl +Architecture: all +Depends: debhelper (>= 4.0.2), libpod-parser-perl, ${perl:Depends}, make, + dpkg-dev, fakeroot, ${misc:Depends}, libyaml-perl, libmodule-depends-perl, + libwww-mechanize-perl, libemail-date-format-perl +Recommends: apt-file (>= 2.1.0), libmodule-build-perl +Description: Create Debian packages from perl modules + dh-make-perl will create the files required to build a Debian source + package out of a perl package. This works for most simple packages + and is also useful for getting started with packaging perl modules. + Given a perl package name, it can also automatically download it from + CPAN. + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/copyright b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/copyright new file mode 100644 index 0000000..557374e --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/copyright @@ -0,0 +1,16 @@ +dh-make-perl was created by Paolo Molaro. + +It is currently maintained by Gunnar Wolf and others, under the umbrella of the +Debian Perl Group + +Copyright (c) 2000,2001 Paolo Molaro + (c) 2002,2003,2008 Ivan Kohler + (c) 2003,2004 Marc 'HE' Brockschmidt + (c) 2005-2007 Gunnar Wolf + (c) 2006 Frank Lichtenheld + (c) 2007-2008 Gregor Herrmann + (c) 2007-2008 Damyan Ivanov + +You can do anything with it according to the GPLv2: look +in /usr/share/common-licenses/GPL-2 on your Debian system. + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/rules b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/rules new file mode 100755 index 0000000..d9fb347 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/debian/rules @@ -0,0 +1,76 @@ +#!/usr/bin/make -f +#-*- makefile -*- +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Christoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +INST=$(CURDIR)/debian/dh-make-perl + +build: build-stamp +build-stamp: + dh_testdir + + # Add here commands to compile the package. + pod2man --center debian dh-make-perl > dh-make-perl.1 + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + @for i in Strange-0.1 Strange-2.1; do\ + if test -d "$$i/debian"; then \ + cd $$i; \ + debian/rules clean; \ + cd ..; \ + rm -rf $$i/debian; \ + fi \ + done + + dh_clean dh-make-perl.1 $(wildcard *.changes) $(wildcard *.deb) $(wildcard *.gz) + +install: + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp. + #$(MAKE) install DESTDIR=`pwd`/debian/tmp + mkdir -p $(INST)/usr/bin + mkdir -p $(INST)/usr/share/dh-make-perl + cp dh-make-perl $(INST)/usr/bin + cp rules* $(INST)/usr/share/dh-make-perl + cp overrides $(INST)/usr/share/dh-make-perl + + +# Build architecture-independent files here. +binary-arch: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-indep: build install + dh_testdir + dh_testroot + dh_installdocs README + dh_installman dh-make-perl.1 + dh_installchangelogs + dh_compress + dh_fixperms + dh_installdeb + dh_perl + dh_gencontrol + dh_md5sums + dh_builddeb + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/dh-make-perl b/dev/i386/dh-make-perl/dh-make-perl-0.47/dh-make-perl new file mode 100755 index 0000000..ae0f1f4 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/dh-make-perl @@ -0,0 +1,1557 @@ +#!/usr/bin/perl -w +use Pod::Parser; +use YAML; +use IO::File; +use File::Basename; +use File::Find; +use File::Copy qw(copy move); +use User::pwent; +use Getopt::Long; +use Cwd; +use CPAN; +use Module::Depends::Intrusive; +use Email::Date::Format qw(email_date); +use strict; + +# TODO: +# * get more info from the package (maybe using CPAN methods) + +###################################################################### +# This Pod::Parser must be declared before the main program flow. If you +# are trying to figure out what happens inside dh-make-perl, skip down +# until 'package main'. +package MyPod; + +@MyPod::ISA = qw(Pod::Parser); + +sub set_names { + my ($parser, @names) = @_; + foreach my $n (@names) { + $parser->{_deb_}->{$n} = undef; + } +} + +sub get { + my ($parser, $name) = @_; + $parser->{_deb_}->{$name}; +} + +sub cleanup { + my $parser = shift; + delete $parser->{_current_}; + foreach my $k ( keys %{$parser->{_deb_}}) { + $parser->{_deb_}->{$k} = undef; + } +} + +sub command { + my ($parser, $command, $paragraph, $line_num) = @_; + $paragraph =~ s/\s+$//s; + if ($command =~ /head/ && exists($parser->{_deb_}->{$paragraph})) { + $parser->{_current_} = $paragraph; + $parser->{_lineno_} = $line_num; + } else { + delete $parser->{_current_}; + } + #print "GOT: $command -> $paragraph\n"; +} + +sub add_text { + my ($parser, $paragraph, $line_num) = @_; + return unless exists $parser->{_current_}; + return if ($line_num - $parser->{_lineno_} > 15); + $paragraph =~ s/^\s+//s; + $paragraph =~ s/\s+$//s; + $paragraph = $parser->interpolate($paragraph, $line_num); + $parser->{_deb_}->{$parser->{_current_}} .= "\n\n".$paragraph; + #print "GOTT: $paragraph'\n"; +} + +sub verbatim { shift->add_text(@_)} + +sub textblock { shift->add_text(@_)} + +sub interior_sequence { + my ($parser, $seq_command, $seq_argument) = @_; + if ($seq_command eq 'E') { + my %map = ('gt' => '>', 'lt' => '<', 'sol' => '/', 'verbar' => '|'); + return $map{$seq_argument} if exists $map{$seq_argument}; + return chr($seq_argument) if ($seq_argument =~ /^\d+$/); + # html names... + } + return $seq_argument; +} + +###################################################################### +# Main dh-make-perl starts here, don't look any further! +package main; +my (@stdmodules, $min_perl_version, $debstdversion, $priority, $section, + $depends, $bdepends, $bdependsi, $maintainer, $arch, $closes, $date, + $debiandir, $startdir, $datadir, $homedir, $email); +our %overrides; + +$debstdversion = '3.8.0'; +$priority = 'optional'; +$section = 'perl'; +$depends = '${perl:Depends}'; +# 5.6.0-12 is where arch-indep modules are moved in /usr/share/perl5 +# (according to dh_perl) +# if the module has stricter requirements, this build-dependency +# is replaced below by calling substitute_perl_dependency +$min_perl_version = '5.6.10-12'; +$bdependsi = "perl (>= $min_perl_version)"; +$arch = 'all'; +$date = email_date(time); +$startdir = getcwd(); +$datadir = '/usr/share/dh-make-perl'; +$homedir = "$ENV{HOME}/.dh-make-perl"; + +my ($perlname, $maindir, $modulepm, $meta); +my ($pkgname, $srcname, + # $version is the version from the perl module itself + $version, + # $pkgversion is the resulting version of the package: User's + # --version=s or "$version-1" + $pkgversion, + $desc, $longdesc, $copyright, $author, $upsurl); +my ($extrasfields, $extrapfields); +my ($module_build); +my (@docs, @examples, $changelog, @args); + +my %opts = ( + 'dh' => 5, +); + +my $mod_cpan_version; + +$opts{dbflags} = $>==0?"":"-rfakeroot"; +chomp($date); + +GetOptions(\%opts, + 'arch=s', 'basepkgs=s', 'bdepends=s', 'bdependsi=s', + 'build!', 'core-ok', 'cpan=s', 'cpanplus=s', 'closes=i', + 'cpan-mirror=s', 'dbflags=s', 'depends=s', 'desc=s', + 'exclude|i:s{,}', 'help', 'install!', 'nometa', 'notest', + 'pkg-perl!', 'requiredeps', 'version=s', 'e=s', 'email=s', + 'p=s', 'packagename=s', 'refresh|R', 'dh=i' +) or die usage_instructions(); + +$bdepends = "debhelper (>= $opts{dh})"; +@stdmodules = get_stdmodules(); + +# Help requested? Nice, we can just die! Isn't it helpful? +die usage_instructions() if $opts{help}; +die "CPANPLUS support disabled, sorry" if $opts{cpanplus}; + +$opts{exclude} = '(?:\/|^)(?:CVS|\.svn)\/' if (!defined $opts{exclude} or + $opts{exclude} eq ''); + +$arch = $opts{arch} if defined $opts{arch}; + +if ( $opts{refresh} ) +{ + print "Engaging refresh mode\n"; + $maindir='.'; + $meta = process_meta("$maindir/META.yml") if (-f "$maindir/META.yml"); # package name + ($pkgname, $version) = extract_basic(); # also detects arch-dep package + $module_build = (-f "$maindir/Build.PL") ? "Module-Build" : "MakeMaker"; + $debiandir='./debian'; + extract_changelog($maindir); + extract_docs($maindir); + extract_examples($maindir); + print "Found changelog: $changelog\n" if defined $changelog; + print "Found docs: @docs\n"; + print "Found examples: @examples\n" if @examples; + create_rules("$debiandir/rules"); + fix_rules( + "$debiandir/rules", + (defined $changelog ? $changelog : ''), + \@docs, \@examples, + ); + print "Done\n"; + exit 0; +} + +load_overrides(); +my $tarball = setup_dir(); +$meta = process_meta("$maindir/META.yml") if (-f "$maindir/META.yml"); +findbin_fix(); + +if (defined $opts{e}) { + $email = $opts{e}; +} elsif (defined $opts{email}) { + $email = $opts{email}; +} else { + $email = ''; +} +$maintainer = get_maintainer($email); + +if (defined $opts{desc}) { + $desc = $opts{desc}; +} else { + $desc = ''; +} +($pkgname, $version) = extract_basic(); +if (defined $opts{p}) { + $pkgname = $opts{p}; +} elsif (defined $opts{packagename}) { + $pkgname = $opts{packagename}; +} +unless (defined $opts{version}) { + $pkgversion = $version . "-1"; +} else { + $pkgversion = $opts{version}; +} + +move ($tarball, dirname($tarball) . "/${pkgname}_${version}.orig.tar.gz") if ($tarball && $tarball =~ /(?:\.tar\.gz|\.tgz)$/); +$module_build = (-f "$maindir/Build.PL") ? "Module-Build" : "MakeMaker"; +extract_changelog($maindir); +extract_docs($maindir); +extract_examples($maindir); + +if (defined $opts{bdepends}) { + $bdepends = $opts{bdepends}; +} else { + $bdepends .= ', libmodule-build-perl' if ($module_build eq "Module-Build"); +} +$bdependsi = $opts{bdependsi} if defined $opts{bdependsi}; + +if (defined $opts{depends}) { + $depends = $opts{depends}; +} else { + $depends .= ', ${shlibs:Depends}' if $arch eq 'any'; + $depends .= ', ${misc:Depends}'; + my $extradeps = extract_depends($maindir, $meta); + $depends .= ( $extradeps ? ", $extradeps" : '' ); +} + +apply_overrides(); + +die "Cannot find a description for the package: use the --desc switch\n" + unless $desc; +print "Package does not provide a long description - " , + " Please fill it in manually.\n" + if (!defined $longdesc or $longdesc =~ /^\s*\.?\s*$/); +print "Using maintainer: $maintainer\n"; +print "Found changelog: $changelog\n" if defined $changelog; +print "Found docs: @docs\n"; +print "Found examples: @examples\n" if @examples; +-d $debiandir && die "The directory $debiandir is already present and I won't overwrite it: remove it yourself.\n"; +# start writing out the data +mkdir ($debiandir, 0755) || die "Cannot create $debiandir dir: $!\n"; +create_control("$debiandir/control"); +if (defined $opts{closes}) { + $closes = $opts{closes}; +} else { + $closes = get_itp($pkgname); +} +create_changelog("$debiandir/changelog", $closes); +create_rules("$debiandir/rules"); +create_compat("$debiandir/compat"); +create_watch("$debiandir/watch") if $upsurl; +#create_readme("$debiandir/README.Debian"); +create_copyright("$debiandir/copyright"); +fix_rules("$debiandir/rules", (defined $changelog ? $changelog : ''), \@docs, \@examples); +apply_final_overrides(); +build_package($maindir) if $opts{build} or $opts{install}; +install_package($debiandir) if $opts{install}; +print "Done\n"; +exit(0); + +sub usage_instructions { +return <<"USAGE" +Usage: +$0 [ --build ] [ --install ] [ SOURCE_DIR | --cpan MODULE ] +$0 --refresh|-R +Other options: [ --desc DESCRIPTION ] [ --arch all|any ] [ --version VERSION ] + [ --depends DEPENDS ] [ --bdepends BUILD-DEPENDS ] + [ --bdependsi BUILD-DEPENDS-INDEP ] [ --cpan-mirror MIRROR ] + [ --exclude|-i [REGEX] ] [ --notest ] [ --nometa ] + [ --requiredeps ] [ --core-ok ] [ --basepkgs PKGSLIST ] + [ --closes ITPBUG ] [ --packagename|-p PACKAGENAME ] + [ --email|-e EMAIL ] [ --pkg-perl ] [ --dh ] +USAGE +} + +sub get_stdmodules { + my ($base_packages, @modules, $paths); + $base_packages = $opts{basepkgs} || 'perl,perl-base,perl-modules'; + + # We will check on all the base Perl packages for the modules they provide. + # To know which files we care for, we look at @INC - In a format easy to + # integrate into a regex + $paths = join('|', @INC); + + for my $pkg (split(/,/,$base_packages)) { + for my $file (map {chomp;$_} `dpkg -L $pkg`) { + next unless $file =~ s!^(?:$paths)[\d\.]*/(.*).pm$!$1!x; + + $file =~ s!/!::!g; + push @modules, $file; + } + } + + return sort @modules; +} + +sub setup_dir { + my ($dist, $mod, $cpanversion, $tarball); + $mod_cpan_version = ''; + if ($opts{cpan}) { + my ($new_maindir); + # Is the module a core module? + if (grep(/$opts{cpan}/, @stdmodules)) { + die "$opts{cpan} is a standard module.\n" + unless $opts{'core-ok'}; + } + + # Make CPAN happy, make the user happy: Be more tolerant! + # Accept names to be specified with double-colon, dash or slash + $opts{cpan} =~ s![/-]!::!g; + +### require CPAN; + CPAN::Config->load; + + unshift(@{$CPAN::Config->{'urllist'}}, $opts{'cpan-mirror'}) + if $opts{'cpan-mirror'}; + + $CPAN::Config->{'build_dir'} = $ENV{'HOME'} . "/.cpan/build"; + $CPAN::Config->{'cpan_home'} = $ENV{'HOME'} . "/.cpan/"; + $CPAN::Config->{'histfile'} = $ENV{'HOME'} . "/.cpan/history"; + $CPAN::Config->{'keep_source_where'} = $ENV{'HOME'} . "/.cpan/source"; + + # This modification allows to retrieve all the modules that + # match the user-provided string. + # + # expand() returns a list of matching items when called in list + # context, so after retrieving it, I try to match exactly what + # the user asked for. Specially important when there are + # different modules which only differ in case. + # + # This Closes: #451838 + my @mod = CPAN::Shell->expand('Module', '/^'.$opts{cpan}.'$/') + or die "Can't find '$opts{cpan}' module on CPAN\n"; + foreach(@mod) { + my $file = $_->cpan_file(); + $file =~ s#.*/##; # remove directory + $file =~ s/(.*)-.*/$1/; # remove version and extension + $file =~ s/-/::/g; # convert dashes to colons + if($file eq $opts{cpan}) { + $mod = $_; + last; + } + } + $mod = shift @mod unless($mod); + $mod_cpan_version = $mod->cpan_version; + $cpanversion = $CPAN::VERSION; + $cpanversion =~ s/_.*//; + + $tarball = $CPAN::Config->{'keep_source_where'} . "/authors/id/"; + + if ($cpanversion < 1.59) { # wild guess on the version number + $dist = $CPAN::META->instance('CPAN::Distribution', $mod->{CPAN_FILE}); + $dist->get || die "Cannot get $mod->{CPAN_FILE}\n"; + $tarball .= $mod->{CPAN_FILE}; + $maindir = $dist->{'build_dir'}; + } else { + # CPAN internals changed + $dist = $CPAN::META->instance('CPAN::Distribution', $mod->cpan_file); + $dist->get || die "Cannot get ", $mod->cpan_file, "\n"; + $tarball .= $mod->cpan_file; + $maindir = $dist->dir; + } + + copy ($tarball, $ENV{'PWD'}); + $tarball = $ENV{'PWD'} . "/" . basename($tarball); + # build_dir contains a random part since 1.88_59 + # use the new CPAN::Distribution::base_id (introduced in 1.91_53) + $new_maindir = $ENV{PWD} . "/" . ( + $cpanversion < 1.9153 ? basename($maindir) : $dist->base_id + ); + # rename existing directory + if (-d $new_maindir && system("mv", "$new_maindir", "$new_maindir.$$") == 0) { + print '='x70,"\n"; + print "Unpacked tarball already existed, directory renamed to $new_maindir.$$\n"; + print '='x70,"\n"; + } + system("mv", "$maindir", "$new_maindir") == 0 + or die "Failed to move $maindir to $new_maindir: $!"; + $maindir = $new_maindir; + + } elsif ($opts{cpanplus}) { + die "CPANPLUS support is b0rken at the moment."; +# my ($cb, $href, $file); + +# eval "use CPANPLUS 0.045;"; +# $cb = CPANPLUS::Backend->new(conf => {debug => 1, verbose => 1}); +# $href = $cb->fetch( modules => [ $opts{cpanplus} ], fetchdir => $ENV{'PWD'}); +# die "Cannot get $opts{cpanplus}\n" if keys(%$href) != 1; +# $file = (values %$href)[0]; +# print $file, "\n\n"; +# $maindir = $cb->extract( files => [ $file ], extractdir => $ENV{'PWD'} )->{$file}; + } else { + $maindir = shift(@ARGV) || '.'; + $maindir =~ s/\/$//; + } + return $tarball; +} + +sub build_package { + my $maindir = shift; + # uhmf! dpkg-genchanges doesn't cope with the deb being in another dir.. + #system("dpkg-buildpackage -b -us -uc $opts{dbflags}") == 0 + system("fakeroot make -C $maindir -f debian/rules clean"); + system("fakeroot make -C $maindir -f debian/rules binary") == 0 + || die "Cannot create deb package\n"; +} + +sub install_package { + my ($archspec, $debname); + + if ($arch eq 'any') { + $archspec = `dpkg --print-architecture`; + chomp($archspec); + } else { + $archspec = $arch; + } + + $debname = "${pkgname}_$version-1_$archspec.deb"; + + system("dpkg -i $startdir/$debname") == 0 + || die "Cannot install package $startdir/$debname\n"; +} + +sub process_meta { + my ($file, $yaml); + $file = shift; + # Command line option nometa causes this function not to be run + return {} if $opts{nometa}; + + # YAML::LoadFile has the bad habit of dying when it cannot properly parse + # a file - Catch it in an eval, and if it dies, return -again- just an + # empty hashref. Oh, were it not enough: It dies, but $! is not set, so we + # check against $@. Crap, crap, crap :-/ + eval { + $yaml = YAML::LoadFile($file); + }; + if ($@) { + print "Error parsing $file - Ignoring it.\n"; + print "Please notify module upstream maintainer.\n"; + $yaml = {}; + } + + # Returns a simple hashref with all the keys/values defined in META.yml + return $yaml; +} + +sub extract_basic_copyright { + for my $f (qw(LICENSE LICENCE COPYING)) { + if (-f $f) { + return `cat $f`; + } + } + return undef; +} + +sub extract_basic { + ($perlname, $version) = extract_name_ver(); + find(\&check_for_xs, $maindir); + $pkgname = lc $perlname; + $pkgname = 'lib'.$pkgname unless $pkgname =~ /^lib/; + $pkgname .= '-perl' unless ($pkgname =~ /-perl$/ and $opts{cpan} !~ /::perl$/i); + + # ensure policy compliant names and versions (from Joeyh)... + $pkgname =~ s/[^-.+a-zA-Z0-9]+/-/g; + + $srcname = $pkgname; + $version =~ s/[^-.+a-zA-Z0-9]+/-/g; + $version = "0$version" unless $version =~ /^\d/; + + print "Found: $perlname $version ($pkgname arch=$arch)\n"; + $debiandir = "$maindir/debian"; + + $upsurl = "http://search.cpan.org/dist/$perlname/"; + + $copyright = extract_basic_copyright(); + if ($modulepm) { + extract_desc($modulepm); + } + + $opts{exclude} = '^$' unless $opts{exclude}; + find(sub { + $File::Find::name !~ /$opts{exclude}/ && + /\.(pm|pod)$/ && + extract_desc($_); + }, $maindir); + + return ($pkgname, $version); +} + +sub makefile_pl { + return "$maindir/Makefile.PL"; +} + +sub findbin_fix { + # FindBin requires to know the name of the invoker - and requires it to be + # Makefile.PL to function properly :-/ + $0 = makefile_pl(); + if (exists $FindBin::{Bin}) { + FindBin::again(); + } +} + +sub extract_name_ver { + my ($name, $ver, $makefile); + $makefile = makefile_pl(); + + if (defined $meta->{name} and defined $meta->{version}) { + $name = $meta->{name}; + $ver = $meta->{version}; + + } else { + ($name, $ver) = extract_name_ver_from_makefile($makefile); + } + + $name =~ s/::/-/g; + return ($name, $ver); +} + +sub extract_name_ver_from_makefile { + my ($file, $name, $ver, $vfrom, $dir, $makefile); + $makefile = shift; + + { + local $/ = undef; + my $fh = _file_r($makefile); + $file = $fh->getline; + } + + # Replace q[quotes] by "quotes" + $file =~ s/q\[(.+)]/'$1'/g; + + # Get the name + if ($file =~ /([\'\"]?) + DISTNAME\1\s* + (=>|,) + \s* + ([\'\"]?) + (\S+)\3/xs) { + # Regular MakeMaker + $name = $4; + } elsif ($file =~ /([\'\"]?) + NAME\1\s* + (=>|,) + \s* + ([\'\"]?) + (\S+)\3/xs) { + # Regular MakeMaker + $name = $4; + } elsif ($file =~ /name + \s* + \( + ([\'\"]?) + (\S+) + \1 + \);/xs) { + # Module::Install syntax + $name = $2; + } + $name =~ s/,.*$//; + # band aid: need to find a solution also for build in directories + # warn "name is $name (cpan name: $opts{cpan})\n"; + $name = $opts{cpan} if ($name eq '__PACKAGE__' && $opts{cpan}); + $name = $opts{cpanplus} if ($name eq '__PACKAGE__' && $opts{cpanplus}); + + # Get the version + if (defined $opts{version}) { + # Explicitly specified + $ver = $opts{version}; + + } elsif ($file =~ /([\'\"]?)VERSION\1\s*(=>|,)\s*([\'\"]?)(\S+)\3/s) { + # Regular MakeMaker + $ver = $4; + # Where is the version taken from? + $vfrom = $4 if + $file =~ /([\'\"]?)VERSION_FROM\1\s*(=>|,)\s*([\'\"]?)(\S+)\3/s; + + } elsif ($file =~ /([\'\"]?)VERSION_FROM\1\s*(=>|,)\s*([\'\"]?)(\S+)\3/s) { + # Regular MakeMaker pointing to where the version is taken from + $vfrom = $4; + + } elsif ($file =~ /version\((\S+)\)/s) { + # Module::Install + $ver = $1; + } + + $dir = dirname($makefile) || './'; + + $modulepm = "$dir/$vfrom" if defined $vfrom; + + for (($name, $ver)) { + next unless defined; + next unless /^\$/; + # decode simple vars + s/(\$\w+).*/$1/; + if ($file =~ /\Q$_\E\s*=\s*([\'\"]?)(\S+)\1\s*;/) { + $_ = $2; + } + } + + unless (defined $ver) { + local $/ = "\n"; + # apply the method used by makemaker + if (defined $dir and defined $vfrom and -f "$dir/$vfrom" + and -r "$dir/$vfrom") { + my $fh = _file_r("$dir/$vfrom"); + while (my $lin = $fh->getline) { + if ($lin =~ /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/) { + no strict; + #warn "ver: $lin"; + $ver = (eval $lin)[0]; + last; + } + } + $fh->close; + } else { + if ( $mod_cpan_version ) { + $ver = $mod_cpan_version; + warn "Cannot use internal module data to gather the ". + "version; using cpan_version\n"; + } else { + die "Cannot use internal module data to gather the ". + "version; use --cpan or --version\n"; + } + } + } + + return ($name, $ver); +} + +sub extract_desc { + my ($file, $parser); + $file = shift; + $parser = new MyPod; + return unless -f $file; + $parser->set_names(qw(NAME DESCRIPTION DETAILS COPYRIGHT AUTHOR AUTHORS)); + $parser->parse_from_file($file); + if ($desc) { + # No-op - We already have it, probably from the command line + + } elsif ($meta->{abstract}) { + # Get it from META.yml + $desc = $meta->{abstract}; + + } elsif (my $my_desc = $parser->get('NAME')) { + # Parse it, fix it, send it! + $my_desc =~ s/^\s*\S+\s+-\s+//s; + $my_desc =~ s/^\s+//s; + $my_desc =~ s/\s+$//s; + $my_desc =~ s/^([^\s])/ $1/mg; + $my_desc =~ s/\n.*$//s; + $desc = $my_desc; + } + # Replace linefeeds (not followed by a space) in $desc with spaces + $desc =~ s/\n(?=\S)/ /gs; + + unless ($longdesc) { + $longdesc = $parser->get('DESCRIPTION') + || $parser->get('DETAILS') + || $desc; + } + if (defined $longdesc && $longdesc !~ /^$/) { + $longdesc =~ s/^\s+//s; + $longdesc =~ s/\s+$//s; + $longdesc =~ s/^\t/ /mg; + $longdesc =~ s/^\s*$/ ./mg; + $longdesc =~ s/^\s*/ /mg; + $longdesc =~ s/^([^\s])/ $1/mg; + $longdesc =~ s/\r//g; + } + + $copyright = $copyright || $parser->get('COPYRIGHT'); + if (!$author) { + if (ref $meta->{author}) { + # Does the author information appear in META.yml? + $author = join(', ', @{$meta->{author}}); + } else { + # Get it from the POD + $author = $parser->get('AUTHOR') || $parser->get('AUTHORS'); + } + } + + $parser->cleanup; +} + +sub extract_changelog { + my ($dir) = shift; + $dir .= '/' unless $dir =~ m(/$); + find(sub { + $changelog = substr($File::Find::name, length($dir)) + if (!defined($changelog) && /^change(s|log)$/i and (! $opts{exclude} or $File::Find::name !~ /$opts{exclude}/)); + }, $dir); +} + +sub extract_docs { + my ($dir) = shift; + $dir .= '/' unless $dir =~ m(/$); + find(sub { + push (@docs, substr($File::Find::name, length($dir))) + if (/^(README|TODO|BUGS|NEWS|ANNOUNCE)/i and (! $opts{exclude} or $File::Find::name !~ /$opts{exclude}/)) ; + }, $dir); +} + +sub extract_examples { + my ($dir) = shift; + $dir .= '/' unless $dir =~ m(/$); + find(sub { + push (@examples, substr($File::Find::name, length($dir)) . '/*') + if (/^(examples|eg|samples?)$/i and (! $opts{exclude} or $File::Find::name !~ /$opts{exclude}/)) ; + }, $dir); +} + +sub run_depends { + my ($depends_module, $dir) = @_; + + no warnings; + local *STDERR; + open(STDERR, ">/dev/null"); + my $mod_dep = $depends_module->new(); + + $mod_dep->dist_dir( $dir ); + $mod_dep->find_modules(); + + my %dep_hash = %{$mod_dep->requires}; + + my $error = $mod_dep->error(); + die "Error: $error\n" if $error; + return %dep_hash; +} + +sub extract_depends { + my $dir = shift; + my $meta = shift; + my (%dep_hash, @uses, @deps, @not_debs, $has_apt_file); + local @INC = ($dir, @INC); + + $dir .= '/' unless $dir =~ m/\/$/; + + # try Module::Depends::Intrusive, but if that fails then + # fall back to Module::Depends. + + eval { + %dep_hash = run_depends('Module::Depends::Intrusive',$dir); + }; + if ($@) { + warn '='x70,"\n"; + warn "First attempt (Module::Depends::Intrusive) at a dependency\n" . + "check failed. Possible use of Module::Install ?\n" . + "Trying again with Module::Depends ... \n"; + warn '='x70,"\n"; + + eval { + %dep_hash = run_depends('Module::Depends',$dir); + }; + + if ($@) { + warn '='x70,"\n"; + warn "Could not find the dependencies for the requested module.\n"; + warn "Generated error: $@"; + + warn "Please check if your module depends on Module::Install\n" . + "for its build process - Automatically finding its\n" . + "dependencies is unsupported, please specify them manually\n" . + "using the 'depends' option. \n"; + warn "Alternatively, including a META.yml file with dependencies\n" . + "should allow discovery even for Module::Install modules. \n"; + warn '='x70,"\n"; + + exit 1; + } + } + + foreach my $module (keys( %dep_hash )) { + next if (grep ( /^$module$/, @stdmodules)); + + push @uses, $module; + } + + if (`which apt-file`) { + $has_apt_file = 1; + foreach my $module (@uses) { + my (@rawsearch, @search, $ls, $ver, $re, $mod); + + if ($module eq 'perl') { + substitute_perl_dependency($dep_hash{perl}); + next; + } + + $mod = $module; + print "Searching for package containing $module using apt-file.\n"; + $module =~ s|::|/|g; + + # Regex's to search the return of apt-file to find the right pkg + $ls = '(?:lib|share)'; + $ver = '\d+(\.\d+)+'; + $re = "usr/(?:$ls/perl/$ver|$ls/perl5)/$module\\.pm"; + + @rawsearch = `apt-file search -x '$re'`; + + # rank non -perl packages lower + @search = sort { + if ($a !~ /-perl: /) { return 1; } + elsif ($b !~ /-perl: /) { return -1; } + else { return $a cmp $b; } # or 0? + } @rawsearch; + + for (@search) { + # apt-file output + # package-name: path/to/perl/module.pm + chomp; + my ($p, $f) = split / /, $_; + chop($p); #Get rid of the ":" + if ($f =~ /$re/ && ! + grep { $_ eq $p } @deps, split(/,/,@stdmodules)) { + if (exists $dep_hash{$mod}) { + my $v = $dep_hash{$mod}; + $v =~ s/^v//; # strip leading 'v' from version + push @deps, {name=>$p, + version=>$v}; + } else { + push @deps, {name => $p}; + } + last; + } + } + + unless (@search) { + $module =~ s|/|::|g; + push @not_debs, $module; + } + } + } elsif ( $opts{requiredeps} ) { + die "--requiredeps was specified, but apt-file was not found\n"; + } + + print "\n"; + print "Needs the following debian packages: " . + join (", ", map {$_->{name}} @deps) . "\n" if (@deps); + if (@not_debs) { + my ($missing_debs_str); + if ($has_apt_file) { + $missing_debs_str = join("\n", "Needs the following modules for which there are no debian packages available", + map({" - $_"} @not_debs), ''); + } else { + $missing_debs_str = join("\n", "The following Perl modules are required and not installed in your system:", + map({" - $_"} @not_debs), + "You do not have 'apt-file' currently installed - If you install it, I will", + "be able to tell you which Debian packages are those modules in (if they are", + "packaged)."); + } + + if ( $opts{requiredeps} ) { + die $missing_debs_str; + } else { + print $missing_debs_str; + } + + } + + return join (", ", map { $_->{version} ? + $_->{name} ." (>= ". $_->{version} .")" : + $_->{name} } @deps); +} + +sub get_itp { + use WWW::Mechanize; + + my ($package) = shift @_; + + my $wnpp = "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=wnpp;includesubj=ITP: $package"; + my $mech = WWW::Mechanize->new(); + + $mech->get($wnpp); + + my @links = $mech->links(); + + foreach my $link (@links) { + my $desc = $link->text(); + + return $1 if $desc =~ /^#(\d+): ITP: $package /; + } + return 0; +} + +sub substitute_perl_dependency { + # If we get 'perl' specified in here, the module requires a + # specific version of Perl in order to be run. This is only + # reliable if we have ${perl:Depends} in $depends and either + # of $bdepends and $bdependsi - Warn otherwise. + my ($version, $dep_str, $old_dep_str, $old_bdep_str); + $version = shift; + + # Over-escaping? I'm putting this in variables to get a bit more clarity. + # Remember they will be fed into the regex engine. + $dep_str = "perl (>= $version)"; + $old_dep_str = '\\$\\{perl:Depends\\}'; + $old_bdep_str = "perl \\(>= $min_perl_version\\)"; + + unless ($depends =~ s/$old_dep_str/$dep_str/ and + ($bdepends =~ s/$old_bdep_str/$dep_str/ or + $bdependsi =~ s/$old_bdep_str/$dep_str/)) { + warn "The module requires Perl version $version, but you have ", + "apparently overriden the default dependency handling.\n", + "Please note that you might need to manually edit your debian/control ", + "- It might not make sense at all!\n"; + } +} + +sub check_for_xs { + (! $opts{exclude} or $File::Find::name !~ /$opts{exclude}/) && /\.(xs|c|cpp|cxx)$/i && do { + $arch = 'any'; + }; +} + +sub fix_rules { + my ($rules_file, $changelog_file, $docs, $examples, $test_line, $fh, @content); + ($rules_file, $changelog_file, $docs, $examples) = @_; + + if( $opts{dh} < 7 ) + { + $test_line = ($module_build eq 'Module-Build') ? + '$(PERL) Build test' : '$(MAKE) test'; + $test_line = "#$test_line" if $opts{notest}; + + $fh = _file_rw($rules_file); + @content = $fh->getlines; + + $fh->seek(0, 0) || die "Can't rewind $rules_file: $!"; + $fh->truncate(0)|| die "Can't truncate $rules_file: $!"; + for (@content) { + s/#CHANGES#/$changelog_file/g; + s/#EXAMPLES#/join " ", @examples/eg; + s/\s+dh_installexamples\s+$//g; # no need for empty dh_installexamples + s/#DOCS#/join " ", @docs/eg; + s/#TEST#/$test_line/g; + $fh->print($_); + } + $fh->close; + } + else + { + if( @examples ) + { + open F, '>>', "$maindir/debian/$pkgname.examples" or die $!; + print F "$_\n" foreach @examples; + close F; + } + if( @docs ) + { + open F, '>>', "$maindir/debian/$pkgname.docs" or die $!; + print F "$_\n" foreach @docs; + close F; + } + } +} + +sub create_control { + my $fh = _file_w(shift); + + if ($arch ne 'all' and + !defined($opts{bdepends}) and !defined($opts{bdependsi})) { + $bdepends .= ", $bdependsi"; + $bdependsi = ''; + } + + $fh->print("Source: $srcname\n"); + $fh->print("Section: $section\n"); + $fh->print("Priority: $priority\n"); + $fh->print("Build-Depends: $bdepends\n") if $bdepends; + $fh->print("Build-Depends-Indep: $bdependsi\n") if $bdependsi; + $fh->print($extrasfields) if defined $extrasfields; + if( $opts{'pkg-perl'} ) + { + $fh->print("Maintainer: Debian Perl Group \n"); + $fh->print("Uploaders: $maintainer\n"); + } + else + { + $fh->print("Maintainer: $maintainer\n"); + } + $fh->print("Standards-Version: $debstdversion\n"); + $fh->print("Homepage: $upsurl\n") if $upsurl; + do { + $fh->print("Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/$srcname/\n"); + $fh->print("Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/$srcname/\n"); + } if $opts{'pkg-perl'}; + $fh->print("\n"); + $fh->print("Package: $pkgname\n"); + $fh->print("Architecture: $arch\n"); + $fh->print("Depends: $depends\n") if $depends; + $fh->print($extrapfields) if defined $extrapfields; + $fh->print("Description: $desc\n$longdesc\n .\n This description was automagically extracted from the module by dh-make-perl.\n"); + $fh->close; +} + +sub create_changelog { + my $fh = _file_w(shift); + my $bug = shift; + + my $closes = $bug ? " (Closes: #$bug)" : ''; + + $fh->print("$srcname ($pkgversion) unstable; urgency=low\n"); + $fh->print("\n * Initial Release.$closes\n\n"); + $fh->print(" -- $maintainer $date\n"); + #$fh->print("Local variables:\nmode: debian-changelog\nEnd:\n"); + $fh->close +} + +sub create_rules { + my ($file, $rulesname, $error); + ($file) = shift; + $rulesname = ( + ($opts{dh} eq 7) + ? $arch eq 'all'?'rules.dh7.noxs' :'rules.dh7.xs' + : $arch eq 'all'?"rules.$module_build.noxs":"rules.$module_build.xs" + ); + + for my $source (("$homedir/$rulesname", "$datadir/$rulesname")) { + copy($source, $file) && do { + print "Using rules: $source\n"; + last; + }; + $error = $!; + } + die "Cannot copy rules file ($rulesname): $error\n" unless -e $file; + chmod(0755, $file); +} + +sub create_compat { + my $fh = _file_w(shift); + $fh->print("$opts{dh}\n"); + $fh->close; +} + +sub create_copyright { + my $fh = _file_w(shift); + my $incomplete = ''; + + $fh->print( +"This is the debian package for the $perlname module. +It was created by $maintainer using dh-make-perl. + +"); + if (defined $upsurl) { + $fh->print("It was downloaded from $upsurl\n\n"); + } else { + $incomplete .= "No upstream URL\n"; + } + $fh->print( +"This copyright info was automatically extracted from the perl module. +It may not be accurate, so you better check the module sources +if you don\'t want to get into legal troubles. + +"); + if (defined $author) { + $fh->print("The upstream author is: $author.\n"); + } else { + $incomplete .= "No upstream author\n"; + } + + if (defined($copyright)) { + $fh->print($copyright); + # Fun with regexes + if ( $copyright =~ /terms as Perl itself/i ) { + $fh->print(" + +Perl is distributed under your choice of the GNU General Public License or +the Artistic License. On Debian GNU/Linux systems, the complete text of the +GNU General Public License can be found in \`/usr/share/common-licenses/GPL\' +and the Artistic Licence in \`/usr/share/common-licenses/Artistic\'. +"); + } elsif ( $copyright =~ /GPL/ ) { + $fh->print(" + +The full text of the GPL is available on Debian systems in +/usr/share/common-licenses/GPL +"); + } + } else { + $incomplete .= "No licensing information\n"; + } + + my $year = (localtime)[5]+1900; + $fh->print(" + +The Debian packaging is (C) $year, $maintainer and +is licensed under the same terms as the software itself (see above). +"); + + $fh->close; + + if ($incomplete) { + _warn_incomplete_copyright($incomplete) + } +} + +sub create_readme { + my $fh = _file_w(shift); + $fh->print( +"This is the debian package for the $perlname module. +It was created by $maintainer using dh-make-perl. +"); + $fh->close; +} + +sub create_watch { + my $fh = _file_w(shift); + + my $version_re = 'v?(\d[\d_.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip)'; + + $fh->print( +"\# format version number, currently 3; this line is compulsory! +version=3 +\# URL to the package page followed by a regex to search +$upsurl .*/$perlname-$version_re\$ +"); + $fh->close; +} + +sub get_maintainer { + my ($user, $pwnam, $email, $name, $mailh); + $user = $ENV{LOGNAME} || $ENV{USER}; + $pwnam = getpwuid($<); + die "Cannot determine current user\n" unless $pwnam; + if (defined $ENV{DEBFULLNAME}) { + $name = $ENV{DEBFULLNAME}; + } else { + $name = $pwnam->gecos; + $name =~ s/,.*//; + } + $user ||= $pwnam->name; + $name ||= $user; + $email = shift @_ || ($ENV{DEBEMAIL} || $ENV{EMAIL}); + unless ($email) { + chomp($mailh = `cat /etc/mailname`); + $email = $user.'@'.$mailh; + } + + $email =~ s/^(.*)\s+<(.*)>$/$2/; + + return "$name <$email>"; +} + +sub load_overrides { + eval { + do "$datadir/overrides" if -f "$datadir/overrides"; + do "$homedir/overrides" if -f "$homedir/overrides"; + }; + if ($@) { + die "Error when processing the overrides files: $@"; + } +} + +sub apply_overrides { + my ($data, $val, $subkey); + + ($data, $subkey) = get_override_data(); + return unless defined $data; + $pkgname = $val if (defined($val=get_override_val($data, $subkey, 'pkgname'))); + $srcname = $val if (defined($val=get_override_val($data, $subkey, 'srcname'))); + $section = $val if (defined($val=get_override_val($data, $subkey, 'section'))); + $priority = $val if (defined($val=get_override_val($data, $subkey, 'priority'))); + $depends = $val if (defined($val=get_override_val($data, $subkey, 'depends'))); + $bdepends = $val if (defined($val=get_override_val($data, $subkey, 'bdepends'))); + $bdependsi = $val if (defined($val=get_override_val($data, $subkey, 'bdependsi'))); + $desc = $val if (defined($val=get_override_val($data, $subkey, 'desc'))); + $longdesc = $val if (defined($val=get_override_val($data, $subkey, 'longdesc'))); + $pkgversion = $val if (defined($val=get_override_val($data, $subkey, 'version'))); + $arch = $val if (defined($val=get_override_val($data, $subkey, 'arch'))); + $changelog = $val if (defined($val=get_override_val($data, $subkey, 'changelog'))); + @docs = split(/\s+/, $val) if (defined($val=get_override_val($data, $subkey, 'docs'))); + + $extrasfields = $val if (defined($val=get_override_val($data, $subkey, 'sfields'))); + $extrapfields = $val if (defined($val=get_override_val($data, $subkey, 'pfields'))); + $maintainer = $val if (defined($val=get_override_val($data, $subkey, 'maintainer'))); + # fix longdesc if needed + $longdesc =~ s/^\s*/ /mg; +} + +sub apply_final_overrides { + my ($data, $val, $subkey); + + ($data, $subkey) = get_override_data(); + return unless defined $data; + get_override_val($data, $subkey, 'finish'); +} + +sub get_override_data { + my ($data, $checkver, $subkey); + $data = $overrides{$perlname}; + + return unless defined $data; + die "Value of '$perlname' in overrides not a hashref\n" unless ref($data) eq 'HASH'; + if (defined($checkver = $data->{checkver})) { + die "checkver not a function\n" unless (ref($checkver) eq 'CODE'); + $subkey = &$checkver($maindir); + } else { + $subkey = $pkgversion; + } + return ($data, $subkey); +} + +sub get_override_val { + my ($data, $subkey, $key, $val); + ($data, $subkey, $key) = @_; + $val = defined($data->{$subkey.$key})?$data->{$subkey.$key}:$data->{$key}; + return &$val() if (defined($val) && ref($val) eq 'CODE'); + return $val; +} + +sub _warn_incomplete_copyright { + print '*'x10, ' +Copyright information incomplete! + +Upstream copyright information could not be automatically determined. + +If you are building this package for your personal use, you might disregard +this information; however, if you intend to upload this package to Debian +(or in general, if you plan on distributing it), you must look into the +complete copyright information. + +The causes for this warning are: +', @_; +} + +sub _file_r { + my ($file, $fh); + $file = shift; + $fh = IO::File->new($file, 'r') or die "Cannot open $file: $!\n"; + return $fh; +} + +sub _file_w { + my ($file, $fh); + $file = shift; + $fh = IO::File->new($file, 'w') or die "Cannot open $file: $!\n"; + return $fh; +} + +sub _file_rw { + my ($file, $fh); + $file = shift; + $fh = IO::File->new($file, 'r+') or die "Cannot open $file: $!\n"; + return $fh; +} + +=head1 NAME + +B - Create debian source packages from perl modules + +=head1 SYNOPSIS + +B [B | B<--cpan> I] + +B B<--refresh> + +You can modify B's behaviour with some switches: + +=over + +=item B<--desc> I + +Uses the argument to --desc as short description for the package. + +=item B<--arch> I | I + +This switches between arch-dependent and arch-independet packages. If B<--arch> +isn't used, B uses a relatively good-working algorithms to +decide this alone. + +=item B<--version> I + +Specifies the version of the resulting package. + +=item B<--email> | B<-e> I + +Manually specify the Maintainer email address to use in debian/control and +in debian/changelog. + +=item B<--packagename> | B<-p> I + +Manually specify the Package Name, useful when the module has dashes in its +name. + +=item B<--closes> I + +Manually specify the ITP bug number that this package closes. If not +given, dh-make-perl will try to connect to bugs.debian.org to fetch the +appropriate bug number, using WWW::Mechanize. + +=item B<--depends> I + +Manually specify the string to be used for the module's dependencies. This +should be used when building modules where dh-make-perl cannot guess the Perl +dependencies (such as modules built using L), or when the +Perl code depends on non-Perl binaries or libraries. Usually, dh-make-perl +will figure out the dependencies by itself. If you need to pass dh-make-perl +dependency information, you must do it using the debian package format. i.e. + +dh-make-perl --depends libtest-more-perl + +=item B<--bdepends> I + +Manually specify the string to be used for the module's build-dependencies +(that is, the packages and their versions that have to be installed in order to +successfully build the package). Keep in mind that packages generated by +dh-make-perl require debhelper to be specified as a build dependency. Same note +as for --depends applies here - Use only when needed. + +=item B<--bdependsi> I + +Manually specify the string to be used for the module's build-dependencies +for architecture-independent builds. Same notes as those for the --depends +and --bdepends options apply here. + +Note that for --depends, --bdepends and --bdependsi you can also specify that +the field should not appear in debian/rules (if you really mean it, of course +;-) ) by giving it an empty string as an argument. + +=item B<--pkg-perl> + +Useful when preparing a package for the Debian Perl Group +L. + +Sets C, C, C and C fields in +debian/control accordingly. + +=item B<--cpan-mirror> I + +Specifies a CPAN site to use as mirror. + +=item B<--exclude> | B<-i> [I] + +This allows you to specify a PCRE to exclude some files from the search for +docs and stuff like that. If no argument is given (but the switch is specified +- not specifying the switch will include everything), it defaults to exclude +CVS and .svn directories. + +=item B<--build> + +Builds the package after setting it up. + +NB: This builds only a binary package (by calling "fakeroot debian/rules +binary") and does not sign the package. It is meant for a quick local +install of a package, not for creating a package ready for submission to the +Debian archive. + +=item B<--install> + +Installs the freshly built package. Specifying --install implies --build - The +package will not be installed unless it was built (obviously ;-) ) + +=item B<--notest> + +Does not run the automatic testing of the module as part of the build script. +This is mostly useful when packaging buggy or incomplete software. + +=item B<--basepkgs> + +Explicitly gives a comma-separated list of packages to consider "base" +packages (i.e. packages that should always be available in Debian +systems). This option defaults to C - It +is used to check for module dependencies. If a needed module is in the +C, it won't be mentioned in the C field of +C. + +If this option is specified, the above mentioned default packages will +not be included (but will be mentioned as explicit dependencies in the +resulting package). You can, of course, mention your own modules +and explicitly specify the default values. + +Note that this option should be used sparsingly and with care, as it +might lead to packages not being rebuildable because of unfulfilled +dependencies. + +=item B<--requiredeps> + +Fail if a dependency perl package was not found (dependency tracking +requires the apt-file package installed and updated) + +=item B<--core-ok> + +Allows building core Perl modules. By default, dh-make-perl will not allow +building a module that is shipped as part of the standard Perl library; by +specifying this option, dh-make-perl will build them anyway. + +Note that, although it is not probable, this might break unrelated items in +your system - If a newer version of a core module breaks the API, all kinds +of daemons might get upset ;-) + +=item B<--refresh> + +Refresh mode. + +Instead of creating new debian/ directory, B<--refresh> makes B +to re-create only B according to the current templates. + +This is useful when B was created using older templates and +doesn't contain much customisations. As always, you're strongly encouraged to +verify if B looks sane. + +=back + +=item B<--dh ver> + +Set desired debhelper version. If C is 7, generated debian/rules is +minimalistic, using the auto-mode of debhelper. Also, any additional +documentation and examples are listed in additional files under debian/, instead +of being listed in debian/rules + +=back + +=head1 DESCRIPTION + +B will create the files required to build +a debian source package out of a perl package. +This works for most simple packages and is also useful +for getting started with packaging perl modules. + +You can specify a module name with the B<--cpan> switch +and B will download the module for you from +a CPAN mirror, or you can specify the directory with the +already unpacked sources. If neither --cpan nor a directory +is given as argument, dh-make-perl tries to create a +perl package from the data in F<.> + +There is an override mechanism in place to handle most of +the little changes that may be needed for some modules +(this hasn't been tested much, though, and the override +database needs to be filled in). + +You can build and install the debian package using the --build +and --install command line switches. + +Using this program is no excuse for not reading the +debian developer documentation, including the Debian policy, +the perl policy, the packaging manual and so on. + +=head1 FILES + +The following directories will be searched to find additional files +required by dh-make-perl: + + /usr/share/dh-make-perl/ + $HOME/.dh-make-perl/ + +=over 4 + +=item * overrides + +File that overrides information retreived (or guessed) about the package. +All the files in the library directories are loaded: entries in the home +take precedence. See the distributed overrides file for usage information. + +=item * rules.MakeMaker.noxs + +A debian/rules makefile for modules that use ExtUtils::MakeMaker, but don't +have C/XS code. + +=item * rules.MakeMaker.xs + +A debian/rules makefile for modules that use ExtUtils::MakerMaker and +C/XS code. + +=item * rules.Module-Build.noxs + +A debian/rules makefile for modules that use Module::Build, but don't have +C/XS code. + +=item * rules.Module-Build.xs + +A debian/rules makefile for modules that use Module::Build and C/XS code. + +=back + +=head1 ENVIRONMENT + +HOME - get user's home directory + +DEBFULLNAME - get the real name of the maintainer + +LOGNAME or USER - get the username + +DEBEMAIL or EMAIL - get the email address of the user + +=head1 BUGS + +Several, let me know when you find them. + +=head1 AUTHOR + +Paolo Molaro Elupus@debian.orgE (MIA) + +Maintained for a time by Ivan Kohler Eivan-debian@420.amE. + +Maintained for a time by Marc Brockschmdit Emarc@dch-faq.deE. + +Now maintained by Gunnar Wolf Egwolf@gwolf.orgE, and team-maintained +by the Debian pkg-perl team, http://alioth.debian.org/projects/pkg-perl + +Patches from: + +=over + +=item Adam Sjoegren Easjo@koldfront.dkE + +=item Adrian Phillips Eadrianp@powertech.noE + +=item Amos Shapira Eamos.shapira@gmail.comE + +=item Christian Kurz Eshorty@debian.orgE + +=item Damyan Ivanov Edivanov@creditreform.bgE + +=item David Paleino Ed.paleino@gmail.comE + +=item David Pashley Edavid@davidpashley.comE + +=item Edward Betts Eedward@debian.orgE + +=item Fermin Galan Egalan@dit.upm.esE + +=item Geoff Richards Eqef@ungwe.orgE + +=item Gergely Nagy Ealgernon@bonehunter.rulez.orgE + +=item gregor herrmann Egregoa@debian.orgE + +=item Hilko Bengen Ebengen@debian.orgE + +=item Kees Cook Ekeex@outflux.netE + +=item Jesper Krogh Ejesper@krogh.ccE + +=item Johnny Morano Ejmorano@moretrix.comE + +=item Juerd Ejuerd@ouranos.juerd.netE + +=item Marc Chantreux (mail withheld) + +=item Matt Hope Edopey@debian.orgE + +=item Noel Maddy Enoel@zhtwn.comE + +=item Oliver Gorwits Eoliver.gorwits@oucs.ox.ac.ukE + +=item Peter Moerch Emn3k66i02@sneakemail.comE + +=item Stephen Oberholtzer Eoliverklozoff@gmail.comE + +=item Ton Nijkes Etonn@wau.mis.ah.nlE + +=back + +... And others who, sadly, we have forgot to add :-/ + +=cut + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/overrides b/dev/i386/dh-make-perl/dh-make-perl-0.47/overrides new file mode 100644 index 0000000..9863fc1 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/overrides @@ -0,0 +1,39 @@ +# override file for dh-make-perl +# chdir is set to the module dir while executing the code in the override hashes +# you can have your own overrides to this overrides in a similar file +# in ~/.dh-make-perl/overrides +# Please contribute back the fixes that may be needed for some modules +# to lupus@debian.org. + +# sample overrides entry +$overrides{'Strange'} = { + pkgname => 'libstrange-perl', + srcname => 'libstrange-perl', + section => 'misc', + priority => 'Extra', + depends => 'perl6', + # build depends + bdepends => 'perl6, xlib-dev', + desc => 'A really ugly module to test dh-make-perl', + longdesc => "A really ugly long description\nfor a really ugly perl module.", + arch => 'all', + # starting from version 2 it's an xs module + checkver => sub {return 'v2-' if (($version || "") =~ /^[2-9]\./);return '';}, + 'v2-arch' => 'any', + 'v2-version' => sub { + if (($version || "") =~ /^\d+\.(\d+)/ && length($1) < 3) { + return $version.("0"x(3-length($1))); # maitain 3 digits after the dot + } else { + return $version; + } }, + # Note the \n in pfield and sfields (extra fields for the source and package section) + pfields => "Conflicts: ba-ba-buma\n", + +}; + +$overrides{'Crypt::SSLeay'} = { + finish => sub { + my @a=("perl", "-pi", "-e", 's,(Makefile\.PL),$1 /usr,', "debian/rules"); + system(@a);}, +}; + diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.noxs b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.noxs new file mode 100755 index 0000000..2c480cd --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.noxs @@ -0,0 +1,64 @@ +#!/usr/bin/make -f +# This debian/rules file is provided as a template for normal perl +# packages. It was created by Marc Brockschmidt for +# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may +# be used freely wherever it is useful. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# If set to a true value then MakeMaker's prompt function will +# always return the default without waiting for user input. +export PERL_MM_USE_DEFAULT=1 + +PERL ?= /usr/bin/perl +PACKAGE = $(shell dh_listpackages) +TMP = $(CURDIR)/debian/$(PACKAGE) + +build: build-stamp +build-stamp: + dh_testdir + # Add commands to compile the package here + $(PERL) Makefile.PL INSTALLDIRS=vendor + $(MAKE) + #TEST# + touch $@ + +clean: + dh_testdir + dh_testroot + dh_clean build-stamp install-stamp + # Add commands to clean up after the build process here + [ ! -f Makefile ] || $(MAKE) realclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + # Add commands to install the package into $(TMP) here + $(MAKE) install DESTDIR=$(TMP) PREFIX=/usr + [ ! -d $(TMP)/usr/lib/perl5 ] || \ + rmdir --ignore-fail-on-non-empty --parents --verbose \ + $(TMP)/usr/lib/perl5 + touch $@ + +binary-arch: +# We have nothing to do here for an architecture-independent package + +binary-indep: build install + dh_testdir + dh_testroot + dh_installexamples #EXAMPLES# + dh_installdocs #DOCS# + dh_installchangelogs #CHANGES# + dh_perl + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.xs b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.xs new file mode 100755 index 0000000..419edfc --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.MakeMaker.xs @@ -0,0 +1,77 @@ +#!/usr/bin/make -f +# This debian/rules file is provided as a template for normal perl +# packages. It was created by Marc Brockschmidt for +# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may +# be used freely wherever it is useful. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# If set to a true value then MakeMaker's prompt function will +# always return the default without waiting for user input. +export PERL_MM_USE_DEFAULT=1 + +PERL ?= /usr/bin/perl +PACKAGE = $(shell dh_listpackages) +TMP = $(CURDIR)/debian/$(PACKAGE) + +# Allow disabling build optimisation by setting noopt in +# $DEB_BUILD_OPTIONS +CFLAGS = -Wall -g +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +build: build-stamp +build-stamp: + dh_testdir + # Add commands to compile the package here + $(PERL) Makefile.PL INSTALLDIRS=vendor + $(MAKE) OPTIMIZE="$(CFLAGS)" LD_RUN_PATH="" + #TEST# + touch $@ + +clean: + dh_testdir + dh_testroot + dh_clean build-stamp install-stamp + # Add commands to clean up after the build process here + [ ! -f Makefile ] || $(MAKE) realclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + # Add commands to install the package into $(TMP) + $(MAKE) install DESTDIR=$(TMP) PREFIX=/usr + [ ! -d $(TMP)/usr/share/perl5 ] || \ + rmdir --ignore-fail-on-non-empty --parents --verbose \ + $(TMP)/usr/share/perl5 + touch $@ + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do here for an architecture-dependent package + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installexamples #EXAMPLES# + dh_installdocs #DOCS# + dh_installchangelogs #CHANGES# + dh_shlibdeps + dh_strip + dh_perl + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.noxs b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.noxs new file mode 100755 index 0000000..fbde886 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.noxs @@ -0,0 +1,64 @@ +#!/usr/bin/make -f +# This debian/rules file is provided as a template for normal perl +# packages. It was created by Marc Brockschmidt for +# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may +# be used freely wherever it is useful. +# +# It was later modified by Jason Kohles +# http://www.jasonkohles.com/ to support Module::Build installed modules + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# If set to a true value then MakeMaker's prompt function will +# always return the default without waiting for user input. +export PERL_MM_USE_DEFAULT=1 + +PERL ?= /usr/bin/perl +PACKAGE = $(shell dh_listpackages) +TMP = $(CURDIR)/debian/$(PACKAGE) + +build: build-stamp +build-stamp: + dh_testdir + # Add commands to compile the package here + $(PERL) Build.PL installdirs=vendor + $(PERL) Build + #TEST# + touch $@ + +clean: + dh_testdir + dh_testroot + dh_clean build-stamp install-stamp + # Add commands to clean up after the build process here + [ ! -f Build ] || $(PERL) Build --allow_mb_mismatch 1 distclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + # Add commands to install the package into $(TMP) here + $(PERL) Build install destdir=$(TMP) create_packlist=0 + touch $@ + +binary-arch: +# We have nothing to do here for an architecture-independent package + +binary-indep: build install + dh_testdir + dh_testroot + dh_installdocs #DOCS# + dh_installexamples #EXAMPLES# + dh_installchangelogs #CHANGES# + dh_perl + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.xs b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.xs new file mode 100755 index 0000000..c1584ce --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.Module-Build.xs @@ -0,0 +1,74 @@ +#!/usr/bin/make -f +# This debian/rules file is provided as a template for normal perl +# packages. It was created by Marc Brockschmidt for +# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may +# be used freely wherever it is useful. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# If set to a true value then MakeMaker's prompt function will +# always return the default without waiting for user input. +export PERL_MM_USE_DEFAULT=1 + +PERL ?= /usr/bin/perl +PACKAGE = $(shell dh_listpackages) +TMP = $(CURDIR)/debian/$(PACKAGE) + +# Allow disabling build optimisation by setting noopt in +# $DEB_BUILD_OPTIONS +CFLAGS = -Wall -g +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +build: build-stamp +build-stamp: + dh_testdir + # Add commands to compile the package here + $(PERL) Build.PL installdirs=vendor config=optimize="$(CFLAGS)" + OPTIMIZE="$(CFLAGS)" $(PERL) Build + #TEST# + touch $@ + +clean: + dh_testdir + dh_testroot + dh_clean build-stamp install-stamp + # Add commands to clean up after the build process here + [ ! -f Build ] || $(PERL) Build --allow_mb_mismatch 1 distclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + # Add commands to install the package into $(TMP) here + $(PERL) Build install destdir=$(TMP) create_packlist=0 + touch $@ + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do here for an architecture-dependent package + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installdocs #DOCS# + dh_installexamples #EXAMPLES# + dh_installchangelogs #CHANGES# + dh_shlibdeps + dh_strip + dh_perl + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.noxs b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.noxs new file mode 100755 index 0000000..0d045f4 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.noxs @@ -0,0 +1,23 @@ +#!/usr/bin/make -f + +build: build-stamp +build-stamp: + dh build + touch $@ + +clean: + dh $@ + +install: install-stamp +install-stamp: build-stamp + dh install + touch $@ + +binary-arch: + +binary-indep: install + dh $@ + +binary: binary-arch binary-indep + +.PHONY: binary binary-arch binary-indep install clean build diff --git a/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.xs b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.xs new file mode 100755 index 0000000..3850db1 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl-0.47/rules.dh7.xs @@ -0,0 +1,23 @@ +#!/usr/bin/make -f + +build: build-stamp +build-stamp: + dh build + touch $@ + +clean: + dh $@ + +install: install-stamp +install-stamp: build-stamp + dh install + touch $@ + +binary-arch: install + dh $@ + +binary-indep: + +binary: binary-arch binary-indep + +.PHONY: binary binary-arch binary-indep install clean build diff --git a/dev/i386/dh-make-perl/dh-make-perl_0.47.dsc b/dev/i386/dh-make-perl/dh-make-perl_0.47.dsc new file mode 100644 index 0000000..c170154 --- /dev/null +++ b/dev/i386/dh-make-perl/dh-make-perl_0.47.dsc @@ -0,0 +1,29 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +Format: 1.0 +Source: dh-make-perl +Binary: dh-make-perl +Architecture: all +Version: 0.47 +Maintainer: Debian Perl Group +Uploaders: Gunnar Wolf , Wolfgang Schemmel , Christopher Sacca , Damyan Ivanov , gregor herrmann , David Paleino , Oliver Gorwits +Standards-Version: 3.8.0 +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/dh-make-perl/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/dh-make-perl/ +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl +Checksums-Sha1: + dbf7af2ba09514e0c72f61f964d4f46108a525a8 37455 dh-make-perl_0.47.tar.gz +Checksums-Sha256: + 5ca9898e5fcab0642f1deed07b2d479d026545dea51069208e01376d45ebee72 37455 dh-make-perl_0.47.tar.gz +Files: + 6b3f363ac0aabd4959e39ab9e605d063 37455 dh-make-perl_0.47.tar.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEARECAAYFAkhZVuEACgkQHqjlqpcl9jvigQCgxOer/Ah3C8DzKckPwSOQYOh7 +Gk4AnjBTsWoRMAUHSidKFSLBoySp0YNW +=MBMy +-----END PGP SIGNATURE----- diff --git a/dev/i386/dh-make-perl/dh-make-perl_0.47.tar.gz b/dev/i386/dh-make-perl/dh-make-perl_0.47.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..4014ff1005b4d094cd60a33936351792e10eec74 GIT binary patch literal 37455 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 to take filename for read() + - Added crc32String() to Archive::Zip::Member + - Changed requirement in Makefile.PL to Compress::Zip + version 1.06 or later (bug in earlier versions can truncate data) + - Moved BufferedFileHandle and MockFileHandle into + Archive::Zip namespace + - Allowed changing error printing routine + - Factored out reading of signatures + - Made re-read of local header for directory members + depend on file handle seekability + - Added ability to change member contents + - Fixed a possible truncation bug in contents() method + +0.06 Tue Mar 21 15:28:22 PST 2000 + - first release to CPAN + +0.01 Sun Mar 12 18:59:55 2000 + - original version; created by h2xs 1.19 diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/INSTALL b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/INSTALL new file mode 100644 index 0000000..5dbe68b --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/INSTALL @@ -0,0 +1,43 @@ +To make and test, do the following: + perl Makefile.PL + make + make test + +To copy the libs and docs to the right places, +do this (as superuser or administrator): + make install + +If you're using Windows, you probably have to first get nmake to make this +work. If you have the ActiveState distribution, read the part about installing +modules from CPAN. + +Then: + perl Makefile.PL + nmake + nmake test + nmake install + + +If you don't have the Info-Zip tools zip and unzip installed, you may +get warnings from "make test" or "nmake test". Don't worry about these. + +Actually, if you're using ActiveState's ActivePerl on Windows +you should first check for up to date .PPM versions and use their PPM tool +to install them. + +If you are having install problems on RedHat 8 or 9 with Perl 5.8.0, please +read this (from the FAQ in lib/Archive/Zip/FAQ.pod): + + Q: Archive::Zip won't install on my RedHat 9 system! It's broke! + + A: This has become something of a FAQ. Basically, RedHat broke some + versions of Perl by setting LANG to UTF8. They apparently have a fixed + version out as an update. + + You might try running CPAN or creating your Makefile after exporting the + LANG environment variable as + + "LANG=C" + + + diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/LICENSE b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/LICENSE new file mode 100644 index 0000000..05e86e0 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/LICENSE @@ -0,0 +1,378 @@ + +Terms of Perl itself + +a) the GNU General Public License as published by the Free + Software Foundation; either version 1, or (at your option) any + later version, or +b) the "Artistic License" + +---------------------------------------------------------------------------- + +The General Public License (GPL) +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, +Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute +verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most of +the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for this service if you wish), that +you receive source code or can get it if you want it, that you can change the +software or use pieces of it in new free programs; and that you know you can do +these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show +them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced by +others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually obtain +patent licenses, in effect making the program proprietary. To prevent this, we +have made it clear that any patent must be licensed for everyone's free use or +not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or translated +into another language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and appropriately +publish on each copy an appropriate copyright notice and disclaimer of warranty; +keep intact all the notices that refer to this License and to the absence of any +warranty; and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at +your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you also +meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you +changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in +part contains or is derived from the Program or any part thereof, to be licensed +as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you +must cause it, when started running for such interactive use in the most ordinary +way, to print or display an announcement including an appropriate copyright +notice and a notice that there is no warranty (or else, saying that you provide a +warranty) and that users may redistribute the program under these conditions, +and telling the user how to view a copy of this License. (Exception: if the +Program itself is interactive but does not normally print such an announcement, +your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Program, the distribution of the whole must be on +the terms of this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to +work written entirely by you; rather, the intent is to exercise the right to control +the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source +code, which must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any +third party, for a charge no more than your cost of physically performing source +distribution, a complete machine-readable copy of the corresponding source +code, to be distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute +corresponding source code. (This alternative is allowed only for noncommercial +distribution and only if you received the program in object code or executable +form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all the +source code for all modules it contains, plus any associated interface definition +files, plus the scripts used to control compilation and installation of the +executable. However, as a special exception, the source code distributed need +not include anything that is normally distributed (in either source or binary form) +with the major components (compiler, kernel, and so on) of the operating system +on which the executable runs, unless that component itself accompanies the +executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so long +as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not accept +this License. Therefore, by modifying or distributing the Program (or any work +based on the Program), you indicate your acceptance of this License to do so, +and all its terms and conditions for copying, distributing or modifying the +Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to copy, +distribute or modify the Program subject to these terms and conditions. You +may not impose any further restrictions on the recipients' exercise of the rights +granted herein. You are not responsible for enforcing compliance by third parties +to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement +or for any other reason (not limited to patent issues), conditions are imposed on +you (whether by court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the conditions of this +License. If you cannot distribute so as to satisfy simultaneously your obligations +under this License and any other pertinent obligations, then as a consequence +you may not distribute the Program at all. For example, if a patent license would +not permit royalty-free redistribution of the Program by all those who receive +copies directly or indirectly through you, then the only way you could satisfy +both it and this License would be to refrain entirely from distribution of the +Program. + +If any portion of this section is held invalid or unenforceable under any particular +circumstance, the balance of the section is intended to apply and the section as +a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other +property right claims or to contest validity of any such claims; this section has +the sole purpose of protecting the integrity of the free software distribution +system, which is implemented by public license practices. Many people have +made generous contributions to the wide range of software distributed through +that system in reliance on consistent application of that system; it is up to the +author/donor to decide if he or she is willing to distribute software through any +other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries +either by patents or by copyrighted interfaces, the original copyright holder who +places the Program under this License may add an explicit geographical +distribution limitation excluding those countries, so that distribution is permitted +only in or among countries not thus excluded. In such case, this License +incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems or +concerns. + +Each version is given a distinguishing version number. If the Program specifies a +version number of this License which applies to it and "any later version", you +have the option of following the terms and conditions either of that version or of +any later version published by the Free Software Foundation. If the Program does +not specify a version number of this License, you may choose any version ever +published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of all +derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS +NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE +COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR +IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE +ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED +TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY +WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM +(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY +OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + +---------------------------------------------------------------------------- + +The Artistic License + +Preamble + +The intent of this document is to state the conditions under which a Package +may be copied, such that the Copyright Holder maintains some semblance of +artistic control over the development of the package, while giving the users of the +package the right to use and distribute the Package in a more-or-less customary +fashion, plus the right to make reasonable modifications. + +Definitions: + +- "Package" refers to the collection of files distributed by the Copyright + Holder, and derivatives of that collection of files created through textual + modification. +- "Standard Version" refers to such a Package if it has not been modified, + or has been modified in accordance with the wishes of the Copyright + Holder. +- "Copyright Holder" is whoever is named in the copyright or copyrights for + the package. +- "You" is you, if you're thinking about copying or distributing this Package. +- "Reasonable copying fee" is whatever you can justify on the basis of + media cost, duplication charges, time of people involved, and so on. (You + will not be required to justify it to the Copyright Holder, but only to the + computing community at large as a market that must bear the fee.) +- "Freely Available" means that no fee is charged for the item itself, though + there may be fees involved in handling the item. It also means that + recipients of the item may redistribute it under the same conditions they + received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you duplicate +all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from +the Public Domain or from the Copyright Holder. A Package modified in such a +way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and when +you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said modifications + to Usenet or an equivalent medium, or placing the modifications on + a major archive site such as ftp.uu.net, or by allowing the + Copyright Holder to include your modifications in the Standard + Version of the Package. + + b) use the modified Package only within your corporation or + organization. + + c) rename any non-standard executables so the names do not + conflict with standard executables, which must also be provided, + and provide a separate manual page for each non-standard + executable that clearly documents how it differs from the Standard + Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable +form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library + files, together with instructions (in the manual page or equivalent) + on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) accompany any non-standard executables with their + corresponding Standard Version executables, giving the + non-standard executables non-standard names, and clearly + documenting the differences in manual pages (or equivalent), + together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. +You may charge any fee you choose for support of this Package. You may not +charge a fee for this Package itself. However, you may distribute this Package in +aggregate with other (possibly commercial) programs as part of a larger +(possibly commercial) software distribution provided that you do not advertise +this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from +the programs of this Package do not automatically fall under the copyright of this +Package, but belong to whomever generated them, and may be sold +commercially, and may be aggregated with this Package. + +7. C or perl subroutines supplied by you and linked into this Package shall not +be considered part of this Package. + +8. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +The End + + diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/MANIFEST b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/MANIFEST new file mode 100644 index 0000000..99fad58 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/MANIFEST @@ -0,0 +1,53 @@ +bin/crc32 +Changes +docs/appnote.iz +docs/Appnote.txt +docs/Archive-Zip.pdf +docs/ideas.txt +examples/calcSizes.pl +examples/copy.pl +examples/extract.pl +examples/mailZip.pl +examples/mfh.pl +examples/readScalar.pl +examples/selfex.pl +examples/unzipAll.pl +examples/updateTree.pl +examples/updateZip.pl +examples/writeScalar.pl +examples/writeScalar2.pl +examples/zip.pl +examples/zipcheck.pl +examples/zipGrep.pl +examples/zipinfo.pl +examples/ziprecent.pl +examples/ziptest.pl +INSTALL +lib/Archive/Zip.pm +lib/Archive/Zip/Archive.pm +lib/Archive/Zip/BufferedFileHandle.pm +lib/Archive/Zip/DirectoryMember.pm +lib/Archive/Zip/FAQ.pod +lib/Archive/Zip/FileMember.pm +lib/Archive/Zip/Member.pm +lib/Archive/Zip/MemberRead.pm +lib/Archive/Zip/MockFileHandle.pm +lib/Archive/Zip/NewFileMember.pm +lib/Archive/Zip/StringMember.pm +lib/Archive/Zip/Tree.pm +lib/Archive/Zip/ZipFileMember.pm +LICENSE +Makefile.PL +MANIFEST This list of files +README +t/01_compile.t +t/02_main.t +t/03_ex.t +t/04_readmember.t +t/05_tree.t +t/06_update.t +t/99_author.t +t/badjpeg/expected.jpg +t/badjpeg/source.zip +t/common.pl +META.yml Module meta-data (added by MakeMaker) diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/META.yml b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/META.yml new file mode 100644 index 0000000..996ea0b --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/META.yml @@ -0,0 +1,27 @@ +--- #YAML:1.0 +name: Archive-Zip +version: 1.18 +abstract: Provide an interface to ZIP archive files. +license: perl +generated_by: ExtUtils::MakeMaker version 6.31 +distribution_type: module +requires: + Carp: 0 + Compress::Zlib: 1.14 + File::Basename: 0 + File::Copy: 0 + File::Find: 0 + File::Path: 0 + File::Spec: 0.80 + File::Temp: 0 + File::Which: 0.05 + IO::File: 0 + IO::Handle: 0 + IO::Seekable: 0 + Test::More: 0.42 + Time::Local: 0 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 +author: + - Ned Konz diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/Makefile.PL b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/Makefile.PL new file mode 100644 index 0000000..a103fec --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/Makefile.PL @@ -0,0 +1,45 @@ +require 5.003_96; + +use Config; +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Archive::Zip', + VERSION_FROM => 'lib/Archive/Zip.pm', # finds $VERSION + ($] < 5.005 ? () : + ( + BINARY_LOCATION => $Config{'archname'} . "/\$(DISTVNAME)-PPD.tar\$(SUFFIX)", + AUTHOR => 'Ned Konz ', + ABSTRACT_FROM => 'lib/Archive/Zip.pm', + )), + PREREQ_PM => { + 'Compress::Zlib' => '1.14', + 'Carp' => 0, + # 'Data::Dumper' => 0, # examples/zipinfo.pl + 'File::Path' => 0, + 'File::Find' => 0, + 'File::Basename' => 0, + 'File::Spec' => '0.80', # need splitpath() + 'File::Copy' => 0, + 'File::Temp' => 0, + 'File::Which' => '0.05', # Should really be build_requires + # 'Getopt::Std' => 0, # examples/extract.pl + 'IO::File' => 0, + 'IO::Handle' => 0, + 'IO::Seekable' => 0, + 'Test::More' => '0.42', + 'Time::Local' => 0, + }, + EXE_FILES => [ 'bin/crc32' ], + clean => { + FILES => 'test.log testdir/* testdir/ extracted/testdir/* extracted/testdir extracted/ testin.zip testout.zip test2.zip' + }, + dist => { + COMPRESS => 'gzip', + SUFFIX => '.gz', + ZIP => 'zip', + ZIPFLAGS => '-r' + }, + ($ExtUtils::MakeMaker::VERSION ge '6.30_00'? + ('LICENSE' => 'perl', ) : ()), +); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/README b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/README new file mode 100644 index 0000000..7e0151c --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/README @@ -0,0 +1,28 @@ +The Archive::Zip module allows a Perl program to create, manipulate, +read, and write Zip archive files. + +Zip archives can be created, or you can read from existing zip files. +Once created, they can be written to files, streams, or strings. + +Members can be added, removed, extracted, replaced, rearranged, and +enumerated. They can also be renamed or have their dates, comments, or +other attributes queried or modified. Their data can be compressed or +uncompressed as needed. Members can be created from members in existing +Zip files, or from existing directories, files, or strings. + +This module uses the Compress::Zlib library to read and write the +compressed streams inside the files. + +Examples and helper libraries are given to show how: + * zip files can be written to strings + * zip files can be written in chunks to arbitrary functions + +Documentation will be installed as man pages for: + Archive::Zip + Archive::Zip::FAQ + Archive::Zip::Tree + Archive::Zip::MemberRead + +Copyright (c) 2000-2003 Ned Konz. All rights reserved. This program is free +software; you can redistribute it and/or modify it under the same terms +as Perl itself. diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/bin/crc32 b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/bin/crc32 new file mode 100644 index 0000000..1d9d051 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/bin/crc32 @@ -0,0 +1,28 @@ +#! /usr/bin/perl -w +# computes and prints to stdout the CRC-32 values of the given files +use lib qw( blib/lib lib ); +use Archive::Zip; +use FileHandle; + +my $totalFiles = scalar(@ARGV); +foreach my $file (@ARGV) { + if ( -d $file ) { + warn "$0: ${file}: Is a directory\n"; + next; + } + my $fh = FileHandle->new(); + if ( !$fh->open( $file, 'r' ) ) { + warn "$0: $!\n"; + next; + } + binmode($fh); + my $buffer; + my $bytesRead; + my $crc = 0; + while ( $bytesRead = $fh->read( $buffer, 32768 ) ) { + $crc = Archive::Zip::computeCRC32( $buffer, $crc ); + } + printf( "%08x", $crc ); + print("\t$file") if ( $totalFiles > 1 ); + print("\n"); +} diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/changelog b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/changelog new file mode 100644 index 0000000..39a34b0 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/changelog @@ -0,0 +1,90 @@ +libarchive-zip-perl (1.18-1) unstable; urgency=low + + * New upstream release. + * Added build-depends on libfile-which-perl, which is now used in the test + suite. + * Removed Appnote.txt and appnote.iz from the source tarball, since these + appear to be non-free. + * Switched from debhelper compatibility level 3 to 5. Moved debhelper + dependency to Build-Depends (not Build-Depends-Indep) to support the + clean target (thanks lintian). + * Bumped standards-version to 3.7.2.2 (no changes required). + + -- Ben Burton Sun, 20 May 2007 09:04:44 +1000 + +libarchive-zip-perl (1.16-1) unstable; urgency=low + + * New upstream release (closes: #329494). + * Run the test suite during the package build. This requires an extra + build-depends on libcompress-zlib-perl. + * Bumped standards-version to 3.6.2.1 (no changes required). + + -- Ben Burton Wed, 5 Oct 2005 19:08:56 +1000 + +libarchive-zip-perl (1.14-2) unstable; urgency=low + + * Adopted by Ben Burton (closes: #314850). Thanks to Ivo Timmermans + and Matthias Klose for all their work on this package. + * Clarified the copyright file by explicitly including the Perl license + terms. + * Changed double hyphen to a single hyphen in Tree.pm to avoid bad + formatting in POD manpage (closes: #303022). + * Added a manpage for /usr/bin/crc32. + + -- Ben Burton Mon, 20 Jun 2005 09:21:56 +1000 + +libarchive-zip-perl (1.14-1) unstable; urgency=high + + * New upstream version. + - Fixes: Archive::Zip is fooled by manipulated ZIP directory + Closes: #277773. + + -- Matthias Klose Sat, 30 Oct 2004 22:19:15 +0200 + +libarchive-zip-perl (1.13-2) unstable; urgency=low + + * Add watch file. + + -- Matthias Klose Sun, 19 Sep 2004 19:44:59 +0200 + +libarchive-zip-perl (1.13-1) unstable; urgency=high + + * NMU (needed as a dependency for mailscanner). + + -- Matthias Klose Sat, 28 Aug 2004 19:37:13 +0200 + +libarchive-zip-perl (1.12-0.1) unstable; urgency=low + + * NMU (needed as a dependency for mailscanner). Closes: #258198. + + -- Matthias Klose Fri, 9 Jul 2004 07:48:06 +0200 + +libarchive-zip-perl (1.10-0.1) unstable; urgency=low + + * NMU (needed as a dependency for mailscanner). + * New upstream version (closes: #235788). + - Better handling of broken archives (closes: #218932). + + -- Matthias Klose Mon, 28 Jun 2004 18:31:23 +0200 + +libarchive-zip-perl (1.05-1) unstable; urgency=low + + * New upstream release. (Closes: #192051) + * debian/control: + - Update Standards-Version; + - Set Section to perl. + + -- Ivo Timmermans Mon, 5 May 2003 23:54:26 +0200 + +libarchive-zip-perl (1.01-1) unstable; urgency=low + + * New upstream release. (Closes: #145273) + * Renamed Build-Depends to Build-Depends-Indep. + + -- Ivo Timmermans Sun, 19 May 2002 00:39:23 +0200 + +libarchive-zip-perl (0.11-1) unstable; urgency=low + + * Initial Release. (Closes: #99768) + + -- Ivo Timmermans Mon, 18 Jun 2001 14:36:39 +0200 diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/compat b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/control b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/control new file mode 100644 index 0000000..0555f98 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/control @@ -0,0 +1,25 @@ +Source: libarchive-zip-perl +Section: perl +Priority: optional +Maintainer: Ben Burton +Uploaders: Matthias Klose +Build-Depends: debhelper (>= 5.0.0) +Build-Depends-Indep: perl, libcompress-zlib-perl, libfile-which-perl +Standards-Version: 3.7.2.2 + +Package: libarchive-zip-perl +Architecture: all +Depends: ${perl:Depends}, libcompress-zlib-perl +Description: Module for manipulation of ZIP archives + The Archive::Zip module allows a Perl program to create, manipulate, + read, and write Zip archive files. + . + Zip archives can be created, or you can read from existing zip files. + Once created, they can be written to files, streams, or strings. + . + Members can be added, removed, extracted, replaced, rearranged, and + enumerated. They can also be renamed or have their dates, comments, + or other attributes queried or modified. Their data can be + compressed or uncompressed as needed. Members can be created from + members in existing Zip files, or from existing directories, files, + or strings. diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/copyright b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/copyright new file mode 100644 index 0000000..7ecc121 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/copyright @@ -0,0 +1,43 @@ +This package was debianized by Ivo Timmermans on +Sun, 3 Jun 2001 21:02:48 +0200. +It was adopted by Ben Burton on +Mon, 20 Jun 2005 09:21:56 +1000. + +It was downloaded from http://cpan.perl.org/modules/by-module/Archive/ + +Upstream Authors: + + Adam Kennedy + + Previously maintained by Steve Peters . + + File attributes code by Maurice Aubrey . + + Originally by Ned Konz . + +This package contains the following copyright notices: + + Copyright (c) 2000-2004 Ned Konz. All rights reserved. + + Some parts copyright (c) 2005 Steve Peters. All rights reserved. + + Some parts copyright (c) 2006 Adam Kennedy. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the same terms as Perl itself. + +The license terms for Perl are as follows: + + This program is free software; you can redistribute it and/or modify + it under the terms of either: + + a) the GNU General Public License as published by the Free Software + Foundation; either version 1, or (at your option) any later + version, or + + b) the "Artistic License" which comes with Perl. + +On Debian GNU/Linux systems, the complete texts of the GNU General +Public License and the Artistic License can be found in the files +`/usr/share/common-licenses/GPL' and `/usr/share/common-licenses/Artistic' +repsectively. diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/crc32.1 b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/crc32.1 new file mode 100644 index 0000000..d49d499 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/crc32.1 @@ -0,0 +1,22 @@ +.TH CRC32 1 "June 21, 2005" +.SH NAME +crc32 \- compute CRC-32 checksums for the given files +.SH SYNOPSIS +.B crc32 +\fIfilename\fP [ \fIfilename\fP ... ] +.SH DESCRIPTION +\fBcrc32\fP is a simple utility that calculates the CRC-32 checksum for +each of the given files. +.PP +Note that the CRC-32 checksum is merely used for error detection in +transmission and storage. It is not intended to guard against the +malicious modification of files (i.e., it is not a cryptographic hash). +.PP +This utility is supplied with the \fBArchive::Zip\fP module for Perl. +.SH SEE ALSO +.BR Archive::Zip (3pm). +.SH AUTHOR +The Archive::Zip module was written by Ned Konz. +.br +This manual page was prepared by Ben Burton +for the Debian GNU/Linux system (but may be used by others). diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/docs b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/docs new file mode 100644 index 0000000..e845566 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/docs @@ -0,0 +1 @@ +README diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/examples b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/examples new file mode 100644 index 0000000..e39721e --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/examples @@ -0,0 +1 @@ +examples/* diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/manpages b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/manpages new file mode 100644 index 0000000..1d18ba5 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/manpages @@ -0,0 +1 @@ +debian/crc32.1 diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/rules b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/rules new file mode 100755 index 0000000..8fe4e6a --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/rules @@ -0,0 +1,90 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +PERL=/usr/bin/perl + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + $(PERL) Makefile.PL INSTALLDIRS=vendor + + touch configure-stamp + +build: configure-stamp build-stamp +build-stamp: + dh_testdir + + # Add here commands to compile the package. + $(PERL) Makefile.PL + $(MAKE) + + # Make sure it all seems to be working okay. + $(MAKE) test + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + rm -rf testdir extracted + + # Add here commands to clean up after the build process. + -$(MAKE) clean + + rm -f Makefile.old + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp + $(MAKE) install INSTALLDIRS=vendor PREFIX=$(CURDIR)/debian/libarchive-zip-perl/usr + rm -rf $(CURDIR)/debian/libarchive-zip-perl/usr/lib + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot +# dh_movefiles + +# dh_installdebconf + dh_installdocs + dh_installexamples +# dh_installmenu +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron + dh_installman +# dh_installinfo +# dh_undocumented + dh_installchangelogs Changes + dh_link +# dh_strip + dh_compress + dh_fixperms +# dh_makeshlibs + dh_installdeb + dh_perl +# dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/watch b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/watch new file mode 100644 index 0000000..3deda81 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/debian/watch @@ -0,0 +1,2 @@ +version=2 +http://search.cpan.org/CPAN/authors/id/N/NE/NEDKONZ/Archive-Zip-([\d\.]*)\.tar\.gz diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/Archive-Zip.pdf b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/Archive-Zip.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d21018d1b1a6570bd6cd2ef48b061938aea8497 GIT binary patch literal 2226 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 E8>GRMOaK4? literal 0 HcmV?d00001 diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/ideas.txt b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/ideas.txt new file mode 100644 index 0000000..79f19b7 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/docs/ideas.txt @@ -0,0 +1,150 @@ +Newsgroups: comp.lang.perl.modules +Subject: Best form for allowing module extension? +Reply-To: +Followup-To: +Keywords: +Summary: + +I am writing a module (Archive::Zip) that implements the basic read and +write functionality for Zip archive files. These files have provisions +for extensions for specific platforms: each member has an 'extra field' +that can contain OS-specific (or, indeed, any member-specific) data. The +overall format of this data is specified (
, , ), +but the actual contents depends on the Header ID. + +Because I'm only working in a couple of operating environments, and +because I'm not trying to write a full "unzip" or "PKZIP" replacement, I +don't really want to try to interpret all of these formats. + +From the PKWARE Appnote.txt file: + + The current Header ID mappings defined by PKWARE are: + + 0x0007 AV Info + 0x0009 OS/2 + 0x000a NTFS + 0x000c VAX/VMS + 0x000d Unix + 0x000f Patch Descriptor + + Several third party mappings commonly used are: + + 0x4b46 FWKCS MD5 (see below) + 0x07c8 Macintosh + 0x4341 Acorn/SparkFS + 0x4453 Windows NT security descriptor (binary ACL) + 0x4704 VM/CMS + 0x470f MVS + 0x4c41 OS/2 access control list (text ACL) + 0x4d49 Info-ZIP VMS (VAX or Alpha) + 0x5455 extended timestamp + 0x5855 Info-ZIP Unix (original, also OS/2, NT, etc) + 0x6542 BeOS/BeBox + 0x756e ASi Unix + 0x7855 Info-ZIP Unix (new) + 0xfd4a SMS/QDOS + +I want to make it easy for other people to provide this support without +changing my code. + +Note that not all of these extensions have anything to do with file +permissions, although it may be helpful to provide one or more hooks for +extracting files: + + * supply OS-specific filename + * open file for write (set permissions) + * after closing file (to set ownership, timestamps, etc.) + +I can provide generic support for these extra fields, so that each +member can have 0 or more extra fields, each with a type tag and +uninterpreted data. + +I have seen File::Spec and File::Spec::Unix, etc., and don't think that +this scheme is appropriate, since you could have a zip file that was +produced on one operating system being extracted by another. + +Also, it is possible to have multiple types of extra fields in a single +zip file. + +What I have thought about is this: a user who wants to interpret the +extended information in the zip members can include the appropriate +extension modules: + +# ==================== in user's code ==================== +use Archive::Zip; # basic functionality +use Archive::Zip::Unix; # to interpret Unix file permissions, etc. +use Archive::Zip::MD5; # to interpret MD5 extended info + +my $zip = Archive::Zip->new(); +$zip->read('ZIPFILE.ZIP'); +foreach my $member ($zip->members()) +{ + foreach my $extraField ($member->extraFields()) + { + print $extraField->info() . "\n"; + } + + $member->extract(); +} +# ==================== end user's code ==================== + +I can make an extensible class for writers of OS-specific modules to +inherit from: + +# ==================== in my code ==================== +package Archive::Zip::ExtraField; +my %Handlers; + +# Each subclass must call this with their class name and tag ID. +sub registerType +{ + my ($class, $tag) = @_; + $Handlers{ $tag } = $class; +} + +# Overrideable methods +sub info +{ + my $self = shift; + ref($self) . " " . $self->{tag} . " " . $self->{dataLength}; +} + +# Provide OS-specific name if any or undef +sub preferredFileName { undef } + +# Returns numeric arg for open() call or undef +sub openPermissions { undef } + +# Hook for doing things after file is extracted +# Called as: $extraField->afterClosingExtractedFile($fileName) +sub afterClosingExtractedFile { } + +package Archive::Zip::Member; + +# return array of extra fields +sub extraFields() { ... } + +sub extract +{ + my $self = shift; + my ($preferredFileName) = + grep { $_ } + (map { $_->preferredFileName() } $self->extraFields()); + my $fileName = $preferredFileName || $self->fileName(); + # ... similar things for open permissions ... + my $fh = FileHandle->new($fileName, $openPermissions); + # ... extract data to fh ... + $fh->close(); + map { $_->afterClosingExtractedFile($fileName) } + $self->extraFields(); +} +# ==================== end my code ==================== + + +Does this seem like a good way to go? Any other suggestions? + +-- +Ned Konz +currently: Stanwood, WA +email: ned@bike-nomad.com +homepage: http://www.bike-nomad.com diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/calcSizes.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/calcSizes.pl new file mode 100644 index 0000000..80ff750 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/calcSizes.pl @@ -0,0 +1,31 @@ +# Example of how to compute compressed sizes +# $Revision: 1.2 $ +use strict; +use Archive::Zip qw(:ERROR_CODES); +use File::Spec; +my $zip = Archive::Zip->new(); +my $blackHoleDevice = File::Spec->devnull(); + +$zip->addFile($_) foreach (<*.pl>); + +# Write and throw the data away. +# after members are written, the writeOffset will be set +# to the compressed size. +$zip->writeToFileNamed($blackHoleDevice); + +my $totalSize = 0; +my $totalCompressedSize = 0; +foreach my $member ($zip->members()) +{ + $totalSize += $member->uncompressedSize; + $totalCompressedSize += $member->_writeOffset; + print "Member ", $member->externalFileName, + " size=", $member->uncompressedSize, + ", writeOffset=", $member->_writeOffset, + ", compressed=", $member->compressedSize, + "\n"; +} + +print "Total Size=", $totalSize, ", total compressed=", $totalCompressedSize, "\n"; + +$zip->writeToFileNamed('test.zip'); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/copy.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/copy.pl new file mode 100644 index 0000000..7cc3823 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/copy.pl @@ -0,0 +1,17 @@ +# Copies a zip file to another. +# Usage: +# perl copy.pl input.zip output.zip +# $Revision: 1.4 $ + +use Archive::Zip qw(:ERROR_CODES); + +die "usage: perl copy.pl input.zip output.zip\n" + if scalar(@ARGV) != 2; + +my $zip = Archive::Zip->new(); + +my $status = $zip->read($ARGV[0]); +die("read $ARGV[0] failed: $status\n") if $status != AZ_OK; + +$status = $zip->writeToFileNamed($ARGV[1]); +die("writeToFileNamed $ARGV[1] failed: $status\n") if $status != AZ_OK; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/extract.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/extract.pl new file mode 100644 index 0000000..4425ab4 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/extract.pl @@ -0,0 +1,40 @@ +#!/bin/perl -w +# Extracts the named files into 'extractTest' subdir +# usage: +# perl extract.pl [-j] zipfile.zip filename [...] +# if -j option given, discards paths. +# +# $Revision: 1.5 $ +# +use strict; + +my $dirName = 'extractTest'; + +use vars qw( $opt_j ); +use Archive::Zip qw(:ERROR_CODES); +use Getopt::Std; + +$opt_j = 0; +getopts('j'); + +if (@ARGV < 2) +{ + die <new(); +my $zipName = shift(@ARGV); +my $status = $zip->read( $zipName ); +die "Read of $zipName failed\n" if $status != AZ_OK; + +foreach my $memberName (@ARGV) +{ + print "Extracting $memberName\n"; + $status = $opt_j + ? $zip->extractMemberWithoutPaths($memberName) + : $zip->extractMember($memberName); + die "Extracting $memberName from $zipName failed\n" if $status != AZ_OK; +} diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mailZip.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mailZip.pl new file mode 100644 index 0000000..9191907 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mailZip.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl -w +# Requires the following to be installed: +# File::Path +# File::Spec +# IO::Scalar, ... from the IO-stringy distribution +# MIME::Base64 +# MIME::QuotedPrint +# Net::SMTP +# Mail::Internet, ... from the MailTools distribution. +# MIME::Tools + +use strict; +use Archive::Zip qw(:CONSTANTS :ERROR_CODES); +use IO::Scalar; +use MIME::Entity; # part of MIME::Tools package + +my $zipContents = ''; +my $SH = IO::Scalar->new( \$zipContents ); + +my $zip = Archive::Zip->new(); +my $member; + +# add a string as a member: +my $stringMember = '

Testing

'; +$member = $zip->addString($stringMember, 'whatever.html'); +# $member->desiredCompressionMethod(COMPRESSION_STORED); + +# write it to the scalar +my $status = $zip->writeToFileHandle($SH); +$SH->close; + +print STDERR "zip is ". length($zipContents). " bytes long\n"; + +### Create an entity: +my $top = MIME::Entity->build( + Type => 'multipart/mixed', + From => 'ned@bike-nomad.com', + To => 'billnevin@tricom.net', + Subject => "Your zip", +); + +# attach the message +$top->attach( + Encoding => '7bit', + Data => "here is the zip you ordered\n" +); + +# attach the zip +$top->attach( + Data => \$zipContents, + Type => "application/x-zip", + Encoding => "base64", + Disposition => 'attachment', + Filename => 'your.zip' +); + +# attach this code +$top->attach( + Encoding => '8bit', + Type => 'text/plain', + Path => $0, + # Data => 'whatever', + Disposition => 'inline' +); + +# and print it out to stdout +$top->print( \*STDOUT ); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mfh.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mfh.pl new file mode 100644 index 0000000..b70a5e8 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/mfh.pl @@ -0,0 +1,29 @@ +# Prints messages on every chunk write. +# Usage: +# perl mfh.pl zipfile.zip +# $Revision: 1.4 $ +use strict; +use Archive::Zip qw(:ERROR_CODES); +use Archive::Zip::MockFileHandle; + +package NedsFileHandle; +use vars qw(@ISA); +@ISA = qw( Archive::Zip::MockFileHandle ); + +sub writeHook +{ + my $self = shift; + my $bytes = shift; + my $length = length($bytes); + printf "write %d bytes (position now %d)\n", $length, $self->tell(); + return $length; +} + +package main; + +my $zip = Archive::Zip->new(); +my $status = $zip->read($ARGV[0]); +exit $status if $status != AZ_OK; + +my $fh = NedsFileHandle->new(); +$zip->writeToFileHandle($fh, 0); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/readScalar.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/readScalar.pl new file mode 100644 index 0000000..b4ca376 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/readScalar.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl -w +# Demonstrates reading a zip from an IO::Scalar +# $Revision: 1.4 $ +use strict; +use Archive::Zip qw(:CONSTANTS :ERROR_CODES); +use IO::Scalar; +use IO::File; + +# test reading from a scalar +my $file = IO::File->new('testin.zip', 'r'); +my $zipContents; +binmode($file); +$file->read($zipContents, 20000); +$file->close(); +printf "Read %d bytes\n", length($zipContents); + +my $SH = IO::Scalar->new(\$zipContents); + +my $zip = Archive::Zip->new(); +$zip->readFromFileHandle( $SH ); +my $member = $zip->addString('c' x 300, 'bunchOfCs.txt'); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); +$member = $zip->addString('d' x 300, 'bunchOfDs.txt'); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); + +$zip->writeToFileNamed('test2.zip'); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/selfex.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/selfex.pl new file mode 100644 index 0000000..d5c0e97 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/selfex.pl @@ -0,0 +1,68 @@ +#/usr/bin/perl -w +# +# Shows one way to write a self-extracting archive file. +# This is not intended for production use, and it always extracts to a +# subdirectory with a fixed name. +# Plus, it requires Perl and A::Z to be installed first. +# +# In general, you want to provide a stub that is platform-specific. +# You can use 'unzipsfx' that it provided with the Info-Zip unzip program. +# Get this from http://www.info-zip.org . +# +# $Revision: 1.6 $ +# +use strict; + +use Archive::Zip; +use IO::File; + +# Make a self-extracting Zip file. + +die "usage: $0 sfxname file [...]\n" unless @ARGV > 1; + +my $outputName = shift(); + +my $zip = Archive::Zip->new(); + +foreach my $file (@ARGV) +{ + $zip->addFileOrDirectory($file); +} + +my $fh = IO::File->new( $outputName, O_CREAT | O_WRONLY | O_TRUNC, 0777 ) + or die "Can't open $outputName\: $!\n"; +binmode($fh); + +# add self-extracting Perl code + +while () +{ + $fh->print($_) +} + +$zip->writeToFileHandle($fh); + +$fh->close(); + +# below the __DATA__ line is the extraction stub: +__DATA__ +#!/usr/local/bin/perl +# Self-extracting Zip file extraction stub +# Copyright (C) 2002 Ned Konz + +use Archive::Zip qw(:ERROR_CODES); +use IO::File; +use File::Spec; + +my $dir = 'extracted'; +my $zip = Archive::Zip->new(); +my $fh = IO::File->new($0) or die "Can't open $0\: $!\n"; +die "Zip read error\n" unless $zip->readFromFileHandle($fh) == AZ_OK; + +(mkdir($dir, 0777) or die "Can't create directory $dir\: $!\n") unless -d $dir; + +for my $member ( $zip->members ) +{ + $member->extractToFileNamed( File::Spec->catfile($dir,$member->fileName) ); +} +__DATA__ diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/unzipAll.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/unzipAll.pl new file mode 100644 index 0000000..5246ce4 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/unzipAll.pl @@ -0,0 +1,30 @@ +#!/bin/perl -w +# Extracts all files from the given zip +# $Revision: 1.3 $ +# usage: +# perl unzipAll.pl [-j] zipfile.zip +# if -j option given, discards paths. +# +use strict; + +use vars qw( $opt_j ); +use Archive::Zip qw(:ERROR_CODES); +use Getopt::Std; + +$opt_j = 0; +getopts('j'); + +if (@ARGV < 1) +{ + die <new(); +my $zipName = shift(@ARGV); +my $status = $zip->read( $zipName ); +die "Read of $zipName failed\n" if $status != AZ_OK; + +$zip->extractTree(); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateTree.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateTree.pl new file mode 100644 index 0000000..1cdba0d --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateTree.pl @@ -0,0 +1,35 @@ +# Shows how to update a Zip in place using a temp file. +# +# usage: +# perl [-m] examples/updateTree.pl zipfile.zip dirname +# +# -m means to mirror +# +# $Id: updateTree.pl,v 1.2 2003/11/27 17:03:51 ned Exp $ +# +use Archive::Zip qw(:ERROR_CODES); + +my $mirror = 0; +if ( $ARGV[0] eq '-m' ) { shift; $mirror = 1; } + +my $zipName = shift || die 'must provide a zip name'; +my $dirName = shift || die 'must provide a directory name'; + +# Read the zip +my $zip = Archive::Zip->new(); + +if ( -f $zipName ) +{ + die "can't read $zipName\n" unless $zip->read($zipName) == AZ_OK; + + # Update the zip + $zip->updateTree($dirName, undef, undef, $mirror); + + # Now the zip is updated. Write it back via a temp file. + exit( $zip->overwrite() ); +} +else # new zip +{ + $zip->addTree($dirName); + exit( $zip->writeToFileNamed($zipName) ); +} diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateZip.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateZip.pl new file mode 100644 index 0000000..5101050 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/updateZip.pl @@ -0,0 +1,42 @@ +# Shows how to update a Zip in place using a temp file. +# $Revision: 1.1 $ +# +use Archive::Zip qw(:ERROR_CODES); +use File::Copy(); + +my $zipName = shift || die 'must provide a zip name'; +my @fileNames = @ARGV; +die 'must provide file names' unless scalar(@fileNames); + +# Read the zip +my $zip = Archive::Zip->new(); +die "can't read $zipName\n" unless $zip->read($zipName) == AZ_OK; + +# Update the zip +foreach my $file (@fileNames) +{ + $zip->removeMember($file); + if ( -r $file ) + { + if ( -f $file ) + { + $zip->addFile($file) or die "Can't add $file to zip!\n"; + } + elsif ( -d $file ) + { + $zip->addDirectory($file) or die "Can't add $file to zip!\n"; + } + else + { + warn "Don't know how to add $file\n"; + } + } + else + { + warn "Can't read $file\n"; + } +} + +# Now the zip is updated. Write it back via a temp file. + +exit( $zip->overwrite() ); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar.pl new file mode 100644 index 0000000..0d20e87 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl -w +use strict; +use Archive::Zip qw(:CONSTANTS :ERROR_CODES); +use IO::Scalar; +use IO::File; + +# test writing to a scalar +my $zipContents = ''; +my $SH = IO::Scalar->new(\$zipContents); + +my $zip = Archive::Zip->new(); +my $member = $zip->addString('a' x 300, 'bunchOfAs.txt'); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); +$member = $zip->addString('b' x 300, 'bunchOfBs.txt'); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); +my $status = $zip->writeToFileHandle( $SH ); + +my $file = IO::File->new('test.zip', 'w'); +binmode($file); +$file->print($zipContents); +$file->close(); + diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar2.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar2.pl new file mode 100644 index 0000000..407c928 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/writeScalar2.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl -w +use strict; +use Archive::Zip qw(:CONSTANTS :ERROR_CODES); +use IO::String; +use IO::File; + +# test writing to a scalar +my $zipContents = ''; +my $SH = IO::String->new($zipContents); + +my $zip = Archive::Zip->new(); +my $member = $zip->addString('a' x 300, 'bunchOfAs.txt'); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); +$member = $zip->addString('b' x 300, 'bunchOfBs.txt'); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); +my $status = $zip->writeToFileHandle( $SH ); + +my $file = IO::File->new('test.zip', 'w'); +binmode($file); +$file->print($zipContents); +$file->close(); + diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zip.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zip.pl new file mode 100644 index 0000000..f560323 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zip.pl @@ -0,0 +1,30 @@ +#!/bin/perl -w +# Creates a zip file, adding the given directories and files. +# Usage: +# perl zip.pl zipfile.zip file [...] + +use strict; +use Archive::Zip qw(:ERROR_CODES :CONSTANTS); + +die "usage: $0 zipfile.zip file [...]\n" + if (scalar(@ARGV) < 2); + +my $zipName = shift(@ARGV); +my $zip = Archive::Zip->new(); + +foreach my $memberName (map { glob } @ARGV) +{ + if (-d $memberName ) + { + warn "Can't add tree $memberName\n" + if $zip->addTree( $memberName, $memberName ) != AZ_OK; + } + else + { + $zip->addFile( $memberName ) + or warn "Can't add file $memberName\n"; + } +} + +my $status = $zip->writeToFileNamed($zipName); +exit $status; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipGrep.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipGrep.pl new file mode 100644 index 0000000..47f4ba8 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipGrep.pl @@ -0,0 +1,57 @@ +#!/usr/bin/perl -w +# This program searches for the given Perl regular expression in a Zip archive. +# Archive is assumed to contain text files. +# By Ned Konz, perl@bike-nomad.com +# Usage: +# perl zipGrep.pl 'pattern' myZip.zip +# +use strict; +use Archive::Zip qw(:CONSTANTS :ERROR_CODES); + +if ( @ARGV != 2 ) +{ + print <new(); +if ( $zip->read($zipName) != AZ_OK ) +{ + die "Read error reading $zipName\n"; +} + +foreach my $member ( $zip->members() ) +{ + my ( $bufferRef, $status, $lastChunk ); + my $memberName = $member->fileName(); + my $lineNumber = 1; + $lastChunk = ''; + $member->desiredCompressionMethod(COMPRESSION_STORED); + $status = $member->rewindData(); + die "rewind error $status" if $status != AZ_OK; + + while ( !$member->readIsDone() ) + { + ( $bufferRef, $status ) = $member->readChunk(); + die "readChunk error $status" + if $status != AZ_OK && $status != AZ_STREAM_END; + + my $buffer = $lastChunk . $$bufferRef; + while ( $buffer =~ m{(.*$pattern.*\n)}mg ) + { + print "$memberName:$1"; + } + ($lastChunk) = $$bufferRef =~ m{([^\n\r]+)\z}; + } + + $member->endRead(); +} diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipcheck.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipcheck.pl new file mode 100644 index 0000000..d3c8fc0 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipcheck.pl @@ -0,0 +1,39 @@ +#!/bin/perl -w +# usage: valid zipname.zip +# exits with non-zero status if invalid zip +# status = 1: invalid arguments +# status = 2: generic error somewhere +# status = 3: format error +# status = 4: IO error +use strict; +use Archive::Zip qw(:ERROR_CODES); +use IO::Handle; +use File::Spec; + +# instead of stack dump: +Archive::Zip::setErrorHandler( sub { warn shift() } ); + +my $nullFileName = File::Spec->devnull(); +my $zip = Archive::Zip->new(); +my $zipName = shift(@ARGV) || exit 1; +eval +{ + my $status = $zip->read( $zipName ); + exit $status if $status != AZ_OK; +}; +if ($@) { warn 'error reading zip:', $@, "\n"; exit 2 } + +eval +{ + foreach my $member ($zip->members) + { + my $fh = IO::File->new(); + $fh->open(">$nullFileName") || die "can't open $nullFileName\: $!\n"; + my $status = $member->extractToFileHandle($fh); + if ($status != AZ_OK) + { + warn "Extracting ", $member->fileName(), " from $zipName failed\n"; + exit $status; + } + } +} diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipinfo.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipinfo.pl new file mode 100644 index 0000000..2f44d8b --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/zipinfo.pl @@ -0,0 +1,147 @@ +#! /usr/bin/perl -w +# Print out information about a ZIP file. +# Note that this buffers the entire file into memory! +# usage: +# perl examples/zipinfo.pl zipfile.zip + +use strict; + +use Data::Dumper (); +use FileHandle; +use Archive::Zip qw(:ERROR_CODES :CONSTANTS :PKZIP_CONSTANTS); +use Archive::Zip::BufferedFileHandle; + +$| = 1; + +### Workaround for a bug in version of Data::Dumper bundled +### with some versions of Perl, which causes warnings when +### calling ->Seen below. +if ( defined &Data::Dumper::init_refaddr_format ) { + Data::Dumper::init_refaddr_format(); +} + +# use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING; +use constant CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE_STRING => pack( SIGNATURE_FORMAT, + CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE ); +use constant LOCAL_FILE_HEADER_SIGNATURE_STRING => pack( SIGNATURE_FORMAT, + LOCAL_FILE_HEADER_SIGNATURE ); + +$Data::Dumper::Useqq = 1; # enable double-quotes for string values +$Data::Dumper::Indent = 1; + +my $zip = Archive::Zip->new(); +my $zipFileName = shift(@ARGV); + +my $fh = Archive::Zip::BufferedFileHandle->new(); +$fh->readFromFile($zipFileName) or exit($!); + +my $status = $zip->_findEndOfCentralDirectory($fh); +die("can't find EOCD\n") if $status != AZ_OK; + +my $eocdPosition = $fh->tell( ); + +$status = $zip->_readEndOfCentralDirectory($fh); +die("can't read EOCD\n") if $status != AZ_OK; + +my $zipDumper = Data::Dumper->new([$zip], ['ZIP']); +$zipDumper->Seen({ ref($fh), $fh }); +print $zipDumper->Dump(), "\n"; + +my $expectedEOCDPosition = $zip->centralDirectoryOffsetWRTStartingDiskNumber() + + $zip->centralDirectorySize(); + +my $eocdOffset = $zip->{eocdOffset} = $eocdPosition - $expectedEOCDPosition; + +if ($eocdOffset) +{ + printf "Expected EOCD at %d (0x%x) but found it at %d (0x%x)\n", + ($expectedEOCDPosition) x 2, ($eocdPosition) x 2; +} +else +{ + printf("Found EOCD at %d (0x%x)\n\n", ($eocdPosition) x 2); +} + +my $contents = $fh->contents(); +my $offset = $eocdPosition + $eocdOffset - 1; +my $cdPos; +my @members; +my $numberOfMembers = $zip->numberOfCentralDirectoriesOnThisDisk(); +foreach my $n (0 .. $numberOfMembers - 1) +{ + my $index = $numberOfMembers - $n; + $cdPos = rindex($contents, + CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE_STRING, $offset); + if ($cdPos < 0) + { + print "No central directory found for member #$index\n"; + last; + } + else + { + print "Found central directory for member #$index at $cdPos\n"; + $fh->seek($cdPos + SIGNATURE_LENGTH, 0); # SEEK_SET + my $newMember = $zip->ZIPMEMBERCLASS->_newFromZipFile( + $fh, "($zipFileName)" ); + $status = $newMember->_readCentralDirectoryFileHeader(); + if ($status != AZ_OK and $status != AZ_STREAM_END) + { + printf "read CD header status=%d\n", $status; + last; + } + unshift(@members, $newMember); + + my $memberDumper = Data::Dumper->new([$newMember], ['CDMEMBER' . $index ]); + $memberDumper->Seen({ ref($fh), $fh }); + print $memberDumper->Dump(), "\n"; + } + $offset = $cdPos - 1; +} + +if ($cdPos >= 0 and + $cdPos != $zip->centralDirectoryOffsetWRTStartingDiskNumber()) +{ + printf "Expected to find central directory at %d (0x%x), but found it at %d (0x%x)\n", + ($zip->centralDirectoryOffsetWRTStartingDiskNumber()) x 2, + ($cdPos) x 2; +} + +print "\n"; + +# Now read the local headers + +foreach my $n (0 .. $#members) +{ + my $member = $members[$n]; + $fh->seek($member->localHeaderRelativeOffset() + $eocdOffset + SIGNATURE_LENGTH, 0); + $status = $member->_readLocalFileHeader(); + if ($status != AZ_OK and $status != AZ_STREAM_END) + { + printf "member %d read header status=%d\n", $n+1, $status; + last; + } + + my $memberDumper = Data::Dumper->new([$member], ['LHMEMBER' . ($n + 1)]); + $memberDumper->Seen({ ref($fh), $fh }); + print $memberDumper->Dump(), "\n"; + + my $endOfMember = $member->localHeaderRelativeOffset() + + $member->_localHeaderSize() + + $member->compressedSize(); + + if ($endOfMember > $cdPos + or ($n < $#members and + $endOfMember > $members[$n+1]->localHeaderRelativeOffset())) + { + print "Error: "; + } + printf("End of member: %d, CD at %d", $endOfMember, $cdPos); + if ( $n < $#members ) + { + printf(", next member starts at %d", + $members[$n+1]->localHeaderRelativeOffset()); + } + print("\n\n"); +} + +# vim: ts=4 sw=4 diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziprecent.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziprecent.pl new file mode 100644 index 0000000..ab1d70c --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziprecent.pl @@ -0,0 +1,329 @@ +#!/usr/bin/perl -w +# Makes a zip file of the most recent files in a specified directory. +# By Rudi Farkas, rudif@bluemail.ch, 9 December 2000 +# Usage: +# ziprecent -d [-e ...]> [-h] [-msvc] [-q] [] +# Zips files in source directory and its subdirectories +# whose file extension is in specified extensions (default: any extension). +# -d max age (days) for files to be zipped (default: 1 day) +# source directory +# -e one or more space-separated extensions +# -h print help text and exit +# -msvc may be given instead of -e and will zip all msvc source files +# -q query only (list files but don't zip) +# .zip path to zipfile to be created (or updated if it exists) +# +# $Revision: 1.2 $ + +use strict; + +use Archive::Zip qw(:ERROR_CODES :CONSTANTS); +use Cwd; +use File::Basename; +use File::Copy; +use File::Find; +use File::Path; + +# argument and variable defaults +# +my $maxFileAgeDays = 1; +my $defaultzipdir = 'h:/zip/_homework'; +my ($sourcedir, $zipdir, $zippath, @extensions, $query); + + +# usage +# +my $scriptname = basename $0; +my $usage = < -d [-e ...]> [-h] [-msvc] [-q] [] +Zips files in source directory and its subdirectories +whose file extension is in specified extensions (default: any extension). + -d max age (days) for files to be zipped (default: 1 day) + source directory + -e one or more space-separated extensions + -h print help text and exit + -msvc may be given instead of -e and will zip all msvc source files + -q query only (list files but don't zip) + .zip path to zipfile to be created (or updated if it exists) +ENDUSAGE + + +# parse arguments +# +while (@ARGV) { + my $arg = shift; + + if ($arg eq '-d') { + $maxFileAgeDays = shift; + $maxFileAgeDays = 0.0 if $maxFileAgeDays < 0.0; + } + elsif ($arg eq '-e') { + while ($ARGV[0] && $ARGV[0] !~ /^-/) { + push @extensions, shift; + } + } + elsif ($arg eq '-msvc') { + push @extensions, qw / bmp c cpp def dlg dsp dsw h ico idl mak odl rc rc2 rgs /; + } + elsif ($arg eq '-q') { + $query = 1; + } + elsif ($arg eq '-h') { + print STDERR $usage; + exit; + } + elsif (-d $arg) { + $sourcedir = $arg; + } + elsif ($arg eq '-z') { + if ($ARGV[0]) { + $zipdir = shift; + } + } + elsif ($arg =~ /\.zip$/) { + $zippath = $arg; + } + else { + errorExit("Unknown option or argument: $arg"); + } +} + +# process arguments +# +errorExit("Please specify an existing source directory") unless defined($sourcedir) && -d $sourcedir; + +my $extensions; +if (@extensions) { + $extensions = join "|", @extensions; +} +else { + $extensions = ".*"; +} + +# change '\' to '/' (avoids trouble in substitution on Win2k) +# +$sourcedir =~ s|\\|/|g; +$zippath =~ s|\\|/|g if defined($zippath); + + +# find files +# +my @files; +cwd $sourcedir; +find(\&listFiles, $sourcedir); +printf STDERR "Found %d file(s)\n", scalar @files; + + +# exit ? +# +exit if $query; +exit if @files <= 0; + + +# prepare zip directory +# +if (defined($zippath)) { + # deduce directory from zip path + $zipdir = dirname($zippath); + $zipdir = '.' unless length $zipdir; +} +else { + $zipdir= $defaultzipdir; +} + +# make sure that zip directory exists +# +mkpath $zipdir unless -d $zipdir; +-d $zipdir or die "Can't find/make directory $zipdir\n"; + + + +# create the zip object +# +my $zip = Archive::Zip->new(); + + +# read-in the existing zip file if any +# +if (defined $zippath && -f $zippath) { + my $status = $zip->read($zippath); + warn "Read $zippath failed\n" if $status != AZ_OK; +} + +# add files +# +foreach my $memberName (@files) +{ + if (-d $memberName ) + { + warn "Can't add tree $memberName\n" + if $zip->addTree( $memberName, $memberName ) != AZ_OK; + } + else + { + $zip->addFile( $memberName ) + or warn "Can't add file $memberName\n"; + } +} + + +# prepare the new zip path +# +my $newzipfile = genfilename(); +my $newzippath = "$zipdir/$newzipfile"; + + +# write the new zip file +# +my $status = $zip->writeToFileNamed($newzippath); +if ($status == AZ_OK) { + # rename (and overwrite the old zip file if any)? + # + if (defined $zippath) { + my $res = rename $newzippath, $zippath; + if ($res) { + print STDERR "Updated file $zippath\n"; + } + else { + print STDERR "Created file $newzippath, failed to rename to $zippath\n"; + } + } + else { + print STDERR "Created file $newzippath\n"; + } +} +else { + print STDERR "Failed to create file $newzippath\n"; +} + + + +# subroutines +# + +sub listFiles { + if (/\.($extensions)$/) { + cwd $File::Find::dir; + return if -d $File::Find::name; # skip directories + my $fileagedays = fileAgeDays($_); + if ($fileagedays < $maxFileAgeDays) { + printf STDERR "$File::Find::name (%.3g)\n", $fileagedays; + (my $filename = $File::Find::name) =~ s/^[a-zA-Z]://; # remove the leading drive letter: + push @files, $filename; + } + } +} + +sub errorExit { + printf STDERR "*** %s ***\n$usage\n", shift; + exit; +} + +sub mtime { + (stat shift)[9]; +} + +sub fileAgeDays { + (time() - mtime(shift)) / 86400; +} + +sub genfilename { + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + sprintf "%04d%02d%02d-%02d%02d%02d.zip", $year+1900, $mon+1, $mday, $hour, $min, $sec; +} + +__END__ + +=head1 NAME + +ziprecent.pl + +=head1 SYNOPSIS + + ziprecent h:/myperl + + ziprecent h:/myperl -e pl pm -d 365 + + ziprecent h:/myperl -q + + ziprecent h:/myperl h:/temp/zip/file1.zip + + +=head1 DESCRIPTION + +=over 4 + +This script helps to collect recently modified files in a source directory +into a zip file (new or existing). + +It uses Archive::Zip. + +=item C< ziprecent h:/myperl > + +Lists and zips all files more recent than 1 day (24 hours) +in directory h:/myperl and it's subdirectories, +and places the zip file into default zip directory. +The generated zip file name is based on local time (e.g. 20001208-231237.zip). + + +=item C< ziprecent h:/myperl -e pl pm -d 365 > + +Zips only .pl and .pm files more recent than one year. + + +=item C< ziprecent h:/myperl -msvc > + +Zips source files found in a typical MSVC project. + + +=item C< ziprecent h:/myperl -q > + +Lists files that should be zipped. + + +=item C< ziprecent h:/myperl h:/temp/zip/file1.zip > + +Updates file named h:/temp/zip/file1.zip +(overwrites an existing file if writable). + + +=item C< ziprecent -h > + +Prints the help text and exits. + + ziprecent.pl -d [-e ...]> [-h] [-msvc] [-q] [] + Zips files in source directory and its subdirectories + whose file extension is in specified extensions (default: any extension). + -d max age (days) for files to be zipped (default: 1 day) + source directory + -e one or more space-separated extensions + -h print help text and exit + -msvc may be given instead of -e and will zip all msvc source files + -q query only (list files but don't zip) + .zip path to zipfile to be created (or updated if it exists) + +=back + + +=head1 BUGS + +Tested only on Win2k. + +Does not handle filenames without extension. + +Does not accept more than one source directory (workaround: invoke separately +for each directory, specifying the same zip file). + + +=head1 AUTHOR + +Rudi Farkas rudif@lecroy.com rudif@bluemail.ch + +=head1 SEE ALSO + +perl ;-) + +=cut + + + diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziptest.pl b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziptest.pl new file mode 100644 index 0000000..6bc18a2 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/examples/ziptest.pl @@ -0,0 +1,82 @@ +#!/bin/perl -w +# $Revision: 1.7 $ +# Lists the zipfile given as a first argument and tests CRC's. +# Usage: +# perl ziptest.pl zipfile.zip + +use strict; + +use Archive::Zip qw(:ERROR_CODES :CONSTANTS); + +package CRCComputingFileHandle; +use Archive::Zip::MockFileHandle; + +use vars qw( @ISA ); +@ISA = qw( Archive::Zip::MockFileHandle ); + +my $crc; + +sub writeHook +{ + my $self = shift; + my $bytes = shift; + my $length = length($bytes); + $crc = Archive::Zip::computeCRC32($bytes, $crc); +} + +sub resetCRC { $crc = 0 } + +sub crc { $crc } + +package main; + +die "usage: $0 zipfile.zip\n" + if (scalar(@ARGV) != 1); + +my $zip = Archive::Zip->new(); +my $status = $zip->read( $ARGV[0] ); +exit $status if $status != AZ_OK; + +print " Length Size Last Modified CRC-32 Name\n"; +print "-------- -------- ------------------------ -------- ----\n"; + +my $fh = CRCComputingFileHandle->new(); +my @errors; + +foreach my $member ($zip->members()) +{ + my $compressedSize = $member->compressedSize(); + $fh->resetCRC(); + $member->desiredCompressionMethod(COMPRESSION_STORED); + $status = $member->extractToFileHandle($fh); + exit $status if $status != AZ_OK; + my $crc = $fh->crc(); + + my $ct = scalar(localtime($member->lastModTime())); + chomp($ct); + + printf("%8d %8d %s %08x %s\n", + $member->uncompressedSize(), + $compressedSize, + $ct, + $member->crc32(), + $member->fileName() + ); + + if ($member->crc32() != $crc) + { + push(@errors, + sprintf("Member %s CRC error: file says %08x computed: %08x\n", + $member->fileName(), $member->crc32(), $crc)); + } +} + +if (scalar(@errors)) +{ + print join("\n", @errors); + die "CRC errors found\n"; +} +else +{ + print "All CRCs check OK\n"; +} diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip.pm new file mode 100644 index 0000000..411c135 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip.pm @@ -0,0 +1,2042 @@ +package Archive::Zip; + +# Copyright 2000 - 2002 Ned Konz. All rights reserved. This program is free +# software; you can redistribute it and/or modify it under the same terms as +# Perl itself. + +# ---------------------------------------------------------------------- +# class Archive::Zip +# Note that the package Archive::Zip exists only for exporting and +# sharing constants. Everything else is in another package +# in this file. +# Creation of a new Archive::Zip object actually creates a new object +# of class Archive::Zip::Archive. +# ---------------------------------------------------------------------- + +BEGIN { + require 5.003_96; +} +use strict; +use UNIVERSAL (); +use Carp (); +use IO::File (); +use IO::Seekable (); +use Compress::Zlib (); +use File::Spec (); +use File::Temp (); + +use vars qw( $VERSION @ISA ); +BEGIN { + $VERSION = '1.18'; + $VERSION = eval $VERSION; + + require Exporter; + @ISA = qw( Exporter ); +} + +use vars qw( $ChunkSize $ErrorHandler ); + +# This is the size we'll try to read, write, and (de)compress. +# You could set it to something different if you had lots of memory +# and needed more speed. +$ChunkSize = 32768; + +$ErrorHandler = \&Carp::carp; + +# BEGIN block is necessary here so that other modules can use the constants. +use vars qw( @EXPORT_OK %EXPORT_TAGS ); +BEGIN { + @EXPORT_OK = ('computeCRC32'); + %EXPORT_TAGS = ( + CONSTANTS => [ qw( + FA_MSDOS + FA_UNIX + GPBF_ENCRYPTED_MASK + GPBF_DEFLATING_COMPRESSION_MASK + GPBF_HAS_DATA_DESCRIPTOR_MASK + COMPRESSION_STORED + COMPRESSION_DEFLATED + COMPRESSION_LEVEL_NONE + COMPRESSION_LEVEL_DEFAULT + COMPRESSION_LEVEL_FASTEST + COMPRESSION_LEVEL_BEST_COMPRESSION + IFA_TEXT_FILE_MASK + IFA_TEXT_FILE + IFA_BINARY_FILE + ) ], + + MISC_CONSTANTS => [ qw( + FA_AMIGA + FA_VAX_VMS + FA_VM_CMS + FA_ATARI_ST + FA_OS2_HPFS + FA_MACINTOSH + FA_Z_SYSTEM + FA_CPM + FA_TOPS20 + FA_WINDOWS_NTFS + FA_QDOS + FA_ACORN + FA_VFAT + FA_MVS + FA_BEOS + FA_TANDEM + FA_THEOS + GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK + GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK + GPBF_IS_COMPRESSED_PATCHED_DATA_MASK + COMPRESSION_SHRUNK + DEFLATING_COMPRESSION_NORMAL + DEFLATING_COMPRESSION_MAXIMUM + DEFLATING_COMPRESSION_FAST + DEFLATING_COMPRESSION_SUPER_FAST + COMPRESSION_REDUCED_1 + COMPRESSION_REDUCED_2 + COMPRESSION_REDUCED_3 + COMPRESSION_REDUCED_4 + COMPRESSION_IMPLODED + COMPRESSION_TOKENIZED + COMPRESSION_DEFLATED_ENHANCED + COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED + ) ], + + ERROR_CODES => [ qw( + AZ_OK + AZ_STREAM_END + AZ_ERROR + AZ_FORMAT_ERROR + AZ_IO_ERROR + ) ], + + # For Internal Use Only + PKZIP_CONSTANTS => [ qw( + SIGNATURE_FORMAT + SIGNATURE_LENGTH + LOCAL_FILE_HEADER_SIGNATURE + LOCAL_FILE_HEADER_FORMAT + LOCAL_FILE_HEADER_LENGTH + CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE + DATA_DESCRIPTOR_FORMAT + DATA_DESCRIPTOR_LENGTH + DATA_DESCRIPTOR_SIGNATURE + DATA_DESCRIPTOR_FORMAT_NO_SIG + DATA_DESCRIPTOR_LENGTH_NO_SIG + CENTRAL_DIRECTORY_FILE_HEADER_FORMAT + CENTRAL_DIRECTORY_FILE_HEADER_LENGTH + END_OF_CENTRAL_DIRECTORY_SIGNATURE + END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING + END_OF_CENTRAL_DIRECTORY_FORMAT + END_OF_CENTRAL_DIRECTORY_LENGTH + ) ], + + # For Internal Use Only + UTILITY_METHODS => [ qw( + _error + _printError + _ioError + _formatError + _subclassResponsibility + _binmode + _isSeekable + _newFileHandle + _readSignature + _asZipDirName + ) ], + ); + + # Add all the constant names and error code names to @EXPORT_OK + Exporter::export_ok_tags( qw( + CONSTANTS + ERROR_CODES + PKZIP_CONSTANTS + UTILITY_METHODS + MISC_CONSTANTS + ) ); + +} + +# Error codes +use constant AZ_OK => 0; +use constant AZ_STREAM_END => 1; +use constant AZ_ERROR => 2; +use constant AZ_FORMAT_ERROR => 3; +use constant AZ_IO_ERROR => 4; + +# File types +# Values of Archive::Zip::Member->fileAttributeFormat() + +use constant FA_MSDOS => 0; +use constant FA_AMIGA => 1; +use constant FA_VAX_VMS => 2; +use constant FA_UNIX => 3; +use constant FA_VM_CMS => 4; +use constant FA_ATARI_ST => 5; +use constant FA_OS2_HPFS => 6; +use constant FA_MACINTOSH => 7; +use constant FA_Z_SYSTEM => 8; +use constant FA_CPM => 9; +use constant FA_TOPS20 => 10; +use constant FA_WINDOWS_NTFS => 11; +use constant FA_QDOS => 12; +use constant FA_ACORN => 13; +use constant FA_VFAT => 14; +use constant FA_MVS => 15; +use constant FA_BEOS => 16; +use constant FA_TANDEM => 17; +use constant FA_THEOS => 18; + +# general-purpose bit flag masks +# Found in Archive::Zip::Member->bitFlag() + +use constant GPBF_ENCRYPTED_MASK => 1 << 0; +use constant GPBF_DEFLATING_COMPRESSION_MASK => 3 << 1; +use constant GPBF_HAS_DATA_DESCRIPTOR_MASK => 1 << 3; + +# deflating compression types, if compressionMethod == COMPRESSION_DEFLATED +# ( Archive::Zip::Member->bitFlag() & GPBF_DEFLATING_COMPRESSION_MASK ) + +use constant DEFLATING_COMPRESSION_NORMAL => 0 << 1; +use constant DEFLATING_COMPRESSION_MAXIMUM => 1 << 1; +use constant DEFLATING_COMPRESSION_FAST => 2 << 1; +use constant DEFLATING_COMPRESSION_SUPER_FAST => 3 << 1; + +# compression method + +# these two are the only ones supported in this module +use constant COMPRESSION_STORED => 0; # file is stored (no compression) +use constant COMPRESSION_DEFLATED => 8; # file is Deflated +use constant COMPRESSION_LEVEL_NONE => 0; +use constant COMPRESSION_LEVEL_DEFAULT => -1; +use constant COMPRESSION_LEVEL_FASTEST => 1; +use constant COMPRESSION_LEVEL_BEST_COMPRESSION => 9; + +# internal file attribute bits +# Found in Archive::Zip::Member::internalFileAttributes() + +use constant IFA_TEXT_FILE_MASK => 1; +use constant IFA_TEXT_FILE => 1; +use constant IFA_BINARY_FILE => 0; + +# PKZIP file format miscellaneous constants (for internal use only) +use constant SIGNATURE_FORMAT => "V"; +use constant SIGNATURE_LENGTH => 4; + +# these lengths are without the signature. +use constant LOCAL_FILE_HEADER_SIGNATURE => 0x04034b50; +use constant LOCAL_FILE_HEADER_FORMAT => "v3 V4 v2"; +use constant LOCAL_FILE_HEADER_LENGTH => 26; + +# PKZIP docs don't mention the signature, but Info-Zip writes it. +use constant DATA_DESCRIPTOR_SIGNATURE => 0x08074b50; +use constant DATA_DESCRIPTOR_FORMAT => "V3"; +use constant DATA_DESCRIPTOR_LENGTH => 12; + +# but the signature is apparently optional. +use constant DATA_DESCRIPTOR_FORMAT_NO_SIG => "V2"; +use constant DATA_DESCRIPTOR_LENGTH_NO_SIG => 8; + +use constant CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE => 0x02014b50; +use constant CENTRAL_DIRECTORY_FILE_HEADER_FORMAT => "C2 v3 V4 v5 V2"; +use constant CENTRAL_DIRECTORY_FILE_HEADER_LENGTH => 42; + +use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE => 0x06054b50; +use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING => + pack( "V", END_OF_CENTRAL_DIRECTORY_SIGNATURE ); +use constant END_OF_CENTRAL_DIRECTORY_FORMAT => "v4 V2 v"; +use constant END_OF_CENTRAL_DIRECTORY_LENGTH => 18; + +use constant GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK => 1 << 1; +use constant GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK => 1 << 2; +use constant GPBF_IS_COMPRESSED_PATCHED_DATA_MASK => 1 << 5; + +# the rest of these are not supported in this module +use constant COMPRESSION_SHRUNK => 1; # file is Shrunk +use constant COMPRESSION_REDUCED_1 => 2; # file is Reduced CF=1 +use constant COMPRESSION_REDUCED_2 => 3; # file is Reduced CF=2 +use constant COMPRESSION_REDUCED_3 => 4; # file is Reduced CF=3 +use constant COMPRESSION_REDUCED_4 => 5; # file is Reduced CF=4 +use constant COMPRESSION_IMPLODED => 6; # file is Imploded +use constant COMPRESSION_TOKENIZED => 7; # reserved for Tokenizing compr. +use constant COMPRESSION_DEFLATED_ENHANCED => 9; # reserved for enh. Deflating +use constant COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED => 10; + +# Load the various required classes +require Archive::Zip::Archive; +require Archive::Zip::Member; +require Archive::Zip::FileMember; +require Archive::Zip::DirectoryMember; +require Archive::Zip::ZipFileMember; +require Archive::Zip::NewFileMember; +require Archive::Zip::StringMember; + +use constant ZIPARCHIVECLASS => 'Archive::Zip::Archive'; +use constant ZIPMEMBERCLASS => 'Archive::Zip::Member'; + +sub new +{ + my $class = shift; + return $class->ZIPARCHIVECLASS->new(@_); +} + +sub computeCRC32 +{ + my $data = shift; + $data = shift if ref($data); # allow calling as an obj method + my $crc = shift; + return Compress::Zlib::crc32( $data, $crc ); +} + +# Report or change chunk size used for reading and writing. +# Also sets Zlib's default buffer size (eventually). +sub setChunkSize +{ + my $chunkSize = shift; + $chunkSize = shift if ref($chunkSize); # object method on zip? + my $oldChunkSize = $Archive::Zip::ChunkSize; + $Archive::Zip::ChunkSize = $chunkSize if ($chunkSize); + return $oldChunkSize; +} + +sub chunkSize +{ + return $Archive::Zip::ChunkSize; +} + +sub setErrorHandler (&) +{ + my $errorHandler = shift; + $errorHandler = \&Carp::carp unless defined($errorHandler); + my $oldErrorHandler = $Archive::Zip::ErrorHandler; + $Archive::Zip::ErrorHandler = $errorHandler; + return $oldErrorHandler; +} + +# ---------------------------------------------------------------------- +# Private utility functions (not methods). +# ---------------------------------------------------------------------- + +sub _printError +{ + my $string = join ( ' ', @_, "\n" ); + my $oldCarpLevel = $Carp::CarpLevel; + $Carp::CarpLevel += 2; + &{$ErrorHandler} ($string); + $Carp::CarpLevel = $oldCarpLevel; +} + +# This is called on format errors. +sub _formatError +{ + shift if ref( $_[0] ); + _printError( 'format error:', @_ ); + return AZ_FORMAT_ERROR; +} + +# This is called on IO errors. +sub _ioError +{ + shift if ref( $_[0] ); + _printError( 'IO error:', @_, ':', $! ); + return AZ_IO_ERROR; +} + +# This is called on generic errors. +sub _error +{ + shift if ref( $_[0] ); + _printError( 'error:', @_ ); + return AZ_ERROR; +} + +# Called when a subclass should have implemented +# something but didn't +sub _subclassResponsibility +{ + Carp::croak("subclass Responsibility\n"); +} + +# Try to set the given file handle or object into binary mode. +sub _binmode +{ + my $fh = shift; + return UNIVERSAL::can( $fh, 'binmode' ) ? $fh->binmode() : binmode($fh); +} + +# Attempt to guess whether file handle is seekable. +# Because of problems with Windoze, this only returns true when +# the file handle is a real file. +sub _isSeekable +{ + my $fh = shift; + if ( UNIVERSAL::isa($fh, 'IO::Scalar') ) { + return 0; + } + if ( UNIVERSAL::isa($fh, 'IO::String') ) { + return 1; + } + if ( UNIVERSAL::isa($fh, 'IO::Seekable') ) { + # Unfortunately, some things like FileHandle objects + # return true for Seekable, but AREN'T!!!!! + if ( UNIVERSAL::isa($fh, 'FileHandle') ) { + return 0; + } + return 1; + } + if ( UNIVERSAL::can($fh, 'stat') ) { + return -f $fh; + } + return ( + UNIVERSAL::can($fh, 'seek') and UNIVERSAL::can($fh, 'tell') + ) ? 1 : 0; +} + +# Return an opened IO::Handle +# my ( $status, fh ) = _newFileHandle( 'fileName', 'w' ); +# Can take a filename, file handle, or ref to GLOB +# Or, if given something that is a ref but not an IO::Handle, +# passes back the same thing. +sub _newFileHandle +{ + my $fd = shift; + my $status = 1; + my $handle; + + if ( ref($fd) ) + { + if ( UNIVERSAL::isa( $fd, 'IO::Scalar' ) + or UNIVERSAL::isa( $fd, 'IO::String' ) ) + { + $handle = $fd; + } + elsif ( UNIVERSAL::isa( $fd, 'IO::Handle' ) + or UNIVERSAL::isa( $fd, 'GLOB' ) ) + { + $handle = IO::File->new(); + $status = $handle->fdopen( $fd, @_ ); + } + else + { + $handle = $fd; + } + } + else + { + $handle = IO::File->new(); + $status = $handle->open( $fd, @_ ); + } + + return ( $status, $handle ); +} + +# Returns next signature from given file handle, leaves +# file handle positioned afterwards. +# In list context, returns ($status, $signature) +# ( $status, $signature) = _readSignature( $fh, $fileName ); + +sub _readSignature +{ + my $fh = shift; + my $fileName = shift; + my $expectedSignature = shift; # optional + + my $signatureData; + my $bytesRead = $fh->read( $signatureData, SIGNATURE_LENGTH ); + return _ioError("reading header signature") + if $bytesRead != SIGNATURE_LENGTH; + my $signature = unpack( SIGNATURE_FORMAT, $signatureData ); + my $status = AZ_OK; + + # compare with expected signature, if any, or any known signature. + if ( ( defined($expectedSignature) && $signature != $expectedSignature ) + || ( !defined($expectedSignature) + && $signature != CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE + && $signature != LOCAL_FILE_HEADER_SIGNATURE + && $signature != END_OF_CENTRAL_DIRECTORY_SIGNATURE + && $signature != DATA_DESCRIPTOR_SIGNATURE ) ) + { + my $errmsg = sprintf( "bad signature: 0x%08x", $signature ); + if ( _isSeekable($fh) ) + { + $errmsg .= + sprintf( " at offset %d", $fh->tell() - SIGNATURE_LENGTH ); + } + + $status = _formatError("$errmsg in file $fileName"); + } + + return ( $status, $signature ); +} + +# Utility method to make and open a temp file. +# Will create $temp_dir if it doesn't exist. +# Returns file handle and name: +# +# my ($fh, $name) = Archive::Zip::tempFile(); +# my ($fh, $name) = Archive::Zip::tempFile('mytempdir'); +# + +sub tempFile +{ + my $dir = shift; + my ( $fh, $filename ) = File::Temp::tempfile( + SUFFIX => '.zip', + UNLINK => 0, # we will delete it! + $dir ? ( DIR => $dir ) : () + ); + return ( undef, undef ) unless $fh; + my ( $status, $newfh ) = _newFileHandle( $fh, 'w+' ); + return ( $newfh, $filename ); +} + +# Return the normalized directory name as used in a zip file (path +# separators become slashes, etc.). +# Will translate internal slashes in path components (i.e. on Macs) to +# underscores. Discards volume names. +# When $forceDir is set, returns paths with trailing slashes (or arrays +# with trailing blank members). +# +# If third argument is a reference, returns volume information there. +# +# input output +# . ('.') '.' +# ./a ('a') a +# ./a/b ('a','b') a/b +# ./a/b/ ('a','b') a/b +# a/b/ ('a','b') a/b +# /a/b/ ('','a','b') /a/b +# c:\a\b\c.doc ('','a','b','c.doc') /a/b/c.doc # on Windoze +# "i/o maps:whatever" ('i_o maps', 'whatever') "i_o maps/whatever" # on Macs +sub _asZipDirName +{ + my $name = shift; + my $forceDir = shift; + my $volReturn = shift; + my ( $volume, $directories, $file ) = + File::Spec->splitpath( File::Spec->canonpath($name), $forceDir ); + $$volReturn = $volume if ( ref($volReturn) ); + my @dirs = map { $_ =~ s{/}{_}g; $_ } File::Spec->splitdir($directories); + if ( @dirs > 0 ) { pop (@dirs) unless $dirs[-1] } # remove empty component + push ( @dirs, $file || '' ); + #return wantarray ? @dirs : join ( '/', @dirs ); + return join ( '/', @dirs ); +} + +# Return an absolute local name for a zip name. +# Assume a directory if zip name has trailing slash. +# Takes an optional volume name in FS format (like 'a:'). +# +sub _asLocalName +{ + my $name = shift; # zip format + my $volume = shift; + $volume = '' unless defined($volume); # local FS format + + my @paths = split ( /\//, $name ); + my $filename = pop (@paths); + $filename = '' unless defined($filename); + my $localDirs = @paths?File::Spec->catdir(@paths):''; + my $localName = File::Spec->catpath( $volume, $localDirs, $filename ); + $localName = File::Spec->rel2abs($localName) unless $volume; + return $localName; +} + +1; + +__END__ + +=pod + +=head1 NAME + +Archive::Zip - Provide an interface to ZIP archive files. + +=head1 SYNOPSIS + + # Create a Zip file + use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); + my $zip = Archive::Zip->new(); + + # Add a directory + my $dir_member = $zip->addDirectory( 'dirname/' ); + + # Add a file from a string with compression + my $string_member = $zip->addString( 'This is a test', 'stringMember.txt' ); + $string_member->desiredCompressionMethod( COMPRESSION_DEFLATED ); + + # Add a file from disk + my $file_member = $zip->addFile( 'xyz.pl', 'AnotherName.pl' ); + + # Save the Zip file + unless ( $zip->writeToFileNamed('someZip.zip') == AZ_OK ) { + die 'write error'; + } + + # Read a Zip file + my $somezip = Archive::Zip->new(); + unless ( $somezip->read( 'someZip.zip' ) == AZ_OK ) { + die 'read error'; + } + + # Change the compression type for a file in the Zip + my $member = $somezip->memberNamed( 'stringMember.txt' ); + $member->desiredCompressionMethod( COMPRESSION_STORED ); + unless ( $zip->writeToFileNamed( 'someOtherZip.zip' ) == AZ_OK ) { + die 'write error'; + } + +=head1 DESCRIPTION + +The Archive::Zip module allows a Perl program to create, manipulate, read, +and write Zip archive files. + +Zip archives can be created, or you can read from existing zip files. + +Once created, they can be written to files, streams, or strings. Members +can be added, removed, extracted, replaced, rearranged, and enumerated. +They can also be renamed or have their dates, comments, or other attributes +queried or modified. Their data can be compressed or uncompressed as needed. + +Members can be created from members in existing Zip files, or from existing +directories, files, or strings. + +This module uses the L library to read and write the +compressed streams inside the files. + +=head2 File Naming + +Regardless of what your local file system uses for file naming, names in a +Zip file are in Unix format (I slashes (/) separating directory +names, etc.). + +C tries to be consistent with file naming conventions, and will +translate back and forth between native and Zip file names. + +However, it can't guess which format names are in. So two rules control what +kind of file name you must pass various routines: + +=over 4 + +=item Names of files are in local format. + +C and C are used for various file +operations. When you're referring to a file on your system, use its +file naming conventions. + +=item Names of archive members are in Unix format. + +This applies to every method that refers to an archive member, or +provides a name for new archive members. The C methods +that can take one or two names will convert from local to zip names +if you call them with a single name. + +=back + +=head2 Archive::Zip Object Model + +=head2 Overview + +Archive::Zip::Archive objects are what you ordinarily deal with. +These maintain the structure of a zip file, without necessarily +holding data. When a zip is read from a disk file, the (possibly +compressed) data still lives in the file, not in memory. Archive +members hold information about the individual members, but not +(usually) the actual member data. When the zip is written to a +(different) file, the member data is compressed or copied as needed. +It is possible to make archive members whose data is held in a string +in memory, but this is not done when a zip file is read. Directory +members don't have any data. + +=head2 Inheritance + + Exporter + Archive::Zip Common base class, has defs. + Archive::Zip::Archive A Zip archive. + Archive::Zip::Member Abstract superclass for all members. + Archive::Zip::StringMember Member made from a string + Archive::Zip::FileMember Member made from an external file + Archive::Zip::ZipFileMember Member that lives in a zip file + Archive::Zip::NewFileMember Member whose data is in a file + Archive::Zip::DirectoryMember Member that is a directory + +=head1 EXPORTS + +=over 4 + +=item :CONSTANTS + +Exports the following constants: + +FA_MSDOS FA_UNIX GPBF_ENCRYPTED_MASK +GPBF_DEFLATING_COMPRESSION_MASK GPBF_HAS_DATA_DESCRIPTOR_MASK +COMPRESSION_STORED COMPRESSION_DEFLATED IFA_TEXT_FILE_MASK +IFA_TEXT_FILE IFA_BINARY_FILE COMPRESSION_LEVEL_NONE +COMPRESSION_LEVEL_DEFAULT COMPRESSION_LEVEL_FASTEST +COMPRESSION_LEVEL_BEST_COMPRESSION + +=item :MISC_CONSTANTS + +Exports the following constants (only necessary for extending the +module): + +FA_AMIGA FA_VAX_VMS FA_VM_CMS FA_ATARI_ST FA_OS2_HPFS +FA_MACINTOSH FA_Z_SYSTEM FA_CPM FA_WINDOWS_NTFS +GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK +GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK +GPBF_IS_COMPRESSED_PATCHED_DATA_MASK COMPRESSION_SHRUNK +DEFLATING_COMPRESSION_NORMAL DEFLATING_COMPRESSION_MAXIMUM +DEFLATING_COMPRESSION_FAST DEFLATING_COMPRESSION_SUPER_FAST +COMPRESSION_REDUCED_1 COMPRESSION_REDUCED_2 COMPRESSION_REDUCED_3 +COMPRESSION_REDUCED_4 COMPRESSION_IMPLODED COMPRESSION_TOKENIZED +COMPRESSION_DEFLATED_ENHANCED +COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED + +=item :ERROR_CODES + +Explained below. Returned from most methods. + +AZ_OK AZ_STREAM_END AZ_ERROR AZ_FORMAT_ERROR AZ_IO_ERROR + +=back + +=head1 ERROR CODES + +Many of the methods in Archive::Zip return error codes. These are implemented +as inline subroutines, using the C pragma. They can be imported +into your namespace using the C<:ERROR_CODES> tag: + + use Archive::Zip qw( :ERROR_CODES ); + + ... + + unless ( $zip->read( 'myfile.zip' ) == AZ_OK ) { + die "whoops!"; + } + +=over 4 + +=item AZ_OK (0) + +Everything is fine. + +=item AZ_STREAM_END (1) + +The read stream (or central directory) ended normally. + +=item AZ_ERROR (2) + +There was some generic kind of error. + +=item AZ_FORMAT_ERROR (3) + +There is a format error in a ZIP file being read. + +=item AZ_IO_ERROR (4) + +There was an IO error. + +=back + +=head2 Compression + +Archive::Zip allows each member of a ZIP file to be compressed (using the +Deflate algorithm) or uncompressed. + +Other compression algorithms that some versions of ZIP have been able to +produce are not supported. Each member has two compression methods: the +one it's stored as (this is always COMPRESSION_STORED for string and external +file members), and the one you desire for the member in the zip file. + +These can be different, of course, so you can make a zip member that is not +compressed out of one that is, and vice versa. + +You can inquire about the current compression and set the desired +compression method: + + my $member = $zip->memberNamed( 'xyz.txt' ); + $member->compressionMethod(); # return current compression + + # set to read uncompressed + $member->desiredCompressionMethod( COMPRESSION_STORED ); + + # set to read compressed + $member->desiredCompressionMethod( COMPRESSION_DEFLATED ); + +There are two different compression methods: + +=over 4 + +=item COMPRESSION_STORED + +File is stored (no compression) + +=item COMPRESSION_DEFLATED + +File is Deflated + +=back + +=head2 Compression Levels + +If a member's desiredCompressionMethod is COMPRESSION_DEFLATED, you +can choose different compression levels. This choice may affect the +speed of compression and decompression, as well as the size of the +compressed member data. + + $member->desiredCompressionLevel( 9 ); + +The levels given can be: + +=over 4 + +=item 0 or COMPRESSION_LEVEL_NONE + +This is the same as saying + + $member->desiredCompressionMethod( COMPRESSION_STORED ); + +=item 1 .. 9 + +1 gives the best speed and worst compression, and 9 gives the +best compression and worst speed. + +=item COMPRESSION_LEVEL_FASTEST + +This is a synonym for level 1. + +=item COMPRESSION_LEVEL_BEST_COMPRESSION + +This is a synonym for level 9. + +=item COMPRESSION_LEVEL_DEFAULT + +This gives a good compromise between speed and compression, +and is currently equivalent to 6 (this is in the zlib code). +This is the level that will be used if not specified. + +=back + +=head1 Archive::Zip Methods + +The Archive::Zip class (and its invisible subclass Archive::Zip::Archive) +implement generic zip file functionality. Creating a new Archive::Zip object +actually makes an Archive::Zip::Archive object, but you don't have to worry +about this unless you're subclassing. + +=head2 Constructor + +=over 4 + +=item new( [$fileName] ) + +Make a new, empty zip archive. + + my $zip = Archive::Zip->new(); + +If an additional argument is passed, new() will call read() +to read the contents of an archive: + + my $zip = Archive::Zip->new( 'xyz.zip' ); + +If a filename argument is passed and the read fails for any +reason, new will return undef. For this reason, it may be +better to call read separately. + +=back + +=head2 Zip Archive Utility Methods + +These Archive::Zip methods may be called as functions or as object +methods. Do not call them as class methods: + + $zip = Archive::Zip->new(); + $crc = Archive::Zip::computeCRC32( 'ghijkl' ); # OK + $crc = $zip->computeCRC32( 'ghijkl' ); # also OK + $crc = Archive::Zip->computeCRC32( 'ghijkl' ); # NOT OK + +=over 4 + +=item Archive::Zip::computeCRC32( $string [, $crc] ) + +This is a utility function that uses the Compress::Zlib CRC +routine to compute a CRC-32. You can get the CRC of a string: + + $crc = Archive::Zip::computeCRC32( $string ); + +Or you can compute the running CRC: + + $crc = 0; + $crc = Archive::Zip::computeCRC32( 'abcdef', $crc ); + $crc = Archive::Zip::computeCRC32( 'ghijkl', $crc ); + +=item Archive::Zip::setChunkSize( $number ) + +Report or change chunk size used for reading and writing. +This can make big differences in dealing with large files. +Currently, this defaults to 32K. This also changes the chunk +size used for Compress::Zlib. You must call setChunkSize() +before reading or writing. This is not exportable, so you +must call it like: + + Archive::Zip::setChunkSize( 4096 ); + +or as a method on a zip (though this is a global setting). +Returns old chunk size. + +=item Archive::Zip::chunkSize() + +Returns the current chunk size: + + my $chunkSize = Archive::Zip::chunkSize(); + +=item Archive::Zip::setErrorHandler( \&subroutine ) + +Change the subroutine called with error strings. This +defaults to \&Carp::carp, but you may want to change it to +get the error strings. This is not exportable, so you must +call it like: + + Archive::Zip::setErrorHandler( \&myErrorHandler ); + +If myErrorHandler is undef, resets handler to default. +Returns old error handler. Note that if you call Carp::carp +or a similar routine or if you're chaining to the default +error handler from your error handler, you may want to +increment the number of caller levels that are skipped (do +not just set it to a number): + + $Carp::CarpLevel++; + +=item Archive::Zip::tempFile( [$tmpdir] ) + +Create a uniquely named temp file. It will be returned open +for read/write. If C<$tmpdir> is given, it is used as the +name of a directory to create the file in. If not given, +creates the file using C. Generally, you can +override this choice using the + + $ENV{TMPDIR} + +environment variable. But see the L +documentation for your system. Note that on many systems, if you're +running in taint mode, then you must make sure that C<$ENV{TMPDIR}> is +untainted for it to be used. +Will I create C<$tmpdir> if it doesn't exist (this is a change +from prior versions!). Returns file handle and name: + + my ($fh, $name) = Archive::Zip::tempFile(); + my ($fh, $name) = Archive::Zip::tempFile('myTempDir'); + my $fh = Archive::Zip::tempFile(); # if you don't need the name + +=back + +=head2 Zip Archive Accessors + +=over 4 + +=item members() + +Return a copy of the members array + + my @members = $zip->members(); + +=item numberOfMembers() + +Return the number of members I have + +=item memberNames() + +Return a list of the (internal) file names of the zip members + +=item memberNamed( $string ) + +Return ref to member whose filename equals given filename or +undef. C<$string> must be in Zip (Unix) filename format. + +=item membersMatching( $regex ) + +Return array of members whose filenames match given regular +expression in list context. Returns number of matching +members in scalar context. + + my @textFileMembers = $zip->membersMatching( '.*\.txt' ); + # or + my $numberOfTextFiles = $zip->membersMatching( '.*\.txt' ); + +=item diskNumber() + +Return the disk that I start on. Not used for writing zips, +but might be interesting if you read a zip in. This should be +0, as Archive::Zip does not handle multi-volume archives. + +=item diskNumberWithStartOfCentralDirectory() + +Return the disk number that holds the beginning of the +central directory. Not used for writing zips, but might be +interesting if you read a zip in. This should be 0, as +Archive::Zip does not handle multi-volume archives. + +=item numberOfCentralDirectoriesOnThisDisk() + +Return the number of CD structures in the zipfile last read in. +Not used for writing zips, but might be interesting if you read a zip +in. + +=item numberOfCentralDirectories() + +Return the number of CD structures in the zipfile last read in. +Not used for writing zips, but might be interesting if you read a zip +in. + +=item centralDirectorySize() + +Returns central directory size, as read from an external zip +file. Not used for writing zips, but might be interesting if +you read a zip in. + +=item centralDirectoryOffsetWRTStartingDiskNumber() + +Returns the offset into the zip file where the CD begins. Not +used for writing zips, but might be interesting if you read a +zip in. + +=item zipfileComment( [$string] ) + +Get or set the zipfile comment. Returns the old comment. + + print $zip->zipfileComment(); + $zip->zipfileComment( 'New Comment' ); + +=item eocdOffset() + +Returns the (unexpected) number of bytes between where the +EOCD was found and where it expected to be. This is normally +0, but would be positive if something (a virus, perhaps) had +added bytes somewhere before the EOCD. Not used for writing +zips, but might be interesting if you read a zip in. Here is +an example of how you can diagnose this: + + my $zip = Archive::Zip->new('somefile.zip'); + if ($zip->eocdOffset()) + { + warn "A virus has added ", $zip->eocdOffset, " bytes of garbage\n"; + } + +The C is used to adjust the starting position of member +headers, if necessary. + +=item fileName() + +Returns the name of the file last read from. If nothing has +been read yet, returns an empty string; if read from a file +handle, returns the handle in string form. + +=back + +=head2 Zip Archive Member Operations + +Various operations on a zip file modify members. When a member is +passed as an argument, you can either use a reference to the member +itself, or the name of a member. Of course, using the name requires +that names be unique within a zip (this is not enforced). + +=over 4 + +=item removeMember( $memberOrName ) + +Remove and return the given member, or match its name and +remove it. Returns undef if member or name doesn't exist in this +Zip. No-op if member does not belong to this zip. + +=item replaceMember( $memberOrName, $newMember ) + +Remove and return the given member, or match its name and +remove it. Replace with new member. Returns undef if member or +name doesn't exist in this Zip, or if C<$newMember> is undefined. + +It is an (undiagnosed) error to provide a C<$newMember> that is a +member of the zip being modified. + + my $member1 = $zip->removeMember( 'xyz' ); + my $member2 = $zip->replaceMember( 'abc', $member1 ); + # now, $member2 (named 'abc') is not in $zip, + # and $member1 (named 'xyz') is, having taken $member2's place. + +=item extractMember( $memberOrName [, $extractedName ] ) + +Extract the given member, or match its name and extract it. +Returns undef if member doesn't exist in this Zip. If +optional second arg is given, use it as the name of the +extracted member. Otherwise, the internal filename of the +member is used as the name of the extracted file or +directory. +If you pass C<$extractedName>, it should be in the local file +system's format. +All necessary directories will be created. Returns C +on success. + +=item extractMemberWithoutPaths( $memberOrName [, $extractedName ] ) + +Extract the given member, or match its name and extract it. +Does not use path information (extracts into the current +directory). Returns undef if member doesn't exist in this +Zip. +If optional second arg is given, use it as the name of the +extracted member (its paths will be deleted too). Otherwise, +the internal filename of the member (minus paths) is used as +the name of the extracted file or directory. Returns C +on success. + +=item addMember( $member ) + +Append a member (possibly from another zip file) to the zip +file. Returns the new member. Generally, you will use +addFile(), addDirectory(), addFileOrDirectory(), addString(), +or read() to add members. + + # Move member named 'abc' to end of zip: + my $member = $zip->removeMember( 'abc' ); + $zip->addMember( $member ); + +=item updateMember( $memberOrName, $fileName ) + +Update a single member from the file or directory named C<$fileName>. +Returns the (possibly added or updated) member, if any; C on +errors. +The comparison is based on C and (in the case of a +non-directory) the size of the file. + +=item addFile( $fileName [, $newName ] ) + +Append a member whose data comes from an external file, +returning the member or undef. The member will have its file +name set to the name of the external file, and its +desiredCompressionMethod set to COMPRESSION_DEFLATED. The +file attributes and last modification time will be set from +the file. +If the name given does not represent a readable plain file or +symbolic link, undef will be returned. C<$fileName> must be +in the format required for the local file system. +The optional C<$newName> argument sets the internal file name +to something different than the given $fileName. C<$newName>, +if given, must be in Zip name format (i.e. Unix). +The text mode bit will be set if the contents appears to be +text (as returned by the C<-T> perl operator). + + +I that you shouldn't (generally) use absolute path names +in zip member names, as this will cause problems with some zip +tools as well as introduce a security hole and make the zip +harder to use. + +=item addDirectory( $directoryName [, $fileName ] ) + + + +Append a member created from the given directory name. The +directory name does not have to name an existing directory. +If the named directory exists, the file modification time and +permissions are set from the existing directory, otherwise +they are set to now and permissive default permissions. +C<$directoryName> must be in local file system format. +The optional second argument sets the name of the archive +member (which defaults to C<$directoryName>). If given, it +must be in Zip (Unix) format. +Returns the new member. + +=item addFileOrDirectory( $name [, $newName ] ) + + + +Append a member from the file or directory named $name. If +$newName is given, use it for the name of the new member. +Will add or remove trailing slashes from $newName as needed. +C<$name> must be in local file system format. +The optional second argument sets the name of the archive +member (which defaults to C<$name>). If given, it must be in +Zip (Unix) format. + +=item addString( $stringOrStringRef, $name ) + + + +Append a member created from the given string or string +reference. The name is given by the second argument. +Returns the new member. The last modification time will be +set to now, and the file attributes will be set to permissive +defaults. + + my $member = $zip->addString( 'This is a test', 'test.txt' ); + +=item contents( $memberOrMemberName [, $newContents ] ) + + + +Returns the uncompressed data for a particular member, or +undef. + + print "xyz.txt contains " . $zip->contents( 'xyz.txt' ); + +Also can change the contents of a member: + + $zip->contents( 'xyz.txt', 'This is the new contents' ); + +If called expecting an array as the return value, it will include +the status as the second value in the array. + + ($content, $status) = $zip->contents( 'xyz.txt'); + +=back + +=head2 Zip Archive I/O operations + + +A Zip archive can be written to a file or file handle, or read from +one. + +=over 4 + +=item writeToFileNamed( $fileName ) + + + +Write a zip archive to named file. Returns C on +success. + + my $status = $zip->writeToFileNamed( 'xx.zip' ); + die "error somewhere" if $status != AZ_OK; + +Note that if you use the same name as an existing zip file +that you read in, you will clobber ZipFileMembers. So +instead, write to a different file name, then delete the +original. +If you use the C or C methods, you can +re-write the original zip in this way. +C<$fileName> should be a valid file name on your system. + +=item writeToFileHandle( $fileHandle [, $seekable] ) + +Write a zip archive to a file handle. Return AZ_OK on +success. The optional second arg tells whether or not to try +to seek backwards to re-write headers. If not provided, it is +set if the Perl C<-f> test returns true. This could fail on +some operating systems, though. + + my $fh = IO::File->new( 'someFile.zip', 'w' ); + unless ( $zip->writeToFileHandle( $fh ) != AZ_OK ) { + # error handling + } + +If you pass a file handle that is not seekable (like if +you're writing to a pipe or a socket), pass a false second +argument: + + my $fh = IO::File->new( '| cat > somefile.zip', 'w' ); + $zip->writeToFileHandle( $fh, 0 ); # fh is not seekable + +If this method fails during the write of a member, that +member and all following it will return false from +C. See writeCentralDirectory() for a way to +deal with this. +If you want, you can write data to the file handle before +passing it to writeToFileHandle(); this could be used (for +instance) for making self-extracting archives. However, this +only works reliably when writing to a real file (as opposed +to STDOUT or some other possible non-file). + +See examples/selfex.pl for how to write a self-extracting +archive. + +=item writeCentralDirectory( $fileHandle [, $offset ] ) + +Writes the central directory structure to the given file +handle. + +Returns AZ_OK on success. If given an $offset, will +seek to that point before writing. This can be used for +recovery in cases where writeToFileHandle or writeToFileNamed +returns an IO error because of running out of space on the +destination file. + +You can truncate the zip by seeking backwards and then writing the +directory: + + my $fh = IO::File->new( 'someFile.zip', 'w' ); + my $retval = $zip->writeToFileHandle( $fh ); + if ( $retval == AZ_IO_ERROR ) { + my @unwritten = grep { not $_->wasWritten() } $zip->members(); + if (@unwritten) { + $zip->removeMember( $member ) foreach my $member ( @unwritten ); + $zip->writeCentralDirectory( $fh, + $unwritten[0]->writeLocalHeaderRelativeOffset()); + } + } + +=item overwriteAs( $newName ) + +Write the zip to the specified file, as safely as possible. +This is done by first writing to a temp file, then renaming +the original if it exists, then renaming the temp file, then +deleting the renamed original if it exists. Returns AZ_OK if +successful. + +=item overwrite() + +Write back to the original zip file. See overwriteAs() above. +If the zip was not ever read from a file, this generates an +error. + +=item read( $fileName ) + +Read zipfile headers from a zip file, appending new members. +Returns C or error code. + + my $zipFile = Archive::Zip->new(); + my $status = $zipFile->read( '/some/FileName.zip' ); + +=item readFromFileHandle( $fileHandle, $filename ) + +Read zipfile headers from an already-opened file handle, +appending new members. Does not close the file handle. +Returns C or error code. Note that this requires a +seekable file handle; reading from a stream is not yet +supported. + + my $fh = IO::File->new( '/some/FileName.zip', 'r' ); + my $zip1 = Archive::Zip->new(); + my $status = $zip1->readFromFileHandle( $fh ); + my $zip2 = Archive::Zip->new(); + $status = $zip2->readFromFileHandle( $fh ); + +=back + +=head2 Zip Archive Tree operations + +These used to be in Archive::Zip::Tree but got moved into +Archive::Zip. They enable operation on an entire tree of members or +files. +A usage example: + + use Archive::Zip; + my $zip = Archive::Zip->new(); + + # add all readable files and directories below . as xyz/* + $zip->addTree( '.', 'xyz' ); + + # add all readable plain files below /abc as def/* + $zip->addTree( '/abc', 'def', sub { -f && -r } ); + + # add all .c files below /tmp as stuff/* + $zip->addTreeMatching( '/tmp', 'stuff', '\.c$' ); + + # add all .o files below /tmp as stuff/* if they aren't writable + $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { ! -w } ); + + # add all .so files below /tmp that are smaller than 200 bytes as stuff/* + $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { -s < 200 } ); + + # and write them into a file + $zip->writeToFileNamed('xxx.zip'); + + # now extract the same files into /tmpx + $zip->extractTree( 'stuff', '/tmpx' ); + +=over 4 + +=item $zip->addTree( $root, $dest [,$pred] ) -- Add tree of files to a zip + +C<$root> is the root of the tree of files and directories to be +added. It is a valid directory name on your system. C<$dest> is +the name for the root in the zip file (undef or blank means +to use relative pathnames). It is a valid ZIP directory name +(that is, it uses forward slashes (/) for separating +directory components). C<$pred> is an optional subroutine +reference to select files: it is passed the name of the +prospective file or directory using C<$_>, and if it returns +true, the file or directory will be included. The default is +to add all readable files and directories. For instance, +using + + my $pred = sub { /\.txt/ }; + $zip->addTree( '.', '', $pred ); + +will add all the .txt files in and below the current +directory, using relative names, and making the names +identical in the zipfile: + + original name zip member name + ./xyz xyz + ./a/ a/ + ./a/b a/b + +To translate absolute to relative pathnames, just pass them +in: $zip->addTree( '/c/d', 'a' ); + + original name zip member name + /c/d/xyz a/xyz + /c/d/a/ a/a/ + /c/d/a/b a/a/b + +Returns AZ_OK on success. Note that this will not follow +symbolic links to directories. Note also that this does not +check for the validity of filenames. + +Note that you generally I want to make zip archive member names +absolute. + +=item $zip->addTreeMatching( $root, $dest, $pattern [,$pred] ) + +$root is the root of the tree of files and directories to be +added $dest is the name for the root in the zip file (undef +means to use relative pathnames) $pattern is a (non-anchored) +regular expression for filenames to match $pred is an +optional subroutine reference to select files: it is passed +the name of the prospective file or directory in C<$_>, and +if it returns true, the file or directory will be included. +The default is to add all readable files and directories. To +add all files in and below the current dirctory whose names +end in C<.pl>, and make them extract into a subdirectory +named C, do this: + + $zip->addTreeMatching( '.', 'xyz', '\.pl$' ) + +To add all I files in and below the dirctory named +C whose names end in C<.pl>, and make them extract into +a subdirectory named C, do this: + + $zip->addTreeMatching( '/abc', 'xyz', '\.pl$', sub { -w } ) + +Returns AZ_OK on success. Note that this will not follow +symbolic links to directories. + +=item $zip->updateTree( $root, [ $dest, [ $pred [, $mirror]]] ); + + + +Update a zip file from a directory tree. + +C takes the same arguments as C, but first +checks to see whether the file or directory already exists in the zip +file, and whether it has been changed. + +If the fourth argument C<$mirror> is true, then delete all my members +if corresponding files weren't found. + + +Returns an error code or AZ_OK if all is well. + +=item $zip->extractTree() + + + +=item $zip->extractTree( $root ) + + + +=item $zip->extractTree( $root, $dest ) + + + +=item $zip->extractTree( $root, $dest, $volume ) + + + +If you don't give any arguments at all, will extract all the +files in the zip with their original names. + + +If you supply one argument for C<$root>, C will extract +all the members whose names start with C<$root> into the current +directory, stripping off C<$root> first. +C<$root> is in Zip (Unix) format. +For instance, + + $zip->extractTree( 'a' ); + +when applied to a zip containing the files: +a/x a/b/c ax/d/e d/e will extract: + + +a/x as ./x + + +a/b/c as ./b/c + + +If you give two arguments, C extracts all the members +whose names start with C<$root>. It will translate C<$root> into +C<$dest> to construct the destination file name. +C<$root> and C<$dest> are in Zip (Unix) format. +For instance, + + $zip->extractTree( 'a', 'd/e' ); + +when applied to a zip containing the files: +a/x a/b/c ax/d/e d/e will extract: + + +a/x to d/e/x + + +a/b/c to d/e/b/c and ignore ax/d/e and d/e + + +If you give three arguments, C extracts all the members +whose names start with C<$root>. It will translate C<$root> into +C<$dest> to construct the destination file name, and then it will +convert to local file system format, using C<$volume> as the name of +the destination volume. + + +C<$root> and C<$dest> are in Zip (Unix) format. + + +C<$volume> is in local file system format. + + +For instance, under Windows, + + $zip->extractTree( 'a', 'd/e', 'f:' ); + +when applied to a zip containing the files: +a/x a/b/c ax/d/e d/e will extract: + + +a/x to f:d/e/x + + +a/b/c to f:d/e/b/c and ignore ax/d/e and d/e + + +If you want absolute paths (the prior example used paths relative to +the current directory on the destination volume, you can specify these +in C<$dest>: + + $zip->extractTree( 'a', '/d/e', 'f:' ); + +when applied to a zip containing the files: +a/x a/b/c ax/d/e d/e will extract: + + +a/x to f:\d\e\x + + +a/b/c to f:\d\e\b\c and ignore ax/d/e and d/e + +Returns an error code or AZ_OK if everything worked OK. + +=back + +=head1 MEMBER OPERATIONS + + +=head2 Member Class Methods + + +Several constructors allow you to construct members without adding +them to a zip archive. These work the same as the addFile(), +addDirectory(), and addString() zip instance methods described above, +but they don't add the new members to a zip. + +=over 4 + +=item Archive::Zip::Member->newFromString( $stringOrStringRef [, $fileName] ) + + + +Construct a new member from the given string. Returns undef +on error. + + my $member = Archive::Zip::Member->newFromString( 'This is a test', + 'xyz.txt' ); + +=item newFromFile( $fileName ) + + + +Construct a new member from the given file. Returns undef on +error. + + my $member = Archive::Zip::Member->newFromFile( 'xyz.txt' ); + +=item newDirectoryNamed( $directoryName [, $zipname ] ) + + + +Construct a new member from the given directory. +C<$directoryName> must be a valid name on your file system; it doesn't +have to exist. + + +If given, C<$zipname> will be the name of the zip member; it must be a +valid Zip (Unix) name. If not given, it will be converted from +C<$directoryName>. + + +Returns undef on error. + + my $member = Archive::Zip::Member->newDirectoryNamed( 'CVS/' ); + +=back + +=head2 Member Simple accessors + + +These methods get (and/or set) member attribute values. + +=over 4 + +=item versionMadeBy() + + + +Gets the field from the member header. + +=item fileAttributeFormat( [$format] ) + + + +Gets or sets the field from the member header. These are +C values. + +=item versionNeededToExtract() + + + +Gets the field from the member header. + +=item bitFlag() + + + +Gets the general purpose bit field from the member header. +This is where the C bits live. + +=item compressionMethod() + + + +Returns the member compression method. This is the method +that is currently being used to compress the member data. +This will be COMPRESSION_STORED for added string or file +members, or any of the C values for members +from a zip file. However, this module can only handle members +whose data is in COMPRESSION_STORED or COMPRESSION_DEFLATED +format. + +=item desiredCompressionMethod( [$method] ) + + + +Get or set the member's C. This is +the compression method that will be used when the member is +written. Returns prior desiredCompressionMethod. Only +COMPRESSION_DEFLATED or COMPRESSION_STORED are valid +arguments. Changing to COMPRESSION_STORED will change the +member desiredCompressionLevel to 0; changing to +COMPRESSION_DEFLATED will change the member +desiredCompressionLevel to COMPRESSION_LEVEL_DEFAULT. + +=item desiredCompressionLevel( [$method] ) + + + +Get or set the member's desiredCompressionLevel This is the +method that will be used to write. Returns prior +desiredCompressionLevel. Valid arguments are 0 through 9, +COMPRESSION_LEVEL_NONE, COMPRESSION_LEVEL_DEFAULT, +COMPRESSION_LEVEL_BEST_COMPRESSION, and +COMPRESSION_LEVEL_FASTEST. 0 or COMPRESSION_LEVEL_NONE will +change the desiredCompressionMethod to COMPRESSION_STORED. +All other arguments will change the desiredCompressionMethod +to COMPRESSION_DEFLATED. + +=item externalFileName() + + + +Return the member's external file name, if any, or undef. + +=item fileName() + + + +Get or set the member's internal filename. Returns the +(possibly new) filename. Names will have backslashes +converted to forward slashes, and will have multiple +consecutive slashes converted to single ones. + +=item lastModFileDateTime() + + + +Return the member's last modification date/time stamp in +MS-DOS format. + +=item lastModTime() + + + +Return the member's last modification date/time stamp, +converted to unix localtime format. + + print "Mod Time: " . scalar( localtime( $member->lastModTime() ) ); + +=item setLastModFileDateTimeFromUnix() + +Set the member's lastModFileDateTime from the given unix +time. + + $member->setLastModFileDateTimeFromUnix( time() ); + +=item internalFileAttributes() + +Return the internal file attributes field from the zip +header. This is only set for members read from a zip file. + +=item externalFileAttributes() + +Return member attributes as read from the ZIP file. Note that +these are NOT UNIX! + +=item unixFileAttributes( [$newAttributes] ) + +Get or set the member's file attributes using UNIX file +attributes. Returns old attributes. + + my $oldAttribs = $member->unixFileAttributes( 0666 ); + +Note that the return value has more than just the file +permissions, so you will have to mask off the lowest bits for +comparisions. + +=item localExtraField( [$newField] ) + +Gets or sets the extra field that was read from the local +header. This is not set for a member from a zip file until +after the member has been written out. The extra field must +be in the proper format. + +=item cdExtraField( [$newField] ) + +Gets or sets the extra field that was read from the central +directory header. The extra field must be in the proper +format. + +=item extraFields() + +Return both local and CD extra fields, concatenated. + +=item fileComment( [$newComment] ) + +Get or set the member's file comment. + +=item hasDataDescriptor() + +Get or set the data descriptor flag. If this is set, the +local header will not necessarily have the correct data +sizes. Instead, a small structure will be stored at the end +of the member data with these values. This should be +transparent in normal operation. + +=item crc32() + +Return the CRC-32 value for this member. This will not be set +for members that were constructed from strings or external +files until after the member has been written. + +=item crc32String() + +Return the CRC-32 value for this member as an 8 character +printable hex string. This will not be set for members that +were constructed from strings or external files until after +the member has been written. + +=item compressedSize() + +Return the compressed size for this member. This will not be +set for members that were constructed from strings or +external files until after the member has been written. + +=item uncompressedSize() + +Return the uncompressed size for this member. + +=item isEncrypted() + +Return true if this member is encrypted. The Archive::Zip +module does not currently create or extract encrypted +members. + +=item isTextFile( [$flag] ) + +Returns true if I am a text file. Also can set the status if +given an argument (then returns old state). Note that this +module does not currently do anything with this flag upon +extraction or storage. That is, bytes are stored in native +format whether or not they came from a text file. + +=item isBinaryFile() + +Returns true if I am a binary file. Also can set the status +if given an argument (then returns old state). Note that this +module does not currently do anything with this flag upon +extraction or storage. That is, bytes are stored in native +format whether or not they came from a text file. + +=item extractToFileNamed( $fileName ) + +Extract me to a file with the given name. The file will be +created with default modes. Directories will be created as +needed. +The C<$fileName> argument should be a valid file name on your +file system. +Returns AZ_OK on success. + +=item isDirectory() + +Returns true if I am a directory. + +=item writeLocalHeaderRelativeOffset() + +Returns the file offset in bytes the last time I was written. + +=item wasWritten() + +Returns true if I was successfully written. Reset at the +beginning of a write attempt. + +=back + +=head2 Low-level member data reading + +It is possible to use lower-level routines to access member data +streams, rather than the extract* methods and contents(). For +instance, here is how to print the uncompressed contents of a member +in chunks using these methods: + + my ( $member, $status, $bufferRef ); + $member = $zip->memberNamed( 'xyz.txt' ); + $member->desiredCompressionMethod( COMPRESSION_STORED ); + $status = $member->rewindData(); + die "error $status" unless $status == AZ_OK; + while ( ! $member->readIsDone() ) + { + ( $bufferRef, $status ) = $member->readChunk(); + die "error $status" + if $status != AZ_OK && $status != AZ_STREAM_END; + # do something with $bufferRef: + print $$bufferRef; + } + $member->endRead(); + +=over 4 + +=item readChunk( [$chunkSize] ) + +This reads the next chunk of given size from the member's +data stream and compresses or uncompresses it as necessary, +returning a reference to the bytes read and a status. If size +argument is not given, defaults to global set by +Archive::Zip::setChunkSize. Status is AZ_OK on success until +the last chunk, where it returns AZ_STREAM_END. Returns C<( +\$bytes, $status)>. + + my ( $outRef, $status ) = $self->readChunk(); + print $$outRef if $status != AZ_OK && $status != AZ_STREAM_END; + +=item rewindData() + +Rewind data and set up for reading data streams or writing +zip files. Can take options for C or +C, but this isn't likely to be necessary. +Subclass overrides should call this method. Returns C +on success. + +=item endRead() + +Reset the read variables and free the inflater or deflater. +Must be called to close files, etc. Returns AZ_OK on success. + +=item readIsDone() + +Return true if the read has run out of data or errored out. + +=item contents() + +Return the entire uncompressed member data or undef in scalar +context. When called in array context, returns C<( $string, +$status )>; status will be AZ_OK on success: + + my $string = $member->contents(); + # or + my ( $string, $status ) = $member->contents(); + die "error $status" unless $status == AZ_OK; + +Can also be used to set the contents of a member (this may +change the class of the member): + + $member->contents( "this is my new contents" ); + +=item extractToFileHandle( $fh ) + +Extract (and uncompress, if necessary) the member's contents +to the given file handle. Return AZ_OK on success. + +=back + +=head1 Archive::Zip::FileMember methods + +The Archive::Zip::FileMember class extends Archive::Zip::Member. It is the +base class for both ZipFileMember and NewFileMember classes. This class adds +an C and an C member to keep track of the external +file. + +=over 4 + +=item externalFileName() + +Return the member's external filename. + +=item fh() + +Return the member's read file handle. Automatically opens file if +necessary. + +=back + +=head1 Archive::Zip::ZipFileMember methods + +The Archive::Zip::ZipFileMember class represents members that have been read +from external zip files. + +=over 4 + +=item diskNumberStart() + +Returns the disk number that the member's local header resides in. +Should be 0. + +=item localHeaderRelativeOffset() + +Returns the offset into the zip file where the member's local header +is. + +=item dataOffset() + +Returns the offset from the beginning of the zip file to the member's +data. + +=back + +=head1 REQUIRED MODULES + +L requires several other modules: + +L + +L + +L + +L + +L + +L + +L + +L + +L + +L + +L + +L + +=head1 BUGS AND CAVEATS + +=head2 When not to use Archive::Zip + +If you are just going to be extracting zips (and/or other archives) you +are recommended to look at using L instead, as it is much +easier to use and factors out archive-specific functionality. + +=head2 Try to avoid IO::Scalar + +One of the most common ways to use Archive::Zip is to generate Zip files +in-memory. Most people have use L for this purpose. + +Unfortunately, as of 1.11 this module no longer works with L +as it incorrectly implements seeking. + +Anybody using L should consider porting to L, +which is smaller, lighter, and is implemented to be perfectly compatible +with regular seekable filehandles. + +Support for L most likely will B be restored in the +future, as L itself cannot change the way it is implemented +due to back-compatibility issues. + +=head1 TO DO + +* auto-choosing storing vs compression + +* extra field hooks (see notes.txt) + +* check for dups on addition/renaming? + +* Text file extraction (line end translation) + +* Reading zip files from non-seekable inputs + (Perhaps by proxying through IO::String?) + +* separate unused constants into separate module + +* cookbook style docs + +* Handle tainted paths correctly + +* Work on better compatability with other IO:: modules + +=head1 SUPPORT + +Bugs should be reported via the CPAN bug tracker + +L + +For other issues contact the maintainer + +=head1 AUTHOR + +Adam Kennedy Eadamk@cpan.orgE + +Previously maintained by Steve Peters Esteve@fisharerojo.orgE. + +File attributes code by Maurice Aubrey Emaurice@lovelyfilth.comE. + +Originally by Ned Konz Enedkonz@cpan.orgE. + +=head1 COPYRIGHT + +Copyright (c) 2000-2004 Ned Konz. All rights reserved. + +Some parts copyright (c) 2005 Steve Peters. All rights reserved. + +Some parts copyright (c) 2006 Adam Kennedy. All rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L, L, L + +There is a Japanese translation of this +document at L that +was done by DEQ Edeq@oct.zaq.ne.jpE . Thanks! + +=cut diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Archive.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Archive.pm new file mode 100644 index 0000000..8fd5533 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Archive.pm @@ -0,0 +1,786 @@ +package Archive::Zip::Archive; + +# Represents a generic ZIP archive + +use strict; +use File::Path; +use File::Find (); +use File::Spec (); +use File::Copy (); +use File::Basename; +use Cwd; + +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw( Archive::Zip ); +} + +use Archive::Zip qw( + :CONSTANTS + :ERROR_CODES + :PKZIP_CONSTANTS + :UTILITY_METHODS +); + +# Note that this returns undef on read errors, else new zip object. + +sub new { + my $class = shift; + my $self = bless( + { + 'diskNumber' => 0, + 'diskNumberWithStartOfCentralDirectory' => 0, + 'numberOfCentralDirectoriesOnThisDisk' => 0, # shld be # of members + 'numberOfCentralDirectories' => 0, # shld be # of members + 'centralDirectorySize' => 0, # must re-compute on write + 'centralDirectoryOffsetWRTStartingDiskNumber' => + 0, # must re-compute + 'writeEOCDOffset' => 0, + 'writeCentralDirectoryOffset' => 0, + 'zipfileComment' => '', + 'eocdOffset' => 0, + 'fileName' => '' + }, + $class + ); + $self->{'members'} = []; + if (@_) { + my $status = $self->read(@_); + return $status == AZ_OK ? $self : undef; + } + return $self; +} + +sub members { + @{ shift->{'members'} }; +} + +sub numberOfMembers { + scalar( shift->members() ); +} + +sub memberNames { + my $self = shift; + return map { $_->fileName() } $self->members(); +} + +# return ref to member with given name or undef +sub memberNamed { + my ( $self, $fileName ) = @_; + foreach my $member ( $self->members() ) { + return $member if $member->fileName() eq $fileName; + } + return undef; +} + +sub membersMatching { + my ( $self, $pattern ) = @_; + return grep { $_->fileName() =~ /$pattern/ } $self->members(); +} + +sub diskNumber { + shift->{'diskNumber'}; +} + +sub diskNumberWithStartOfCentralDirectory { + shift->{'diskNumberWithStartOfCentralDirectory'}; +} + +sub numberOfCentralDirectoriesOnThisDisk { + shift->{'numberOfCentralDirectoriesOnThisDisk'}; +} + +sub numberOfCentralDirectories { + shift->{'numberOfCentralDirectories'}; +} + +sub centralDirectorySize { + shift->{'centralDirectorySize'}; +} + +sub centralDirectoryOffsetWRTStartingDiskNumber { + shift->{'centralDirectoryOffsetWRTStartingDiskNumber'}; +} + +sub zipfileComment { + my $self = shift; + my $comment = $self->{'zipfileComment'}; + if (@_) { + $self->{'zipfileComment'} = pack( 'C0a*', shift() ); # avoid unicode + } + return $comment; +} + +sub eocdOffset { + shift->{'eocdOffset'}; +} + +# Return the name of the file last read. +sub fileName { + shift->{'fileName'}; +} + +sub removeMember { + my ( $self, $member ) = @_; + $member = $self->memberNamed($member) unless ref($member); + return undef unless $member; + my @newMembers = grep { $_ != $member } $self->members(); + $self->{'members'} = \@newMembers; + return $member; +} + +sub replaceMember { + my ( $self, $oldMember, $newMember ) = @_; + $oldMember = $self->memberNamed($oldMember) unless ref($oldMember); + return undef unless $oldMember; + return undef unless $newMember; + my @newMembers = + map { ( $_ == $oldMember ) ? $newMember : $_ } $self->members(); + $self->{'members'} = \@newMembers; + return $oldMember; +} + +sub extractMember { + my $self = shift; + my $member = shift; + $member = $self->memberNamed($member) unless ref($member); + return _error('member not found') unless $member; + my $originalSize = $member->compressedSize(); + my $name = shift; # local FS name if given + my ( $volumeName, $dirName, $fileName ); + if ( defined($name) ) { + ( $volumeName, $dirName, $fileName ) = File::Spec->splitpath($name); + $dirName = File::Spec->catpath( $volumeName, $dirName, '' ); + } + else { + $name = $member->fileName(); + ( $dirName = $name ) =~ s{[^/]*$}{}; + $dirName = Archive::Zip::_asLocalName($dirName); + $name = Archive::Zip::_asLocalName($name); + } + if ( $dirName && !-d $dirName ) { + mkpath($dirName); + return _ioError("can't create dir $dirName") if ( !-d $dirName ); + } + my $rc = $member->extractToFileNamed( $name, @_ ); + + # TODO refactor this fix into extractToFileNamed() + $member->{'compressedSize'} = $originalSize; + return $rc; +} + +sub extractMemberWithoutPaths { + my $self = shift; + my $member = shift; + $member = $self->memberNamed($member) unless ref($member); + return _error('member not found') unless $member; + my $originalSize = $member->compressedSize(); + return AZ_OK if $member->isDirectory(); + my $name = shift; + unless ($name) { + $name = $member->fileName(); + $name =~ s{.*/}{}; # strip off directories, if any + $name = Archive::Zip::_asLocalName($name); + } + my $rc = $member->extractToFileNamed( $name, @_ ); + $member->{'compressedSize'} = $originalSize; + return $rc; +} + +sub addMember { + my ( $self, $newMember ) = @_; + push( @{ $self->{'members'} }, $newMember ) if $newMember; + return $newMember; +} + +sub addFile { + my $self = shift; + my $fileName = shift; + my $newName = shift; + my $newMember = $self->ZIPMEMBERCLASS->newFromFile( $fileName, $newName ); + $self->addMember($newMember) if defined($newMember); + return $newMember; +} + +sub addString { + my $self = shift; + my $newMember = $self->ZIPMEMBERCLASS->newFromString(@_); + return $self->addMember($newMember); +} + +sub addDirectory { + my ( $self, $name, $newName ) = @_; + my $newMember = $self->ZIPMEMBERCLASS->newDirectoryNamed( $name, $newName ); + $self->addMember($newMember); + return $newMember; +} + +# add either a file or a directory. + +sub addFileOrDirectory { + my ( $self, $name, $newName ) = @_; + if ( -f $name ) { + ( $newName =~ s{/$}{} ) if $newName; + return $self->addFile( $name, $newName ); + } + elsif ( -d $name ) { + ( $newName =~ s{[^/]$}{&/} ) if $newName; + return $self->addDirectory( $name, $newName ); + } + else { + return _error("$name is neither a file nor a directory"); + } +} + +sub contents { + my ( $self, $member, $newContents ) = @_; + return _error('No member name given') unless $member; + $member = $self->memberNamed($member) unless ref($member); + return undef unless $member; + return $member->contents($newContents); +} + +sub writeToFileNamed { + my $self = shift; + my $fileName = shift; # local FS format + foreach my $member ( $self->members() ) { + if ( $member->_usesFileNamed($fileName) ) { + return _error( "$fileName is needed by member " + . $member->fileName() + . "; consider using overwrite() or overwriteAs() instead." ); + } + } + my ( $status, $fh ) = _newFileHandle( $fileName, 'w' ); + return _ioError("Can't open $fileName for write") unless $status; + my $retval = $self->writeToFileHandle( $fh, 1 ); + $fh->close(); + $fh = undef; + + return $retval; +} + +# It is possible to write data to the FH before calling this, +# perhaps to make a self-extracting archive. +sub writeToFileHandle { + my $self = shift; + my $fh = shift; + return _error('No filehandle given') unless $fh; + return _ioError('filehandle not open') unless $fh->opened(); + + my $fhIsSeekable = @_ ? shift: _isSeekable($fh); + _binmode($fh); + + # Find out where the current position is. + my $offset = $fhIsSeekable ? $fh->tell() : 0; + $offset = 0 if $offset < 0; + + foreach my $member ( $self->members() ) { + my $retval = $member->_writeToFileHandle( $fh, $fhIsSeekable, $offset ); + $member->endRead(); + return $retval if $retval != AZ_OK; + $offset += $member->_localHeaderSize() + $member->_writeOffset(); + $offset += + $member->hasDataDescriptor() + ? DATA_DESCRIPTOR_LENGTH + SIGNATURE_LENGTH + : 0; + + # changed this so it reflects the last successful position + $self->{'writeCentralDirectoryOffset'} = $offset; + } + return $self->writeCentralDirectory($fh); +} + +# Write zip back to the original file, +# as safely as possible. +# Returns AZ_OK if successful. +sub overwrite { + my $self = shift; + return $self->overwriteAs( $self->{'fileName'} ); +} + +# Write zip to the specified file, +# as safely as possible. +# Returns AZ_OK if successful. +sub overwriteAs { + my $self = shift; + my $zipName = shift; + return _error("no filename in overwriteAs()") unless defined($zipName); + + my ( $fh, $tempName ) = Archive::Zip::tempFile(); + return _error( "Can't open temp file", $! ) unless $fh; + + ( my $backupName = $zipName ) =~ s{(\.[^.]*)?$}{.zbk}; + + my $status = $self->writeToFileHandle($fh); + $fh->close(); + $fh = undef; + + if ( $status != AZ_OK ) { + unlink($tempName); + _printError("Can't write to $tempName"); + return $status; + } + + my $err; + + # rename the zip + if ( -f $zipName && !rename( $zipName, $backupName ) ) { + $err = $!; + unlink($tempName); + return _error( "Can't rename $zipName as $backupName", $err ); + } + + # move the temp to the original name (possibly copying) + unless ( File::Copy::move( $tempName, $zipName ) ) { + $err = $!; + rename( $backupName, $zipName ); + unlink($tempName); + return _error( "Can't move $tempName to $zipName", $err ); + } + + # unlink the backup + if ( -f $backupName && !unlink($backupName) ) { + $err = $!; + return _error( "Can't unlink $backupName", $err ); + } + + return AZ_OK; +} + +# Used only during writing +sub _writeCentralDirectoryOffset { + shift->{'writeCentralDirectoryOffset'}; +} + +sub _writeEOCDOffset { + shift->{'writeEOCDOffset'}; +} + +# Expects to have _writeEOCDOffset() set +sub _writeEndOfCentralDirectory { + my ( $self, $fh ) = @_; + + $fh->print(END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING) + or return _ioError('writing EOCD Signature'); + my $zipfileCommentLength = length( $self->zipfileComment() ); + + my $header = pack( + END_OF_CENTRAL_DIRECTORY_FORMAT, + 0, # {'diskNumber'}, + 0, # {'diskNumberWithStartOfCentralDirectory'}, + $self->numberOfMembers(), # {'numberOfCentralDirectoriesOnThisDisk'}, + $self->numberOfMembers(), # {'numberOfCentralDirectories'}, + $self->_writeEOCDOffset() - $self->_writeCentralDirectoryOffset(), + $self->_writeCentralDirectoryOffset(), + $zipfileCommentLength + ); + $fh->print($header) + or return _ioError('writing EOCD header'); + if ($zipfileCommentLength) { + $fh->print( $self->zipfileComment() ) + or return _ioError('writing zipfile comment'); + } + return AZ_OK; +} + +# $offset can be specified to truncate a zip file. +sub writeCentralDirectory { + my ( $self, $fh, $offset ) = @_; + + if ( defined($offset) ) { + $self->{'writeCentralDirectoryOffset'} = $offset; + $fh->seek( $offset, IO::Seekable::SEEK_SET ) + or return _ioError('seeking to write central directory'); + } + else { + $offset = $self->_writeCentralDirectoryOffset(); + } + + foreach my $member ( $self->members() ) { + my $status = $member->_writeCentralDirectoryFileHeader($fh); + return $status if $status != AZ_OK; + $offset += $member->_centralDirectoryHeaderSize(); + $self->{'writeEOCDOffset'} = $offset; + } + return $self->_writeEndOfCentralDirectory($fh); +} + +sub read { + my $self = shift; + my $fileName = shift; + return _error('No filename given') unless $fileName; + my ( $status, $fh ) = _newFileHandle( $fileName, 'r' ); + return _ioError("opening $fileName for read") unless $status; + + $status = $self->readFromFileHandle( $fh, $fileName ); + return $status if $status != AZ_OK; + + $fh->close(); + $self->{'fileName'} = $fileName; + return AZ_OK; +} + +sub readFromFileHandle { + my $self = shift; + my $fh = shift; + my $fileName = shift; + $fileName = $fh unless defined($fileName); + return _error('No filehandle given') unless $fh; + return _ioError('filehandle not open') unless $fh->opened(); + + _binmode($fh); + $self->{'fileName'} = "$fh"; + + # TODO: how to support non-seekable zips? + return _error('file not seekable') + unless _isSeekable($fh); + + $fh->seek( 0, 0 ); # rewind the file + + my $status = $self->_findEndOfCentralDirectory($fh); + return $status if $status != AZ_OK; + + my $eocdPosition = $fh->tell(); + + $status = $self->_readEndOfCentralDirectory($fh); + return $status if $status != AZ_OK; + + $fh->seek( $eocdPosition - $self->centralDirectorySize(), + IO::Seekable::SEEK_SET ) + or return _ioError("Can't seek $fileName"); + + # Try to detect garbage at beginning of archives + # This should be 0 + $self->{'eocdOffset'} = $eocdPosition - $self->centralDirectorySize() # here + - $self->centralDirectoryOffsetWRTStartingDiskNumber(); + + for ( ; ; ) { + my $newMember = + $self->ZIPMEMBERCLASS->_newFromZipFile( $fh, $fileName, + $self->eocdOffset() ); + my $signature; + ( $status, $signature ) = _readSignature( $fh, $fileName ); + return $status if $status != AZ_OK; + last if $signature == END_OF_CENTRAL_DIRECTORY_SIGNATURE; + $status = $newMember->_readCentralDirectoryFileHeader(); + return $status if $status != AZ_OK; + $status = $newMember->endRead(); + return $status if $status != AZ_OK; + $newMember->_becomeDirectoryIfNecessary(); + push( @{ $self->{'members'} }, $newMember ); + } + + return AZ_OK; +} + +# Read EOCD, starting from position before signature. +# Return AZ_OK on success. +sub _readEndOfCentralDirectory { + my $self = shift; + my $fh = shift; + + # Skip past signature + $fh->seek( SIGNATURE_LENGTH, IO::Seekable::SEEK_CUR ) + or return _ioError("Can't seek past EOCD signature"); + + my $header = ''; + my $bytesRead = $fh->read( $header, END_OF_CENTRAL_DIRECTORY_LENGTH ); + if ( $bytesRead != END_OF_CENTRAL_DIRECTORY_LENGTH ) { + return _ioError("reading end of central directory"); + } + + my $zipfileCommentLength; + ( + $self->{'diskNumber'}, + $self->{'diskNumberWithStartOfCentralDirectory'}, + $self->{'numberOfCentralDirectoriesOnThisDisk'}, + $self->{'numberOfCentralDirectories'}, + $self->{'centralDirectorySize'}, + $self->{'centralDirectoryOffsetWRTStartingDiskNumber'}, + $zipfileCommentLength + ) = unpack( END_OF_CENTRAL_DIRECTORY_FORMAT, $header ); + + if ($zipfileCommentLength) { + my $zipfileComment = ''; + $bytesRead = $fh->read( $zipfileComment, $zipfileCommentLength ); + if ( $bytesRead != $zipfileCommentLength ) { + return _ioError("reading zipfile comment"); + } + $self->{'zipfileComment'} = $zipfileComment; + } + + return AZ_OK; +} + +# Seek in my file to the end, then read backwards until we find the +# signature of the central directory record. Leave the file positioned right +# before the signature. Returns AZ_OK if success. +sub _findEndOfCentralDirectory { + my $self = shift; + my $fh = shift; + my $data = ''; + $fh->seek( 0, IO::Seekable::SEEK_END ) + or return _ioError("seeking to end"); + + my $fileLength = $fh->tell(); + if ( $fileLength < END_OF_CENTRAL_DIRECTORY_LENGTH + 4 ) { + return _formatError("file is too short"); + } + + my $seekOffset = 0; + my $pos = -1; + for ( ; ; ) { + $seekOffset += 512; + $seekOffset = $fileLength if ( $seekOffset > $fileLength ); + $fh->seek( -$seekOffset, IO::Seekable::SEEK_END ) + or return _ioError("seek failed"); + my $bytesRead = $fh->read( $data, $seekOffset ); + if ( $bytesRead != $seekOffset ) { + return _ioError("read failed"); + } + $pos = rindex( $data, END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING ); + last + if ( $pos >= 0 + or $seekOffset == $fileLength + or $seekOffset >= $Archive::Zip::ChunkSize ); + } + + if ( $pos >= 0 ) { + $fh->seek( $pos - $seekOffset, IO::Seekable::SEEK_CUR ) + or return _ioError("seeking to EOCD"); + return AZ_OK; + } + else { + return _formatError("can't find EOCD signature"); + } +} + +# Used to avoid taint problems when chdir'ing. +# Not intended to increase security in any way; just intended to shut up the -T +# complaints. If your Cwd module is giving you unreliable returns from cwd() +# you have bigger problems than this. +sub _untaintDir { + my $dir = shift; + $dir =~ m/\A(.+)\z/s; + return $1; +} + +sub addTree { + my $self = shift; + my $root = shift or return _error("root arg missing in call to addTree()"); + my $dest = shift; + $dest = '' unless defined($dest); + my $pred = shift || sub { -r }; + my @files; + my $startDir = _untaintDir( cwd() ); + + return _error( 'undef returned by _untaintDir on cwd ', cwd() ) + unless $startDir; + + # This avoids chdir'ing in Find, in a way compatible with older + # versions of File::Find. + my $wanted = sub { + local $main::_ = $File::Find::name; + my $dir = _untaintDir($File::Find::dir); + chdir($startDir); + push( @files, $File::Find::name ) if (&$pred); + chdir($dir); + }; + + File::Find::find( $wanted, $root ); + + my $rootZipName = _asZipDirName( $root, 1 ); # with trailing slash + my $pattern = $rootZipName eq './' ? '^' : "^\Q$rootZipName\E"; + + $dest = _asZipDirName( $dest, 1 ); # with trailing slash + + foreach my $fileName (@files) { + my $isDir = -d $fileName; + + # normalize, remove leading ./ + my $archiveName = _asZipDirName( $fileName, $isDir ); + if ( $archiveName eq $rootZipName ) { $archiveName = $dest } + else { $archiveName =~ s{$pattern}{$dest} } + next if $archiveName =~ m{^\.?/?$}; # skip current dir + my $member = $isDir + ? $self->addDirectory( $fileName, $archiveName ) + : $self->addFile( $fileName, $archiveName ); + return _error("add $fileName failed in addTree()") if !$member; + } + return AZ_OK; +} + +sub addTreeMatching { + my $self = shift; + my $root = shift + or return _error("root arg missing in call to addTreeMatching()"); + my $dest = shift; + $dest = '' unless defined($dest); + my $pattern = shift + or return _error("pattern missing in call to addTreeMatching()"); + my $pred = shift; + my $matcher = + $pred ? sub { m{$pattern} && &$pred } : sub { m{$pattern} && -r }; + return $self->addTree( $root, $dest, $matcher ); +} + +# $zip->extractTree( $root, $dest [, $volume] ); +# +# $root and $dest are Unix-style. +# $volume is in local FS format. +# +sub extractTree { + my $self = shift; + my $root = shift; # Zip format + $root = '' unless defined($root); + my $dest = shift; # Zip format + $dest = './' unless defined($dest); + my $volume = shift; # optional + my $pattern = "^\Q$root"; + my @members = $self->membersMatching($pattern); + + foreach my $member (@members) { + my $fileName = $member->fileName(); # in Unix format + $fileName =~ s{$pattern}{$dest}; # in Unix format + # convert to platform format: + $fileName = Archive::Zip::_asLocalName( $fileName, $volume ); + my $status = $member->extractToFileNamed($fileName); + return $status if $status != AZ_OK; + } + return AZ_OK; +} + +# $zip->updateMember( $memberOrName, $fileName ); +# Returns (possibly updated) member, if any; undef on errors. + +sub updateMember { + my $self = shift; + my $oldMember = shift; + my $fileName = shift; + + if ( !defined($fileName) ) { + _error("updateMember(): missing fileName argument"); + return undef; + } + + my @newStat = stat($fileName); + if ( !@newStat ) { + _ioError("Can't stat $fileName"); + return undef; + } + + my $isDir = -d _; + + my $memberName; + + if ( ref($oldMember) ) { + $memberName = $oldMember->fileName(); + } + else { + $oldMember = $self->memberNamed( $memberName = $oldMember ) + || $self->memberNamed( $memberName = + _asZipDirName( $oldMember, $isDir ) ); + } + + unless ( defined($oldMember) + && $oldMember->lastModTime() == $newStat[9] + && $oldMember->isDirectory() == $isDir + && ( $isDir || ( $oldMember->uncompressedSize() == $newStat[7] ) ) ) + { + + # create the new member + my $newMember = $isDir + ? $self->ZIPMEMBERCLASS->newDirectoryNamed( $fileName, $memberName ) + : $self->ZIPMEMBERCLASS->newFromFile( $fileName, $memberName ); + + unless ( defined($newMember) ) { + _error("creation of member $fileName failed in updateMember()"); + return undef; + } + + # replace old member or append new one + if ( defined($oldMember) ) { + $self->replaceMember( $oldMember, $newMember ); + } + else { $self->addMember($newMember); } + + return $newMember; + } + + return $oldMember; +} + +# $zip->updateTree( $root, [ $dest, [ $pred [, $mirror]]] ); +# +# This takes the same arguments as addTree, but first checks to see +# whether the file or directory already exists in the zip file. +# +# If the fourth argument $mirror is true, then delete all my members +# if corresponding files weren't found. + +sub updateTree { + my $self = shift; + my $root = shift + or return _error("root arg missing in call to updateTree()"); + my $dest = shift; + $dest = '' unless defined($dest); + $dest = _asZipDirName( $dest, 1 ); + my $pred = shift || sub { -r }; + my $mirror = shift; + + my $rootZipName = _asZipDirName( $root, 1 ); # with trailing slash + my $pattern = $rootZipName eq './' ? '^' : "^\Q$rootZipName\E"; + + my @files; + my $startDir = _untaintDir( cwd() ); + + return _error( 'undef returned by _untaintDir on cwd ', cwd() ) + unless $startDir; + + # This avoids chdir'ing in Find, in a way compatible with older + # versions of File::Find. + my $wanted = sub { + local $main::_ = $File::Find::name; + my $dir = _untaintDir($File::Find::dir); + chdir($startDir); + push( @files, $File::Find::name ) if (&$pred); + chdir($dir); + }; + + File::Find::find( $wanted, $root ); + + # Now @files has all the files that I could potentially be adding to + # the zip. Only add the ones that are necessary. + # For each file (updated or not), add its member name to @done. + my %done; + foreach my $fileName (@files) { + my @newStat = stat($fileName); + my $isDir = -d _; + + # normalize, remove leading ./ + my $memberName = _asZipDirName( $fileName, $isDir ); + if ( $memberName eq $rootZipName ) { $memberName = $dest } + else { $memberName =~ s{$pattern}{$dest} } + next if $memberName =~ m{^\.?/?$}; # skip current dir + + $done{$memberName} = 1; + my $changedMember = $self->updateMember( $memberName, $fileName ); + return _error("updateTree failed to update $fileName") + unless ref($changedMember); + } + + # @done now has the archive names corresponding to all the found files. + # If we're mirroring, delete all those members that aren't in @done. + if ($mirror) { + foreach my $member ( $self->members() ) { + $self->removeMember($member) + unless $done{ $member->fileName() }; + } + } + + return AZ_OK; +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/BufferedFileHandle.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/BufferedFileHandle.pm new file mode 100644 index 0000000..6b39e61 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/BufferedFileHandle.pm @@ -0,0 +1,131 @@ +package Archive::Zip::BufferedFileHandle; + +# File handle that uses a string internally and can seek +# This is given as a demo for getting a zip file written +# to a string. +# I probably should just use IO::Scalar instead. +# Ned Konz, March 2000 + +use strict; +use IO::File; +use Carp; + +use vars qw{$VERSION}; + +BEGIN { + $VERSION = '1.18'; + $VERSION = eval $VERSION; +} + +sub new { + my $class = shift || __PACKAGE__; + $class = ref($class) || $class; + my $self = bless( + { + content => '', + position => 0, + size => 0 + }, + $class + ); + return $self; +} + +# Utility method to read entire file +sub readFromFile { + my $self = shift; + my $fileName = shift; + my $fh = IO::File->new( $fileName, "r" ); + CORE::binmode($fh); + if ( !$fh ) { + Carp::carp("Can't open $fileName: $!\n"); + return undef; + } + local $/ = undef; + $self->{content} = <$fh>; + $self->{size} = length( $self->{content} ); + return $self; +} + +sub contents { + my $self = shift; + if (@_) { + $self->{content} = shift; + $self->{size} = length( $self->{content} ); + } + return $self->{content}; +} + +sub binmode { 1 } + +sub close { 1 } + +sub opened { 1 } + +sub eof { + my $self = shift; + return $self->{position} >= $self->{size}; +} + +sub seek { + my $self = shift; + my $pos = shift; + my $whence = shift; + + # SEEK_SET + if ( $whence == 0 ) { $self->{position} = $pos; } + + # SEEK_CUR + elsif ( $whence == 1 ) { $self->{position} += $pos; } + + # SEEK_END + elsif ( $whence == 2 ) { $self->{position} = $self->{size} + $pos; } + else { return 0; } + + return 1; +} + +sub tell { return shift->{position}; } + +# Copy my data to given buffer +sub read { + my $self = shift; + my $buf = \( $_[0] ); + shift; + my $len = shift; + my $offset = shift || 0; + + $$buf = '' if not defined($$buf); + my $bytesRead = + ( $self->{position} + $len > $self->{size} ) + ? ( $self->{size} - $self->{position} ) + : $len; + substr( $$buf, $offset, $bytesRead ) = + substr( $self->{content}, $self->{position}, $bytesRead ); + $self->{position} += $bytesRead; + return $bytesRead; +} + +# Copy given buffer to me +sub write { + my $self = shift; + my $buf = \( $_[0] ); + shift; + my $len = shift; + my $offset = shift || 0; + + $$buf = '' if not defined($$buf); + my $bufLen = length($$buf); + my $bytesWritten = + ( $offset + $len > $bufLen ) + ? $bufLen - $offset + : $len; + substr( $self->{content}, $self->{position}, $bytesWritten ) = + substr( $$buf, $offset, $bytesWritten ); + $self->{size} = length( $self->{content} ); + return $bytesWritten; +} + +sub clearerr() { 1 } + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/DirectoryMember.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/DirectoryMember.pm new file mode 100644 index 0000000..8c0cdc2 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/DirectoryMember.pm @@ -0,0 +1,82 @@ +package Archive::Zip::DirectoryMember; + +use strict; +use File::Path; + +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw( Archive::Zip::Member ); +} + +use Archive::Zip qw( + :ERROR_CODES + :UTILITY_METHODS +); + +sub _newNamed { + my $class = shift; + my $fileName = shift; # FS name + my $newName = shift; # Zip name + $newName = _asZipDirName($fileName) unless $newName; + my $self = $class->new(@_); + $self->{'externalFileName'} = $fileName; + $self->fileName($newName); + + if ( -e $fileName ) { + + # -e does NOT do a full stat, so we need to do one now + if ( -d _ ) { + my @stat = stat(_); + $self->unixFileAttributes( $stat[2] ); + my $mod_t = $stat[9]; + if ( $^O eq 'MSWin32' and !$mod_t ) { + $mod_t = time(); + } + $self->setLastModFileDateTimeFromUnix($mod_t); + + } + else { # hmm.. trying to add a non-directory? + _error( $fileName, ' exists but is not a directory' ); + return undef; + } + } + else { + $self->unixFileAttributes( $self->DEFAULT_DIRECTORY_PERMISSIONS ); + $self->setLastModFileDateTimeFromUnix( time() ); + } + return $self; +} + +sub externalFileName { + shift->{'externalFileName'}; +} + +sub isDirectory { + return 1; +} + +sub extractToFileNamed { + my $self = shift; + my $name = shift; # local FS name + my $attribs = $self->unixFileAttributes() & 07777; + mkpath( $name, 0, $attribs ); # croaks on error + utime( $self->lastModTime(), $self->lastModTime(), $name ); + return AZ_OK; +} + +sub fileName { + my $self = shift; + my $newName = shift; + $newName =~ s{/?$}{/} if defined($newName); + return $self->SUPER::fileName($newName); +} + +# So people don't get too confused. This way it looks like the problem +# is in their code... +sub contents { + return wantarray ? ( undef, AZ_OK ) : undef; +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FAQ.pod b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FAQ.pod new file mode 100644 index 0000000..0a48bfd --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FAQ.pod @@ -0,0 +1,467 @@ + +=head1 NAME + + +Archive::Zip::FAQ - Answers to a few frequently asked questions about Archive::Zip + +=head1 DESCRIPTION + + +It seems that I keep answering the same questions over and over again. I +assume that this is because my documentation is deficient, rather than that +people don't read the documentation. + + +So this FAQ is an attempt to cut down on the number of personal answers I have +to give. At least I can now say "You I read the FAQ, right?". + + +The questions are not in any particular order. The answers assume the current +version of Archive::Zip; some of the answers depend on newly added/fixed +functionality. + +=head1 Install problems on RedHat 8 or 9 with Perl 5.8.0 + + +B Archive::Zip won't install on my RedHat 9 system! It's broke! + + +B This has become something of a FAQ. +Basically, RedHat broke some versions of Perl by setting LANG to UTF8. +They apparently have a fixed version out as an update. + +You might try running CPAN or creating your Makefile after exporting the LANG +environment variable as + +C + +L + + +=head1 Why is my zip file so big? + + +B My zip file is actually bigger than what I stored in it! Why? + + +B Some things to make sure of: + +=over 4 + +=item Make sure that you are requesting COMPRESSION_DEFLATED if you are storing strings. + + + + +$member->desiredCompressionMethod( COMPRESSION_DEFLATED ); + + +=item Don't make lots of little files if you can help it. + + + +Since zip computes the compression tables for each member, small +members without much entropy won't compress well. Instead, if you've +got lots of repeated strings in your data, try to combine them into +one big member. + + +=item Make sure that you are requesting COMPRESSION_STORED if you are storing things that are already compressed. + + + +If you're storing a .zip, .jpg, .mp3, or other compressed file in a zip, +then don't compress them again. They'll get bigger. + +=back + +=head1 Sample code? + + +B Can you send me code to do (whatever)? + + +B Have you looked in the C directory yet? It contains: + +=over 4 + +=item examples/calcSizes.pl -- How to find out how big a Zip file will be before writing it + + + +=item examples/copy.pl -- Copies one Zip file to another + + + +=item examples/extract.pl -- extract file(s) from a Zip + + + +=item examples/mailZip.pl -- make and mail a zip file + + + +=item examples/mfh.pl -- demo for use of MockFileHandle + + + +=item examples/readScalar.pl -- shows how to use IO::Scalar as the source of a Zip read + + + +=item examples/selfex.pl -- a brief example of a self-extracting Zip + + + +=item examples/unzipAll.pl -- uses Archive::Zip::Tree to unzip an entire Zip + + + +=item examples/updateZip.pl -- shows how to read/modify/write a Zip + + + +=item examples/updateTree.pl -- shows how to update a Zip in place + + + +=item examples/writeScalar.pl -- shows how to use IO::Scalar as the destination of a Zip write + + + +=item examples/writeScalar2.pl -- shows how to use IO::String as the destination of a Zip write + + + +=item examples/zip.pl -- Constructs a Zip file + + + +=item examples/zipcheck.pl -- One way to check a Zip file for validity + + + +=item examples/zipinfo.pl -- Prints out information about a Zip archive file + + + +=item examples/zipGrep.pl -- Searches for text in Zip files + + + +=item examples/ziptest.pl -- Lists a Zip file and checks member CRCs + + + +=item examples/ziprecent.pl -- Puts recent files into a zipfile + + + +=item examples/ziptest.pl -- Another way to check a Zip file for validity + + + +=back + +=head1 Can't Read/modify/write same Zip file + + +B Why can't I open a Zip file, add a member, and write it back? I get an +error message when I try. + + +B Because Archive::Zip doesn't (and can't, generally) read file contents into memory, +the original Zip file is required to stay around until the writing of the new +file is completed. + + +The best way to do this is to write the Zip to a temporary file and then +rename the temporary file to have the old name (possibly after deleting the +old one). + + +Archive::Zip v1.02 added the archive methods C and +C to do this simply and carefully. + + +See C for an example of this technique. + +=head1 File creation time not set + + +B Upon extracting files, I see that their modification (and access) times are +set to the time in the Zip archive. However, their creation time is not set to +the same time. Why? + + +B Mostly because Perl doesn't give cross-platform access to I. +Indeed, many systems (like Unix) don't support such a concept. +However, if yours does, you can easily set it. Get the modification time from +the member using C. + +=head1 Can't use Archive::Zip on gzip files + + +B Can I use Archive::Zip to extract Unix gzip files? + + +B No. + + +There is a distinction between Unix gzip files, and Zip archives that +also can use the gzip compression. + + +Depending on the format of the gzip file, you can use L, or +L to decompress it (and de-archive it in the case of Tar files). + + +You can unzip PKZIP/WinZip/etc/ archives using Archive::Zip (that's what +it's for) as long as any compressed members are compressed using +Deflate compression. + +=head1 Add a directory/tree to a Zip + + +B How can I add a directory (or tree) full of files to a Zip? + + +B You can use the Archive::Zip::addTree*() methods: + + use Archive::Zip; + my $zip = Archive::Zip->new(); + # add all readable files and directories below . as xyz/* + $zip->addTree( '.', 'xyz' ); + # add all readable plain files below /abc as def/* + $zip->addTree( '/abc', 'def', sub { -f && -r } ); + # add all .c files below /tmp as stuff/* + $zip->addTreeMatching( '/tmp', 'stuff', '\.c$' ); + # add all .o files below /tmp as stuff/* if they aren't writable + $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { ! -w } ); + # add all .so files below /tmp that are smaller than 200 bytes as stuff/* + $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { -s < 200 } ); + # and write them into a file + $zip->writeToFileNamed('xxx.zip'); + +=head1 Extract a directory/tree + + +B How can I extract some (or all) files from a Zip into a different +directory? + + +B You can use the Archive::Zip::extractTree() method: +??? || + + + # now extract the same files into /tmpx + $zip->extractTree( 'stuff', '/tmpx' ); + +=head1 Update a directory/tree + + +B How can I update a Zip from a directory tree, adding or replacing only +the newer files? + + +B You can use the Archive::Zip::updateTree() method that was added in version 1.09. + +=head1 Zip times might be off by 1 second + + +B It bothers me greatly that my file times are wrong by one second about half +the time. Why don't you do something about it? + + +B Get over it. This is a result of the Zip format storing times in DOS +format, which has a resolution of only two seconds. + +=head1 Zip times don't include time zone information + + +B My file times don't respect time zones. What gives? + + +B If this is important to you, please submit patches to read the various +Extra Fields that encode times with time zones. I'm just using the DOS +Date/Time, which doesn't have a time zone. + +=head1 How do I make a self-extracting Zip + + +B I want to make a self-extracting Zip file. Can I do this? + + +B Yes. You can write a self-extracting archive stub (that is, a version of +unzip) to the output filehandle that you pass to writeToFileHandle(). See +examples/selfex.pl for how to write a self-extracting archive. + + +However, you should understand that this will only work on one kind of +platform (the one for which the stub was compiled). + +=head1 How can I deal with Zips with prepended garbage (i.e. from Sircam) + + +B How can I tell if a Zip has been damaged by adding garbage to the +beginning or inside the file? + + +B I added code for this for the Amavis virus scanner. You can query archives +for their 'eocdOffset' property, which should be 0: + + + if ($zip->eocdOffset > 0) + { warn($zip->eocdOffset . " bytes of garbage at beginning or within Zip") } + + +When members are extracted, this offset will be used to adjust the start of +the member if necessary. + +=head1 Can't extract Shrunk files + + +B I'm trying to extract a file out of a Zip produced by PKZIP, and keep +getting this error message: + + + error: Unsupported compression combination: read 6, write 0 + + +B You can't uncompress this archive member. Archive::Zip only supports uncompressed +members, and compressed members that are compressed using the compression +supported by Compress::Zlib. That means only Deflated and Stored members. + + +Your file is compressed using the Shrink format, which isn't supported by +Compress::Zlib. + + +You could, perhaps, use a command-line UnZip program (like the Info-Zip +one) to extract this. + +=head1 Can't do decryption + + +B How do I decrypt encrypted Zip members? + + +B With some other program or library. Archive::Zip doesn't support decryption, +and probably never will (unless I write it). + +=head1 How to test file integrity? + + +B How can Archive::Zip can test the validity of a Zip file? + + +B If you try to decompress the file, the gzip streams will report errors +if you have garbage. Most of the time. + +If you try to open the file and a central directory structure can't be +found, an error will be reported. + +When a file is being read, if we can't find a proper PK.. signature in +the right places we report a format error. + +If there is added garbage at the beginning of a Zip file (as inserted +by some viruses), you can find out about it, but Archive::Zip will ignore it, +and you can still use the archive. When it gets written back out the +added stuff will be gone. + + +There are two ready-to-use utilities in the examples directory that can +be used to test file integrity, or that you can use as examples +for your own code: + +=over 4 + +=item examples/zipcheck.pl shows how to use an attempted extraction to test a file. + + + +=item examples/ziptest.pl shows how to test CRCs in a file. + + + +=back + +=head1 Duplicate files in Zip? + + +B Archive::Zip let me put the same file in my Zip twice! Why don't you prevent this? + + +B As far as I can tell, this is not disallowed by the Zip spec. If you +think it's a bad idea, check for it yourself: + + + $zip->addFile($someFile, $someName) unless $zip->memberNamed($someName); + + +I can even imagine cases where this might be useful (for instance, multiple +versions of files). + +=head1 File ownership/permissions/ACLS/etc + + +B Why doesn't Archive::Zip deal with file ownership, ACLs, etc.? + + +B There is no standard way to represent these in the Zip file format. If +you want to send me code to properly handle the various extra fields that +have been used to represent these through the years, I'll look at it. + +=head1 I can't compile but ActiveState only has an old version of Archive::Zip + + +B I've only installed modules using ActiveState's PPM program and +repository. But they have a much older version of Archive::Zip than is in CPAN. Will +you send me a newer PPM? + + +B Probably not, unless I get lots of extra time. But there's no reason you +can't install the version from CPAN. Archive::Zip is pure Perl, so all you need is +NMAKE, which you can get for free from Microsoft (see the FAQ in the +ActiveState documentation for details on how to install CPAN modules). + +=head1 My JPEGs (or MP3's) don't compress when I put them into Zips! + + +B How come my JPEGs and MP3's don't compress much when I put them into Zips? + + +B Because they're already compressed. + +=head1 Under Windows, things lock up/get damaged + + +B I'm using Windows. When I try to use Archive::Zip, my machine locks up/makes +funny sounds/displays a BSOD/corrupts data. How can I fix this? + + +B First, try the newest version of Compress::Zlib. I know of +Windows-related problems prior to v1.14 of that library. + + +If that doesn't get rid of the problem, fix your computer or get rid of +Windows. + +=head1 Zip contents in a scalar + + +B I want to read a Zip file from (or write one to) a scalar variable instead +of a file. How can I do this? + + +B Use C and the C and +C methods. +See C and C. + +=head1 Reading from streams + + +B How do I read from a stream (like for the Info-Zip C program)? + + +B This isn't currently supported, though writing to a stream is. diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FileMember.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FileMember.pm new file mode 100644 index 0000000..aa09b4f --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/FileMember.pm @@ -0,0 +1,64 @@ +package Archive::Zip::FileMember; + +use strict; +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw ( Archive::Zip::Member ); +} + +use Archive::Zip qw( + :UTILITY_METHODS +); + +sub externalFileName { + shift->{'externalFileName'}; +} + +# Return true if I depend on the named file +sub _usesFileNamed { + my $self = shift; + my $fileName = shift; + my $xfn = $self->externalFileName(); + return undef if ref($xfn); + return $xfn eq $fileName; +} + +sub fh { + my $self = shift; + $self->_openFile() + if !defined( $self->{'fh'} ) || !$self->{'fh'}->opened(); + return $self->{'fh'}; +} + +# opens my file handle from my file name +sub _openFile { + my $self = shift; + my ( $status, $fh ) = _newFileHandle( $self->externalFileName(), 'r' ); + if ( !$status ) { + _ioError( "Can't open", $self->externalFileName() ); + return undef; + } + $self->{'fh'} = $fh; + _binmode($fh); + return $fh; +} + +# Make sure I close my file handle +sub endRead { + my $self = shift; + undef $self->{'fh'}; # _closeFile(); + return $self->SUPER::endRead(@_); +} + +sub _become { + my $self = shift; + my $newClass = shift; + return $self if ref($self) eq $newClass; + delete( $self->{'externalFileName'} ); + delete( $self->{'fh'} ); + return $self->SUPER::_become($newClass); +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Member.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Member.pm new file mode 100644 index 0000000..bb6ac5a --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Member.pm @@ -0,0 +1,950 @@ +package Archive::Zip::Member; + +# A generic membet of an archive + +use strict; +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw( Archive::Zip ); +} + +use Archive::Zip qw( + :CONSTANTS + :MISC_CONSTANTS + :ERROR_CODES + :PKZIP_CONSTANTS + :UTILITY_METHODS +); + +use Time::Local (); +use Compress::Zlib qw( Z_OK Z_STREAM_END MAX_WBITS ); +use File::Path; +use File::Basename; + +use constant ZIPFILEMEMBERCLASS => 'Archive::Zip::ZipFileMember'; +use constant NEWFILEMEMBERCLASS => 'Archive::Zip::NewFileMember'; +use constant STRINGMEMBERCLASS => 'Archive::Zip::StringMember'; +use constant DIRECTORYMEMBERCLASS => 'Archive::Zip::DirectoryMember'; + +# Unix perms for default creation of files/dirs. +use constant DEFAULT_DIRECTORY_PERMISSIONS => 040755; +use constant DEFAULT_FILE_PERMISSIONS => 0100666; +use constant DIRECTORY_ATTRIB => 040000; +use constant FILE_ATTRIB => 0100000; + +# Returns self if successful, else undef +# Assumes that fh is positioned at beginning of central directory file header. +# Leaves fh positioned immediately after file header or EOCD signature. +sub _newFromZipFile { + my $class = shift; + my $self = $class->ZIPFILEMEMBERCLASS->_newFromZipFile(@_); + return $self; +} + +sub newFromString { + my $class = shift; + my $self = $class->STRINGMEMBERCLASS->_newFromString(@_); + return $self; +} + +sub newFromFile { + my $class = shift; + my $self = $class->NEWFILEMEMBERCLASS->_newFromFileNamed(@_); + return $self; +} + +sub newDirectoryNamed { + my $class = shift; + my $self = $class->DIRECTORYMEMBERCLASS->_newNamed(@_); + return $self; +} + +sub new { + my $class = shift; + my $self = { + 'lastModFileDateTime' => 0, + 'fileAttributeFormat' => FA_UNIX, + 'versionMadeBy' => 20, + 'versionNeededToExtract' => 20, + 'bitFlag' => 0, + 'compressionMethod' => COMPRESSION_STORED, + 'desiredCompressionMethod' => COMPRESSION_STORED, + 'desiredCompressionLevel' => COMPRESSION_LEVEL_NONE, + 'internalFileAttributes' => 0, + 'externalFileAttributes' => 0, # set later + 'fileName' => '', + 'cdExtraField' => '', + 'localExtraField' => '', + 'fileComment' => '', + 'crc32' => 0, + 'compressedSize' => 0, + 'uncompressedSize' => 0, + @_ + }; + bless( $self, $class ); + $self->unixFileAttributes( $self->DEFAULT_FILE_PERMISSIONS ); + return $self; +} + +sub _becomeDirectoryIfNecessary { + my $self = shift; + $self->_become(DIRECTORYMEMBERCLASS) + if $self->isDirectory(); + return $self; +} + +# Morph into given class (do whatever cleanup I need to do) +sub _become { + return bless( $_[0], $_[1] ); +} + +sub versionMadeBy { + shift->{'versionMadeBy'}; +} + +sub fileAttributeFormat { + ( $#_ > 0 ) + ? ( $_[0]->{'fileAttributeFormat'} = $_[1] ) + : $_[0]->{'fileAttributeFormat'}; +} + +sub versionNeededToExtract { + shift->{'versionNeededToExtract'}; +} + +sub bitFlag { + shift->{'bitFlag'}; +} + +sub compressionMethod { + shift->{'compressionMethod'}; +} + +sub desiredCompressionMethod { + my $self = shift; + my $newDesiredCompressionMethod = shift; + my $oldDesiredCompressionMethod = $self->{'desiredCompressionMethod'}; + if ( defined($newDesiredCompressionMethod) ) { + $self->{'desiredCompressionMethod'} = $newDesiredCompressionMethod; + if ( $newDesiredCompressionMethod == COMPRESSION_STORED ) { + $self->{'desiredCompressionLevel'} = 0; + } + elsif ( $oldDesiredCompressionMethod == COMPRESSION_STORED ) { + $self->{'desiredCompressionLevel'} = COMPRESSION_LEVEL_DEFAULT; + } + } + return $oldDesiredCompressionMethod; +} + +sub desiredCompressionLevel { + my $self = shift; + my $newDesiredCompressionLevel = shift; + my $oldDesiredCompressionLevel = $self->{'desiredCompressionLevel'}; + if ( defined($newDesiredCompressionLevel) ) { + $self->{'desiredCompressionLevel'} = $newDesiredCompressionLevel; + $self->{'desiredCompressionMethod'} = ( + $newDesiredCompressionLevel + ? COMPRESSION_DEFLATED + : COMPRESSION_STORED + ); + } + return $oldDesiredCompressionLevel; +} + +sub fileName { + my $self = shift; + my $newName = shift; + if ($newName) { + $newName =~ s{[\\/]+}{/}g; # deal with dos/windoze problems + $self->{'fileName'} = $newName; + } + return $self->{'fileName'}; +} + +sub lastModFileDateTime { + my $modTime = shift->{'lastModFileDateTime'}; + $modTime =~ m/^(\d+)$/; # untaint + return $1; +} + +sub lastModTime { + my $self = shift; + return _dosToUnixTime( $self->lastModFileDateTime() ); +} + +sub setLastModFileDateTimeFromUnix { + my $self = shift; + my $time_t = shift; + $self->{'lastModFileDateTime'} = _unixToDosTime($time_t); +} + +sub internalFileAttributes { + shift->{'internalFileAttributes'}; +} + +sub externalFileAttributes { + shift->{'externalFileAttributes'}; +} + +# Convert UNIX permissions into proper value for zip file +# NOT A METHOD! +sub _mapPermissionsFromUnix { + my $perms = shift; + return $perms << 16; + + # TODO: map MS-DOS perms too (RHSA?) +} + +# Convert ZIP permissions into Unix ones +# +# This was taken from Info-ZIP group's portable UnZip +# zipfile-extraction program, version 5.50. +# http://www.info-zip.org/pub/infozip/ +# +# See the mapattr() function in unix/unix.c +# See the attribute format constants in unzpriv.h +# +# XXX Note that there's one situation that isn't implemented +# yet that depends on the "extra field." +sub _mapPermissionsToUnix { + my $self = shift; + + my $format = $self->{'fileAttributeFormat'}; + my $attribs = $self->{'externalFileAttributes'}; + + my $mode = 0; + + if ( $format == FA_AMIGA ) { + $attribs = $attribs >> 17 & 7; # Amiga RWE bits + $mode = $attribs << 6 | $attribs << 3 | $attribs; + return $mode; + } + + if ( $format == FA_THEOS ) { + $attribs &= 0xF1FFFFFF; + if ( ( $attribs & 0xF0000000 ) != 0x40000000 ) { + $attribs &= 0x01FFFFFF; # not a dir, mask all ftype bits + } + else { + $attribs &= 0x41FFFFFF; # leave directory bit as set + } + } + + if ( $format == FA_UNIX + || $format == FA_VAX_VMS + || $format == FA_ACORN + || $format == FA_ATARI_ST + || $format == FA_BEOS + || $format == FA_QDOS + || $format == FA_TANDEM ) + { + $mode = $attribs >> 16; + return $mode if $mode != 0 or not $self->localExtraField; + + # warn("local extra field is: ", $self->localExtraField, "\n"); + + # XXX This condition is not implemented + # I'm just including the comments from the info-zip section for now. + + # Some (non-Info-ZIP) implementations of Zip for Unix and + # VMS (and probably others ??) leave 0 in the upper 16-bit + # part of the external_file_attributes field. Instead, they + # store file permission attributes in some extra field. + # As a work-around, we search for the presence of one of + # these extra fields and fall back to the MSDOS compatible + # part of external_file_attributes if one of the known + # e.f. types has been detected. + # Later, we might implement extraction of the permission + # bits from the VMS extra field. But for now, the work-around + # should be sufficient to provide "readable" extracted files. + # (For ASI Unix e.f., an experimental remap from the e.f. + # mode value IS already provided!) + } + + # PKWARE's PKZip for Unix marks entries as FA_MSDOS, but stores the + # Unix attributes in the upper 16 bits of the external attributes + # field, just like Info-ZIP's Zip for Unix. We try to use that + # value, after a check for consistency with the MSDOS attribute + # bits (see below). + if ( $format == FA_MSDOS ) { + $mode = $attribs >> 16; + } + + # FA_MSDOS, FA_OS2_HPFS, FA_WINDOWS_NTFS, FA_MACINTOSH, FA_TOPS20 + $attribs = !( $attribs & 1 ) << 1 | ( $attribs & 0x10 ) >> 4; + + # keep previous $mode setting when its "owner" + # part appears to be consistent with DOS attribute flags! + return $mode if ( $mode & 0700 ) == ( 0400 | $attribs << 6 ); + $mode = 0444 | $attribs << 6 | $attribs << 3 | $attribs; + return $mode; +} + +sub unixFileAttributes { + my $self = shift; + my $oldPerms = $self->_mapPermissionsToUnix(); + if (@_) { + my $perms = shift; + if ( $self->isDirectory() ) { + $perms &= ~FILE_ATTRIB; + $perms |= DIRECTORY_ATTRIB; + } + else { + $perms &= ~DIRECTORY_ATTRIB; + $perms |= FILE_ATTRIB; + } + $self->{'externalFileAttributes'} = _mapPermissionsFromUnix($perms); + } + return $oldPerms; +} + +sub localExtraField { + ( $#_ > 0 ) + ? ( $_[0]->{'localExtraField'} = $_[1] ) + : $_[0]->{'localExtraField'}; +} + +sub cdExtraField { + ( $#_ > 0 ) ? ( $_[0]->{'cdExtraField'} = $_[1] ) : $_[0]->{'cdExtraField'}; +} + +sub extraFields { + my $self = shift; + return $self->localExtraField() . $self->cdExtraField(); +} + +sub fileComment { + ( $#_ > 0 ) + ? ( $_[0]->{'fileComment'} = pack( 'C0a*', $_[1] ) ) + : $_[0]->{'fileComment'}; +} + +sub hasDataDescriptor { + my $self = shift; + if (@_) { + my $shouldHave = shift; + if ($shouldHave) { + $self->{'bitFlag'} |= GPBF_HAS_DATA_DESCRIPTOR_MASK; + } + else { + $self->{'bitFlag'} &= ~GPBF_HAS_DATA_DESCRIPTOR_MASK; + } + } + return $self->{'bitFlag'} & GPBF_HAS_DATA_DESCRIPTOR_MASK; +} + +sub crc32 { + shift->{'crc32'}; +} + +sub crc32String { + sprintf( "%08x", shift->{'crc32'} ); +} + +sub compressedSize { + shift->{'compressedSize'}; +} + +sub uncompressedSize { + shift->{'uncompressedSize'}; +} + +sub isEncrypted { + shift->bitFlag() & GPBF_ENCRYPTED_MASK; +} + +sub isTextFile { + my $self = shift; + my $bit = $self->internalFileAttributes() & IFA_TEXT_FILE_MASK; + if (@_) { + my $flag = shift; + $self->{'internalFileAttributes'} &= ~IFA_TEXT_FILE_MASK; + $self->{'internalFileAttributes'} |= + ( $flag ? IFA_TEXT_FILE: IFA_BINARY_FILE ); + } + return $bit == IFA_TEXT_FILE; +} + +sub isBinaryFile { + my $self = shift; + my $bit = $self->internalFileAttributes() & IFA_TEXT_FILE_MASK; + if (@_) { + my $flag = shift; + $self->{'internalFileAttributes'} &= ~IFA_TEXT_FILE_MASK; + $self->{'internalFileAttributes'} |= + ( $flag ? IFA_BINARY_FILE: IFA_TEXT_FILE ); + } + return $bit == IFA_BINARY_FILE; +} + +sub extractToFileNamed { + my $self = shift; + my $name = shift; # local FS name + return _error("encryption unsupported") if $self->isEncrypted(); + mkpath( dirname($name) ); # croaks on error + my ( $status, $fh ) = _newFileHandle( $name, 'w' ); + return _ioError("Can't open file $name for write") unless $status; + my $retval = $self->extractToFileHandle($fh); + $fh->close(); + utime( $self->lastModTime(), $self->lastModTime(), $name ); + return $retval; +} + +sub isDirectory { + return 0; +} + +sub externalFileName { + return undef; +} + +# The following are used when copying data +sub _writeOffset { + shift->{'writeOffset'}; +} + +sub _readOffset { + shift->{'readOffset'}; +} + +sub writeLocalHeaderRelativeOffset { + shift->{'writeLocalHeaderRelativeOffset'}; +} + +sub wasWritten { shift->{'wasWritten'} } + +sub _dataEnded { + shift->{'dataEnded'}; +} + +sub _readDataRemaining { + shift->{'readDataRemaining'}; +} + +sub _inflater { + shift->{'inflater'}; +} + +sub _deflater { + shift->{'deflater'}; +} + +# Return the total size of my local header +sub _localHeaderSize { + my $self = shift; + return SIGNATURE_LENGTH + LOCAL_FILE_HEADER_LENGTH + + length( $self->fileName() ) + length( $self->localExtraField() ); +} + +# Return the total size of my CD header +sub _centralDirectoryHeaderSize { + my $self = shift; + return SIGNATURE_LENGTH + CENTRAL_DIRECTORY_FILE_HEADER_LENGTH + + length( $self->fileName() ) + length( $self->cdExtraField() ) + + length( $self->fileComment() ); +} + +# DOS date/time format +# 0-4 (5) Second divided by 2 +# 5-10 (6) Minute (0-59) +# 11-15 (5) Hour (0-23 on a 24-hour clock) +# 16-20 (5) Day of the month (1-31) +# 21-24 (4) Month (1 = January, 2 = February, etc.) +# 25-31 (7) Year offset from 1980 (add 1980 to get actual year) + +# Convert DOS date/time format to unix time_t format +# NOT AN OBJECT METHOD! +sub _dosToUnixTime { + my $dt = shift; + return time() unless defined($dt); + + my $year = ( ( $dt >> 25 ) & 0x7f ) + 80; + my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1; + my $mday = ( ( $dt >> 16 ) & 0x1f ); + + my $hour = ( ( $dt >> 11 ) & 0x1f ); + my $min = ( ( $dt >> 5 ) & 0x3f ); + my $sec = ( ( $dt << 1 ) & 0x3e ); + + # catch errors + my $time_t = + eval { Time::Local::timelocal( $sec, $min, $hour, $mday, $mon, $year ); }; + return time() if ($@); + return $time_t; +} + +# Note, this isn't exactly UTC 1980, it's 1980 + 12 hours and 1 +# minute so that nothing timezoney can muck us up. +my $safe_epoch = 315576060; + +# convert a unix time to DOS date/time +# NOT AN OBJECT METHOD! +sub _unixToDosTime { + my $time_t = shift; + unless ($time_t) { + _error("Tried to add member with zero or undef value for time"); + $time_t = $safe_epoch; + } + if ( $time_t < $safe_epoch ) { + _ioError("Unsupported date before 1980 encountered, moving to 1980"); + $time_t = $safe_epoch; + } + my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime($time_t); + my $dt = 0; + $dt += ( $sec >> 1 ); + $dt += ( $min << 5 ); + $dt += ( $hour << 11 ); + $dt += ( $mday << 16 ); + $dt += ( ( $mon + 1 ) << 21 ); + $dt += ( ( $year - 80 ) << 25 ); + return $dt; +} + +# Write my local header to a file handle. +# Stores the offset to the start of the header in my +# writeLocalHeaderRelativeOffset member. +# Returns AZ_OK on success. +sub _writeLocalFileHeader { + my $self = shift; + my $fh = shift; + + my $signatureData = pack( SIGNATURE_FORMAT, LOCAL_FILE_HEADER_SIGNATURE ); + $fh->print($signatureData) + or return _ioError("writing local header signature"); + + my $header = pack( + LOCAL_FILE_HEADER_FORMAT, + $self->versionNeededToExtract(), + $self->bitFlag(), + $self->desiredCompressionMethod(), + $self->lastModFileDateTime(), + $self->crc32(), + $self->compressedSize(), # may need to be re-written later + $self->uncompressedSize(), + length( $self->fileName() ), + length( $self->localExtraField() ) + ); + + $fh->print($header) or return _ioError("writing local header"); + if ( $self->fileName() ) { + $fh->print( $self->fileName() ) + or return _ioError("writing local header filename"); + } + if ( $self->localExtraField() ) { + $fh->print( $self->localExtraField() ) + or return _ioError("writing local extra field"); + } + + return AZ_OK; +} + +sub _writeCentralDirectoryFileHeader { + my $self = shift; + my $fh = shift; + + my $sigData = + pack( SIGNATURE_FORMAT, CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE ); + $fh->print($sigData) + or return _ioError("writing central directory header signature"); + + my $fileNameLength = length( $self->fileName() ); + my $extraFieldLength = length( $self->cdExtraField() ); + my $fileCommentLength = length( $self->fileComment() ); + + my $header = pack( + CENTRAL_DIRECTORY_FILE_HEADER_FORMAT, + $self->versionMadeBy(), + $self->fileAttributeFormat(), + $self->versionNeededToExtract(), + $self->bitFlag(), + $self->desiredCompressionMethod(), + $self->lastModFileDateTime(), + $self->crc32(), # these three fields should have been updated + $self->_writeOffset(), # by writing the data stream out + $self->uncompressedSize(), # + $fileNameLength, + $extraFieldLength, + $fileCommentLength, + 0, # {'diskNumberStart'}, + $self->internalFileAttributes(), + $self->externalFileAttributes(), + $self->writeLocalHeaderRelativeOffset() + ); + + $fh->print($header) + or return _ioError("writing central directory header"); + if ($fileNameLength) { + $fh->print( $self->fileName() ) + or return _ioError("writing central directory header signature"); + } + if ($extraFieldLength) { + $fh->print( $self->cdExtraField() ) + or return _ioError("writing central directory extra field"); + } + if ($fileCommentLength) { + $fh->print( $self->fileComment() ) + or return _ioError("writing central directory file comment"); + } + + return AZ_OK; +} + +# This writes a data descriptor to the given file handle. +# Assumes that crc32, writeOffset, and uncompressedSize are +# set correctly (they should be after a write). +# Further, the local file header should have the +# GPBF_HAS_DATA_DESCRIPTOR_MASK bit set. +sub _writeDataDescriptor { + my $self = shift; + my $fh = shift; + my $header = pack( + SIGNATURE_FORMAT . DATA_DESCRIPTOR_FORMAT, + DATA_DESCRIPTOR_SIGNATURE, + $self->crc32(), + $self->_writeOffset(), # compressed size + $self->uncompressedSize() + ); + + $fh->print($header) + or return _ioError("writing data descriptor"); + return AZ_OK; +} + +# Re-writes the local file header with new crc32 and compressedSize fields. +# To be called after writing the data stream. +# Assumes that filename and extraField sizes didn't change since last written. +sub _refreshLocalFileHeader { + my $self = shift; + my $fh = shift; + + my $here = $fh->tell(); + $fh->seek( $self->writeLocalHeaderRelativeOffset() + SIGNATURE_LENGTH, + IO::Seekable::SEEK_SET ) + or return _ioError("seeking to rewrite local header"); + + my $header = pack( + LOCAL_FILE_HEADER_FORMAT, + $self->versionNeededToExtract(), + $self->bitFlag(), + $self->desiredCompressionMethod(), + $self->lastModFileDateTime(), + $self->crc32(), + $self->_writeOffset(), # compressed size + $self->uncompressedSize(), + length( $self->fileName() ), + length( $self->localExtraField() ) + ); + + $fh->print($header) + or return _ioError("re-writing local header"); + $fh->seek( $here, IO::Seekable::SEEK_SET ) + or return _ioError("seeking after rewrite of local header"); + + return AZ_OK; +} + +sub readChunk { + my ( $self, $chunkSize ) = @_; + + if ( $self->readIsDone() ) { + $self->endRead(); + my $dummy = ''; + return ( \$dummy, AZ_STREAM_END ); + } + + $chunkSize = $Archive::Zip::ChunkSize if not defined($chunkSize); + $chunkSize = $self->_readDataRemaining() + if $chunkSize > $self->_readDataRemaining(); + + my $buffer = ''; + my $outputRef; + my ( $bytesRead, $status ) = $self->_readRawChunk( \$buffer, $chunkSize ); + return ( \$buffer, $status ) unless $status == AZ_OK; + + $self->{'readDataRemaining'} -= $bytesRead; + $self->{'readOffset'} += $bytesRead; + + if ( $self->compressionMethod() == COMPRESSION_STORED ) { + $self->{'crc32'} = $self->computeCRC32( $buffer, $self->{'crc32'} ); + } + + ( $outputRef, $status ) = &{ $self->{'chunkHandler'} }( $self, \$buffer ); + $self->{'writeOffset'} += length($$outputRef); + + $self->endRead() + if $self->readIsDone(); + + return ( $outputRef, $status ); +} + +# Read the next raw chunk of my data. Subclasses MUST implement. +# my ( $bytesRead, $status) = $self->_readRawChunk( \$buffer, $chunkSize ); +sub _readRawChunk { + my $self = shift; + return $self->_subclassResponsibility(); +} + +# A place holder to catch rewindData errors if someone ignores +# the error code. +sub _noChunk { + my $self = shift; + return ( \undef, _error("trying to copy chunk when init failed") ); +} + +# Basically a no-op so that I can have a consistent interface. +# ( $outputRef, $status) = $self->_copyChunk( \$buffer ); +sub _copyChunk { + my ( $self, $dataRef ) = @_; + return ( $dataRef, AZ_OK ); +} + +# ( $outputRef, $status) = $self->_deflateChunk( \$buffer ); +sub _deflateChunk { + my ( $self, $buffer ) = @_; + my ( $out, $status ) = $self->_deflater()->deflate($buffer); + + if ( $self->_readDataRemaining() == 0 ) { + my $extraOutput; + ( $extraOutput, $status ) = $self->_deflater()->flush(); + $out .= $extraOutput; + $self->endRead(); + return ( \$out, AZ_STREAM_END ); + } + elsif ( $status == Z_OK ) { + return ( \$out, AZ_OK ); + } + else { + $self->endRead(); + my $retval = _error( 'deflate error', $status ); + my $dummy = ''; + return ( \$dummy, $retval ); + } +} + +# ( $outputRef, $status) = $self->_inflateChunk( \$buffer ); +sub _inflateChunk { + my ( $self, $buffer ) = @_; + my ( $out, $status ) = $self->_inflater()->inflate($buffer); + my $retval; + $self->endRead() unless $status == Z_OK; + if ( $status == Z_OK || $status == Z_STREAM_END ) { + $retval = ( $status == Z_STREAM_END ) ? AZ_STREAM_END: AZ_OK; + return ( \$out, $retval ); + } + else { + $retval = _error( 'inflate error', $status ); + my $dummy = ''; + return ( \$dummy, $retval ); + } +} + +sub rewindData { + my $self = shift; + my $status; + + # set to trap init errors + $self->{'chunkHandler'} = $self->can('_noChunk'); + + # Work around WinZip bug with 0-length DEFLATED files + $self->desiredCompressionMethod(COMPRESSION_STORED) + if $self->uncompressedSize() == 0; + + # assume that we're going to read the whole file, and compute the CRC anew. + $self->{'crc32'} = 0 + if ( $self->compressionMethod() == COMPRESSION_STORED ); + + # These are the only combinations of methods we deal with right now. + if ( $self->compressionMethod() == COMPRESSION_STORED + and $self->desiredCompressionMethod() == COMPRESSION_DEFLATED ) + { + ( $self->{'deflater'}, $status ) = Compress::Zlib::deflateInit( + '-Level' => $self->desiredCompressionLevel(), + '-WindowBits' => -MAX_WBITS(), # necessary magic + '-Bufsize' => $Archive::Zip::ChunkSize, + @_ + ); # pass additional options + return _error( 'deflateInit error:', $status ) + unless $status == Z_OK; + $self->{'chunkHandler'} = $self->can('_deflateChunk'); + } + elsif ( $self->compressionMethod() == COMPRESSION_DEFLATED + and $self->desiredCompressionMethod() == COMPRESSION_STORED ) + { + ( $self->{'inflater'}, $status ) = Compress::Zlib::inflateInit( + '-WindowBits' => -MAX_WBITS(), # necessary magic + '-Bufsize' => $Archive::Zip::ChunkSize, + @_ + ); # pass additional options + return _error( 'inflateInit error:', $status ) + unless $status == Z_OK; + $self->{'chunkHandler'} = $self->can('_inflateChunk'); + } + elsif ( $self->compressionMethod() == $self->desiredCompressionMethod() ) { + $self->{'chunkHandler'} = $self->can('_copyChunk'); + } + else { + return _error( + sprintf( + "Unsupported compression combination: read %d, write %d", + $self->compressionMethod(), + $self->desiredCompressionMethod() + ) + ); + } + + $self->{'readDataRemaining'} = + ( $self->compressionMethod() == COMPRESSION_STORED ) + ? $self->uncompressedSize() + : $self->compressedSize(); + $self->{'dataEnded'} = 0; + $self->{'readOffset'} = 0; + + return AZ_OK; +} + +sub endRead { + my $self = shift; + delete $self->{'inflater'}; + delete $self->{'deflater'}; + $self->{'dataEnded'} = 1; + $self->{'readDataRemaining'} = 0; + return AZ_OK; +} + +sub readIsDone { + my $self = shift; + return ( $self->_dataEnded() or !$self->_readDataRemaining() ); +} + +sub contents { + my $self = shift; + my $newContents = shift; + + if ( defined($newContents) ) { + + # change our type and call the subclass contents method. + $self->_become(STRINGMEMBERCLASS); + return $self->contents( pack( 'C0a*', $newContents ) ) + ; # in case of Unicode + } + else { + my $oldCompression = + $self->desiredCompressionMethod(COMPRESSION_STORED); + my $status = $self->rewindData(@_); + if ( $status != AZ_OK ) { + $self->endRead(); + return $status; + } + my $retval = ''; + while ( $status == AZ_OK ) { + my $ref; + ( $ref, $status ) = $self->readChunk( $self->_readDataRemaining() ); + + # did we get it in one chunk? + if ( length($$ref) == $self->uncompressedSize() ) { + $retval = $$ref; + } + else { $retval .= $$ref } + } + $self->desiredCompressionMethod($oldCompression); + $self->endRead(); + $status = AZ_OK if $status == AZ_STREAM_END; + $retval = undef unless $status == AZ_OK; + return wantarray ? ( $retval, $status ) : $retval; + } +} + +sub extractToFileHandle { + my $self = shift; + return _error("encryption unsupported") if $self->isEncrypted(); + my $fh = shift; + _binmode($fh); + my $oldCompression = $self->desiredCompressionMethod(COMPRESSION_STORED); + my $status = $self->rewindData(@_); + $status = $self->_writeData($fh) if $status == AZ_OK; + $self->desiredCompressionMethod($oldCompression); + $self->endRead(); + return $status; +} + +# write local header and data stream to file handle +sub _writeToFileHandle { + my $self = shift; + my $fh = shift; + my $fhIsSeekable = shift; + my $offset = shift; + + return _error("no member name given for $self") + unless $self->fileName(); + + $self->{'writeLocalHeaderRelativeOffset'} = $offset; + $self->{'wasWritten'} = 0; + + # Determine if I need to write a data descriptor + # I need to do this if I can't refresh the header + # and I don't know compressed size or crc32 fields. + my $headerFieldsUnknown = ( + ( $self->uncompressedSize() > 0 ) + and ($self->compressionMethod() == COMPRESSION_STORED + or $self->desiredCompressionMethod() == COMPRESSION_DEFLATED ) + ); + + my $shouldWriteDataDescriptor = + ( $headerFieldsUnknown and not $fhIsSeekable ); + + $self->hasDataDescriptor(1) + if ($shouldWriteDataDescriptor); + + $self->{'writeOffset'} = 0; + + my $status = $self->rewindData(); + ( $status = $self->_writeLocalFileHeader($fh) ) + if $status == AZ_OK; + ( $status = $self->_writeData($fh) ) + if $status == AZ_OK; + if ( $status == AZ_OK ) { + $self->{'wasWritten'} = 1; + if ( $self->hasDataDescriptor() ) { + $status = $self->_writeDataDescriptor($fh); + } + elsif ($headerFieldsUnknown) { + $status = $self->_refreshLocalFileHeader($fh); + } + } + + return $status; +} + +# Copy my (possibly compressed) data to given file handle. +# Returns C on success +sub _writeData { + my $self = shift; + my $writeFh = shift; + + return AZ_OK if ( $self->uncompressedSize() == 0 ); + my $status; + my $chunkSize = $Archive::Zip::ChunkSize; + while ( $self->_readDataRemaining() > 0 ) { + my $outRef; + ( $outRef, $status ) = $self->readChunk($chunkSize); + return $status if ( $status != AZ_OK and $status != AZ_STREAM_END ); + + if ( length($$outRef) > 0 ) { + $writeFh->print($$outRef) + or return _ioError("write error during copy"); + } + + last if $status == AZ_STREAM_END; + } + $self->{'compressedSize'} = $self->_writeOffset(); + return AZ_OK; +} + +# Return true if I depend on the named file +sub _usesFileNamed { + return 0; +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MemberRead.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MemberRead.pm new file mode 100644 index 0000000..f20f17d --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MemberRead.pm @@ -0,0 +1,280 @@ +package Archive::Zip::MemberRead; + +# Copyright (c) 2002 Sreeji K. Das. All rights reserved. This program is free +# software; you can redistribute it and/or modify it under the same terms +# as Perl itself. + +=head1 NAME + +Archive::Zip::MemberRead - A wrapper that lets you read Zip archive members as if they were files. + +=cut + +=head1 SYNOPSIS + + use Archive::Zip; + use Archive::Zip::MemberRead; + $zip = new Archive::Zip("file.zip"); + $fh = new Archive::Zip::MemberRead($zip, "subdir/abc.txt"); + while (defined($line = $fh->getline())) + { + print $fh->input_line_number . "#: $line\n"; + } + + $read = $fh->read($buffer, 32*1024); + print "Read $read bytes as :$buffer:\n"; + +=head1 DESCRIPTION + +The Archive::Zip::MemberRead module lets you read Zip archive member data +just like you read data from files. + +=head1 METHODS + +=over 4 + +=cut + +use strict; +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); + +use vars qw{$VERSION}; + +BEGIN { + $VERSION = '1.18'; + $VERSION = eval $VERSION; +} + +=item Archive::Zip::Member::readFileHandle() + +You can get a C from an archive member by +calling C: + + my $member = $zip->memberNamed('abc/def.c'); + my $fh = $member->readFileHandle(); + while (defined($line = $fh->getline())) + { + # ... + } + $fh->close(); + +=cut + +sub Archive::Zip::Member::readFileHandle { + return Archive::Zip::MemberRead->new( shift() ); +} + +=item Archive::Zip::MemberRead->new($zip, $fileName) + +=item Archive::Zip::MemberRead->new($zip, $member) + +=item Archive::Zip::MemberRead->new($member) + +Construct a new Archive::Zip::MemberRead on the specified member. + + my $fh = Archive::Zip::MemberRead->new($zip, 'fred.c') + +=cut + +sub new { + my ( $class, $zip, $file ) = @_; + my ( $self, $member ); + + if ( $zip && $file ) # zip and filename, or zip and member + { + $member = ref($file) ? $file : $zip->memberNamed($file); + } + elsif ( $zip && !$file && ref($zip) ) # just member + { + $member = $zip; + } + else { + die( +'Archive::Zip::MemberRead::new needs a zip and filename, zip and member, or member' + ); + } + + $self = {}; + bless( $self, $class ); + $self->set_member($member); + return $self; +} + +sub set_member { + my ( $self, $member ) = @_; + + $self->{member} = $member; + $self->set_compression(COMPRESSION_STORED); + $self->rewind(); +} + +sub set_compression { + my ( $self, $compression ) = @_; + $self->{member}->desiredCompressionMethod($compression) if $self->{member}; +} + +=item rewind() + +Rewinds an C so that you can read from it again +starting at the beginning. + +=cut + +sub rewind { + my $self = shift; + + $self->_reset_vars(); + $self->{member}->rewindData() if $self->{member}; +} + +sub _reset_vars { + my $self = shift; + $self->{lines} = []; + $self->{partial} = 0; + $self->{line_no} = 0; +} + +=item input_line_number() + +Returns the current line number, but only if you're using C. +Using C will not update the line number. + +=cut + +sub input_line_number { + my $self = shift; + return $self->{line_no}; +} + +=item close() + +Closes the given file handle. + +=cut + +sub close { + my $self = shift; + + $self->_reset_vars(); + $self->{member}->endRead(); +} + +=item buffer_size([ $size ]) + +Gets or sets the buffer size used for reads. +Default is the chunk size used by Archive::Zip. + +=cut + +sub buffer_size { + my ( $self, $size ) = @_; + + if ( !$size ) { + return $self->{chunkSize} || Archive::Zip::chunkSize(); + } + else { + $self->{chunkSize} = $size; + } +} + +=item getline() + +Returns the next line from the currently open member. +Makes sense only for text files. +A read error is considered fatal enough to die. +Returns undef on eof. All subsequent calls would return undef, +unless a rewind() is called. +Note: The line returned has the newline removed. + +=cut + +# $self->{partial} flags whether the last line in the buffer is partial or not. +# A line is treated as partial if it does not ends with \n +sub getline { + my $self = shift; + my ( $temp, $status, $size, $buffer, @lines ); + + $status = AZ_OK; + $size = $self->buffer_size(); + $temp = \$status; + while ( $$temp !~ /\n/ && $status != AZ_STREAM_END ) { + ( $temp, $status ) = $self->{member}->readChunk($size); + if ( $status != AZ_OK && $status != AZ_STREAM_END ) { + die "ERROR: Error reading chunk from archive - $status\n"; + } + + $buffer .= $$temp; + } + + @lines = split( /\n/, $buffer ); + $self->{line_no}++; + if ( $#lines == -1 ) { + return ( $#{ $self->{lines} } == -1 ) + ? undef + : shift( @{ $self->{lines} } ); + } + + $self->{lines}->[ $#{ $self->{lines} } ] .= shift(@lines) + if $self->{partial}; + + splice( @{ $self->{lines} }, @{ $self->{lines} }, 0, @lines ); + $self->{partial} = !( $buffer =~ /\n$/ ); + return shift( @{ $self->{lines} } ); +} + +=item read($buffer, $num_bytes_to_read) + +Simulates a normal C system call. +Returns the no. of bytes read. C on error, 0 on eof, I: + + $fh = new Archive::Zip::MemberRead($zip, "sreeji/secrets.bin"); + while (1) + { + $read = $fh->read($buffer, 1024); + die "FATAL ERROR reading my secrets !\n" if (!defined($read)); + last if (!$read); + # Do processing. + .... + } + +=cut + +# +# All these $_ are required to emulate read(). +# +sub read { + my $self = $_[0]; + my $size = $_[2]; + my ( $temp, $status, $ret ); + + ( $temp, $status ) = $self->{member}->readChunk($size); + if ( $status != AZ_OK && $status != AZ_STREAM_END ) { + $_[1] = undef; + $ret = undef; + } + else { + $_[1] = $$temp; + $ret = length($$temp); + } + return $ret; +} + +1; + +=back + +=head1 AUTHOR + +Sreeji K. Das, +See L by Ned Konz without which this module does not make +any sense! + +Minor mods by Ned Konz. + +=head1 COPYRIGHT + +Copyright (c) 2002 Sreeji K. Das. All rights reserved. This program is free +software; you can redistribute it and/or modify it under the same terms +as Perl itself. + +=cut diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MockFileHandle.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MockFileHandle.pm new file mode 100644 index 0000000..bb97a2b --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/MockFileHandle.pm @@ -0,0 +1,69 @@ +package Archive::Zip::MockFileHandle; + +# Output file handle that calls a custom write routine +# Ned Konz, March 2000 +# This is provided to help with writing zip files +# when you have to process them a chunk at a time. + +use strict; + +use vars qw{$VERSION}; + +BEGIN { + $VERSION = '1.18'; + $VERSION = eval $VERSION; +} + +sub new { + my $class = shift || __PACKAGE__; + $class = ref($class) || $class; + my $self = bless( + { + 'position' => 0, + 'size' => 0 + }, + $class + ); + return $self; +} + +sub eof { + my $self = shift; + return $self->{'position'} >= $self->{'size'}; +} + +# Copy given buffer to me +sub print { + my $self = shift; + my $bytes = join( '', @_ ); + my $bytesWritten = $self->writeHook($bytes); + if ( $self->{'position'} + $bytesWritten > $self->{'size'} ) { + $self->{'size'} = $self->{'position'} + $bytesWritten; + } + $self->{'position'} += $bytesWritten; + return $bytesWritten; +} + +# Called on each write. +# Override in subclasses. +# Return number of bytes written (0 on error). +sub writeHook { + my $self = shift; + my $bytes = shift; + return length($bytes); +} + +sub binmode { 1 } + +sub close { 1 } + +sub clearerr { 1 } + +# I'm write-only! +sub read { 0 } + +sub tell { return shift->{'position'} } + +sub opened { 1 } + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/NewFileMember.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/NewFileMember.pm new file mode 100644 index 0000000..35fdbcd --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/NewFileMember.pm @@ -0,0 +1,79 @@ +package Archive::Zip::NewFileMember; + +use strict; +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw ( Archive::Zip::FileMember ); +} + +use Archive::Zip qw( + :CONSTANTS + :ERROR_CODES + :UTILITY_METHODS +); + +# Given a file name, set up for eventual writing. +sub _newFromFileNamed { + my $class = shift; + my $fileName = shift; # local FS format + my $newName = shift; + $newName = _asZipDirName($fileName) unless defined($newName); + return undef unless ( stat($fileName) && -r _ && !-d _ ); + my $self = $class->new(@_); + $self->fileName($newName); + $self->{'externalFileName'} = $fileName; + $self->{'compressionMethod'} = COMPRESSION_STORED; + my @stat = stat(_); + $self->{'compressedSize'} = $self->{'uncompressedSize'} = $stat[7]; + $self->desiredCompressionMethod( + ( $self->compressedSize() > 0 ) + ? COMPRESSION_DEFLATED + : COMPRESSION_STORED + ); + $self->unixFileAttributes( $stat[2] ); + $self->setLastModFileDateTimeFromUnix( $stat[9] ); + $self->isTextFile( -T _ ); + return $self; +} + +sub rewindData { + my $self = shift; + + my $status = $self->SUPER::rewindData(@_); + return $status unless $status == AZ_OK; + + return AZ_IO_ERROR unless $self->fh(); + $self->fh()->clearerr(); + $self->fh()->seek( 0, IO::Seekable::SEEK_SET ) + or return _ioError( "rewinding", $self->externalFileName() ); + return AZ_OK; +} + +# Return bytes read. Note that first parameter is a ref to a buffer. +# my $data; +# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); +sub _readRawChunk { + my ( $self, $dataRef, $chunkSize ) = @_; + return ( 0, AZ_OK ) unless $chunkSize; + my $bytesRead = $self->fh()->read( $$dataRef, $chunkSize ) + or return ( 0, _ioError("reading data") ); + return ( $bytesRead, AZ_OK ); +} + +# If I already exist, extraction is a no-op. +sub extractToFileNamed { + my $self = shift; + my $name = shift; # local FS name + if ( File::Spec->rel2abs($name) eq + File::Spec->rel2abs( $self->externalFileName() ) and -r $name ) + { + return AZ_OK; + } + else { + return $self->SUPER::extractToFileNamed( $name, @_ ); + } +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/StringMember.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/StringMember.pm new file mode 100644 index 0000000..3bd7a3e --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/StringMember.pm @@ -0,0 +1,64 @@ +package Archive::Zip::StringMember; + +use strict; +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw( Archive::Zip::Member ); +} + +use Archive::Zip qw( + :CONSTANTS + :ERROR_CODES +); + +# Create a new string member. Default is COMPRESSION_STORED. +# Can take a ref to a string as well. +sub _newFromString { + my $class = shift; + my $string = shift; + my $name = shift; + my $self = $class->new(@_); + $self->contents($string); + $self->fileName($name) if defined($name); + + # Set the file date to now + $self->setLastModFileDateTimeFromUnix( time() ); + $self->unixFileAttributes( $self->DEFAULT_FILE_PERMISSIONS ); + return $self; +} + +sub _become { + my $self = shift; + my $newClass = shift; + return $self if ref($self) eq $newClass; + delete( $self->{'contents'} ); + return $self->SUPER::_become($newClass); +} + +# Get or set my contents. Note that we do not call the superclass +# version of this, because it calls us. +sub contents { + my $self = shift; + my $string = shift; + if ( defined($string) ) { + $self->{'contents'} = + pack( 'C0a*', ( ref($string) eq 'SCALAR' ) ? $$string : $string ); + $self->{'uncompressedSize'} = $self->{'compressedSize'} = + length( $self->{'contents'} ); + $self->{'compressionMethod'} = COMPRESSION_STORED; + } + return $self->{'contents'}; +} + +# Return bytes read. Note that first parameter is a ref to a buffer. +# my $data; +# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); +sub _readRawChunk { + my ( $self, $dataRef, $chunkSize ) = @_; + $$dataRef = substr( $self->contents(), $self->_readOffset(), $chunkSize ); + return ( length($$dataRef), AZ_OK ); +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Tree.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Tree.pm new file mode 100644 index 0000000..f5823e6 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/Tree.pm @@ -0,0 +1,40 @@ +use Archive::Zip; + +warn( +"Archive::Zip::Tree is deprecated; its methods have been moved into Archive::Zip." +) if $^W; + +1; + +__END__ + +=head1 NAME + +Archive::Zip::Tree - (DEPRECATED) methods for adding/extracting trees using Archive::Zip + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +This module is deprecated, because all its methods were moved into the main +Archive::Zip module. + +It is included in the distribution merely to avoid breaking old code. + +See L. + +=head1 AUTHOR + +Ned Konz, perl@bike-nomad.com + +=head1 COPYRIGHT + +Copyright (c) 2000-2002 Ned Konz. All rights reserved. This program is free +software; you can redistribute it and/or modify it under the same terms +as Perl itself. + +=head1 SEE ALSO + +L + +=cut diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/ZipFileMember.pm b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/ZipFileMember.pm new file mode 100644 index 0000000..76ae23d --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/lib/Archive/Zip/ZipFileMember.pm @@ -0,0 +1,413 @@ +package Archive::Zip::ZipFileMember; + +use strict; +use vars qw( $VERSION @ISA ); + +BEGIN { + $VERSION = '1.18'; + @ISA = qw ( Archive::Zip::FileMember ); +} + +use Archive::Zip qw( + :CONSTANTS + :ERROR_CODES + :PKZIP_CONSTANTS + :UTILITY_METHODS +); + +# Create a new Archive::Zip::ZipFileMember +# given a filename and optional open file handle +# +sub _newFromZipFile { + my $class = shift; + my $fh = shift; + my $externalFileName = shift; + my $possibleEocdOffset = shift; # normally 0 + + my $self = $class->new( + 'crc32' => 0, + 'diskNumberStart' => 0, + 'localHeaderRelativeOffset' => 0, + 'dataOffset' => 0, # localHeaderRelativeOffset + header length + @_ + ); + $self->{'externalFileName'} = $externalFileName; + $self->{'fh'} = $fh; + $self->{'possibleEocdOffset'} = $possibleEocdOffset; + return $self; +} + +sub isDirectory { + my $self = shift; + return ( substr( $self->fileName(), -1, 1 ) eq '/' + and $self->uncompressedSize() == 0 ); +} + +# Seek to the beginning of the local header, just past the signature. +# Verify that the local header signature is in fact correct. +# Update the localHeaderRelativeOffset if necessary by adding the possibleEocdOffset. +# Returns status. + +sub _seekToLocalHeader { + my $self = shift; + my $where = shift; # optional + my $previousWhere = shift; # optional + + $where = $self->localHeaderRelativeOffset() unless defined($where); + + # avoid loop on certain corrupt files (from Julian Field) + return _formatError("corrupt zip file") + if defined($previousWhere) && $where == $previousWhere; + + my $status; + my $signature; + + $status = $self->fh()->seek( $where, IO::Seekable::SEEK_SET ); + return _ioError("seeking to local header") unless $status; + + ( $status, $signature ) = + _readSignature( $self->fh(), $self->externalFileName(), + LOCAL_FILE_HEADER_SIGNATURE ); + return $status if $status == AZ_IO_ERROR; + + # retry with EOCD offset if any was given. + if ( $status == AZ_FORMAT_ERROR && $self->{'possibleEocdOffset'} ) { + $status = $self->_seekToLocalHeader( + $self->localHeaderRelativeOffset() + $self->{'possibleEocdOffset'}, + $where + ); + if ( $status == AZ_OK ) { + $self->{'localHeaderRelativeOffset'} += + $self->{'possibleEocdOffset'}; + $self->{'possibleEocdOffset'} = 0; + } + } + + return $status; +} + +# Because I'm going to delete the file handle, read the local file +# header if the file handle is seekable. If it isn't, I assume that +# I've already read the local header. +# Return ( $status, $self ) + +sub _become { + my $self = shift; + my $newClass = shift; + return $self if ref($self) eq $newClass; + + my $status = AZ_OK; + + if ( _isSeekable( $self->fh() ) ) { + my $here = $self->fh()->tell(); + $status = $self->_seekToLocalHeader(); + $status = $self->_readLocalFileHeader() if $status == AZ_OK; + $self->fh()->seek( $here, IO::Seekable::SEEK_SET ); + return $status unless $status == AZ_OK; + } + + delete( $self->{'eocdCrc32'} ); + delete( $self->{'diskNumberStart'} ); + delete( $self->{'localHeaderRelativeOffset'} ); + delete( $self->{'dataOffset'} ); + + return $self->SUPER::_become($newClass); +} + +sub diskNumberStart { + shift->{'diskNumberStart'}; +} + +sub localHeaderRelativeOffset { + shift->{'localHeaderRelativeOffset'}; +} + +sub dataOffset { + shift->{'dataOffset'}; +} + +# Skip local file header, updating only extra field stuff. +# Assumes that fh is positioned before signature. +sub _skipLocalFileHeader { + my $self = shift; + my $header; + my $bytesRead = $self->fh()->read( $header, LOCAL_FILE_HEADER_LENGTH ); + if ( $bytesRead != LOCAL_FILE_HEADER_LENGTH ) { + return _ioError("reading local file header"); + } + my $fileNameLength; + my $extraFieldLength; + my $bitFlag; + ( + undef, # $self->{'versionNeededToExtract'}, + $bitFlag, + undef, # $self->{'compressionMethod'}, + undef, # $self->{'lastModFileDateTime'}, + undef, # $crc32, + undef, # $compressedSize, + undef, # $uncompressedSize, + $fileNameLength, + $extraFieldLength + ) = unpack( LOCAL_FILE_HEADER_FORMAT, $header ); + + if ($fileNameLength) { + $self->fh()->seek( $fileNameLength, IO::Seekable::SEEK_CUR ) + or return _ioError("skipping local file name"); + } + + if ($extraFieldLength) { + $bytesRead = + $self->fh()->read( $self->{'localExtraField'}, $extraFieldLength ); + if ( $bytesRead != $extraFieldLength ) { + return _ioError("reading local extra field"); + } + } + + $self->{'dataOffset'} = $self->fh()->tell(); + + if ( $bitFlag & GPBF_HAS_DATA_DESCRIPTOR_MASK ) { + + # Read the crc32, compressedSize, and uncompressedSize from the + # extended data descriptor, which directly follows the compressed data. + # + # Skip over the compressed file data (assumes that EOCD compressedSize + # was correct) + $self->fh()->seek( $self->{'compressedSize'}, IO::Seekable::SEEK_CUR ) + or return _ioError("seeking to extended local header"); + + # these values should be set correctly from before. + my $oldCrc32 = $self->{'eocdCrc32'}; + my $oldCompressedSize = $self->{'compressedSize'}; + my $oldUncompressedSize = $self->{'uncompressedSize'}; + + my $status = $self->_readDataDescriptor(); + return $status unless $status == AZ_OK; + + return _formatError( + "CRC or size mismatch while skipping data descriptor") + if ( $oldCrc32 != $self->{'crc32'} + || $oldUncompressedSize != $self->{'uncompressedSize'} ); + } + + return AZ_OK; +} + +# Read from a local file header into myself. Returns AZ_OK if successful. +# Assumes that fh is positioned after signature. +# Note that crc32, compressedSize, and uncompressedSize will be 0 if +# GPBF_HAS_DATA_DESCRIPTOR_MASK is set in the bitFlag. + +sub _readLocalFileHeader { + my $self = shift; + my $header; + my $bytesRead = $self->fh()->read( $header, LOCAL_FILE_HEADER_LENGTH ); + if ( $bytesRead != LOCAL_FILE_HEADER_LENGTH ) { + return _ioError("reading local file header"); + } + my $fileNameLength; + my $crc32; + my $compressedSize; + my $uncompressedSize; + my $extraFieldLength; + ( + $self->{'versionNeededToExtract'}, $self->{'bitFlag'}, + $self->{'compressionMethod'}, $self->{'lastModFileDateTime'}, + $crc32, $compressedSize, + $uncompressedSize, $fileNameLength, + $extraFieldLength + ) = unpack( LOCAL_FILE_HEADER_FORMAT, $header ); + + if ($fileNameLength) { + my $fileName; + $bytesRead = $self->fh()->read( $fileName, $fileNameLength ); + if ( $bytesRead != $fileNameLength ) { + return _ioError("reading local file name"); + } + $self->fileName($fileName); + } + + if ($extraFieldLength) { + $bytesRead = + $self->fh()->read( $self->{'localExtraField'}, $extraFieldLength ); + if ( $bytesRead != $extraFieldLength ) { + return _ioError("reading local extra field"); + } + } + + $self->{'dataOffset'} = $self->fh()->tell(); + + if ( $self->hasDataDescriptor() ) { + + # Read the crc32, compressedSize, and uncompressedSize from the + # extended data descriptor. + # Skip over the compressed file data (assumes that EOCD compressedSize + # was correct) + $self->fh()->seek( $self->{'compressedSize'}, IO::Seekable::SEEK_CUR ) + or return _ioError("seeking to extended local header"); + + my $status = $self->_readDataDescriptor(); + return $status unless $status == AZ_OK; + } + else { + return _formatError( + "CRC or size mismatch after reading data descriptor") + if ( $self->{'crc32'} != $crc32 + || $self->{'uncompressedSize'} != $uncompressedSize ); + } + + return AZ_OK; +} + +# This will read the data descriptor, which is after the end of compressed file +# data in members that that have GPBF_HAS_DATA_DESCRIPTOR_MASK set in their +# bitFlag. +# The only reliable way to find these is to rely on the EOCD compressedSize. +# Assumes that file is positioned immediately after the compressed data. +# Returns status; sets crc32, compressedSize, and uncompressedSize. +sub _readDataDescriptor { + my $self = shift; + my $signatureData; + my $header; + my $crc32; + my $compressedSize; + my $uncompressedSize; + + my $bytesRead = $self->fh()->read( $signatureData, SIGNATURE_LENGTH ); + return _ioError("reading header signature") + if $bytesRead != SIGNATURE_LENGTH; + my $signature = unpack( SIGNATURE_FORMAT, $signatureData ); + + # unfortunately, the signature appears to be optional. + if ( $signature == DATA_DESCRIPTOR_SIGNATURE + && ( $signature != $self->{'crc32'} ) ) + { + $bytesRead = $self->fh()->read( $header, DATA_DESCRIPTOR_LENGTH ); + return _ioError("reading data descriptor") + if $bytesRead != DATA_DESCRIPTOR_LENGTH; + + ( $crc32, $compressedSize, $uncompressedSize ) = + unpack( DATA_DESCRIPTOR_FORMAT, $header ); + } + else { + $bytesRead = + $self->fh()->read( $header, DATA_DESCRIPTOR_LENGTH_NO_SIG ); + return _ioError("reading data descriptor") + if $bytesRead != DATA_DESCRIPTOR_LENGTH_NO_SIG; + + $crc32 = $signature; + ( $compressedSize, $uncompressedSize ) = + unpack( DATA_DESCRIPTOR_FORMAT_NO_SIG, $header ); + } + + $self->{'eocdCrc32'} = $self->{'crc32'} + unless defined( $self->{'eocdCrc32'} ); + $self->{'crc32'} = $crc32; + $self->{'compressedSize'} = $compressedSize; + $self->{'uncompressedSize'} = $uncompressedSize; + + return AZ_OK; +} + +# Read a Central Directory header. Return AZ_OK on success. +# Assumes that fh is positioned right after the signature. + +sub _readCentralDirectoryFileHeader { + my $self = shift; + my $fh = $self->fh(); + my $header = ''; + my $bytesRead = $fh->read( $header, CENTRAL_DIRECTORY_FILE_HEADER_LENGTH ); + if ( $bytesRead != CENTRAL_DIRECTORY_FILE_HEADER_LENGTH ) { + return _ioError("reading central dir header"); + } + my ( $fileNameLength, $extraFieldLength, $fileCommentLength ); + ( + $self->{'versionMadeBy'}, + $self->{'fileAttributeFormat'}, + $self->{'versionNeededToExtract'}, + $self->{'bitFlag'}, + $self->{'compressionMethod'}, + $self->{'lastModFileDateTime'}, + $self->{'crc32'}, + $self->{'compressedSize'}, + $self->{'uncompressedSize'}, + $fileNameLength, + $extraFieldLength, + $fileCommentLength, + $self->{'diskNumberStart'}, + $self->{'internalFileAttributes'}, + $self->{'externalFileAttributes'}, + $self->{'localHeaderRelativeOffset'} + ) = unpack( CENTRAL_DIRECTORY_FILE_HEADER_FORMAT, $header ); + + $self->{'eocdCrc32'} = $self->{'crc32'}; + + if ($fileNameLength) { + $bytesRead = $fh->read( $self->{'fileName'}, $fileNameLength ); + if ( $bytesRead != $fileNameLength ) { + _ioError("reading central dir filename"); + } + } + if ($extraFieldLength) { + $bytesRead = $fh->read( $self->{'cdExtraField'}, $extraFieldLength ); + if ( $bytesRead != $extraFieldLength ) { + return _ioError("reading central dir extra field"); + } + } + if ($fileCommentLength) { + $bytesRead = $fh->read( $self->{'fileComment'}, $fileCommentLength ); + if ( $bytesRead != $fileCommentLength ) { + return _ioError("reading central dir file comment"); + } + } + + # NK 10/21/04: added to avoid problems with manipulated headers + if ( $self->{'uncompressedSize'} != $self->{'compressedSize'} + and $self->{'compressionMethod'} == COMPRESSION_STORED ) + { + $self->{'uncompressedSize'} = $self->{'compressedSize'}; + } + + $self->desiredCompressionMethod( $self->compressionMethod() ); + + return AZ_OK; +} + +sub rewindData { + my $self = shift; + + my $status = $self->SUPER::rewindData(@_); + return $status unless $status == AZ_OK; + + return AZ_IO_ERROR unless $self->fh(); + + $self->fh()->clearerr(); + + # Seek to local file header. + # The only reason that I'm doing this this way is that the extraField + # length seems to be different between the CD header and the LF header. + $status = $self->_seekToLocalHeader(); + return $status unless $status == AZ_OK; + + # skip local file header + $status = $self->_skipLocalFileHeader(); + return $status unless $status == AZ_OK; + + # Seek to beginning of file data + $self->fh()->seek( $self->dataOffset(), IO::Seekable::SEEK_SET ) + or return _ioError("seeking to beginning of file data"); + + return AZ_OK; +} + +# Return bytes read. Note that first parameter is a ref to a buffer. +# my $data; +# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); +sub _readRawChunk { + my ( $self, $dataRef, $chunkSize ) = @_; + return ( 0, AZ_OK ) unless $chunkSize; + my $bytesRead = $self->fh()->read( $$dataRef, $chunkSize ) + or return ( 0, _ioError("reading data") ); + return ( $bytesRead, AZ_OK ); +} + +1; diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/01_compile.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/01_compile.t new file mode 100644 index 0000000..211ca27 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/01_compile.t @@ -0,0 +1,6 @@ +#!/usr/bin/perl -w + +use Test::More tests => 2; + +use_ok( 'Archive::Zip' ); +use_ok( 'Archive::Zip::MemberRead' ); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/02_main.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/02_main.t new file mode 100644 index 0000000..1db27e3 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/02_main.t @@ -0,0 +1,581 @@ +#!/usr/bin/perl -w + +# Main testing for Archive::Zip + +use strict; +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); +use FileHandle; +use File::Path; +use File::Spec; + +use Test::More tests => 141; + +BEGIN { + unshift @INC, "t/"; + require( File::Spec->catfile('t', 'common.pl') ) + or die "Can't load t/common.pl"; +} + + + + + +##################################################################### +# Testing Utility Functions + +#--------- check CRC +is(TESTSTRINGCRC, 0xac373f32, 'Testing CRC matches expected'); + +# Bad times die +SCOPE: { + my @errors = (); + local $Archive::Zip::ErrorHandler = sub { push @errors, @_ }; + eval { Archive::Zip::Member::_unixToDosTime( 0 ) }; + ok( $errors[0] =~ /Tried to add member with zero or undef/, + 'Got expected _unixToDosTime error' ); +} + +#--------- check time conversion + +foreach my $unix_time ( + 315576062, 315576064, 315580000, 315600000, + 316000000, 320000000, 400000000, 500000000, + 600000000, 700000000, 800000000, 900000000, + 1000000000, 1100000000, 1200000000, + int(time()/2)*2, +) { + my $dos_time = Archive::Zip::Member::_unixToDosTime( $unix_time ); + my $round_trip = Archive::Zip::Member::_dosToUnixTime( $dos_time ); + is( $unix_time, $round_trip, 'Got expected DOS DateTime value' ); +} + + + + + +##################################################################### +# Testing Archives + +#--------- empty file +# new # Archive::Zip +# new # Archive::Zip::Archive +my $zip = Archive::Zip->new(); +isa_ok( $zip, 'Archive::Zip' ); + +# members # Archive::Zip::Archive +my @members = $zip->members; +is(scalar(@members), 0, '->members is 0' ); + +# numberOfMembers # Archive::Zip::Archive +my $numberOfMembers = $zip->numberOfMembers(); +is($numberOfMembers, 0, '->numberofMembers is 0' ); + +# writeToFileNamed # Archive::Zip::Archive +my $status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK, '->writeToFileNames ok' ); + +my $zipout; +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + if ( $^O eq 'MSWin32' ) { + print STDERR "\n# You might see an expected 'zipfile is empty' warning now.\n"; + } + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + ok( $status != 0 ); +} +# unzip -t returns error code=1 for warning on empty + +#--------- add a directory +my $memberName = TESTDIR . '/'; +my $dirName = TESTDIR; + +# addDirectory # Archive::Zip::Archive +# new # Archive::Zip::Member +my $member = $zip->addDirectory($memberName); +ok(defined($member)); +is($member->fileName(), $memberName); + +# On some (Windows systems) the modification time is +# corrupted. Save this to check late. +my $dir_time = $member->lastModFileDateTime(); + +# members # Archive::Zip::Archive +@members = $zip->members(); +is(scalar(@members), 1); +is($members[0], $member); + +# numberOfMembers # Archive::Zip::Archive +$numberOfMembers = $zip->numberOfMembers(); +is($numberOfMembers, 1); + +# writeToFileNamed # Archive::Zip::Archive +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +# Does the modification time get corrupted? +is( ($zip->members)[0]->lastModFileDateTime(), $dir_time ); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- extract the directory by name +rmtree([ TESTDIR ], 0, 0); +$status = $zip->extractMember($memberName); +is($status, AZ_OK); +ok(-d $dirName); + +#--------- extract the directory by identity +ok(rmdir($dirName)); # it's still empty +$status = $zip->extractMember($member); +is($status, AZ_OK); +ok(-d $dirName); + +#--------- add a string member, uncompressed +$memberName = TESTDIR . '/string.txt'; +# addString # Archive::Zip::Archive +# newFromString # Archive::Zip::Member +$member = $zip->addString(TESTSTRING, $memberName); +ok(defined($member)); + +is($member->fileName(), $memberName); + +# members # Archive::Zip::Archive +@members = $zip->members(); +is(scalar(@members), 2); +is($members[1], $member); + +# numberOfMembers # Archive::Zip::Archive +$numberOfMembers = $zip->numberOfMembers(); +is($numberOfMembers, 2); + +# writeToFileNamed # Archive::Zip::Archive +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +is($member->crc32(), TESTSTRINGCRC); + +is($member->crc32String(), sprintf("%08x", TESTSTRINGCRC)); + +#--------- extract it by name +$status = $zip->extractMember($memberName); +is($status, AZ_OK); +ok(-f $memberName); +is(fileCRC($memberName), TESTSTRINGCRC); + +#--------- now compress it and re-test +my $oldCompressionMethod = + $member->desiredCompressionMethod(COMPRESSION_DEFLATED); +is($oldCompressionMethod, COMPRESSION_STORED, 'old compression method OK'); + +# writeToFileNamed # Archive::Zip::Archive +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK, 'writeToFileNamed returns AZ_OK'); +is($member->crc32(), TESTSTRINGCRC); +is($member->uncompressedSize(), TESTSTRINGLENGTH); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- extract it by name +$status = $zip->extractMember($memberName); +is($status, AZ_OK); +ok(-f $memberName); +is(fileCRC($memberName), TESTSTRINGCRC); + +#--------- add a file member, compressed +ok(rename($memberName, TESTDIR . '/file.txt')); +$memberName = TESTDIR . '/file.txt'; + +# addFile # Archive::Zip::Archive +# newFromFile # Archive::Zip::Member +$member = $zip->addFile($memberName); +ok(defined($member)); + +is($member->desiredCompressionMethod(), COMPRESSION_DEFLATED); + +# writeToFileNamed # Archive::Zip::Archive +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); +is($member->crc32(), TESTSTRINGCRC); +is($member->uncompressedSize(), TESTSTRINGLENGTH); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- extract it by name (note we have to rename it first +#--------- or we will clobber the original file +my $newName = $memberName; +$newName =~ s/\.txt/2.txt/; +$status = $zip->extractMember($memberName, $newName); +is($status, AZ_OK); +ok(-f $newName); +is(fileCRC($newName), TESTSTRINGCRC); + +#--------- now make it uncompressed and re-test +$oldCompressionMethod = + $member->desiredCompressionMethod(COMPRESSION_STORED); + +is($oldCompressionMethod, COMPRESSION_DEFLATED); + +# writeToFileNamed # Archive::Zip::Archive +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); +is($member->crc32(), TESTSTRINGCRC); +is($member->uncompressedSize(), TESTSTRINGLENGTH); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- extract it by name +$status = $zip->extractMember($memberName, $newName); +is($status, AZ_OK); +ok(-f $newName); +is(fileCRC($newName), TESTSTRINGCRC); + +# Now, the contents of OUTPUTZIP are: +# Length Method Size Ratio Date Time CRC-32 Name +#-------- ------ ------- ----- ---- ---- ------ ---- +# 0 Stored 0 0% 03-17-00 11:16 00000000 testDir/ +# 300 Defl:N 146 51% 03-17-00 11:16 ac373f32 testDir/string.txt +# 300 Stored 300 0% 03-17-00 11:16 ac373f32 testDir/file.txt +#-------- ------- --- ------- +# 600 446 26% 3 files + +# members # Archive::Zip::Archive +@members = $zip->members(); +is(scalar(@members), 3); +is($members[2], $member); + +# memberNames # Archive::Zip::Archive +my @memberNames = $zip->memberNames(); +is(scalar(@memberNames), 3); +is($memberNames[2], $memberName); + +# memberNamed # Archive::Zip::Archive +is($zip->memberNamed($memberName), $member); + +# membersMatching # Archive::Zip::Archive +@members = $zip->membersMatching('file'); +is(scalar(@members), 1); +is($members[0], $member); + +@members = $zip->membersMatching('.txt$'); +is(scalar(@members), 2); +is($members[1], $member); + +#--------- remove the string member and test the file +# removeMember # Archive::Zip::Archive +$member = $zip->removeMember($members[0]); +is($member, $members[0]); + +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- add the string member at the end and test the file +# addMember # Archive::Zip::Archive +$zip->addMember($member); +@members = $zip->members(); + +is(scalar(@members), 3); +is($members[2], $member); + +# memberNames # Archive::Zip::Archive +@memberNames = $zip->memberNames(); +is(scalar(@memberNames), 3); +is($memberNames[1], $memberName); + +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- remove the file member +$member = $zip->removeMember($members[1]); +is($member, $members[1]); +is($zip->numberOfMembers(), 2); + +#--------- replace the string member with the file member +# replaceMember # Archive::Zip::Archive +$member = $zip->replaceMember($members[2], $member); +is($member, $members[2]); +is($zip->numberOfMembers(), 2); + +#--------- re-add the string member +$zip->addMember($member); +is($zip->numberOfMembers(), 3); + +@members = $zip->members(); +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- add compressed file +$member = $zip->addFile(File::Spec->catfile(TESTDIR, 'file.txt')); +ok(defined($member)); +$member->desiredCompressionMethod(COMPRESSION_DEFLATED); +$member->fileName(TESTDIR . '/fileC.txt'); + +#--------- add uncompressed string +$member = $zip->addString(TESTSTRING, TESTDIR . '/stringU.txt'); +ok(defined($member)); +$member->desiredCompressionMethod(COMPRESSION_STORED); + +# Now, the file looks like this: +# Length Method Size Ratio Date Time CRC-32 Name +#-------- ------ ------- ----- ---- ---- ------ ---- +# 0 Stored 0 0% 03-17-00 12:30 00000000 testDir/ +# 300 Stored 300 0% 03-17-00 12:30 ac373f32 testDir/file.txt +# 300 Defl:N 146 51% 03-17-00 12:30 ac373f32 testDir/string.txt +# 300 Stored 300 0% 03-17-00 12:30 ac373f32 testDir/stringU.txt +# 300 Defl:N 146 51% 03-17-00 12:30 ac373f32 testDir/fileC.txt +#-------- ------- --- ------- +# 1200 892 26% 5 files + +@members = $zip->members(); +$numberOfMembers = $zip->numberOfMembers(); +is($numberOfMembers, 5); + +#--------- make sure the contents of the stored file member are OK. +# contents # Archive::Zip::Archive +is($zip->contents($members[1]), TESTSTRING); + +# contents # Archive::Zip::Member +is($members[1]->contents(), TESTSTRING); + +#--------- make sure the contents of the compressed string member are OK. +is($members[2]->contents(), TESTSTRING); + +#--------- make sure the contents of the stored string member are OK. +is($members[3]->contents(), TESTSTRING); + +#--------- make sure the contents of the compressed file member are OK. +is($members[4]->contents(), TESTSTRING); + +#--------- write to INPUTZIP +$status = $zip->writeToFileNamed( INPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(INPUTZIP); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- read from INPUTZIP (appending its entries) +# read # Archive::Zip::Archive +$status = $zip->read(INPUTZIP); +is($status, AZ_OK); +is($zip->numberOfMembers(), 10); + +#--------- clean up duplicate names +@members = $zip->members(); +$member = $zip->removeMember($members[5]); +is($member->fileName(), TESTDIR . '/'); + +SCOPE: { + for my $i (6..9) + { + $memberName = $members[$i]->fileName(); + $memberName =~ s/\.txt/2.txt/; + $members[$i]->fileName($memberName); + } +} +is(scalar($zip->membersMatching('2.txt')), 4); + +#--------- write zip out and test it. +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- Make sure that we haven't renamed files (this happened!) +is(scalar($zip->membersMatching('2\.txt$')), 4); + +#--------- Now try extracting everyone +@members = $zip->members(); +is($zip->extractMember($members[0]), AZ_OK); #DM +is($zip->extractMember($members[1]), AZ_OK); #NFM +is($zip->extractMember($members[2]), AZ_OK); +is($zip->extractMember($members[3]), AZ_OK); #NFM +is($zip->extractMember($members[4]), AZ_OK); +is($zip->extractMember($members[5]), AZ_OK); +is($zip->extractMember($members[6]), AZ_OK); +is($zip->extractMember($members[7]), AZ_OK); +is($zip->extractMember($members[8]), AZ_OK); + +#--------- count dirs +{ + my @dirs = grep { $_->isDirectory() } @members; + is(scalar(@dirs), 1); + is($dirs[0], $members[0]); +} + +#--------- count binary and text files +{ + my @binaryFiles = grep { $_->isBinaryFile() } @members; + my @textFiles = grep { $_->isTextFile() } @members; + is(scalar(@binaryFiles), 5); + is(scalar(@textFiles), 4); +} + +#--------- Try writing zip file to file handle +{ + my $fh; + if ($catWorks) + { + unlink( OUTPUTZIP ); + $fh = FileHandle->new( CATPIPE . OUTPUTZIP ); + binmode($fh); + } + SKIP: { + skip('cat does not work on this platform', 1) unless $catWorks; + ok( $fh ); + } +# $status = $zip->writeToFileHandle($fh, 0) if ($catWorks); + $status = $zip->writeToFileHandle($fh) if ($catWorks); + SKIP: { + skip('cat does not work on this platform', 1) unless $catWorks; + is( $status, AZ_OK ); + } + $fh->close() if ($catWorks); + SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + is($status, 0); + } +} + +#--------- Change the contents of a string member +is(ref($members[2]), 'Archive::Zip::StringMember'); +$members[2]->contents( "This is my new contents\n" ); + +#--------- write zip out and test it. +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- Change the contents of a file member +is(ref($members[1]), 'Archive::Zip::NewFileMember'); +$members[1]->contents( "This is my new contents\n" ); + +#--------- write zip out and test it. +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + +#--------- Change the contents of a zip member + +is(ref($members[7]), 'Archive::Zip::ZipFileMember'); +$members[7]->contents( "This is my new contents\n" ); + +#--------- write zip out and test it. +$status = $zip->writeToFileNamed( OUTPUTZIP ); +is($status, AZ_OK); + +SKIP: { + skip( "No 'unzip' program to test against", 1 ) unless HAVEUNZIP; + ($status, $zipout) = testZip(); + # STDERR->print("status= $status, out=$zipout\n"); + skip( "test zip doesn't work", 1 ) if $testZipDoesntWork; + is( $status, 0 ); +} + + +#--------- now clean up +# END { system("rm -rf " . TESTDIR . " " . OUTPUTZIP . " " . INPUTZIP) } + +#--------------------- STILL UNTESTED IN THIS SCRIPT --------------------- + +# sub setChunkSize # Archive::Zip +# sub _formatError # Archive::Zip +# sub _error # Archive::Zip +# sub _subclassResponsibility # Archive::Zip +# sub diskNumber # Archive::Zip::Archive +# sub diskNumberWithStartOfCentralDirectory # Archive::Zip::Archive +# sub numberOfCentralDirectoriesOnThisDisk # Archive::Zip::Archive +# sub numberOfCentralDirectories # Archive::Zip::Archive +# sub centralDirectoryOffsetWRTStartingDiskNumber # Archive::Zip::Archive +# sub extraField # Archive::Zip::Member +# sub isEncrypted # Archive::Zip::Member +# sub isTextFile # Archive::Zip::Member +# sub isBinaryFile # Archive::Zip::Member +# sub isDirectory # Archive::Zip::Member +# sub lastModTime # Archive::Zip::Member +# sub _writeDataDescriptor # Archive::Zip::Member +# sub isDirectory # Archive::Zip::DirectoryMember +# sub _becomeDirectory # Archive::Zip::DirectoryMember +# sub diskNumberStart # Archive::Zip::ZipFileMember diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/03_ex.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/03_ex.t new file mode 100644 index 0000000..3161c75 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/03_ex.t @@ -0,0 +1,83 @@ +#!/usr/bin/perl -w + +use strict; +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); +use File::Spec; +use IO::File; + +use Test::More tests => 17; +BEGIN { + unshift @INC, "t/"; + require( File::Spec->catfile('t', 'common.pl') ) + or die "Can't load t/common.pl"; +} + +sub runPerlCommand +{ + my $libs = join ( ' -I', @INC ); + my $cmd = "\"$^X\" \"-I$libs\" -w \"". join('" "', @_). '"'; + my $output = `$cmd`; + return wantarray ? ( $?, $output ) : $?; +} + +use constant FILENAME => File::Spec->catpath( '', TESTDIR, 'testing.txt' ); +use constant ZFILENAME => TESTDIR . "/testing.txt"; # name in zip + +my $zip = Archive::Zip->new(); +isa_ok( $zip, 'Archive::Zip' ); +$zip->addString( TESTSTRING, FILENAME ); +$zip->writeToFileNamed(INPUTZIP); + +my ( $status, $output ); +my $fh = IO::File->new( "test.log", "w" ); +isa_ok( $fh, 'IO::File' ); + +is( runPerlCommand( 'examples/copy.pl', INPUTZIP, OUTPUTZIP ), 0 ); + +is( runPerlCommand( 'examples/extract.pl', OUTPUTZIP, ZFILENAME ), 0 ); + +is( runPerlCommand( 'examples/mfh.pl', INPUTZIP ), 0 ); + +is( runPerlCommand( 'examples/zip.pl', OUTPUTZIP, INPUTZIP, FILENAME ), 0 ); + +( $status, $output ) = runPerlCommand( 'examples/zipinfo.pl', INPUTZIP ); +is( $status, 0 ); +$fh->print("zipinfo output:\n"); +$fh->print($output); + +( $status, $output ) = runPerlCommand( 'examples/ziptest.pl', INPUTZIP ); +is( $status, 0 ); +$fh->print("ziptest output:\n"); +$fh->print($output); + +( $status, $output ) = runPerlCommand( 'examples/zipGrep.pl', '100', INPUTZIP ); +is( $status, 0 ); +is( $output, ZFILENAME . ":100\n" ); + +# calcSizes.pl +# creates test.zip, may be sensitive to /dev/null + +# removed because requires IO::Scalar +# ok( runPerlCommand('examples/readScalar.pl'), 0 ); + +unlink(OUTPUTZIP); +is( runPerlCommand( 'examples/selfex.pl', OUTPUTZIP, FILENAME ), 0 ); +unlink(FILENAME); +is( runPerlCommand(OUTPUTZIP), 0 ); +my $fn = + File::Spec->catpath( '', File::Spec->catdir( 'extracted', TESTDIR ), + 'testing.txt' ); +is( -f $fn, 1, "$fn exists" ); + +# unzipAll.pl +# updateZip.pl +# writeScalar.pl +# zipcheck.pl +# ziprecent.pl + +unlink(OUTPUTZIP); +is( runPerlCommand( 'examples/updateTree.pl', OUTPUTZIP, TESTDIR ), 0, "updateTree.pl create" ); +is( -f OUTPUTZIP, 1, "zip created" ); +is( runPerlCommand( 'examples/updateTree.pl', OUTPUTZIP, TESTDIR ), 0, "updateTree.pl update" ); +is( -f OUTPUTZIP, 1, "zip updated" ); +unlink(OUTPUTZIP); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/04_readmember.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/04_readmember.t new file mode 100644 index 0000000..16a2021 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/04_readmember.t @@ -0,0 +1,51 @@ +#!/usr/bin/perl -w + +use strict; +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); +use Archive::Zip::MemberRead; + +use Test::More tests => 8; +BEGIN { + unshift @INC, "t/"; + require( File::Spec->catfile('t', 'common.pl') ) + or die "Can't load t/common.pl"; +} + +use constant FILENAME => File::Spec->catfile(TESTDIR, 'member_read.zip'); + +my ($zip, $member, $fh, @data); +$zip = new Archive::Zip; +isa_ok( $zip, 'Archive::Zip' ); +@data = ( 'Line 1', 'Line 2', '', 'Line 3', 'Line 4' ); + +$zip->addString(join("\n", @data), 'string.txt'); +$zip->writeToFileNamed(FILENAME); + +$member = $zip->memberNamed('string.txt'); +$fh = $member->readFileHandle(); +ok( $fh ); + +my ($line, $not_ok, $ret, $buffer); +while (defined($line = $fh->getline())) +{ + $not_ok = 1 if ($line ne $data[$fh->input_line_number()-1]); +} +ok( !$not_ok ); + +$fh->rewind(); +$ret = $fh->read($buffer, length($data[0])); +ok( $ret == length($data[0]) ); +ok( $buffer eq $data[0] ); +$fh->close(); + +# +# Different usages +# +$fh = new Archive::Zip::MemberRead($zip, 'string.txt'); +ok($fh); + +$fh = new Archive::Zip::MemberRead($zip, $zip->memberNamed('string.txt')); +ok($fh); + +$fh = new Archive::Zip::MemberRead($zip->memberNamed('string.txt')); +ok($fh); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/05_tree.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/05_tree.t new file mode 100644 index 0000000..6af7963 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/05_tree.t @@ -0,0 +1,41 @@ +#!/usr/bin/perl -w + +use strict; +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); +use FileHandle; +use File::Spec; + +use Test::More tests =>6; +BEGIN { + unshift @INC, "t/"; + require( File::Spec->catfile('t', 'common.pl') ) + or die "Can't load t/common.pl"; +} + +use constant FILENAME => File::Spec->catfile(TESTDIR, 'testing.txt'); + +my $zip; +my @memberNames; + +sub makeZip +{ + my ($src, $dest, $pred) = @_; + $zip = Archive::Zip->new(); + $zip->addTree($src, $dest, $pred); + @memberNames = $zip->memberNames(); +} + +sub makeZipAndLookFor +{ + my ($src, $dest, $pred, $lookFor) = @_; + makeZip($src, $dest, $pred); + ok( @memberNames ); + ok( (grep { $_ eq $lookFor } @memberNames) == 1 ) + or print STDERR "Can't find $lookFor in (" . join(",", @memberNames) . ")\n"; +} + +my ($testFileVolume, $testFileDirs, $testFileName) = File::Spec->splitpath($0); + +makeZipAndLookFor('.', '', sub { print "file $_\n"; -f && /\.t$/ }, 't/02_main.t' ); +makeZipAndLookFor('.', 'e/', sub { -f && /\.t$/ }, 'e/t/02_main.t'); +makeZipAndLookFor('./t', '', sub { -f && /\.t$/ }, '02_main.t' ); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/06_update.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/06_update.t new file mode 100644 index 0000000..f906489 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/06_update.t @@ -0,0 +1,60 @@ +#!/usr/bin/perl -w + +# Test Archive::Zip updating + +use strict; +use File::Spec (); +use IO::File (); +use File::Find (); +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); + +use Test::More tests => 12; +BEGIN { + unshift @INC, "t/"; + require( File::Spec->catfile('t', 'common.pl') ) + or die "Can't load t/common.pl"; +} + +my ($testFileVolume, $testFileDirs, $testFileName) = File::Spec->splitpath($0); + +my $zip = Archive::Zip->new(); +my $testDir = File::Spec->catpath( $testFileVolume, $testFileDirs, '' ); + +my $numberOfMembers = 0; +my @memberNames; +sub countMembers { unless ($_ eq '.') + { push(@memberNames, $_); $numberOfMembers++; } }; +File::Find::find( \&countMembers, $testDir ); +is( $numberOfMembers > 1, 1, 'not enough members to test'); + +# an initial updateTree() should act like an addTree() +is( $zip->updateTree( $testDir ), AZ_OK, 'initial updateTree failed' ); +is( scalar($zip->members()), $numberOfMembers, 'wrong number of members after create' ); + +my $firstFile = $memberNames[0]; +my $firstMember = ($zip->members())[0]; + +is( $firstFile, $firstMember->fileName(), 'member name wrong'); + +# add a file to the directory +$testFileName = File::Spec->catpath( $testFileVolume, $testFileDirs, 'xxxxxx' ); +my $fh = IO::File->new( $testFileName, 'w'); +$fh->print('xxxx'); +undef($fh); +is( -f $testFileName, 1, "creating $testFileName failed"); + +# Then update it. It should be added. +is( $zip->updateTree( $testDir ), AZ_OK, 'updateTree failed' ); +is( scalar($zip->members()), $numberOfMembers + 1, 'wrong number of members after update' ); + +# Delete the file. +unlink($testFileName); +is( -f $testFileName, undef, "deleting $testFileName failed"); + +# updating without the mirror option should keep the members +is( $zip->updateTree( $testDir ), AZ_OK, 'updateTree failed' ); +is( scalar($zip->members()), $numberOfMembers + 1, 'wrong number of members after update' ); + +# now try again with the mirror option; should delete the last file. +is( $zip->updateTree( $testDir, undef, undef, 1 ), AZ_OK, 'updateTree failed' ); +is( scalar($zip->members()), $numberOfMembers, 'wrong number of members after mirror' ); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/99_author.t b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/99_author.t new file mode 100644 index 0000000..1ec6105 --- /dev/null +++ b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/99_author.t @@ -0,0 +1,61 @@ +#!/usr/bin/perl -w + +use strict; +BEGIN { + $| = 1; + $^W = 1; +} +use Test::More; + +# Skip if doing a regular install +unless ( $ENV{AUTOMATED_TESTING} ) { + plan( skip_all => "Author tests not required for installation" ); +} + +# Can we run the POD tests? +eval "use Test::Pod 1.00"; +if ( $@ ) { + plan( skip_all => "Test::Pod 1.00 required for testing POD" ); +} + + + + + +##################################################################### +# WARNING: INSANE BLACK MAGIC +##################################################################### + +# Hack Pod::Simple::BlackBox to ignore the Test::Inline +# "Extended Begin" syntax. +# For example, "=begin has more than one word errors" +my $begin = \&Pod::Simple::BlackBox::_ponder_begin; +sub mybegin { + my $para = $_[1]; + my $content = join ' ', splice @$para, 2; + $content =~ s/^\s+//s; + $content =~ s/\s+$//s; + my @words = split /\s+/, $content; + if ( $words[0] =~ /^test(?:ing)?\z/s ) { + foreach ( 2 .. $#$para ) { + $para->[$_] = ''; + } + $para->[2] = $words[0]; + } + + # Continue as normal + push @$para, @words; + return &$begin(@_); +} + +SCOPE: { + local $^W = 0; + *Pod::Simple::BlackBox::_ponder_begin = \&mybegin; +} + +##################################################################### +# END BLACK MAGIC +##################################################################### + +# Test POD +all_pod_files_ok(); diff --git a/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/badjpeg/expected.jpg b/dev/i386/libarchive-zip-perl/libarchive-zip-perl-1.18/t/badjpeg/expected.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0b362db828948180df9bedf2e4d80e6113c4d3c4 GIT binary patch literal 56897 zcmeFXWn5g%(l0u=ySokU?(Xhx!F6!g5Zv7*!6kv<5*ZH{qO3kUNzO-YxUHxAD16LgD{ok6y-orP*9*|-~)QxVtkPGbFc-0 z6cw33h#(LM34{R!4T1+y0Kk|4#s|vh0AoYJfS`c#iHV`$ewVKRO!6030hr;h4m5zd z09#z3tOpne`hVCuM8p2J9R%bjz%8XMTwGoLTq!kNeQi9n?OnYnwPkpCIRK4+2yphd z)juT{2M3=J2aga3KP4xZ5I46F4?l$BLn>3jn023dy3JM?G?b30KfcO0tM*FFY~|kDqs>G z00JC98wSJ%NK=3sG=QH*^#s5$fAJ-NVF64H$bSL&spV-lO8|=SfCUkNRRD|t;HR1G z3}8gS;>in=NDN^9L;v<90+6Etax*|)24Kv;Iv`LOpb7)%fk31{$JhWS1uz?caR3ac zf@}dy_|zltbpbFDAP3-YCjEZ6TlB(e1F?K{i4T5sNa$& zyC=f<-4B!mu!ch)A8(|q@DE_jf%rW>{%-z#dBT*)lurZlrylwk`UIdsRrq_LH-Ch{ zRR-Yaz}kKJdmR2H{x1Lu2psiYw*|BsfOg9pUd z!o!AA&&I>k!PSM5la1rw*ZMzt|6TbM-zRbc#`Y=hPxLg_PfwbE2n>KHJySsENpIsR z_y9cu^jr3~{zv-1zw!Z1^neZQ|Bb%=-?sln@5upRdOykG03BkWng{rT1dMe*Ab-M7 zragcC^9M@iry&Ojm@>Z!81nyx5&_xMs`;PkAJxf!z+Z)b`ncixWA`*~QvjVLfD-_I z!cQCz@RKYZ;8cLA{@U+P6=(j>_j-CuAc3Ake}=+@y8s=6SU?28OgsE9*SW{1&mT)x z(9`E><^6~LM1b=5*h2#=@#*sq(fX4gaA(5qNq&L;qgWT7m)q`nR_v=AQ@V zb0AvKfAMEv{{E&xB+%9q&_)1N0majk@QL9;Fn{+cPb=-8y^IjBH2&GkNCEiY_cBn> zf8G$6IKW;0;<3MvoPTyC|CCQR{15#n0{@A?ed4k|B1kVBJiIG{3inc|BJxm z^5YsP0)zw)j|dNkgouEMjD&=OhL3@Uii$>xgNKPvMMgtSMM_BlX5?W3({s|3Q?QD% za`N#D2?=_QAT$7iZeB@gS$RceRdr2cQ*%peTYJa5_XC4N!y}_(y zws&^-_74t^&M&@SUS0pVxxK>zT!w~)g@HwQav2KR7ho7HSU4(9cx*{c1PgZ@YOXLu zT&dLJhJGX(ZmlysOOF|3d@#=z?fH|}zn%U+^ZCX9C#V1A^S@kvTm_-R0RPLdV6Z^q zpyTGBYs&XRS61!GA0zouF_E@K0xrMm8OF?7XGdjm5Sb2t5rpYod@1_%NS!rdL+tL; zr*rxj?>8rXK5AsHtCRUxYmW#ej%ANFv^*bS&ys26egsi6I?P!M8|=6AlHEiN?-@HO zZbb>047W#Mg9J`rD(%vpSH{|z)AAbU%!Eea>~0?>Xa%^|*Fo%OOdNX%7hK=g?X_DM z(Iy9#pQm`v?{&oc8ByREcQy2EwopnJ*zJ)Wmesu>5X)Lg5`tNZ!}uvEw%r0l41YqX z?@!9jjg@>}i7V{072VDQMP!D4!XfhP>Q%kI2!q&H65goiQwbBivrOGH`eKQ;(ZsdF~qbzeq9Oly=PKk1$LtEbc38W7JM(cXIzUHZn)IB z`-Iwk<;9)jT}DO`h<*j+Rf=%3K16&M!&jA+#uftoI^QI$F^viwf!(LzI0$A${@%{H zv0N0Yls25w@6oqk37>Z?_>9^+N$j`@{2*9CwI(sF|58gxizD7mE1GC@L`i~%Y@C=# zC&5ePfoGGA-}2jFfzLMXpxkI#HtGN=v@pemLoQ{6MoqVZh}~rcRod+fe$K8SD^1g>9Gj(&Sn7ngpTcd**Dd-nn{`52Wc(52c(I{F zuD`cF6di)Gr)t6Qy==2^DOc%d@UU7n%VI$E3c&~egcIDV@tk4LwYTa@`&X|aE*JY_ z26fi0>R0vzyF|w$OT66zQ(0re*z4MhpX8lBE4X;|!Z>CvEzU}dEV=VIQBvhf2vS5_lILXR(T|`@X;n7xZFnf<@c0iQE7x{q(B1 zzi+k2@e$M;epNwLe%)#+C&WlLby?AOB^sGtfGupS0;xt1R44c70iEqlSPqN(`*4GYE zr!2O9+Ao!gQ0Y7fm@LZ2wk)4s-a@`PQzv`5;EhelDP?XH3FEBRAZw*5@4YY4S=e;- z_7&u5`)U3B-ATObc()>1Q(o{O<{&NuWN6iX;Vlj21W=~DwK*|nxkiN(~!X){NXofanC_Zk@g`C(G z$b$x^;Pd><`nxj)ivuTaY3`w=^hCIa;Rln>D9Qfu@2OKtpRML=*;%w`Ge-@fGYTwX zr=-J@9X~~6t_GM_XL_9!T^~5)FPEoAEk?A8={qNd7vJqX@EV2%uKQ>{gckaIcYf&^ zp0(uUWY1D&P2SU`M|;=IbsOUrKV@rQbSF*W%Ds+g?P2`@Bj}J9*;O-rIxK z#g`RLynAWvq}vwUct|(T!f$3t60fHZn$5BLDPk7CO*a}7#WJizbIvu*; ztzX}rcg5&PSFT|Rca&;w9Lo_ey7wk|Le87L#Xd5w@%)V6a)KNb4Luw zb-uCI>%t#eG4sjQRo-ZvZ`g{ET)vVxjO3)l%iWP*nM}NHI-)DQR85@QjUq|DMKppF z;rJf#2$D7}tc<(-=@#z*-YFi|20sMZoxQQ$4y+7Jlv7vcwbG)9$xcK{QYHSj6#!4A z+nsEFXe1=oh@+t@g`zw`mpby&KZUp!CjW0we4wRPe5A3hXwD;4p4>BfLTgL!~!M+EE9yFVL-1P=G7$s&u^ z)*xh!52qHi^d-zeKo0f{k9+1}9PdR}#E55Qbx?S>Sg+BJh(r0R z13QHG1ro#>231a~fK4a$m*K{#K3OidV26dFPL7)T50bZA$2w)^IZ>qHmz2{~GaET; zY$*Ic7UIPBgyt~~#`B)%A;CyYwikTA6g@WhIq8)am^-oYJ>Hl&tuoJJgr0DJZnmto z5xsBKKg9kKl%)ouKL{W`@G)9F{z}N|)zginR_qR;N|L(%fI%tK6#}dK(>T?w(_E`y z|7T5&{Govw{(=+1{3=&ZvYc7mDt^DyLdAFErgA}Z{_{#W+~i=@7+-klt|o1&7)SH_=6ujR`ZhmXt%^omi-^Z=!xzJ9A|^bR5R3c{`tuijzZ)#CGBk?J-jkmCF_DWkWHKotGcm&Mc2 zv_raCX{!Q?L#>Vx)UO8|-Jwhwb8A{j=!T~HAZwjeB|{iU6)*jFn;wj|3^oSzjy(vMO&y*tqj#7ZV*V_ayxI(UdcFPjDL?ei^`PX2uP+q&@(BWGT8$8;&!bHTlDTG3DH*`WTreHK> zSHkvOT=7h{5JRY8G#^t%f9`ypUo)>(eadOZVDB6{Wqj0y_)PE-5J7n{nil2(fApSXfw`<$w~jT9E`l;9=`AI-0aD z+GLg{yl;SZ?~y}R5IqwV&-6AUe;4;dzqzd~%Q)7s&+`1%G2%Qdy?Fn9 z@?{hpg$+1gd>2^AH#Zo@=F;52n8?w1!g{;^Hl%qyqYYgziGM^K!))OF;TL9I0~#*a zG(3UNJMbee^6KuVCe9u(uB73P)>a}Fh-6dJH%V9NJhJih&{F*=^gtd#Egaroch3+K{ee>BXo?%|IFKUCfZUgtrW^pgV` za!|kHz|)-3h)4S0yi@boOR8n&aXxEu(>B`lyW)o%PZQYxUZLtE6*UkHRW}Sh5=w_C zD>&@_>E+%OHTDe5W|1mBN&=EwLLFvm0c4aknCVh0S~4l;bTJCHjB0e7yr^Z!FS{?r zOkqh#0dt*Pi47X(9^>%Wk#Cp7a*K~wbAFH6IGDVuVZskE|GQ9>Mozrx;H6zwr|J*m#&g72&0SbX+!KklL${7Wkes~vqSCdK_4O!%NiDo$)0F{LfvV2*Kq|+u=Dh~ec--$1Vu`(PDozOp9Tq5`-NPLLCOnj-(s*_oYe&< zTik>Q*1k?eKbqT%IaMo;w4sGuAACF!qh3^3_9m_=cN^!{rXH3cMET~V=bl!R7!C6L zs!o|yDpoWfB{Hx_>HN9C+U`y}C}!YvWHR|<%80+s4xs>OKRr&QBtdZ)Lj=8r#Rg4V zrey)oa1Mu_a~z#WeQCD&#H(_lBwRo0W{kDx+~0xnn@;szk|K0V#hp(e(PRjH(ar3z zDb>DVe2iWG$8fK(aCSjq&(yKtxang7ua9{IG`+x4=O@lBCcH9D1rN!7``SQCulY9dyM!Dy?`mV&xm}{Cb)k2J@P=IA~ z_Z9Ubm4BbOcceVHe^gje+(ZM`nm`bSLdoO3Dhz!RG=|c`oL6U|lm%WH2J;=m;gx9B zvV5_hZ-44xqzilNq?@2Fg}3vM6NJw*NG$=Bk}i*l{a>;rNqpeM%`yj9zhyR z^FPza$0t6sS_|kkqkOYb6E~V`zVY<(X<7Kd@wNnd|4w_)lo#)1aSP;gH`6rqA?*PA z1v%6m@=6P*5knM1n!t#SMtk+bH_=46j$6g!qD%buJ0TfyOr`K->Mcr1pf7J^YPRyp zTkI&$SIdgkhNQEG8B{vfxd_M(u(&APr?wSFij2k0E~9v!k=FT(;g7{|FH&fdf4NAwom{5&Wy=clCFFe;S?+3O$`c zdm@RagIK=_D4s-=z+s2qGDPa9Dl9Z5AO_k1q6GSo07|Ie=OUhtHUO390RQOFbuzY!h`}LJyn71B8cI4{#P0V2LlTv9)YwYEF2t=T}4Gi00;vG1ql@k0~;F) z0}BfWpOgRxmlzKVi;#+tn2d~qf&zzt8ca(4-uat#-fLR<)bZ653D+;~R+;&f2p1zhYN-*r{6AQ={FkEqsadCYuHQl1nNjONe56KB@lcynjYGV`-n zl|Pj{(`Co<26-MZdGk-ZJ5Lk3DXRR<7EpMwjqEsUA{+?FIoRF553!m^8^YeG?c8nG zC=9bK-V_lLu(5=B(^SnP4D^~;j9~g(;vHtcPXVigJ(>ix4-r@S$QshEuVlZXGgLI@iZjQPJA1jP9rV?Vj1n5NWY{D{2=|5tfG!5 z3>%PB*6w23l>xme!l0csIMsafjycrMNJ(ToQ12n3*pO&Rk}Hg;$=_@9IQeCSv&jTS z)Uj1ak-UX(5=(JL>kluG%UK^nIkaeTFa?x`T0B(_(i5lzut-0 z3&fUg@$4Y%Z}FzcyWBrN_SmpwRPfcKZnc<@c!@?4rDY24E*dN8ur9ANB~wLQ4m4s- zj?qgazffNltBXMKB4{Nc&Y`kJc1A*J?}eN}>GEmIwUpSGW17HnCh{EzGKfQoeqF-X z#PE$)NMK49X82Xl|11;pwS6;@%_1VPOYQ9a=~@MhswS^YNl{7Wz*^2w+)9uciGN|( zWgn`$Rg|LOw$F`g@Vn346X+F^)JF-9mI3j%6echTlRmLvWJ@2YT*FxEFJFEp4WLN! zLQK?!`>dqAs0|0Og4f!ddAib0E_CLGpUb1z>&@Z;$Bey?H(@Ib^QcdeH76M6rFu$A zKh*Ql*P%bJt8+}*Bee9d*aMNP_edT?%qZC{F6c34yI!?t>H34-y{?Q~I%08_y(8;( zTTbzzIoZx&R`Nk6Q6{VNSy=orh?H19gX-~$M*9Q)fyC;PI18;6A~`=oHWd>Rm4>ly zx4MarEib&{my!S@drP=HNsS+L1MjO4o6LR|_5A=piz&NQfk9YRvk&inksqPUN3z-8 z(jD;Z5~oF(rD;eVoXWbYqt&{w41e76_Tk1gM5a4(xAui0xJT;)HB2V2)UclFloXo; znM)uk!AqG7!s%KY)%O>Am|72sm0S4qhtc2Jsq7O)rWJWIzNUjUOFc z845^A$?PvPAmE}egvB&f^$qyFQh}&?ziHDYuAFm9=GD(Qy!{a%sVX+HN>=^ zn_EnOJ@#;$HKm69j0+rc-*8k-R%I#+Mr%01jlFsK(0h6kw6BZYJkwBL-!3LUg?j## zS^j+&1p-4Nrf%9s;{MtNMUg-`MbXC?FPAPgfB#nL#xOEiEVG~Mb5yNF@jNfm3WT|u z@O5?Apdfu<^V+c9IpY0nLb|bJ=M@1Mj?xcKo>f&fTh$oZqJtjLvPp#_nu&IagB8wc z7U1V&=@M#LG;UL^OzgWV+KIIImJshG?ToLf zC{BtiDVk(be^%RWQ5KKsBW&fW`3S0$7s=OZb`sR{NLR(G-4k?Yp+;1&oA;G!6J`XP zeEPC{2eYc(X}yk{M7uzNG1pp+HqoGt*SU;WKTMt`qQSSiQli7uta2hEV|*b{Rinw^ zBP#ngq>?NV3HLTZE+Ec(24>jC%tK|D#=eg>98+!(CD^@c3{REF@^V&ZPJx&Hee~L=#tDdMwmef`n36_*H(bQ{y0$cI4yQ}pFzxQ$s&HQ z_NRSltT-iPVqJq$O<&l0WL`zc7=6z^R%#O>zM`(o1an$LJ*Z^OB52=y z#I1$MmcbrEU&Hk5&!K)iM&nkb=hBKZh%m>h|1^MzrWe9e6D!k_8?@rhleMc1<`Oz} zr9EXR@zxn4xH*m9*`-APr%y!Yp4PLxlB?+S42CwwYFbe{MZ?Us?ksE z5TA(yH*LZm6W(!`9;*oJ9+}1}v}EhyvKkcj;K#yX=KEGl1&u@su22cb9rB!dQS@{! zh-GD9EuGX7xdQ&YJ4Qq7M`qOhPm6OL2IV>NM%fAj2Oka?Ez zRW4($H6Dprg{=mQi)>r3T9zn>v4w(BI9shfgeMg-?bElI2+ZfkvLCOngfEAk99}~s zJK7?Bzz<|J#+eVdMhDgu&}n0S)P90^(?BCh$#9{lDjwpn_T z`2^jQ8j<}<>GG^9H{=E*ZH+VePe1+ql3~c@Wj?zgY7w3a$I>_&_nk{9P3~vi#+3VR z6!TGyLycCLeTA<}+F%KUdibR8>SApQ#cbPbJ603cz9BmS5B~^3y-qaYQuHOeI~=)R zMOsidv4K!;tm@GG*HF$N^17hCZVw}&19~+XF1&g8O!S>c(Bk#`-u%+i8wRWN!d`5|5fyk51u?gcZogu*MpN;H65 zwm}2AW=@ySI_EuP%CvbiQ6Q87%gE;e1&h=1EzqJ!z^KMKpP`Dhnw+#wmK>W!cNu+$ z?A)Q!h?zS*l;7^-x`k>shP~nIg*g?+3XTS5O5`ABH}-?}L0)&23FsCjdAM>NxDcvf zsqNs!pI!r1OER)!WYRR{rRpbR2<_eKjDD$Q)UOQd`m@#`>!hCK;Ns#pFPWoye4{9W z;6JZ!D`T^}L!wO_z_pb#`D=Xa_993bZcduJCj7%I6*juGGCfzYJX^CAQ0p8WtJfXF z6T`NQTx^($o>2O_$^*@sI^IHtn%5K~i#Iz_L0It_dZ%~9>ZIwVY8lb0c19+CvYq~$ zh&ixVu_}aegxHf#hZ<~?$Ip=NtW=1$i$qGKlkr($b}#I7petGMI2s8n!rHor^TXY{ z6MNeAX?Yd1=QOG&=u6ybWGXZoCCl>bii54A)}IZ%2+}cbyB|qsG0BgcMxBeWw|$lM zj_^n@O)jmAlLm3%dGUNcT+2}Za5bChfKDo*C(D1UO%?Py3-5Pk!wY*ldn?1hshh84`t+c4(|! zkqtA)E4{Slhj4#;X|d95_@m()ZkGMZu5&G81-v+N7xQ?E3&JPq#4*Y_p$7X)>QtK; zczP$2Ta4ohYNdR+*N$VJG*P0qGP4p*C{S0!s3&iz-K`+9vGp|dR|0uN+4@e(C~(Z4 zB^w40Z9y_0684xm@&>#Qf}u_ywm~4C3l)66L?c=7s4|I*tHpjp%OmJjh>Fqh^RV<& zybhAlQ!L)LvHO=~U|9DHR zPfRcHxw7z|C5X^`++d&f?So3)MVCmdlZ0PdtNVF%_Y6zB3zjPL4S$vcTH^Ee+uH)D zCd`FN?ygB?$|PD^qP479Oa*+{WejbXc3L(&S(af!wYGU3zaBc0dV(Xk;d?f>RlJ0} z$Y9M_=!uFu6wpMdx(YL6h^CxD;fR@av}$J>#J&D7B5JfYK-Lp8UIW?R-~5%Leba5vj>MLKVbGW;H4sVwkv8r(bdwKbPQjmj1!Yn{8KO7)2y$75?l22>jge})a2@|-uGi2k{D~73&Fb9J(*uNLR?5xHQfj>x z`d@5B$Z;6n;RJfEe?5-yG!sbQpxs-rWmP7|6B&`VA<2)wqTAah358L*g?$7OY28|3 ztj`~H*9@Mi6Kfn9O1<&WDXG^zp2n6ppCT%rYAhJ0%~N@omz(3TCxe!p3U&_Mo~*8R zSQQG5zp1Ij^;*vs9CH+n)Y@ep7feOJoXfp@f`T zy@UFJ4+4wTv*XozvwtP_&R}2T{QhHrnQCdw%^Xe52gmPJ5*cnBb7&&=c>ZBZRbts@ zuYARF<~<*%KX4;=wHmFz(H`WwNsB7@1y6yABW$isKpWF55oi^Km8H+vZElrunQCg9 zBO0tyH$E+*I>8)@T=mr@2b)t#DXs!Rn;{a3jF+V0j)CT0ntZ<^(Q0OjzKN7Zl$I}q ziTU{cVfS1(&FXR_ z$WtC(IC;;GPQ`OFJ@Qx8c95>Ae!-qoj$Nj0N!_ccKnz$%b=lizJeh7%VA(i|>2bHCF0*aS1)v)!{h~+g!Z2kOug{WW1qHXU?kmeg8>F zkZz`7ru4iFC`qE<3uC1of3R*udHEjkVcbDe{k}**&tY&s}eD zS7Rd&(;j#Ab5z|n&7RL|o_ie1-?_GDMPzE;3rJejdsc18ag)A@h^4n%@@*%B>jMQf z(9nVLDLGk$$=muSaxB@fxn4YQ$w&AeE(L*Xz`4)t3TL1{t+v9rY@eUT4teAIqRO_x zsBK*L!AfT)`p5XfrX=ppE^StbBz}a;Of4a)mZy6Ji9pkpP(q$13^tIM+6YEeX#db2ca3893!KYHK_4?D6VGzFkYj9=uMh$i1mBRuU zHXhowo~Ad*k~WP=p&GS8>ALyN1&32=cWbX{)IG=5XJbx<`3l6_0DniX*PI=EqHmW^ zdqdilg(^Mp-$k>s5rQgfNo7?xS_! zMRBg3{ucPPl@Ez>Z#b5h;~dCyxF}w%Q;bxQz8;`8PoM3g`h;NXi{iu53a5HPQcP1f z;4H(-E417WPA~U1G4C~o97Zn|S%_H4&0#PlN+Sh_@T}_R zbFB8Yz*}?ZJGj7jbyamOe>p52qxZ^EK77lLFwaEQrK6hrbw13zk<;jx>Ixh<(mA!1 zH|?}&WyM=?{yra)Sk*XG@l}t=N=to11MPY(WbL$-Dq~JZL+Y7B*=}bxr?SRuQ&`Ku zOXTV{6$&ZGF@5n4cPJ1yM zxofhY=FUP5jf{%uktA^?f3-=lt zFE+~JHH=50j@z{7Fvt~6(KS@beyl9YXW8hiODe18Y40^EX1{ktH>SJL{TB%RZKKdE@}P3U(KZ>@vyYAUF&mK%p2L!cXjVKB%tp(Ns~EiN4fEMqv*<|V4Ht68os-c zeMez@Ibz20Yq4m!x-dNA2)}ZrOGL$j`#ZNZwiL}Au057i7K|kntHoi$^scvv@yOdc zk#WnsPf5sdP}2-hAbJb;`9peV4|&)SUa{WwnM2|w?1T~eZP{_|Dr=>Jcds-T%OKTt zY^zxhB$=ts5}>QL!f3J!`;yTn)FR|@0jluKQ|)0R$6UNZ)v>ck5ZvsmWmF?a4tJ+f z{nSqc;}_09n5R609zk(*l)uR6UKzBFh$!)%1F72dK9&x&esxC9jn^u1)50_vyT#4Qg3*s~w-X0*s zc);fNW!9cq{%8b6+lGgfJdeimC zV4KT|LPlEVBM8aAh?Uj0f#TyQgH#Ugre(8{K@1J_>xZuTD2W>GVds-guly8*>Q;_; z(gcv4Mj0Odn(J`|2uT|mm%=u&(i<-3(+!yx&i**Nqf)7ze2=G$cH=;=;a`xJE;MHuS7i0}_Cufjbm zozkuL+olN1qb!7Vr*Ii*sE`pG+~=VK{a+T5#l^lS+jlTElByV=shXSpv3$4o@xH!X zS~0I?F3(9by*wc=WOk(FwYQcpi^MV{EHM6nS6NyzQ_7)ndFy!ty@HczZENZLgC9Y+ z0@yww&Z<)C3N>BO>0z|>{<{6{^QjdEzIXN%I}=^*rUIK5JeAPN@FIfC4W62nyn;nQ zn>U7!R<(Caog#&A+jf}jC7VJb90cD^{S8siI?L zZImITLSXVTe7dLnEPb<{%w0)b%Gin*P3N2^V?vwxGEp;A65;e)=Oc(B3%_dOXdZ6d zI`Ci}H+X3hd{uA>H+KFLG){^^Ea&Qu?ZMnHqj%8QGrIAJ^t7hft_+D(auQ z#YKBpgk`*OIXL59ch)(zaQgbpO(Pviojlfz?@fh%pec3c@*&yB;-&rQ7$tktlo1LJ zzq0muNY9A6s|kH$Rz#jr$zY92-=!4?!PQ88vzYuo)^#9~_PI3{eoSwlnkf|cni41{89momtuKxzS z9ZMzq5)$;dCzB}*WNKtTBx{IGd6082b4FSb%*xy$n^Ys4AU8-h(J%|z3`}qfMH^dj z;jGUr5H=Kb)K+9u*BZ=MMz?~AKzJ)(PhpS3{avuQ4oAv}zpMt2(KT9i z=rXlc$W3xpM>*2@PWkzbQZmamMnU6%j^k%Xhqt_=TBm_bm-wjgKLnOM2*0azaulaW z{SwSmdh<@g)&~Boo7#`Ikiji=(u}ohmYpv3y#1?Rl7)7e<1L1q-=6YrY4k;(2%H(oLcF0EE`QAJooZ{l1HrdtP;-fF_PkwkpU{7OlhBc6-9D@0{@ z-x$Gu2J+n%-j=E(s!_PtfwDP!9o{+}!Em~Y0hQnpB8zuPl@;uBcm5X+G>nrBYqk^l zXJY<2Hp6+2N;aLjWq3Hy*;JDm;Wj1-l0|W2pV{|>@2Q42Xi~hnb0jf(jjz@R+`8C zt8VIzKq+TZs8#biTeD%NsJAE{i(>YSRHl6e8I06uL=-G*f6rP_!)OH270n~a@AF3{ zZ&MklOy$jaRLk^q@B0Zmb4b@0&&p-Y}e{Ko;8=@n>STkLI+7v zx%0dkL{$~4A2)`14d{b8J;W6R;FHLSKPOR)AC*_XuAAVh31D;-WOp#cl5`^b>K5$o zFXrf<_c>;~bA!xKQS^DQ^23P@c+G~sxV`4EqvV@T&6@J2tMV75QspsiYPA#jNX50_ z*01xfOU~-jTz1&pgY~+j5txP&&;t{0uB#6@iQdN3Gdh!Scq+Bn&#M};xk$X%YTrGp zz}Mbc*;TX2)zeUqT8!q;MK<-@IoSos>tb|%C=6#snA0S8{-hOs0 z>KB%o5v02q|5(!sSNmM*(+|8OYSKP$#8wyctZhp-C?N+p5hF)vc}5nmC~~%)1j(H| zA8cxcMmZE%R*RmsqHL0@9uT*l4Nvi+J5<|H;3H`1a6eM;s+uvedZtg)?iq4@TMS4< zdaB|_D=du3S-lJsIrS`SJmNBY?k!rfiKS9IW2*O?fHr2ALSF*WGY!53R!3FkDZek? z^LS#@AoZo<0nAL@PRH2w^zvBO%i6|d_AkI-5Tx+6(|oYFm(ich9>7!Y z)zbah)Z|zo48ON}O$(VfcV!W%rh(r@EQdu?er9yNR^5tnL17UPmZ$wrUR8+Tv1JUBMUQWFJzV z3%ZY$Tb=qCKalwLzb4bYnjp2GJQGHP?9Sa_Oreba0!c0E{RkIvaHq;39D}qWyn-pO zjdTR(9-{I(ka1dBk!lk`eR>4dpq)+Unv0pvrFV4&$p*=EJj@zdd=YZbDun zl+WWi#qD6qOpV4BCEg6h|GmAHJa$=VxrT=^oF^$vl6sEqLMR@-b>o}w@e+(YtNMoz z+=xfktQCy@lDa288t^0g;YVC7RxIl6D*T6UA3--G4dT^&9(1p_+Q9~!%(3Lx_^(Gj-?D*lzDtwbOQZby{+(7SxT3 z4s`m^Kj6*tE|YHvZGnqFyx!K#KBLnctot4k=^x8?)+lllG&DrQHsRClaHv zhv7q+6`iKCT5?AVSR?hae(h|~v9~GM7NXR!WIH{}Ri#VKo5Ha93+Ob)9PvhPh|pUUH(h#+0c^>HsS?UcI6ERFo*TKMYlz5CRCw)~*r z%ccMr5ni0#+`#!cErn;yu#~-=r>xDtRMhsJAxNHHFB>wlar^czJ4}@Z50%j!zSUV9 zy&JYauyQhfUot7UIip^OUsv#fI-F<9lSpsVMpi-e6PLIpqFk-GNWj@}Nqdp?g@^A6 zw=&Fd?}mVpjq#?=1&j4dQDEXEq0Z{DUF@KjK7yDap^qS2Aw3pgCphofwS3xguOil@ z$Z}SeB2>&w`az6sHL?Y&bswj)`n8Uks#Jrxw|Va?QMW8bdDZ0`*{|r@cBks}Y>h99 zyeTj_BiyfA*%@!@2ohLHbmR~e7OSV0(8$Kzgqd3_Q+MLp~KgD5=tsQQP>9H#`I zkfSv?7;30Uex&)UIa$zci>g|DA-mq^;+~yoN-xodsUwc9h!6wUgG4uV@NS3wa`kQD$mw@LgmB-#4@dcLbuj2@o@nQsA2eon&J?ipYjtUels9A5q1jR3Y~J zVi@)h;i1AN34DG9kt~^51kj(q^Hgu{K4-BNqvz8aPeU)F@$5D28xH-#P?~Cl?g&q8 zAkQh+JL-MfQmF;oqV@MYk@uadRedt60gjgmnmGP`TpM zR&+A*+;N(MYB_UN#)wnKt%70mKMi6XI++I+Fc<8_XVrYKUM(qnYx!bl*+nFFZLYSS zHh^Sti0i`_)Q_D;)ANindWooUl_85H-rB)ab?hmf(mwNTHyQOpBK-oy#q^ey>0Deg zZIaeqdh@Ios~hg8KBZOJ%Cg>a8>FTNUpurrS~uK`i3A-!7b*0=;7>GYpp_f>5WauW zr=N4tmGU|UOev=y3{G4&yB9~LaN|}+VVMLs=`M&QdvP%!k-e?2uP5>5KaOcFIhxUv zWpN%cdXN3pqWjm^!;XH-(kXf6DN7KtNw>p>3bv*8>)K!q_c$*A}d{Xhl;h7PQmp z1ejS6QG%Dd!+ zP`XIkd}#`lrk%D+ek1}+8s3M>J><`+;Z`twQ;@oWw?%6fo2m93!XMq};lyWEZ~{<;*)t_l+>dx6em}gqr!4?~IvqF8X8h zJ;B1zAt62Oo#Am#RMz*5IEYgNREcqIcVRT=?`zN}+P~KbGJLMlXC)mT)p1sM-|-el zYd1BPcA`nKwBPC8sE z^=|jZIIBwSbD@1(o~3LoG(Q#JSiAac8SFY?*W4zCiIvGo3_;AB)tFHxP2!{MEnuC} z0#+*O#VNzFFUr@@Sr+}WSJ5FwXRS^$>(ZI!v_@kR$Fdn6S*FUi3JD3)WZ-Xn1nUW& z{xU!b7A6F z{7px~FH{7&cKb!{-Vv^|$dogLQL8D7X+;_n-I|M9!6Zk*1{S;TnD5dwx|(os9`_>( zbq>aZS>LY_6{|R8#a3^d(a*CIbpF&a(k4CM)%Xk%MksF8&x9>2d83pJb-%b%*88n{ zrH0lfrw)4$%`{t=b>Llji+ttEi%yIoiJ3SiZ#@_&{{FtAH1y}riTs1a1A9!8;sSWm z2JvUE;oh3cLa2iNBj`uCw6QT3yinH|hBXm((+cLU#YA;LW|t2zRS3hu4E=E zi9+&F{bZHd;zOc^L zK7YTU!qwuiz$2lB87d9laUcOt`AHWaBZRBSKcNVsucm}8O z3*ow6T!mteLCJ{N4L11!e%_-1BELDVrN~vKG?UavQ2fafJG*MxKt<{5MZoHC7K!UJ z(6zG3F_Xnow9l)S!+i^5btBWu%;LJ(ufU}~S4@%`jGm^pf^eD$v2ZmVcXX3czWcEL z7`oF}EDs)IQ5uv0319_mKU(L%r>+M70C0+~fz#TOR#@jnxBw)e^IO%4Ha*WwLW$X_ z%<@MpNbJ@Xk}47}-q*P9FN6YB8MOqmiY&W53nWCW@x)QxjfaF5um^F!Ogiw>%_?fB zo+Ame1ahj)YXH{kZoP2syb9Cu0-~0+KuKPmDNtTYfNvwO?Ea}eI-F*To@FE4sj6d0 z?PB!@RGxO#)9Z(7f}NIYG=)KU!Z91EkX#=vvFt@MwsDMx8my}?ij-GPm`50}db@LN z*jxdBt}SV+9$VT-RNmGg+X{-}08Oi7}zmLe#pNyxX36Q)sbH9L$$hm>|;^>W6z_$xid zD=PUJl`Jx`uxWI1X8f&w-Ef9)!Ep%}-D{PLf>tV(-)^>Xx8gC3;+xUf{XBC+oLpWm=lXLW)m;6+pg}A968kll3H=Ydk$b+(|r{om(^Iiq>0# zrm>Xyc8DH}-@f?wp%mnzx<`#Uw4C2&&omNMXYf*l`#LCvOn`I@c8q@W^uvq>qNYVs zKUmux(5Wz^Acj4Ij9~OgDF)S&AXo1oUWo)6>`DWa{7Ja;$!)! z{{T)6QDqu$xWmP$Ak6M!?n5b78kCD4Tvty4Xl9}}B>|qC_d9sk>NokXt~1TyBL4sp{C=42KFqV;3eI?Dhb5aK%YRQ&QJ!&^FO2iT8*5jwxwVPCk6dGp zPBLj5dYHLmQaP6$)x$Rt)TI;<)4>tY78t?{_t;}!S>y$YmA2S!aiy6-Xzl*UGW@fL zeUs;0bDPrT)s^znO;bx1WMWc~#w`$3U_j`>jX+N#Byn81$x#xL^x)ccyMqsCy3edTp)1ZuIF1%XfokjuEW*jm=c zUZx6gzb8fvoF!fhh-IswGJCX7Q4_iMifH_IH?b%Nz}wfL^TzkUxw*@88Y;=vDzf=p ziB>=g=xwjxaeMtS=0#Jpw!`4<#WPZ;I1EkYd%;970%T_oQg%n_yVRk^-&hK?DK6p~orOPNIEr&Zw=bGJIhg z!1e>o_S??_sHv73R%zu}q)?$03*CtLL9x_M7#VoyRE#3ZS%7AB3NG7TP2TEEfATh;D6fv8*&;s0@$-W5D#3M$IoM|@k4T$-l z=YwHDA*hZiOj6X-qT5m{pB1idckA@&Y#dD;z2zAiD_BSk?eiVIaDYiFXlj~Dq^Wv{ z)LjHcSQWQLx95pd)>75RW~G%2+UT+tUH1b}wa5EyheEV4*Hl>R%mhkwX|~MXLjM4} z6^l(BM9v_fSR)esw2e#vlnY-^L*y<-_QOES8DV)#DoD_P2}g(vr{Xrg5lShegnPbY z9ZZGwF=%hhZiirce(y{Pp)@BfmGMNr=Clgqa$j4v=iwGoH}k&OGRs>~sT$L)H3dL^ zSXmeSK=j3aqS$EioQ)<7`5h8U#>(c6K`eUj<=YvOdlg7vLT+yJj#~kJlx=g@sKU1U zW76!G*_Hnk>k>kz|J+n;XC~I?^=9?p>SrpZk_laz699P*sw$$Ex40K97tCd9!H3S5~ z3KU4A8l6!E%M}~i+mns(KIC%xj+9YL!?Q@#^*NF_{`*kQx7--hz@NDOI6YOKMs*e~ zy9{-~{HWxb`Iwu5)Yw}Tbu%fIq?6ztHva%9-}ek>mFU+3*=LtV@zcVxZy_4w{{S)E z{$~YEGBrn+DVypA@xMtU2JTIXoh7c_JB$l8v~<+x(ipJ_l z*E8C6j%I3cbQYQ)RBi3~kbYRN%c|cmtmnZa#^HPpyB#EdEODlklRXx%8$&HE47Z-P zt(D{@k1xdcK4RAV@mDcI%wlF_2VzBu9-|xC%@oef!@Oa^+4r$z;LahF^nP^?T_#@! zVAQ5XSk=SBZ8tmVMLS<(zWC%Y<+;ohjhOz9mFeS4%Pe-0Be=hasXA@k8(Y1x5lvl_ z7L#e4Hx2MF9_RI9n=awW&YlStIb}r$GMbl2Y1%+Z zC|N))pcS~=xj3YwsrN}D%kvszLq(Ztj+Pd&WRYx0xZ3)NAYSBS%$lar=wW=Kq6^k&ZG*z_FR7&ndLNG*;pF8j8zid+GG?QhtBQDQkhcL@(laghUJy6J`e}^DH zhvqST1Y2g66;^xfR%XmHXsWZ%XOcduniq2Q895|)l=W!3SoYffc<%fw#2E(>7Jepoa4U*oRI33Tbod%00x;Xy>DVVdS3y0I(ejx z<)@9>2KzH1xE;$6TldB`bRMd47cEtk2C{T4#Gi+!LDuB$wj%GyV2!8j((*`20esk- zeFx9B7=XnT)2xN_3CVHbM2ske8(3)|-{#lBDYEAiyyi&JoQs4@mIJvvZhlxSR8Fpg zE~rT2sg5aDHYHV*Fh;iazfHShhdG-s%jykIV_h0T$Vx`)!PfniLFsMw7bok6t%R45 z`8@d|!S1<#BA5>w!#qr&TmyY3*4uk+^u>#q0)?fgYK57C$u%ikF8wYIz#HLMD)1*V zMN%ZDrj|J*(o#9dDk;bt4^j_ed*QoPgpQu3q%-LFgB4?Ku5GaE>%Je{Lhw?}Nl2oj zIG&|fb34YM=^Zb(i+#z)S`KkSu3i~M$U=;^9UA_)7Qe z5D?OZ)B7W@&jdV{B&gC)LNUs85OHB-}{yGW;;m#v@X=~{pl(Q;oQl4hsSlX4=vH_y1I@)2vc`&m+`f;_VdmnRLpONT_q(fic%O>IPSoP09xSm zI4pyE5!25a##%XYMX78@G4NA4{cVOd_g;L^zz6u#ENA?;x%`2|N?fForX^8q*gyok z6Qmxd-3B2~8Z3{dP{78^axK(jtuu|-q^eblw)XPrh)m(>)&jc*Vo#W02k^r1HQ7y7 z5i}M%y&Sx@^^Nxj=-2-M)G@8qN6K>^*3?cEpqbfm=2foB z(Ub592)92VVZq+(9i>ZB;2ThME@UYmBgGg{;ABK->~`y}%w= z?UYo}_~c}l#HYfGUX!*%&|sYjaP&2Z%5D?4wq{{U#bJ;!`K4rh|h zt)JQbv=gQdg&s94F%RF-z1~!hu`a#vxwYvO` z@jFTbEApfO>g%Kde)qp?;ei?BmR(3pu#<1JN8I)4V}GF*z@hxmM}F)PffT~@z+y5rccQTJiVn!>AU zyD~W+PveZ*?55v?W0dJJ<6uKZfOXWbd_~kV1Iji7r~PpH6Ec-06j~=`)ue_2fc!92 znj(Bu;aD47DEzRP$W>1SL*azVaK}(2n0Dk4MwwOXY0yv%~#K2+2Z_yGubUQAoz*MlT!x0Gczg`HLT1 zH%*>aQKp>AoHPnIo-4dSdi~`3?dy%?t7yqo{#kZ0npe|JO&qYf&{VJ|a8E&I8yqW_ zAZ+%TdqoVApF?1S{{Y)>H-wzd^zE4rQW*BP8nASAu-*4PvJV?^wR zCs3-DNYZT$LKD47Cq8;*87_h%vML{c$B8<~k1xvfq7=LObJa$SVb7 zhiV6}Y1jva=d>}n_<>SwV}4+;JzRFiKB6}i%`sAD)t6^goHN8U8M@{$reh-{JgRRG zBW6)1le-NkNj4iFOmxhuY8==Zc#n;9x@no%vqqZXO99a8EH|A4*-(%_(Kbo(dLHELG}Q0ja={{VQl zF6%}PHtiE?i6oIC5uQo8X&918I}io!Z=N-b!!MU5nnOhTAk}wJ+KPIw?DQM-`4Nha zv?lLoE#qDl&Uhm^{{Z55vlTHNczyy-+iO%OKxUp1Mz+{{V(L{X{A9UQbKYWaS!W@gCNaI*w}Iz%7Xv^0!<`<7p#U zp5*=Iw}kh{In)4xWMrq7ISSYqwd|{X&z`G#_QoKRBCLy5_KmAc9|!W0_UcQ={u55F_TD z>W@iEHm;zh56u_rL(=NQUNk<90t2J{e}RYk zhB`3K#xjq;{{ReTwx6-;+@B??5$dKeG(fCx8xT|;-!1wbu$3-bm}K%AjH**SfLt_A zBV+z#BTIcPiH=5{iNQ2oc%)H>2<3;H&%pmzjD=j-tOcJ;=>!br+X8}_fe3sZ!?RWX<7)$Pvwz(^^}GYEOKgqfWl~eXnkxqABHQdbDXl3lvY&30yw(N zWm6d!u-qN5<%wBqvl-%dLjeS_tdNl+Ft}tof%=RJcqBpNjnp3Hanl*u%_x+$&s895 zd8q;+CB%s+WgrhL0uKII1yM<)hN1UbsQGgGNWK>QMwa^HIX2~N>c*D?T(75UYLc!y z^4k7?bp1!}!o(ZziN~u(*_G6ZKx}vJH^9cCO^6%y#Tc&45Z|qV$*}8jgi#yZTfQ60 z>b=$4^Gg!UG_%A=c!>C9UsXH$i;nnGT$KWJ&C-IQT9x9<^4eIL+uf(q!nmFB3v=T#MCVRX92;y}oH-uwBBVJ66wQbjc*9Ir8`rxGop@SR&-1&W== zTM#kI{iXXS&FQoA#-7Wv^E_2gY|AK()pWCNUNA_ylht~Iy7w5lB-KgMW|$l2t(!;o zcH)fBG0msQrfP!}TKUxV012q%U5b#x_rBh}aod_IdAX%KDbNb4f3h?)TL19N{+MXmMxFostu(=B9@JW^9wUFFhM zB=4zgNFHS1?^P41f{8edol{S9*%eLtYn8lxd3?*M(6#o%rVQP z5P%Gz>++C=X4@>*#R_We!>8r;=2N1}H&d2^cb_Fq~^@cSCZ36%D|Us<0XxUiuSnE(0AJd*Gv*?z$W3I94t#^ z^@QJZ&XfND^^ak4e^1!HKSQ1>M#*;%YivUt3?zRD)X8fdcm6oQ+=!+~$!cch3s@ry zpg+IxIEiLbjL5pa@kJzmJODriFRUz0b*Cy2_lsW@>hhZgnL>d{8+z3_RDd9mXmTjJ9WzHjY*8FNty^pCugAOC+?g zv@BwXJZjDHH|4jcHGJZ_nwK-7ugaoP0EI$7Q1;o4{{UO9?~P*7lfKQAOw7ka3tMbp z&ggE!-lG!LGJ)2mE@23cvK5_s6Y&qO5ul4T$X}U~*U2q7H+pG2K#%gD-Z#a@TwS7N z6(vlt&oj*1Ez2o$NGYk_jz|_pjg*iW?#fth8t1)%9(&^7hI8c1=;F3m+ z)bTYnO%7c=j|}zn)FwoAQbB0hz*jc_SeuRUtYH{S=ua<*x7nuVHT3aJ@zLfE@#-XQ z0Y0R8;UCjEj0aUdVN)HB+9hB=3)}L>Go3muV^6eN7mOX_Wu zHMStNg}@%T*b+GxDx659Fa72sN8UmfMf?aS{G%0)Zb{#0nPX6CE{tZBiC>m2QuR^F zl#bu3-$VRyu11nd!Z3%Ot4TmN)H;k^)bHF~;`<##+3&EvEaOfZi$2SbBlfw0+Z&^yeMnA(9#LweJ7#uBA)aDf5NZSn2 zaBW3hQd7g2MI^3lsFCh|S2%Qo^Rvod)l_H&koD0W9EVN% z?oKZA ziA}lyc0Rk{(tB~vY2=OP;h5>3s3Sv}TQF%OX-5If&|XE$_oMYCX%N?}JEypKFmSSdo%7vFD(ukN>8dFjv; z(2=8G;#W4emY*VausDLux}<9FDGbC}*zI6@5ISvy>FN2?1{4s-81W>k#x?`6DnK{4 zd@y5aO;0sI=D3oF-2b0RMINQ2P=^brX&e+ZKmK~)LQr~O&Nln za`s^iQa3c{XPQ#dCfkv5Z98q|Nyalw&MHTWD74g6y6*zIiID&&Rl1UPA6zi#4p&Ok zX{xK1@=D@WrjV?O2pcFC8y&h1C+C67Jdj9&q^u|f#4wW5zV-xnw)^$MLp?m^kg$1V z)K^+WwB!?iHt5FpHn_zx&hycjMNdgWxr$3EK;l3IXa|Ydf^?hhVt))(TG*Rwqh(r# zSd`Ypv9-KH`hY%LeJ}}YsU8c{%%}$H*Rb_AHn_y3$6{ilxrU^XSx)NO?Q!SV9>oQm zy>?BSbSqfqKY>mu4t z;`qfsB1l!c1+xa~2b@~HD! zrOmS_J?Kj*5ka`-$af^$as|fU%NspU4pG$7)Wu6jB_yzpY}8=+b$Io3HtIi?I-?yN z&48h(UwT+1)UxOVqp4Oa*{pkiJUJq5b!%U>@e5)Dv)soZx5C5t;!T}r^x0)MyJZ~j;BnJ9SKAI}!CW}pHJI?VMs1bG?(kI5)bi(u zGZrC{l&e^i<+eI!k>$p7RBd3>1Hu!l>ayC78 z#+}Et9>g;Yi$AI1`ReF%Wf#feq|4@nNaeQH80ZUbx7=TBayGm(vi;G=M76Pa$w#+F z2Fx+r^B-ss=1^o=Jk+!_nP|-AouuWGTbc?xkS=txX$3&*zBlyqyHYXAs;EzdD?Qps zqs$7)46%f$AbE|=zdTm)H9Z|Za(%+KDyWN?jFH@Gx5FU4x{bb=?8u!aapP-i+`7s= zsqx-HL~`7ZHmrgTTHHZT@jZYfn}B)^{W0qAYrfR#>Ewb;^F5L|5Tm1rm03u!7UmwK z7{7?#pn^E@uIB#MYX>*tSpZ*jmu9!f9;66HShItZb{Y^|4 zzgrKUIWAu3Ul`X#tuM3gF?Q7_7c!PoO`|;zUCVzAIZ5opI54xn6jg+F1=&yl%rD&U z=YhNI5{!C9wGXqzP@oNtYQBtx;Q&CYOu(~Y8SOe1bwXeU^ z6Jw(NGTLfjizRGy>tnOb6TfTQ_+T|Bh7tyoGtIK8^r_Jt(jzE6#-pm&7!-v{!(`d_ z2vR^D>Z#H0EVR*TK)db=b?w&-{{Y8XByvwF_qvB92ux|2Yi;1EFxY5maVstZ1_g zmaRt93y9<&Bh-2k^~Tdd$5Um_Pwi1x7{ zj`%!I^zibbX)7HHqazV;FS!KT( zC7zBbCq)`+*;iEY-*7B-fDfPNfEe7OF{Ypy+BI7U)ox#~y~W4Uz~cq!<5F4^POG>m zK|(LF@b&q1z#0_HGb2LL3My$Uo}v75Lv{*4w~ay63AWZ22d#!OuvS-4%BxWpUsERN zY|=b?{orla%J%u;^iO(0UKtisG_{etCBDKC+851=19oF=g@;@^zh=5;ovcEnq=6>`wb&)cHO_wSQwRcBs)+fSN{*J@&oH z7bklY)Lz(j$)wLU1m%etsIlpKyPy96W<7;#*s3{+Rv@ur&NtrY020bt#7H-|xFC9* zU~Wj0B!FuTW2?vay*^kh^>VOf<-rK*79pf{?bP5*b!K7JsZm=_tCOhOcaj$zw0;7d0p?I9D!zu>8`kFS&PvNwa(=>*<2j^$0JrmPn6M+&PM8lqk{Xy@KW;;ig?J-7(#B{o|p!?r=e?Q;z!<6}DWknlR(3t9>L3si= z)PvMvIVdfZlaQ}9(adfc9CcO}BM#AKQ_{$-6qdED4)))-mMQU?sR>*iqTZi7ieRQ! zG}S8llAuH%P49lajrSc60XAvI@D6nmqpXYoHBqQ6M&w;LJ&!@R*B*9E4gdwGqS}VWDT{rh1CteTT2~=F{Ep;_;QbEQi&#F z`ie4^o=C}Ey4+k`U|;ZO6jy{ZX5m&+1>UWmJD)pr#IfilAG0amM~1UGhLMGfX-9C^ z+WJ`7;plyq<(qYZfD0VEDazt;QUx z#T?$}Pb5n?1f)$ERyOiw03R*va99QR<4o=S>FI!97oASc0UvZ|<(Rh1|axCr<`X;s++}rFOxpIO|8`!3!@POAA7VV_=!$M#wgey@r zOYZMDV3YC@gTg-PEo`*4ULyQ>BGG%5~hdY@`-Z{?rTcZ4q01PBhEVaQ0We;#YJ}i3**z|F9V|5}%wYRnR z!9ydjFO~_~#NVzkIu9w1CjsKv?cV)#Bz>sq;gUH+)j3b{?E@PL~<%=>i z%8ao{HeF-kHamfEI^t!ql^@xTwRnFg$;Dwg=kVc069 zNu!!Kk{P2qqn0)*>U_Z+F`IP8i)rg}%ApKFlVZb96{&jvx{JQW~lW3OX?u+^Kz={U=TwG%! z!AJ_5osXU{C1p3?<~rek8R@C2C0c-53YFbvi0N>BeDKy=nhFE%`HVWFW3_Ax;=k>$ zd~1s*2^nR_$q#1v6%Km}RjkTiPL!#J#4z$<{Tx+f+%-O5T-7z6?@+OiuqwynxY9@? z9d8Ppl+n!`t}BZ+kAwxkKn48qh8@N`Iyt*AbhxvRt_Fg7S&a0OX<`U%t{izVJw^t( zDqx=$Y}C2tMV^(V;#xSVY8VAtmGGzjpf0E9wjrJSKd+`!QSE=yAxV z@V+wW>Ty|DCE2LVCZ?RhJWm9xu}K$8Vo=pd3u=x>jfZizI@FYw&VDrXS<&b95RuIb zDIFLR7;k=}-TixhX4Qs>2?EHxzsFv6YKDtapv^(^FyPf7JJmYEnv>X z05qs+*bPO8iARj3uDgxx_j`<3!w){t) z0qnPix~a87^$j`#0;qd3ov*WeNDLig_m~d4NNR*k!GwEgdv3m`e!jQ>%QSAO1iGPQTk>_N17l#yr0wHMfS`~>T-EMmU->+;5Aw+W36q8gj zad%~m8;$iP&%#ejbl(hLa}}A`r*C(TcqsK;p`J2G1E?wu^$#y2d_s#cuAWp+vYwSt z$kW9eDPwJwM#tCpV4&p2lBIMnhcX*%N}@9mdzR}k?{a8z8DyanmAMv z9D{zYcKPpY76*vVnpEEV5(UV?U}>2b30LR7&NC`{TKZZ9r)=JiS?VMzi6c};LARwsfm;Zaj003PM!L0G3cclalN#0Nxta$3yre$ z$~dbv$P#y`N*u;&SmhuNU`J&PK#3)stc!Q2opiYMw{he}!Ntj1XHizO1GR|50Q6F|ET&318U{T=osY~NkJs|W%sHG>$r{vXh^Z{nC?RYG zfg`H!M)xDv9XK;_(>e2EQrawCYyq{w=tlU5Lyt*2*}+sq?Y1Husowkdz`F{w(nlPk z#^28lWSQo5!>k1a!b)!R()gqLcVDL1Ss=11Wn-I*(Y#P`7YcEFLW?`2N_w&^1eQ~O z*>3oz;xA_PG~uSnDwd)?(8_oEHaO!qh4Gh1Q;Nu~c4)P<)ihNtPgw+%lLKOsEr-(r zV(I}Pf#xyTrjBHc00XatpW)|*&1SgRGDK|NAb!vTW51Zf0MXPmgb5XId!g00 z`dDD{)wM-5w9@iwpkty+dW6&%d5`+w6##(K(#Ehw9Ll0V$e`*7M@t{;<%hY^Nhl%M zxHeP1ucf!!eYe7}p_pfxon}cEWFx}hf>fP|K7?Pk4+d=E9-URq|BD0 zt}}5BgjEoaHU#*(4aLXfjgDyRQneB~#V}v(5r8?SDIQ}#-bwDSQa!W zn_B5`3ES(xTw3Ln^wm+VT`fR(&DIwWsYjTxxV^!@ObwEj!^=ehh`m)3%*nevaqi~h zqN(&7`eF-NM0t`KB;=qvxy)2Apa-R`(+_N|BP}HfVoJnGJxVbr^T)8Le3!Y$*v80J zMUA&0+Sn9ARc$s5i@usXg!1t?vK-qwn~5?ku2d1j znWks%(ms9fY$A3PH>%Jca>ljS*nYfTnipHh3;OD`*EOU}z10e=wP7;nGV z9kQi~$@fYB07I9lB)!j&{h`!U)A19@Q!-Chl|kl}1%!^S!Pt2MK|fqr%OGh8So{F? zxhwM>$Ed~@nzH_Y>|zss&WeLimt$~c~rmqRr)%twnY%#PnE<@k{N^$(UcoX3S=HKvy?l5D>)VR4q` z77XLgCmtCGs3+-;NXl5wXN514^e)j7S#FFQp&AU5PQrda88?$np6Th3)uGWjI!cV`Ilwm zn~s@rm*z8#G^HCa6VzYp`Qk!E zcVB!>BVMRv4QGYEW2p7@!q^7)xrE%rxR3y(F&EzZk?ZG%9=n?vs6;a~OLrPZw6?>i zf8l@v)8;8su+L1)!%5yYu)nB14lL<&i6BsnzVREcOYFk~`B{#F2R;H#XI7p!PnPabu%PTAa%xu8w4uSQ!oD znl>PdcLZa&`!x3DStSzCXSDFw$`oj*GIH6}4Z|B)pHpvKOylGeqp)zt6VmZMT^?bV z&{opZ1V;jDb+f756l7zmcIvmqw1Qb;X(EX#BxV6tMIT}hak86twebnrqIMZ&o-iYp zl(7AE1%W;SB*dQ7M>2PUm+9;l6^{JdQ;>^c^XV%mzThCUt6 zl-S{&I*z6U0sy_h4YoPXr?5qXKY(~h*p0CnNo6{1u-f;xo&W@sO6*ak0j;>vu-~!7 z*78frdV;Qd05=`$RPMDdM9ZsFLxCEY^Fo$Aa@f=(i#aVX} zI-hWV`#UtU{0PTVN&c1ueQ~w>SUqOQztF7m%mm6#DDc)5X<geus{wT<$%kY4<1!_j74VXF7whsp{{Vg`p@LaSSiy3(17JFwU`ZRu zSKuS2-EefkEj07eRK-M$^_M$LnQlCGAq9(WV*Dio=q zWnnZ7%ENF}+ZQ=+7fdNeRm7A@n`PwRM5646%}-E$MUFDfj{fG@=4_C~@A-K-H1TmB zU2hg&Umz7w`bR1FzE8idHR(8dj=o8M;rgjzs)YT%TUdo9i1`qAA2D(3j!4PD{{VD! zG^A^pj1NmtV9co`q>}qF8+{LaB_u4W3J~Md9V%A2M8=wQ$iY=K1cYL}ik_eC^u?SR zvN#Diur?h)xKZI-^b39b@s?O}+BAf#Otz!UC5?2#;-OUTgy?5tZglx59(NeDqs$_8 zMTC(cQc5+Hk$YWj)Ow6^bZyw_tBe+pS#3jf^1pi>jt><>^3^18$!*bv_v}IHKDYoc zyg5ZNO3KllLs0GHa9C>f%qNfR>KCJ-vbvtceQ*I9YP5o}NNd}Txpf@QY9W?%_ZH33@fqMzCnPzV!l04j$q*YXM5HLZg_qimC_r5k9 zzcXi@BXzTtVIm7KVQ?&b#fdmfc2;p7O$?FMOP4?0#s#uB}tjbOAK_`c|7q-ig|SJa2UiC{hF{hAw_`% z+jEV+i;433*O{qhr>Uuc+0$5Jx7Z8Z5p(kx<(^n$nuB{~MoOr?hFIAZV{r_k#>JST zlhb{H`r;@`ww^+d)o7f$oA)cX<$s3hfQ6>=#r6v(PZ$Q18uZcnBO zEV49qjyovWvjBd3eQ|}IBJj-40s|o(H4p&)eRjmeX)0)v?7ywQ%eEL8f(TPjDmewW z7Z$(Q*9;_a^F)qg3>Nk`J>uL4snMJ2iHYWndOjOp{%7=kz)tDpua5kCf4=C zg!sR?6OHWS6%~S4b_Jf~+}m<+qq{NqPB$_SmsVEg^&+B*R*miA?yNkRbU56ytotml zj7L(#Evh>ee-%8Qp}L{;H~HdZtPyEFBPxRESxE2@z?*ribYcBp3aOR`)TBC&r~2q{ ztYJf}*C}h0YYwnJa~{{Vg@MF0*JUSrFb&O^0DEFU4>A0(hGsj4(`%{ii=G@~CSz9u zv$06E&MmQRLrMPtHlDtFV{9+xMp<_f(nyHyV~8jtp~tF`=CVwoz9IF%^tu~^afTq! zP3Lc1PHI@H5Zb`oxa)`71n8~{Tb5M{ib*7i*Y6?U`4Q-Gv(fQZSDmC3{8LS8h>n;u z7!HYIK8`mZcu|=JOt^9Ppct*G95RN{wo+DPWzctEr@?oNPmjf7c618!gJ6Lmerm ztr;y5r>mL+;A?^RTXBmzY|0vq5mYYWg9c;b)#rZy04;~l803YkMaEU4)*AT$jy09! zjF1Z4Yue|_#CCrGrKZlixLtN7x_BFb}Y`nEj3Dx`{{vQkKl&Jd6V z&Xzu6=e7mjfW*|0Qu4CtVyS`ST~WxuqiJgqwd_~O_wR|Ok4v%=bpj2(zdS~+fwKvm^vlp! zD1Ed5;6NY0tVr_bG;19^vc|NH6FszPC78)>q>Z`^c>b61ywRx5S{!EAXHCoaw}&&C zqrLd*c}FVoWumAvYUO+71at5M8tD{-~9u|JkRqYh|hk0?7f zw9Fi|gJ!LzW*u4K@e}5JU2*Jb%>_SmjZ1kK!z*bWZGcNSgU5B-W-P=4Z*khgzA>Yw z!6iUhb%^F&M(pqK^zFZ%8>g<4Tclzs4eZvqus!f33~P8vH?g@Sleg2hGA4>u77XBv z18tA}Fm@o7G6+Jnkh`!V%A}ip2TT=e8G%-bi?F!_bm{Aa$_W&V7f@rQ+-$_yTe$PW z(-!csvb})@+uOeX04~Q1ur%%`;9e5q31pWu;o3Q5H~#SyJf}DBtvd8QZ;dj$*jEJ9 z%F9Ppo>8@~5hh83`Cn4s&%PXGDCn02$_^s-ACl!6M7fG)98H-R{6?CJh8CAi_ag7O z`ETitN1dk(8eUFGmS<@=VXAz>vNo_CR7V_O1M_2zVJAOiWhkhLWqGb)l#?Aif$5m| zspauT-%iKWTN^%Kn&sK43lVx+qAkghh0fg-x-j%R;kfS5lOt^yI*jZw$|R5iM)oG(jw&CB+L}p?9FwOxuO})(fsgUU zCf3lJPqQ@qVOFFGTA_gbW)Jw^d|u^zOG#EOBPzFYx7+4AmzN*__VmIT#z`zX zr$z9Qxwgm9`Qb`7ii4sQnVnw_P|??A*|>RRc~*S6m9%lM}v z%;hqy<0Z_Tc$-hy%71NoeMjex9MGnj*$G;q`tC(~reB%T#AT2Z2)JaQ))_qi0B5c> ze9wlZh&H1sDtNWj$dB|lhaLo36ivP8r;J?marvFJvtcF z#3p)zBy=O-Oa0@pw)VGNSj7x-(!$SG90?E+c#X;OO@IsD{rY#dKR=uztBd~tzQ!q* z5w>F)onwwESRjceEYM1BY*kIc(`(;y51HwU?jPf<`zU#&r_79yK*%bgW-|tlp|NfI zfGvH;t~B)Cr!EYfvCCe|{l^yK^jNNHVEI<8jM-0iof6`GzI6!?K*_jM8d4132=txHOUj0aG+U3Xh~0dBZ&F1)Fx zLL8Cs=r+K+D6nKY90;V45p5bkUY=(erjAsMB1R+S*+#2>R>IH>ELRp~RwJo90e?&( zEiAG=nBICe=%l^FetY76!yj6CR_`T1kP8LUmK%3IxRRuD1-^r;vajKQVA&!^3mcG1 z>bow)j0_=`ONC`%+qLcw(BKxy$qOM}4%)4;QL#NOjRV>bvtAzJ(#4o#DxE4|9~5NSqx82`{KgcO zY^3Z)%%FjG0QivnOZ4*f7#+#DTaj-(01cT{hlr^-XDG}jpsq^VNm?3+Us6dM6<~JW z>$pCn^TkE9#L={7Ip+@XL+j$2Su)JkfzzJQLKsMU3Ydk2m;H4ChkaPop)rvpu}mdI zBx?#(I0TD;ciz~!)7dahXx1~j_o}F9gC0^H{{U$J04z&~IDatW3aJ*5BydG;bxgZQ z7pJN87=n%0E#RIJj?vd=m2*lqW{FimJ9Gy4Zll?iJ!E1|AI?$bBJsmgp>-SB0PC>Z zxfaHp2;^(<)Ms2PntPsYNh}Oa^vFKWWxcg4bYc5TwmKyeQ)c-$=?uJ=RN7?w(H|rH z@z?2c>x(&kL_gGuspBeG5xBzS?YYNeIZ$e50fAy{I+5EQXV}!dHCvk;vx_IuODty2 zb}H7m-2VV9Os%S2mm1}>OUk{S4nE>+_O?2yGX56JW|B3U){?4Qf+CNwAz4cv*B*GX zKE?Psq5)v8ZS2qQ&9C=c^2aps#!_va9NbqJo}1X85YbReKLT+A<_f2n`7Uc=%mZ*^ zka%@@UrF`GnVaU5)Ya5P^mRE064Czv-e_tRt6X;g^#{)!%_Pm^wPiH9)?b~4k2r)< z)s2N@Lvnv;cg1yVQ&7kfW=SJ&@aBx&Tz>=Ui-Y5*(Gpj&X#z>OBKT5Eqjj8hK7KsP5x)oTa%_-h?ATK2v zp~GKo?ia7FHx3NqUM$G-JmQCfct*0SLgpzea~Xtml;joEMSu#YNGHZWhAQI@h~p`K zaYtFqe@b?DCseD~y=BS@FGSlUr?)8iVYAU1_ zWZ%e(Tg+pYdrIT}5#q=)^~%<5fsgjbKsw#rUrKS(>66*{Y zMorG+({(2wpSVgg;amQ{*yf_bnz~LS%PE;@WUXPkxxd<#YxqGTz;C_!oDvM$&~jHb zG!(!rZ6s+bnrGPCPU~yxz0JGhIYL)Y+)7S6qcB(0@*~q%L#If$_mmr3%O1u*4SPS_ ze826R@kv-XjDX|sFuk#qfMT2baJx~wmbxmIrI>Uh9Jh@9i{;s>8txT%vf9SEG_J(c%kt`DKbOk_ zlTO7bS;Kgfhx1H}Fl@g!%jcr08-$f@sD84Zj6Fswp?aDcm8qkeNGDTZ@tyww+B2DO*b zOhhg1DbI5dBe=JifL)$J8D)B5j`wO*k9JzsLeN`99l23 z+MJh*GN;IRr!N(%>!O|BMpmGI{8V5KhjIWnuo&l=wqKn4EaO=+YP$Mr=%hdrdT9ZU zswN!>xzfX}j^h-c2__9GMWV_|$Z8QMk9BcyM{$5VDM00vDcf^x@##5U&pj&8v)0o_ z;Y~~diRfe(IIyLzcw8_gSZ{D}DJBjr9i!Ndc3)BK&Wf7r9JD!|dQ_=D;z=hh)z8g# z{{T)bs#=OE-Hk(pKXiN}>T#OBG>sp2Uhqy~Sv^BTm(WW(fqh~Uzz?5HL)zc7yt|C@ zbZqKsdMv`6UW%?i6--CUcStnY4Mg5z$9Wy9sIFV=SZ5 zTVQ`2F`}X*y*ufn7$|BzC5fxB2K8}+-H#S2MlJO z17%RU1KFB45PP)|*fWyO}AIgu+1NY?-x+!aD>dtu#u z1XxQ`Tf?!KYpU{}X0&ppj$f2V?>Wrse(8IcLVU|c50S;jL6^su<(b_?JU2;@Q$ABH z$l0Apn>wrJNgQh{f^t{9TVgLs6~86wQo)<#VzH&Ej8W7I zcxH%zvJ2{D7uv$sC$L~Vu$MU@g#n_AFiV-EkKx!kxK_2bG^*b!G zNF)fHv$gJC*4w51F_sdrUT%oN+!T`@`22)vWU1o#Acor0UcG9WRCs0PlN-ow&UbHu`_WfT?B%s zq3`p*%M!{)SzQ^Jxm$~#{jrse7#&Ab8)_G^2jz)lAjq~LqXr*)VPG%6TVfH)hf74- zmgEE1arxm4VI*c$E=z)Mr2ZDShWg=p*;5LK4<9$R03 zP4EJg(NRdr358T_7C%0u00#b;0H)5e?7xU;23uW225CsgQ58s3qg!IEEXqfi7~=lW zy^Cg9N;BDaJ`&{YJDuoP|@GSq+3ZnoqDPD8yq7oBSyqL zLs8wAuHAa#5XGJ{+MN?w18_;(>4dYO%Rr%&fX*yGua+za{hm^DGYXo{h6ut&e3{L^ za6gVdg!U=G_4%DQ{7+Ao&09RI(dB?8)(C+irn%TNkZgZcdg1SmiSkwZb*``A`ozmK zC6nIdkC?P;Ay5J6?!%}yAOL$DXZtTpU&T$t@13ePRZkpHqzVp>V}>WGJAtR?d{VWc z330Ct&%+t&O-iiPPayz<@L!-lhqu&WhK7TSI2x}a&Fd&AA*a<*OEX5H!5fth!~lDX zf==UW;qFKlnaF4*mV&B$s%c}H;$zB@PliKlf;}5=k;R6ZEY^ZKtsIKP6xFy_@;K?o zK3Mp(n_kNvN#@ zPH$%O>{E`YxKEGjsIx4-lQGMyZK?{Ng=PZE;MnOq*qe06Y|Xgb{*j4Sg0ft*E^xP~ zFqvIi_9DY;0ln?L@GP|d0N8&HGVBZ-f1c-6i$|8{kkf=8_bKw?wo&@7t-ju1V!{p} ztclpvtP{zw43b@U^SQ3_>6* z$HrVqlUHO})n-$fLeSPx&hSi!v!fMn%ws7lR%;9Bdx0w_hcK3o3dv~YoeIS~O{L>w zups{cUGT+3Syg>&Lo{4z#MNlU7%>PgI@{wm^xF~9V~LmMRH(92@IFJ5ptsv*^#Pjw zww1sK{WyhgXF5b;%>AQN)5p}(^PS9g z^iP;@woeBOi(I276|}3KXOc;kWFVa^ z029`cu~>&;wTtu^(uYmx+wvG_c(Q_HEit0Y>CvfZDCyfzA~HNpZ@f;|W7Oe#juXwY z>XvMdYC4)%E3Tc?M{3daNYqFy-q^h1N<!dKX#;%92OOj2kf#s6vt7ele%9^2Ru7#mOWkq{wBkwNzTKz6|$IoQN zI7^JA{>P5gvAUOH50K`QJ5BmGE0bB(s0jwE?|TNY`fZP6FNq&^Yfs<%9bQ>RlvRv| z8;=is5^8{o&g`}uGZh;TE937}SCgv6xffwj@oC>u0H*D2_5=A~u?AzRZ9s#4HnoNE zI`BP{Wrf&+n$Rup@TmY_7@&%tAS8uMKDf&u?&7fCAk)Z%6I#>%G_wDk*L828Il^U{$psA>u_BvN}8=I1T8~J+U5oVGS zvL!t6NY+&kAWxmf4#Pnz8!&!ZhE+{BGA;ffEzs?QGCe{WC9CC?yJ$oL7C?4@mPP93d z$!h3qON0Lah@|-U`5#<-^T!++o^YjN!JExvT#GX>Vh%#ynRK6aJl}$>?LC<fK6*DZEcRZ~xCW2Vu&i|R3-87AB9*YU=e#Wi_!)v?P(Lis%oVHy)19PK1V zV4yiF{41c`Z()n06|>QntQNN2xY&OhS$db0K@zVndTXNEbwNKm8qvmDh#m}(B#;T zoAqD7<3{U7Nj7ejp3L)Ar!=!>F-aPYglteZmB~~69BNbW9%)C#G;!vca(l6;Rf%<% zNr7*Ky@iL)#}j;tacKGimI$fop@t~Y79tkhhfDl|Ny z0RI3Jl^(1A09|j1hfLAM^+IRetqB4Si1$aRf9{paPPHJ!^Yz zN!9}2)E&XZrVOEq430-FNy54AZ6V*8SyiAD>anf=0QX|%f`^L3f7u)(l;t~ZBT@-n zPx+QC27>|p%?P;SM`?0FndD<{Xk7JAcr_=ucFZVpJ@=vM0#ssGFms@Xt*0wPyfv#jw*B4t0k`HfO zd#5RYA<|oxONFuC<$K&ilHZE2gPyu{IM!|stbaZ zQWQFY`vO7!uYnAInIuvp>RmwqGBB{)sJS}`X2q5v|h%*b^vk=45rPnHvCX%UvX zca4}QCN;A&H;fN4bMx}XNT;a+N{Qq#gJ6usY;G=g^go6bSOKUxJW?3M>RjB1TfW;H z+}wBT<%B1ih7i-!Ng_%BQh{{=x5e1uq$>c`RaGTrW@3f8Yo)Y1ZMZh;`C-~Bm@1}N zo`RvYqbSth2)@Mme*6srWu+{2CFBxL+<>-N*%%Sp_if3+l=B_H2nk!0Yc;^z=hLny zv4rIlCW0lFJDV3hhh6&L5cfxFsMJoeDErbim0Pv;+vj{OjGVS-v^HsERq=${_O{lz zZ>|x{C?L!-`KYscI4aL2F)Ve8it z;z?dix*;e>Jk`-9u5{S+ZsQkJBX9Oc3QHdh#=`3-6GW^#e~kt{n9nMu$@q6Q;#iYZ z*fIVTg<<#jIv z85UZ(c3m7R$)#9?Vlc$W-Vw05a(45ASo2l(i#1G?@SM7##FS1TvQ1;C ztL@@oNd%tO9WZRFqI}mUgD|L$C1##VDS0rgXoM(uz*PVM6^e@viZN+k$ZoVYwKra{Jyva%I_n|{sRNO7eIbyLdY><* zE-6pV6Zu)FdsF_@&0j+%QS9!LdTAwHFPYTo<{M#M`j%kDLDhG zJO#aU{V~IMvp=rl4AxA-zM@Krotd6V8tm-G?8NsZo8l!n@u;dPCf%}+QPv12S8H{} z?+?wNK+Gs9rjc0x0L+N#7y7Ng9AH{>ZE#X&@`aXs+B#`J@ZqCIDt#Ht8~m`+WO3D( zIktD3R+G{>t5_-eEwGdlcjSK>Rjm;eoI8`t&G&4wnOET?4S$PVpT`K-ajsuXG*YY7 z+sneE()iM-%_hp>#JT2YC9>)`;0?Dh?g!NE_+wz<+_fT~-ZOmWTA5sFF{mOn`rGr{ z8DyKPiE1m!x_|V4B%?L8B3UDtEJ;aBp`K&*{!v zHFA-a<*cNwEidby`rps>ZPNC~G?y6tS=Z_EC}dK78wFnuW)!g(NSbI=8@hPF9;9^o zfr?2YXyhi=VdQr>QE8s^KvOmvMgQp6~-soea${_FwD@>@~Adjdq9XoII#Ho?$WN2ear=5!%$j4#a z?b{5Jz(FiAO0Nn)V?Y6Y*82^vEz^JFg`%i{vc_qt=Gf@D*d2w*9=)+CSyx0}nn@|; zR1kuX;XJU-e@lyYz3@7Dvlw*3&mzZi+7>$m7T(~2^B%YpT`=97E?C^$x)qYO;CqxB zLM$z@H`wid_(c{3ai zf^k<4W}G{jH3n@+VVG|lfq3Nux;IAt9q~sZ$kfK1lgca{4<_>-SnZ2aR*qe#M)T~h zr`+kNCy;_DIEI>LK1xbA{{Yr;^!FDfMOO~-ZwiIDs)|t--ARqWvH6jUtpjvxbUDRr zS+yp8!?o)SQ}FCj)c`;`l_FJZd4fpw3NOIYB~++MmN8`u zw#L^6*0H`SHuTU+meIU_Xg&lU(>v~ZcKgtW{A5rzw?&8(vAqkDB2 zt{Gh%=TuN5vup~0NjUn*d_3_|i%olZ$oGLij-P!e>yp41XMDD5$zE zNwW7YH1a@KnHr5mfJXgx7(A57l@V!BQ+;3#yKQgJ80{J^gBfW8h{6cuCcsFgN9Hg( zhRP6+dP+&0d{!#f{I7zBPL{e6Ac})2lBP%aR-Tlx`dAE3s;h`$jL4inG%N<@rl2Da znjP?0uxrVzS8+~uUE&4^NNW)q>mZL^@T*m4wW>qZ)aWMmGH4%_u`Wd@qtImT&#HMA z{+pk~;?j#Pr$Q|PxgFeJ5ZKGeIdDVHsF5Lwdb^MnaTm{q(B;T=Y2H}{h#p{e9;b8I zVk^l>ThQMR*CN(Km{!cGm(s{sv;P41iLJ7M< z?dH++`mf=P-Y$DB%_em0rhXsdT0efsGZ<$UvpqZ6(*2o!A@#+6Z^LaSxg@2AVr)!{ zw1aO=xA|ihsna?!W|SSo)a$Ysk(esU9>&_v*Ydt8YI4b8Ab>RY^B+FP4NJp4oEa8X z$_s0>3zD8|k74mTzF(;P=4rt2rPOLWT>P!jVk;9!ku=phirg*KC?AOVW2T)SDSI=n z0SFEyEPMv?SP|whbpTQ?D@0+edvDWkKI436TQ2;AsHK)>Dvq%-wZLTXvGTu{Oe&c? zfe0)MTW|mt9)st%Tw2$HdnG1SAem#Pk}hD~H9dhKb{9UsTv$VuP9qI2iN@N3Ik&Fo z<%5=mUIWr)@S3YF6NJ&F+EOfS>OB7do*$BySXrYl62}UL2^tVcBIE<;K)~A?1yUBO z1Zsm)RLCDtA#@9FNhf=G92z{no+4z9k~Wn_qpXLy^SH3+dk(mrkG38Z2=J#qGF1t2 zvXW0tx8LRKg=LZmCf7Yo3UzJGBTygLo)tDR2BJit-z0jtd8k;8S0s9Az0HqY8k;?% zYN%n2XJ#w`16HL6yD95$p4gmg^hBRhXmAP+u7Fd*M5$fB_6MJ{-g3UCZ?xryDPh!DKhGsXnQf-7bRf_hOaS)nQ ztqHJ*Ax7?R-*9luyy|Gm$278`wuX{ITc`8e39u8+a>@+%CwdI;FNUU#=uz_wolf$P6p#abqyTjNp|_qd6!^-#Gdz&BXxF$jj#g(# zUdCt^Xo>Few{P^bei-|cfa>yzavCl+u0@sSqKlOf8jDQI0{}e17W{GF6>5>n-7{0D zsi4ZFmnzCKigagT9FZGJ7y)3H+@8YYrLB!>rh|&#hh*X|AIVxOih7d;R$oyfthAv< zvZ~BQ$?%nK;@e*n%|4e!Rd!mBYZ;#n`?_ayBvkV_jwx!BV#HrTaj-pl`C-3l{B)d4 z?7Ke8Wu{QiLi5Jx+LV~Va6$6$;rvwB%)e25I_aM%*fQ^NSp7$*lKHOwzjBi^rQwM#`EMSu zP}W%UJgw1y{{S);zu+-k*;N51{A-Yr*ofud{{U`2nbe-7zp3)cNLN|rr%|xmqS$1E}&8_N{)iS z6a28;akCrQjv!_yt)QbH-fGcUeZX}$;4qZ@M#V^=r3kV9}lUXatG#j0LZMIl6JG^&n@zbsA(>S>!* z9Pbj|`bUXR%pI|4i!SnxDX+`wqpOddM^PWcRYdHJKA8Fw*w3}8xQ4PUi#?Vp>SP4c z)kXregbS2#KKEM@jPk>hzhTBrGpo*&b&6TgGjy>YEL2wT^bSiv$b^dmz;E>F_1he6 z9hmY;4N5MVOn7Ckbx>+O&aS_fJ&CBEr}@9B_g}I#nq-bbk&wInH^JbF1!h_FS6<$xOp(IQ_^->;vYuq}fR9)WgJ04t~}Z)3gsj@X!VjEQwf!~>@42cF-%3Wk_k zb5kTv5(m&9t9Y($u-muH;Amb}T6b0P3#jR}_usZ12VtFKNTX1T7WZ~gH#Qzt{PBPx znm$Z{>QX&I%r|es-R*@|I|kW(5r6xTGGFfzs2zaZ>^$%UrjDMVO0>i~0vv!I#IYTH zde~w^v7S^Z{o(YHaI9BwFX(q2_UXPANFA$XXyv4kEy#G|8v5GAowpxM6a$e!=?QaG z#4`dcs-bV_0LEk$3Cx8hrC9-D0UHhb-0pgMVOY=_iYjW2EhMo>$4$yjpzq{&zWuPp z3=d5b#Y}1ELI`J==_1$LruZp`+wJ2pK$_0U6>wHTX zV+&5j%Ssqof~c{zx9E4iAR>KwP?S~&UciP2VhBIW5(hEj?`80|Wfu@|#4%D-YyR<< z2Ld^i+%bs#({9}f>1=Gi$z;tlo(-3WGT>*b$?7DLU9hfHE8uD{w zjWkv9^2nOjE{;j+pr?wSNzfs>DQOu=H}7Py z^amQYNexC-mekSE*3^mw$?D#w86Q%xXjxR-aHmr*LyYAnrA0=#*{WvmYQdzC(ZCl? z_G_GIb=4#EgmNnBRF?L)mI-z=9#f&@1E6D%ETvR{#9R=4MigY??K&BRnnYa*E1*3> zwTIz>9ag@_^1`A z7X#!kiIrwicXQ+|Z{372W=d$uX$)8OH#o~?^s$R5ceiC*3;+!0RgH5`Oo_L|+y4L| zg=#9RC)%dD^!}nBECP?DMQq1EEA#C9FaDcRvp0@ zeWFjKJ(6+WeV%aUy4qx`mXcq0c~t3XJRs}eYuN5K$3>vesA`6i!X{I0T)Q>>0qfA? zl2P7{h&x57sD|4%-{r@#p94-uDuoSz3`U*DlAJV*>;W!X*ZL2xJ6VG4^1DW>%WK-i z4JW^Dm@G0EBrA|_b91o%x58+o!_&-x#?}N}7B(08Vs(ZRkxLwFC7cqr)J2D0`~0w| zESmg35|snW#`wgAC5w|NMh$T4I)U5kx62blu$1AF`a(w3HK`T5{uKwFkw^xsHk__rk7-LKGE-&qK z1(L!((h^%y_|ENf+s@y+3JAa@jAUHxsEZTlVZIQ_z{{m0k%AU$YHM3-`Fecuok<`? zLKuKb*+>V!Y$^jcpP8gQA+M>x)n!xAkC&gW6RDo)>j_pZyYm1b0e+uSFje$BGL!&G z3%k1{e+Z2fFQ1oApO*M~T1aK4ngJuD$}Yi8&CgB0J-qOkBm$zE2qdScmYR74gsg0% zz@8F(R_W0FNW^I2_jpwZ0b?H(?njxi`eH_mt6pESaM$>a><9w=x(}W*tW@byey!5? zzpr8Z@WcvLerqb~XFDy1`yGY6y6ufh3b{BB+I=p40AWW~b+`*)bsw}({{WZQ8+v#D z0Fu4T^DmV8ca@THMoK1@nwGwbvI3`C19V}!->Anq%(x<>g)8%1){eC$$?GGfK~7-` z@H9n{Zo_68WFqH%miM+dO~unPYnIWadsxVG&L-gqA>mp|O8nx9+)0xL-ls%qvCQbO}ee(H{&%L?cVX?SZfriWbSnlo$YGMj)r$QH)A?+#)zMH#p2 z5JHwhz-xUvNEpxCxjsXuva@QR%bA}@U zj^g(6>wrPgToA)azd?Iq(}%L!-0L@|%IG5orlEqVV`V|zkD$YDm6Cla!r4s^59HL@ zO$#Q3QeHxT#dFn<&fkU~Ras*ZHj`!eSXd3dnB~3Mx>Sg0f4fw{dw7RW!yd$1FZ2^c zM!n6Gu~YeCF@!yCcD0A@$5PRlT^HQDDct(o1xSx6)GneD_ARGY`{6%ftL%|N@&H)5 z>ET|3w%_!@QX?Fjq_*tD4f}Mq-EgjggVKo=n3qBUvZC*Og~!hlYY-(}AT70v-rhu8 z39<2`6!J1gT2^*9xl>?NoEKX*kj@Z|Jf&bkJ6_;-H~sh;L1f=aFRDSQZlybeZz0nD zzDEOt-n2$Esy46%g@=o&C%&q3KQIiboB&nny8EsV3NPY?5LG2d!9uOs5_8L5vb%qiygh#5i_+!8jp>J9CW zQ-aF5ql=S&m1?+@xc<>=^a8$acn6#y?W7*~&AS+EOF2xHn=Op*?X+GTj*7`nLLc;}*?Jx{*Th zK%i7ZP^)QJkny#E(_ynOd+uO@Cl5>n-AfJVoUTk-|@f$k)QxrZ-!$4_ZRu#CAuHV=xVbZ!W_PamFKCH z*%1ZFJ<0MG?~eZfz+5Ru!ntSxR(#HNy-h{`0QN7EkIdsdvhY+Dvt)^g8skwSAlVq$ zeS70NfeINHdt7O`>1~cOMx?@vd3spm*jBxQ#URzo22T*b!)sd}NdUgXQR)vv<&K&n z!z`+(%W?@8U_Xzg@X=N=?H`K30(KpG_rysSjG<>K8kqq@W1{^Bt~0JhP+l2WF*XXq z?e*=6vWWyKrQ9Z;BEXa8E4GR^h@=IUB_WQR5H{G}`+vRxSP7$TUug!S=HY~d z0DFUnS}iRZ(apHJSet>|U%$%(b`(TM$#ss;rCRno_S=5;zA-w-B`fb7tObttBzXby z!ss5xBOo0lkeW`blY8G`f1mEb$B$qEP}+&HxIHk243-W{AuYP;djQ_McEHLKtEG{F z2E>pp-rl|X;1@<_5#(-KkTHdR)c6kL`p*S}NL_UZXxY+OsF5hUznJq@?p z5AG)YiAxePF?ahzYiIz0@;^)srifJOT7ZsD;`_JbzichGK7u?twMvZSG-q9uTfO@I zFgmE2=UbK4y9B>|{{Ri}lLJfkkHE2U9Ah)eB#MJLMbmZ`Nx&N{mhadw9){zm6Rga$ zejLo7F3f1Fa?14t6phLkTia5OjHbtRBx9onUOy`^$qyxMZhX}<^JPkzWKc+wrSEJ} zW|@(jV)}sc>GQTWl#U(W!= zrj$vt#F3BL>w$rQ2?Zw;3BOLb0Gg+!2$6bV0P&$;Ofv`<7X#4X5Zp;|({bL|Wftqb z?}i}Is{l6CJL3NUgm`l@;(F0Xl){b_-dUtJNJo2~{{SI#gyqFsCGF_?3xl{vDd7qg zj*m?B(wk3LGL24c(SKEZhvIR2ENaYcb=#{CrvA9)+uJvaNl}YAjerD#EKh#F*WrQa zZ3G8>C#Ioqo){h)RB7jtZLMyY_9US@kG$R+>~SsISOk>>*x#>~I?RH`iUrJr#c(V; z;j*j>=(2_JYB$tI{c#PJkv2o12-w8TH+6D8x5ubfHI0=)RxRQ2l0m=j{uqwR9h4Bo z-LGSRiv73xl5rIKXI7MJLJ2nOupO`i2o}uO`=?M%R@1kCJb5*k?QY_DYzEim-*cg)u7*Oh_E0X7BTa7l@0q56zNtt`w8%wBMlsA7z$&waDy_@XG)H@p|k2IWS_r)(-6k#;<{joB0uEFDi@i_7}HFto@d z6)kr*I&E#X>%UweBvM6_?A#EWG z>D#~KivB0z{F{if-*V2fxa(;^CMJ_+O@X>F-A|}LjuSzqaUL@EADX7Rt_{tawi}=B zbdMtfH3o3p`~3`5uIPjx~l$)9lJoqNCiO%NTk` zL2|anq}dS*TVt{7zg$OtAfcLQ_tH~tn zs(*Bf_Y`#Q42}MF=%dhY^2cAI%W~QpC}=2Ysp%=x{4|X;gguS=pPzhl%3PkhG=wX# z+FL-5Ye}hXuKJDre>`MI7&=0hAP*BZ!>4RXWC_#*F$$#G_WrMk?%~yobhXbxwitl~ zYi^EDeTF@W*!EVen-u{3u*^Eb7|y0sxB&Mac<6W02qvu%*o^}A*mWIoh~ILiRn(@| z)IWw7g0Ev~JT9!Pu9|kRTQBd#kjTUXs4=#dVYnYmC!wcfI*TJ~)nG}nwa>5h+W?Fj zexb>=w`<=0wm6&E=*2va=fiOOc^i*i@bHpNI^M?3ds}8bHroxP2#T;Eh9^+DBEzqh zueJ&YF2Q3C4a2s*EOzo2#5F^+7Aq2x8C>iQiQl$8b0oq-@e)`lR=7J0lE=4S%K%y> z3!w^Skr4pY;Z$6ZdSCfqI_)VX2H@!pzMwkndRo|GC3L&Ki4}#7$=`8tx0hY9fUFiK zSro>$Ivc;sY%v5#*~R3h0x&Ii9lZhkF$lz**+HGklVR9iz+T>)ei%-?4`G6s9i?Z8 zf`N{ccD={W`0!}0yIrgaEKZdpZT`Q<38uklVd7=ngRE>f3{CeU*vwM4lN)F%rrNp# z{JP>w3mFXBS@fu3rI-_IbRVB=Vp9{uh=iLRD!}#hx1IoCc`>$-6pj2hBXSP*A71#4 z;3LG1Vr|T|!MDr$-vbp8lsn!%D3OJ>o|hwi$EWbZnT<4Zr@BuBH8iewhG>L{=ee=+ z^1`ISnlBN1DBwKV-QmjQ%4c8*l7>Qwe^fVLzypmszt}f{n=9gt#^O54O~~KxBYqwn zHIi}HXom#)HQKLX+*G&GS&_=1{9MUYf%RKri;4Z1*6_t7b$Rx8mq84=`D;q1X(Z4F ztt!PY*UuV9E0d)XTpHP+R>c82X_BC*KOCe2f6_J|E1V`_Z!6@f(an?we5n4ZEJu(b^!%QHexpH2Idnv}v-$Ll~P9$O@RlWZ3*bD|G5tb2Fa~U5tn3;=xr#Ii!Hu;pHDwL0$BqflZ8e=jT`BI8V~Tl)in19&2YlsHL;88MP{K@6w*@e8x#uf%^jUa%0@KYU=kWBuxI zSl`J~=KhA*-f~}K*&Q{;b(+sxFk9)3xeIw(t@18(;9i48t*Z8X24b2~}T* z*AS2r;3Q?bfu!{~egF?Fo$fdNqmN*qumKU&cuO$=GL`A_#AaJ50fyJO{=4H;$9ut;W>(K%)$s9(d-oG^%_HLrgcU_x%b-$7H#8rV+5JnUW1=au|K)1{OxB&Ffj!}+M zh%7A1b|=XFFe#g#0gZ{$2qckpzhSpQY&7&wY&yj!AO>VG#tN5=5Uq1!es(wvq%=b8 zRZ8q*z54XA+oiskmQoL=QZ&ax$EfI80lRkXd)(g*phbmk7+~PoF#(7I{XD!|8-DC3 zR6ii4WoA0YUZY(=@z9l5YHlezf0JW`eQR~y^fB;HMMo<`Cbp6q(wE@!m0n-MF zq%yxUL{nknDX5Q6`u;df2rT;I2FmP=dTu)R-?j=J3pSP#YqpnW+Q-O!FaZf<&@={T z0m(nt$b7Nr^oUG`Zf3xOyOD9<$m}=t!=@|uJg;RENULUTR~v#ZZcmmx`U||$NRr5+ z>`L2Jx3}ekuwroBT~;Gd!*^YP^4rX8Ki>p`WnNk`BeB>c+}pm^u^adF!AMDwW?1HH z>UWIp5w$Xn>^kprgGnN>NacsZ29me46}j^7gir|N)Olq?0cIpEird%v>w^eP$XcD_ zQlp`8E=jlNg!>m_v(is)d{Kl`sH%q+)we_ZFcqYz39S(jFhBEtCHi&3V=+-f9aM5h zTOAclI+Q9+3do=y+l`Lhdg8K96XEV+6T`VV8VcOd!~wSd0IT`pc&}ijQdj#n;EcgU zjl=YCGY=4f><_LN za=gx4qdu$MN%3EM;i%A?7i*Rm18sn7-rrwLLLfw_$vKSN`0srqalY87w)znC6+i{( z?nSpd4=$D)`uSn-Y1P>o7nm-h&C=vmvn#<+BSs`LBNA=YsK4*V#DaydDh5?Lm?`;TnrCu|rHKzl#bR@xIP>2^*9Xc$))#z#o47)A%L+5t{W2}8j6Wv zX0mf41n2+@@BD@pHdSO$6bUV`>xudmMr4H%Rl#GZ5LBJI1N=?_8?j(7vo5Q48xvva zibSyVq`c}5*4SIn8-DB&38<1d&7{kFkjOO#8Hx`x&r#`wvaC9!#>c+q5AT$UC)jj+n7j*>P}ZeT3KwZ_Bu zpT`IgEk&ab(CPxirWdT4;*k|>b*Q-`eaCMs3vPk*$w=B`=2$UQ)xP)Np*?Ma2oiY= zGF*WUtMw%8JN)r7*Fcz_TRe?5K)#zMkU={Oh5g3`5;weZ2FtqM=Hw2ayA5;zYn5dh z+yY4?{s-{ID@h}yyvZH(&bGTB)xq@zy${o@bJIp-i3vAb{J)OamXjn?O3wO`YzS@a zb#3z4U~YntjD?w%%eDJ&(`-VynET0NsK&xEe&YAv@W#m*f@die)BqF%Zq2yZ;fmHP zZ6FKAt<$00-vtW9A*hx~s!^B~3vqBZ-Fki}4J=6K6JJDK6JJDCcmx3G1LypNl^(= z01yxmpy~4fd~8#^i?~~u0ss;clmJKo000F*00IVpe{#VIJPtVFp&&)~BM!>+x$;8CT%m%;*WCs523-6}` zIsahMKhDHM06;$rdPYWikodp-lKqr}{(}uaF;K$aIzXSk0w?_4*7c7(5&AFe`-y=Q z|CWdTY5R{n_7j8sBTxOr5Q%@^E7+gW{0C!vGW0(>xt}`Ti4cIR&(2Cdap)(8{H#cY z_%opY_{l&|50v+xV+Q;W_W#re`3L{{Jb~r?J(jtj;|O2yxBZ1rjPMU$|HOy|{}~hX zf5U)6h`%t%pFWEImj5B(f5RaEhCz$|wz>Cd6a3%gfPZ`({bcq(_xZnx&VMBX`={;w zClh?~w|`2&KYr=`b6xg136DMnUp}=#0JMJs3i9VJK>ix7Gmt;pf8)DP4El+QKJhEa z-**1YX8zAg@Xr>QpIG`6LjeAs+18&J67csZVuv7n&VS&)dJO)Q!+pwiKXK6~M*K$y z00;p3V-xBV;d~lK{=_(+m=^qxcYpg}3jQbJK!4qu?I*?r{AVO_0RK61xStsDv$Xw; zJl?*n zfc}qbzYo8^BK$d?2Y{;o&=dYMvp%2QZ-2$%za}7n<6rT4{_6@H@bbUa{9H?9#5n(_ zCz(J}UPSC)^`aJzHf{!vCIqS`j!qVzk39n|J^lZ|-oF#*Kcy82;IDE2Lw{n8@^3mM z|LEy}{H?d~&wzh?(qFQFpSu4CV*O;Y&o-d{2YvH@>i!qKKMsKXEeHFQV|`v`e)bLZ z8S6fTvZ&06yKkzRgM6escF@PF?{yEc*|A+JZ$DiYG zZJNIh%>UgG{(q1N{#k|pKK?~y|AGFzjZ1+4i-!Lnr9W#U@L!LVA_w~?`nR_v;(xvw zff4`n&G;7$LIJk_lu8hPWhZ}D!aocS0Qo0R`SYaxE0^Jf`p;ZO5bA%-Wq^SHUY+m0 zd|v;9$NpJz{^!i(zv;i}zv;i}zv;i}zv;i}zv;i}|DE))^05X820(#>LxO`rK|(-6 zLqWm7p&`J*!ouNvK}AF(#3d#o#38^Zp8e)VPIwB>?hQ`8@!}>#V|99x47k~r_a0ldp01*O!k$^yufIbF+ z3O>_mFrdHaUk(ESgMfm8LqI}7!vKBe@c*L!r4kVU3=g-R;@QBF7q~w&;wDgS3g2JNW zlG3vBiiXCf=9bpB_KyC6!J*-i(XsKl`Gv)$<&~eS+dI2^`v-?d$0ye}w|Dmsk5A7p zNS`hPgMxy9Li}+V2-xk<{UCvY5i)=y3n)MsID8>u41h!tOvtbAgCb^9yh1f}oP|as zVcsUa{^RvuPXFKYIq?6H)BoY~f4Kay3V;Rq{4PTRK?3jrPMdzONxgC28@0tvhp@pS zLhW*U-kqyzgwGkLg{IPD>J0C2fb=YV<2gT(qlw<&ec9Z+CJXG}nsS|%Pg$44^(a>w z;fxte8?A5lAE8SXZeaQV5Kvgm8*`~2HuvB@g$^HRSxIb%vTF~w1tSC4FTY9df4we^ zFw-Mt(Mq573;nXcdmOFkX;)WcV?L{G*^RMiS6g$?W}HhJ=Usdq@3e5x9_6ly|3&M2 zefL%~fl#*D0q${8O%*zC>d#nCkmX2(-yFQV%^+CdXBcW8I801Pao43NT&~+;ZOlNJ zy6|W8-1_%-82!g-)o~2S#DG!j!Yj7swNJZL5BOdT?oa(35O<48yd^~0BSFHo{%liF-!Z+Wypsa{sG zks)c(ibz$1EVM#BjAzne?c$kEqnVK69{&JX-fSr2sU55jh4~^J$QY2{7H#D$XGs3` z8I~=lUh)k4i9YEOeTGsto<8ifRx2lYcwcE_dviFZUSr%McW;iqk9j(>%+kd^lRCzQ zysosgDQ5Lc+}61V#4>exX-|Ip*JLyje-f#9cu?4|7 zMZlded$Bq1$;_8WJe>FvP&*_sCvw_Kt@#inSBzfQit^zTM4{2RrP;eUN@sI)emXCK#Rk86|nnV5i+A-{m!S-+Sebu?bPhl#N`jFRK;MiiuJO{RPU4TXrsP9L%l1jr}{$qU^@IBybxueFhN+ zQOIoucT@THmMbyJMsB#vW!m43xr$pL#!?nuf?kiQS!h%}Oj(zyumwBQIRLxeOv1}Q zHyDN`*Vouno3_xcT9L);X0XExEOfGwnw5<+TTQOv-{n$8WwUQQYAj|OI*xyAvecZt z-&XwiE>UJ_J7Gg~snBVK<9FYv1J@d!3$kyybPfbaqRc*jB*yU(^@AQsSv}~UB{Q`Z zt2b1_DPC-cmp!{aJr=#!-g|Rc&HG`lx^a^Sbq~Q@1JA1n?8gZ(;MKf{%h_^I`ZlqY zFi~+JD}E$shB8Q&s~4;tx5JaHgyDyVQgI{7dk=6V2Fd=lFuUGyC2nwJ#U#Wuw44+J z_CEZs-5Dy-H-4KiBl*i{p_-0bku+sg12{R`AYw)+AkK0#IAzsSuRO*1EcfBaB5S2M zA#^FYg;&iwHYopP@0~>>z-!%A;oUFC_15~EQ&8%%m6bVlkuhHPcU97tCdTJ*drvH< z%M}XSWoNaPg|E#P->chliBbH^IF#Zh@(yZ`R+qk&G_o8d(&6kHFrh*{=?6W{VaGiD zIBL>E>cbCTy7Im1Vk|VQ2gr zImWUadPoCmx-%4O+^R7C(&QVq=!sXDeOS=+y>-FHsJ+o86%$;jwzSxU#mqPQxR}<& zwk#nHqGWdk*^yL{=P{ql_6|KItnw$FqCyi%ZGqczCCZKVSMQBSp9sGZ5Qz zRvLHAdLVDpa)ycktgpgNjToQa2S5ejXhQFZeVZS^KDxWq$U^_BjYY#j3)@K;5hc#B zVASOi(>0p_D_dn~Y9ZfXL(sw$wEU!6LAz$L9$~8)`>qbqey;xjxXchA`3={soES~U zllS51|2phJotG_TjdN+_IFzALopILg)RDzjzfhA)bT8V&NN$1H{^mE4IUab=B3@$C z32F=hJ3#gB@meWo;pcYAq@4K}uWml4XNh3*kfo(qne(U^z7SVl<^so1MVkv{dyZ`} zlAZ)E`hs__JyF?s@-^p9CT4y=6g%!2QWK1u{?_vYAf%I18hQ8IKFWe*FMn8x*cNtJEt-R8ES;ND)6gEe0x92J2$m6P!?`D^BlNlasgMi@b~=jMT)}gpqHy7X=hR z7&Os)^t-3A8&({WCtDFk1Ur}W^_#0FXv>i$tICcWjZ5DG{bPFR_N{#hIe*P% zgLNiei=14TxyDUcaK^6m4(j6V(cI&7NM&!avoPeS61q zs{VV*IngU)V&gVS3oEfS({Y3h<8XeisHFkEch$q!`~#3G3m`l4#5!`-Ts=L0IG8)UI*;F#RjGtWTF8^n5&Z26m_Gskm1RsBmOd6WvwW6fi%+b)v^F zhvy#?obRhFm+1EKtf)Fe5p|$g_^}~D^#guH zC#)4~XweBeTx02hpgVh1;Slejhr?g z7v$~!g-tV}iZ~m+KKXh~bUW?!UH2|?f6<%H8S2)vrpWO9Wb8qzlXy8uleOcd8;Cn{ zTH&OHIqK+<*=Rwa5AGSO5wAo!5J9%BYMe&G&91CA#Sst>TUo21*#Qx8Z$l>^CD(5J zz1g*2g77)s3;+5uHo2z=od!1&3W}C#& zajl~XDrrql3}oaCL=K)kJccu+51f=8Mq367Uka_S2GB5^tB!;RQu1a0>wu)}z1TcsMG(2cx#rNC8!c@@o5-)`StRtoVmWbQQ)shxrPh??mx&Ho zrd4%4U8merDwOkeWwF`Z@G_HJGq`L(xC9PQr7&+ssgiO_x{UIgFpRhrQ~U4vB&Ch; z#KWIQAvWvpYY{A7*1>FPZr;#@F^pgEuctmE!u_ayqXE8E(1i)32q;b5U;tr1N@cS3ZMZLp59b9q+}qx#@%coB=4oqUJsczlxlIF_35y;U%-j4i1|W1o;qY54`QpSn60lG?UgjQ-0#`I z#uM2OZ%brc1w#jXfNF+;NBq7*if{}&Y<@eKAwr%7*~*ncgNcT+kFG&X$hH~9@u9p^ z3=@b=zg!9hEg~G<#mj9Ta!>1x*A-vp6h~aglcWXy@`iBydZN_Wvk9kn$Dsqiy0bjY z8owoKm_RB*7|Kb{@fuKTkR{(1xS*~lO4JIE#ZlZ#UOf$gOE1Q!pjGTAwlLQ7eTQ3W zn{a!UXHTteV@1y4w?E1HE-8c?_`_RV2!jg`nSmnYW=_t}?@TuzfDob834!~C zOK*;Hci)>ao8p}6S_JBws~Vp;gC}2(>dF}Sllg=2OWFJo6H=RpqvuGAm@M}Iu0(UgyT`XpS8Ra+U?267`y_w z73uK}>r)Ki5;~(tQf4TWqed2*{D9N;cD^vrl#8P#o%l6JH_z@pI0mIhgxw*g^F;V8 zQLbHPz*5RSu~Vau<$fbl0DlZ*6fyv_R_m&GDc>M}0Cg{96rYlPAH5;z-G|bwPRwES zCo#@q2)D8RL&>;srzeF$A|u7Xo^E?NCW$-dF5s@1k4`C42vr;GJX5Fd_u@k{d!I!g6IbT%fXiRNJdBf76Emr7V2lSmc`25tsJFTJq|*# z)3w|_|LmAuq88y|I1i_%VN=&V(GsCYFP}?@7)jqKmjs`-Jg6}`2ME5TW4{atSu8Mu zm%ft}V%Ydy+hC~kD1;_+>FzoixJbKJSj7xE&*Io|r zO!b89+uYnHASnF-GWXdq(HOIc_RCWiF{l6;ss9(So^cYY3?0b|DJDh zBxNBuu3WQZEMTWfxMDjCui1>?dbKEDc1S37m|VJjoe>@P2#FEjVP;o+Bv*@1_b!xK zAE(BHH@y@Q))}!?(FiWh2t|dlY};x(Fq>C#2Q< zcpDJM!(|X=AV}%`zF{AZAz|ggEqYS97Rz7?!HApepv}xy68jAvCvmfnpZ~U}Nx=Uf zKafHGmz$pc`~U#|zwrNQcl2MCf0;r2%l5yvA^*2+5dT97k^toI68JxU;~@AS75_z` z|K=?Je{}2rw}{}c-w*y=5dFCX1t$0u|E)rR`1g$f{bd3AZ~OlLVG8K)|JeRq{V74n z|FVP#1b`y=r<(k){a+yf7zijRC+;*$_yV4z@;5Rj3P5Rj0*py8l@ zLBT>rLc$=#z{17F$H)JIPDDb4M}mWgkN3w2&}UN!a0qxvNO(LHBow^=zv<&0F!NQN zM%cu_+Qd=R<MC~ zI#D^AIGH$pI!pWYuT5Mw zA;3Yvfnk9D>}n$cz>o>Szc2_8DHuSYFggSf3nt{FDjL@J&0ay0FgXTpqX}J;GAkJ+ z7N8q{WnmQ-QFdzRADG+uw21w$jq?ATaQ|$Se^xRheR>1@SC63JAV7atB7qPhGYEhx zd?7M$0AmbDKvB%E2S*kB?2DLb+wgzf^sSoQnNp(zZlw3v?)ZW-A`hAce~4|Wm*YSN zepMoozW+Sve786wKRYjmmyan}G1XT8b@yrn)MJE{cdC%u#@P->M}x%<(f-Z)!Z@>% zR4ie9^^D(c$H6EiivZ$g#8oySScUD8M$uzA)V)k`o<({>pqfZ)BOI=UgVrF`Vc1MS zPATo`-AFbM?SO_$90TcQ*j6#JD8?X0V$DRy@5{dP)rj~{A5Yc(*NSq|a;2g`77ef} z&nUdKVM_N(njA`!()`+}fwy@rDqI0umv~zNvb=Hf6y{~{Zp5Gx0>B@jIk#{<9HsEcI63mc zsJ~mcm+#;dG}L4!mXwFU>4h(($7TvbfhhbQJhP_RkJ7VdDAK#iEB!6$lq52iImrBu z$dYy0)p;4+gr& zLR_{0G0>w|GJ@z~h>!Ybs2o)89`y*h_jQ#{)n>~CoPA{1?rhz)Ml&mJsEh5 zn_MY%aHi?0gUZiLQ<8h!OZ7cEUjuVlfH45G(ZhM`H11olwe|#l=&6x!uKG!g4ZNzd zy&uAigx)#UH-^w0((+LXssbwVG-*av5rVD`1|2qBk@~5&Oa@pDn+Tv?nz^Op2tWQF zh&8{T^b!aUe%qH`F~qQoa7bVGXHQ57)|xNvimw+aNdi-(`&7@I10kEc_|m+QFQRmy z_nCfAcbiZrm$25sZZ~UVJM)BMCZ=%gFKJ0C)2ysh#t{bJ4KyH4jgbjK2gi zqqksVr4yP$TSLLL_1Ihisjw=EHW!!|BWi;(#IT-vk@ErZoG+s(Ah?BzM^naek-yfl z>8Bu8nm1vZEJ0$~R?od%u9bkuD6j|@xFeN3YFm4b$zn) z>G;Jo0be3ObP{c8=o$5luMGk*KrNv0LSHY3$#Qdljss!VS;=?u)CmevW}Ik2HwA>#xni@ z!_cGT0DvdgEpTe1OF(CELxwQ-J+CcQ#RJe$SsJ-~LTxSbg4<=k67NcUwwp{P=?aZ4 zgzGHZG>LY^zq-svO=<**#|Du`NC`zKucgu@r>$(t0xq#r;HhbD z2$m@z|M+#FzYMZb_jhjZBZ+=^(Va91#Hy@$P*-49unH^oR$FtIr~ciSW-02%Avux+ znpI`Rmc^#YrNN6c)i@Rhbz+9;;c*SO5ug|H(`oH5tkjEgZByPkU zuHE40vKQm$PKP_&ewX#|Xc1}%zy(Fp{k=X<*n%0w9GIBR#n_0ZqD%{9(@UaP9ndq6 zb(n_nbu7;MCp!pz;iQ#QSy{z)IYJuGpd+wIY|e;6j9JWJiFKj@iT_v*!;2dzs z&q$Y9kYN*DN9lcH^Ip;*MA1PQABVCrR2fXeyE)}~aV*kA<+lAwgy1{0b-m*H8J1h~ zq7}2r!z$H8q6AWIBZ*kViXvbDiA~$>UGJ@ChlL2&yu$CY{rZ$5!ZB*d9+_V775RB_ zPu}NAC8Ej)xK!BQW!Mhsf>@Dsid17@X3D)SN7i;8iIM3!u?mYhqV=MLV3R5+rMWke z*XthArXPD*u8|)A6U0VUFSQIg@)DUZ4HcR%C5n82Z*)i_Y`bL%W@CA&q7iU>5u;B6 zFkS{~69wL9ze|7f2&l=N$%PbDmuhkp6jBn`$&cbT@qEv)UVf|Gb&q5b16orTaFl%@ z*_yGFmYQebQKOvij||+)p$uHxc2BJmA|5A2?&?(!pDS2G>rvV~1V)OKgvL@)FH~>? zt%GKfuo)xkK151rghZ225uTt*tgizUtQmN%wMz5;MyThc0MnFWQW`@(r4)`bwc$DQ zwDXfq?WH6?ZW2(^fNf43BFw~ZYDDJ&paWK{>4MC`p|X{Sr6o|RZA6MdkAWXRx)0}J zr%&OSB*+*QBh`cTkm@!EAmLPfsVgFcn=`zBx-h5iOOY^gUfPkK*xL9>YZx!aWbqHT zWbA64>`Qck8lkYc)+fkTE7EIO9ebVIobmGO&xsF6m9gbiEGMqxlQR)_)IfBWbDb2{*n|S z0qPKvNW-~o>S(*_9q{f>O|I)!t0)bJEeMt)`NhG;pJ<8aa^9Qz=fGMLjv;gj_;pvf zJnv&l=-Y3D>n}E-ffmA~8n6v@#G1#dHfM6dXEaVu0VWwP*6RmT&S{5e%0G8!{QzvZ z{9CqfmtoGd!=w`y1PC-|{9OB{xvVn&XuF=K37S2u%Ha};?Q6dA^-*t{jC^3=8> ztv#}-JoH)y;+jFU)#f(L36P1K7vaH({#qi_5BFSm!&VlRz|fYaP?Kn06k1;vf(%*l zd^qn1nrKPN+sRD}CyEmZAp-UcYE##c1<1UB=~{iCBnw>ftC*CRiiK~GDU1jxSJvz& zt^M-o=?oZ#n$0CEILkCe^)N|tC^mNz8Sr;6}F%Rgg zk9REyKdA40O+=)`3Q9ai!9NbgM%N~aNpe*N_MHc<5)QyVjG~{3%_O>m2QX* zhL~!luw8Ec-bvPAbk>_&bit zLo|HWdw;Vw1EagEyBnbZYF?ifjf!>xAy>l_eaG{S&H)V1y(H1Q3rn4|Cqiau;oOhG z8?VOupvzH{^N37Vm=SdWJOzI51F-ba-;-5X_{9CAQhMWQdQ9t!n9@`%M|uB*Ny}Xx zHd1{{B5(R~qjEuGp}1y;z+{v($$Ht!x--bkG7Jkl4dwt!(FU>2167h(>NU$TWr|7F zL^fwKCq+O5N%y@6z&N{M0pxDeW`0U>o`t$B>DMO->5>n-9qub!GEppN+HuZ*o0|YkW`n> zX05T(nR7!W+gmB@YqJgiEHP0b74E(VW!|2{2U@3ZUwvpFo)|WzV5CKiaRO3Pks4@H zP#WrEkC}325ya&I)qqis^1sBW00Do0l(}AS-Yn z7A}!*5Gcy3$@ei1UDqE9^j6kteH%%l*3OFj0XrXTZkm_cfpNl-D4O`4ff#bYKYt+$ zta+$!xSUpJKsf=!iFzkD*3E+@ycoHF@Q4}2FDGL78??NavShYNk?4Z9 zTr3N8()?0}^gh@ZVpV=@Ki*}0X?rHQ3UCNR1Qo8JHyk?Z7M`=YLWZe^ElZB<1;N~8 z`_ZC+Ttkf^c7{N@AMP+(Q|I06TTQ_qfM!Q`4a|VTcKNk?++nIH$#2GNHcS`a41P9g zJl0>Jq?-TSx2~or0q2AMPBk8H3$ZB_Ge$7aS#N$vlwcALPG*JujBr{)B$*{zX*uRZ z9Li%VJjdS%19U$Odsao{U}Pf_QAb>N&z^~yre-At14iXku%Z6m>McAOeLzK@IpA{S z19bVm3ji?RNTadFXo`@GN@3gD864I(e*p4)r8S5B1ClOL+p!^UaMb%ct-J z6Gz0L;T2XQa2|WK;L{B;DpWM~oELwFylA!YTn6z+S2+p;DT^fvg0Lys7F~FH>eFF^ zJ39x5wxbyi)^|<6g}k`-f|fWF@Y@b17E7)v)UA6&86s^`2BI;hqUlF-6Hjl@{c!6A zO4x_zkEsy=UtX*EegC45r1Tw>Fr|tu)dDWYzwP-s8>kU+af<2tloUZMDJkY!>Kvjt z8t4jwl5HC)t(ge*FotaFg0g$}SL{0U6R_boTKiSh=*$owg$Uq@k{1}jgrA%=6@{;Y zsCv$bu5p-5XQGWm-EnZ}Xtk$^F-l{;83l6Qk}Q*lFBWjSnX|cpt7lR_Sc}VozQ!fL@%LyR!)#R8y$h6k{Ghe?@jEMa5?hNP|%!bP2 z#yGCE<9R@$t`e7Rf}f&~hVbLOZC;uUURT^?C1Q-qVi5HH;<576lb+-tPQjE} zbQMW@?NXCMQ6gfM>C5pIWKMaQl~d9$VKA}PJYMz z!tzW^CD{y9M*xpF^~UA>fTE#=7nD%KzH+tvX}akx@Jo@dBjVs{Z%fV#T&GR+J_>BW zKFag_oaI*}8o^YOl|--(__a0L9Qw7#d7>W#U0$TN5mSj;}&M^5CUzB?s3q=}#iW5`F zZ}sdT#IJi>%@1pE1|C?^61p|^NlBiZ!as|3b>pj@7yAM?f<@^yUcPuaub-a=JL$3~ zZIB);n$k#Np>mH1nP6u{-G4pU#r6Y{dfUp1c{;r3?NC3I zzkZwc)Rid=f0`$*n6$hlT# zWMm115_t#|E(>=33pw$d5Z+-)jM3~2StAZH4=JlJCDrNMbPh$aSvq4m4_u8vtJGG_ zniix(ShIIw=(Z+2;#hgU>oq1x=&&+Z=$nymtI^$vx04t+SKNWwS81oIq>$ILU2hc~ zwd@0{bh8xGf||TgF9c9aIgw|5<`jED5|K#uA0XS!K~Z>Z+p_zOonfd$`1#KO0U&B`R9j&0Vq|fN#<~T2SunLl8~54BL^hbYl%C z6-IKIko3f;ffoDS%v zZW(vyxP>eF*#!*hoXR#tnQ*FtBgo8_-P&-$dI8?`#9v9!2pFij@LGE((hX^m83W%L z#e&_Am%RZdBpLcvKtS*ph77z9^r1F@iF^z%UdPf zG1Fiv2?f~YVqZT1+`wN82yFDD2kWu5Uw#GW+gIfw!hL63dxT#Bhf<#`?gp?m(hPOt z@5V84^}%VFy!ADXIe z=&cgET6%Os-{|juX)%Z|lt4avdRRJFGPJYu)UI6i__j%LmO7$!gwaM?{~#`AV-$fb z3Rt(bv06I}&HepFlgjbLmLxD=wIo2=mjbV{m(+p<#=82)h1YotD-^-Oa0Cne^;-In zt;Eeb{zwT<!>=$m;htp;D3(p= z>B5>YAIDI8;)?G2X4&{db7D!_TMWjB%Ey1fxGMYYkJPs2^{fZ{0_GJZCnKlmA&R7| z*)JvN%DQ3+qR%5I6x!6MJULq>D&Hsg-D}`P`O;8Kr_-Q?26fT;cELBMtYN6+Touzu zQEo#X?qSV$?Xrb1d0tswP~W0xzcY&Rc z6!<1yQ9TKeZH{+ciCLC}hH5l&4(c0jHj1L;wMKzXTb1S!@FaBL9W+R!^;^O*m4|2)3mS=HHwWm;Zd~i6o1$uvC@U!JTO~ylA|R(O z*DzmM!qjt>qx1BQxJrz`;v}&b<*KO^>Q1)BdR81;o{+eCAy!Ql0fXJe_J06!Q6g&! zS^^7_7|ai2^Ow%97_9Q!pEGZ7eq+FiW2hcwLS+g4S}X|K^xB}&@g&lLuXQ(~OZ~c(J6xU<6nuhK`tv)t zv;osClMu2X@jQw-l3*%`ArOtharBRU7jCVQ+8XY0!_3WCXfU83Ek`E@)iagMqG zue#*09H6ed)V`+gFvBj}V!h15q_nskof*p|gwu#-Va$fL*S-->vX-}ER0=FH_f@j6 z5pPy!K2%eE&)I<6YTFPB{PB1VXW=<3A?lln(NXVO-eCG$(u&W#-2gPFdE;Fc&osL! z{@Dj0QTY9pv17d;h8zo^)4NwFR`zfN)T49Vf1DBQ01n-NOk+@YJJ8jIc=nvdkwH3T zm5G(aEu%t3UDe_N6S<#{zArD6UBg!sp(bOV{H96dy>c^Jd<6x`pPx0i$ln(%uM=lMGX+8e*rg{QB zQ{#&6$RL6|{KNbAx={WKreW)|E$6Iwi1HTtD4b}3sC*GB+M3;I2>?n78U^1prql&2 zeDeuc0J36cTv-ou%if3e*dJ10v>e<-M<67KF~ziX5+Rj|TEvJH5VN{uPiuEXH(#;> z3hkCjV!Gdy2-;GJ$r)!8R`b*cj>Y3yoG7D*WSB}*PhzJ}=lkRgWMX4phQmbwiY$BB zJW70Z86kOtj7hAvzGXvZ8@ztkkAYt4tFK{TB4C6q+KUNSBNDzgH@M|3YAa$4ggXwr zL|NP2L-iad6!xPN)I44eL;{4UH#lh0HZRDj)GEp7uyqEbIMjekWd?(!nYfisbxYyGyE}T9IEi_5q*1BhJ!}$()%$46+e6#SuS+8Y zG?%m)I?AsZTjI2e;DnrK!%GmhPpGm+V&Vp#tu6?zisdfNH4^x4t-AptceLU$U^ZxG za+fHxP4ZNz3=?ws5#Sr}58cZxFe-FH(8sKGiBl~f07!InKDu1IGv>vV_FMy2y%gq@ z1PMJV-te7?W^s(I0ed^6mc8@+0O-iHLJ7;#>QD`v685RPpda1ES4mrSxDJwhf?7r_ zaLU)r$rDOccQFbn0uYxMogV=FRJ5{*lLfGG$l^f$7ye zs#>Vb@xA34l=Y9Pnx!I_!`gB8-fcSiK+ z_ak*pykdt)4_;7wZ*|+fUI^}FPllagWhaSPCmpoGr6!6$?OfvHfPZL9vk3h)TMOGP{89(lsX_bGb4w-sYA3ctNuV{NexUrwM40S2lTpB!-fS=pTKDPP}Zp+~$uRT!j zeV5BTynhwQF-sY5)`-YCoWdmlCP`9{QUEal3JKG8sdyQg>PoR^!R2REY|-P90M&58 z%8;jgwt(p=$EXd#WL;sCj8zzMTH61KS%i8)LE^41)>YzSC^I4xit^wkl77(cqTKES zrXt~4N-~0J&=Ff&LO1{7abrPDF-5*+I+1n7>yd6UoM|a((pgTSq=tn|*S*Y2pt~~9 z_arf7FdpF;Ll~33OtIEH%=ImQ^sx}~<-64A8(BRqWjTnb(ZI<_;{j6bB{7=VZytws z#oQ0TK*x$TpVU0a^C&}f7uQHT=NnvMCev%pOci?}L#&@s(>iUFMhcG$4=S}p+N@xT zc?m9v;An6tC{17Yns@zZFy=k+2f+Q;G^LA`GY!_Mj0PiW@Bt|rB<=IMQo8yMgb0yCjO=Bq|HRHbHvVh9_10c7YKY*B`(rFp7o>UxRce?LSJDQ#_ z>b9`V2A0}qx4(7W4gS60;zsIA%2hB4z0iW4zCF+v(w!7AVSAq8au)CtuOQpDiS&x? zI1$tEl)gm}1oU{;HsVQxH(|A@v;kDP9z~Vkjg6MsT;K<*52Q8=dUn+8<;39okj0>I zQu>+?YvnC4H~0pg0hvl2Vlt9nHE4~?bHaXlFKGVGsjdV3QcmH1=~II@p#Cw82^{hp z&E8v9PEi09nDuVpM|FN7s0v5mIPPS;KZnCuvC*Zg);qRaUnQ=}{REEr)D;(;&Hnro z!VJvlD?o5b^)ZOs!htXuW6Y)%A`hgvI>eGB;~1930++$a2uBGMX!8S50eAHyLl0Nh zfsWOj7*=F=e;7@MAPbyUulB4~P8+X)GmF`2hRH&QiU^J|l&=Yh?Y6B2FJgsrrGl9v zh&eVufM}lfhBFGhW#hu_bQwg9Ms9MF3G&34ri8*nK;_I;9(?35=!B8lh+3{qn(esu z1MoCb&sWas__cDojYNHmDgy5TEwA}q7x%^Rl;jOFo!G01;tNH+SeO8xkhS5#$rjCMLEsfBjsNBNz?_F6}%13ZIb-S%3X!DtFNkqHMhPY z9ucf3wn3P(y7}+IiI0ucZDvr+AqWlKGRbiMXXw@dJpc}btDImrQj_tYK%2IhRu(RthD+IrZ~1{8 z0HuxJ2f&n5mHIOiTyXlna@qVQ&D$tJeN`0CnNNi?$xFK$(hSsc_@%VGQdw6aYCny)Xi2 zp8A;+`t4v}b-SY&dpVN*cJr0;w?c(6?!G-(7oXgegleCckb2e&xOxW&%=rlb6|M6jCq*%wRER4> zfw!7;-*1tXupK6aC6$rGQ!*40@0xmcZv$Xo(SF=G;3+9#7FHb$k*txpL`-PVbp>67 zZicn2v@$WoGD#Z=HwUzHArRW3k(P8)FuyS90IC@>q{p!0$BleIvo;5jj;-{(vZ=BU zqEahv%U26>Y7GPTR&2Q=*5<40NIkKah8QPzV5d7Ze=JZ4tH!`amijJXyD0h0)X>Fu z3b`({J|)+2a`&-g<&znfCNVM!w+a}4S6!gFS>15BbS*4PlM-MHBVyaZt{JH{OhSi{8t(E(G{_u)GF1dwG3nye1m1yAppC7Wgft(@{2BnY* z{*WRa)t!joOMTYJ0-y%F^ElJsJI4fHKLCt$El3f-i;Y&5IST;wOS_b6o0sjca9`97 zOp&2OGqT+wgoQCDVQnQW`#h2B%)519zg#}2r>d;ow2DI zsLfq7*h(;`A722VRh8iaxDW<+SF~3g#Bh^B^2)<$q$&ft6Gc~&ahOzOaBp6hMD;px z4mA3=qadw!Q=q zU-wtQPqf`uaFGA1P@};a9#ys$?{BaDqPU+BK|0YWQP@10d&vQS+q_@zwo@T3HSuqWDq}m>ZS{RC z8XHCNIT2<;*HfI(Ju=W>`!(cKF08 zUdz!y{%wCrq2KSlGqHF6ce?OciA9nr6Ug5g8V76Ai+ff?yDZBlpLyGC&yP!m5_0y^?;&)JK!hw zIz=_p4?utSk2bGxCe!hNH{2}oj>OE${`tHkC3&na{(6jcWa2hZvF55Q^A~46ZJ}k; z@}C*Rk>vN(`bc$iotO13E4uC+!Hxrg%3r6-1!HD{&zm#UGLz>kkdrd4@R7>&awk9`eGu~cEUcEQG%9cY0`!P4KGYqCx#hbyKv0zE?; zn5i8#ctSkAAt-gWKm~NyO)v5K_2l(0?$q@X=Z9cY!fiSb0LeW|pyLwjKKOtm>Q3XuM#yJ9M=}3}Xex!dKu}pMiWg3jstu95uzGD#gr63u5xG zW5`^cmOuGLj!#5-PwdemP8okRH;geP4JkIwRHhF2z!u*>7M@oDPML>OBf zqC>H&D(NDV)nwAeFzP%zoorULf&6M{EGqG|R>hS!mk8E<7_wZ?wyNRM2tcThQrC)W zpLQoOL3DVeuTwYLT`9L%2!fsr6b(D{zlI4=UyXJ>*TKJ+x$;R%6x5~?k(Wx0w#I%b zQLtm-iWUk>cGbUk9BzA};u)f%e8x=kr~#c(ubZ<)?8BdeHQDF*-M zBoC4HcZPM1_PxCuhz2hx5mDq*U&H-T-8hqVG+3TzN3D8`Y?#GShKCVEp@KElnY)r* zQ=p3K2qxI&+C%O5;6YglLIn0Enp)B z%FTY{a$i1Sd#-}Yl$snxePM|8z$8^y{pT3~yow;L&Pq~R_OupuoJqae=rA^kwZ=!bb+G1Al6 z1B*y$S+R8}&JZv^e;;LhZ4C2CI@ET`n%iGYxtWtul0r2$RE!^{K~&b~Kag1b-n1JI zJw9HM@io(GhKe~66-c?Bja8uzod?iDmb7;!zfreZF_e|w8~Zj)ck{aNJF}v2SU<*R z-^B{lvOWVWKps4PqOEyFb7@$&1lqobOcXYoR2L@Pq%x1ut4U7bOZ#J_`KudSJvn&q z+H&6Q@MCX#`-Bq~<=7%+!?SjTDnIm*P3@M0*Biruh*D!Ku`CVlY9rbBLG#U1L58aY zfeNhMmP$9iKxEZnFd7lbI3={U#iItsu@!v&`}S+M`li;|PH@}Vf>U-$7z6V&I*Pm; z#(pD>ATII%IWM{z_|ejl^2)oq)7OWfTrb{9f-#>0WvPs--wh)|g9#%>xbG+x3bP$> zK5+HP*EeyCxap1yA3!D_)@Fdq%2TmaE%w!mK9}&Fx?N8 zqlv~f{7qe;Y1edjXY6FIp(QlRd#g$lQ}!Kouxvd27NF3G{U!hqlA7cM3`0^V3|Z|z zfY)=zx*=x=iA7_xEm*JN!k@n#1{v@Zmc>#?D=y3ztSM4`L#?rOJH0!$#*xA8+Q-DA zQWu9izs2pc_m`kFx6G6*D)$Uu&;b=uM{N~pJ&aIVQd}H1Elz=1J!(MHc?6Mf9{Ft( zCfG#3tgL=I2`cGq(K5Ly_yOodjgr9?o+ijsCq{m2ijf8+!|2Hg?a_)p4De528hA)i zivRG35(|eZ-C^xUlB6gM_Ubmml@7UQFt?ku4b%7Zy_AN^XC|Xgxfbp|XoB8#)YED? z+(uJmyX{_KoY0al$C|HV0ps^o*Fb;czZ>!`STVoJj`<4vjEgKeJbn-(K<#w8s5bn$F+D3|W9+|uUI&GZLz5fkp@ zIzC#%4xIrjW2J>aw&N`TWPwQl3atWY;2J|ANo&p11L~-@Zz&t0b7=UH)gwAa{QfwL z`h;(>n6!bJ3}|VtdW5;z0-vgs&8z*5X-siuv78Ml2L1&6;Ey|0r188!5~DShX&w>= zDI-!Q2#Ef^s)>8-?TyI5jEX_;a#)vo-=b4Dd@}5Jf?dIf#^DS*n7RFAC8)uStnm^G zxI58E7*yUOe+CL#i$=K^c7d{Nbe^49{BM!bDDCiG+56ILs^uBVJdf`2NDl8tYgR^X zV<(Jbj0@f+2(G1u5~9(Cq1d=;>j}5)4-PF$3A@wqJdM)34bIZdoA0`d``~_SXj|QabcoJDN6c<$NB*v-+F{K zOF3Ew{%MvbdOhFYU`L3x_W@v7e>Ve@VPp|YqsTe|yY7)72EUMr$RVxS;EIM}X>wk; zZyGD!NyxBkXC?6W4MXDTj~qS`UuIf$i8Zx!a7N3-SGGBSj`vlsov7HNt2*o>9^Uqb z@5CkXqjo4sPU1nU#TKHWfo;ugsZQA=jiVcU)2Xd^++;0NoYwHS!{4uba;pNhFP@RV?Q8w5)LYfAm=!2jT|R! zmHn;xc^H-){R}gFmFwibnQ=rfG9=>Pd0QH|uAbz_*J~j|@dylYh*&jpC+$8Te;e>Bomxn#piU-U| zCQZb&GlpUG6P8JdCW$=qqeXsU1bkr!3_hS*rYWeZUT3PNlZ@sSjWcG6ycL<~j`x@x zB<{)g<{jz}tMBd?uT+DW5J-FSrq5u8OA3qLjKUq^Jl30f+K#4Sn3~7Axv<&0Jz&}K zCn;K4@rDD6%Ob$D#_pt&eVh7 z!b$~}_Rd>~E=ToaO3&tQ#3g{dSF(H{W?C@(hfwCLLT;hP9DWH$lLup~TM%p=Eca0~ z9DezJAU>NN6)cqs(#~b;t4^&fTN6ZECcaZ1OQFh2s*+4E+VapN(`gvSkwrIg0w-&v zgC#gBDSFbk^p+xUZ1aFlb{bk8oEHDg{Y=z%(eC&8{ewNgEuE(g;`4QB&CBL)C@LK| zq`1^FBqMN)g+hz=jTWvKdt06Iii}Z2k))&~m4jqXkzF6m4)ySsCrtb8#8-HE!N^wd;yr7Uhw^+@IYdG&1m##I+XKYv#-a)WN7gJ%FU&z@^WePf=fW{1~4@U!fzNm=LVx8dzjRrxo{d9(oaHuAo~yvmzE66`cRat;eJ8 z8N}z>Xc_P`GX3aGUS7Ax9M$)4~)yBFr-R`_Ys-A+PC{=r?Hn)$k9D z?|YLP&t-$_<>m6q&zesUxIGT1EBoY#h;t$Hzlm#SK)F*%%I4$*8OEIv9Slr$#3tdc z$o9LM>Xg=0u>`-qJ~ge98geqWUJo?2Cyyb{9oF`d_x#>I24C6pNLHjr&JR!0pXk_n z@^KjRYjT61b3irKrPPwXn&q4uuePr;Ztt1y#i8IV2}9k;o(XDu=Y$5^o+kFNusX(1 zZlttS%r)IqUrkwR04k{9T=ihnkVimXv$tvWT^eaTcDhxbAzm=pIY+tAaGw2nWJMAU zWB~h^NNo4k`x4}>Y0T}BW52FazkuLonF&?4Tah4rJur!n+(sB5)Dv|(d^>W}aWwp; zCF>k)Y`+jwhm@2$QV~Oy{h~J%p!w^LojS-1X?_N4Sd+t1q}*DJ;Yx|)%_fxPQP=xN zFT~S4wb^TH`)k0Uq;^q438{kh3O{J)mm<894RAs^Eb6!t`QG6PN16qrYNnW#q6(GB zmWP|;aOv&iCE!kQL%DQ)h^zi9mY*^zNX%$lT{z!c?qePyj+Q?F3k=nZV&hJjU4^Xp zdp0A#?4FH6b$sHK@HV{ijU1Xg*O0n02YRfn4MmjESWmd3@mh)&mKJ1D@-lu#x`3!D z-1IpQ4YAtb(4FH)x!c&J9?Y+hI9Oyy$d6zU63;C+)RferHDCLD07h(iQ5hJ0gHW!| zFADs@9M&zn>wQ}x5O=Z~$pY9KEgk|!aCnB-5fT?olxX#`ek@l-h+3>=#!zxDh+?hc zYHN-dRmu!A-|d?|3s=gZ)ai<^9H`Wc&n8`o=Up1Ltid`Q#G%hF9@mEOLFm5EtP9Yn z*r-r2gl3{0SVh;Fg;e!f^RFYjcJ<<^pC>ENKJ6K&4VLyt=|fn#HP=Hm<9=bUji`$O z1ChO{viBO~M;?ki<8(o5q2j3Kl!B9CToj@_`Z35(>7}={bRJs$ApBIZV|A}QmDC^w zETh0bDm=@+WB_3Uy9E=wMca1pb6Vk>7v=Qf?l;qLOLkAygM)VH90{y@3nKi=%>kEZ z=W?;kohkdhZ7MFi#t(q`cb*Y%9(c3Fsp{gN$L|zGtnF~k->bZ~u%+X$IQt_kx=#=m zyAQ`#Zf8`uKqt7J(7{<_`(FeW=bJlTW3IU*L8xwu04JwKK)#PXR@(uXyQweXFpsM{^8m-{|L2|Nz2Dm$1(rb?ZZRq|2MGi%WYkZvUHRAzP6 z>^ZLnGz;x~WbpMIn5(F*a{L~Icn6&F8c)Y^6c!eW1&l($G8FHxd)Vju_ZXI$5=(eK zA`BWudSQ}*Vp=YzU9Byw5@N*~{PB{Vfi}iRVl${7Q!emo;+jp1Lvq^$ z{6V$$sMdpUH8$2PK2Xgo7aA9f4w zk9}ScXwy}hlLYIhScuuaPn!5=iB3AZZN825%ujrITnRalBwEO$DH5dHnuH6>xjIr4 ztoQoXo!L%BXv}7a5gRu7#pd<=hknX)s2ZsDlW{3yg0Z6dP9T&gN-vX~0sFD*NM06q4#pcq?^tI`vJ|nU6qAON zWn@Vz!e5kwU1I#%8dtR8`oM=bz*#LdJ2YSHJSR?!$^*J@u-AUXZV|_c&F@L=Ti-Sg zyh%Wg3C4Fy2~a7B5ATW6VSfNJnd+ZEKX=(=a#a;dvd6QTq1ke&zVmy&?Y*3z#_Uy^ zk14-vxH4p_&CAH()V2Rmt|POT6EMZbp-LmLe#r0=fld4-q#yJFSYPRX_o9l!P;fr| zWnkOVf@(t5k#oI_nJr5|(sjAC^5w-y_$-u6z9L0@&IV2p%VI_!LG%R?;l-iWRGwax zu^d@YS_xzUKJ1F?jbS3ermzRL8BGa$r4oiQho;9{-vz^cW6* zdh$y+L*wh411a7CCjv~vmQS1@*RIVd6_`<&B}A>o3Pi|Z6GPimfTE3&uYMhmw(Br& z0UOE`gQDqTnwd&A(;zcu#{qqb5itpOg&hL1slwN!PB=0NR&0D}=gA67oE1#>xEQAn zi;R^<(adcrpdTmHZ1qo~9K=GII!$`^?_Sw^9{YG2*`^9+96VBx`Bi}qgb`2x-VsHh zav|{Jc3g(JUwM|!zscrUEY%?7PrP|P0PZccr=swz=U*%%ND_#UawXa=FcKxW5W&vv za#^AW=+a0tg@j)S7Tx4mBRy-+?y&Ekks@Q8zFwNq?CPRUyAyMK0CwCOQ5kUerWxH+ zj|M6wu;53^73Lke>sNddy@bc!^7pVMb$uk8^5Ns*tcF5&?075z5geh)x z<)r3~_pwZ`@s<)fV=Xs(X(G^XTD2v1Er``~_ulqfgC9pY765_9#-*to&?^|tXO%uP zxs{#|!vu*$RZ%JrF_lvIkN|buxJi%ga8haJ1TZ_7ST!zfK*Q*dOf$kj-N&%Ad!FVFFhxM-% zg=YVC{FGq=l7q$Yf{DR6>=;ETf27vDuGboHKs{%4Y@5VnNkuHgh6nYb~Y$%y+QtSoAWieg%DZV0c93j!w7;%%5i#474_`= z!~v^1R;~{~H+qrfU`$p-J5ujngQ&D8lAN#$Tj!bE@mdXF%haNBCtQ+vTo`N+&;=tGLDs z66+qS9X!+oi^B<~y+F1|-2!nO$yf-#fUuWPPWq`~#<-pj0IX@txB8RyZ=@ASCnfaE z{8e_?h{||dG%vVyDYRPY#y42e6-wOx+RU=VM(@VNQa&^hv7$KQNx*q@{h7A1-yNSdCZ?v4u<-mlbgAwE=1PD~X@bBti3KB)3`Hz}q z&yFwR-Dt0(sV}=6tozm{!)YMewWXGpi8Wj|tM7i!Z(i5BbA~*Qx+olt=%rz zdWQ>S!m;m%Flr_dx2gli>P{Vk6|mQ}y0OPkx)xV&rI06?8wbVR!=H@xRJdNEVxJVX zQ-GbP<^uCIQ+6h9R@F1sHcAhb1LsfB+PFGF7VsW1jVws>+)|QesESDgz*Xip~>=JoB_wup7(8yHVcc@B6O&qS!a84>mh&SQF zOK*v`T$)-Y*^RETgbX!6Sx}nL*JPLsQ#;ji1v%m$9uw0@IVkHsR6#X1aPAo1;UD$f z{QVqd@O3m`t@th1(xPWj$0J5N$)d!ZX*%{{b(YwJ>rV6x!&K>LiDeLq=JUcm0IF8uq2#X*c7I_$g6U zcqZT)#K})yr277qK2(izp2j$lTTw|}XMawGZv?7<>e(?Fj@A;oy5Jeq#7KR(3pl<8n(836 zD+)bZ{tydZ(L*&pPJs~^hv?1-!`A=@zpXycx7-eEKr79C7ZsU^;f zkN2jT?~=xZMLx96|8QFaS(Zk&>ixQ%i$g7Cav!|qG@bMTxQ{b%^pjiZ<`c@L6diLz zu(B4yfhF;STo|*$b$e&;T@No2AG0*whfybn$>Zy}VvjIYj2`Xiz7`?z;|B19(N$5) z>`A-Y%|L_-stIUi-6?}y_peM=SfFeXHR>Xu=7F?ikPRHnnt(wRIsC^p@vf zgXLbX#~r3bh;A`UWQ|ohr;BhT{zi&3FGbQ+*FiK!s5Ntk(tJnUpro) z00 zgOnG=GOCx6xI9L~&gN;s%^!F3ZIf+iSX-yS1eH{}ZiZ=cjb?(vNt~j5Ggcf;G$uJ7 z<6>Oh7VEGp0MBb@E7WOk@@QwOp(4U!U$oKOu@)w_VE2XnuFljk4HE~`fxJcmuPSZR z-yP0`PS`5V_RrgixI+`=^riwwLDcO2~f-NIL47exW{pS@~q z0QIbx>nZ~bsUtbM@YbIt2P}8j($}*G@Yg3Kwm`f^9^3fy9MKReyar0Rv8$x|d@yS_ z!%R7xG)8hwntR?FS~@!5dg;>94N1t8U!+cKl37{^nnQZ=+E$P`&?&RUi|F1Ch{QGp z(L`P$$zBUlV{Ik2%rlJSEoh@nlOyy}X%z1j#*<^WDz=1P9cn}qCHv{aaw;YG*%mmX zbrvqyb#{K^3jMsS>!#k7#fsvcXp~M(Buf>KMwKH^Wfdg|g$}l>$G#&*!%=w4ai1sH zJ{#anVjZp6EeI%e*Y|K~s5!UF!-n}*LUGt%JmU7CcVk$;SEF2Z020;+{sG941bS=ES~KpmXf6~VxvQCc`a*%Duaowc_S(NRd@P z{qL%{^{kM~5V zXK>(a#7yDJkZuP##Mgd_m5fmEHTl{$OI$WN-^h^*(<#aF6KKQa+Sk?BfBgWYvb`fd z%zqQf5g@jowg9bKf|HT`oGv3iy~Z86zc-)cNV3fx`YL*GXh+%(^<5pCs5S&BbvJ0!dXw~*O{(w=? z?4ZWVxxN=7r%mwj@$)=53gQUHHA%%VD@YwBKU=Fey^)2C91H(JTc)xeA~n{pb&vyA z_F5DM5#2@QIm%H8ssz{)5-3NTl3#iYnora+n1MNt4+gM`Y|KYynTm5?*Ag6TxNHt2 zhMA9f_{^+Vn^8YLfF76_u$sk~=CT@l_F!*yL!~xE=6& zyBs-q2Gj{-0&39V*`sRdsFsir{lk-e0`;t$yUSovu~CrDLt+Nf8d2c!Vwg?Qo=J6N zhXE7Z@#29+RpelU^oeub51?)>zwi5nc(@PZ>pYAX)HH>g_P+SB9t}UTwhb{%-_E9s z$VmvcM@muf@9=|~Lqx0uI%l05`oXGbu4GvinrMcqCoc`wH-8s=@#od@p@*_6$Ag)l zECWATuDfStZ5u2aF*Gb_4=qa2kUd#FcQ{ zJVyM*saVb7b^ztSc^Jl)Go3dMt;;BY*o+Bv=B!RYrQ8$t`N3h|o z32YuYc!hjnL17x#N-))T%|&O%(ADgXR3Jx_I#g@z;0!g5urpH*Id z+#EzUE>?QY*U0lUHUJmm=V*8d4I{fQeK%Zt|A8shdaH?3SX3bX#`O_`*8YK~9hn@n zyPqa(ohF#liel7p3b>54?R@|^5o?*IbvJZg_f5=f6-+7Qq=o^K9q(3FlYpM~#m!+% z*})h5Uk>x^YHRRjecJ5nEa_LxqBbeR7gx$Z7H$s1na~Imk}K7d_FFj36849kcEbk7 zq_wyn3eV)i;b2uV;4MUl#;Q|WiA&QYSf4y(99enXhI2-m@dlY-qxj0VpHGgQOwh-+ zizW_&#rIp5FpgksTi5lh9a+CKHN4G^2shWekBPO4f=@E6-Qt@g9>^POa4$45XP8g! z=M?QHYGp!m#nU=BSb*`LcC+2xb}BNASCq*GQ}L{d7fwQt!PWC|Rv+&^Z zI{NgtP?kldM<=XXwhj<`c3H3lWf0L0$@6kfY<)GC))WcX7siteZU~pX| zLuX7?lquvv(3$Xq<&ZcVV5e{FK~V{I1^X!vn50|3JPhbOLyqs}cf>}NCzP3VuQBZ6UQ&LbMs_UR0QU{rPXs+#<|6)||#<*&!A4O{Id}`D<`K8Bd z?Ma`7EEE|$iD{~#{H}Z!XO5VhXSlFp83QFma=`fKBcvif?n(LV1$EP`C4c7yw9EN2 z><3^(gTzse;;|!)1X9}KmrD0`Yg>;~h!LUEIdGz;vADVB8e;~@e0~do?uMA$1cJhE zfvJNOo>_e{EGdHU?jEk#$72U;Dv*5pRwQLp%PR9m*wkv#d6@7$eBuR9r2FA{fe|H> z>D};Sg%rUsOOnGPgKpDI|6OR=3A%^ii;+lph$CL$;m{pEPtvgUvJq{yZ9q~ zJM_m`FJLIi!(3(2f?TxKtLqvXnd{vJJKj~){32V~MlK*oSATW??9z*cGRZ_NI15c_ zL6w{T>L}z2&EFa$umIJvga%O^%2=nWCO=-OfTpMP^~idT+w1L@&GPue^Y)#br+_Xd zni6w!LMLf=KjJF-R3wP2kxfXLHfN7%hk3c7j4lQ9D$_k$*A-(VWu$rKiLnQhXN9v< zp28Ujc^i$s0Na`DZ~cX5UcqKRBO2GTSrz|G(O8~`t}%2nuP+O_E3RWjGc2I{5twE5 z$DW$Rdk;g7xb?SS^ zI+OiA$P+ZeBA4@pU(zn728-niTC$Z%WvjafHlbw2?vDq8HP#^1{`EIUvH-#N`v-qi zxJNrDdmo2dFLB_)5XyY_?8*U3@a~sP);T^L3PQF*;rH>)X-cOH+{~85ipN%|@2{uFfeU+a%yeo4_s9o#^)ZUQN-{R=7rKP+ zL~+Y;C*Wkals;kmKZQvoh!L>Cb<-fMq01%2+S}{5Fz(c$MEuDnYUmphPVFXO0Za1= z%QT14=(r?G#UsnzaA~H`!_oyD&87=5^IlRIZy$gjEThq1=Sb`n6()OMjDMbSuNs$B zpFWc?-|$||g^6IjE2Z!x>^oRULJa1v3m+T?E&FazoY3<>@wa2aRH zC6;>5AR0dC+|ii#d&}LAZ|im-`Psxo1Y6}t`boZk2Qd3W(1HO6IZbj>d@alDq%9_n ziz*s1{H&?c+-NmQYI7C*!&Yl5#dT&mls0a`<~OcL{Sr0iMaq}NJYjs9OW&@TM_hOy zR*T^)co(F?s%QXyNoIvX`o~twh{>te{irfWd#s{EDZNV_KS@2A*&9ZfJ zbr-y};vtKvVF=F{uDLB_5w1r|3OAIY$g2LyG0t2u;;Z3HBx7o>_?S+|y0*5y-jx}O zS}>F8wyGl7W_2#tH!kPF`Xf^OMv6_b&_<5Xgpeo;G5h7!7xk6xBcIg$g;=w143#Fr z@T3z*i!ccBG`<^kKy~}yX$DZ4`-ZINC$L~bQ;ckL!~xpAZl_UIonh`ah)xZPH$bj_ zo~}x#3%>GQYaV}Csi7c*tHm6S7@=3#1zMv4snvIyjN8ik1(HomG-L%QY>uS;)O zQCU4)87<{KmIf1zWPJ&D&EC&E-Ie$-io0?(4bhmfnheb(N<~&CwFZEiwQQ4h(_f?K zP%=B~?iKAweS!4ywFPs1?F_fwF;I3dXvJmqshI`5fXvc4AsJ4>{gIDG=iNO>s*yp2 zTTw@l+Q6C(Q2zC7U$x zt?rHtXrIOSx{rtRDDnn-rKIr6e;Ez!yy#&-P@f{0N`YDG;*woI=>{pNpZA!?>X^8k z?53}vIxm*axuD`eLjsh-#L?>(+muhyeyEUwS50)zNueB7TXYdtFwDu;-{o{^B}H1P zID~uLWxdI|2u)#60OE#^8sEP7S0ZOu2@*4MIZz5U-Cl8c8(w;h;_!HantbZqWAqpm zXVQUI!D}o4mPDSqxevkw!Jdbg+6#K+&cWHpg-EoywfV76h`5$66>4>GtA?Hvfg+X+ zXlLbo^YiIE!+ra^q)ElN{#I|i6K&AwI(9ViH$_^bw8i}>MyB!TdT~}Aqit5M0DI0Illm0= zpRvvEeq>`q2I`6hoaq&C52BA@=wzcP!0+mn@3YDE#tWEl=m`Df=EuNelvN}ZRf!R1 zbvK+_rG_>?j7mwz%SObXN0rPX0jz>7IGG*vQnOS_u(>R zIS)r!oH|aPN12T;G*5j1b`~6fr~RJ8Jtet+T7Lkzl@Hr_4U&3OPz5oM$Ve@2p*1*? z8}SL=6nYGLiP7F&e8pcou2hrEQ+F?-p6_}i!Jo9Xjfnchp|f)0a_LD;*tQNhxBW4X z%PUAV{WYOeHcZ2h?R~tjmOj%mkc;PN&O)PRYnYv$^IC7KC^9HalaVn5(`Qt8FKCsj zaXs1O^3Xy08-q6-72|alUOnwamfTDE`nWpEk=?dAabjFM=pjLDbt9sC~bjUS&HR+}+;_6&9j-Ep*c8PY(i^%PdylM8YD(qKj)fW6mGF zqSXg7BJ|;>P-aKh#_-Za`I&5xezM7< zyJK|LnR3Qab%PDRZM*GeC8;KMpfB5I;8g*Y+c~3(_o)}tVm~f*=yk-X{mj$5zJVgf z4C(j647C>`zS(UX8~)(KuxZ543+Ki$g20>rooXub1H3SsQIO+hB(=wM_zrQ)VClYK zFLN*3?o!|GHoye4Z8>O1zOmMgOBslf{&>;({ZMd@D`OvB!fGYsmIIayx1}v6=OMcH91IhA3ejwG~A7|SF(&EyOl}e3|p%26Ts_> znZWWNiR-S}`S;3;c7&|N)v)hbeIXmLr#pd%6UtQGPretTt7M=N_M{}R;#PraUi@*k z<|7K((!v_18$>a^`m7|7ctGv<(p?~T;gs|N2%^|T_EWg%7B@3c;11}??AGBn#^OQ0RMgeYR_Y)pxOx196kWJ zQ*5R#k>tPv=Ml__o5YPQ3uVh7opn=lFC@X6AySxKBw8Q5#;3|~#Y@h~BRr333`&6<+XL`@PT{1?QTEP2b z-0g*xeU~ldI!#O|awzm^!F8w#bDY7$kPb`%S!3ra)ig;b{AfdKW{+Vi3+(j=>qtVicxN1w zS<0S%GXq326KTo<0Ys_nn*c^rVQpv;YM`!DKCD9O9O+OWrQ7j-tWcgI))eGuFzp8b zq&E25_F?FhY1;~;u=OT^?+*~8p7ege>;iKz6snz9{$lHky8g{#vj}t3+>K?PQGujq z@B)TM+{-UifdBm5aGeOwcme-t-U+0b6#nUcSo^F5IpInht5SDuaqF5-YkysSx>-h! zsRWuaasRJC<(zQdV7(RuaO-Wn923Mzw0@m)11n@6uE*PfJlb+5`CF>+LDaAP{Glh4 zbZuvDTQgs#%N^Hm=$p;KgaBxH@TJR>zV5W4PF1HQlZ+D43E*5CI_hx)*ml5P#?v<< zaWqqa+5+%>O#ck-vyJ!Gfn+=5Qt1osFN4nz7;_Xwlc@zYOb&3tDu{8cpidoeLnFH} zvF4|W&B&ZX^m^yW{7_sT>+!rnm{_%WRf_WMi51YwRTVK=!g&SteD0P6HeH?3a+@1> zgH5qRH4r?&1$d{nHJ%rA^RUnrqotv0nVQ2gXw2kUn#cA~Yp0(}=zj9uqC&L} z4Zr);5;{V;SbBY1S6`1bTw?0Lga}Z0mkRRaSSPo`#ldbt`5pF)A&iEwMzf^{`94JnkN#)NL`tCTKmY#@TiJNOe?|a3W}hL4J&L^cb*$D z1}+e&webSRx-;m?S~miL7D?tSkND{aKpJ3zB-(&2si&{{uy#Al2CHzN1!Pl~uE0)H zD_~;$mOC(mY#(hMYm3(V{A~h~ylk`qXN@x}f|0sL8EGJ+#Oz{@H;Hlv5iH=iad-`% z`wQdv?K4l(K8LTB44Te2MXyyUIx2Ii=?QEgKg10TyPjp-hT@2^M~M%BP+B=j*G&9d z{(|!S^_MXvMmg0KfrAvV;MkhJ6%SwmK5g|00t-m>SHMF%)h+Hw*)UpW!@K{Pk&Q7p zL?OtvkHaDPbt1+ErxsN7sMTQp0w)SK-kRZb9G_}_9OcZB8uz#np9xBhVoBN(R7dHv z%)%o^n`{Oxt6*cuURiM(!?tDX%#opvlhDL$x+0ygG4ZPiel6}uI>wSvRb>q;Y^hZ= zhiD6uTOnvX*l_;spnCa}jbAE>F$T<~z60Wr$>tu|N}w%UZ#sg>;>}zj@xt}}es0>c zAC-@Ti5E5Jmkf12PagelAz)v?j4*sX-u# ze-u(ES)B?>!ek3Tuhr(-BEiAbB>~?pIrD`!lp^N3@Tz$iD ztAmpyc`AP<9O~Iolq^dM|k)ywt> z3ciJC3(pIRTT5H&#jtN2;Fh9?<@oxif6N+?3dC^R>t9wFp(_~EeO zN--=;=ZyzBcQqr_YOMjlLyIv&@r@r~(FCl%Ea;s+?+6OJ>3Pc#>y{bAnT2#4mEGU> zuYfWF?4l12t;<&HS*hL5lpt ztm$fb9L2nh(edX3+yJ)vHzhl5>D|3Ag?08LU*@iPb?^+*eyGmPgNgxLx-^!rqZk{N zyPmWTH3e!IS`bB0l9&Riir^a}I5cFrHD5#hEO5m%$)zVwO|E-$0Sn-D?Qf6v3^y&o z*^$iE&R2fDw39g#zZu}~lX_7o5s(-c?|-TwOWn>~qonC}Jwatue!h(ZD^zTvhQHU87xx(Y2{q%RLlFL2NJ^1Qu_xWVu!=l^o^+lQfw9f-4w_qX>n=lb~rvQY!+GV zk-|ML?3Ox`yrPmg)Vn2bHH)#x*M#If;QiEhLOoik&fd;%0yIfTb~NecZcz0=PKR#< znQ5~!qAHb4ce7^(&Rj;rN+eUf*su(a*(cqO;MuqC?y1|o35+DhBvgRJrlTV(C{7Gq zS27lM<*8E?#KtHZwfo37{e+&rMszADFtH}J9?$*D6(ve}zKH=d?D&Aa@)|ma9lA7y zsLEinM3%|kmTX{`8I-v_|inYqX+BN{ z1GW!>Hz^5q1vKLBJT9ebyYO(P^Jt$6Gib13S7h$D^ShyJ%m#KS_BvKv{x*eetveW> z*XvYu$5rOwO6iuuNzxeS{+)c~i{K+OLtE!(ay+-sG-i^>MI<a^=w^|`e#~Yz;%0qzo8>{(8nGK%d#o3eqTgW4MJ(e4hZy>-xWJ*4GpFHoW+ToQ35am*@r-#WbhuEbt#efKg-oT#P zdnkfk+Evv7PX;z&Q7Vo9YlPN00o_x|&2Snns0XWyP)5J-v)T8&938u2DL~(dZ14+? z$|}-b53sU{H>pI%h!m{zPY>>E$w&|9OM8q#l()<}HbRjA&^4!+?x={Hm*tFdlhX2X z|DW^fhOH|w>qt(w82h>EMwvlgCZdvMU7_kfQH>m63xoIMTG`5#Kv6d^yT)>nuQURDy?h)( za)_=br-4BTaaj-n?>?@BgBFzLiDy04JrgY$7=e&Va+Dlkt>|by%geAN4!6RwMzCOk zDcG*hJG#Rr^U9W3{QVCKHZ5D%_k9$3qWbDczJ<+ofNrN0CAIxUW>ki%c)U&*G7ve4$xF^q57e6=jM0h z-?2UK7*`=#@DNi59%+bQA@*i@R5}~H=|PvLf-e+t#+JSu*;g3|RV`CkC0W6@X(!op zdSB6iP~X7*W*#j{yYoIGEYo3OZp=%~EcPynep2_m$Bm^HRT%J={AK@ob#-9<=2-Fb zQiRJxfXfc)ErNAxXL#14!qkSP$@1s4hF-g0wDz##Lo37Ho?+*CTi%a9*|;k7Q*lq+=Js{A}E7su$Uks5Ggy?FC9O}&lK zXFA53+wEm!O?M#rxhBtvho2jTlN0BUR3scUNauGG-uK>hU z?Okg-4O<00s)5l;Re_F_Ac5gRN<0|H)Yxu`q5TC?TiqOJ6XT9aQ9FaMHVzDibqc)#)D0#@){ntfNlB@ zF2pO|G#ne22kh!7jP@22cqRiHiL99_fdK(g|2J5{|ycVq0>n!)$q5gtVRaxebB0^&&>wy{KZ{ZLes;O63X=DIm(b>fZbI1Os3WFDQMq ztVr_bG;19^vc|NH6FszPC78)>q>Z`^c>b61ywRx5S{!EAXHCoaw}&&CqrLd*c}FVoWumAvYUO+71at5M8tD{-~9u|JkRqYh|hk0?7fw9Fi|gJ!Lz zW*u4K@e}5JU2*Jb%>_SmjZ1kK!z*bWZGcNSgU5B-W-P=4Z*khgzA>Yw!6iUhb%^F& zM(pqK^zFZ%8>g<4Tclzs4eZvqus!f33~P8vH?g@Sleg2hGA4>u77XBv18tA}Fm@o7 zG6+Jnkh`!V%A}ip2TT=e8G%-bi?F!_bm{Aa$_W&V7f@rQ+-$_yTe$PW(-!csvb})@ z+uOeX04~Q1ur%%`;9e5q31pWu;o3Q5H~#SyJf}DBtvd8QZ;dj$*jEJ9%F9Ppo>8@~ z5hh83`Cn4s&%PXGDCn02$_^s-ACl!6M7fG)98H-R{6?CJh8CAi_ag7O`ETitN1dk( z8eUFGmS<@=VXAz>vNo_CR7V_O1M_2zVJAOiWhkhLWqGb)l#?Aif$5m|spauT-%iKW zTN^%Kn&sK43lVx+qAkghh0fg-x-j%R;kfS5lOt^yI*jZw$|R5iM)oG(jw&CB+L}p?9FwOxuO})(fsgUUCf3lJPqQ@q zVOFFGTA_gbW)Jw^d|u^zOG#EOBPzFYx7+4AmzN*__VmIT#z`zXr$z9Qxwgm9 z`Qb`7ii4sQnVnw_P|??A*|>RRc~*S6m9%lM}v%;hqy<0Z_T zc$-hy%71NoeMjex9MGnj*$G;q`tC(~reB%T#AT2Z2)JaQ))_qi0B5c>e9wlZh&H1sDtNWj$dB|lhaLo36ivP8r;J?marvFJvtcF#3p)zBy=O- zOa0@pw)VGNSj7x-(!$SG90?E+c#X;OO@IsD{rY#dKR=uztBd~tzQ!q*5w>F)onwwE zSRjceEYM1BY*kIc(`(;y51HwU?jPf<`zU#&r_79yK*%bgW-|tlp|NfIfGvH;t~B)C zr!EYfvCCe|{l^yK^jNNHVE zI<8jM-0iof6`GzI6!?K*_jM8d4132=txHOUj0aG+U3Xh~0dBZ&F1)FxLL8Cs=r+K+ zD6nKY90;V45p5bkUY=(erjAsMB1R+S*+#2>R>IH>ELRp~RwJo90e?&(EiAG=nBICe z=%l^FetY76!yj6CR_`T1kP8LUmK%3IxRRuD1-^r;vajKQVA&!^3mcG1>bow)j0_=` zONC`%+qLcw(BKxy$qOM}4%)4;QL#NOjRV>bvtAzJ(#4o#DxE4|9~5NSqx82`{KgcOY^3Z)%%FjG z0QivnOZ4*f7#+#DTaj-(01cT{hlr^-XDG}jpsq^VNm?3+Us6dM6<~JW>$pCn^TkE9 z#L={7Ip+@XL+j$2Su)JkfzzJQLKsMU3Ydk2m;H4ChkaPop)rvpu}mdIBx?#(I0TD; zciz~!)7dahXx1~j_o}F9gC0^H{{U$J04z&~IDatW3aJ*5BydG;bxgZQ7pJN87=n%0 zE#RIJj?vd=m2*lqW{FimJ9Gy4Zll?iJ!E1|AI?$bBJsmgp>-SB0PC>ZxfaHp2;^(< z)Ms2PntPsYNh}Oa^vFKWWxcg4bYc5TwmKyeQ)c-$=?uJ=RN7?w(H|rH@z?2c>x(&k zL_gGuspBeG5xBzS?YYNeIZ$e50fAy{I+5EQXV}!dHCvk;vx_IuODty2b}H7m-2VV9 zOs%S2mm1}>OUk{S4nE>+_O?2yGX56JW|B3U){?4Qf+CNwAz4cv*B*GXKE?Psq5)v8 zZS2qQ&9C=c^2aps#!_va9NbqJo}1X85YbReKLT+A<_f2n`7Uc=%mZ*^ka%@@UrF`G znVaU5)Ya5P^mRE064Czv-e_tRt6X;g^#{)!%_Pm^wPiH9)?b~4k2r)<)s2N@Lvnv; zcg1yVQ&7kfW=SJ&@aBx&Tz>=Ui-Y5*(Gpj&X#z>OBKT5Eqjj8hK7KsP5x)oTa%_-h?ATK2vp~GKo?ia7F zHx3NqUM$G-JmQCfct*0SLgpzea~Xtml;joEMSu#YNGHZWhAQI@h~p`KaYtFqe@b?DCseD~y=BS@FGSlUr?)8iVYAU1_WZ%e(Tg+pY zdrIT}5#q=)^~%<5fsgjbKsw#rUrKS(>66*{YMorG+({(2w zpSVgg;amQ{*yf_bnz~LS%PE;@WUXPkxxd<#YxqGTz;C_!oDvM$&~jHbG!(!rZ6s+b znrGPCPU~yxz0JGhIYL)Y+)7S6qcB(0@*~q%L#If$_mmr3%O1u*4SPS_e826R@kv-X zjDX|sFuk#qfMT2baJx~wmbxmIrI>Uh9Jh@9i{;s>8txT%vf9SEG_J(c%kt`DKbOk_lTO7bS;Kgf zhx1H}Fl@g!%jcr08-$f@sD84Zj6Fswp?aDcm8qkeNGDTZ@tyww+B2DO*bOhhg1DbI5dBe=JifL)$J8D)B5j`wO*k9JzsLeN`99l23+MJh*GN;IR zr!N(%>!O|BMpmGI{8V5KhjIWnuo&l=wqKn4EaO=+YP$Mr=%hdrdT9ZUswN!>xzfX} zj^h-c2__9GMWV_|$Z8QMk9BcyM{$5VDM00vDcf^x@##5U&pj&8v)0o_;Y~~diRfe( zIIyLzcw8_gSZ{D}DJBjr9i!Ndc3)BK&Wf7r9JD!|dQ_=D;z=hh)z8g#{{T)bs#=OE z-Hk(pKXiN}>T#OBG>sp2Uhqy~Sv^BTm(WW(fqh~Uzz?5HL)zc7yt|C@bZqKsdMv`6 zUW%?i6--CUcStnY4Mg5z$9Wy9sIFV=SZ5TVQ`2F`}X*y*ufn7$|BzC5fxB2K8}+-H#S2MlJO17%RU1KFB45PP)|*fWyO}AIgu+1NY?-x+!aD>dtu#u1XxQ`Tf?!K zYpU{}X0&ppj$f2V?>Wrse(8IcLVU|c50S;jL6^su<(b_?JU2;@Q$ABH$l0Apn>wrJ zNgQh{f^t{9TVgLs6~86wQo)<#VzH&Ej8W7IcxH%zvJ2{D z7uv$sC$L~Vu$MU@g#n_AFiV-EkKx!kxK_2bG^*b!GNF)fHv$gJC z*4w51F_sdrUT%oN+!T`@`22)vWU1o#Acor0UcG9WRCs0PlN-ow&UbHu`_WfT?B%sq3`p*%M!{) zSzQ^Jxm$~#{jrse7#&Ab8)_G^2jz)lAjq~LqXr*)VPG%6TVfH)hf74-mgEE1arxm4 zVI*c$E=z)Mr2ZDShWg=p*;5LK4<9$R03P4EJg(NRdr z358T_7C%0u00#b;0H)5e?7xU;23uW225CsgQ58s3qg!IEEXqfi7~=lWy^Cg9N;BDaJ`&{YJDuoP|@GSq+3ZnoqDPD8yq7oBSyqLLs8wAuHAa# z5XGJ{+MN?w18_;(>4dYO%Rr%&fX*yGua+za{hm^DGYXo{h6ut&e3{L^a6gVdg!U=G z_4%DQ{7+Ao&09RI(dB?8)(C+irn%TNkZgZcdg1SmiSkwZb*``A`ozmKC6nIdkC?P; zAy5J6?!%}yAOL$DXZtTpU&T$t@13ePRZkpHqzVp>V}>WGJAtR?d{VWc330Ct&%+t& zO-iiPPayz<@L!-lhqu&WhK7TSI2x}a&Fd&AA*a<*OEX5H!5fth!~lDXf==UW;qFKl znaF4*mV&B$s%c}H;$zB@PliKlf;}5=k;R6ZEY^ZKtsIKP6xFy_@;K?oK3Mp(n_kNvN#@PH$%O>{E`Y zxKEGjsIx4-lQGMyZK?{Ng=PZE;MnOq*qe06Y|Xgb{*j4Sg0ft*E^xP~FqvIi_9DY; z0ln?L@GP|d0N8&HGVBZ-f1c-6i$|8{kkf=8_bKw?wo&@7t-ju1V!{p}tclpvtP{zw z43b@U^SQ3_>6*$HrVqlUHO} z)n-$fLeSPx&hSi!v!fMn%ws7lR%;9Bdx0w_hcK3o3dv~YoeIS~O{L>wups{cUGT+3 zSyg>&Lo{4z#MNlU7%>PgI@{wm^xF~9V~LmMRH(92@IFJ5ptsv*^#Pjwww1sK{Wyhg zXF5b;%>AQN)5p}(^PS9g^iP;@woeBO zi(I276|}3KXOc;kWFVa^029`cu~>&; zwTtu^(uYmx+wvG_c(Q_HEit0Y>CvfZDCyfzA~HNpZ@f;|W7Oe#juXwY>XvMdYC4)% zE3Tc?M{3daNYqFy-q^h1N<!dKX#;%92OOj2kf#s6vt7ele%9^2Ru7#mOWkq{wBkwNzTKz6|$IoQNI7^JA{>P5g zvAUOH50K`QJ5BmGE0bB(s0jwE?|TNY`fZP6FNq&^Yfs<%9bQ>RlvRv|8;=is5^8{o z&g`}uGZh;TE937}SCgv6xffwj@oC>u0H*D2_5=A~u?AzRZ9s#4HnoNEI`BP{Wrf&+ zn$Rup@TmY_7@&%tAS8uMKDf&u? z&7fCAk)Z%6I#>%G_wDk*L828Il^U{$psA>u_BvN}8=I1T8~J+U5oVGSvL!t6NY+&k zAWxmf4#Pnz8!&!ZhE+{BGA;ffEzs?QGCe{WC9CC?yJ$oL7C?4@mPP93d$!h3qON0La zh@|-U`5#<-^T!++o^YjN!JExvT#GX>Vh%#ynRK6aJl}$>?LC<fK6 z*DZEcRZ~xCW2Vu&i|R3-87AB9*YU=e#Wi_!)v?P(Lis%oVHy)19PK1VV4yiF{41c z`Z()n06|>QntQNN2xY&OhS$db0K@zVndTXNEbwNKm8qvmDh#m}(B#;ToAqD7<3{U7 zNj7ejp3L)Ar!=!>F-aPYglteZmB~~69BNbW9%)C#G;!vca(l6;Rf%<%Nr7*Ky@iL) z#}j;tacKGimI$fop@t~Y79tkhhfDl|Ny0RI3Jl^(1A z09|j1hfLAM^+IRetqB4Si1$aRf9{paPPHJ!^YzN!9}2)E&XZ zrVOEq430-FNy54AZ6V*8SyiAD>anf=0QX|%f`^L3f7u)(l;t~ZBT@-nPx+QC27>|p%?P;SM`?0FndD<{Xk7JAcr_=ucFZVpJ@=vM0#ssGFms@Xt*0wPyfv#jw*B4t0k`HfOd#5RYA<|ox zONFuC<$K&ilHZE2gPyu{IM!|stbaZQWQFY`vO7! zuYnAInIuvp>RmwqGBB{)sJS}`X2q5v|h%*b^vk=45rPnHvCX%UvXca4}QCN;A& zH;fN4bMx}XNT;a+N{Qq#gJ6usY;G=g^go6bSOKUxJW?3M>RjB1TfW;H+}wBT<%B1i zh7i-!Ng_%BQh{{=x5e1uq$>c`RaGTrW@3f8Yo)Y1ZMZh;`C-~Bm@1}No`RvYqbSth z2)@Mme*6srWu+{2CFBxL+<>-N*%%Sp_if3+l=B_H2nk!0Yc;^z=hLnyv4rIlCW0lF zJDV3hhh6&L5cfxFsMJoeDErbim0Pv;+vj{OjGVS-v^HsERq=${_O{lzZ>|x{C?L!- z`KYscI4aL2F)Ve8it;z?dix*;e> zJk`-9u5{S+ZsQkJBX9Oc3QHdh#=`3-6GW^#e~kt{n9nMu$@q6Q;#iYZ*fIVTg<<#jIv85UZ(c3m7R z$)#9?Vlc$W-Vw05a(45ASo2l(i#1G?@SM7##FS1TvQ1;CtL@@oNd%tO z9WZRFqI}mUgD|L$C1##VDS0rgXoM(uz*PVM6^e@viZN+k$ZoVYwKra{Jyva%I_n|{sRNO7eIbyLdY><*E-6pV6Zu)F zdsF_@&0j+%QS9!LdTAwHFPYTo<{M#M`j%kDLDhGJO#aU{V~IM zvp=rl4AxA-zM@Krotd6V8tm-G?8NsZo8l!n@u;dPCf%}+QPv12S8H{}?+?wNK+Gs9 zrjc0x0L+N#7y7Ng9AH{>ZE#X&@`aXs+B#`J@ZqCIDt#Ht8~m`+WO3D(IktD3R+G{> zt5_-eEwGdlcjSK>Rjm;eoI8`t&G&4wnOET?4S$PVpT`K-ajsuXG*YY7+sneE()iM- z%_hp>#JT2YC9>)`;0?Dh?g!NE_+wz<+_fT~-ZOmWTA5sFF{mOn`rGr{8DyKPiE1m! zx_|V4B%?L8B3UDtEJ;aBp`K&*{!vHFA-a<*cNw zEidby`rps>ZPNC~G?y6tS=Z_EC}dK78wFnuW)!g(NSbI=8@hPF9;9^ofr?2YXyhi= zVdQr>QE8s^Kv zOmvMgQp6~-soea${_FwD@>@~Adjdq9XoII#Ho?$WN2ear=5!%$j4#a?b{5Jz(FiA zO0Nn)V?Y6Y*82^vEz^JFg`%i{vc_qt=Gf@D*d2w*9=)+CSyx0}nn@|;R1kuX;XJU- ze@lyYz3@7Dvlw*3&mzZi+7>$m7T(~2^B%YpT`=97E?C^$x)qYO;CqxB zLM$z@H`wid_(c{3aif^k<4W}G{j zH3n@+VVG|lfq3Nux;IAt9q~sZ$kfK1lgca{4<_>-SnZ2aR*qe#M)T~hr`+kNCy;_D zIEI>LK1xbA{{Yr;^!FDfMOO~-ZwiIDs)|t--ARqWvH6jUtpjvxbUDRrS+yp8!?o)S zQ}FCj)c`;`l_FJZd4fpw3NOIYB~++MmN8`uw#L^6*0H`S zHuTU+meIU_Xg&lU(>v~ZcKgtW{A5rzw?&8(vAqkDB2t{Gh%=TuN5 zvup~0NjUn*d_3_|i%olZ$oGLij-P!e>yp41XMDD5$zENwW7YH1a@K znHr5mfJXgx7(A57l@V!BQ+;3#yKQgJ80{J^gBfW8h{6cuCcsFgN9Hg(hRP6+dP+&0 zd{!#f{I7zBPL{e6Ac})2lBP%aR-Tlx`dAE3s;h`$jL4inG%N<@rl2DanjP?0uxrVz zS8+~uUE&4^NNW)q>mZL^@T*m4wW>qZ)aWMmGH4%_u`Wd@qtImT&#HMA{+pk~;?j#P zr$Q|PxgFeJ5ZKGeIdDVHsF5Lwdb^MnaTm{q(B;T=Y2H}{h#p{e9;b8IVk^l>ThQMR z*CN(Km{!cGm(s{sv;P41iLJ7M<?dH++`mf=P z-Y$DB%_em0rhXsdT0efsGZ<$UvpqZ6(*2o!A@#+6Z^LaSxg@2AVr)!{w1aO=xA|ih zsna?!W|SSo)a$Ysk(esU9>&_v*Ydt8YI4b8Ab>RY^B+FP4NJp4oEa8X$_s0>3zD8| zk74mTzF(;P=4rt2rPOLWT>P!jVk;9!ku=phirg*KC?AOVW2T)SDSI=n0SFEyEPMv? zSP|whbpTQ?D@0+edvDWkKI436TQ2;AsHK)>Dvq%-wZLTXvGTu{Oe&c?fe0)MTW|mt z9)st%Tw2$HdnG1SAem#Pk}hD~H9dhKb{9UsTv$VuP9qI2iN@N3Ik&Fo<%5=mUIWr) z@S3YF6NJ&F+EOfS>OB7do*$BySXrYl62}UL2^tVcBIE<;K)~A?1yUBO1Zsm)RLCDt zA#@9FNhf=G92z{no+4z9k~Wn_qpXLy^SH3+dk(mrkG38Z2=J#qGF1t2vXW0tx8LRK zg=LZmCf7Yo3UzJGBTygLo)tDR2BJit-z0jtd8k;8S0s9Az0HqY8k;?%YN%n2XJ#w` z16HL6yD95$p4gmg^hBRhX zmAP+u7Fd*M5$fB_6MJ{-g3UCZ?xryDPh!DKhGsXnQf-7bRf_hOaS)nQtqHJ*Ax7?R z-*9luyy|Gm$278`wuX{ITc`8e39u8+a>@+%CwdI;FNUU#=uz_wolf$P6p#abqyTjNp|_qd6!^-#Gdz&BXxF$jj#g(#UdCt^Xo>Fe zw{P^bei-|cfa>yzavCl+u0@sSqKlOf8jDQI0{}e17W{GF6>5>n-7{0Dsi4ZFmnzCK zigagT9FZGJ7y)3H+@8YYrLB!>rh|&#hh*X|AIVxOih7d;R$oyfthAv%*fQ^NSp7$*lKHOwzjBi^rQwM#`EMSuP}W%UJgw1y z{{S);zu+-k*;N51{A-Yr*ofud{{U`2nbe-7zp3)cNLN|rr%|xmqS$1E}&8_N{)iS6a28;akCrQ zjv!_yt)QbH-fGcUeZX}$;4qZ@M#V^=r3kV9}lUXatG#j0LZMIl6JG^&n@zbsA(>S>!*9Pbj|`bUXR z%pI|4i!SnxDX+`wqpOddM^PWcRYdHJKA8Fw*w3}8xQ4PUi#?Vp>SP4c)kXregbS2# zKKEM@jPk>hzhTBrGpo*&b&6TgGjy>YEL2wT^bSiv$b^dmz;E>F_1he69hmY;4N5MV zOn7Ckbx>+O&aS_fJ&CBEr}@9B_g}I#nq-bbk&wInH^JbF1!h_FS6<$xOp z(IQ_^->;vYuq}fR9)WgJ04t~}Z)3gsj@X!VjEQwf!~>@42cF-%3Wk_kb5kTv5(m&9 zt9Y($u-muH;Amb}T6b0P3#jR}_usZ12VtFKNTX1T7WZ~gH#Qzt{PBPxnm$Z{>QX&I z%r|es-R*@|I|kW(5r6xTGGFfzs2zaZ>^$%UrjDMVO0>i~0vv!I#IYTHde~w^v7S^Z z{o(YHaI9BwFX(q2_UXPANFA$XXyv4kEy#G|8v5GAowpxM6a$e!=?QaG#4`dcs-bV_ z0LEk$3Cx8hrC9-D0UHhb-0pgMVOY=_iYjW2EhMo>$4$yjpzq{&zWuPp3=d5b#Y}1E zLI`J==_1$LruZp`+wJ2pK$_0U6>wHTXV+&5j%Ssqo zf~c{zx9E4iAR>KwP?S~&UciP2VhBIW5(hEj?`80|Wfu@|#4%D-YyR<<2Ld^i+%bs# z({9}f>1=Gi$z;tlo(-3WGT>*b$?7DLU9hfHE8uD{wjWkv9^2nOjE{;j+pr?wSNzfs>DQOu=H}7Py^amQYNexC- zmekSE*3^mw$?D#w86Q%xXjxR-aHmr*LyYAnrA0=#*{WvmYQdzC(ZCl?_G_GIb=4#E zgmNnBRF?L)mI-z=9#f&@1E6D%ETvR{#9R=4MigY??K&BRnnYa*E1*3>wTIz>9ag@_ z^1`A7X#!kiIrwi zcXQ+|Z{372W=d$uX$)8OH#o~?^s$R5ceiC*3;+!0RgH5`Oo_L|+y4L|g=#9RC)%dD z^!}nBECP?DMQq1EEA#C9FaDcRvp0@eWFjKJ(6+W zeV%aUy4qx`mXcq0c~t3XJRs}eYuN5K$3>vesA`6i!X{I0T)Q>>0qfA?l2P7{h&x57 zsD|4%-{r@#p94-uDuoSz3`U*DlAJV*>;W!X*ZL2xJ6VG4^1DW>%WK-i4JW^Dm@G0E zBrA|_b91o%x58+o!_&-x#?}N}7B(08Vs(ZRkxLwFC7cqr)J2D0`~0w|ESmg35|snW z#`wgAC5w|NMh$T4I)U5kx62blu$1AF`a(w3HK z`T5{uKwFkw^xsHk__rk7-LKGE-&qK1(L!((h^%y z_|ENf+s@y+3JAa@jAUHxsEZTlVZIQ_z{{m0k%AU$YHM3-`Fecuok<`?LKuKb*+>V! zY$^jcpP8gQA+M>x)n!xAkC&gW6RDo)>j_pZyYm1b0e+uSFje$BGL!&G3%k1{e+Z2f zFQ1oApO*M~T1aK4ngJuD$}Yi8&CgB0J-qOkBm$zE2qdScmYR74gsg0%z@8F(R_W0F zNW^I2_jpwZ0b?H(?njxi`eH_mt6pESaM$>a><9w=x(}W*tW@byey!5?zpr8Z@WcvL zerqb~XFDy1`yGY6y6ufh3b{BB+I=p40AWW~b+`*)bsw}({{WZQ8+v#D0Fu4T^DmV8 zca@THMoK1@nwGwbvI3`C19V}!->Anq%(x<>g)8%1){eC$$?GGfK~7-`@H9n{Zo_68 zWFqH%miM+dO~unPYnIWadsxVG&L-gqA>mp|O8nx9+)0xL-l zs%qvCQbO}ee(H{&%L?cVX?SZfriWbSnlo$YGMj)r$QH)A?+#)zMH#p25JHwhz-xUvNEpxCxjsXuva@QR%bA}@Uj^g(6>wrPg zToA)azd?Iq(}%L!-0L@|%IG5orlEqVV`V|zkD$YDm6Cla!r4s^59HL@O$#Q3QeHxT z#dFn<&fkU~Ras*ZHj`!eSXd3dnB~3Mx>Sg0f4fw{dw7RW!yd$1FZ2^cM!n6Gu~YeC zF@!yCcD0A@$5PRlT^HQDDct(o1xSx6)GneD_ARGY`{6%ftL%|N@&H)5>ET|3w%_!@ zQX?Fjq_*tD4f}Mq-EgjggVKo=n3qBUvZC*Og~!hlYY-(}AT70v-rhu839<2`6!J1g zT2^*9xl>?NoEKX*kj@Z|Jf&bkJ6_;-H~sh;L1f=aFRDSQZlybeZz0nDzDEOt-n2$E zsy46%g@=o&C%&q3KQIiboB&nny8EsV3NPY?5LG2d!9uOs5_8L5vb%qiygh#5i_+!8jp>J9CWQ-aF5ql=S< zjV7OoGR_gB{X3q?1vN})L@7G}%GR+VM(lck20m!^t;W@yVZ=2#?Q=+~>&m1?+@xc< z>=^a8$acn6#y?W7*~&AS+EOF2xHn=Op*?X+GTj*7`nLLc;}*?Jx{*ThK%i7ZP^)QJ zkny#E(_ynOd+uO z@Cl5>n-AfJVoUTk-|@f$k)QxrZ-!$4_ZRu#CAuHV=xVbZ!W_PamFKCH*%1ZFJ<0MG z?~eZfz+5Ru!ntSxR(#HNy-h{`0QN7EkIdsdvhY+Dvt)^g8skwSAlVq$eS70NfeINH zdt7O`>1~cOMx?@vd3spm*jBxQ#URzo22T*b!)sd}NdUgXQR)vv<&K&n!z`+(%W?@8 zU_Xzg@X=N=?H`K30(KpG_rysSjG<>K8kqq@W1{^Bt~0JhP+l2WF*XXq?e*=6vWWyK zrQ9Z;BEXa8E4GR^h@=IUB_WQR5H{G}`+vRxSP7$TUug!S=HY~d0DFUnS}iRZ z(apHJSet>|U%$%(b`(TM$#ss;rCRno_S=5;zA-w-B`fb7tObttBzXby!ss5xBOo0l zkeW`blY8G`f1mEb$B$qEP}+&HxIHk243-W{AuYP;djQ_McEHLKtEG{F2E>pp-rl|X z;1@<_5#(-KkTHdR)c6kL`p*S}NL_UZXxY+OsF5hUznJq@?p5AG)YiAxeP zF?ahzYiIz0@;^)srifJOT7ZsD;`_JbzichGK7u?twMvZSG-q9uTfO@IFgmE2=UbK4 zy9B>|{{Ri}lLJfkkHE2U9Ah)eB#MJLMbmZ`Nx&N{mhadw9){zm6Rga$ejLo7F3f1F za?14t6phLkTia5OjHbtRBx9onUOy`^$qyxMZhX}<^JPkzWKc+wrSEJ}W|@(jV)}sc z>GQTWl#U(W!=rj$vt#F3BL z>w$rQ2?Zw;3BOLb0Gg+!2$6bV0P&$;Ofv`<7X#4X5Zp;|({bL|Wftqb?}i}Is{l6C zJL3NUgm`l@;(F0Xl){b_-dUtJNJo2~{{SI#gyqFsCGF_?3xl{vDd7qgj*m?B(wk3L zGL24c(SKEZhvIR2ENaYcb=#{CrvA9)+uJvaNl}YAjerD#EKh#F*WrQaZ3G8>C#Ioq zo){h)RB7jtZLMyY_9US@kG$R+>~SsISOk>>*x#>~I?RH`iUrJr#c(V;;j*j>=(2_J zYB$tI{c#PJkv2o12-w8TH+6D8x5ubfHI0=)RxRQ2l0m=j{uqwR9h4Bo-LGSRiv73x zl5rIKXI7MJLJ2nOupO`i2o}uO`=?M%R@1kCJb5*k?QY_D zYzEim-*cg)u7*Oh_E0X7BTa7l@0q56zNtt`w8%wBMlsA7z$&waD zy_@XG)H@p|k2IWS_r)(-6k#;<{joB0uEFDi@i_7}HFto@d6)kr*I&E#X z>%UweBvM6_?A#EWG>D#~KivB0z z{F{if-*V2fxa(;^CMJ_+O@X>F-A|}LjuSzqaUL@EADX7Rt_{tawi}=BbdMtfH3o3p`~3`5uIPjx~l$)9lJoqNCiO%NTk`L2|anq}dS* zTVt{7zg$OtAf zcLQ_tH~tns(*Bf_Y`#Q z42}MF=%dhY^2cAI%W~QpC}=2Ysp%=x{4|X;gguS=pPzhl%3PkhG=wX#+FL-5Ye}hX zuKJDre>`MI7&=0hAP*BZ!>4RXWC_#*F$$#G_WrMk?%~yobhXbxwitl~Yi^EDeTF@W z*!EVen-u{3u*^Eb7|y0sxB&Mac<6W02qvu%*o^}A*mWIoh~ILiRn(@|)IWw7g0Ev~ zJT9!Pu9|kRTQBd#kjTUXs4=#dVYnYmC!wcfI*TJ~)nG}nwa>5h+W?Fjexb>=w`<=0 zwm6&E=*2va=fiOOc^i*i@bHpNI^M?3ds}8bHroxP2#T;Eh9^+DBEzqhueJ&YF2Q3C z4a2s*EOzo2#5F^+7Aq2x8C>iQiQl$8b0oq-@e)`lR=7J0lE=4S%K%y>3!w^Skr4pY z;Z$6ZdSCfqI_)VX2H@!pzMwkndRo|GC3L&Ki4}#7$=`8tx0hY9fUFiKSro>$Ivc;s zY%v5#*~R3h0x&Ii9lZhkF$lz**+HGklVR9iz+T>)ei%-?4`G6s9i?Z8f`N{ccD={W z`0!}0yIrgaEKZdpZT`Q<38uklVd7=ngRE>f3{CeU*vwM4lN)F%rrNp#{JP>w3mFXB zS@fu3rI-_IbRVB=Vp9{uh=iLRD!}#hx1IoCc`>$-6pj2hBXSP*A71#4;3LG1Vr|T| z!MDr$-vbp8lsn!%D3OJ>o|hwi$EWbZnT<4Zr@BuBH8iewhG>L{=ee=+^1`ISnlBN1 zDBwKV-QmjQ%4c8*l7>Qwe^fVLzypmszt}f{n=9gt#^O54O~~KxBYqwnHIi}HXom#) zHQKLX+*G&GS&_=1{9MUYf%RKri;4Z1*6_t7b$Rx8mq84=`D;q1X(Z4Ftt!PY*UuV9 zE0d)XTpHP+R>c82X_BC*KOCe2f6_J|E1V`_Z!6@f(an?we5n4ZEJu(b^!%QHexpH27YIy#>$dj}A-RKsO;N74y4we~nTA~sf5 z*?TF*&EG=k^G+mUBUQcr@YoCnB@vbpkiKP2zji4q6^}s_Iu)GijFYO(xIM6VW-TBV zVR35?fZ`>#TG2mySVtvWnI`J-puMa&7wPMR#1WTdkmzkJ4Z8V%8{!H)Vo2e-n>i#E zx56#c_hT?CNe-6-l1GRGV!f}v!wf@nsD>_5BNSt+ax6f#`(iCTLIq%eM2m2t?A8ab zua*$ZYC?yTB&=j0l_$5Fk$+viG3h}=c{H-H4#k_rs13G0Lk@*@U@LQ?T>?WUpB$}V z3Ebb%b>AL>H4+jab08!ZiNcPfz4iyr{{V&;&;dKTNhYbDc~yVr8y}ac>DvX085Pr+ z9E}>CQdzEhd2jW;2E>D?Mv<223on7C+#tR0`F?owi~Xje$~IRgsVAoY08ge7N0o$A zyK6>(jfoo%uU`KEk-=O^z^s>wP;@6w*@e8x#uf%^jUa%0@KYU=kWBuxISl`J~=KhA* z-f~}K*&Q{;b(+sxFk9)3xeIw(t@18(;9i48t*Z8X24b2~}T**AS2r;3Q?b zfu!{~egF?Fo$fdNqmN*qumKU&cuO$=GL`A_#AaJ50fyJO{=4H;$9ut;W>(K%)$s9(d-oG^%_HLrgcU_x%b-$7H#8rV+5JnUW1=au|K)1{OxB&Ffj!}+Mh%7A1b|=XF zFe#g#0gZ{$2qckpzhSpQY&7&wY&yj!AO>VG#tN5=5Uq1!es(wvq%=b8RZ8q*z54XA z+oiskmQoL=QZ&ax$EfI80lRkXd)(g*phbmk7+~PoF#(7I{XD!|8-DC3R6ii4WoA0YUZY(=@z9l5YHlezf0JW`eQR~y^fB;HMMo<`Cbp6q(wE@!m0n-MFq%yxUL{nkn zDX5Q6`u;df2rT;I2FmP=dTu)R-?j=J3pSP#YqpnW+Q-O!FaZf<&@={T0m(nt$b7Nr z^oUG`Zf3xOyOD9<$m}=t!=@|uJg;RENULUTR~v#ZZcmmx`U||$NRr5+>`L2Jx3}ek zuwroBT~;Gd!*^YP^4rX8Ki>p`WnNk`BeB>c+}pm^u^adF!AMDwW?1HH>UWIp5w$Xn z>^kprgGnN>NacsZ29me46}j^7gir|N)Olq?0cIpEird%v>w^eP$XcD_Qlp`8E=jlN zg!>m_v(is)d{Kl`sH%q+)we_ZFcqYz39S(jFhBEtCHi&3V=+-f9aM5hTOAclI+Q9+ z3do=y+l`Lhdg8K96XEV+6T`VV8VcOd!~wSd0IT`pc&}ijQdj#n;EcgUjl=YCGY=4f z><_LNa=gx4qdu$M zN%3EM;i%A?7i*Rm18sn7-rrwLLLfw_$vKSN`0srqalY87w)znC6+i{(?nSpd4=$D) z`uSn-Y1P>o7nm-h&C=vmvn#<+BSs`LBNA=YsK4*V#DaydDh5?Lm?`;TnrCu|rHKzl#bR@xIP>2^*9Xc$))#z#o47)A%L+5t{W2}8j6WvX0mf41n2+@ z@BD@pHdSO$6bUV`>xudmMr4H%Rl#GZ5LBJI1N=?_8?j(7vo5Q48xvvaibSyVq`c}5 z*4SIn8-DB&38<1d&7 z{kFkjOO#8Hx`x&r#`wvaC9!#>c+q5AT$UC)jj+n7j*>P}ZeT3KwZ_BupT`IgEk&ab z(CPxirWdT4;*k|>b*Q-`eaCMs3vPk*$w=B`=2$UQ)xP)Np*?Ma2oiY=GF*WUtMw%8 zJN)r7*Fcz_TRe?5K)#zMkU={Oh5g3`5;weZ2FtqM=Hw2ayA5;zYn5dh+yY4?{s-{I zD@h}yyvZH(&bGTB)xq@zy${o@bJIp-i3vAb{J)OamXjn?O3wO`YzS@ab#3z4U~Ynt zjD?w%%eDJ&(`-VynET0NsK&xEe&YAv@W#m*f@die)BqF%Zq2yZ;fmHPZ6FKAt<$00 z-vtW9A*hx~s!^B~3vqBZ-Fki}4J 'testdir'; +use constant INPUTZIP => 'testin.zip'; +use constant OUTPUTZIP => 'testout.zip'; + +# Do we have the 'zip' and 'unzip' programs? +use File::Which (); +use constant HAVEZIP => !! File::Which::which('zip'); +use constant HAVEUNZIP => !! File::Which::which('unzip'); + +use constant ZIP => 'zip '; +use constant ZIPTEST => 'unzip -t '; + +# 300-character test string +use constant TESTSTRING => join ( "\n", 1 .. 102 ) . "\n"; +use constant TESTSTRINGLENGTH => length(TESTSTRING); + +# CRC-32 should be ac373f32 +use constant TESTSTRINGCRC => Archive::Zip::computeCRC32(TESTSTRING); + +# This is so that it will work on other systems. +use constant CAT => $^X . ' -pe "BEGIN{binmode(STDIN);binmode(STDOUT)}"'; +use constant CATPIPE => '| ' . CAT . ' >'; + +use vars qw($zipWorks $testZipDoesntWork $catWorks); +local ( $zipWorks, $testZipDoesntWork, $catWorks ); + +# Run ZIPTEST to test a zip file. +sub testZip { + my $zipName = shift || OUTPUTZIP; + if ( $testZipDoesntWork ) { + return wantarray ? ( 0, '' ) : 0; + } + my $cmd = ZIPTEST . $zipName . ( $^O eq 'MSWin32' ? '' : ' 2>&1' ); + my $zipout = `$cmd`; + return wantarray ? ( $?, $zipout ) : $?; +} + +# Return the crc-32 of the given file (0 if empty or error) +sub fileCRC { + my $fileName = shift; + local $/ = undef; + my $fh = IO::File->new( $fileName, "r" ); + binmode($fh); + return 0 if not defined($fh); + my $contents = <$fh>; + return Archive::Zip::computeCRC32($contents); +} + +#--------- check to see if cat works + +sub testCat { + my $fh = IO::File->new( CATPIPE . OUTPUTZIP ); + binmode($fh); + my $testString = pack( 'C256', 0 .. 255 ); + my $testCrc = Archive::Zip::computeCRC32($testString); + $fh->write( $testString, length($testString) ) or return 0; + $fh->close(); + ( -f OUTPUTZIP ) or return 0; + my @stat = stat(OUTPUTZIP); + $stat[7] == length($testString) or return 0; + fileCRC(OUTPUTZIP) == $testCrc or return 0; + unlink(OUTPUTZIP); + return 1; +} + +BEGIN { + $catWorks = testCat(); + unless ( $catWorks ) { + warn( 'warning: ', CAT, " doesn't seem to work, may skip some tests" ); + } +} + +#--------- check to see if zip works (and make INPUTZIP) + +BEGIN { + unlink(INPUTZIP); + + # Do we have zip installed? + if ( HAVEZIP ) { + my $cmd = ZIP . INPUTZIP . ' *' . ( $^O eq 'MSWin32' ? '' : ' 2>&1' ); + $zipout = `$cmd`; + $zipWorks = not $?; + unless ( $zipWorks ) { + warn( 'warning: ', ZIP, " doesn't seem to work, may skip some tests" ); + } + } +} + +#--------- check to see if unzip -t works + +BEGIN { + $testZipDoesntWork = 0; + if ( HAVEUNZIP ) { + my ( $status, $zipout ) = testZip(INPUTZIP); + $testZipDoesntWork = $status; + + # Again, on Win32 no big surprise if this doesn't work + if ( $testZipDoesntWork ) { + warn( 'warning: ', ZIPTEST, " doesn't seem to work, may skip some tests" ); + } + } +} + +1; diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Build.PL b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Build.PL new file mode 100644 index 0000000..897f62c --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Build.PL @@ -0,0 +1,18 @@ +use Module::Build; +my $build = Module::Build->new( + dist_version => '1.16', + module_name => 'Array::Compare', + license => 'perl', + requires => { + perl => '5.6.0', + Carp => 0, + }, + build_recommends => { + Test::Pod => 0, + Test::Pod::Coverage => 0, + }, + create_makefile_pl => 'traditional', +); + +$build->create_build_script; + diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Changes b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Changes new file mode 100644 index 0000000..e59e112 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Changes @@ -0,0 +1,68 @@ +2007-04-01 dave + + * [r23] README.xml: Updated copyright dates + * [r22] lib/Array/Compare.pm: Changed $VERSION definition + * [r21] Build.PL: Changed create_makefile_pl parameter to + 'traditional' + +2005-10-01 dave + + * [r19] MANIFEST: Reordering + +2005-09-21 dave + + * [r18] lib/Array/Compare.pm: Documentation fix + +2005-07-10 dave + + * [r17] MANIFEST: Added t/pod_coverage to MANIFEST + * [r16] Makefile.PL: Removed Makefile.PL (which is autogenerated) + +2005-03-01 dave + + * [r15] lib/Array/Compare.pm, t/pod_coverage.t: Changes to pass + Pod::Coverage tests (and, hence, increase kwalitee) + +2004-10-23 dave + + * [r14] lib/Array/Compare.pm, t/test.t: Improved test coverage + +2004-10-22 dave + + * [r13] lib/Array/Compare.pm: Improved docs for full comparison + * [r12] t/pod.t: Updated pod tests + +2004-05-13 dave + + * [r11] README.xml: Small formatting changes + +2004-05-12 dave + + * [r10] Makefile.PL: Added Makefile.PL + * [r9] MANIFEST, t, t/pod.t, t/test.t: Added various files to cvs + +2003-09-19 dave + + * [r8] lib/Array/Compare.pm: Bring CVS version into line with old + file + * [r7] Build.PL, Compare.pm, README.xml, lib, lib/Array, + lib/Array/Compare.pm, test.pl: Bit of an overhaul + +2002-03-29 dave + + * [r6] Compare.pm: Test version + * [r5] README.xml: README input file + * [r4] test.pl: Test script. + +2002-01-09 dave + + * [r3] Compare.pm: Small cleanups + +2001-12-09 dave + + * [r2] Compare.pm: Cleanup. + +2001-12-09 + + * [r1] branches, tags, .: New repository initialized by cvs2svn. + diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/MANIFEST b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/MANIFEST new file mode 100644 index 0000000..ec9a0d1 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/MANIFEST @@ -0,0 +1,10 @@ +Build.PL +Makefile.PL +Changes +lib/Array/Compare.pm +MANIFEST +META.yml +README +t/pod.t +t/test.t +t/pod_coverage.t diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/META.yml b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/META.yml new file mode 100644 index 0000000..4387c28 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/META.yml @@ -0,0 +1,20 @@ +--- +name: Array-Compare +version: 1.16 +author: + - 'Dave Cross ' +abstract: Perl extension for comparing arrays. +license: perl +resources: + license: http://dev.perl.org/licenses/ +requires: + Carp: 0 + perl: 5.6.0 +provides: + Array::Compare: + file: lib/Array/Compare.pm + version: 1.15 +generated_by: Module::Build version 0.280801 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Makefile.PL b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Makefile.PL new file mode 100644 index 0000000..3805e6f --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/Makefile.PL @@ -0,0 +1,15 @@ +# Note: this file was auto-generated by Module::Build::Compat version 0.2808_01 +require 5.6.0; +use ExtUtils::MakeMaker; +WriteMakefile +( + 'PL_FILES' => {}, + 'INSTALLDIRS' => 'site', + 'NAME' => 'Array::Compare', + 'EXE_FILES' => [], + 'VERSION_FROM' => 'lib/Array/Compare.pm', + 'PREREQ_PM' => { + 'Carp' => 0 + } + ) +; diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/README b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/README new file mode 100644 index 0000000..162a522 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/README @@ -0,0 +1,72 @@ + +Array::Compare +-------------- + +NAME + + Array::Compare + +DESCRIPTION + +WHAT IS Array::Compare? + + Array::Compare is a Perl module which allows you to compare two arrays. + + It has a number of features which allow you to control the way that the + arrays are compared: + + * white space in array elements can be significant or ignored. + * particular columns in the arrays can be ignored. + + Additionally you can get a simple true/false return value or the number + of columns which differ or an array containing the indexes of the + differing columns. + +HOW DO I INSTALL IT? + + Array::Compare uses the standard Perl module architecture and can + therefore by installed using the standard Perl method which, in brief, + goes something like this: + + gzip -cd Array-Compare-X.XX.tar.gz | tar xvf - + cd Array-Compare-X.XX + perl Makefile.PL + make + make test + make install + + Where X.XX is the version number of the module which you are installing. + + If this doesn't work for you then creating a directory called Array + somewhere in your Perl library path (@INC) and copying the Compare.pm + file into this directory should also do the trick. + +WHERE IS THE DOCUMENTATION? + + All of the documentation is currently in POD format in the Compare.pm + file. If you install the module using the standard method you should be + able to read it by typing + + perldoc Array::Compare + + at a comand prompt. + +LATEST VERSION + + The latest version of this module will always be available from CPAN. + +COPYRIGHT + + Copyright (C) 2003-7, Magnum Solutions Ltd. All Rights Reserved. + + This module is free software; you can redistribute it and/or modify it + under the same terms as Perl itself. + +ANYTHING ELSE? + + If you have any further questions, please contact the author. + +AUTHOR + + Dave Cross + diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/changelog b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/changelog new file mode 100644 index 0000000..c412499 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/changelog @@ -0,0 +1,87 @@ +libarray-compare-perl (1.16-1) unstable; urgency=low + + * New upstream release + * Added myself as an uploader + * Bumped up standards-version to 3.8.0 (no changes needed) + + -- Gunnar Wolf Tue, 01 Jul 2008 16:17:46 -0500 + +libarray-compare-perl (1.15-1) unstable; urgency=low + + [ gregor herrmann ] + * debian/rules: delete /usr/lib/perl5 only if it exists. + + [ Damyan Ivanov ] + * New upstream release + + -- Damyan Ivanov Wed, 12 Mar 2008 20:06:55 +0200 + +libarray-compare-perl (1.14-1) unstable; urgency=low + + [ gregor herrmann ] + * New upstream release. + * debian/control: Added: Vcs-Svn field (source stanza); Vcs-Browser + field (source stanza); Homepage field (source stanza). + * Set Maintainer to Debian Perl Group. + * Use dist-based URL in debian/watch. + * debian/copyright: update with recent information from README. + * Set debhelper compatibility level to 5. + * Set Standards-Version to 3.7.3 (no changes needed). + * debian/rules: + - don't install .packlist file + - don't ignore errors of make clean + - move tests and actual building to build target + - use PREFIX and DESTDIR in install target + - explicitly remove empty /usr/lib/perl5 directory + - exchange binary-indep and binary-arch + - use dh_listpackages instead of pwd/sed to get package name + - introduce build-stamp and install-stamp and inter-target dependencies + - remove unneeded calls to dh_link, dh_strip, dh_installexamples + - use $(PERL) instead of perl + * debian/control: + - move debhelper to Build-Depends-Indep + - remove libmodule-build-perl and add libtest-pod-coverage-perl to + Build-Depends-Indep + + [ Damyan Ivanov ] + * Use Build.PL + + Add libmodule-build-perl to build-depends + + Stop removing (now not installed) /usr/lib/perl5 + + Add final backslash to download url in debian/copyright + * Drop unneeded dh_installman call + * Add myself to Uploaders + + -- Damyan Ivanov Mon, 10 Dec 2007 11:31:06 +0200 + +libarray-compare-perl (1.13-1) unstable; urgency=low + + * New upstream release + * Policy version bump 3.6.2.1 (No other changes) + + -- Jay Bonci Sun, 11 Dec 2005 17:45:45 -0500 + +libarray-compare-perl (1.12-1) unstable; urgency=low + + * New upstream version + * Fixed debian/watch file so uupdate will work + + -- Jay Bonci Tue, 7 Jun 2005 10:13:50 -0400 + +libarray-compare-perl (1.11-1) unstable; urgency=low + + * New upstream version + + -- Jay Bonci Wed, 27 Oct 2004 14:33:12 -0400 + +libarray-compare-perl (1.09-2) unstable; urgency=low + + * Adds debian/watch to package, so uscan will now work. + + -- Jay Bonci Thu, 9 Sep 2004 04:59:16 -0400 + +libarray-compare-perl (1.09-1) unstable; urgency=low + + * Initial Release. (Closes: #220274) + + -- Jay Bonci Tue, 11 Nov 2003 15:54:32 -0500 + diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/compat b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/control b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/control new file mode 100644 index 0000000..0b63c09 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/control @@ -0,0 +1,21 @@ +Source: libarray-compare-perl +Section: perl +Priority: optional +Maintainer: Debian Perl Group +Uploaders: Jay Bonci , Damyan Ivanov , Gunnar Wolf +Build-Depends: debhelper (>= 5), +Build-Depends-Indep: libmodule-build-perl, libtest-pod-perl, + libtest-pod-coverage-perl +Standards-Version: 3.8.0 +Homepage: http://search.cpan.org/dist/Array-Compare/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libarray-compare-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libarray-compare-perl/ + +Package: libarray-compare-perl +Architecture: all +Depends: ${perl:Depends} +Description: Array::Compare - easily compare arrays + Array::Compare can easily compare two arrays, in a variety + of flexible ways, such as whitespace-ignorant, case-insensitive, + and with certain elements skipped. + diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/copyright b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/copyright new file mode 100644 index 0000000..340c779 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/copyright @@ -0,0 +1,16 @@ +This package was debianized by Jay Bonci on +Tue, 11 Nov 2003 15:54:32 -0500. + +It was downloaded from http://search.cpan.org/dist/Array-Compare/ + +Upstream Author: Dave Cross + +Copyright (C) 2003-7, Magnum Solutions Ltd. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +Perl is distributed under your choice of the GNU General Public License or +the Artistic License. On Debian GNU/Linux systems, the complete text of the +GNU General Public License can be found in `/usr/share/common-licenses/GPL' +and the Artistic Licence in `/usr/share/common-licenses/Artistic'. diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/rules b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/rules new file mode 100755 index 0000000..a997e5b --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/rules @@ -0,0 +1,56 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This is the debhelper compatibility version to use. +#export DH_COMPAT=4 + +PACKAGE=$(shell dh_listpackages) + +ifndef PERL +PERL = /usr/bin/perl +endif + +build: build-stamp +build-stamp: + dh_testdir + # Add here commands to compile the package. + $(PERL) Build.PL installdirs=vendor create_packlist=0 + ./Build + ./Build test + touch $@ + +clean: + dh_testdir + dh_testroot + dh_clean build-stamp install-stamp + [ ! -f Build ] || ./Build distclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + ./Build install destdir=$(CURDIR)/debian/$(PACKAGE) + #[ ! -d $(CURDIR)/debian/$(PACKAGE)/usr/lib/perl5 ] || rmdir --ignore-fail-on-non-empty --parents --verbose $(CURDIR)/debian/$(PACKAGE)/usr/lib/perl5 + touch $@ + +binary-arch:; +binary-indep: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installchangelogs Changes + dh_compress + dh_fixperms + dh_installdeb + dh_perl + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/watch b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/watch new file mode 100644 index 0000000..33e6189 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Array-Compare/ .*/Array-Compare-([[:digit:]].*)\.tar\.gz diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/lib/Array/Compare.pm b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/lib/Array/Compare.pm new file mode 100755 index 0000000..d290c59 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/lib/Array/Compare.pm @@ -0,0 +1,505 @@ +# +# $Id: Compare.pm 30 2008-06-29 14:04:29Z dave $ +# + +=head1 NAME + +Array::Compare - Perl extension for comparing arrays. + +=head1 SYNOPSIS + + use Array::Compare; + + my $comp1 = Array::Compare->new; + $comp->Sep('|'); + $comp->Skip({3 => 1, 4 => 1}); + $comp->WhiteSpace(0); + $comp->Case(1); + + my $comp2 = Array::Compare->new(Sep => '|', + WhiteSpace => 0, + Case => 1, + Skip => {3 => 1, 4 => 1}); + + my @arr1 = 0 .. 10; + my @arr2 = 0 .. 10; + + $comp1->compare(\@arr1, \@arr2); + $comp2->compare(\@arr1, \@arr2); + +=head1 DESCRIPTION + +If you have two arrays and you want to know if they are the same or +different, then Array::Compare will be useful to you. + +All comparisons are carried out via a comparator object. In the +simplest usage, you can create and use a comparator object like +this: + + my @arr1 = 0 .. 10; + my @arr2 = 0 .. 10; + + my $comp = Array::Compare->new; + + if ($comp->compare(\@arr1, \@arr2)) { + print "Arrays are the same\n"; + } else { + print "Arrays are different\n"; + } + +Notice that you pass references to the two arrays to the comparison +method. + +Internally the comparator compares the two arrays by using C +to turn both arrays into strings and comparing the strings using +C. In the joined strings, the elements of the original arrays +are separated with the C<^G> character. This can cause problems if +your array data contains C<^G> characters as it is possible that +two different arrays can be converted to the same string. + +To avoid this, it is possible to override the default separator +character, either by passing and alternative to the C function + + my $comp = Array::Compare->new(Sep => '|'); + +or by changing the seperator for an existing comparator object + + $comp->Sep('|'); + +In general you should choose a separator character that won't appear +in your data. + +You can also control whether or not whitespace within the elements of +the arrays should be considered significant when making the comparison. +The default is that all whitespace is significant. The alternative is +for all consecutive white space characters to be converted to a single +space for the pruposes of the comparison. Again, this can be turned on +when creating a comparator object: + + my $comp = Array::Compare->new(WhiteSpace => 0); + +or by altering an existing object: + + $comp->WhiteSpace(0); + +You can also control whether or not the case of the data is significant +in the comparison. The default is that the case of data is taken into +account. This can be changed in the standard ways when creating a new +comparator object: + + my $comp = Array::Compare->new(Case => 0); + +or by altering an existing object: + + $comp->Case(0); + +In addition to the simple comparison described above (which returns true +if the arrays are the same and false if they're different) there is also +a full comparison which returns a list containing the indexes of elements +which differ between the two arrays. If the arrays are the same it returns +an empty list. In scalar context the full comparison returns the length of +this list (i.e. the number of elements that differ). You can access the full +comparision in two ways. Firstly, there is a C attribute. If this +is C then a full comparison if carried out whenever the C +method is called. + + my $comp = Array::Compare->new(DefFull => 1); + $comp->compare(\@arr1, \@arr2); # Full comparison + + $comp->DefFull(0); + $comp->compare(\@arr1, \@arr2); # Simple comparison + + $comp->DefFull(1); + $comp->compare(\@arr1, \@arr2); # Full comparison again + + +Secondly, you can access the full comparison method directly + + $comp->full_compare(\@arr1, \@arr2); + +For symmetry, there is also a direct method to use to call the simple +comparison. + + $comp->simple_compare(\@arr1, \@arr2); + +The final complication is the ability to skip elements in the comparison. +If you know that two arrays will always differ in a particular element +but want to compare the arrays I this element, you can do it +with Array::Compare without taking array slices. To do this, a +comparator object has an optional attribute called C which is a +reference to a hash. The keys in this hash are the indexes of the array +elements and the values should be any true value for elements that should +be skipped. + +For example, if you want to compare two arrays, ignoring the values in +elements two and four, you can do something like this: + + my %skip = (2 => 1, 4 => 1); + my @a = (0, 1, 2, 3, 4, 5); + my @b = (0, 1, X, 3, X, 5); + + my $comp = Array::Compare->new(Skip => \%skip); + + $comp->compare(\@a, \@b); + +This should return I, as we are explicitly ignoring the columns +which differ. + +Of course, having created a comparator object with no skip hash, it is +possible to add one later: + + $comp->Skip({1 => 1, 2 => 1}); + +or: + + my %skip = (1 => 1, 2 => 2); + $comp->Skip(\%skip); + +To reset the comparator so that no longer skips elements, set the skip +hash to an empty hash. + + $comp->Skip({}); + +You can also check to see if one array is a permutation of another, i.e. +they contain the same elements but in a different order. + + if ($comp->perm(\@a, \@b) { + print "Arrays are perms\n"; + else { + print "Nope. Arrays are completely different\n"; + } + +In this case the values of C and C are still used, +but C is ignored for, hopefully, obvious reasons. + +=head1 METHODS + +=cut + +package Array::Compare; + +require 5.006_000; +use strict; +use warnings; +our ($VERSION, $AUTOLOAD); + +use Carp; + +$VERSION = 1.15; + +my %_defaults = (Sep => '^G', + WhiteSpace => 1, + Case => 1, + Skip => {}, + DefFull => 0); + +=head2 new [ %OPTIONS ] + +Constructs a new comparison object. + +Takes an optional hash containing various options that control how +comparisons are carried out. Any omitted options take useful defaults. + +=over 4 + +=item Sep + +This is the value that is used to separate fields when the array is joined +into a string. It should be a value which doesn't appear in your data. +Default is '^G'. + +=item WhiteSpace + +Flag that indicates whether or not whitespace is significant in the +comparison. If this value is true then all multiple whitespace characters +are changed into a single space before the comparison takes place. Default +is 1 (whitespace is significant). + +=item Case + +Flag that indicates whther or not the case of the data should be significant +in the comparison. Default is 1 (case is significant). + +=item Skip + +a reference to a hash which contains the numbers of any columns that should +be skipped in the comparison. Default is an empty hash (all columns are +significant). + +=item DefFull + +Flag which indicates whether the default comparison is simple (just returns +true if the arrays are the same or false if they're not) or full (returns an +array containing the indexes of the columns that differ). Default is 0 (simple +comparison). + +=back + +=cut + +sub new { + my $class = shift; + + my $self = {%_defaults, @_}; + + bless $self, $class; + + return $self; +} + +# +# Utility function to check the arguments to any of the comparison +# function. Ensures that there are two arguments and that they are +# both arrays. +# +sub _check_args { + my $self = shift; + croak('Must compare two arrays.') unless @_ == 2; + croak('Argument 1 is not an array') unless ref($_[0]) eq 'ARRAY'; + croak('Argument 2 is not an array') unless ref($_[1]) eq 'ARRAY'; + + return; +} + +=head2 compare_len \@ARR1, \@ARR2 + +Very simple comparison. Just checks the lengths of the arrays are +the same. + +=cut + +sub compare_len { + my $self = shift; + + $self->_check_args(@_); + + return @{$_[0]} == @{$_[1]}; +} + +=head2 compare \@ARR1, \@ARR2 + +Compare the values in two arrays and return a data indicating whether +the arrays are the same. The exact return values differ depending on +the comparison method used. See the descriptions of L +and L for details. + +Uses the value of DefFull to determine which comparison routine +to use. + +=cut + +sub compare { + my $self = shift; + + if ($self->DefFull) { + return $self->full_compare(@_); + } else { + return $self->simple_compare(@_); + } +} + +=head2 simple_compare \@ARR1, \@ARR2 + +Compare the values in two arrays and return a flag indicating whether or +not the arrays are the same. + +Returns true if the arrays are the same or false if they differ. + +Uses the values of 'Sep', 'WhiteSpace' and 'Skip' to influence +the comparison. + +=cut + +sub simple_compare { + my $self = shift; + + $self->_check_args(@_); + + my ($row1, $row2) = @_; + + # No point in continuing if the number of elements is different. + return unless $self->compare_len(@_); + + # @check contains the indexes into the two arrays, i.e. the numbers + # from 0 to one less than the number of elements. + my @check = 0 .. $#$row1; + + my ($pkg, $caller) = (caller(1))[0, 3]; + my $perm = $caller eq __PACKAGE__ . "::perm"; + + # Filter @check so it only contains indexes that should be compared. + # N.B. Makes no sense to do this if we are called from 'perm'. + unless ($perm) { + @check = grep {!(exists $self->Skip->{$_} + && $self->Skip->{$_}) } @check + if keys %{$self->Skip}; + } + + # Build two strings by taking array slices containing only the columns + # that we shouldn't skip and joining those array slices using the Sep + # character. Hopefully we can then just do a string comparison. + # Note: this makes the function liable to errors if your arrays + # contain the separator character. + my $str1 = join($self->Sep, @{$row1}[@check]); + my $str2 = join($self->Sep, @{$row2}[@check]); + + # If whitespace isn't significant, collapse it + unless ($self->WhiteSpace) { + $str1 =~ s/\s+/ /g; + $str2 =~ s/\s+/ /g; + } + + # If case isn't significant, change to lower case + unless ($self->Case) { + $str1 = lc $str1; + $str2 = lc $str2; + } + + return $str1 eq $str2; +} + +=head2 full_compare \@ARR1, \@ARR2 + +Do a full comparison between two arrays. + +Checks each individual column. In scalar context returns the number +of columns that differ (zero if the arrays are the same). In list +context returns an list containing the indexes of the columns that +differ (an empty list if the arrays are the same). + +Uses the values of 'Sep' and 'WhiteSpace' to influence the comparison. + +B If the two arrays are of different lengths then this method +just returns the indexes of the elements that appear in one array but +not the other (i.e. the indexes from the longer array that are beyond +the end of the shorter array). This might be a little +counter-intuitive. + +=cut + +sub full_compare { + my $self = shift; + + $self->_check_args(@_); + + my ($row1, $row2) = @_; + + # No point in continuing if the number of elements is different. + # Because of the expected return value from this function we can't + # just say 'the arrays are different'. We need to do some work to + # calculate a meaningful return value. + # If we've been called in array context we return a list containing + # the number of the columns that appear in the longer list and aren't + # in the shorter list. If we've been called in scalar context we + # return the difference in the lengths of the two lists. + unless ($self->compare_len(@_)) { + if (wantarray) { + my ($max, $min); + if ($#{$row1} > $#{$row2}) { + ($max, $min) = ($#{$row1}, $#{$row2} + 1); + } else { + ($max, $min) = ($#{$row2}, $#{$row1} + 1); + } + return ($min .. $max); + } else { + return abs(@{$row1} - @{$row2}); + } + } + + my ($arr1, $arr2) = @_; + + my @diffs = (); + + foreach (0 .. $#{$arr1}) { + next if keys %{$self->Skip} && $self->Skip->{$_}; + + my ($val1, $val2) = ($arr1->[$_], $arr2->[$_]); + unless ($self->WhiteSpace) { + $val1 =~ s/\s+/ /g; + $val2 =~ s/\s+/ /g; + } + + unless ($self->Case) { + $val1 = lc $val1; + $val2 = lc $val2; + } + + push @diffs, $_ unless $val1 eq $val2; + } + + return wantarray ? @diffs : scalar @diffs; +} + +=head2 perm \@ARR1, \@ARR2 + +Check to see if one array is a permutation of the other (i.e. contains +the same set of elements, but in a different order). + +We do this by sorting the arrays and passing references to the assorted +versions to simple_compare. There are also some small changes to +simple_compare as it should ignore the Skip hash if we are called from +perm. + +=cut + +sub perm { + my $self = shift; + + return $self->simple_compare([sort @{$_[0]}], [sort @{$_[1]}]); +} + +# +# Attempt to be clever with object attributes. +# Each object attribute is always accessed using an access method. +# None of these access methods exist in the object code. +# If an unknown method is called then the AUTOLOAD method is called +# in its place with the same parameters and the variable $AUTOLOAD +# set to the name of the unknown method. +# +# In this function we work out which method has been called and +# simulate it by returning the correct attribute value (and setting +# it to a new value if the method was passed a new value to use). +# +# We're also a little cleverer than that as we create a new method on +# the fly so that the next time we call the missing method it has +# magically sprung into existance, thereby avoiding the overhead of +# calling AUTOLOAD more than once for each method called. +# +sub AUTOLOAD { + no strict 'refs'; + my ($self, $val) = @_; + my ($name) = $AUTOLOAD =~ m/.*::(\w*)/; + + *{$AUTOLOAD} = sub { return @_ > 1 ? + $_[0]->{$name} = $_[1] : + $_[0]->{$name}}; + + return defined $val ? $self->{$name} = $val : $self->{$name}; +} + +# +# One (small) downside of the AUTOLOAD trick, is that we need to +# explicitly define a DESTROY method to prevent Perl from passing +# those calls to AUTOLOAD. In this case we don't need to do anything. +# +sub DESTROY { } + +1; +__END__ + +=head1 AUTHOR + +Dave Cross + +=head1 SEE ALSO + +perl(1). + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2000-2005, Magnum Solutions Ltd. All Rights Reserved. + +This script is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod.t b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod.t new file mode 100644 index 0000000..437887a --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod.t @@ -0,0 +1,4 @@ +use Test::More; +eval "use Test::Pod 1.00"; +plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; +all_pod_files_ok(); diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod_coverage.t b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod_coverage.t new file mode 100644 index 0000000..2c5ca56 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/pod_coverage.t @@ -0,0 +1,4 @@ +use Test::More; +eval "use Test::Pod::Coverage 1.00"; +plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD coverage" if $@; +all_pod_coverage_ok(); diff --git a/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/test.t b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/test.t new file mode 100755 index 0000000..b73f8d0 --- /dev/null +++ b/dev/i386/libarray-compare-perl/libarray-compare-perl-1.16/t/test.t @@ -0,0 +1,136 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +use Test::More tests => 30; + +use_ok('Array::Compare'); + +my $comp = Array::Compare->new; + +my @A = qw/0 1 2 3 4 5 6 7 8/; +my @B = qw/0 1 2 3 4 5 X 7 8/; +my @C = @A; + +my %skip1 = (6 => 1); +my %skip2 = (5 => 1); +my %skip3 = (6 => 0); + +# Compare two different arrays - should fail +ok(not $comp->compare(\@A, \@B)); + +# Compare two different arrays but ignore differing column - should succeed +$comp->Skip(\%skip1); +ok($comp->compare(\@A, \@B)); + +# compare two different arrays but ignore non-differing column - should fail +$comp->Skip(\%skip2); +ok(not $comp->compare(\@A, \@B)); + +# Compare two different arrays but ignore differing column (badly) +# - should fail as skip value is 0 +$comp->Skip(\%skip3); +ok(not $comp->compare(\@A, \@B)); + +# Change separator and compare two identical arrays - should succeed +$comp->Sep('|'); +ok($comp->compare(\@A, \@C)); + +# These tests should generate fatal errors - hence the evals + +# Compare a number with an array +eval { print $comp->compare(1, \@A) }; +ok($@); + +# Compare an array with a number +eval { print $comp->compare(\@A, 1) }; +ok($@); + +# Call compare with only one argument +eval { print $comp->compare(\@A) }; +ok($@); + +# Switch to full comparison +$comp->DefFull(1); +ok($comp->DefFull); +$comp->Skip({}); + +# @A and @B differ in column 6 +# Array context +my @diffs = $comp->compare(\@A, \@B); +ok(scalar @diffs == 1 && $diffs[0] == 6); + +# Scalar context +my $diffs = $comp->compare(\@A, \@B); +ok($diffs); + +# @A and @B differ in column 6 (which we ignore) +$comp->Skip(\%skip1); +# Array context +@diffs = $comp->compare(\@A, \@B); +ok(not @diffs); + +# Scalar context +$diffs = $comp->compare(\@A, \@B); +ok(not $diffs); + +# @A and @C are the same +# Array context +@diffs = $comp->compare(\@A, \@C); +ok(not @diffs); + +# Scalar context +$diffs = $comp->compare(\@A, \@C); +ok(not $diffs); + +# Test arrays of differing length +my @D = (0 .. 5); +my @E = (0 .. 10); + +$comp->DefFull(0); +ok( not $comp->compare(\@D, \@E)); + +$comp->DefFull(1); +@diffs = $comp->compare(\@D, \@E); +ok(@diffs == 5); + +@diffs = $comp->compare(\@E, \@D); +ok(@diffs == 5); + +$diffs = $comp->compare(\@D, \@E); +ok($diffs == 5); + +# Test Perms +my @F = (1 .. 5); +my @G = qw(5 4 3 2 1); +my @H = qw(3 4 1 2 5); +my @I = qw(4 3 6 5 2); + +ok($comp->perm(\@F, \@G)); +ok($comp->perm(\@F, \@H)); +ok(not $comp->perm(\@F, \@I)); + +my @J = ('array with', 'white space'); +my @K = ('array with', 'white space'); +ok($comp->compare(\@J, \@K)); + +# Turn off whitespace +$comp->WhiteSpace(0); +ok(not $comp->compare(\@J, \@K)); + +$comp->DefFull(0); +ok($comp->compare(\@J, \@K)); + +# Turn on whitespace +$comp->WhiteSpace(1); +ok(not $comp->compare(\@J, \@K)); + +my @L = qw(ArRay WiTh DiFfErEnT cAsEs); +my @M = qw(aRrAY wItH dIfFeReNt CaSeS); +ok(not $comp->compare(\@L, \@M)); + +# Turn of case sensitivity +$comp->Case(0); +ok($comp->compare(\@L, \@M)); + +$comp->DefFull(1); +ok(not $comp->compare(\@L, \@M)); diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Build.PL b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Build.PL new file mode 100644 index 0000000..c681835 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Build.PL @@ -0,0 +1,15 @@ +use strict; +use Module::Build; + +Module::Build + ->new( module_name => "Class::Accessor::Chained", + license => 'perl', + build_requires => { + 'Test::More' => 0, + }, + requires => { + 'Class::Accessor' => 0, + }, + create_makefile_pl => 'traditional', + ) + ->create_build_script; diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Changes b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Changes new file mode 100644 index 0000000..5086c5f --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Changes @@ -0,0 +1,2 @@ +0.01 Monday 24th November, 2003 + initial CPAN release diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/MANIFEST b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/MANIFEST new file mode 100644 index 0000000..62c0aae --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/MANIFEST @@ -0,0 +1,10 @@ +Build.PL +Changes +MANIFEST +Makefile.PL +README +META.yml +lib/Class/Accessor/Chained.pm +lib/Class/Accessor/Chained/Fast.pm +t/00compile.t +t/chained.t diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/META.yml b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/META.yml new file mode 100644 index 0000000..470285b --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/META.yml @@ -0,0 +1,18 @@ +--- #YAML:1.0 +name: Class-Accessor-Chained +version: 0.01 +license: perl +distribution_type: module +requires: + Class::Accessor: 0 +recommends: {} +build_requires: + Test::More: 0 +conflicts: {} +provides: + Class::Accessor::Chained: + file: lib/Class/Accessor/Chained.pm + version: 0.01 + Class::Accessor::Chained::Fast: + file: lib/Class/Accessor/Chained/Fast.pm +generated_by: Module::Build version 0.21 diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Makefile.PL b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Makefile.PL new file mode 100644 index 0000000..7333547 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/Makefile.PL @@ -0,0 +1,14 @@ +# Generated by Module::Build::Compat->create_makefile_pl + +use ExtUtils::MakeMaker; +WriteMakefile + ( + NAME => 'Class::Accessor::Chained', + VERSION => '0.01', + PL_FILES => {}, + INSTALLDIRS => 'site', + PREREQ_PM => { + 'Test::More' => '0', + 'Class::Accessor' => '0', + }, + ); diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/README b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/README new file mode 100644 index 0000000..6443345 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/README @@ -0,0 +1,57 @@ +README for Class::Accessor::Chained 0.01 + +=head1 NAME + +Class::Accessor::Chained - make chained accessors + +=head1 SYNOPSIS + + package Foo; + use base qw( Class::Accessor::Chained ); + __PACKAGE__->mk_accessors(qw( foo bar baz )); + + my $foo = Foo->new->foo(1)->bar(2)->baz(4); + print $foo->bar; # prints 2 + + +=head1 DEPENDENCIES + +This module has external dependencies on the following modules: + + Class::Accessor + +=head1 INSTALLATION + + perl Build.PL + perl Build test + +and if all goes well + + perl Build install + +=head1 HISTORY + +What changed over the last 3 revisions + +=over + +=item 0.01 Monday 24th November, 2003 + + initial CPAN release +=back + +=head1 AUTHOR + +Richard Clamp + +=head1 COPYRIGHT + +Copyright (C) 2003 Richard Clamp. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L, L + diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/changelog b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/changelog new file mode 100644 index 0000000..4c8eeb0 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/changelog @@ -0,0 +1,22 @@ +libclass-accessor-chained-perl (0.01.1~debian-2.1) unstable; urgency=low + + * Non-maintainer upload. + * Conditionally remove $(TMP)/usr/lib/perl5 (closes: #467707) + * Stop ignoring clean errors in debian/rules + * This is not a native package + * Update Standards-Version (no changes) + + -- Stephen Gran Sun, 06 Apr 2008 01:38:30 +0100 + +libclass-accessor-chained-perl (0.01-2) unstable; urgency=low + + * Update standards version to 3.7.2 (no changes required). + + -- James Bromberger Wed, 20 Dec 2006 22:31:13 +0000 + +libclass-accessor-chained-perl (0.01-1) unstable; urgency=low + + * Initial Release. Closes: #258742. + + -- James Bromberger Tue, 13 Jul 2004 13:17:40 +0100 + diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/compat b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/compat @@ -0,0 +1 @@ +4 diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/control b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/control new file mode 100644 index 0000000..74ddbd2 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/control @@ -0,0 +1,20 @@ +Source: libclass-accessor-chained-perl +Section: perl +Priority: optional +Build-Depends: debhelper (>= 4.0.2) +Build-Depends-Indep: perl (>= 5.8.0-7) +Maintainer: James Bromberger +Standards-Version: 3.7.3 + +Package: libclass-accessor-chained-perl +Architecture: all +Depends: ${perl:Depends}, libclass-accessor-perl +Description: make chained accessors + A chained accessor is one that always returns the object when called + with parameters (to set), and the value of the field when called with + no arguments. + . + This module subclasses Class::Accessor in order to provide the same + mk_accessors interface. + . + This description was automagically extracted from the module by dh-make-perl. diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/copyright b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/copyright new file mode 100644 index 0000000..94d58a7 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/copyright @@ -0,0 +1,21 @@ +This is the debian package for the Class-Accessor-Chained module. +It was created by James Bromberger using dh-make-perl. + +This copyright info was automatically extracted from the perl module. +It may not be accurate, so you better check the module sources +if don't want to get into legal troubles. + +The upstream author is: + +Richard Clamp . + + +Copyright (C) 2003 Richard Clamp. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +Perl is distributed under your choice of the GNU General Public License or +the Artistic License. On Debian GNU/Linux systems, the complete text of the +GNU General Public License can be found in `/usr/share/common-licenses/GPL' +and the Artistic Licence in `/usr/share/common-licenses/Artistic'. diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/rules b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/rules new file mode 100755 index 0000000..c3de9e6 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/rules @@ -0,0 +1,90 @@ +#!/usr/bin/make -f +# This debian/rules file is provided as a template for normal perl +# packages. It was created by Marc Brockschmidt for +# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may +# be used freely wherever it is useful. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# If set to a true value then MakeMaker's prompt function will +# always return the default without waiting for user input. +export PERL_MM_USE_DEFAULT=1 + +PACKAGE=$(shell dh_listpackages) + +ifndef PERL +PERL = /usr/bin/perl +endif + +TMP =$(CURDIR)/debian/$(PACKAGE) + +# Allow disabling build optimation by setting noopt in +# $DEB_BUILD_OPTIONS +CFLAGS = -Wall -g +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif + +build: build-stamp +build-stamp: + dh_testdir + + # Add commands to compile the package here + $(PERL) Makefile.PL INSTALLDIRS=vendor + $(MAKE) OPTIMIZE="$(CFLAGS)" + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + # Add commands to clean up after the build process here + [ ! -f Makefile ] || $(MAKE) distclean + + dh_clean build-stamp install-stamp + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + + #$(MAKE) test + $(MAKE) install DESTDIR=$(TMP) PREFIX=/usr + + # As this is a architecture independent package, we are not supposed to install + # stuff to /usr/lib. MakeMaker creates the dirs, we delete them from the deb: + [ ! -d $(TMP)/usr/lib/perl5 ] || rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/lib/perl5 + + touch install-stamp + +binary-arch: +# We have nothing to do by default. + +binary-indep: build install + dh_testdir + dh_testroot +# dh_installcron +# dh_installmenu +# dh_installexamples + dh_installdocs README + dh_installchangelogs Changes + dh_perl + dh_link + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/watch b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/watch new file mode 100644 index 0000000..46329c0 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/debian/watch @@ -0,0 +1,2 @@ +version=2 +http://www.cpan.org/modules/by-module/Class/Class-Accessor-Chained-(.*)\.tar\.gz debian uupdate diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained.pm b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained.pm new file mode 100644 index 0000000..2c99070 --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained.pm @@ -0,0 +1,82 @@ +use strict; +package Class::Accessor::Chained; +use base 'Class::Accessor'; +our $VERSION = '0.01'; + +sub make_accessor { + my($class, $field) = @_; + + # Build a closure around $field. + return sub { + my($self) = shift; + + if (@_) { + $self->set($field, @_); + return $self; + } + else { + return $self->get($field); + } + }; +} + +sub make_wo_accessor { + my($class, $field) = @_; + + return sub { + my($self) = shift; + + unless (@_) { + my $caller = caller; + require Carp; + Carp::croak("'$caller' cannot access the value of '$field' on ". + "objects of class '$class'"); + } + else { + $self->set($field, @_); + return $self; + } + }; +} + +1; +__END__ + +=head1 NAME + +Class::Accessor::Chained - make chained accessors + +=head1 SYNOPSIS + + package Foo; + use base qw( Class::Accessor::Chained ); + __PACKAGE__->mk_accessors(qw( foo bar baz )); + + my $foo = Foo->new->foo(1)->bar(2)->baz(4); + print $foo->bar; # prints 2 + +=head1 DESCRIPTION + +A chained accessor is one that always returns the object when called +with parameters (to set), and the value of the field when called with +no arguments. + +This module subclasses Class::Accessor in order to provide the same +mk_accessors interface. + +=head1 AUTHOR + +Richard Clamp + +=head1 COPYRIGHT + +Copyright (C) 2003 Richard Clamp. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L, L + +=cut diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained/Fast.pm b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained/Fast.pm new file mode 100644 index 0000000..d52f89f --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/lib/Class/Accessor/Chained/Fast.pm @@ -0,0 +1,70 @@ +use strict; +package Class::Accessor::Chained::Fast; +use base 'Class::Accessor::Fast'; + +sub make_accessor { + my($class, $field) = @_; + + return sub { + my $self = shift; + if(@_) { + $self->{$field} = (@_ == 1 ? $_[0] : [@_]); + return $self; + } + return $self->{$field}; + }; +} + +sub make_wo_accessor { + my($class, $field) = @_; + + return sub { + my($self) = shift; + + unless (@_) { + my $caller = caller; + require Carp; + Carp::croak("'$caller' cannot access the value of '$field' on ". + "objects of class '$class'"); + } + else { + $self->{$field} = (@_ == 1 ? $_[0] : [@_]); + return $self; + } + }; +} + +1; + +=head1 NAME + +Class::Accessor::Chained::Fast - Faster, but less expandable, chained accessors + +=head1 SYNOPSIS + + package Foo; + use base qw(Class::Accessor::Chained::Fast); + + # The rest as Class::Accessor::Chained except no set() or get(). + +=head1 DESCRIPTION + +By analogue to Class::Accessor and Class::Accessor::Fast this module +provides a faster less-flexible chained accessor maker. + +=head1 AUTHOR + +Richard Clamp + +=head1 COPYRIGHT + +Copyright (C) 2003 Richard Clamp. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=head1 SEE ALSO + +L, L + +=cut diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/00compile.t b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/00compile.t new file mode 100644 index 0000000..536d27a --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/00compile.t @@ -0,0 +1,5 @@ +#!perl -w +use strict; +use Test::More tests => 2; +require_ok('Class::Accessor::Chained'); +require_ok('Class::Accessor::Chained::Fast'); diff --git a/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/chained.t b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/chained.t new file mode 100644 index 0000000..ea41abf --- /dev/null +++ b/dev/i386/libclass-accessor-chained-perl/libclass-accessor-chained-perl-0.01.1~debian/t/chained.t @@ -0,0 +1,24 @@ +#!perl -w +use strict; +use Test::More tests => 6; + +package Foo; +use base 'Class::Accessor::Chained'; +__PACKAGE__->mk_accessors(qw( foo bar baz )); +package main; + +my $foo = Foo->new->foo(1)->baz(2)->bar(4); +isa_ok( $foo, 'Foo' ); +is( $foo->bar, 4, "get gets the value" ); +is( $foo->foo( 5 ), $foo, "set gets the object" ); + +# and again, but with Fast accessors +package Bar; +use base 'Class::Accessor::Chained::Fast'; +__PACKAGE__->mk_accessors(qw( foo bar baz )); +package main; + +my $bar = Bar->new->foo(1)->baz(2)->bar(4); +isa_ok( $bar, 'Bar' ); +is( $bar->bar, 4, "get gets the value" ); +is( $bar->foo( 5 ), $bar, "set gets the object" ); diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Changes b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Changes new file mode 100644 index 0000000..8841c8a --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Changes @@ -0,0 +1,80 @@ +0.31 Wed Jul 11 23:03:47 JST 2007 + - applied performance patch from RUZ + +0.30 Sun Nov 26 13:03:47 JST 2006 + - added version numbers back into each class to fix RT#21746 + +0.26 Wed Jul 19 01:20:23 BST 2006 + - added Class::Accessor::Faster that uses an array internally. + Thanks to Tina Mueller for prompting me to do this. + +0.25 Fri Mar 31 18:28:17 JST 2006 + - added a 'follow_best_practice' class method that causes the accessors to + be called 'get_foo' and 'set_foo' instead of just 'foo' + - added 'accessor_name_for' and 'mutator_name_for' methods that you can + override in your subclass to create your own names for accessors. + (That idea taken from Class::DBI.) + +0.23 Sat Feb 25 19:46:08 GMT 2006 + - rewrote the tests. Now using Test::More + +0.21 Thu Sep 1 16:58:31 BST 2005 + - added _croak and _carp methods so you can override these in subclasses if + you want to change the default behaviour when something bad happens. + +0.20 Thu Sep 1 12:25:23 BST 2005 + - add a copyright statement + - tidy some documentation (more to do later) + +0.19 Tue Mar 2 23:10:48 GMT 2004 + * Performance patch from Elizabeth Mattijsen + - minor layout and doc changes + +0.18 Mon Apr 2 11:52:41 BST 2003 + * First change in 2 years: Marty Pauley is new maintainer. + - changed the dependency for base to cope with the broken version shipped + with perl 5.6.0. + +0.17 Mon Apr 2 11:52:41 BST 2001 + - Now requiring Class::Fields's base (because 5.005_03's is busted) + +0.16 Wed Dec 13 21:19:21 EST 2000 + * Added Class::Accessor::Fast + * Added simple new() method + - Added EFFICIENCY, SEE ALSO and THANKS doc sections + - Added docs about why this module is interesting + * Added read-only and write-only accessors (thanks Tels) + - Fixed the Altoids example (thanks again, Tels) + - Added a simple example of overiding accessors + +0.15 Thu Aug 17 20:39:02 EDT 2000 + - Removed use of Carp::Assert to speed loading time + - Added an EXAMPLE section. + +0.14 Sun Jul 2 20:05:51 EDT 2000 + - Rolled the accessor overriding caveats from the TPC paper into + the docs. + +0.13 Mon Apr 24 20:33:40 EDT 2000 + - Left a dependency on Class::Fields in the tests. + +0.12 Tue Apr 18 13:22:17 EDT 2000 + - Left a dependency on Class::Fields in Accessor.pm + - Removed PREREQ_PM on base.pm + +0.11 Mon Apr 17 20:11:00 EDT 2000 + - Removed a few "use public"s from the docs. + +0.10 Fri Apr 14 23:29:01 EDT 2000 + * Removed the Autoloader. + * Instead of wraping public data accessors around public data (how silly) + Class::Accessor now simply generates the accessors you request. + * Added mk_accessors() + - Removed the docs about the accessor autoloader. + - Removed the autoloading caveat. + * Removed make_static_accessors() + - It will now only warn if you try to make an accessor called DESTROY() + - detabbed everything + +0.02 Sun Dec 12 02:22:12 EST 1999 + * Class::Fields::Accessor is now Class::Accessor diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/INSTALL b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/INSTALL new file mode 100644 index 0000000..c3ff549 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/INSTALL @@ -0,0 +1,15 @@ +WHAT IS THIS? + +This is Class::Accessor, a Perl module. Please see the README that +comes with this distribution. + +HOW DO I INSTALL IT? + +To install this module, cd to the directory that contains this README +file and type the following: + + perl Makefile.PL + make + make test + make install + diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/MANIFEST b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/MANIFEST new file mode 100644 index 0000000..03c0b96 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/MANIFEST @@ -0,0 +1,15 @@ +Changes +examples/benchmark +INSTALL +lib/Class/Accessor.pm +lib/Class/Accessor/Fast.pm +lib/Class/Accessor/Faster.pm +Makefile.PL +MANIFEST This list of files +META.yml +README +t/accessors.t +t/aliases.t +t/bestpractice.t +t/croak.t +t/getset.t diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/META.yml b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/META.yml new file mode 100644 index 0000000..fcaf456 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/META.yml @@ -0,0 +1,11 @@ +# http://module-build.sourceforge.net/META-spec.html +#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# +name: Class-Accessor +version: 0.31 +version_from: lib/Class/Accessor.pm +installdirs: site +requires: + base: 1.01 + +distribution_type: module +generated_by: ExtUtils::MakeMaker version 6.30_01 diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Makefile.PL b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Makefile.PL new file mode 100644 index 0000000..73245ef --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/Makefile.PL @@ -0,0 +1,10 @@ +use ExtUtils::MakeMaker; + +require 5.00502; + +WriteMakefile( + NAME => 'Class::Accessor', + VERSION_FROM => 'lib/Class/Accessor.pm', + AUTHOR => 'Marty Pauley ', + PREREQ_PM => { base => $] == 5.006 ? 1.02 : 1.01, }, +); diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/README b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/README new file mode 100644 index 0000000..a839efa --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/README @@ -0,0 +1,78 @@ +NAMES + Class::Accessor - automated accessor generation + Class::Accessor::Fast - faster automated accessor generation + Class::Accessor::Faster - even faster, using an array + +DESCRIPTION + + This module automagically generates accessors/mutators for your class. + + Most of the time, writing accessors is an exercise in cutting and + pasting. You usually wind up with a series of methods like this: + + sub name { + my $self = shift; + if(@_) { + $self->{name} = $_[0]; + } + return $self->{name}; + } + + sub salary { + my $self = shift; + if(@_) { + $self->{salary} = $_[0]; + } + return $self->{salary}; + } + + # etc... + + One for each piece of data in your object. While some will be unique, + doing value checks and special storage tricks, most will simply be + exercises in repetition. Not only is it Bad Style to have a bunch of + repetitious code, but its also simply not lazy, which is the real + tragedy. + + If you make your module a subclass of Class::Accessor and declare your + accessor fields with mk_accessors() then you'll find yourself with a set + of automatically generated accessors which can even be customized! + + The basic set up is very simple: + + package My::Class; + use base qw(Class::Accessor); + My::Class->mk_accessors( qw(foo bar car) ); + + Done. My::Class now has simple foo(), bar() and car() accessors defined. + +BENCHMARKS + + accessors: + Rate Basic Average Fast Faster Direct + Basic 189150/s -- -42% -51% -55% -89% + Average 327679/s 73% -- -16% -22% -82% + Fast 389212/s 106% 19% -- -8% -78% + Faster 421646/s 123% 29% 8% -- -76% + Direct 1771243/s 836% 441% 355% 320% -- + + mutators: + Rate Basic Average Fast Faster Direct + Basic 173769/s -- -34% -53% -59% -90% + Average 263046/s 51% -- -29% -38% -85% + Fast 371158/s 114% 41% -- -13% -78% + Faster 425821/s 145% 62% 15% -- -75% + Direct 1699081/s 878% 546% 358% 299% -- + +AUTHORS + + Copyright 2007 Marty Pauley + + This program is free software; you can redistribute it and/or modify it + under the same terms as Perl itself. That means either (a) the GNU + General Public License or (b) the Artistic License. + +ORIGINAL AUTHOR + + Michael G Schwern + diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/changelog b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/changelog new file mode 100644 index 0000000..1c8b365 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/changelog @@ -0,0 +1,81 @@ +libclass-accessor-perl (0.31-2) unstable; urgency=low + + * Add patch to fix errors in manpage (closes: #443737). + + -- gregor herrmann Sun, 23 Sep 2007 20:54:41 +0200 + +libclass-accessor-perl (0.31-1) unstable; urgency=low + + * New upstream release. + * Add XS-Vcs-Svn field to debian/control. + * Remove use of backtick in debian/rules. + + -- gregor herrmann Sat, 14 Jul 2007 22:08:13 +0200 + +libclass-accessor-perl (0.30-1) unstable; urgency=low + + * New upstream release + + -- Krzysztof Krzyzaniak (eloy) Tue, 28 Nov 2006 15:24:59 +0100 + +libclass-accessor-perl (0.27-2) unstable; urgency=low + + * Adopted for Debian Perl Group + * debian/control: debphelper updated to (>= 5) + * debian/compat: increased to 5 + + -- Krzysztof Krzyzaniak (eloy) Fri, 17 Nov 2006 13:32:24 +0100 + +libclass-accessor-perl (0.27-1) unstable; urgency=low + + * New upstream release - adds new module Class::Accessor::Faster + + -- Stephen Quinney Thu, 10 Aug 2006 19:38:01 +0100 + +libclass-accessor-perl (0.25-1) unstable; urgency=low + + * New upstream release + + -- Stephen Quinney Sun, 16 Apr 2006 18:12:35 +0100 + +libclass-accessor-perl (0.22-1) unstable; urgency=low + + * New upstream release - no code changes. + + -- Stephen Quinney Wed, 14 Sep 2005 09:04:26 +0100 + +libclass-accessor-perl (0.21-1) unstable; urgency=low + + * New upstream release - documentation tidied and new sub-classable + _carp and _croak methods to allow better error handling. + * Switched to my debian.org email address. + + -- Stephen Quinney Fri, 2 Sep 2005 11:19:15 +0100 + +libclass-accessor-perl (0.19-2) unstable; urgency=low + + * debian/watch - Modified so it correctly picks up versions of this + package only. + + -- Stephen Quinney Sat, 31 Jul 2004 09:01:11 +0100 + +libclass-accessor-perl (0.19-1) unstable; urgency=low + + * New upstream release - performance and documentation enhancements. + * Changed section from interpreters to perl. + * Moved from DH_COMPAT to debian/compat. + + -- Stephen Quinney Thu, 11 Mar 2004 11:57:37 +0000 + +libclass-accessor-perl (0.18-1) unstable; urgency=low + + * New upstream release - just a change of upstream maintainer and list + of dependencies. + + -- Stephen Quinney Wed, 9 Apr 2003 17:09:16 +0100 + +libclass-accessor-perl (0.17-1) unstable; urgency=low + + * Initial Release, closes: #183838. + + -- Stephen Quinney Fri, 28 Mar 2003 11:20:29 +0000 diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/compat b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/control b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/control new file mode 100644 index 0000000..9436394 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/control @@ -0,0 +1,23 @@ +Source: libclass-accessor-perl +Section: perl +Priority: optional +Maintainer: Debian Perl Group +Uploaders: Krzysztof Krzyzaniak (eloy) , gregor herrmann +Build-Depends: debhelper (>= 5), quilt +Build-Depends-Indep: perl (>= 5.6.0-16) +Standards-Version: 3.7.2 +XS-Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libclass-accessor-perl/ +XS-Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-accessor-perl/ + +Package: libclass-accessor-perl +Architecture: all +Depends: perl (>= 5.6.1-7) +Description: Automated accessor generator + The Class::Accessor module automagically generates accessor/mutators + for your class. + . + Most of the time, writing accessors is an exercise in cutting and + pasting. If you make your module a subclass of Class::Accessor and + declare your accessor fields with mk_accessors() then you will find + yourself with a set of automatically generated accessors which can + even be customized. diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/copyright b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/copyright new file mode 100644 index 0000000..b91520a --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/copyright @@ -0,0 +1,22 @@ +This package was debianized by Stephen Quinney on +Thu, 06 Mar 2003 12:07:07 +0000 + +It was downloaded from http://www.cpan.org/modules/by-module/Class/ + +Upstream Maintainer: Marty Pauley +Author: Michael G Schwern + +Copyright: + + This program is free software; you can redistribute it and/or modify + it under the terms of either: + + a) the GNU General Public License as published by the Free Software + Foundation; either version 1, or (at your option) any later + version, or + + b) the "Artistic License" which comes with Perl. + + On Debian GNU/Linux systems, the complete text of the GNU General + Public License can be found in `/usr/share/common-licenses/GPL' and + the Artistic Licence in `/usr/share/common-licenses/Artistic'. diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/manpage_typo.diff b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/manpage_typo.diff new file mode 100644 index 0000000..45f9a92 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/manpage_typo.diff @@ -0,0 +1,55 @@ +Index: libclass-accessor-perl/lib/Class/Accessor.pm +=================================================================== +--- libclass-accessor-perl.orig/lib/Class/Accessor.pm 2007-09-23 20:46:35.000000000 +0200 ++++ libclass-accessor-perl/lib/Class/Accessor.pm 2007-09-23 20:50:22.000000000 +0200 +@@ -55,7 +55,7 @@ + One for each piece of data in your object. While some will be unique, + doing value checks and special storage tricks, most will simply be + exercises in repetition. Not only is it Bad Style to have a bunch of +-repetitious code, but its also simply not lazy, which is the real ++repetitious code, but it's also simply not lazy, which is the real + tragedy. + + If you make your module a subclass of Class::Accessor and declare your +@@ -233,8 +233,8 @@ + it will throw an exception. It only uses set() and not get(). + + B I'm not entirely sure why this is useful, but I'm sure someone +-will need it. If you've found a use, let me know. Right now its here +-for orthoginality and because its easy to implement. ++will need it. If you've found a use, let me know. Right now it's here ++for orthoginality and because it's easy to implement. + + package Foo; + use base qw(Class::Accessor); +@@ -505,7 +505,7 @@ + Direct hash access is, of course, much faster than all of these, but it + provides no encapsulation. + +-Of course, its not as simple as saying "Class::Accessor is slower than ++Of course, it's not as simple as saying "Class::Accessor is slower than + average". These are benchmarks for a simple accessor. If your accessors do + any sort of complicated work (such as talking to a database or writing to a + file) the time spent doing that work will quickly swamp the time spend just +@@ -611,7 +611,7 @@ + return $self->SUPER::email(@_); + } + +-There's a subtle problem in the last example, and its in this line: ++There's a subtle problem in the last example, and it's in this line: + + return $self->SUPER::email(@_); + +Index: libclass-accessor-perl/README +=================================================================== +--- libclass-accessor-perl.orig/README 2007-09-23 20:48:38.000000000 +0200 ++++ libclass-accessor-perl/README 2007-09-23 20:49:12.000000000 +0200 +@@ -31,7 +31,7 @@ + One for each piece of data in your object. While some will be unique, + doing value checks and special storage tricks, most will simply be + exercises in repetition. Not only is it Bad Style to have a bunch of +- repetitious code, but its also simply not lazy, which is the real ++ repetitious code, but it's also simply not lazy, which is the real + tragedy. + + If you make your module a subclass of Class::Accessor and declare your diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/series b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/series new file mode 100644 index 0000000..8f22f03 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/patches/series @@ -0,0 +1 @@ +manpage_typo.diff diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/rules b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/rules new file mode 100755 index 0000000..e79d44c --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/rules @@ -0,0 +1,76 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +include /usr/share/quilt/quilt.make + +# Define the perl interpreter + +PERL = /usr/bin/perl + +PACKAGE = $(shell dh_listpackages) + +TMP = $(CURDIR)/debian/$(PACKAGE) + +configure: configure-stamp +configure-stamp: + dh_testdir + + perl Makefile.PL verbose INSTALLDIRS=vendor + + touch configure-stamp + + +build: patch build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + $(MAKE) test + touch build-stamp + +clean: unpatch + dh_testdir + dh_testroot + + [ ! -e Makefile ] || $(MAKE) distclean + + dh_clean build-stamp configure-stamp + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + $(MAKE) install PREFIX=$(TMP)/usr + + # Remove any empty directories + + find $(TMP)/usr -type d -empty -print0 | xargs --null --no-run-if-empty rmdir -p --ignore-fail-on-non-empty + +# Build architecture-independent files here. +binary-arch: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-indep: build install + dh_testdir + dh_testroot + dh_perl + dh_installdocs README + dh_installman + dh_installchangelogs Changes + dh_installexamples examples/* + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/watch b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/watch new file mode 100644 index 0000000..d723e6d --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/debian/watch @@ -0,0 +1,6 @@ +# Example watch control file for uscan +# Rename this file to "watch" and then you can run the "uscan" command +# to check for upstream updates and more. +# Site Directory Pattern Version Script +version=2 +http://www.cpan.org/modules/by-module/Class/Class-Accessor-([\d\.]+)\.tar\.gz diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/examples/benchmark b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/examples/benchmark new file mode 100644 index 0000000..3d30694 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/examples/benchmark @@ -0,0 +1,73 @@ +#!/usr/bin/perl -w + +package Bench::Base; + +sub new { + my($class) = shift; + bless { test => 23 }, $class; +} + +package Bench::Direct; +use base qw(Bench::Base); + +package Bench::ByHand; +use base qw(Bench::Base); + +sub test { + my($self) = shift; + if( @_ ) { + $self->{test} = (@_ == 1 ? $_[0] : [@_]); + } + return $self->{test}; +} + +package Bench::Class::Accessor; +use base qw(Class::Accessor); +__PACKAGE__->mk_accessors(qw(test)); + + +package Bench::Class::Accessor::Fast; +use base qw(Class::Accessor::Fast); +__PACKAGE__->mk_accessors(qw(test)); + +package Bench::Class::Accessor::Faster; +use base qw(Class::Accessor::Faster); +__PACKAGE__->mk_accessors(qw(test)); + +my %init = ( test => 23 ); +my $ca = Bench::Class::Accessor->new(\%init); +my $fast = Bench::Class::Accessor::Fast->new(\%init); +my $faster = Bench::Class::Accessor::Faster->new(\%init); +my $direct = Bench::Direct->new; +my $byhand = Bench::ByHand->new; + +my $foo; +my $control = 42; + + +package main; +use Benchmark 'cmpthese'; +use strict; + +print "accessors:\n"; +cmpthese( -1, + { + 'Basic' => sub { $foo = $ca->test; }, + 'Fast' => sub { $foo = $fast->test; }, + 'Faster' => sub { $foo = $faster->test; }, + 'Average' => sub { $foo = $byhand->test; }, + 'Direct' => sub { $foo = $direct->{test}; } + } + ); + +print "mutators:\n"; +cmpthese( -1, + { + 'Acc' => sub { $ca->test(42); }, + 'Fast' => sub { $fast->test(42); }, + 'Faster' => sub { $faster->test(42); }, + 'By hand' => sub { $byhand->test(42); }, + 'Direct' => sub { $direct->{test} = 42; } + } + ); + diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor.pm b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor.pm new file mode 100644 index 0000000..7dcd00e --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor.pm @@ -0,0 +1,675 @@ +package Class::Accessor; +require 5.00502; +use strict; +$Class::Accessor::VERSION = '0.31'; + +=head1 NAME + + Class::Accessor - Automated accessor generation + +=head1 SYNOPSIS + + package Employee; + use base qw(Class::Accessor); + Employee->mk_accessors(qw(name role salary)); + + # Meanwhile, in a nearby piece of code! + # Class::Accessor provides new(). + my $mp = Foo->new({ name => "Marty", role => "JAPH" }); + + my $job = $mp->role; # gets $mp->{role} + $mp->salary(400000); # sets $mp->{salary} = 400000 (I wish) + + # like my @info = @{$mp}{qw(name role)} + my @info = $mp->get(qw(name role)); + + # $mp->{salary} = 400000 + $mp->set('salary', 400000); + + +=head1 DESCRIPTION + +This module automagically generates accessors/mutators for your class. + +Most of the time, writing accessors is an exercise in cutting and +pasting. You usually wind up with a series of methods like this: + + sub name { + my $self = shift; + if(@_) { + $self->{name} = $_[0]; + } + return $self->{name}; + } + + sub salary { + my $self = shift; + if(@_) { + $self->{salary} = $_[0]; + } + return $self->{salary}; + } + + # etc... + +One for each piece of data in your object. While some will be unique, +doing value checks and special storage tricks, most will simply be +exercises in repetition. Not only is it Bad Style to have a bunch of +repetitious code, but its also simply not lazy, which is the real +tragedy. + +If you make your module a subclass of Class::Accessor and declare your +accessor fields with mk_accessors() then you'll find yourself with a +set of automatically generated accessors which can even be +customized! + +The basic set up is very simple: + + package My::Class; + use base qw(Class::Accessor); + My::Class->mk_accessors( qw(foo bar car) ); + +Done. My::Class now has simple foo(), bar() and car() accessors +defined. + +=head2 What Makes This Different? + +What makes this module special compared to all the other method +generating modules (L<"SEE ALSO">)? By overriding the get() and set() +methods you can alter the behavior of the accessors class-wide. Also, +the accessors are implemented as closures which should cost a bit less +memory than most other solutions which generate a new method for each +accessor. + + +=head1 METHODS + +=head2 new + + my $obj = Class->new; + my $obj = $other_obj->new; + + my $obj = Class->new(\%fields); + my $obj = $other_obj->new(\%fields); + +Class::Accessor provides a basic constructor. It generates a +hash-based object and can be called as either a class method or an +object method. + +It takes an optional %fields hash which is used to initialize the +object (handy if you use read-only accessors). The fields of the hash +correspond to the names of your accessors, so... + + package Foo; + use base qw(Class::Accessor); + Foo->mk_accessors('foo'); + + my $obj = Class->new({ foo => 42 }); + print $obj->foo; # 42 + +however %fields can contain anything, new() will shove them all into +your object. Don't like it? Override it. + +=cut + +sub new { + my($proto, $fields) = @_; + my($class) = ref $proto || $proto; + + $fields = {} unless defined $fields; + + # make a copy of $fields. + bless {%$fields}, $class; +} + +=head2 mk_accessors + + Class->mk_accessors(@fields); + +This creates accessor/mutator methods for each named field given in +@fields. Foreach field in @fields it will generate two accessors. +One called "field()" and the other called "_field_accessor()". For +example: + + # Generates foo(), _foo_accessor(), bar() and _bar_accessor(). + Class->mk_accessors(qw(foo bar)); + +See L +for details. + +=cut + +sub mk_accessors { + my($self, @fields) = @_; + + $self->_mk_accessors('rw', @fields); +} + + +{ + no strict 'refs'; + + sub _mk_accessors { + my($self, $access, @fields) = @_; + my $class = ref $self || $self; + my $ra = $access eq 'rw' || $access eq 'ro'; + my $wa = $access eq 'rw' || $access eq 'wo'; + + foreach my $field (@fields) { + my $accessor_name = $self->accessor_name_for($field); + my $mutator_name = $self->mutator_name_for($field); + if( $accessor_name eq 'DESTROY' or $mutator_name eq 'DESTROY' ) { + $self->_carp("Having a data accessor named DESTROY in '$class' is unwise."); + } + if ($accessor_name eq $mutator_name) { + my $accessor; + if ($ra && $wa) { + $accessor = $self->make_accessor($field); + } elsif ($ra) { + $accessor = $self->make_ro_accessor($field); + } else { + $accessor = $self->make_wo_accessor($field); + } + unless (defined &{"${class}::$accessor_name"}) { + *{"${class}::$accessor_name"} = $accessor; + } + if ($accessor_name eq $field) { + # the old behaviour + my $alias = "_${field}_accessor"; + *{"${class}::$alias"} = $accessor unless defined &{"${class}::$alias"}; + } + } else { + if ($ra and not defined &{"${class}::$accessor_name"}) { + *{"${class}::$accessor_name"} = $self->make_ro_accessor($field); + } + if ($wa and not defined &{"${class}::$mutator_name"}) { + *{"${class}::$mutator_name"} = $self->make_wo_accessor($field); + } + } + } + } + + sub follow_best_practice { + my($self) = @_; + my $class = ref $self || $self; + *{"${class}::accessor_name_for"} = \&best_practice_accessor_name_for; + *{"${class}::mutator_name_for"} = \&best_practice_mutator_name_for; + } + +} + +=head2 mk_ro_accessors + + Class->mk_ro_accessors(@read_only_fields); + +Same as mk_accessors() except it will generate read-only accessors +(ie. true accessors). If you attempt to set a value with these +accessors it will throw an exception. It only uses get() and not +set(). + + package Foo; + use base qw(Class::Accessor); + Class->mk_ro_accessors(qw(foo bar)); + + # Let's assume we have an object $foo of class Foo... + print $foo->foo; # ok, prints whatever the value of $foo->{foo} is + $foo->foo(42); # BOOM! Naughty you. + + +=cut + +sub mk_ro_accessors { + my($self, @fields) = @_; + + $self->_mk_accessors('ro', @fields); +} + +=head2 mk_wo_accessors + + Class->mk_wo_accessors(@write_only_fields); + +Same as mk_accessors() except it will generate write-only accessors +(ie. mutators). If you attempt to read a value with these accessors +it will throw an exception. It only uses set() and not get(). + +B I'm not entirely sure why this is useful, but I'm sure someone +will need it. If you've found a use, let me know. Right now its here +for orthoginality and because its easy to implement. + + package Foo; + use base qw(Class::Accessor); + Class->mk_wo_accessors(qw(foo bar)); + + # Let's assume we have an object $foo of class Foo... + $foo->foo(42); # OK. Sets $self->{foo} = 42 + print $foo->foo; # BOOM! Can't read from this accessor. + +=cut + +sub mk_wo_accessors { + my($self, @fields) = @_; + + $self->_mk_accessors('wo', @fields); +} + +=head1 DETAILS + +An accessor generated by Class::Accessor looks something like +this: + + # Your foo may vary. + sub foo { + my($self) = shift; + if(@_) { # set + return $self->set('foo', @_); + } + else { + return $self->get('foo'); + } + } + +Very simple. All it does is determine if you're wanting to set a +value or get a value and calls the appropriate method. +Class::Accessor provides default get() and set() methods which +your class can override. They're detailed later. + +=head2 follow_best_practice + +In Damian's Perl Best Practices book he recommends separate get and set methods +with the prefix set_ and get_ to make it explicit what you intend to do. If you +want to create those accessor methods instead of the default ones, call: + + __PACKAGE__->follow_best_practice + +=head2 accessor_name_for / mutator_name_for + +You may have your own crazy ideas for the names of the accessors, so you can +make those happen by overriding C and C in +your subclass. (I copied that idea from Class::DBI.) + +=cut + +sub best_practice_accessor_name_for { + my ($class, $field) = @_; + return "get_$field"; +} + +sub best_practice_mutator_name_for { + my ($class, $field) = @_; + return "set_$field"; +} + +sub accessor_name_for { + my ($class, $field) = @_; + return $field; +} + +sub mutator_name_for { + my ($class, $field) = @_; + return $field; +} + +=head2 Modifying the behavior of the accessor + +Rather than actually modifying the accessor itself, it is much more +sensible to simply override the two key methods which the accessor +calls. Namely set() and get(). + +If you -really- want to, you can override make_accessor(). + +=head2 set + + $obj->set($key, $value); + $obj->set($key, @values); + +set() defines how generally one stores data in the object. + +override this method to change how data is stored by your accessors. + +=cut + +sub set { + my($self, $key) = splice(@_, 0, 2); + + if(@_ == 1) { + $self->{$key} = $_[0]; + } + elsif(@_ > 1) { + $self->{$key} = [@_]; + } + else { + $self->_croak("Wrong number of arguments received"); + } +} + +=head2 get + + $value = $obj->get($key); + @values = $obj->get(@keys); + +get() defines how data is retreived from your objects. + +override this method to change how it is retreived. + +=cut + +sub get { + my $self = shift; + + if(@_ == 1) { + return $self->{$_[0]}; + } + elsif( @_ > 1 ) { + return @{$self}{@_}; + } + else { + $self->_croak("Wrong number of arguments received"); + } +} + +=head2 make_accessor + + $accessor = Class->make_accessor($field); + +Generates a subroutine reference which acts as an accessor for the given +$field. It calls get() and set(). + +If you wish to change the behavior of your accessors, try overriding +get() and set() before you start mucking with make_accessor(). + +=cut + +sub make_accessor { + my ($class, $field) = @_; + + # Build a closure around $field. + return sub { + my $self = shift; + + if(@_) { + return $self->set($field, @_); + } + else { + return $self->get($field); + } + }; +} + +=head2 make_ro_accessor + + $read_only_accessor = Class->make_ro_accessor($field); + +Generates a subroutine refrence which acts as a read-only accessor for +the given $field. It only calls get(). + +Override get() to change the behavior of your accessors. + +=cut + +sub make_ro_accessor { + my($class, $field) = @_; + + return sub { + my $self = shift; + + if (@_) { + my $caller = caller; + $self->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'"); + } + else { + return $self->get($field); + } + }; +} + +=head2 make_wo_accessor + + $read_only_accessor = Class->make_wo_accessor($field); + +Generates a subroutine refrence which acts as a write-only accessor +(mutator) for the given $field. It only calls set(). + +Override set() to change the behavior of your accessors. + +=cut + +sub make_wo_accessor { + my($class, $field) = @_; + + return sub { + my $self = shift; + + unless (@_) { + my $caller = caller; + $self->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'"); + } + else { + return $self->set($field, @_); + } + }; +} + +=head1 EXCEPTIONS + +If something goes wrong Class::Accessor will warn or die by calling Carp::carp +or Carp::croak. If you don't like this you can override _carp() and _croak() in +your subclass and do whatever else you want. + +=cut + +use Carp (); + +sub _carp { + my ($self, $msg) = @_; + Carp::carp($msg || $self); + return; +} + +sub _croak { + my ($self, $msg) = @_; + Carp::croak($msg || $self); + return; +} + +=head1 EFFICIENCY + +Class::Accessor does not employ an autoloader, thus it is much faster +than you'd think. Its generated methods incur no special penalty over +ones you'd write yourself. + + accessors: + Rate Basic Average Fast Faster Direct + Basic 189150/s -- -42% -51% -55% -89% + Average 327679/s 73% -- -16% -22% -82% + Fast 389212/s 106% 19% -- -8% -78% + Faster 421646/s 123% 29% 8% -- -76% + Direct 1771243/s 836% 441% 355% 320% -- + + mutators: + Rate Basic Average Fast Faster Direct + Basic 173769/s -- -34% -53% -59% -90% + Average 263046/s 51% -- -29% -38% -85% + Fast 371158/s 114% 41% -- -13% -78% + Faster 425821/s 145% 62% 15% -- -75% + Direct 1699081/s 878% 546% 358% 299% -- + +Class::Accessor::Fast is faster than methods written by an average programmer +(where "average" is based on Schwern's example code). + +Class::Accessor is slower than average, but more flexible. + +Class::Accessor::Faster is even faster than Class::Accessor::Fast. It uses an +array internally, not a hash. This could be a good or bad feature depending on +your point of view. + +Direct hash access is, of course, much faster than all of these, but it +provides no encapsulation. + +Of course, its not as simple as saying "Class::Accessor is slower than +average". These are benchmarks for a simple accessor. If your accessors do +any sort of complicated work (such as talking to a database or writing to a +file) the time spent doing that work will quickly swamp the time spend just +calling the accessor. In that case, Class::Accessor and the ones you write +will be roughly the same speed. + + +=head1 EXAMPLES + +Here's an example of generating an accessor for every public field of +your class. + + package Altoids; + + use base qw(Class::Accessor Class::Fields); + use fields qw(curiously strong mints); + Altoids->mk_accessors( Altoids->show_fields('Public') ); + + sub new { + my $proto = shift; + my $class = ref $proto || $proto; + return fields::new($class); + } + + my Altoids $tin = Altoids->new; + + $tin->curiously('Curiouser and curiouser'); + print $tin->{curiously}; # prints 'Curiouser and curiouser' + + + # Subclassing works, too. + package Mint::Snuff; + use base qw(Altoids); + + my Mint::Snuff $pouch = Mint::Snuff->new; + $pouch->strong('Blow your head off!'); + print $pouch->{strong}; # prints 'Blow your head off!' + + +Here's a simple example of altering the behavior of your accessors. + + package Foo; + use base qw(Class::Accessor); + Foo->mk_accessor(qw(this that up down)); + + sub get { + my $self = shift; + + # Note every time someone gets some data. + print STDERR "Getting @_\n"; + + $self->SUPER::get(@_); + } + + sub set { + my ($self, $key) = splice(@_, 0, 2); + + # Note every time someone sets some data. + print STDERR "Setting $key to @_\n"; + + $self->SUPER::set($key, @_); + } + + +=head1 CAVEATS AND TRICKS + +Class::Accessor has to do some internal wackiness to get its +job done quickly and efficiently. Because of this, there's a few +tricks and traps one must know about. + +Hey, nothing's perfect. + +=head2 Don't make a field called DESTROY + +This is bad. Since DESTROY is a magical method it would be bad for us +to define an accessor using that name. Class::Accessor will +carp if you try to use it with a field named "DESTROY". + +=head2 Overriding autogenerated accessors + +You may want to override the autogenerated accessor with your own, yet +have your custom accessor call the default one. For instance, maybe +you want to have an accessor which checks its input. Normally, one +would expect this to work: + + package Foo; + use base qw(Class::Accessor); + Foo->mk_accessors(qw(email this that whatever)); + + # Only accept addresses which look valid. + sub email { + my($self) = shift; + my($email) = @_; + + if( @_ ) { # Setting + require Email::Valid; + unless( Email::Valid->address($email) ) { + carp("$email doesn't look like a valid address."); + return; + } + } + + return $self->SUPER::email(@_); + } + +There's a subtle problem in the last example, and its in this line: + + return $self->SUPER::email(@_); + +If we look at how Foo was defined, it called mk_accessors() which +stuck email() right into Foo's namespace. There *is* no +SUPER::email() to delegate to! Two ways around this... first is to +make a "pure" base class for Foo. This pure class will generate the +accessors and provide the necessary super class for Foo to use: + + package Pure::Organic::Foo; + use base qw(Class::Accessor); + Pure::Organic::Foo->mk_accessors(qw(email this that whatever)); + + package Foo; + use base qw(Pure::Organic::Foo); + +And now Foo::email() can override the generated +Pure::Organic::Foo::email() and use it as SUPER::email(). + +This is probably the most obvious solution to everyone but me. +Instead, what first made sense to me was for mk_accessors() to define +an alias of email(), _email_accessor(). Using this solution, +Foo::email() would be written with: + + return $self->_email_accessor(@_); + +instead of the expected SUPER::email(). + + +=head1 AUTHORS + +Copyright 2007 Marty Pauley + +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. That means either (a) the GNU General Public +License or (b) the Artistic License. + +=head2 ORIGINAL AUTHOR + +Michael G Schwern + +=head2 THANKS + +Liz and RUZ for performance tweaks. + +Tels, for his big feature request/bug report. + + +=head1 SEE ALSO + +L + +These are some modules which do similar things in different ways +L, L, L, +L, L + +L for an example of this module in use. + +=cut + +1; diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Fast.pm b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Fast.pm new file mode 100644 index 0000000..6522923 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Fast.pm @@ -0,0 +1,94 @@ +package Class::Accessor::Fast; +use base 'Class::Accessor'; +use strict; +$Class::Accessor::Fast::VERSION = '0.31'; + +=head1 NAME + +Class::Accessor::Fast - Faster, but less expandable, accessors + +=head1 SYNOPSIS + + package Foo; + use base qw(Class::Accessor::Fast); + + # The rest is the same as Class::Accessor but without set() and get(). + +=head1 DESCRIPTION + +This is a faster but less expandable version of Class::Accessor. +Class::Accessor's generated accessors require two method calls to accompish +their task (one for the accessor, another for get() or set()). +Class::Accessor::Fast eliminates calling set()/get() and does the access itself, +resulting in a somewhat faster accessor. + +The downside is that you can't easily alter the behavior of your +accessors, nor can your subclasses. Of course, should you need this +later, you can always swap out Class::Accessor::Fast for +Class::Accessor. + +Read the documentation for Class::Accessor for more info. + +=cut + +sub make_accessor { + my($class, $field) = @_; + + return sub { + return $_[0]->{$field} if @_ == 1; + return $_[0]->{$field} = $_[1] if @_ == 2; + return (shift)->{$field} = \@_; + }; +} + + +sub make_ro_accessor { + my($class, $field) = @_; + + return sub { + return $_[0]->{$field} if @_ == 1; + my $caller = caller; + $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'"); + }; +} + + +sub make_wo_accessor { + my($class, $field) = @_; + + return sub { + if (@_ == 1) { + my $caller = caller; + $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'"); + } + else { + return $_[0]->{$field} = $_[1] if @_ == 2; + return (shift)->{$field} = \@_; + } + }; +} + + +=head1 EFFICIENCY + +L for an efficiency comparison. + +=head1 AUTHORS + +Copyright 2007 Marty Pauley + +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. That means either (a) the GNU General Public +License or (b) the Artistic License. + +=head2 ORIGINAL AUTHOR + +Michael G Schwern + +=head1 SEE ALSO + +L + +=cut + +1; diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Faster.pm b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Faster.pm new file mode 100644 index 0000000..8f81ff9 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/lib/Class/Accessor/Faster.pm @@ -0,0 +1,105 @@ +package Class::Accessor::Faster; +use base 'Class::Accessor'; +use strict; +$Class::Accessor::Faster::VERSION = '0.31'; + +=head1 NAME + +Class::Accessor::Faster - Even faster, but less expandable, accessors + +=head1 SYNOPSIS + + package Foo; + use base qw(Class::Accessor::Faster); + +=head1 DESCRIPTION + +This is a faster but less expandable version of Class::Accessor::Fast. + +Class::Accessor's generated accessors require two method calls to accompish +their task (one for the accessor, another for get() or set()). + +Class::Accessor::Fast eliminates calling set()/get() and does the access itself, +resulting in a somewhat faster accessor. + +Class::Accessor::Faster uses an array reference underneath to be faster. + +Read the documentation for Class::Accessor for more info. + +=cut + +my %slot; +sub _slot { + my($class, $field) = @_; + my $n = $slot{$class}->{$field}; + return $n if defined $n; + $n = keys %{$slot{$class}}; + $slot{$class}->{$field} = $n; + return $n; +} + +sub new { + my($proto, $fields) = @_; + my($class) = ref $proto || $proto; + my $self = bless [], $class; + + $fields = {} unless defined $fields; + for my $k (keys %$fields) { + my $n = $class->_slot($k); + $self->[$n] = $fields->{$k}; + } + return $self; +} + +sub make_accessor { + my($class, $field) = @_; + my $n = $class->_slot($field); + return sub { + return $_[0]->[$n] if @_ == 1; + return $_[0]->[$n] = $_[1] if @_ == 2; + return (shift)->[$n] = \@_; + }; +} + + +sub make_ro_accessor { + my($class, $field) = @_; + my $n = $class->_slot($field); + return sub { + return $_[0]->[$n] if @_ == 1; + my $caller = caller; + $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'"); + }; +} + + +sub make_wo_accessor { + my($class, $field) = @_; + my $n = $class->_slot($field); + return sub { + if (@_ == 1) { + my $caller = caller; + $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'"); + } else { + return $_[0]->[$n] = $_[1] if @_ == 2; + return (shift)->[$n] = \@_; + } + }; +} + + +=head1 AUTHORS + +Copyright 2007 Marty Pauley + +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. That means either (a) the GNU General Public +License or (b) the Artistic License. + +=head1 SEE ALSO + +L + +=cut + +1; diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/accessors.t b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/accessors.t new file mode 100644 index 0000000..aee6f6a --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/accessors.t @@ -0,0 +1,74 @@ +#!perl +use strict; +use Test::More tests => 42; + +for my $class (qw(Class::Accessor Class::Accessor::Fast Class::Accessor::Faster)) { + require_ok($class); + my $silly = "Silly::$class"; + { + no strict 'refs'; + @{"${silly}::ISA"} = ($class); + *{"${silly}::car"} = sub { shift->_car_accessor(@_); }; + *{"${silly}::mar"} = sub { return "Overloaded"; }; + $silly->mk_accessors(qw( foo bar yar car mar )); + $silly->mk_ro_accessors(qw(static unchanged)); + $silly->mk_wo_accessors(qw(sekret double_sekret)); + } + + my $test = $silly->new({ + static => "variable", + unchanged => "dynamic", + }); + + $test->foo(42); + $test->bar('Meep'); + + is($test->foo, 42, "foo accessor"); + is($test->{foo}, 42, "foo hash element") unless $class eq 'Class::Accessor::Faster'; + + is($test->static, 'variable', 'ro accessor'); + eval { $test->static('foo'); }; + like(scalar $@, + qr/^'main' cannot alter the value of 'static' on objects of class '$silly'/, + 'ro accessor write protection'); + + $test->double_sekret(1001001); + is( $test->{double_sekret}, 1001001, 'wo accessor') unless $class eq 'Class::Accessor::Faster'; + eval { () = $test->double_sekret; }; + like(scalar $@, + qr/^'main' cannot access the value of 'double_sekret' on objects of class '$silly'/, + 'wo accessor read protection' ); + + is($test->_foo_accessor, 42, 'accessor alias'); + + $test->car("AMC Javalin"); + is($test->car, 'AMC Javalin', 'internal override access'); + is($test->mar, 'Overloaded', 'internal override constant'); + + # Make sure bogus accessors die. + eval { $test->gargle() }; + ok($@, 'bad accessor'); + + # Test that the accessor works properly in list context with a single arg. + my $test2 = $silly->new; + my @args = ($test2->foo, $test2->bar); + is(@args, 2, 'accessor get in list context'); + + # test array setters + $test->foo(qw(1 2 3)); + is_deeply($test->foo, [qw(1 2 3)], "set an array ref via foo accessor"); + + $test->sekret(qw(1 2 3)); + is_deeply($test->{'sekret'}, [qw(1 2 3)], "array ref") + unless $class eq 'Class::Accessor::Faster'; + + { + my $eeek; + local $SIG{__WARN__} = sub { $eeek = shift }; + $silly->mk_accessors(qw(DESTROY)); + like($eeek, + qr/a data accessor named DESTROY/i, + 'mk DESTROY accessor warning'); + }; + +} diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/aliases.t b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/aliases.t new file mode 100644 index 0000000..8c45471 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/aliases.t @@ -0,0 +1,39 @@ +#!perl +use strict; +use Test::More tests => 36; + +for my $class (qw(Class::Accessor Class::Accessor::Fast Class::Accessor::Faster)) { + require_ok($class); + my $silly = "Silly::$class"; + { + no strict 'refs'; + @{"${silly}::ISA"} = ($class); + *{"${silly}::accessor_name_for"} = sub { "read_$_[1]" }; + *{"${silly}::mutator_name_for"} = sub { "write_$_[1]" }; + $silly->mk_accessors(qw( foo )); + $silly->mk_ro_accessors(qw(roro)); + $silly->mk_wo_accessors(qw(wowo)); + } + + for my $f (qw/foo roro /) { + ok $silly->can("read_$f"), "'read_$f' method exists"; + } + + for my $f (qw/foo wowo/) { + ok $silly->can("write_$f"), "'write_$f' method exists"; + } + + for my $f (qw/foo roro wowo write_roro read_wowo/) { + ok !$silly->can($f), "no '$f' method"; + } + + my $test = $silly->new({ + foo => "bar", + roro => "boat", + wowo => "huh", + }); + + is($test->read_foo, "bar", "initial foo"); + $test->write_foo("stuff"); + is($test->read_foo, "stuff", "new foo"); +} diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/bestpractice.t b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/bestpractice.t new file mode 100644 index 0000000..01e83ff --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/bestpractice.t @@ -0,0 +1,38 @@ +#!perl +use strict; +use Test::More tests => 36; + +for my $class (qw(Class::Accessor Class::Accessor::Fast Class::Accessor::Faster)) { + require_ok($class); + my $silly = "Silly::$class"; + { + no strict 'refs'; + @{"${silly}::ISA"} = ($class); + $silly->follow_best_practice; + $silly->mk_accessors(qw( foo )); + $silly->mk_ro_accessors(qw(roro)); + $silly->mk_wo_accessors(qw(wowo)); + } + + for my $f (qw/foo roro /) { + ok $silly->can("get_$f"), "'get_$f' method exists"; + } + + for my $f (qw/foo wowo/) { + ok $silly->can("set_$f"), "'set_$f' method exists"; + } + + for my $f (qw/foo roro wowo set_roro get_wowo/) { + ok !$silly->can($f), "no '$f' method"; + } + + my $test = $silly->new({ + foo => "bar", + roro => "boat", + wowo => "huh", + }); + + is($test->get_foo, "bar", "initial foo"); + $test->set_foo("stuff"); + is($test->get_foo, "stuff", "new foo"); +} diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/croak.t b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/croak.t new file mode 100644 index 0000000..86f62fa --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/croak.t @@ -0,0 +1,24 @@ +use strict; +use Test::More tests => 2; +require Class::Accessor::Fast; + +@Frog::ISA = ('Class::Accessor::Fast'); +my $croaked = 0; +sub Frog::_croak { ++$croaked } +Frog->mk_ro_accessors('test_ro'); +Frog->mk_wo_accessors('test_wo'); + +my $frog = Frog->new; + +eval { + $croaked = 0; + $frog->test_ro("foo"); + is $croaked, 1, "we croaked for ro"; + + $croaked = 0; + $frog->test_wo; + is $croaked, 1, "we croaked for wo"; +}; + +fail "We really croaked: $@" if $@; + diff --git a/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/getset.t b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/getset.t new file mode 100644 index 0000000..11a6f42 --- /dev/null +++ b/dev/i386/libclass-accessor-perl/libclass-accessor-perl-0.31/t/getset.t @@ -0,0 +1,14 @@ +#!perl +use strict; +use Test::More tests => 3; + +require_ok("Class::Accessor"); + +@Foo::ISA = qw(Class::Accessor); +Foo->mk_accessors(qw( foo )); + +my $test = Foo->new({ foo => 49 }); + +is $test->get('foo'), 49, "get initial foo"; +$test->set('foo', 42); +is $test->get('foo'), 42, "get new foo"; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Changes b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Changes new file mode 100644 index 0000000..b7cc19d --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Changes @@ -0,0 +1,132 @@ +CHANGES +------- + + 2.012 15 July 2008 + + * Document the gzip flags that WindowBits can take. + + * Allow a dictionary to be used with a raw inflate. + Needs zlib 1.2.2.1 or better. + [RT #36046] + + 2.011 5 May 2008 + + * A C++-style comment sneaked in with the last update. Fixed. + [core patch #33828] + + 2.010 5 May 2008 + + * No Changes + + 2.009 20 April 2008 + + * No Changes + + 2.008 2 November 2007 + + * Minor documentation changes in README + + 2.006 1 September 2007 + + * Makefile.PL + Added INSTALLDIRS directive to install as a core module when built + on a perl >= 5.9. + + 2.005 18 June 2007 + + * Only include ppport.h when not being built with perl. + [core patch #30655] + + 2.004 3 March 2007 + + * Fixed lvalue substr issue + + * Remove redundant code from Zlib.xs + + 2.003 2 January 2007 + + * Added explicit version checking + + 2.002 29 December 2006 + + * Documentation updates. + + 2.001 1 November 2006 + + * Remove beta status. + + 2.000_14 26 October 2006 + + * Fixed memory leak on realloc. + + * Ticket #18986 says that ExtUtils::Install 1.39 fixes the in-use + issue on win32/cygwin, so make the code that checks whether trying + to install via the cpan shell conditional on the version of + ExtUtils::Install. + http://rt.cpan.org/Ticket/Display.html?id=18986 + + 2.000_10 13 March 2006 + + * Fixed a potential NULL pointer dereference problem in + Compress::Raw::Zlib::resetLastBlockByte. + Issue highlighted by David Dyck and reproduced by Marcus Holland-Moritz. + + 2.000_09 3 March 2006 + + * Released onto CPAN + + * Documentation updates. + + 2.000_08 2 March 2006 + + * Moved the IO::* modules out into their own distributions. + + * Breakout zlib specific code into separate modules. + + * Limited support for reading/writing zip files added. + + 2.000_06 5 October 2005 + + * Added eof parameter to Compress::Zlib::inflate method. + + * Fixed issue with 64-bit + + 2.000_05 4 October 2005 + + * Renamed IO::* to IO::Compress::* & IO::Uncompress::* + + 2.000_04 23 September 2005 + + * Fixed some more non-portable test that were failing on VMS. + + * fixed problem where error messages in the oneshot interface were + getting lost. + + 2.000_03 12 September 2005 + + * Fixed some non-portable test that were failing on VMS. + + * Fixed export of zlib constants from the IO::* classes + + 2.000_02 6 September 2005 + + * Split Append mode into Append and Merge + + * Fixed typos in the documentation. + + * Added pod/FAQ.pod + + * Added libscan to Makefile.PL + + * Added InputLength for IO::Gunzip et al + + 2.000_01 22 August 2005 + + * Fixed VERSION in Compress::Gzip::Constants + + * Removed Compress::Gzip::Info from the distribution. + + 2.000_00 21 August 2005 + + * First Beta relase of Compress::zlib rewrite. + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/MANIFEST b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/MANIFEST new file mode 100644 index 0000000..d006ead --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/MANIFEST @@ -0,0 +1,47 @@ +README +Changes +t/000prereq.t +t/01version.t +t/02zlib.t +t/07bufsize.t +t/18lvalue.t +t/99pod.t +t/Test/Builder.pm +t/Test/More.pm +t/Test/Simple.pm +t/compress/CompTestUtils.pm +Zlib.xs +typemap +Makefile.PL +private/MakeUtil.pm +MANIFEST +ppport.h +config.in +zlib-src/adler32.c +zlib-src/compress.c +zlib-src/crc32.c +zlib-src/crc32.h +zlib-src/deflate.c +zlib-src/deflate.h +zlib-src/infback.c +zlib-src/inffast.c +zlib-src/inffast.h +zlib-src/inffixed.h +zlib-src/inflate.c +zlib-src/inflate.h +zlib-src/inftrees.c +zlib-src/inftrees.h +zlib-src/trees.c +zlib-src/trees.h +zlib-src/uncompr.c +zlib-src/zconf.h +zlib-src/zlib.h +zlib-src/zutil.c +zlib-src/zutil.h +fallback/constants.h +fallback/constants.xs +lib/Compress/Raw/Zlib.pm +examples/filtdef Perl +examples/filtinf Perl +pod/FAQ.pod +META.yml Module meta-data (added by MakeMaker) diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/META.yml b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/META.yml new file mode 100644 index 0000000..740cca2 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/META.yml @@ -0,0 +1,13 @@ +--- #YAML:1.0 +name: Compress-Raw-Zlib +version: 2.012 +abstract: Low-Level Interface to zlib compression library +license: perl +author: + - Paul Marquess +generated_by: ExtUtils::MakeMaker version 6.44 +distribution_type: module +requires: +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.3.html + version: 1.3 diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Makefile.PL b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Makefile.PL new file mode 100644 index 0000000..72a7b89 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Makefile.PL @@ -0,0 +1,399 @@ +#! perl -w + +use strict ; +require 5.004 ; + +use private::MakeUtil; +use ExtUtils::MakeMaker 5.16 ; +use ExtUtils::Install (); # only needed to check for version + +my $ZLIB_LIB ; +my $ZLIB_INCLUDE ; +my $BUILD_ZLIB = 0 ; +my $OLD_ZLIB = '' ; +my $WALL = '' ; +my $GZIP_OS_CODE = -1 ; +my $USE_PPPORT_H = ($ENV{PERL_CORE}) ? '' : '-DUSE_PPPORT_H'; + +#$WALL = ' -pedantic ' if $Config{'cc'} =~ /gcc/ ; +#$WALL = ' -Wall -Wno-comment ' if $Config{'cc'} =~ /gcc/ ; + +# Ticket #18986 says that ExtUtils::Install 1.39 fixes the in-use issue +# on win32/cygwin, so make the code below conditional on the version of +# ExtUtils::Install. + +# Don't ask if MM_USE_DEFAULT is set -- enables perl core building on cygwin +if ($^O =~ /cygwin/i and $ExtUtils::Install::VERSION < 1.39 + and not ($ENV{PERL_MM_USE_DEFAULT} or $ENV{PERL_CORE})) +{ + print < ; + + if ($answer =~ /^yes|y/i) + { + print "continuing...\n" + } + else + { + print "exiting...\n" ; + exit 1 ; + } + + +} + +ParseCONFIG() ; + +UpDowngrade(getPerlFiles('MANIFEST')) + unless $ENV{PERL_CORE}; + +WriteMakefile( + NAME => 'Compress::Raw::Zlib', + VERSION_FROM => 'lib/Compress/Raw/Zlib.pm', + INC => "-I$ZLIB_INCLUDE" , + DEFINE => "$OLD_ZLIB $WALL -DGZIP_OS_CODE=$GZIP_OS_CODE $USE_PPPORT_H" , + XS => { 'Zlib.xs' => 'Zlib.c'}, + 'depend' => { 'Makefile' => 'config.in' }, + 'clean' => { FILES => '*.c constants.h constants.xs' }, + 'dist' => { COMPRESS => 'gzip', + TARFLAGS => '-chvf', + SUFFIX => 'gz', + DIST_DEFAULT => 'MyTrebleCheck tardist', + }, + + ( + $ENV{SKIP_FOR_CORE} + ? (MAN3PODS => {}) + : () + ), + + ( + $BUILD_ZLIB + ? zlib_files($ZLIB_LIB) + : (LIBS => [ "-L$ZLIB_LIB -lz " ]) + ), + + ( + $] >= 5.005 + ? (ABSTRACT_FROM => 'lib/Compress/Raw/Zlib.pm', + AUTHOR => 'Paul Marquess ') + : () + ), + + INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'), + + ((ExtUtils::MakeMaker->VERSION() gt '6.30') ? + ('LICENSE' => 'perl') : ()), + +) ; + +my @names = qw( + + DEF_WBITS + MAX_MEM_LEVEL + MAX_WBITS + OS_CODE + + Z_ASCII + Z_BEST_COMPRESSION + Z_BEST_SPEED + Z_BINARY + Z_BLOCK + Z_BUF_ERROR + Z_DATA_ERROR + Z_DEFAULT_COMPRESSION + Z_DEFAULT_STRATEGY + Z_DEFLATED + Z_ERRNO + Z_FILTERED + Z_FINISH + Z_FIXED + Z_FULL_FLUSH + Z_HUFFMAN_ONLY + Z_MEM_ERROR + Z_NEED_DICT + Z_NO_COMPRESSION + Z_NO_FLUSH + Z_NULL + Z_OK + Z_PARTIAL_FLUSH + Z_RLE + Z_STREAM_END + Z_STREAM_ERROR + Z_SYNC_FLUSH + Z_UNKNOWN + Z_VERSION_ERROR + +); + #ZLIB_VERNUM + +if (eval {require ExtUtils::Constant; 1}) { + # Check the constants above all appear in @EXPORT in Zlib.pm + my %names = map { $_, 1} @names, 'ZLIB_VERSION'; + open F, ") + { + last if /^\s*\@EXPORT\s+=\s+qw\(/ ; + } + + while () + { + last if /^\s*\)/ ; + /(\S+)/ ; + delete $names{$1} if defined $1 ; + } + close F ; + + if ( keys %names ) + { + my $missing = join ("\n\t", sort keys %names) ; + die "The following names are missing from \@EXPORT in Zlib.pm\n" . + "\t$missing\n" ; + } + + push @names, {name => 'ZLIB_VERSION', type => 'PV' }; + + ExtUtils::Constant::WriteConstants( + NAME => 'Zlib', + NAMES => \@names, + C_FILE => 'constants.h', + XS_FILE => 'constants.xs', + + ); +} +else { + foreach my $name (qw( constants.h constants.xs )) + { + my $from = catfile('fallback', $name); + copy ($from, $name) + or die "Can't copy $from to $name: $!"; + } +} + +sub ParseCONFIG +{ + my ($k, $v) ; + my @badkey = () ; + my %Info = () ; + my @Options = qw( INCLUDE LIB BUILD_ZLIB OLD_ZLIB GZIP_OS_CODE ) ; + my %ValidOption = map {$_, 1} @Options ; + my %Parsed = %ValidOption ; + my $CONFIG = 'config.in' ; + + print "Parsing $CONFIG...\n" ; + + open(F, "<$CONFIG") or die "Cannot open file $CONFIG: $!\n" ; + while () { + s/^\s*|\s*$//g ; + next if /^\s*$/ or /^\s*#/ ; + s/\s*#\s*$// ; + + ($k, $v) = split(/\s+=\s+/, $_, 2) ; + $k = uc $k ; + if ($ValidOption{$k}) { + delete $Parsed{$k} ; + $Info{$k} = $v ; + } + else { + push(@badkey, $k) ; + } + } + close F ; + + print "Unknown keys in $CONFIG ignored [@badkey]\n" + if @badkey ; + + # check parsed values + my @missing = () ; + die "The following keys are missing from $CONFIG [@missing]\n" + if @missing = keys %Parsed ; + + $ZLIB_INCLUDE = $ENV{'ZLIB_INCLUDE'} || $Info{'INCLUDE'} ; + $ZLIB_LIB = $ENV{'ZLIB_LIB'} || $Info{'LIB'} ; + + if ($^O eq 'VMS') { + $ZLIB_INCLUDE = VMS::Filespec::vmspath($ZLIB_INCLUDE); + $ZLIB_LIB = VMS::Filespec::vmspath($ZLIB_LIB); + } + + my $y = $ENV{'OLD_ZLIB'} || $Info{'OLD_ZLIB'} ; + $OLD_ZLIB = '-DOLD_ZLIB' if $y and $y =~ /^yes|on|true|1$/i; + + my $x = $ENV{'BUILD_ZLIB'} || $Info{'BUILD_ZLIB'} ; + + if ($x and $x =~ /^yes|on|true|1$/i ) { + + $BUILD_ZLIB = 1 ; + + # ZLIB_LIB & ZLIB_INCLUDE must point to the same place when + # BUILD_ZLIB is specified. + die "INCLUDE & LIB must be the same when BUILD_ZLIB is True\n" + if $ZLIB_LIB ne $ZLIB_INCLUDE ; + + # Check the zlib source directory exists + die "LIB/INCLUDE directory '$ZLIB_LIB' does not exits\n" + unless -d $ZLIB_LIB ; + + # check for a well known file + die "LIB/INCLUDE directory, '$ZLIB_LIB', doesn't seem to have the zlib source files\n" + unless -e catfile($ZLIB_LIB, 'zlib.h') ; + + + # write the Makefile + print "Building Zlib enabled\n" ; + } + + $GZIP_OS_CODE = defined $ENV{'GZIP_OS_CODE'} + ? $ENV{'GZIP_OS_CODE'} + : $Info{'GZIP_OS_CODE'} ; + + die "GZIP_OS_CODE not 'AUTO_DETECT' or a number between 0 and 255\n" + unless uc $GZIP_OS_CODE eq 'AUTO_DETECT' + || ( $GZIP_OS_CODE =~ /^(\d+)$/ && $1 >= 0 && $1 <= 255) ; + + if (uc $GZIP_OS_CODE eq 'AUTO_DETECT') + { + print "Auto Detect Gzip OS Code..\n" ; + $GZIP_OS_CODE = getOSCode() ; + } + + my $name = getOSname($GZIP_OS_CODE); + print "Setting Gzip OS Code to $GZIP_OS_CODE [$name]\n" ; + + print < [ @h_files ], + 'C' => [ @c_files ] , + #'OBJECT' => qq[ @o_files ], + 'OBJECT' => q[ $(O_FILES) ], + + + ) ; +} + + + +use vars qw ( @GZIP_OS_Names %OSnames) ; + +BEGIN +{ + @GZIP_OS_Names = ( + [ '' => 0, 'MS-DOS' ], + [ 'amigaos' => 1, 'Amiga' ], + [ 'VMS' => 2, 'VMS' ], + [ '' => 3, 'Unix/Default' ], + [ '' => 4, 'VM/CMS' ], + [ '' => 5, 'Atari TOS' ], + [ 'os2' => 6, 'HPFS (OS/2, NT)' ], + [ 'MacOS' => 7, 'Macintosh' ], + [ '' => 8, 'Z-System' ], + [ '' => 9, 'CP/M' ], + [ '' => 10, 'TOPS-20' ], + [ '' => 11, 'NTFS (NT)' ], + [ '' => 12, 'SMS QDOS' ], + [ '' => 13, 'Acorn RISCOS' ], + [ 'MSWin32' => 14, 'VFAT file system (Win95, NT)' ], + [ '' => 15, 'MVS' ], + [ 'beos' => 16, 'BeOS' ], + [ '' => 17, 'Tandem/NSK' ], + [ '' => 18, 'THEOS' ], + [ '' => 255, 'Unknown OS' ], + ); + + %OSnames = map { $$_[1] => $$_[2] } + @GZIP_OS_Names ; +} + +sub getOSCode +{ + my $default = 3 ; # Unix is the default + + my $uname = $^O; + + for my $h (@GZIP_OS_Names) + { + my ($pattern, $code, $name) = @$h; + + return $code + if $pattern && $uname eq $pattern ; + } + + return $default ; +} + +sub getOSname +{ + my $code = shift ; + + return $OSnames{$code} || 'Unknown OS' ; +} + +# end of file Makefile.PL + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/README b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/README new file mode 100644 index 0000000..42d2d6b --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/README @@ -0,0 +1,348 @@ + + Compress-Raw-Zlib + + Version 2.012 + + 15th July 2008 + + Copyright (c) 2005-2008 Paul Marquess. All rights reserved. + This program is free software; you can redistribute it + and/or modify it under the same terms as Perl itself. + + The directory zlib-src contains a subset of the + source files copied directly from zlib version 1.2.3. + These files are Copyright(C) 1995-2005 + Jean-loup Gailly and Mark Adler. + Full source for the zlib library is available at + http://www.zlib.org + +DESCRIPTION +----------- + +This module provides a Perl interface to the zlib compression library. + +PREREQUISITES +------------- + +Before you can build Compress-Raw-Zlib you need to have the following +installed on your system: + + * A C compiler + + * Perl 5.004 or better. + +By default, Compress-Raw-Zlib will build its own private copy of the +zlib library. If you want to use a different version of +zlib, follow the instructions in the section called +"Controlling the version of zlib used by Compress-Raw-Zlib" +later in this document. + +BUILDING THE MODULE +------------------- + +Assuming you have met all the prerequisites, the module can now be built +using this sequence of commands: + + perl Makefile.PL + make + make test + +INSTALLATION +------------ + +To install Compress-Raw-Zlib, run the command below: + + make install + +Controlling the version of zlib used by Compress-Raw-Zlib +---------------------------------------------------------- + +Compress-Raw-Zlib interfaces to the zlib compression library. There +are three options available to control which version/instance of the +zlib library is used: + + 1. Build a private copy of the zlib library using the + zlib library source that is included with this module. + This is the default and recommended option. + + 2. Build a private copy of the zlib library using a standard + zlib source distribution. + + 3. Use a pre-built zlib library. + +Note that if you intend to use either Option 2 or 3, you need to have +zlib version 1.0.5 or better. + +The contents of the file config.in are used to control which of the +three options is actually used. This file is read during the + + perl Makefile.PL + +step of the build, so remember to make any required changes to config.in +before building this module. + + Option 1 + -------- + + For option 1, edit the file config.in and set the variables in it + as follows: + + BUILD_ZLIB = True + INCLUDE = ./zlib-src + LIB = ./zlib-src + OLD_ZLIB = False + GZIP_OS_CODE = AUTO_DETECT + + + Option 2 + -------- + + For option 2, fetch a copy of the zlib source distribution from + http://www.zlib.org and unpack it into the Compress-Raw-Zlib source + directory. Assuming you have fetched zlib 1.2.3, + it will create a directory called zlib-1.2.3. + + Now set the variables in the file config.in as follows (if the version + you have fetched isn't 1.2.3, change the INCLUDE and LIB + variables appropriately): + + BUILD_ZLIB = True + INCLUDE = ./zlib-1.2.3 + LIB = ./zlib-1.2.3 + OLD_ZLIB = False + GZIP_OS_CODE = AUTO_DETECT + + + Option 3 + -------- + + For option 3, you need to find out where zlib is stored on your + system. There are two parts to this. + + First, find the directory where the zlib library is stored (some + common names for the library are libz.a and libz.so). Set the LIB variable + in the config.in file to that directory. + + Secondly, find the directory where the file zlib.h is stored. Now set + the INCLUDE variable in the config.in file to that directory. + + Next set BUILD_ZLIB to False. + + Finally, if you are running zlib 1.0.5 or older, set the OLD_ZLIB + variable to True. Otherwise set it to False. + + As an example, if the zlib library on your system is in + /usr/local/lib, zlib.h is in /usr/local/include and zlib is more + recent than version 1.0.5, the variables in config.in should be set as + follows: + + BUILD_ZLIB = False + INCLUDE = /usr/local/include + LIB = /usr/local/lib + OLD_ZLIB = False + GZIP_OS_CODE = AUTO_DETECT + + +Setting the Gzip OS Code +------------------------ + +Every gzip stream stores a byte in its header to identify the Operating +System that was used to create the gzip stream. When you build Compress-Raw-Zlib it will attempt to determine the value that is correct for +your Operating System. This will then be used by IO::Compress::Gzip as the +default value for the OS byte in all gzip headers it creates. + +The variable GZIP_OS_CODE in the config.in file controls the setting of +this value when building Compress-Raw-Zlib. If GZIP_OS_CODE is set to +AUTO_DETECT, Compress-Raw-Zlib will attempt to determine the correct value for +your Operating System. + +Alternatively, you can override auto-detection of the default OS code and +explicitly set it yourself. Set the GZIP_OS_CODE variable in the config.in +file to be a number between 0 and 255. For example + + GZIP_OS_CODE = 3 + +See RFC 1952 for valid OS codes that can be used. + +If you are running one of the less popular Operating Systems, it is +possible that the default value picked by this module is incorrect or the +default value (3) is used when there is a better value available. When +Compress-Raw-Zlib cannot determine what operating system you are running, it +will use the default value 3 for the OS code. + +If you find you have to change this value, because you think the value auto +detected is incorrect, please take a few moments to contact the author of +this module. + +TROUBLESHOOTING +--------------- + +Solaris build fails with "language optional software package not installed" +--------------------------------------------------------------------------- + +If you are trying to build this module under Solaris and you get an +error message like this + + /usr/ucb/cc: language optional software package not installed + +it means that Perl cannot find the C compiler on your system. The cryptic +message is just Sun's way of telling you that you haven't bought their +C compiler. + +When you build a Perl module that needs a C compiler, the Perl build +system tries to use the same C compiler that was used to build perl +itself. In this case your Perl binary was built with a C compiler that +lived in /usr/ucb. + +To continue with building this module, you need to get a C compiler, +or tell Perl where your C compiler is, if you already have one. + +Assuming you have now got a C compiler, what you do next will be dependent +on what C compiler you have installed. If you have just installed Sun's +C compiler, you shouldn't have to do anything. Just try rebuilding +this module. + +If you have installed another C compiler, say gcc, you have to tell perl +how to use it instead of /usr/ucb/cc. + +This set of options seems to work if you want to use gcc. Your mileage +may vary. + + perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " + make test + +If that doesn't work for you, it's time to make changes to the Makefile +by hand. Good luck! + +Solaris build fails with "gcc: unrecognized option `-KPIC'" +----------------------------------------------------------- + +You are running Solaris and you get an error like this when you try to +build this Perl module + + gcc: unrecognized option `-KPIC' + +This symptom usually means that you are using a Perl binary that has been +built with the Sun C compiler, but you are using gcc to build this module. + +When Perl builds modules that need a C compiler, it will attempt to use +the same C compiler and command line options that was used to build perl +itself. In this case "-KPIC" is a valid option for the Sun C compiler, +but not for gcc. The equivalent option for gcc is "-fPIC". + +The solution is either: + + 1. Build both Perl and this module with the same C compiler, either + by using the Sun C compiler for both or gcc for both. + + 2. Try generating the Makefile for this module like this perl + + perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " LD=gcc + make test + + This second option seems to work when mixing a Perl binary built + with the Sun C compiler and this module built with gcc. Your + mileage may vary. + +HP-UX Notes +----------- + +I've had a report that when building Compress-Raw-Zlib under HP-UX that it +is necessary to have first built the zlib library with the -fpic +option. + +Linux Notes +----------- + +Although most Linux distributions already come with zlib, some +people report getting this error when they try to build this module: + +$ make +cp Zlib.pm blib/lib/Compress/Zlib.pm +AutoSplitting blib/lib/Compress/Zlib.pm (blib/lib/auto/Compress/Zlib) +/usr/bin/perl -I/usr/lib/perl5/5.6.1/i386-linux -I/usr/lib/perl5/5.6.1 /usr/lib/perl5/5.6.1/ExtUtils/xsubpp -typemap /usr/lib/perl5/5.6.1/ExtUtils/typemap -typemap typemap Zlib.xs > Zlib.xsc && mv Zlib.xsc Zlib.c +gcc -c -I/usr/local/include -fno-strict-aliasing -I/usr/local/include -O2 -march=i386 -mcpu=i686 -DVERSION=\"1.16\" -DXS_VERSION=\"1.16\" -fPIC -I/usr/lib/perl5/5.6.1/i386-linux/CORE Zlib.c +Zlib.xs:25:19: zlib.h: No such file or directory +make: *** [Zlib.o] Error 1 + +This usually means that you have not installed the development RPM +for zlib. Check for an RPM that start with "zlib-devel" in your Linux +distribution. + +Win32 Notes +----------- + +If you are running Activestate Perl (from http://www.activestate.com), +it ships with a pre-compiled version of Compress-Raw-Zlib. To check if a +newer version of Compress-Raw-Zlib is available run this from the command +prompt + + C:\> ppm verify -upgrade Compress-Zlib + +If you are not running Activestate Perl and you don't have access +to a C compiler, you will not be able to build and install this module. + +Win32 & Cygwin Notes +-------------------- + +It is not possible to install Compress-Raw-Zlib using the CPAN shell. +This is because the Compress-Raw-Zlib DLL is itself used by the CPAN shell +and it is impossible to remove a DLL while it is already loaded under +Windows. + +The workaround is to install Compress-Raw-Zlib manually using the +instructions given at the start of this file. + +FEEDBACK +-------- + +How to report a problem with Compress-Raw-Zlib. + +To help me help you, I need all of the following information: + + 1. The Versions of everything relevant. + This includes: + + a. The *complete* output from running this + + perl -V + + Do not edit the output in any way. + Note, I want you to run "perl -V" and NOT "perl -v". + + If your perl does not understand the "-V" option it is too + old. This module needs Perl version 5.004 or better. + + b. The version of Compress-Raw-Zlib you have. + If you have successfully installed Compress-Raw-Zlib, this one-liner + will tell you: + + perl -MCompress::Raw::Zlib -e 'print qq[ver $Compress::Raw::Zlib::VERSION\n]' + + If you are running windows use this + + perl -MCompress::Raw::Zlib -e "print qq[ver $Compress::Raw::Zlib::VERSION\n]" + + If you haven't installed Compress-Raw-Zlib then search Compress::Raw::Zlib.pm + for a line like this: + + $VERSION = "2.012" ; + + c. The version of zlib you have used. + If you have successfully installed Compress-Raw-Zlib, this one-liner + will tell you: + + perl -MCompress::Raw::Zlib -e "print q[zlib ver ]. Compress::Raw::Zlib::ZLIB_VERSION.qq[\n]" + + If not, look at the beginning of the file zlib.h. + + 2. If you are having problems building Compress-Raw-Zlib, send me a + complete log of what happened. Start by unpacking the Compress-Raw-Zlib + module into a fresh directory and keep a log of all the steps + + [edit config.in, if necessary] + perl Makefile.PL + make + make test TEST_VERBOSE=1 + +Paul Marquess diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Zlib.xs b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Zlib.xs new file mode 100644 index 0000000..cd366f1 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/Zlib.xs @@ -0,0 +1,1898 @@ +/* Filename: Zlib.xs + * Author : Paul Marquess, + * Created : 22nd January 1996 + * Version : 2.000 + * + * Copyright (c) 1995-2007 Paul Marquess. All rights reserved. + * This program is free software; you can redistribute it and/or + * modify it under the same terms as Perl itself. + * + */ + +/* Parts of this code are based on the files gzio.c and gzappend.c from + * the standard zlib source distribution. Below are the copyright statements + * from each. + */ + +/* gzio.c -- IO on .gz files + * Copyright (C) 1995 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* gzappend -- command to append to a gzip file + + Copyright (C) 2003 Mark Adler, all rights reserved + version 1.1, 4 Nov 2003 +*/ + + + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include + +/* zlib prior to 1.06 doesn't know about z_off_t */ +#ifndef z_off_t +# define z_off_t long +#endif + +#if ! defined(ZLIB_VERNUM) || ZLIB_VERNUM < 0x1200 +# define NEED_DUMMY_BYTE_AT_END +#endif + +#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1210 +# define MAGIC_APPEND +#endif + +#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1221 +# define AT_LEAST_ZLIB_1_2_2_1 +#endif + +#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1222 +# define AT_LEAST_ZLIB_1_2_2_2 +#endif + +#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1223 +# define AT_LEAST_ZLIB_1_2_2_3 +#endif + +#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1230 +# define AT_LEAST_ZLIB_1_2_3 +#endif + +#ifdef USE_PPPORT_H +# define NEED_sv_2pvbyte +# define NEED_sv_2pv_nolen +# include "ppport.h" +#endif + +#if PERL_REVISION == 5 && PERL_VERSION == 9 + /* For Andreas */ +# define sv_pvbyte_force(sv,lp) sv_pvbyten_force(sv,lp) +#endif + +#if PERL_REVISION == 5 && (PERL_VERSION < 8 || (PERL_VERSION == 8 && PERL_SUBVERSION < 4 )) + +# ifdef SvPVbyte_force +# undef SvPVbyte_force +# endif + +# define SvPVbyte_force(sv,lp) SvPV_force(sv,lp) + +#endif + +#ifndef SvPVbyte_nolen +# define SvPVbyte_nolen SvPV_nolen +#endif + + + +#if 0 +# ifndef SvPVbyte_nolen +# define SvPVbyte_nolen SvPV_nolen +# endif + +# ifndef SvPVbyte_force +# define SvPVbyte_force(sv,lp) SvPV_force(sv,lp) +# endif +#endif + +#if PERL_REVISION == 5 && (PERL_VERSION >= 8 || (PERL_VERSION == 8 && PERL_SUBVERSION < 4 )) +# define UTF8_AVAILABLE +#endif + +typedef int DualType ; +typedef int int_undef ; + +typedef struct di_stream { + int flags ; +#define FLAG_APPEND 1 +#define FLAG_CRC32 2 +#define FLAG_ADLER32 4 +#define FLAG_CONSUME_INPUT 8 + uLong crc32 ; + uLong adler32 ; + z_stream stream; + uLong bufsize; + SV * dictionary ; + uLong dict_adler ; + int last_error ; + bool zip_mode ; +#define SETP_BYTE +#ifdef SETP_BYTE + bool deflateParams_out_valid ; + Bytef deflateParams_out_byte; +#else +#define deflateParams_BUFFER_SIZE 0x4000 + uLong deflateParams_out_length; + Bytef* deflateParams_out_buffer; +#endif + int Level; + int Method; + int WindowBits; + int MemLevel; + int Strategy; + uLong bytesInflated ; + uLong compressedBytes ; + uLong uncompressedBytes ; +#ifdef MAGIC_APPEND + +#define WINDOW_SIZE 32768U + + bool matchedEndBlock; + Bytef* window ; + int window_lastbit, window_left, window_full; + unsigned window_have; + off_t window_lastoff, window_end; + off_t window_endOffset; + + uLong lastBlockOffset ; + unsigned char window_lastByte ; + + +#endif +} di_stream; + +typedef di_stream * deflateStream ; +typedef di_stream * Compress__Raw__Zlib__deflateStream ; +typedef di_stream * inflateStream ; +typedef di_stream * Compress__Raw__Zlib__inflateStream ; +typedef di_stream * Compress__Raw__Zlib__inflateScanStream ; + +#define ZMALLOC(to, typ) ((to = (typ *)safemalloc(sizeof(typ))), \ + Zero(to,1,typ)) + +/* Figure out the Operating System */ +#ifdef MSDOS +# define OS_CODE 0x00 +#endif + +#if defined(AMIGA) || defined(AMIGAOS) +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +#endif + +#if 0 /* VM/CMS */ +# define OS_CODE 0x04 +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +#endif + +#if 0 /* Z-System */ +# define OS_CODE 0x08 +#endif + +#if 0 /* CP/M */ +# define OS_CODE 0x09 +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 /* Window 95 & Windows NT */ +# define OS_CODE 0x0b +#endif + +#if 0 /* QDOS */ +# define OS_CODE 0x0c +#endif + +#if 0 /* Acorn RISCOS */ +# define OS_CODE 0x0d +#endif + +#if 0 /* ??? */ +# define OS_CODE 0x0e +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0F +#endif + +/* Default to UNIX */ +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef GZIP_OS_CODE +# define GZIP_OS_CODE OS_CODE +#endif + +#define adlerInitial adler32(0L, Z_NULL, 0) +#define crcInitial crc32(0L, Z_NULL, 0) + +/* static const char * const my_z_errmsg[] = { */ +static const char my_z_errmsg[][32] = { + "need dictionary", /* Z_NEED_DICT 2 */ + "stream end", /* Z_STREAM_END 1 */ + "", /* Z_OK 0 */ + "file error", /* Z_ERRNO (-1) */ + "stream error", /* Z_STREAM_ERROR (-2) */ + "data error", /* Z_DATA_ERROR (-3) */ + "insufficient memory", /* Z_MEM_ERROR (-4) */ + "buffer error", /* Z_BUF_ERROR (-5) */ + "incompatible version",/* Z_VERSION_ERROR(-6) */ + ""}; + +#define setDUALstatus(var, err) \ + sv_setnv(var, (double)err) ; \ + sv_setpv(var, ((err) ? GetErrorString(err) : "")) ; \ + SvNOK_on(var); + + +#if defined(__SYMBIAN32__) +# define NO_WRITEABLE_DATA +#endif + +#define TRACE_DEFAULT 0 + +#ifdef NO_WRITEABLE_DATA +# define trace TRACE_DEFAULT +#else + static int trace = TRACE_DEFAULT ; +#endif + +/* Dodge PerlIO hiding of these functions. */ +#undef printf + +static char * +#ifdef CAN_PROTOTYPE +GetErrorString(int error_no) +#else +GetErrorString(error_no) +int error_no ; +#endif +{ + dTHX; + char * errstr ; + + if (error_no == Z_ERRNO) { + errstr = Strerror(errno) ; + } + else + /* errstr = gzerror(fil, &error_no) ; */ + errstr = (char*) my_z_errmsg[2 - error_no]; + + return errstr ; +} + + +#ifdef MAGIC_APPEND + +/* + The following two functions are taken almost directly from + examples/gzappend.c. Only cosmetic changes have been made to conform to + the coding style of the rest of the code in this file. +*/ + + +/* return the greatest common divisor of a and b using Euclid's algorithm, + modified to be fast when one argument much greater than the other, and + coded to avoid unnecessary swapping */ +static unsigned +#ifdef CAN_PROTOTYPE +gcd(unsigned a, unsigned b) +#else +gcd(a, b) + unsigned a; + unsigned b; +#endif +{ + unsigned c; + + while (a && b) + if (a > b) { + c = b; + while (a - c >= c) + c <<= 1; + a -= c; + } + else { + c = a; + while (b - c >= c) + c <<= 1; + b -= c; + } + return a + b; +} + +/* rotate list[0..len-1] left by rot positions, in place */ +static void +#ifdef CAN_PROTOTYPE +rotate(unsigned char *list, unsigned len, unsigned rot) +#else +rotate(list, len, rot) + unsigned char *list; + unsigned len ; + unsigned rot; +#endif +{ + unsigned char tmp; + unsigned cycles; + unsigned char *start, *last, *to, *from; + + /* normalize rot and handle degenerate cases */ + if (len < 2) return; + if (rot >= len) rot %= len; + if (rot == 0) return; + + /* pointer to last entry in list */ + last = list + (len - 1); + + /* do simple left shift by one */ + if (rot == 1) { + tmp = *list; + memcpy(list, list + 1, len - 1); + *last = tmp; + return; + } + + /* do simple right shift by one */ + if (rot == len - 1) { + tmp = *last; + memmove(list + 1, list, len - 1); + *list = tmp; + return; + } + + /* otherwise do rotate as a set of cycles in place */ + cycles = gcd(len, rot); /* number of cycles */ + do { + start = from = list + cycles; /* start index is arbitrary */ + tmp = *from; /* save entry to be overwritten */ + for (;;) { + to = from; /* next step in cycle */ + from += rot; /* go right rot positions */ + if (from > last) from -= len; /* (pointer better not wrap) */ + if (from == start) break; /* all but one shifted */ + *to = *from; /* shift left */ + } + *to = tmp; /* complete the circle */ + } while (--cycles); +} + +#endif /* MAGIC_APPEND */ + +static void +#ifdef CAN_PROTOTYPE +DispHex(void * ptr, int length) +#else +DispHex(ptr, length) + void * ptr; + int length; +#endif +{ + char * p = (char*)ptr; + int i; + for (i = 0; i < length; ++i) { + printf(" %02x", 0xFF & *(p+i)); + } +} + + +static void +#ifdef CAN_PROTOTYPE +DispStream(di_stream * s, char * message) +#else +DispStream(s, message) + di_stream * s; + char * message; +#endif +{ + +#if 0 + if (! trace) + return ; +#endif + +#define EnDis(f) (s->flags & f ? "Enabled" : "Disabled") + + printf("DispStream 0x%p", s) ; + if (message) + printf("- %s \n", message) ; + printf("\n") ; + + if (!s) { + printf(" stream pointer is NULL\n"); + } + else { + printf(" stream 0x%p\n", &(s->stream)); + printf(" zalloc 0x%p\n", s->stream.zalloc); + printf(" zfree 0x%p\n", s->stream.zfree); + printf(" opaque 0x%p\n", s->stream.opaque); + if (s->stream.msg) + printf(" msg %s\n", s->stream.msg); + else + printf(" msg \n"); + printf(" next_in 0x%p", s->stream.next_in); + if (s->stream.next_in){ + printf(" =>"); + DispHex(s->stream.next_in, 4); + } + printf("\n"); + + printf(" next_out 0x%p", s->stream.next_out); + if (s->stream.next_out){ + printf(" =>"); + DispHex(s->stream.next_out, 4); + } + printf("\n"); + + printf(" avail_in %lu\n", (unsigned long)s->stream.avail_in); + printf(" avail_out %lu\n", (unsigned long)s->stream.avail_out); + printf(" total_in %ld\n", s->stream.total_in); + printf(" total_out %ld\n", s->stream.total_out); + printf(" adler %ld\n", s->stream.adler ); + printf(" bufsize %ld\n", s->bufsize); + printf(" dictionary 0x%p\n", s->dictionary); + printf(" dict_adler 0x%ld\n",s->dict_adler); + printf(" zip_mode %d\n", s->zip_mode); + printf(" crc32 0x%x\n", (unsigned)s->crc32); + printf(" adler32 0x%x\n", (unsigned)s->adler32); + printf(" flags 0x%x\n", s->flags); + printf(" APPEND %s\n", EnDis(FLAG_APPEND)); + printf(" CRC32 %s\n", EnDis(FLAG_CRC32)); + printf(" ADLER32 %s\n", EnDis(FLAG_ADLER32)); + printf(" CONSUME %s\n", EnDis(FLAG_CONSUME_INPUT)); + +#ifdef MAGIC_APPEND + printf(" window 0x%p\n", s->window); +#endif + printf("\n"); + + } +} + +static di_stream * +#ifdef CAN_PROTOTYPE +InitStream(void) +#else +InitStream() +#endif +{ + di_stream *s ; + + ZMALLOC(s, di_stream) ; + + return s ; + +} + +static void +#ifdef CAN_PROTOTYPE +PostInitStream(di_stream * s, int flags, int bufsize, int windowBits) +#else +PostInitStream(s, flags, bufsize, windowBits) + di_stream *s ; + int flags ; + int bufsize ; + int windowBits ; +#endif +{ + s->bufsize = bufsize ; + s->compressedBytes = + s->uncompressedBytes = + s->last_error = 0 ; + s->flags = flags ; + s->zip_mode = (windowBits < 0) ; + if (flags & FLAG_CRC32) + s->crc32 = crcInitial ; + if (flags & FLAG_ADLER32) + s->adler32 = adlerInitial ; +} + + +static SV* +#ifdef CAN_PROTOTYPE +deRef(SV * sv, const char * string) +#else +deRef(sv, string) +SV * sv ; +char * string; +#endif +{ + dTHX; + SvGETMAGIC(sv); + + if (SvROK(sv)) { + sv = SvRV(sv) ; + SvGETMAGIC(sv); + switch(SvTYPE(sv)) { + case SVt_PVAV: + case SVt_PVHV: + case SVt_PVCV: + croak("%s: buffer parameter is not a SCALAR reference", string); + } + if (SvROK(sv)) + croak("%s: buffer parameter is a reference to a reference", string) ; + } + + if (!SvOK(sv)) { + sv = newSVpv("", 0); + } + + return sv ; +} + +static SV* +#ifdef CAN_PROTOTYPE +deRef_l(SV * sv, const char * string) +#else +deRef_l(sv, string) +SV * sv ; +char * string ; +#endif +{ + dTHX; + bool wipe = 0 ; + + SvGETMAGIC(sv); + wipe = ! SvOK(sv) ; + + if (SvROK(sv)) { + sv = SvRV(sv) ; + SvGETMAGIC(sv); + wipe = ! SvOK(sv) ; + + switch(SvTYPE(sv)) { + case SVt_PVAV: + case SVt_PVHV: + case SVt_PVCV: + croak("%s: buffer parameter is not a SCALAR reference", string); + } + if (SvROK(sv)) + croak("%s: buffer parameter is a reference to a reference", string) ; + } + + if (SvREADONLY(sv) && PL_curcop != &PL_compiling) + croak("%s: buffer parameter is read-only", string); + + SvUPGRADE(sv, SVt_PV); + + if (wipe) + SvCUR_set(sv, 0); + + SvOOK_off(sv); + SvPOK_only(sv); + + return sv ; +} + + +#include "constants.h" + +MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib PREFIX = Zip_ + +REQUIRE: 1.924 +PROTOTYPES: DISABLE + +INCLUDE: constants.xs + +BOOT: + /* Check this version of zlib is == 1 */ + if (zlibVersion()[0] != '1') + croak("Compress::Raw::Zlib needs zlib version 1.x\n") ; + + { + /* Create the $os_code scalar */ + SV * os_code_sv = perl_get_sv("Compress::Raw::Zlib::gzip_os_code", GV_ADDMULTI) ; + sv_setiv(os_code_sv, GZIP_OS_CODE) ; + } + + +#define Zip_zlib_version() (const char*)zlib_version +const char* +Zip_zlib_version() + +unsigned +ZLIB_VERNUM() + CODE: +#ifdef ZLIB_VERNUM + RETVAL = ZLIB_VERNUM ; +#else + /* 1.1.4 => 0x1140 */ + RETVAL = (ZLIB_VERSION[0] - '0') << 12 ; + RETVAL += (ZLIB_VERSION[2] - '0') << 8 ; + RETVAL += (ZLIB_VERSION[4] - '0') << 4 ; +#endif + OUTPUT: + RETVAL + +MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib PREFIX = Zip_ + +#define Zip_adler32(buf, adler) adler32(adler, buf, (uInt)len) + +uLong +Zip_adler32(buf, adler=adlerInitial) + uLong adler = NO_INIT + STRLEN len = NO_INIT + Bytef * buf = NO_INIT + SV * sv = ST(0) ; + INIT: + /* If the buffer is a reference, dereference it */ + sv = deRef(sv, "adler32") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(sv) && !sv_utf8_downgrade(sv, 1)) + croak("Wide character in Compress::Raw::Zlib::adler32"); +#endif + buf = (Byte*)SvPVbyte(sv, len) ; + + if (items < 2) + adler = adlerInitial; + else if (SvOK(ST(1))) + adler = SvUV(ST(1)) ; + else + adler = adlerInitial; + OUTPUT: + RETVAL + +#define Zip_crc32(buf, crc) crc32(crc, buf, (uInt)len) + +uLong +Zip_crc32(buf, crc=crcInitial) + uLong crc = NO_INIT + STRLEN len = NO_INIT + Bytef * buf = NO_INIT + SV * sv = ST(0) ; + INIT: + /* If the buffer is a reference, dereference it */ + sv = deRef(sv, "crc32") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(sv) && !sv_utf8_downgrade(sv, 1)) + croak("Wide character in Compress::Raw::Zlib::crc32"); +#endif + buf = (Byte*)SvPVbyte(sv, len) ; + + if (items < 2) + crc = crcInitial; + else if (SvOK(ST(1))) + crc = SvUV(ST(1)) ; + else + crc = crcInitial; + + +uLong +crc32_combine(crc1, crc2, len2) + uLong crc1 + uLong crc2 + z_off_t len2 + CODE: +#ifndef AT_LEAST_ZLIB_1_2_2_1 + crc1 = crc1; crc2 = crc2 ; len2 = len2; /* Silence -Wall */ + croak("crc32_combine needs zlib 1.2.3 or better"); +#else + RETVAL = crc32_combine(crc1, crc2, len2); +#endif + OUTPUT: + RETVAL + + +uLong +adler32_combine(adler1, adler2, len2) + uLong adler1 + uLong adler2 + z_off_t len2 + CODE: +#ifndef AT_LEAST_ZLIB_1_2_2_1 + adler1 = adler1; adler2 = adler2 ; len2 = len2; /* Silence -Wall */ + croak("adler32_combine needs zlib 1.2.3 or better"); +#else + RETVAL = adler32_combine(adler1, adler2, len2); +#endif + OUTPUT: + RETVAL + + +MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib + +void +_deflateInit(flags,level, method, windowBits, memLevel, strategy, bufsize, dictionary) + int flags + int level + int method + int windowBits + int memLevel + int strategy + uLong bufsize + SV* dictionary + PPCODE: + int err ; + deflateStream s ; + + if (trace) + warn("in _deflateInit(level=%d, method=%d, windowBits=%d, memLevel=%d, strategy=%d, bufsize=%ld dictionary=%p)\n", + level, method, windowBits, memLevel, strategy, bufsize, dictionary) ; + if ((s = InitStream() )) { + + s->Level = level; + s->Method = method; + s->WindowBits = windowBits; + s->MemLevel = memLevel; + s->Strategy = strategy; + + err = deflateInit2(&(s->stream), level, + method, windowBits, memLevel, strategy); + + /* Check if a dictionary has been specified */ + + if (err == Z_OK && SvCUR(dictionary)) { +#ifdef UTF8_AVAILABLE + if (DO_UTF8(dictionary) && !sv_utf8_downgrade(dictionary, 1)) + croak("Wide character in Compress::Raw::Zlib::Deflate::new dicrionary parameter"); +#endif + err = deflateSetDictionary(&(s->stream), (const Bytef*) SvPVbyte_nolen(dictionary), + SvCUR(dictionary)) ; + s->dict_adler = s->stream.adler ; + } + + if (err != Z_OK) { + Safefree(s) ; + s = NULL ; + } + else + PostInitStream(s, flags, bufsize, windowBits) ; + + } + else + err = Z_MEM_ERROR ; + + { + SV* obj = sv_setref_pv(sv_newmortal(), + "Compress::Raw::Zlib::deflateStream", (void*)s); + XPUSHs(obj); + } + if (GIMME == G_ARRAY) { + SV * sv = sv_2mortal(newSViv(err)) ; + setDUALstatus(sv, err); + XPUSHs(sv) ; + } + +void +_inflateInit(flags, windowBits, bufsize, dictionary) + int flags + int windowBits + uLong bufsize + SV * dictionary + ALIAS: + _inflateScanInit = 1 + PPCODE: + + int err = Z_OK ; + inflateStream s ; +#ifndef MAGIC_APPEND + if (ix == 1) + croak("inflateScanInit needs zlib 1.2.1 or better"); +#endif + if (trace) + warn("in _inflateInit(windowBits=%d, bufsize=%lu, dictionary=%lu\n", + windowBits, bufsize, (unsigned long)SvCUR(dictionary)) ; + if ((s = InitStream() )) { + + s->WindowBits = windowBits; + + err = inflateInit2(&(s->stream), windowBits); + if (err != Z_OK) { + Safefree(s) ; + s = NULL ; + } + else if (SvCUR(dictionary)) { +#ifdef AT_LEAST_ZLIB_1_2_2_1 + /* Zlib 1.2.2.1 or better allows a dictionary with raw inflate */ + if (s->WindowBits < 0) { + err = inflateSetDictionary(&(s->stream), + (const Bytef*)SvPVbyte_nolen(dictionary), + SvCUR(dictionary)); + if (err != Z_OK) { + Safefree(s) ; + s = NULL ; + } + } + else +#endif + /* Dictionary specified - take a copy for use in inflate */ + s->dictionary = newSVsv(dictionary) ; + } + if (s) { + PostInitStream(s, flags, bufsize, windowBits) ; +#ifdef MAGIC_APPEND + if (ix == 1) + { + s->window = (unsigned char *)safemalloc(WINDOW_SIZE); + } +#endif + } + } + else + err = Z_MEM_ERROR ; + + { + SV* obj = sv_setref_pv(sv_newmortal(), + ix == 1 + ? "Compress::Raw::Zlib::inflateScanStream" + : "Compress::Raw::Zlib::inflateStream", + (void*)s); + XPUSHs(obj); + } + if (GIMME == G_ARRAY) { + SV * sv = sv_2mortal(newSViv(err)) ; + setDUALstatus(sv, err); + XPUSHs(sv) ; + } + + + +MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib::deflateStream + +void +DispStream(s, message=NULL) + Compress::Raw::Zlib::deflateStream s + char * message + +DualType +deflateReset(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = deflateReset(&(s->stream)) ; + if (RETVAL == Z_OK) { + PostInitStream(s, s->flags, s->bufsize, s->WindowBits) ; + } + OUTPUT: + RETVAL + +DualType +deflate (s, buf, output) + Compress::Raw::Zlib::deflateStream s + SV * buf + SV * output + uInt cur_length = NO_INIT + uInt increment = NO_INIT + uInt prefix = NO_INIT + int RETVAL = 0; + uLong bufinc = NO_INIT + CODE: + bufinc = s->bufsize; + + /* If the input buffer is a reference, dereference it */ + buf = deRef(buf, "deflate") ; + + /* initialise the input buffer */ +#ifdef UTF8_AVAILABLE + if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1)) + croak("Wide character in Compress::Raw::Zlib::Deflate::deflate input parameter"); +#endif + s->stream.next_in = (Bytef*)SvPVbyte_nolen(buf) ; + s->stream.avail_in = SvCUR(buf) ; + + if (s->flags & FLAG_CRC32) + s->crc32 = crc32(s->crc32, s->stream.next_in, s->stream.avail_in) ; + + if (s->flags & FLAG_ADLER32) + s->adler32 = adler32(s->adler32, s->stream.next_in, s->stream.avail_in) ; + + /* and retrieve the output buffer */ + output = deRef_l(output, "deflate") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1)) + croak("Wide character in Compress::Raw::Zlib::Deflate::deflate output parameter"); +#endif + + if((s->flags & FLAG_APPEND) != FLAG_APPEND) { + SvCUR_set(output, 0); + /* sv_setpvn(output, "", 0); */ + } + prefix = cur_length = SvCUR(output) ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length; + increment = SvLEN(output) - cur_length; + s->stream.avail_out = increment; +#ifdef SETP_BYTE + /* Check for saved output from deflateParams */ + if (s->deflateParams_out_valid) { + *(s->stream.next_out) = s->deflateParams_out_byte; + ++ s->stream.next_out; + -- s->stream.avail_out ; + s->deflateParams_out_valid = FALSE; + } +#else + /* Check for saved output from deflateParams */ + if (s->deflateParams_out_length) { + uLong plen = s->deflateParams_out_length ; + /* printf("Copy %d bytes saved data\n", plen);*/ + if (s->stream.avail_out < plen) { + /*printf("GROW from %d to %d\n", s->stream.avail_out, + SvLEN(output) + plen - s->stream.avail_out); */ + Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ; + } + + Copy(s->stream.next_out, s->deflateParams_out_buffer, plen, Bytef) ; + cur_length = cur_length + plen; + SvCUR_set(output, cur_length); + s->stream.next_out += plen ; + s->stream.avail_out = SvLEN(output) - cur_length ; + increment = s->stream.avail_out; + s->deflateParams_out_length = 0; + } +#endif + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + /* out of space in the output buffer so make it bigger */ + Sv_Grow(output, SvLEN(output) + bufinc) ; + cur_length += increment ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length ; + increment = bufinc ; + s->stream.avail_out = increment; + bufinc *= 2 ; + } + + RETVAL = deflate(&(s->stream), Z_NO_FLUSH); + if (RETVAL != Z_OK) + break; + } + + s->compressedBytes += cur_length + increment - prefix - s->stream.avail_out ; + s->uncompressedBytes += SvCUR(buf) - s->stream.avail_in ; + + s->last_error = RETVAL ; + if (RETVAL == Z_OK) { + SvPOK_only(output); + SvCUR_set(output, cur_length + increment - s->stream.avail_out) ; + SvSETMAGIC(output); + } + OUTPUT: + RETVAL + + +void +DESTROY(s) + Compress::Raw::Zlib::deflateStream s + CODE: + deflateEnd(&s->stream) ; + if (s->dictionary) + SvREFCNT_dec(s->dictionary) ; +#ifndef SETP_BYTE + if (s->deflateParams_out_buffer) + Safefree(s->deflateParams_out_buffer); +#endif + Safefree(s) ; + + +DualType +flush(s, output, f=Z_FINISH) + Compress::Raw::Zlib::deflateStream s + SV * output + int f + uInt cur_length = NO_INIT + uInt increment = NO_INIT + uInt prefix = NO_INIT + uLong bufinc = NO_INIT + CODE: + bufinc = s->bufsize; + + s->stream.avail_in = 0; /* should be zero already anyway */ + + /* retrieve the output buffer */ + output = deRef_l(output, "flush") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1)) + croak("Wide character in Compress::Raw::Zlib::Deflate::flush input parameter"); +#endif + if(! s->flags & FLAG_APPEND) { + SvCUR_set(output, 0); + /* sv_setpvn(output, "", 0); */ + } + prefix = cur_length = SvCUR(output) ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length; + increment = SvLEN(output) - cur_length; + s->stream.avail_out = increment; +#ifdef SETP_BYTE + /* Check for saved output from deflateParams */ + if (s->deflateParams_out_valid) { + *(s->stream.next_out) = s->deflateParams_out_byte; + ++ s->stream.next_out; + -- s->stream.avail_out ; + s->deflateParams_out_valid = FALSE; + } +#else + /* Check for saved output from deflateParams */ + if (s->deflateParams_out_length) { + uLong plen = s->deflateParams_out_length ; + /* printf("Copy %d bytes saved data\n", plen); */ + if (s->stream.avail_out < plen) { + /* printf("GROW from %d to %d\n", s->stream.avail_out, + SvLEN(output) + plen - s->stream.avail_out); */ + Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ; + } + + Copy(s->stream.next_out, s->deflateParams_out_buffer, plen, Bytef) ; + cur_length = cur_length + plen; + SvCUR_set(output, cur_length); + s->stream.next_out += plen ; + s->stream.avail_out = SvLEN(output) - cur_length ; + increment = s->stream.avail_out; + s->deflateParams_out_length = 0; + } +#endif + + for (;;) { + if (s->stream.avail_out == 0) { + /* consumed all the available output, so extend it */ + Sv_Grow(output, SvLEN(output) + bufinc) ; + cur_length += increment ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length ; + increment = bufinc ; + s->stream.avail_out = increment; + bufinc *= 2 ; + } + RETVAL = deflate(&(s->stream), f); + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + if (s->stream.avail_out != 0 || RETVAL != Z_OK ) + break; + } + + RETVAL = (RETVAL == Z_STREAM_END ? Z_OK : RETVAL) ; + s->last_error = RETVAL ; + + s->compressedBytes += cur_length + increment - prefix - s->stream.avail_out ; + + if (RETVAL == Z_OK) { + SvPOK_only(output); + SvCUR_set(output, cur_length + increment - s->stream.avail_out) ; + SvSETMAGIC(output); + } + OUTPUT: + RETVAL + + +DualType +_deflateParams(s, flags, level, strategy, bufsize) + Compress::Raw::Zlib::deflateStream s + int flags + int level + int strategy + uLong bufsize + CODE: + /* printf("_deflateParams(Flags %d Level %d Strategy %d Bufsize %d)\n", flags, level, strategy, bufsize); + printf("Before -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize); */ + if (flags & 1) + s->Level = level ; + if (flags & 2) + s->Strategy = strategy ; + if (flags & 4) { + s->bufsize = bufsize; + } + /* printf("After -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize);*/ +#ifdef SETP_BYTE + s->stream.avail_in = 0; + s->stream.next_out = &(s->deflateParams_out_byte) ; + s->stream.avail_out = 1; + RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy); + s->deflateParams_out_valid = + (RETVAL == Z_OK && s->stream.avail_out == 0) ; + /* printf("RETVAL %d, avail out %d, byte %c\n", RETVAL, s->stream.avail_out, s->deflateParams_out_byte); */ +#else + /* printf("Level %d Strategy %d, Prev Len %d\n", + s->Level, s->Strategy, s->deflateParams_out_length); */ + s->stream.avail_in = 0; + if (s->deflateParams_out_buffer == NULL) + s->deflateParams_out_buffer = safemalloc(deflateParams_BUFFER_SIZE); + s->stream.next_out = s->deflateParams_out_buffer ; + s->stream.avail_out = deflateParams_BUFFER_SIZE; + + RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy); + s->deflateParams_out_length = deflateParams_BUFFER_SIZE - s->stream.avail_out; + /* printf("RETVAL %d, length out %d, avail %d\n", + RETVAL, s->deflateParams_out_length, s->stream.avail_out ); */ +#endif + OUTPUT: + RETVAL + + +int +get_Level(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->Level ; + OUTPUT: + RETVAL + +int +get_Strategy(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->Strategy ; + OUTPUT: + RETVAL + + +uLong +get_Bufsize(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->bufsize ; + OUTPUT: + RETVAL + + +int +status(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->last_error ; + OUTPUT: + RETVAL + +uLong +crc32(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->crc32 ; + OUTPUT: + RETVAL + +uLong +dict_adler(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->dict_adler ; + OUTPUT: + RETVAL + +uLong +adler32(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->adler32 ; + OUTPUT: + RETVAL + +uLong +compressedBytes(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->compressedBytes; + OUTPUT: + RETVAL + +uLong +uncompressedBytes(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->uncompressedBytes; + OUTPUT: + RETVAL + +uLong +total_in(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->stream.total_in ; + OUTPUT: + RETVAL + +uLong +total_out(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->stream.total_out ; + OUTPUT: + RETVAL + +char* +msg(s) + Compress::Raw::Zlib::deflateStream s + CODE: + RETVAL = s->stream.msg; + OUTPUT: + RETVAL + +int +deflateTune(s, good_length, max_lazy, nice_length, max_chain) + Compress::Raw::Zlib::deflateStream s + int good_length + int max_lazy + int nice_length + int max_chain + CODE: +#ifndef AT_LEAST_ZLIB_1_2_2_3 + good_length = good_length; max_lazy = max_lazy ; /* Silence -Wall */ + nice_length = nice_length; max_chain = max_chain; /* Silence -Wall */ + croak("deflateTune needs zlib 1.2.2.3 or better"); +#else + RETVAL = deflateTune(&(s->stream), good_length, max_lazy, nice_length, max_chain); +#endif + OUTPUT: + RETVAL + + +MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib::inflateStream + +void +DispStream(s, message=NULL) + Compress::Raw::Zlib::inflateStream s + char * message + +DualType +inflateReset(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = inflateReset(&(s->stream)) ; + if (RETVAL == Z_OK) { + PostInitStream(s, s->flags, s->bufsize, s->WindowBits) ; + } + OUTPUT: + RETVAL + +DualType +inflate (s, buf, output, eof=FALSE) + Compress::Raw::Zlib::inflateStream s + SV * buf + SV * output + bool eof + uInt cur_length = 0; + uInt prefix_length = 0; + uInt increment = 0; + STRLEN stmp = NO_INIT + uLong bufinc = NO_INIT + PREINIT: +#ifdef UTF8_AVAILABLE + bool out_utf8 = FALSE; +#endif + CODE: + bufinc = s->bufsize; + /* If the buffer is a reference, dereference it */ + buf = deRef(buf, "inflate") ; + + if (s->flags & FLAG_CONSUME_INPUT && SvREADONLY(buf)) + croak("Compress::Raw::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified"); +#ifdef UTF8_AVAILABLE + if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1)) + croak("Wide character in Compress::Raw::Zlib::Inflate::inflate input parameter"); +#endif + + /* initialise the input buffer */ + s->stream.next_in = (Bytef*)SvPVbyte_force(buf, stmp) ; + s->stream.avail_in = SvCUR(buf) ; + + /* and retrieve the output buffer */ + output = deRef_l(output, "inflate") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(output)) + out_utf8 = TRUE ; + if (DO_UTF8(output) && !sv_utf8_downgrade(output, 1)) + croak("Wide character in Compress::Raw::Zlib::Inflate::inflate output parameter"); +#endif + if((s->flags & FLAG_APPEND) != FLAG_APPEND) { + SvCUR_set(output, 0); + } + if (SvLEN(output)) { + prefix_length = cur_length = SvCUR(output) ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length; + increment = SvLEN(output) - cur_length - 1; + s->stream.avail_out = increment; + } + else { + s->stream.avail_out = 0; + } + s->bytesInflated = 0; + + RETVAL = Z_OK; + + while (RETVAL == Z_OK) { + if (s->stream.avail_out == 0 ) { + /* out of space in the output buffer so make it bigger */ + Sv_Grow(output, SvLEN(output) + bufinc) ; + cur_length += increment ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length ; + increment = bufinc ; + s->stream.avail_out = increment; + bufinc *= 2 ; + } + + RETVAL = inflate(&(s->stream), Z_SYNC_FLUSH); + + if (RETVAL == Z_STREAM_ERROR || RETVAL == Z_MEM_ERROR || + RETVAL == Z_DATA_ERROR || RETVAL == Z_STREAM_END ) + break ; + + if (RETVAL == Z_BUF_ERROR) { + if (s->stream.avail_out == 0) + continue ; + if (s->stream.avail_in == 0) { + RETVAL = Z_OK ; + break ; + } + } + + if (RETVAL == Z_NEED_DICT && s->dictionary) { + s->dict_adler = s->stream.adler ; + RETVAL = inflateSetDictionary(&(s->stream), + (const Bytef*)SvPVbyte_nolen(s->dictionary), + SvCUR(s->dictionary)); + } + + } +#ifdef NEED_DUMMY_BYTE_AT_END + if (eof && RETVAL == Z_OK) { + Bytef* nextIn = s->stream.next_in; + uInt availIn = s->stream.avail_in; + s->stream.next_in = (Bytef*) " "; + s->stream.avail_in = 1; + if (s->stream.avail_out == 0) { + /* out of space in the output buffer so make it bigger */ + Sv_Grow(output, SvLEN(output) + bufinc) ; + cur_length += increment ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length ; + increment = bufinc ; + s->stream.avail_out = increment; + bufinc *= 2 ; + } + RETVAL = inflate(&(s->stream), Z_SYNC_FLUSH); + s->stream.next_in = nextIn ; + s->stream.avail_in = availIn ; + } +#endif + + s->last_error = RETVAL ; + if (RETVAL == Z_OK || RETVAL == Z_STREAM_END || RETVAL == Z_DATA_ERROR) { + unsigned in ; + + s->bytesInflated = cur_length + increment - s->stream.avail_out - prefix_length; + s->uncompressedBytes += s->bytesInflated ; + s->compressedBytes += SvCUR(buf) - s->stream.avail_in ; + + SvPOK_only(output); + SvCUR_set(output, prefix_length + s->bytesInflated) ; + *SvEND(output) = '\0'; +#ifdef UTF8_AVAILABLE + if (out_utf8) + sv_utf8_upgrade(output); +#endif + SvSETMAGIC(output); + + if (s->flags & FLAG_CRC32 ) + s->crc32 = crc32(s->crc32, + (const Bytef*)SvPVbyte_nolen(output)+prefix_length, + SvCUR(output)-prefix_length) ; + + if (s->flags & FLAG_ADLER32) + s->adler32 = adler32(s->adler32, + (const Bytef*)SvPVbyte_nolen(output)+prefix_length, + SvCUR(output)-prefix_length) ; + + /* fix the input buffer */ + if (s->flags & FLAG_CONSUME_INPUT) { + in = s->stream.avail_in ; + SvCUR_set(buf, in) ; + if (in) + Move(s->stream.next_in, SvPVbyte_nolen(buf), in, char) ; + *SvEND(buf) = '\0'; + SvSETMAGIC(buf); + } + } + OUTPUT: + RETVAL + +uLong +inflateCount(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->bytesInflated; + OUTPUT: + RETVAL + +uLong +compressedBytes(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->compressedBytes; + OUTPUT: + RETVAL + +uLong +uncompressedBytes(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->uncompressedBytes; + OUTPUT: + RETVAL + + +DualType +inflateSync (s, buf) + Compress::Raw::Zlib::inflateStream s + SV * buf + CODE: + + /* If the buffer is a reference, dereference it */ + buf = deRef(buf, "inflateSync") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1)) + croak("Wide character in Compress::Raw::Zlib::Inflate::inflateSync"); +#endif + + /* initialise the input buffer */ + s->stream.next_in = (Bytef*)SvPVbyte_nolen(buf) ; + s->stream.avail_in = SvCUR(buf) ; + + /* inflateSync doesn't create any output */ + s->stream.next_out = (Bytef*) NULL; + s->stream.avail_out = 0; + + RETVAL = inflateSync(&(s->stream)); + s->last_error = RETVAL ; + + /* fix the input buffer */ + { + unsigned in = s->stream.avail_in ; + SvCUR_set(buf, in) ; + if (in) + Move(s->stream.next_in, SvPVbyte_nolen(buf), in, char) ; + *SvEND(buf) = '\0'; + SvSETMAGIC(buf); + } + OUTPUT: + RETVAL + +void +DESTROY(s) + Compress::Raw::Zlib::inflateStream s + CODE: + inflateEnd(&s->stream) ; + if (s->dictionary) + SvREFCNT_dec(s->dictionary) ; +#ifndef SETP_BYTE + if (s->deflateParams_out_buffer) + Safefree(s->deflateParams_out_buffer); +#endif +#ifdef MAGIC_APPEND + if (s->window) + Safefree(s->window); +#endif + Safefree(s) ; + + +uLong +status(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->last_error ; + OUTPUT: + RETVAL + +uLong +crc32(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->crc32 ; + OUTPUT: + RETVAL + +uLong +dict_adler(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->dict_adler ; + OUTPUT: + RETVAL + +uLong +total_in(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->stream.total_in ; + OUTPUT: + RETVAL + +uLong +adler32(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->adler32 ; + OUTPUT: + RETVAL + +uLong +total_out(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->stream.total_out ; + OUTPUT: + RETVAL + +char* +msg(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->stream.msg; + OUTPUT: + RETVAL + + +uLong +get_Bufsize(s) + Compress::Raw::Zlib::inflateStream s + CODE: + RETVAL = s->bufsize ; + OUTPUT: + RETVAL + +bool +set_Append(s, mode) + Compress::Raw::Zlib::inflateStream s + bool mode + CODE: + RETVAL = ((s->flags & FLAG_APPEND) == FLAG_APPEND); + if (mode) + s->flags |= FLAG_APPEND ; + else + s->flags &= ~FLAG_APPEND ; + OUTPUT: + RETVAL + +MODULE = Compress::Raw::Zlib PACKAGE = Compress::Raw::Zlib::inflateScanStream + +void +DESTROY(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + inflateEnd(&s->stream) ; + if (s->dictionary) + SvREFCNT_dec(s->dictionary) ; +#ifndef SETP_BYTE + if (s->deflateParams_out_buffer) + Safefree(s->deflateParams_out_buffer); +#endif +#ifdef MAGIC_APPEND + if (s->window) + Safefree(s->window); +#endif + Safefree(s) ; + +void +DispStream(s, message=NULL) + Compress::Raw::Zlib::inflateScanStream s + char * message + +DualType +inflateReset(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + RETVAL = inflateReset(&(s->stream)) ; + if (RETVAL == Z_OK) { + PostInitStream(s, s->flags, s->bufsize, s->WindowBits) ; + } + OUTPUT: + RETVAL + +DualType +scan(s, buf, out=NULL, eof=FALSE) + Compress::Raw::Zlib::inflateScanStream s + SV * buf + SV * out + bool eof + bool eof_mode = FALSE; + int start_len = NO_INIT + STRLEN stmp = NO_INIT + CODE: + /* If the input buffer is a reference, dereference it */ +#ifndef MAGIC_APPEND + buf = buf; + croak("scan needs zlib 1.2.1 or better"); +#else + buf = deRef(buf, "inflateScan") ; +#ifdef UTF8_AVAILABLE + if (DO_UTF8(buf) && !sv_utf8_downgrade(buf, 1)) + croak("Wide character in Compress::Raw::Zlib::InflateScan::scan input parameter"); +#endif + /* initialise the input buffer */ + s->stream.next_in = (Bytef*)SvPVbyte_force(buf, stmp) ; + s->stream.avail_in = SvCUR(buf) ; + start_len = s->stream.avail_in ; + s->bytesInflated = 0 ; + do + { + if (s->stream.avail_in == 0) { + RETVAL = Z_OK ; + break ; + } + + /* set up output to next available section of sliding window */ + s->stream.avail_out = WINDOW_SIZE - s->window_have; + s->stream.next_out = s->window + s->window_have; + + /* DispStream(s, "before inflate\n"); */ + + /* inflate and check for errors */ + RETVAL = inflate(&(s->stream), Z_BLOCK); + + if (start_len > 1 && ! eof_mode) + s->window_lastByte = *(s->stream.next_in - 1 ) ; + + if (RETVAL == Z_STREAM_ERROR || RETVAL == Z_MEM_ERROR || + RETVAL == Z_DATA_ERROR ) + break ; + + if (s->flags & FLAG_CRC32 ) + s->crc32 = crc32(s->crc32, s->window + s->window_have, + WINDOW_SIZE - s->window_have - s->stream.avail_out); + + if (s->flags & FLAG_ADLER32) + s->adler32 = adler32(s->adler32, s->window + s->window_have, + WINDOW_SIZE - s->window_have - s->stream.avail_out); + + s->uncompressedBytes = + s->bytesInflated += WINDOW_SIZE - s->window_have - s->stream.avail_out; + + if (s->stream.avail_out) + s->window_have = WINDOW_SIZE - s->stream.avail_out; + else { + s->window_have = 0; + s->window_full = 1; + } + + /* process end of block */ + if (s->stream.data_type & 128) { + if (s->stream.data_type & 64) { + s->window_left = s->stream.data_type & 0x1f; + } + else { + s->window_lastbit = s->stream.data_type & 0x1f; + s->lastBlockOffset = s->stream.total_in; + } + } + + } while (RETVAL != Z_STREAM_END); + + s->last_error = RETVAL ; + s->window_lastoff = s->stream.total_in ; + s->compressedBytes += SvCUR(buf) - s->stream.avail_in ; + + if (RETVAL == Z_STREAM_END) + { + s->matchedEndBlock = 1 ; + + /* save the location of the end of the compressed data */ + s->window_end = SvCUR(buf) - s->stream.avail_in - 1 ; + s->window_endOffset = s->stream.total_in ; + if (s->window_left) + { + -- s->window_endOffset ; + } + + /* if window wrapped, build dictionary from window by rotating */ + if (s->window_full) { + rotate(s->window, WINDOW_SIZE, s->window_have); + s->window_have = WINDOW_SIZE; + } + + /* if (s->flags & FLAG_CONSUME_INPUT) { */ + if (1) { + unsigned in = s->stream.avail_in ; + SvCUR_set(buf, in) ; + if (in) + Move(s->stream.next_in, SvPVbyte_nolen(buf), in, char) ; + *SvEND(buf) = '\0'; + SvSETMAGIC(buf); + } + } +#endif + OUTPUT: + RETVAL + + +uLong +getEndOffset(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: +#ifndef MAGIC_APPEND + croak("getEndOffset needs zlib 1.2.1 or better"); +#else + RETVAL = s->window_endOffset; +#endif + OUTPUT: + RETVAL + +uLong +inflateCount(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: +#ifndef MAGIC_APPEND + croak("inflateCount needs zlib 1.2.1 or better"); +#else + RETVAL = s->bytesInflated; +#endif + OUTPUT: + RETVAL + +uLong +compressedBytes(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + RETVAL = s->compressedBytes; + OUTPUT: + RETVAL + +uLong +uncompressedBytes(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + RETVAL = s->uncompressedBytes; + OUTPUT: + RETVAL + + +uLong +getLastBlockOffset(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: +#ifndef MAGIC_APPEND + croak("getLastBlockOffset needs zlib 1.2.1 or better"); +#else + RETVAL = s->lastBlockOffset - (s->window_lastbit != 0); +#endif + OUTPUT: + RETVAL + +uLong +getLastBufferOffset(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: +#ifndef MAGIC_APPEND + croak("getLastBufferOffset needs zlib 1.2.1 or better"); +#else + RETVAL = s->window_lastoff; +#endif + OUTPUT: + RETVAL + +void +resetLastBlockByte(s, byte) + Compress::Raw::Zlib::inflateScanStream s + unsigned char* byte + CODE: +#ifndef MAGIC_APPEND + croak("resetLastBlockByte needs zlib 1.2.1 or better"); +#else + if (byte != NULL) + *byte = *byte ^ (1 << ((8 - s->window_lastbit) & 7)); +#endif + + +void +_createDeflateStream(inf_s, flags,level, method, windowBits, memLevel, strategy, bufsize) + Compress::Raw::Zlib::inflateScanStream inf_s + int flags + int level + int method + int windowBits + int memLevel + int strategy + uLong bufsize + PPCODE: + { +#ifndef MAGIC_APPEND + flags = flags; + level = level ; + method = method; + windowBits = windowBits; + memLevel = memLevel; + strategy = strategy; + bufsize= bufsize; + croak("_createDeflateStream needs zlib 1.2.1 or better"); +#else + int err ; + deflateStream s ; + + if (trace) + warn("in _createDeflateStream(level=%d, method=%d, windowBits=%d, memLevel=%d, strategy=%d, bufsize=%lu\n", + level, method, windowBits, memLevel, strategy, bufsize) ; + if ((s = InitStream() )) { + + s->Level = level; + s->Method = method; + s->WindowBits = windowBits; + s->MemLevel = memLevel; + s->Strategy = strategy; + + err = deflateInit2(&(s->stream), level, + method, windowBits, memLevel, strategy); + + if (err == Z_OK) { + err = deflateSetDictionary(&(s->stream), inf_s->window, inf_s->window_have); + s->dict_adler = s->stream.adler ; + } + + if (err != Z_OK) { + Safefree(s) ; + s = NULL ; + } + else { + PostInitStream(s, flags, bufsize, windowBits) ; + s->crc32 = inf_s->crc32; + s->adler32 = inf_s->adler32; + s->stream.adler = inf_s->stream.adler ; + /* s->stream.total_out = inf_s->bytesInflated ; */ + s->stream.total_in = inf_s->stream.total_out ; + if (inf_s->window_left) { + /* printf("** window_left %d, window_lastByte %d\n", inf_s->window_left, inf_s->window_lastByte); */ + deflatePrime(&(s->stream), 8 - inf_s->window_left, inf_s->window_lastByte); + } + } + } + else + err = Z_MEM_ERROR ; + + XPUSHs(sv_setref_pv(sv_newmortal(), + "Compress::Raw::Zlib::deflateStream", (void*)s)); + if (GIMME == G_ARRAY) { + SV * sv = sv_2mortal(newSViv(err)) ; + setDUALstatus(sv, err); + XPUSHs(sv) ; + } +#endif + } + +DualType +status(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + RETVAL = s->last_error ; + OUTPUT: + RETVAL + +uLong +crc32(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + RETVAL = s->crc32 ; + OUTPUT: + RETVAL + + +uLong +adler32(s) + Compress::Raw::Zlib::inflateScanStream s + CODE: + RETVAL = s->adler32 ; + OUTPUT: + RETVAL + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/config.in b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/config.in new file mode 100755 index 0000000..c56cc03 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/config.in @@ -0,0 +1,27 @@ +# Filename: config.in +# +# written by Paul Marquess +# last modified 28th October 2003 +# version 2.000 +# +# +# This file is used to control which zlib library will be used by +# Compress::Zlib +# +# See to the sections below in the README file for details of how to +# use this file. +# +# Controlling the version of zlib used by Compress::Zlib +# +# Setting the Gzip OS Code +# + +BUILD_ZLIB = True +INCLUDE = ./zlib-src +LIB = ./zlib-src + +OLD_ZLIB = False +GZIP_OS_CODE = AUTO_DETECT + + +# end of file config.in diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/README.source b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/README.source new file mode 100644 index 0000000..36b0f1e --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/README.source @@ -0,0 +1,4 @@ +This package uses quilt for anaging patches to upstream source. + +A brief explaiination about the procedures is available in +/usr/share/quilt/README.source file, shipped in `quilt' package. diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/changelog b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/changelog new file mode 100644 index 0000000..f9471ac --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/changelog @@ -0,0 +1,99 @@ +libcompress-raw-zlib-perl (2.012-1lenny1) stable; urgency=high + + * [SECURITY] CVE-2009-1391: Fix a buffer overflow in inflate(). + (Closes: #532738) + + -- Niko Tyni Sat, 13 Jun 2009 22:19:41 +0300 + +libcompress-raw-zlib-perl (2.012-1) unstable; urgency=low + + * New upstream release + * Standards-Version: 3.8.0 + + add README.source, documenting quilt usage + * wrap long lines in debian/copyright + + -- Damyan Ivanov Wed, 16 Jul 2008 22:37:51 +0300 + +libcompress-raw-zlib-perl (2.011-2) unstable; urgency=low + + * add use-debian-zlib.patch, changing configure.in to use vendor zlib + instead of the built-in one. + + add zlib1g-dev to build-depends + + add quilt build-dependency and plug it into debian/rules + Closes: #482052 + * minimize debian/rules by using debhelper 7 + + bump debhelper build-dependency and compat level + + install examples via debian/libcompress-raw-zlib-perl.examples + + -- Damyan Ivanov Tue, 20 May 2008 17:43:08 +0300 + +libcompress-raw-zlib-perl (2.011-1) unstable; urgency=low + + * New upstream release. + + -- gregor herrmann Mon, 19 May 2008 21:15:48 +0200 + +libcompress-raw-zlib-perl (2.010-1) unstable; urgency=low + + * debian/watch: use dist-based URL. + * New upstream release. + * debian/copyright: use dist-based source download URL. + * Refresh debian/rules, no functional changes. + * debian/control: change my email address. + + -- gregor herrmann Tue, 06 May 2008 18:11:41 +0200 + +libcompress-raw-zlib-perl (2.009-1) unstable; urgency=low + + * New upstream release. + * Update years of upstream copyright. + + -- Roberto C. Sanchez Mon, 21 Apr 2008 08:57:39 -0400 + +libcompress-raw-zlib-perl (2.008-2) unstable; urgency=low + + [ gregor herrmann ] + * debian/rules: delete /usr/share/perl5 only if it exists. + + [ Damyan Ivanov ] + * debhelper compatibility level 6 + * Standards-Version: 3.7.3 (no changes) + + -- Damyan Ivanov Fri, 18 Jan 2008 13:01:52 +0200 + +libcompress-raw-zlib-perl (2.008-1) unstable; urgency=low + + * New upstream release. + * debian/control: Added: Vcs-Svn field (source stanza); Vcs-Browser + field (source stanza); Homepage field (source stanza). Removed: XS- + Vcs-Svn fields. + * debian/rules: move $(MAKE) test to build-stamp target. + * debian/copyright: add copyright/license information for ppport.h. + + -- gregor herrmann Sun, 11 Nov 2007 15:28:31 +0100 + +libcompress-raw-zlib-perl (2.006-1) unstable; urgency=low + + * New upstream release + * Added libtest-pod-perl to Build-Depends to enable POD tests + * debian/rules + + remove unused dh_* calls + + clean: move removing *-stamp before $(MAKE) distclean + * Improved debian/watch + * Generic upstream URL in debian/copyright + * Added myself to Uploaders: + + -- Damyan Ivanov Wed, 05 Sep 2007 22:50:22 +0300 + +libcompress-raw-zlib-perl (2.005-1) unstable; urgency=low + + * New upstream release + + -- Krzysztof Krzyzaniak (eloy) Wed, 11 Jul 2007 12:24:01 +0200 + +libcompress-raw-zlib-perl (2.004-1) unstable; urgency=low + + * Initial Release (closes: #421608). + + -- Krzysztof Krzyzaniak (eloy) Tue, 24 Apr 2007 14:01:12 +0200 + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/compat b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/compat @@ -0,0 +1 @@ +7 diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/control b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/control new file mode 100644 index 0000000..bab51c2 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/control @@ -0,0 +1,19 @@ +Source: libcompress-raw-zlib-perl +Section: perl +Priority: optional +Build-Depends: debhelper (>= 7), perl (>= 5.8.8-7), + libtest-pod-perl, zlib1g-dev, quilt (>= 0.40) +Uploaders: Krzysztof Krzyzaniak (eloy) , + Damyan Ivanov , gregor herrmann +Maintainer: Debian Perl Group +Standards-Version: 3.8.0 +Homepage: http://search.cpan.org/dist/Compress-Raw-Zlib/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libcompress-raw-zlib-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libcompress-raw-zlib-perl/ + +Package: libcompress-raw-zlib-perl +Architecture: any +Depends: ${perl:Depends}, ${shlibs:Depends}, ${misc:Depends} +Description: low-level interface to zlib compression library + The Compress::Raw::Zlib module provides a Perl low-level interface to the zlib + compression library. diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/copyright b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/copyright new file mode 100644 index 0000000..e5dcd02 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/copyright @@ -0,0 +1,66 @@ +This is the debian package for the Compress-Raw-Zlib module. +It was created by Krzysztof Krzyzaniak (eloy) using +dh-make-perl. + +It was downloaded from: http://search.cpan.org/dist/Compress-Raw-Zlib/ + +The upstream author is: Paul Marquess . + +Copyright (c) 2005-2008 Paul Marquess. All rights reserved. + +This program is free software, you can redistribute it and/or modify it under +the same terms as Perl itself. + +Perl is distributed under licenses: + + a) the GNU General Public License as published by the Free Software + Foundation; either version 1, or (at your option) any later + version, or + + b) the "Artistic License" which comes with Perl. + + On Debian GNU/Linux systems, the complete text of the GNU General + Public License can be found in /usr/share/common-licenses/GPL' and + the Artistic Licence in /usr/share/common-licenses/Artistic'. + + +The directory zlib-src contains a subset of the source files copied directly +from zlib version 1.2.3. +Full source for the zlib library is available at http://www.zlib.org + +Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + +The data format used by the zlib library is described by RFCs (Request for +Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt +(zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). + + +The file ppport.h contains the following copyright/license notice: + +COPYRIGHT +Version 3.x, Copyright (c) 2004-2006, Marcus Holland-Moritz. +Version 2.x, Copyright (C) 2001, Paul Marquess. +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/libcompress-raw-zlib-perl.examples b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/libcompress-raw-zlib-perl.examples new file mode 100644 index 0000000..e39721e --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/libcompress-raw-zlib-perl.examples @@ -0,0 +1 @@ +examples/* diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/CVE-2009-1391 b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/CVE-2009-1391 new file mode 100644 index 0000000..dc28e51 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/CVE-2009-1391 @@ -0,0 +1,18 @@ +[SECURITY] CVE-2009-1391: Fix a buffer overflow in inflate(). + +Closes: #532738 + +https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2009-1391 + +Fix cherry-picked from upstream version 2.017. +--- libcompress-raw-zlib-perl-2.012.orig/Zlib.xs ++++ libcompress-raw-zlib-perl-2.012/Zlib.xs +@@ -1319,7 +1319,7 @@ + while (RETVAL == Z_OK) { + if (s->stream.avail_out == 0 ) { + /* out of space in the output buffer so make it bigger */ +- Sv_Grow(output, SvLEN(output) + bufinc) ; ++ Sv_Grow(output, SvLEN(output) + bufinc +1) ; + cur_length += increment ; + s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length ; + increment = bufinc ; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/series b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/series new file mode 100644 index 0000000..2d507c5 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/series @@ -0,0 +1,2 @@ +CVE-2009-1391 +use-debian-zlib.patch diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/use-debian-zlib.patch b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/use-debian-zlib.patch new file mode 100644 index 0000000..72c0797 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/patches/use-debian-zlib.patch @@ -0,0 +1,15 @@ +--- a/config.in ++++ b/config.in +@@ -16,9 +16,9 @@ + # Setting the Gzip OS Code + # + +-BUILD_ZLIB = True +-INCLUDE = ./zlib-src +-LIB = ./zlib-src ++BUILD_ZLIB = False ++INCLUDE = /usr/inclide ++LIB = /usr/lib + + OLD_ZLIB = False + GZIP_OS_CODE = AUTO_DETECT diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/rules b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/rules new file mode 100755 index 0000000..847a283 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +include /usr/share/quilt/quilt.make + +build: build-stamp +build-stamp: $(QUILT_STAMPFN) + dh build + touch $@ + +clean: unpatch + dh $@ + +# Build architecture-independent files here. +binary-indep: build +# We have nothing to do here for an architecture-dependent package + +# Build architecture-dependent files here. +binary-arch: build + dh $@ + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/watch b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/watch new file mode 100644 index 0000000..9b38b3b --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Compress-Raw-Zlib/ .*/Compress-Raw-Zlib-v?(\d[\d_.]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip) diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtdef b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtdef new file mode 100755 index 0000000..3c65650 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtdef @@ -0,0 +1,27 @@ +#!/usr/local/bin/perl + +use Compress::Raw::Zlib ; + +use strict ; +use warnings ; + +binmode STDIN; +binmode STDOUT; + +my $x = new Compress::Raw::Zlib::Deflate() + or die "Cannot create a deflation stream\n" ; + +my $output = '' ; + +while (<>) +{ + $x->deflate($_, $output) == Z_OK + or die "deflate failed\n" ; + + print $output ; +} + +$x->flush($output) == Z_OK + or die "flush failed\n" ; + +print $output ; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtinf b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtinf new file mode 100755 index 0000000..1a99e88 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/examples/filtinf @@ -0,0 +1,30 @@ +#!/usr/local/bin/perl + +use Compress::Raw::Zlib ; + +use strict ; +use warnings ; + +binmode STDIN; +binmode STDOUT; + +my $x = new Compress::Raw::Zlib::Inflate + or die "Cannot create a inflation stream\n" ; + +my $input = '' ; +my $output = '' ; +my $status ; + +while (read(STDIN, $input, 4096)) +{ + $status = $x->inflate($input, $output) ; + + print $output + if $status == Z_OK or $status == Z_STREAM_END ; + + last if $status != Z_OK ; +} + +die "inflation failed\n" + unless $status == Z_STREAM_END ; + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.h new file mode 100644 index 0000000..f0b8954 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.h @@ -0,0 +1,529 @@ +#define PERL_constant_NOTFOUND 1 +#define PERL_constant_NOTDEF 2 +#define PERL_constant_ISIV 3 +#define PERL_constant_ISNO 4 +#define PERL_constant_ISNV 5 +#define PERL_constant_ISPV 6 +#define PERL_constant_ISPVN 7 +#define PERL_constant_ISSV 8 +#define PERL_constant_ISUNDEF 9 +#define PERL_constant_ISUV 10 +#define PERL_constant_ISYES 11 + +#ifndef NVTYPE +typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */ +#endif +#ifndef aTHX_ +#define aTHX_ /* 5.6 or later define this for threading support. */ +#endif +#ifndef pTHX_ +#define pTHX_ /* 5.6 or later define this for threading support. */ +#endif + +static int +constant_7 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + OS_CODE Z_ASCII Z_BLOCK Z_ERRNO Z_FIXED */ + /* Offset 6 gives the best switch position. */ + switch (name[6]) { + case 'D': + if (memEQ(name, "Z_FIXE", 6)) { + /* D */ +#ifdef Z_FIXED + *iv_return = Z_FIXED; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'E': + if (memEQ(name, "OS_COD", 6)) { + /* E */ +#ifdef OS_CODE + *iv_return = OS_CODE; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'I': + if (memEQ(name, "Z_ASCI", 6)) { + /* I */ +#ifdef Z_ASCII + *iv_return = Z_ASCII; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'K': + if (memEQ(name, "Z_BLOC", 6)) { + /* K */ +#ifdef Z_BLOCK + *iv_return = Z_BLOCK; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "Z_ERRN", 6)) { + /* O */ +#ifdef Z_ERRNO + *iv_return = Z_ERRNO; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_9 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DEF_WBITS MAX_WBITS Z_UNKNOWN */ + /* Offset 2 gives the best switch position. */ + switch (name[2]) { + case 'F': + if (memEQ(name, "DEF_WBITS", 9)) { + /* ^ */ +#ifdef DEF_WBITS + *iv_return = DEF_WBITS; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'U': + if (memEQ(name, "Z_UNKNOWN", 9)) { + /* ^ */ +#ifdef Z_UNKNOWN + *iv_return = Z_UNKNOWN; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'X': + if (memEQ(name, "MAX_WBITS", 9)) { + /* ^ */ +#ifdef MAX_WBITS + *iv_return = MAX_WBITS; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_10 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + Z_DEFLATED Z_FILTERED Z_NO_FLUSH */ + /* Offset 7 gives the best switch position. */ + switch (name[7]) { + case 'R': + if (memEQ(name, "Z_FILTERED", 10)) { + /* ^ */ +#ifdef Z_FILTERED + *iv_return = Z_FILTERED; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'T': + if (memEQ(name, "Z_DEFLATED", 10)) { + /* ^ */ +#ifdef Z_DEFLATED + *iv_return = Z_DEFLATED; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'U': + if (memEQ(name, "Z_NO_FLUSH", 10)) { + /* ^ */ +#ifdef Z_NO_FLUSH + *iv_return = Z_NO_FLUSH; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_11 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + Z_BUF_ERROR Z_MEM_ERROR Z_NEED_DICT */ + /* Offset 4 gives the best switch position. */ + switch (name[4]) { + case 'E': + if (memEQ(name, "Z_NEED_DICT", 11)) { + /* ^ */ +#ifdef Z_NEED_DICT + *iv_return = Z_NEED_DICT; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'F': + if (memEQ(name, "Z_BUF_ERROR", 11)) { + /* ^ */ +#ifdef Z_BUF_ERROR + *iv_return = Z_BUF_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'M': + if (memEQ(name, "Z_MEM_ERROR", 11)) { + /* ^ */ +#ifdef Z_MEM_ERROR + *iv_return = Z_MEM_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_12 (pTHX_ const char *name, IV *iv_return, const char **pv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + ZLIB_VERSION Z_BEST_SPEED Z_DATA_ERROR Z_FULL_FLUSH Z_STREAM_END + Z_SYNC_FLUSH */ + /* Offset 4 gives the best switch position. */ + switch (name[4]) { + case 'L': + if (memEQ(name, "Z_FULL_FLUSH", 12)) { + /* ^ */ +#ifdef Z_FULL_FLUSH + *iv_return = Z_FULL_FLUSH; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "Z_SYNC_FLUSH", 12)) { + /* ^ */ +#ifdef Z_SYNC_FLUSH + *iv_return = Z_SYNC_FLUSH; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'R': + if (memEQ(name, "Z_STREAM_END", 12)) { + /* ^ */ +#ifdef Z_STREAM_END + *iv_return = Z_STREAM_END; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'S': + if (memEQ(name, "Z_BEST_SPEED", 12)) { + /* ^ */ +#ifdef Z_BEST_SPEED + *iv_return = Z_BEST_SPEED; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'T': + if (memEQ(name, "Z_DATA_ERROR", 12)) { + /* ^ */ +#ifdef Z_DATA_ERROR + *iv_return = Z_DATA_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case '_': + if (memEQ(name, "ZLIB_VERSION", 12)) { + /* ^ */ +#ifdef ZLIB_VERSION + *pv_return = ZLIB_VERSION; + return PERL_constant_ISPV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant (pTHX_ const char *name, STRLEN len, IV *iv_return, const char **pv_return) { + /* Initially switch on the length of the name. */ + /* When generated this function returned values for the list of names given + in this section of perl code. Rather than manually editing these functions + to add or remove constants, which would result in this comment and section + of code becoming inaccurate, we recommend that you edit this section of + code, and use it to regenerate a new set of constant functions which you + then use to replace the originals. + + Regenerate these constant functions by feeding this entire source file to + perl -x + +#!/usr/bin/perl -w +use ExtUtils::Constant qw (constant_types C_constant XS_constant); + +my $types = {map {($_, 1)} qw(IV PV)}; +my @names = (qw(DEF_WBITS MAX_MEM_LEVEL MAX_WBITS OS_CODE Z_ASCII + Z_BEST_COMPRESSION Z_BEST_SPEED Z_BINARY Z_BLOCK Z_BUF_ERROR + Z_DATA_ERROR Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY Z_DEFLATED + Z_ERRNO Z_FILTERED Z_FINISH Z_FIXED Z_FULL_FLUSH Z_HUFFMAN_ONLY + Z_MEM_ERROR Z_NEED_DICT Z_NO_COMPRESSION Z_NO_FLUSH Z_NULL Z_OK + Z_PARTIAL_FLUSH Z_RLE Z_STREAM_END Z_STREAM_ERROR Z_SYNC_FLUSH + Z_UNKNOWN Z_VERSION_ERROR), + {name=>"ZLIB_VERSION", type=>"PV"}); + +print constant_types(); # macro defs +foreach (C_constant ("Zlib", 'constant', 'IV', $types, undef, 3, @names) ) { + print $_, "\n"; # C constant subs +} +print "#### XS Section:\n"; +print XS_constant ("Zlib", $types); +__END__ + */ + + switch (len) { + case 4: + if (memEQ(name, "Z_OK", 4)) { +#ifdef Z_OK + *iv_return = Z_OK; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 5: + if (memEQ(name, "Z_RLE", 5)) { +#ifdef Z_RLE + *iv_return = Z_RLE; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 6: + if (memEQ(name, "Z_NULL", 6)) { +#ifdef Z_NULL + *iv_return = Z_NULL; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 7: + return constant_7 (aTHX_ name, iv_return); + break; + case 8: + /* Names all of length 8. */ + /* Z_BINARY Z_FINISH */ + /* Offset 6 gives the best switch position. */ + switch (name[6]) { + case 'R': + if (memEQ(name, "Z_BINARY", 8)) { + /* ^ */ +#ifdef Z_BINARY + *iv_return = Z_BINARY; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'S': + if (memEQ(name, "Z_FINISH", 8)) { + /* ^ */ +#ifdef Z_FINISH + *iv_return = Z_FINISH; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + break; + case 9: + return constant_9 (aTHX_ name, iv_return); + break; + case 10: + return constant_10 (aTHX_ name, iv_return); + break; + case 11: + return constant_11 (aTHX_ name, iv_return); + break; + case 12: + return constant_12 (aTHX_ name, iv_return, pv_return); + break; + case 13: + if (memEQ(name, "MAX_MEM_LEVEL", 13)) { +#ifdef MAX_MEM_LEVEL + *iv_return = MAX_MEM_LEVEL; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 14: + /* Names all of length 14. */ + /* Z_HUFFMAN_ONLY Z_STREAM_ERROR */ + /* Offset 3 gives the best switch position. */ + switch (name[3]) { + case 'T': + if (memEQ(name, "Z_STREAM_ERROR", 14)) { + /* ^ */ +#ifdef Z_STREAM_ERROR + *iv_return = Z_STREAM_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'U': + if (memEQ(name, "Z_HUFFMAN_ONLY", 14)) { + /* ^ */ +#ifdef Z_HUFFMAN_ONLY + *iv_return = Z_HUFFMAN_ONLY; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + break; + case 15: + /* Names all of length 15. */ + /* Z_PARTIAL_FLUSH Z_VERSION_ERROR */ + /* Offset 5 gives the best switch position. */ + switch (name[5]) { + case 'S': + if (memEQ(name, "Z_VERSION_ERROR", 15)) { + /* ^ */ +#ifdef Z_VERSION_ERROR + *iv_return = Z_VERSION_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'T': + if (memEQ(name, "Z_PARTIAL_FLUSH", 15)) { + /* ^ */ +#ifdef Z_PARTIAL_FLUSH + *iv_return = Z_PARTIAL_FLUSH; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + break; + case 16: + if (memEQ(name, "Z_NO_COMPRESSION", 16)) { +#ifdef Z_NO_COMPRESSION + *iv_return = Z_NO_COMPRESSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 18: + /* Names all of length 18. */ + /* Z_BEST_COMPRESSION Z_DEFAULT_STRATEGY */ + /* Offset 14 gives the best switch position. */ + switch (name[14]) { + case 'S': + if (memEQ(name, "Z_BEST_COMPRESSION", 18)) { + /* ^ */ +#ifdef Z_BEST_COMPRESSION + *iv_return = Z_BEST_COMPRESSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'T': + if (memEQ(name, "Z_DEFAULT_STRATEGY", 18)) { + /* ^ */ +#ifdef Z_DEFAULT_STRATEGY + *iv_return = Z_DEFAULT_STRATEGY; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + break; + case 21: + if (memEQ(name, "Z_DEFAULT_COMPRESSION", 21)) { +#ifdef Z_DEFAULT_COMPRESSION + *iv_return = Z_DEFAULT_COMPRESSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.xs b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.xs new file mode 100644 index 0000000..02a6ef4 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/fallback/constants.xs @@ -0,0 +1,87 @@ +void +constant(sv) + PREINIT: +#ifdef dXSTARG + dXSTARG; /* Faster if we have it. */ +#else + dTARGET; +#endif + STRLEN len; + int type; + IV iv; + /* NV nv; Uncomment this if you need to return NVs */ + const char *pv; + INPUT: + SV * sv; + const char * s = SvPV(sv, len); + PPCODE: + /* Change this to constant(aTHX_ s, len, &iv, &nv); + if you need to return both NVs and IVs */ + type = constant(aTHX_ s, len, &iv, &pv); + /* Return 1 or 2 items. First is error message, or undef if no error. + Second, if present, is found value */ + switch (type) { + case PERL_constant_NOTFOUND: + sv = sv_2mortal(newSVpvf("%s is not a valid Zlib macro", s)); + PUSHs(sv); + break; + case PERL_constant_NOTDEF: + sv = sv_2mortal(newSVpvf( + "Your vendor has not defined Zlib macro %s, used", s)); + PUSHs(sv); + break; + case PERL_constant_ISIV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHi(iv); + break; + /* Uncomment this if you need to return NOs + case PERL_constant_ISNO: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_no); + break; */ + /* Uncomment this if you need to return NVs + case PERL_constant_ISNV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHn(nv); + break; */ + case PERL_constant_ISPV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, strlen(pv)); + break; + /* Uncomment this if you need to return PVNs + case PERL_constant_ISPVN: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, iv); + break; */ + /* Uncomment this if you need to return SVs + case PERL_constant_ISSV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(sv); + break; */ + /* Uncomment this if you need to return UNDEFs + case PERL_constant_ISUNDEF: + break; */ + /* Uncomment this if you need to return UVs + case PERL_constant_ISUV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHu((UV)iv); + break; */ + /* Uncomment this if you need to return YESs + case PERL_constant_ISYES: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_yes); + break; */ + default: + sv = sv_2mortal(newSVpvf( + "Unexpected return type %d while processing Zlib macro %s, used", + type, s)); + PUSHs(sv); + } diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/lib/Compress/Raw/Zlib.pm b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/lib/Compress/Raw/Zlib.pm new file mode 100644 index 0000000..5f15031 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/lib/Compress/Raw/Zlib.pm @@ -0,0 +1,1202 @@ + +package Compress::Raw::Zlib; + +require 5.004 ; +require Exporter; +use AutoLoader; +use Carp ; + +#use Parse::Parameters; + +use strict ; +use warnings ; +use bytes ; +our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD); + +$VERSION = '2.012'; +$XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +@ISA = qw(Exporter); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + adler32 crc32 + + ZLIB_VERSION + ZLIB_VERNUM + + DEF_WBITS + OS_CODE + + MAX_MEM_LEVEL + MAX_WBITS + + Z_ASCII + Z_BEST_COMPRESSION + Z_BEST_SPEED + Z_BINARY + Z_BLOCK + Z_BUF_ERROR + Z_DATA_ERROR + Z_DEFAULT_COMPRESSION + Z_DEFAULT_STRATEGY + Z_DEFLATED + Z_ERRNO + Z_FILTERED + Z_FIXED + Z_FINISH + Z_FULL_FLUSH + Z_HUFFMAN_ONLY + Z_MEM_ERROR + Z_NEED_DICT + Z_NO_COMPRESSION + Z_NO_FLUSH + Z_NULL + Z_OK + Z_PARTIAL_FLUSH + Z_RLE + Z_STREAM_END + Z_STREAM_ERROR + Z_SYNC_FLUSH + Z_UNKNOWN + Z_VERSION_ERROR + + WANT_GZIP + WANT_GZIP_OR_ZLIB +); + +use constant WANT_GZIP => 16; +use constant WANT_GZIP_OR_ZLIB => 32; + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + my ($error, $val) = constant($constname); + Carp::croak $error if $error; + no strict 'refs'; + *{$AUTOLOAD} = sub { $val }; + goto &{$AUTOLOAD}; +} + +use constant FLAG_APPEND => 1 ; +use constant FLAG_CRC => 2 ; +use constant FLAG_ADLER => 4 ; +use constant FLAG_CONSUME_INPUT => 8 ; + +eval { + require XSLoader; + XSLoader::load('Compress::Raw::Zlib', $XS_VERSION); + 1; +} +or do { + require DynaLoader; + local @ISA = qw(DynaLoader); + bootstrap Compress::Raw::Zlib $XS_VERSION ; +}; + + +use constant Parse_any => 0x01; +use constant Parse_unsigned => 0x02; +use constant Parse_signed => 0x04; +use constant Parse_boolean => 0x08; +use constant Parse_string => 0x10; +use constant Parse_custom => 0x12; + +use constant Parse_store_ref => 0x100 ; + +use constant OFF_PARSED => 0 ; +use constant OFF_TYPE => 1 ; +use constant OFF_DEFAULT => 2 ; +use constant OFF_FIXED => 3 ; +use constant OFF_FIRST_ONLY => 4 ; +use constant OFF_STICKY => 5 ; + + + +sub ParseParameters +{ + my $level = shift || 0 ; + + my $sub = (caller($level + 1))[3] ; + #local $Carp::CarpLevel = 1 ; + my $p = new Compress::Raw::Zlib::Parameters() ; + $p->parse(@_) + or croak "$sub: $p->{Error}" ; + + return $p; +} + + +sub Compress::Raw::Zlib::Parameters::new +{ + my $class = shift ; + + my $obj = { Error => '', + Got => {}, + } ; + + #return bless $obj, ref($class) || $class || __PACKAGE__ ; + return bless $obj, 'Compress::Raw::Zlib::Parameters' ; +} + +sub Compress::Raw::Zlib::Parameters::setError +{ + my $self = shift ; + my $error = shift ; + my $retval = @_ ? shift : undef ; + + $self->{Error} = $error ; + return $retval; +} + +#sub getError +#{ +# my $self = shift ; +# return $self->{Error} ; +#} + +sub Compress::Raw::Zlib::Parameters::parse +{ + my $self = shift ; + + my $default = shift ; + + my $got = $self->{Got} ; + my $firstTime = keys %{ $got } == 0 ; + + my (@Bad) ; + my @entered = () ; + + # Allow the options to be passed as a hash reference or + # as the complete hash. + if (@_ == 0) { + @entered = () ; + } + elsif (@_ == 1) { + my $href = $_[0] ; + return $self->setError("Expected even number of parameters, got 1") + if ! defined $href or ! ref $href or ref $href ne "HASH" ; + + foreach my $key (keys %$href) { + push @entered, $key ; + push @entered, \$href->{$key} ; + } + } + else { + my $count = @_; + return $self->setError("Expected even number of parameters, got $count") + if $count % 2 != 0 ; + + for my $i (0.. $count / 2 - 1) { + push @entered, $_[2* $i] ; + push @entered, \$_[2* $i+1] ; + } + } + + + while (my ($key, $v) = each %$default) + { + croak "need 4 params [@$v]" + if @$v != 4 ; + + my ($first_only, $sticky, $type, $value) = @$v ; + my $x ; + $self->_checkType($key, \$value, $type, 0, \$x) + or return undef ; + + $key = lc $key; + + if ($firstTime || ! $sticky) { + $got->{$key} = [0, $type, $value, $x, $first_only, $sticky] ; + } + + $got->{$key}[OFF_PARSED] = 0 ; + } + + for my $i (0.. @entered / 2 - 1) { + my $key = $entered[2* $i] ; + my $value = $entered[2* $i+1] ; + + #print "Key [$key] Value [$value]" ; + #print defined $$value ? "[$$value]\n" : "[undef]\n"; + + $key =~ s/^-// ; + my $canonkey = lc $key; + + if ($got->{$canonkey} && ($firstTime || + ! $got->{$canonkey}[OFF_FIRST_ONLY] )) + { + my $type = $got->{$canonkey}[OFF_TYPE] ; + my $s ; + $self->_checkType($key, $value, $type, 1, \$s) + or return undef ; + #$value = $$value unless $type & Parse_store_ref ; + $value = $$value ; + $got->{$canonkey} = [1, $type, $value, $s] ; + } + else + { push (@Bad, $key) } + } + + if (@Bad) { + my ($bad) = join(", ", @Bad) ; + return $self->setError("unknown key value(s) @Bad") ; + } + + return 1; +} + +sub Compress::Raw::Zlib::Parameters::_checkType +{ + my $self = shift ; + + my $key = shift ; + my $value = shift ; + my $type = shift ; + my $validate = shift ; + my $output = shift; + + #local $Carp::CarpLevel = $level ; + #print "PARSE $type $key $value $validate $sub\n" ; + if ( $type & Parse_store_ref) + { + #$value = $$value + # if ref ${ $value } ; + + $$output = $value ; + return 1; + } + + $value = $$value ; + + if ($type & Parse_any) + { + $$output = $value ; + return 1; + } + elsif ($type & Parse_unsigned) + { + return $self->setError("Parameter '$key' must be an unsigned int, got 'undef'") + if $validate && ! defined $value ; + return $self->setError("Parameter '$key' must be an unsigned int, got '$value'") + if $validate && $value !~ /^\d+$/; + + $$output = defined $value ? $value : 0 ; + return 1; + } + elsif ($type & Parse_signed) + { + return $self->setError("Parameter '$key' must be a signed int, got 'undef'") + if $validate && ! defined $value ; + return $self->setError("Parameter '$key' must be a signed int, got '$value'") + if $validate && $value !~ /^-?\d+$/; + + $$output = defined $value ? $value : 0 ; + return 1 ; + } + elsif ($type & Parse_boolean) + { + return $self->setError("Parameter '$key' must be an int, got '$value'") + if $validate && defined $value && $value !~ /^\d*$/; + $$output = defined $value ? $value != 0 : 0 ; + return 1; + } + elsif ($type & Parse_string) + { + $$output = defined $value ? $value : "" ; + return 1; + } + + $$output = $value ; + return 1; +} + + + +sub Compress::Raw::Zlib::Parameters::parsed +{ + my $self = shift ; + my $name = shift ; + + return $self->{Got}{lc $name}[OFF_PARSED] ; +} + +sub Compress::Raw::Zlib::Parameters::value +{ + my $self = shift ; + my $name = shift ; + + if (@_) + { + $self->{Got}{lc $name}[OFF_PARSED] = 1; + $self->{Got}{lc $name}[OFF_DEFAULT] = $_[0] ; + $self->{Got}{lc $name}[OFF_FIXED] = $_[0] ; + } + + return $self->{Got}{lc $name}[OFF_FIXED] ; +} + +sub Compress::Raw::Zlib::Deflate::new +{ + my $pkg = shift ; + my ($got) = ParseParameters(0, + { + 'AppendOutput' => [1, 1, Parse_boolean, 0], + 'CRC32' => [1, 1, Parse_boolean, 0], + 'ADLER32' => [1, 1, Parse_boolean, 0], + 'Bufsize' => [1, 1, Parse_unsigned, 4096], + + 'Level' => [1, 1, Parse_signed, Z_DEFAULT_COMPRESSION()], + 'Method' => [1, 1, Parse_unsigned, Z_DEFLATED()], + 'WindowBits' => [1, 1, Parse_signed, MAX_WBITS()], + 'MemLevel' => [1, 1, Parse_unsigned, MAX_MEM_LEVEL()], + 'Strategy' => [1, 1, Parse_unsigned, Z_DEFAULT_STRATEGY()], + 'Dictionary' => [1, 1, Parse_any, ""], + }, @_) ; + + + croak "Compress::Raw::Zlib::Deflate::new: Bufsize must be >= 1, you specified " . + $got->value('Bufsize') + unless $got->value('Bufsize') >= 1; + + my $flags = 0 ; + $flags |= FLAG_APPEND if $got->value('AppendOutput') ; + $flags |= FLAG_CRC if $got->value('CRC32') ; + $flags |= FLAG_ADLER if $got->value('ADLER32') ; + + my $windowBits = $got->value('WindowBits'); + $windowBits += MAX_WBITS() + if ($windowBits & MAX_WBITS()) == 0 ; + + _deflateInit($flags, + $got->value('Level'), + $got->value('Method'), + $windowBits, + $got->value('MemLevel'), + $got->value('Strategy'), + $got->value('Bufsize'), + $got->value('Dictionary')) ; + +} + +sub Compress::Raw::Zlib::Inflate::new +{ + my $pkg = shift ; + my ($got) = ParseParameters(0, + { + 'AppendOutput' => [1, 1, Parse_boolean, 0], + 'CRC32' => [1, 1, Parse_boolean, 0], + 'ADLER32' => [1, 1, Parse_boolean, 0], + 'ConsumeInput' => [1, 1, Parse_boolean, 1], + 'Bufsize' => [1, 1, Parse_unsigned, 4096], + + 'WindowBits' => [1, 1, Parse_signed, MAX_WBITS()], + 'Dictionary' => [1, 1, Parse_any, ""], + }, @_) ; + + + croak "Compress::Raw::Zlib::Inflate::new: Bufsize must be >= 1, you specified " . + $got->value('Bufsize') + unless $got->value('Bufsize') >= 1; + + my $flags = 0 ; + $flags |= FLAG_APPEND if $got->value('AppendOutput') ; + $flags |= FLAG_CRC if $got->value('CRC32') ; + $flags |= FLAG_ADLER if $got->value('ADLER32') ; + $flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ; + + my $windowBits = $got->value('WindowBits'); + $windowBits += MAX_WBITS() + if ($windowBits & MAX_WBITS()) == 0 ; + + _inflateInit($flags, $windowBits, $got->value('Bufsize'), + $got->value('Dictionary')) ; +} + +sub Compress::Raw::Zlib::InflateScan::new +{ + my $pkg = shift ; + my ($got) = ParseParameters(0, + { + 'CRC32' => [1, 1, Parse_boolean, 0], + 'ADLER32' => [1, 1, Parse_boolean, 0], + 'Bufsize' => [1, 1, Parse_unsigned, 4096], + + 'WindowBits' => [1, 1, Parse_signed, -MAX_WBITS()], + 'Dictionary' => [1, 1, Parse_any, ""], + }, @_) ; + + + croak "Compress::Raw::Zlib::InflateScan::new: Bufsize must be >= 1, you specified " . + $got->value('Bufsize') + unless $got->value('Bufsize') >= 1; + + my $flags = 0 ; + #$flags |= FLAG_APPEND if $got->value('AppendOutput') ; + $flags |= FLAG_CRC if $got->value('CRC32') ; + $flags |= FLAG_ADLER if $got->value('ADLER32') ; + #$flags |= FLAG_CONSUME_INPUT if $got->value('ConsumeInput') ; + + _inflateScanInit($flags, $got->value('WindowBits'), $got->value('Bufsize'), + '') ; +} + +sub Compress::Raw::Zlib::inflateScanStream::createDeflateStream +{ + my $pkg = shift ; + my ($got) = ParseParameters(0, + { + 'AppendOutput' => [1, 1, Parse_boolean, 0], + 'CRC32' => [1, 1, Parse_boolean, 0], + 'ADLER32' => [1, 1, Parse_boolean, 0], + 'Bufsize' => [1, 1, Parse_unsigned, 4096], + + 'Level' => [1, 1, Parse_signed, Z_DEFAULT_COMPRESSION()], + 'Method' => [1, 1, Parse_unsigned, Z_DEFLATED()], + 'WindowBits' => [1, 1, Parse_signed, - MAX_WBITS()], + 'MemLevel' => [1, 1, Parse_unsigned, MAX_MEM_LEVEL()], + 'Strategy' => [1, 1, Parse_unsigned, Z_DEFAULT_STRATEGY()], + }, @_) ; + + croak "Compress::Raw::Zlib::InflateScan::createDeflateStream: Bufsize must be >= 1, you specified " . + $got->value('Bufsize') + unless $got->value('Bufsize') >= 1; + + my $flags = 0 ; + $flags |= FLAG_APPEND if $got->value('AppendOutput') ; + $flags |= FLAG_CRC if $got->value('CRC32') ; + $flags |= FLAG_ADLER if $got->value('ADLER32') ; + + $pkg->_createDeflateStream($flags, + $got->value('Level'), + $got->value('Method'), + $got->value('WindowBits'), + $got->value('MemLevel'), + $got->value('Strategy'), + $got->value('Bufsize'), + ) ; + +} + +sub Compress::Raw::Zlib::inflateScanStream::inflate +{ + my $self = shift ; + my $buffer = $_[1]; + my $eof = $_[2]; + + my $status = $self->scan(@_); + + if ($status == Z_OK() && $_[2]) { + my $byte = ' '; + + $status = $self->scan(\$byte, $_[1]) ; + } + + return $status ; +} + +sub Compress::Raw::Zlib::deflateStream::deflateParams +{ + my $self = shift ; + my ($got) = ParseParameters(0, { + 'Level' => [1, 1, Parse_signed, undef], + 'Strategy' => [1, 1, Parse_unsigned, undef], + 'Bufsize' => [1, 1, Parse_unsigned, undef], + }, + @_) ; + + croak "Compress::Raw::Zlib::deflateParams needs Level and/or Strategy" + unless $got->parsed('Level') + $got->parsed('Strategy') + + $got->parsed('Bufsize'); + + croak "Compress::Raw::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified " . + $got->value('Bufsize') + if $got->parsed('Bufsize') && $got->value('Bufsize') <= 1; + + my $flags = 0; + $flags |= 1 if $got->parsed('Level') ; + $flags |= 2 if $got->parsed('Strategy') ; + $flags |= 4 if $got->parsed('Bufsize') ; + + $self->_deflateParams($flags, $got->value('Level'), + $got->value('Strategy'), $got->value('Bufsize')); + +} + + +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; +__END__ + + +=head1 NAME + +Compress::Raw::Zlib - Low-Level Interface to zlib compression library + +=head1 SYNOPSIS + + use Compress::Raw::Zlib ; + + ($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) ; + $status = $d->deflate($input, $output) ; + $status = $d->flush($output [, $flush_type]) ; + $d->deflateParams(OPTS) ; + $d->deflateTune(OPTS) ; + $d->dict_adler() ; + $d->crc32() ; + $d->adler32() ; + $d->total_in() ; + $d->total_out() ; + $d->msg() ; + $d->get_Strategy(); + $d->get_Level(); + $d->get_BufSize(); + + ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) ; + $status = $i->inflate($input, $output [, $eof]) ; + $status = $i->inflateSync($input) ; + $i->dict_adler() ; + $d->crc32() ; + $d->adler32() ; + $i->total_in() ; + $i->total_out() ; + $i->msg() ; + $d->get_BufSize(); + + $crc = adler32($buffer [,$crc]) ; + $crc = crc32($buffer [,$crc]) ; + + $crc = adler32_combine($crc1, $crc2, $len2)l + $crc = crc32_combine($adler1, $adler2, $len2) + + ZLIB_VERSION + ZLIB_VERNUM + +=head1 DESCRIPTION + +The I module provides a Perl interface to the I +compression library (see L for details about where to get +I). + +=head1 Compress::Raw::Zlib::Deflate + +This section defines an interface that allows in-memory compression using +the I interface provided by zlib. + +Here is a definition of the interface available: + +=head2 B<($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) > + +Initialises a deflation object. + +If you are familiar with the I library, it combines the +features of the I functions C, C +and C. + +If successful, it will return the initialised deflation object, C<$d> +and a C<$status> of C in a list context. In scalar context it +returns the deflation object, C<$d>, only. + +If not successful, the returned deflation object, C<$d>, will be +I and C<$status> will hold the a I error code. + +The function optionally takes a number of named options specified as +C<< Name => value >> pairs. This allows individual options to be +tailored without having to specify them all in the parameter list. + +For backward compatibility, it is also possible to pass the parameters +as a reference to a hash containing the name=>value pairs. + +Below is a list of the valid options: + +=over 5 + +=item B<-Level> + +Defines the compression level. Valid values are 0 through 9, +C, C, C, and +C. + +The default is C. + +=item B<-Method> + +Defines the compression method. The only valid value at present (and +the default) is Z_DEFLATED. + +=item B<-WindowBits> + +To compress an RFC 1950 data stream, set C to a positive +number between 8 and 15. + +To compress an RFC 1951 data stream, set C to C<-MAX_WBITS>. + +To compress an RFC 1952 data stream (i.e. gzip), set C to +C. + +For a definition of the meaning and valid values for C +refer to the I documentation for I. + +Defaults to C. + +=item B<-MemLevel> + +For a definition of the meaning and valid values for C +refer to the I documentation for I. + +Defaults to MAX_MEM_LEVEL. + +=item B<-Strategy> + +Defines the strategy used to tune the compression. The valid values are +C, C, C, C and +C. + +The default is Z_DEFAULT_STRATEGY. + +=item B<-Dictionary> + +When a dictionary is specified I will automatically +call C directly after calling C. The +Adler32 value for the dictionary can be obtained by calling the method +C<$d-Edict_adler()>. + +The default is no dictionary. + +=item B<-Bufsize> + +Sets the initial size for the output buffer used by the C<$d-Edeflate> +and C<$d-Eflush> methods. If the buffer has to be +reallocated to increase the size, it will grow in increments of +C. + +The default buffer size is 4096. + +=item B<-AppendOutput> + +This option controls how data is written to the output buffer by the +C<$d-Edeflate> and C<$d-Eflush> methods. + +If the C option is set to false, the output buffers in the +C<$d-Edeflate> and C<$d-Eflush> methods will be truncated before +uncompressed data is written to them. + +If the option is set to true, uncompressed data will be appended to the +output buffer in the C<$d-Edeflate> and C<$d-Eflush> methods. + +This option defaults to false. + +=item B<-CRC32> + +If set to true, a crc32 checksum of the uncompressed data will be +calculated. Use the C<$d-Ecrc32> method to retrieve this value. + +This option defaults to false. + +=item B<-ADLER32> + +If set to true, an adler32 checksum of the uncompressed data will be +calculated. Use the C<$d-Eadler32> method to retrieve this value. + +This option defaults to false. + +=back + +Here is an example of using the C optional +parameter list to override the default buffer size and compression +level. All other options will take their default values. + + my $d = new Compress::Raw::Zlib::Deflate ( -Bufsize => 300, + -Level => Z_BEST_SPEED ) ; + +=head2 B<$status = $d-Edeflate($input, $output)> + +Deflates the contents of C<$input> and writes the compressed data to +C<$output>. + +The C<$input> and C<$output> parameters can be either scalars or scalar +references. + +When finished, C<$input> will be completely processed (assuming there +were no errors). If the deflation was successful it writes the deflated +data to C<$output> and returns a status value of C. + +On error, it returns a I error code. + +If the C option is set to true in the constructor for +the C<$d> object, the compressed data will be appended to C<$output>. If +it is false, C<$output> will be truncated before any compressed data is +written to it. + +B: This method will not necessarily write compressed data to +C<$output> every time it is called. So do not assume that there has been +an error if the contents of C<$output> is empty on returning from +this method. As long as the return code from the method is C, +the deflate has succeeded. + +=head2 B<$status = $d-Eflush($output [, $flush_type]) > + +Typically used to finish the deflation. Any pending output will be +written to C<$output>. + +Returns C if successful. + +Note that flushing can seriously degrade the compression ratio, so it +should only be used to terminate a decompression (using C) or +when you want to create a I (using C). + +By default the C used is C. Other valid values +for C are C, C, C +and C. It is strongly recommended that you only set the +C parameter if you fully understand the implications of +what it does. See the C documentation for details. + +If the C option is set to true in the constructor for +the C<$d> object, the compressed data will be appended to C<$output>. If +it is false, C<$output> will be truncated before any compressed data is +written to it. + +=head2 B<$status = $d-EdeflateParams([OPT])> + +Change settings for the deflate object C<$d>. + +The list of the valid options is shown below. Options not specified +will remain unchanged. + +=over 5 + +=item B<-Level> + +Defines the compression level. Valid values are 0 through 9, +C, C, C, and +C. + +=item B<-Strategy> + +Defines the strategy used to tune the compression. The valid values are +C, C and C. + +=item B<-BufSize> + +Sets the initial size for the output buffer used by the C<$d-Edeflate> +and C<$d-Eflush> methods. If the buffer has to be +reallocated to increase the size, it will grow in increments of +C. + +=back + +=head2 B<$status = $d-EdeflateTune($good_length, $max_lazy, $nice_length, $max_chain)> + +Tune the internal settings for the deflate object C<$d>. This option is +only available if you are running zlib 1.2.2.3 or better. + +Refer to the documentation in zlib.h for instructions on how to fly +C. + +=head2 B<$d-Edict_adler()> + +Returns the adler32 value for the dictionary. + +=head2 B<$d-Ecrc32()> + +Returns the crc32 value for the uncompressed data to date. + +If the C option is not enabled in the constructor for this object, +this method will always return 0; + +=head2 B<$d-Eadler32()> + +Returns the adler32 value for the uncompressed data to date. + +=head2 B<$d-Emsg()> + +Returns the last error message generated by zlib. + +=head2 B<$d-Etotal_in()> + +Returns the total number of bytes uncompressed bytes input to deflate. + +=head2 B<$d-Etotal_out()> + +Returns the total number of compressed bytes output from deflate. + +=head2 B<$d-Eget_Strategy()> + +Returns the deflation strategy currently used. Valid values are +C, C and C. + +=head2 B<$d-Eget_Level()> + +Returns the compression level being used. + +=head2 B<$d-Eget_BufSize()> + +Returns the buffer size used to carry out the compression. + +=head2 Example + +Here is a trivial example of using C. It simply reads standard +input, deflates it and writes it to standard output. + + use strict ; + use warnings ; + + use Compress::Raw::Zlib ; + + binmode STDIN; + binmode STDOUT; + my $x = new Compress::Raw::Zlib::Deflate + or die "Cannot create a deflation stream\n" ; + + my ($output, $status) ; + while (<>) + { + $status = $x->deflate($_, $output) ; + + $status == Z_OK + or die "deflation failed\n" ; + + print $output ; + } + + $status = $x->flush($output) ; + + $status == Z_OK + or die "deflation failed\n" ; + + print $output ; + +=head1 Compress::Raw::Zlib::Inflate + +This section defines an interface that allows in-memory uncompression using +the I interface provided by zlib. + +Here is a definition of the interface: + +=head2 B< ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) > + +Initialises an inflation object. + +In a list context it returns the inflation object, C<$i>, and the +I status code (C<$status>). In a scalar context it returns the +inflation object only. + +If successful, C<$i> will hold the inflation object and C<$status> will +be C. + +If not successful, C<$i> will be I and C<$status> will hold the +I error code. + +The function optionally takes a number of named options specified as +C<< -Name => value >> pairs. This allows individual options to be +tailored without having to specify them all in the parameter list. + +For backward compatibility, it is also possible to pass the parameters +as a reference to a hash containing the C<< name=>value >> pairs. + +Here is a list of the valid options: + +=over 5 + +=item B<-WindowBits> + +To uncompress an RFC 1950 data stream, set C to a positive +number between 8 and 15. + +To uncompress an RFC 1951 data stream, set C to C<-MAX_WBITS>. + +To uncompress an RFC 1952 data stream (i.e. gzip), set C to +C. + +To auto-detect and uncompress an RFC 1950 or RFC 1952 data stream (i.e. +gzip), set C to C. + +For a full definition of the meaning and valid values for C +refer to the I documentation for I. + +Defaults to C. + +=item B<-Bufsize> + +Sets the initial size for the output buffer used by the C<$i-Einflate> +method. If the output buffer in this method has to be reallocated to +increase the size, it will grow in increments of C. + +Default is 4096. + +=item B<-Dictionary> + +The default is no dictionary. + +=item B<-AppendOutput> + +This option controls how data is written to the output buffer by the +C<$i-Einflate> method. + +If the option is set to false, the output buffer in the C<$i-Einflate> +method will be truncated before uncompressed data is written to it. + +If the option is set to true, uncompressed data will be appended to the +output buffer by the C<$i-Einflate> method. + +This option defaults to false. + +=item B<-CRC32> + +If set to true, a crc32 checksum of the uncompressed data will be +calculated. Use the C<$i-Ecrc32> method to retrieve this value. + +This option defaults to false. + +=item B<-ADLER32> + +If set to true, an adler32 checksum of the uncompressed data will be +calculated. Use the C<$i-Eadler32> method to retrieve this value. + +This option defaults to false. + +=item B<-ConsumeInput> + +If set to true, this option will remove compressed data from the input +buffer of the the C< $i-Einflate > method as the inflate progresses. + +This option can be useful when you are processing compressed data that is +embedded in another file/buffer. In this case the data that immediately +follows the compressed stream will be left in the input buffer. + +This option defaults to true. + +=back + +Here is an example of using an optional parameter to override the default +buffer size. + + my ($i, $status) = new Compress::Raw::Zlib::Inflate( -Bufsize => 300 ) ; + +=head2 B< $status = $i-Einflate($input, $output [,$eof]) > + +Inflates the complete contents of C<$input> and writes the uncompressed +data to C<$output>. The C<$input> and C<$output> parameters can either be +scalars or scalar references. + +Returns C if successful and C if the end of the +compressed data has been successfully reached. + +If not successful C<$status> will hold the I error code. + +If the C option has been set to true when the +C object is created, the C<$input> parameter +is modified by C. On completion it will contain what remains +of the input buffer after inflation. In practice, this means that when +the return status is C the C<$input> parameter will contain an +empty string, and when the return status is C the C<$input> +parameter will contains what (if anything) was stored in the input buffer +after the deflated data stream. + +This feature is useful when processing a file format that encapsulates +a compressed data stream (e.g. gzip, zip) and there is useful data +immediately after the deflation stream. + +If the C option is set to true in the constructor for +this object, the uncompressed data will be appended to C<$output>. If +it is false, C<$output> will be truncated before any uncompressed data +is written to it. + +The C<$eof> parameter needs a bit of explanation. + +Prior to version 1.2.0, zlib assumed that there was at least one trailing +byte immediately after the compressed data stream when it was carrying out +decompression. This normally isn't a problem because the majority of zlib +applications guarantee that there will be data directly after the +compressed data stream. For example, both gzip (RFC 1950) and zip both +define trailing data that follows the compressed data stream. + +The C<$eof> parameter only needs to be used if B of the following +conditions apply + +=over 5 + +=item 1 + +You are either using a copy of zlib that is older than version 1.2.0 or you +want your application code to be able to run with as many different +versions of zlib as possible. + +=item 2 + +You have set the C parameter to C<-MAX_WBITS> in the constructor +for this object, i.e. you are uncompressing a raw deflated data stream +(RFC 1951). + +=item 3 + +There is no data immediately after the compressed data stream. + +=back + +If B of these are the case, then you need to set the C<$eof> parameter +to true on the final call (and only the final call) to C<$i-Einflate>. + +If you have built this module with zlib >= 1.2.0, the C<$eof> parameter is +ignored. You can still set it if you want, but it won't be used behind the +scenes. + +=head2 B<$status = $i-EinflateSync($input)> + +This method can be used to attempt to recover good data from a compressed +data stream that is partially corrupt. +It scans C<$input> until it reaches either a I or the +end of the buffer. + +If a I is found, C is returned and C<$input> +will be have all data up to the flush point removed. This data can then be +passed to the C<$i-Einflate> method to be uncompressed. + +Any other return code means that a flush point was not found. If more +data is available, C can be called repeatedly with more +compressed data until the flush point is found. + +Note I are not present by default in compressed +data streams. They must have been added explicitly when the data stream +was created by calling C with C. + +=head2 B<$i-Edict_adler()> + +Returns the adler32 value for the dictionary. + +=head2 B<$i-Ecrc32()> + +Returns the crc32 value for the uncompressed data to date. + +If the C option is not enabled in the constructor for this object, +this method will always return 0; + +=head2 B<$i-Eadler32()> + +Returns the adler32 value for the uncompressed data to date. + +If the C option is not enabled in the constructor for this object, +this method will always return 0; + +=head2 B<$i-Emsg()> + +Returns the last error message generated by zlib. + +=head2 B<$i-Etotal_in()> + +Returns the total number of bytes compressed bytes input to inflate. + +=head2 B<$i-Etotal_out()> + +Returns the total number of uncompressed bytes output from inflate. + +=head2 B<$d-Eget_BufSize()> + +Returns the buffer size used to carry out the decompression. + +=head2 Example + +Here is an example of using C. + + use strict ; + use warnings ; + + use Compress::Raw::Zlib; + + my $x = new Compress::Raw::Zlib::Inflate() + or die "Cannot create a inflation stream\n" ; + + my $input = '' ; + binmode STDIN; + binmode STDOUT; + + my ($output, $status) ; + while (read(STDIN, $input, 4096)) + { + $status = $x->inflate(\$input, $output) ; + + print $output + if $status == Z_OK or $status == Z_STREAM_END ; + + last if $status != Z_OK ; + } + + die "inflation failed\n" + unless $status == Z_STREAM_END ; + +=head1 CHECKSUM FUNCTIONS + +Two functions are provided by I to calculate checksums. For the +Perl interface, the order of the two parameters in both functions has +been reversed. This allows both running checksums and one off +calculations to be done. + + $crc = adler32($buffer [,$crc]) ; + $crc = crc32($buffer [,$crc]) ; + +The buffer parameters can either be a scalar or a scalar reference. + +If the $crc parameters is C, the crc value will be reset. + +If you have built this module with zlib 1.2.3 or better, two more +CRC-related functions are available. + + $crc = adler32_combine($crc1, $crc2, $len2)l + $crc = crc32_combine($adler1, $adler2, $len2) + +These functions allow checksums to be merged. + +=head1 ACCESSING ZIP FILES + +Although it is possible (with some effort on your part) to use this +module to access .zip files, there is a module on CPAN that will do all +the hard work for you. Check out the C module on CPAN at + + http://www.cpan.org/modules/by-module/Archive/Archive-Zip-*.tar.gz + +=head1 CONSTANTS + +All the I constants are automatically imported when you make use +of I. + +=head1 SEE ALSO + +L, L, L, L, L, L, L, L, L, L, L, L, L, L, L + +L + +L, L, +L, +L + +For RFC 1950, 1951 and 1952 see +F, +F and +F + +The I compression library was written by Jean-loup Gailly +F and Mark Adler F. + +The primary site for the I compression library is +F. + +The primary site for gzip is F. + +=head1 AUTHOR + +This module was written by Paul Marquess, F. + +=head1 MODIFICATION HISTORY + +See the Changes file. + +=head1 COPYRIGHT AND LICENSE + +Copyright (c) 2005-2008 Paul Marquess. All rights reserved. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/pod/FAQ.pod b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/pod/FAQ.pod new file mode 100644 index 0000000..0a78bbb --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/pod/FAQ.pod @@ -0,0 +1,142 @@ + +=head1 NAME + +Compress::Raw::Zlib::FAQ -- Frequently Asked Questions about Compress::Raw::Zlib + +=head1 DESCRIPTION + +Common questions answered. + +=head2 Compatibility with Unix compress/uncompress. + +This module is not compatible with Unix C. + +If you have the C program available, you can use this to read +compressed files + + open F, "uncompress -c $filename |"; + while () + { + ... + +Alternatively, if you have the C program available, you can use +this to read compressed files + + open F, "gunzip -c $filename |"; + while () + { + ... + +and this to write compress files, if you have the C program +available + + open F, "| compress -c $filename "; + print F "data"; + ... + close F ; + +=head2 Accessing .tar.Z files + +See previous FAQ item. + +If the C module is installed and either the C or +C programs are available, you can use one of these workarounds to +read C<.tar.Z> files. + +Firstly with C + + use strict; + use warnings; + use Archive::Tar; + + open F, "uncompress -c $filename |"; + my $tar = Archive::Tar->new(*F); + ... + +and this with C + + use strict; + use warnings; + use Archive::Tar; + + open F, "gunzip -c $filename |"; + my $tar = Archive::Tar->new(*F); + ... + +Similarly, if the C program is available, you can use this to +write a C<.tar.Z> file + + use strict; + use warnings; + use Archive::Tar; + use IO::File; + + my $fh = new IO::File "| compress -c >$filename"; + my $tar = Archive::Tar->new(); + ... + $tar->write($fh); + $fh->close ; + +=head2 Accessing Zip Files + +This module does not support reading/writing zip files. + +Support for reading/writing zip files is included with the +C and C modules. + +The primary focus of the C and C +modules is to provide an C compatible streaming read/write +interface to zip files/buffers. They are not fully flegged archivers. If +you are looking for an archiver check out the C module. You +can find it on CPAN at + + http://www.cpan.org/modules/by-module/Archive/Archive-Zip-*.tar.gz + +=head2 Zlib Library Version Support + +By default C will build with a private copy of version +1.2.3 of the zlib library. (See the F file for details of +how to override this behaviour) + +If you decide to use a different version of the zlib library, you need to be +aware of the following issues + +=over 5 + +=item * + +First off, you must have zlib 1.0.5 or better. + +=item * + +You need to have zlib 1.2.1 or better if you want to use the C<-Merge> +option with C, C and +C. + +=back + +=head1 SEE ALSO + +L, L, L, L, L, L, L, L, L, L, L, L, L, L, L + +L + +L, L, +L, +L + +=head1 AUTHOR + +This module was written by Paul Marquess, F. + +=head1 MODIFICATION HISTORY + +See the Changes file. + +=head1 COPYRIGHT AND LICENSE + +Copyright (c) 2005-2008 Paul Marquess. All rights reserved. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/ppport.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/ppport.h new file mode 100644 index 0000000..d283a28 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/ppport.h @@ -0,0 +1,5820 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.10 + + Automatically created by Devel::PPPort running under perl 5.009004. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.10 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --version show version + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.9.4. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --version + +Display the version of F. + +=head2 --patch=I + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C or a C program to be installed. + +=head2 --diff=I + +Manually set the diff program and options to use. The default +is to use C, when installed, and output unified +context diffs. + +=head2 --compat-version=I + +Tell F to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F. +This reduces the size of F dramatically and may be useful +if you want to include F in smaller modules without +increasing their distribution size too much. + +The stripped F will have a C<--unstrip> option that allows +you to undo the stripping, but only if an appropriate C +module is installed. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I + +Show portability information for API elements matching I. +If I is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C prefix is deprecated. Also, +some API functions used to have a C prefix. Using this form is +also deprecated. You can safely use the supported API, as F +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F. + +These functions or variables will be marked C in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C or global +variants. + +For a C function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL + my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL + my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + sv_2pv_nolen() NEED_sv_2pv_nolen NEED_sv_2pv_nolen_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + warner() NEED_warner NEED_warner_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C +macro. Just C<#define> the macro before including C: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C. + +=back + +The good thing is that most of the above can be checked by running +F on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +To display portability information for the C function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F is causing failure during +the compilation of this module, please check if newer versions +of either this module or C are available on CPAN +before sending a bug report. + +If F was generated using the latest version of +C and is causing failure of this module, please +file a bug report using the CPAN Request Tracker at L. + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2006, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L. + +=cut + +use strict; + +my $VERSION = 3.10; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, + version => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip version + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +if ($opt{version}) { + print "This is $0 $VERSION.\n"; + exit 0; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +# Never use C comments in this file!!!!! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +AvFILLp|5.004050||p +AvFILL||| +CLASS|||n +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002||p +Copy||| +CvPADLIST||| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvSV||| +Gv_AMupdate||| +HEf_SVKEY||5.004000| +HeHASH||5.004000| +HeKEY||5.004000| +HeKLEN||5.004000| +HePV||5.004000| +HeSVKEY_force||5.004000| +HeSVKEY_set||5.004000| +HeSVKEY||5.004000| +HeVAL||5.004000| +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LVRET||| +MARK||| +MULTICALL||5.009004| +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002||p +Move||| +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +ORIGMARK||| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERL_ABS|5.008001||p +PERL_BCDVERSION|5.009004||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_INT_MAX|5.004000||p +PERL_INT_MIN|5.004000||p +PERL_LONG_MAX|5.004000||p +PERL_LONG_MIN|5.004000||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.007002||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.007002||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.007002||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.007002||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_QUAD_MAX|5.004000||p +PERL_QUAD_MIN|5.004000||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.004000||p +PERL_SHORT_MIN|5.004000||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_UCHAR_MAX|5.004000||p +PERL_UCHAR_MIN|5.004000||p +PERL_UINT_MAX|5.004000||p +PERL_UINT_MIN|5.004000||p +PERL_ULONG_MAX|5.004000||p +PERL_ULONG_MIN|5.004000||p +PERL_UNUSED_ARG|5.009003||p +PERL_UNUSED_CONTEXT|5.009004||p +PERL_UNUSED_DECL|5.007002||p +PERL_UNUSED_VAR|5.007002||p +PERL_UQUAD_MAX|5.004000||p +PERL_UQUAD_MIN|5.004000||p +PERL_USE_GCC_BRACE_GROUPS|5.009004||p +PERL_USHORT_MAX|5.004000||p +PERL_USHORT_MIN|5.004000||p +PERL_VERSION|5.006000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||n +PL_Sv|5.005000||p +PL_compiling|5.004050||p +PL_copline|5.005000||p +PL_curcop|5.004050||p +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_last_in_gv|||n +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofs_sv|||n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rsfp_filters|5.004050||p +PL_rsfp|5.004050||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +POP_MULTICALL||5.009004| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.009004| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_context_layers||5.009004| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Perl_warner_nocontext|5.006000||p +Perl_warner|5.006000||p +PoisonFree|5.009004||p +PoisonNew|5.009004||p +PoisonWith|5.009004||p +Poison|5.008000||p +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +STR_WITH_LEN|5.009003||p +ST||| +SVf|5.006000||p +SVt_IV||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVHV||| +SVt_PVMG||| +SVt_PV||| +Safefree||| +Slab_Alloc||| +Slab_Free||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGAMAGIC||5.006001| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_force_nomg|5.007002||p +SvPV_force||| +SvPV_nolen|5.006000||p +SvPV_nomg|5.007002||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec||| +SvREFCNT_inc_NN|5.009004||p +SvREFCNT_inc_simple_NN|5.009004||p +SvREFCNT_inc_simple_void_NN|5.009004||p +SvREFCNT_inc_simple_void|5.009004||p +SvREFCNT_inc_simple|5.009004||p +SvREFCNT_inc_void_NN|5.009004||p +SvREFCNT_inc_void|5.009004||p +SvREFCNT_inc|||p +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvSETMAGIC||| +SvSHARE||5.007003| +SvSTASH_set|5.009003||p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK||5.007001| +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +SvVSTRING_mg|5.009004||p +THIS|||n +UNDERBAR|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +WARN_ALL|5.006000||p +WARN_AMBIGUOUS|5.006000||p +WARN_ASSERTIONS|5.009000||p +WARN_BAREWORD|5.006000||p +WARN_CLOSED|5.006000||p +WARN_CLOSURE|5.006000||p +WARN_DEBUGGING|5.006000||p +WARN_DEPRECATED|5.006000||p +WARN_DIGIT|5.006000||p +WARN_EXEC|5.006000||p +WARN_EXITING|5.006000||p +WARN_GLOB|5.006000||p +WARN_INPLACE|5.006000||p +WARN_INTERNAL|5.006000||p +WARN_IO|5.006000||p +WARN_LAYER|5.008000||p +WARN_MALLOC|5.006000||p +WARN_MISC|5.006000||p +WARN_NEWLINE|5.006000||p +WARN_NUMERIC|5.006000||p +WARN_ONCE|5.006000||p +WARN_OVERFLOW|5.006000||p +WARN_PACK|5.006000||p +WARN_PARENTHESIS|5.006000||p +WARN_PIPE|5.006000||p +WARN_PORTABLE|5.006000||p +WARN_PRECEDENCE|5.006000||p +WARN_PRINTF|5.006000||p +WARN_PROTOTYPE|5.006000||p +WARN_QW|5.006000||p +WARN_RECURSION|5.006000||p +WARN_REDEFINE|5.006000||p +WARN_REGEXP|5.006000||p +WARN_RESERVED|5.006000||p +WARN_SEMICOLON|5.006000||p +WARN_SEVERE|5.006000||p +WARN_SIGNAL|5.006000||p +WARN_SUBSTR|5.006000||p +WARN_SYNTAX|5.006000||p +WARN_TAINT|5.006000||p +WARN_THREADS|5.008000||p +WARN_UNINITIALIZED|5.006000||p +WARN_UNOPENED|5.006000||p +WARN_UNPACK|5.006000||p +WARN_UNTIE|5.006000||p +WARN_UTF8|5.006000||p +WARN_VOID|5.006000||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002||p +XCPT_TRY_END|5.009002||p +XCPT_TRY_START|5.009002||p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_VERSION_BOOTCHECK||| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_pMY_CXT|5.007003||p +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHX_|5.006000||p +aTHX|5.006000||p +add_data|||n +addmad||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_i_ncmp||| +amagic_ncmp||| +any_dup||| +ao||| +append_elem||| +append_list||| +append_madprops||| +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_delete||5.006000| +av_exists||5.006000| +av_extend||| +av_fake||| +av_fetch||| +av_fill||| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_undef||| +av_unshift||| +ax|||n +bad_type||| +bind_match||| +block_end||| +block_gimme||5.004000| +block_start||| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_xsutils||| +bytes_from_utf8||5.007001| +bytes_to_uni|||n +bytes_to_utf8||5.006001| +call_argv|5.006000||p +call_atexit||5.006000| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +calloc||5.007002|n +cando||| +cast_i32||5.006000| +cast_iv||5.006000| +cast_ulong||5.006000| +cast_uv||5.006000| +check_type_and_open||| +check_uni||| +checkcomma||| +checkposixcc||| +ckWARN|5.006000||p +ck_anoncode||| +ck_bitop||| +ck_concat||| +ck_defined||| +ck_delete||| +ck_die||| +ck_eof||| +ck_eval||| +ck_exec||| +ck_exists||| +ck_exit||| +ck_ftst||| +ck_fun||| +ck_glob||| +ck_grep||| +ck_index||| +ck_join||| +ck_lengthconst||| +ck_lfun||| +ck_listiob||| +ck_match||| +ck_method||| +ck_null||| +ck_open||| +ck_repeat||| +ck_require||| +ck_retarget||| +ck_return||| +ck_rfun||| +ck_rvconst||| +ck_sassign||| +ck_say||| +ck_select||| +ck_shift||| +ck_sort||| +ck_spair||| +ck_split||| +ck_subr||| +ck_substr||| +ck_svconst||| +ck_trunc||| +ck_unpack||| +ckwarn_d||5.009003| +ckwarn||5.009003| +cl_and|||n +cl_anything|||n +cl_init_zero|||n +cl_init|||n +cl_is_anything|||n +cl_or|||n +clear_placeholders||| +closest_cop||| +convert||| +cop_free||| +cr_textfilter||| +create_eval_scope||| +croak_nocontext|||vn +croak|||v +csighandler||5.009003|n +curmad||| +custom_op_desc||5.007003| +custom_op_name||5.007003| +cv_ckproto_len||| +cv_ckproto||| +cv_clone||| +cv_const_sv||5.004000| +cv_dump||| +cv_undef||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dVAR|5.009003||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +debug_start_match||| +deb||5.007003|v +del_sv||| +delete_eval_scope||| +delimcpy||5.004000| +deprecate_old||| +deprecate||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_where||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_chop||| +do_close||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_kv||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_oddball||| +do_op_dump||5.006000| +do_op_xmldump||| +do_open9||5.006000| +do_openn||5.007001| +do_open||5.004000| +do_pipe||| +do_pmop_dump||5.006000| +do_pmop_xmldump||| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch_body||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptosub||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +dump_all||5.006000| +dump_eval||5.006000| +dump_exec_pos||| +dump_fds||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs||5.006000| +dump_sub||5.006000| +dump_sv_child||| +dump_trie_interim_list||| +dump_trie_interim_table||| +dump_trie||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_eaccess||| +eval_pv|5.006000||p +eval_sv|5.006000||p +exec_failed||| +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +fd_on_nosuid_fs||| +feature_is_enabled||| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +find_array_subscript||| +find_beginning||| +find_byclass||| +find_hash_subscript||| +find_in_my_stash||| +find_runcv||| +find_rundefsvoffset||5.009002| +find_script||| +find_uninit_var||| +first_symbol|||n +fold_constants||| +forbid_setid||| +force_ident||| +force_list||| +force_next||| +force_version||| +force_word||| +form_nocontext|||vn +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_arena||| +get_av|5.006000||p +get_context||5.006000|n +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +glob_2number||| +glob_2pv||| +glob_assign_glob||| +glob_assign_ref||| +gp_dup||| +gp_free||| +gp_ref||| +grok_bin|5.007003||p +grok_hex|5.007003||p +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_autoload4||5.004000| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.004000| +gv_efullname4||5.006001| +gv_efullname||| +gv_ename||| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags||5.009002| +gv_fetchpv||| +gv_fetchsv||5.009002| +gv_fullname3||5.004000| +gv_fullname4||5.006001| +gv_fullname||| +gv_handler||5.007001| +gv_init_sv||| +gv_init||| +gv_name_set||5.009004| +gv_stashpvn|5.004000||p +gv_stashpvs||5.009003| +gv_stashpv||| +gv_stashsv||| +he_dup||| +hek_dup||| +hfreeentries||| +hsplit||| +hv_assert||5.009001| +hv_auxinit|||n +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_copy_hints_hv||| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.004000| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_exists_ent||5.004000| +hv_exists||| +hv_fetch_common||| +hv_fetch_ent||5.004000| +hv_fetchs|5.009003||p +hv_fetch||| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.004000| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.004000| +hv_magic_check|||n +hv_magic_uvar_xkey||| +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||5.009003| +hv_placeholders_set||5.009003| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.004000| +hv_store_flags||5.008000| +hv_stores|5.009004||p +hv_store||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incl_perldb||| +incline||| +incpush_if_exists||| +incpush||| +ingroup||| +init_argv_symbols||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_lexer||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +instr||| +intro_my||| +intuit_method||| +intuit_more||| +invert||| +io_close||| +isALNUM||| +isALPHA||| +isDIGIT||| +isLOWER||| +isSPACE||| +isUPPER||| +is_an_int||| +is_gv_magical_sv||| +is_gv_magical||| +is_handle_constructor|||n +is_list_assignment||| +is_lvalue_sub||5.007001| +is_uni_alnum_lc||5.006000| +is_uni_alnumc_lc||5.006000| +is_uni_alnumc||5.006000| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_alnumc||5.006000| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_char_slow|||n +is_utf8_char||5.006000| +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003| +is_utf8_string_loc||5.008001| +is_utf8_string||5.006001| +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +isa_lookup||| +items|||n +ix|||n +jmaybe||| +join_exact||| +keyword||| +leave_scope||| +lex_end||| +lex_start||| +linklist||| +listkids||| +list||| +load_module_nocontext|||vn +load_module||5.006000|v +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHu|5.009002||p +mad_free||| +madlex||| +madparse||| +magic_clear_all_env||| +magic_clearenv||| +magic_clearhint||| +magic_clearpack||| +magic_clearsig||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_freeregexp||| +magic_getarylen||| +magic_getdefelem||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_len||| +magic_methcall||| +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setamagic||| +magic_setarylen||| +magic_setbm||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdefelem||| +magic_setenv||| +magic_setfm||| +magic_setglob||| +magic_sethint||| +magic_setisa||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +magicname||| +make_matcher||| +make_trie_failtable||| +make_trie||| +malloced_size|||n +malloc||5.007002|n +markstack_grow||| +matcher_matches_sv||| +measure_struct||| +memEQ|5.004000||p +memNE|5.004000||p +mem_collxfrm||| +mess_alloc||| +mess_nocontext|||vn +mess||5.006000|v +method_common||| +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_find||| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical||| +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002| +missingterm||| +mode_from_discipline||| +modkids||| +mod||| +more_bodies||| +more_sv||| +moreswitches||| +mul128||| +mulexp10|||n +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_betoh16|||n +my_betoh32|||n +my_betoh64|||n +my_betohi|||n +my_betohl|||n +my_betohs|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_init||| +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_htobe16|||n +my_htobe32|||n +my_htobe64|||n +my_htobei|||n +my_htobel|||n +my_htobes|||n +my_htole16|||n +my_htole32|||n +my_htole64|||n +my_htolei|||n +my_htolel|||n +my_htoles|||n +my_htonl||| +my_kid||| +my_letoh16|||n +my_letoh32|||n +my_letoh64|||n +my_letohi|||n +my_letohl|||n +my_letohs|||n +my_lstat||| +my_memcmp||5.004000|n +my_memset|||n +my_ntohl||| +my_pclose||5.004000| +my_popen_list||5.007001| +my_popen||5.004000| +my_setenv||| +my_snprintf|5.009004||pvn +my_socketpair||5.007003|n +my_sprintf||5.009003|vn +my_stat||| +my_strftime||5.007002| +my_strlcat|5.009004||pn +my_strlcpy|5.009004||pn +my_swabn|||n +my_swap||| +my_unexec||| +my_vsnprintf||5.009004|n +my||| +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB|5.004050||p +newCVREF||| +newDEFSVOP||| +newFORM||| +newFOROP||| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGP||| +newGVOP||| +newGVREF||| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMADPROP||| +newMADsv||| +newMYSUB||| +newNULLLIST||| +newOP||| +newPADOP||5.006000| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.004000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSUB||| +newSVOP||| +newSVREF||| +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_share||5.007001| +newSVpvn|5.004050||p +newSVpvs_share||5.009003| +newSVpvs|5.009003||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newTOKEN||| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.009003| +newXS_flags||5.009004| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +new_warnings_bitfield||| +next_symbol||| +nextargv||| +nextchar||| +ninstr||| +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +not_a_number||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +offer_nice_chunk||| +oopsAV||| +oopsCV||| +oopsHV||| +op_clear||| +op_const_sv||| +op_dump||5.006000| +op_free||| +op_getmad_weak||| +op_getmad||| +op_null||5.007002| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +op_xmldump||| +open_script||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +packWARN|5.007003||p +pack_cat||5.007003| +pack_rec||| +package||| +packlist||5.008001| +pad_add_anon||| +pad_add_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||| +pad_findlex||| +pad_findmy||| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||| +pad_peg|||n +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||5.009004| +pad_swipe||| +pad_tidy||| +pad_undef||| +parse_body||| +parse_unicode_opts||| +path_is_absolute|||n +peep||| +pending_ident||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pm_description||| +pmflag||| +pmop_dump||5.006000| +pmop_xmldump||| +pmruntime||| +pmtrans||| +pop_scope||| +pregcomp||| +pregexec||| +pregfree||| +prepend_elem||| +prepend_madprops||| +printbuf||| +printf_nocontext|||vn +ptr_table_clear||| +ptr_table_fetch||| +ptr_table_find|||n +ptr_table_free||| +ptr_table_new||| +ptr_table_split||| +ptr_table_store||| +push_scope||| +put_byte||| +pv_display||5.006000| +pv_escape||5.009004| +pv_pretty||5.009004| +pv_uni_display||5.007003| +qerror||| +qsortsvu||| +re_croak2||| +re_dup||| +re_intuit_start||5.006000| +re_intuit_string||5.006000| +realloc||5.007002|n +reentrant_free||| +reentrant_init||| +reentrant_retry|||vn +reentrant_size||| +ref_array_or_hash||| +refcounted_he_chain_2hv||| +refcounted_he_fetch||| +refcounted_he_free||| +refcounted_he_new||| +refcounted_he_value||| +refkids||| +refto||| +ref||5.009003| +reg_node||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.009004| +regclass||| +regcppop||| +regcppush||| +regcurly|||n +regdump||5.005000| +regexec_flags||5.005000| +reghop3|||n +reghopmaybe3|||n +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regpiece||| +regpposixcc||| +regprop||| +regrepeat||| +regtail_study||| +regtail||| +regtry||| +reguni||| +regwhite|||n +reg||| +repeatcpy||| +report_evil_fh||| +report_uninit||| +require_errno||| +require_pv||5.006000| +restore_magic||| +rninstr||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_aelem||5.004050| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hek_flags|||n +save_helem||5.004050| +save_hints||5.005000| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||| +save_padsv||5.007001| +save_pptr||| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_svref||| +save_vptr||5.006000| +savepvn||| +savepvs||5.009003| +savepv||| +savesharedpv||5.007003| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type|||n +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.008001| +scan_word||| +scope||| +screaminstr||5.005000| +seed||5.008001| +sequence_num||| +sequence_tail||| +sequence||| +set_context||5.006000|n +set_csh||| +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +setdefout||| +setenv_getix||| +share_hek_flags||| +share_hek||5.004000| +si_dup||| +sighandler|||n +simplify_sort||| +skipspace0||| +skipspace1||| +skipspace2||| +skipspace||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +space_join_names_mortal||| +ss_dup||| +stack_grow||| +start_force||| +start_glob||| +start_subparse||5.004000| +stashpv_hvname_match||5.009004| +stdize_locale||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +stringify_regexp||| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_common||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2nv||| +sv_2pv_flags||5.007002| +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen||| +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff||| +sv_bless||| +sv_cat_decode||5.008001| +sv_catpv_mg|5.004050||p +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpvs|5.009003||p +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_catxmlpvn||| +sv_catxmlsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm||| +sv_compile_2op||5.008001| +sv_copypv||5.007003| +sv_dec||| +sv_del_backref||| +sv_derived_from||5.004000| +sv_does||5.009004| +sv_dump||| +sv_dup||| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_gets||5.004000| +sv_grow||| +sv_i_ncmp||| +sv_inc||| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8||5.006000| +sv_len||| +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||| +sv_nv||5.005000| +sv_peek||5.005000| +sv_pos_b2u_forwards||| +sv_pos_b2u_midway||| +sv_pos_b2u||5.006000| +sv_pos_u2b_cached||| +sv_pos_u2b_forwards|||n +sv_pos_u2b_midway|||n +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags||5.007002| +sv_pvn_force|||p +sv_pvn_nomg|5.007003||p +sv_pvn|5.005000||p +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_release_COW||| +sv_release_IVX||| +sv_replace||| +sv_report_used||| +sv_reset||| +sv_rvweaken||5.006000| +sv_setiv_mg|5.004050||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.004050||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.004050||p +sv_setpvn||| +sv_setpvs|5.009004||p +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.004050||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.004050||p +sv_setuv|5.004000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_flags||5.009004| +sv_usepvn_mg|5.004050||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.005000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +sv_xmlpeek||| +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_get||| +swash_init||5.006000| +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +taint_env||| +taint_proper||| +tmps_grow||5.006000| +toLOWER||| +toUPPER||| +to_byte_substr||| +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.007003| +to_utf8_lower||5.007003| +to_utf8_substr||| +to_utf8_title||5.007003| +to_utf8_upper||5.007003| +token_free||| +token_getmad||| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments||| +too_many_arguments||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.004000| +unwind_handler_stack||| +upg_version||5.009000| +usage||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000| +utf8_length||5.007001| +utf8_mg_pos_cache_update||| +utf8_to_bytes||5.006001| +utf8_to_uvchr||5.007001| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vdie_common||| +vdie_croak_common||| +vdie||| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module||5.006000| +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warner_nocontext|||vn +warner|5.006000|5.004000|pv +warn|||v +watch||| +whichsig||| +write_no_mem||| +write_to_stderr||| +xmldump_all||| +xmldump_attr||| +xmldump_eval||| +xmldump_form||| +xmldump_indent|||v +xmldump_packsubs||| +xmldump_sub||| +xmldump_vindent||| +yyerror||| +yylex||| +yyparse||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %depends); +my $replace = 0; +my $hint = ''; + +while () { + if ($hint) { + if (m{^\s*\*\s(.*?)\s*$}) { + $hints{$hint} ||= ''; # suppress warning with older perls + $hints{$hint} .= "$1\n"; + } + else { + $hint = ''; + } + } + $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2; + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "$hints{$f}" if exists $hints{$f}; + $info++; + } + unless ($info) { + print "No portability information available.\n"; + } + $count++; + } + if ($count > 0) { + print "\n"; + } + else { + print "Found no API matching '$opt{'api-info'}'.\n"; + } + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( xs c h cc cpp ); +my $srcext = join '|', @srcext; + +if (@ARGV) { + my %seen; + @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV; +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /\.($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*.$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +unless (@files) { + die "No input files given!\n"; +} + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; }; + close IN; + + my %file = (orig => $c, changes => 0); + + # temporarily remove C comments from the code + my @ccom; + $c =~ s{ + ( + [^"'/]+ + | + (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+ + | + (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+ + ) + | + (/ (?: + \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / + | + /[^\r\n]* + )) + }{ + defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce"; + }egsx; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/); + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + if (exists $need{$_}) { + $file{needs}{$_} = 'static'; + } + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { + warning("Possibly wrong #define $1 in $filename"); + } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses}}) { + next unless $file{uses}{$func}; # if it's only a dependency + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + elsif (exists $replace{$func}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + else { + diag("Uses $func"); + } + hint($func); + } + + for $func (sort keys %{$file{uses_todo}}) { + warning("Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo})); + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and can_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <
$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while () { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub can_use +{ + eval "use @_;"; + return $@ eq ''; +} + +sub rec_depend +{ + my $func = shift; + my %seen; + return () unless exists $depends{$func}; + grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +sub hint +{ + $opt{quiet} and return; + $opt{hints} or return; + my $func = shift; + exists $hints{$func} or return; + $given_hints{$func}++ and return; + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print < }; + my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; + $copy =~ s/^(?=\S+)/ /gms; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + if (\$Devel::PPPort::VERSION < $VERSION) { + die "$0 was originally generated with Devel::PPPort $VERSION.\\n" + . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" + . "Please install a newer version, or --unstrip will not work.\\n"; + } + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <$0" or die "cannot strip $0: $!\n"; + print OUT $self; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ + +#ifdef I_LIMITS +# include +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +# ifdef SHORT_MAX +# define PERL_SHORT_MAX ((short)SHORT_MAX) +# else +# ifdef MAXSHORT /* Often used in */ +# define PERL_SHORT_MAX ((short)MAXSHORT) +# else +# ifdef SHRT_MAX +# define PERL_SHORT_MAX ((short)SHRT_MAX) +# else +# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MIN +# ifdef SHORT_MIN +# define PERL_SHORT_MIN ((short)SHORT_MIN) +# else +# ifdef MINSHORT +# define PERL_SHORT_MIN ((short)MINSHORT) +# else +# ifdef SHRT_MIN +# define PERL_SHORT_MIN ((short)SHRT_MIN) +# else +# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +#ifndef PERL_UINT_MAX +# ifdef UINT_MAX +# define PERL_UINT_MAX ((unsigned int)UINT_MAX) +# else +# ifdef MAXUINT +# define PERL_UINT_MAX ((unsigned int)MAXUINT) +# else +# define PERL_UINT_MAX (~(unsigned int)0) +# endif +# endif +#endif + +#ifndef PERL_UINT_MIN +# define PERL_UINT_MIN ((unsigned int)0) +#endif + +#ifndef PERL_INT_MAX +# ifdef INT_MAX +# define PERL_INT_MAX ((int)INT_MAX) +# else +# ifdef MAXINT /* Often used in */ +# define PERL_INT_MAX ((int)MAXINT) +# else +# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_INT_MIN +# ifdef INT_MIN +# define PERL_INT_MIN ((int)INT_MIN) +# else +# ifdef MININT +# define PERL_INT_MIN ((int)MININT) +# else +# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MAX +# ifdef ULONG_MAX +# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) +# else +# ifdef MAXULONG +# define PERL_ULONG_MAX ((unsigned long)MAXULONG) +# else +# define PERL_ULONG_MAX (~(unsigned long)0) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MIN +# define PERL_ULONG_MIN ((unsigned long)0L) +#endif + +#ifndef PERL_LONG_MAX +# ifdef LONG_MAX +# define PERL_LONG_MAX ((long)LONG_MAX) +# else +# ifdef MAXLONG +# define PERL_LONG_MAX ((long)MAXLONG) +# else +# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_LONG_MIN +# ifdef LONG_MIN +# define PERL_LONG_MIN ((long)LONG_MIN) +# else +# ifdef MINLONG +# define PERL_LONG_MIN ((long)MINLONG) +# else +# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) +# ifndef PERL_UQUAD_MAX +# ifdef ULONGLONG_MAX +# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) +# else +# ifdef MAXULONGLONG +# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) +# else +# define PERL_UQUAD_MAX (~(unsigned long long)0) +# endif +# endif +# endif + +# ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN ((unsigned long long)0L) +# endif + +# ifndef PERL_QUAD_MAX +# ifdef LONGLONG_MAX +# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) +# else +# ifdef MAXLONGLONG +# define PERL_QUAD_MAX ((long long)MAXLONGLONG) +# else +# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) +# endif +# endif +# endif + +# ifndef PERL_QUAD_MIN +# ifdef LONGLONG_MIN +# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) +# else +# ifdef MINLONGLONG +# define PERL_QUAD_MIN ((long long)MINLONGLONG) +# else +# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +/* This is based on code from 5.003 perl.h */ +#ifdef HAS_QUAD +# ifdef cray +#ifndef IVTYPE +# define IVTYPE int +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_INT_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_INT_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UINT_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UINT_MAX +#endif + +# ifdef INTSIZE +#ifndef IVSIZE +# define IVSIZE INTSIZE +#endif + +# endif +# else +# if defined(convex) || defined(uts) +#ifndef IVTYPE +# define IVTYPE long long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_QUAD_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_QUAD_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UQUAD_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UQUAD_MAX +#endif + +# ifdef LONGLONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGLONGSIZE +#endif + +# endif +# else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +# ifdef LONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGSIZE +#endif + +# endif +# endif +# endif +#ifndef IVSIZE +# define IVSIZE 8 +#endif + +#ifndef PERL_QUAD_MIN +# define PERL_QUAD_MIN IV_MIN +#endif + +#ifndef PERL_QUAD_MAX +# define PERL_QUAD_MAX IV_MAX +#endif + +#ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN UV_MIN +#endif + +#ifndef PERL_UQUAD_MAX +# define PERL_UQUAD_MAX UV_MAX +#endif + +#else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif +#ifndef UVTYPE +# define UVTYPE unsigned IVTYPE +#endif + +#ifndef UVSIZE +# define UVSIZE IVSIZE +#endif +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) +/* Replace: 1 */ +# define PL_DBsingle DBsingle +# define PL_DBsub DBsub +# define PL_Sv Sv +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_debstash debstash +# define PL_defgv defgv +# define PL_diehook diehook +# define PL_dirty dirty +# define PL_dowarn dowarn +# define PL_errgv errgv +# define PL_hexdigit hexdigit +# define PL_hints hints +# define PL_na na +# define PL_no_modify no_modify +# define PL_perl_destruct_level perl_destruct_level +# define PL_perldb perldb +# define PL_ppaddr ppaddr +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stack_base stack_base +# define PL_stack_sp stack_sp +# define PL_stdingv stdingv +# define PL_sv_arenaroot sv_arenaroot +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +# define PL_tainted tainted +# define PL_tainting tainting +/* Replace: 0 */ +#endif + +#ifndef PERL_UNUSED_DECL +# ifdef HASATTRIBUTE +# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) +# define PERL_UNUSED_DECL +# else +# define PERL_UNUSED_DECL __attribute__((unused)) +# endif +# else +# define PERL_UNUSED_DECL +# endif +#endif + +#ifndef PERL_UNUSED_ARG +# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ +# include +# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) +# else +# define PERL_UNUSED_ARG(x) ((void)x) +# endif +#endif + +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(x) ((void)x) +#endif + +#ifndef PERL_UNUSED_CONTEXT +# ifdef USE_ITHREADS +# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) +# else +# define PERL_UNUSED_CONTEXT +# endif +#endif +#ifndef NOOP +# define NOOP /*EMPTY*/(void)0 +#endif + +#ifndef dNOOP +# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef INT2PTR + +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif + +# define NUM2PTR(any,d) (any)(PTRV)(d) +# define PTR2IV(p) INT2PTR(IV,p) +# define PTR2UV(p) INT2PTR(UV,p) +# define PTR2NV(p) NUM2PTR(NV,p) + +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif + +#endif /* !INT2PTR */ + +#undef START_EXTERN_C +#undef END_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C extern +#endif + +#if defined(PERL_GCC_PEDANTIC) +# 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 +# endif +#endif + +#undef STMT_START +#undef STMT_END +#ifdef PERL_USE_GCC_BRACE_GROUPS +# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ +# define STMT_END ) +#else +# if defined(VOIDFLAGS) && (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 +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +/* DEFSV appears first in 5.004_56 */ +#ifndef DEFSV +# define DEFSV GvSV(PL_defgv) +#endif + +#ifndef SAVE_DEFSV +# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) +#endif + +/* Older perls (<=5.003) lack AvFILLp */ +#ifndef AvFILLp +# define AvFILLp AvFILL +#endif +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif +#ifndef newSVpvn +# define newSVpvn(data,len) ((data) \ + ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ + : newSV(0)) +#endif + +/* Hint: gv_stashpvn + * This function's backport doesn't support the length parameter, but + * rather ignores it. Portability can only be ensured if the length + * parameter is used for speed reasons, but the length can always be + * correctly computed from the string argument. + */ +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,create) gv_stashpv(str,create) +#endif + +/* Replace: 1 */ +#ifndef get_cv +# define get_cv perl_get_cv +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef get_av +# define get_av perl_get_av +#endif + +#ifndef get_hv +# define get_hv perl_get_hv +#endif + +/* Replace: 0 */ +#ifndef dUNDERBAR +# define dUNDERBAR dNOOP +#endif + +#ifndef UNDERBAR +# define UNDERBAR DEFSV +#endif +#ifndef dAX +# define dAX I32 ax = MARK - PL_stack_base + 1 +#endif + +#ifndef dITEMS +# define dITEMS I32 items = SP - MARK +#endif +#ifndef dXSTARG +# define dXSTARG SV * targ = sv_newmortal() +#endif +#ifndef dAXMARK +# define dAXMARK I32 ax = POPMARK; \ + register SV ** const mark = PL_stack_base + ax++ +#endif +#ifndef XSprePUSH +# define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#if ((PERL_VERSION < 5) || ((PERL_VERSION == 5) && (PERL_SUBVERSION < 0))) +# undef XSRETURN +# define XSRETURN(off) \ + STMT_START { \ + PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ + return; \ + } STMT_END +#endif +#ifndef PERL_ABS +# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) +#endif +#ifndef dVAR +# define dVAR dNOOP +#endif +#ifndef SVf +# define SVf "_" +#endif + +#ifndef PERL_SIGNALS_UNSAFE_FLAG + +#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 + +#if defined(NEED_PL_signals) +static U32 DPPP_(my_PL_signals) = PERL_SIGNALS_UNSAFE_FLAG; +#elif defined(NEED_PL_signals_GLOBAL) +U32 DPPP_(my_PL_signals) = PERL_SIGNALS_UNSAFE_FLAG; +#else +extern U32 DPPP_(my_PL_signals); +#endif +#define PL_signals DPPP_(my_PL_signals) + +#endif +#ifndef dTHR +# define dTHR dNOOP +#endif +#ifndef dTHX +# define dTHX dNOOP +#endif + +#ifndef dTHXa +# define dTHXa(x) dNOOP +#endif +#ifndef pTHX +# define pTHX void +#endif + +#ifndef pTHX_ +# define pTHX_ +#endif + +#ifndef aTHX +# define aTHX +#endif + +#ifndef aTHX_ +# define aTHX_ +#endif +#ifndef dTHXoa +# define dTHXoa(x) dTHXa(x) +#endif +#ifndef PUSHmortal +# define PUSHmortal PUSHs(sv_newmortal()) +#endif + +#ifndef mPUSHp +# define mPUSHp(p,l) sv_setpvn_mg(PUSHmortal, (p), (l)) +#endif + +#ifndef mPUSHn +# define mPUSHn(n) sv_setnv_mg(PUSHmortal, (NV)(n)) +#endif + +#ifndef mPUSHi +# define mPUSHi(i) sv_setiv_mg(PUSHmortal, (IV)(i)) +#endif + +#ifndef mPUSHu +# define mPUSHu(u) sv_setuv_mg(PUSHmortal, (UV)(u)) +#endif +#ifndef XPUSHmortal +# define XPUSHmortal XPUSHs(sv_newmortal()) +#endif + +#ifndef mXPUSHp +# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END +#endif + +#ifndef mXPUSHn +# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END +#endif + +#ifndef mXPUSHi +# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END +#endif + +#ifndef mXPUSHu +# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END +#endif + +/* Replace: 1 */ +#ifndef call_sv +# define call_sv perl_call_sv +#endif + +#ifndef call_pv +# define call_pv perl_call_pv +#endif + +#ifndef call_argv +# define call_argv perl_call_argv +#endif + +#ifndef call_method +# define call_method perl_call_method +#endif +#ifndef eval_sv +# define eval_sv perl_eval_sv +#endif + +/* Replace: 0 */ + +/* Replace perl_eval_pv with eval_pv */ +/* eval_pv depends on eval_sv */ + +#ifndef eval_pv +#if defined(NEED_eval_pv) +static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +static +#else +extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +#endif + +#ifdef eval_pv +# undef eval_pv +#endif +#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) +#define Perl_eval_pv DPPP_(my_eval_pv) + +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + +SV* +DPPP_(my_eval_pv)(char *p, I32 croak_on_error) +{ + dSP; + SV* sv = newSVpv(p, 0); + + PUSHMARK(sp); + eval_sv(sv, G_SCALAR); + SvREFCNT_dec(sv); + + SPAGAIN; + sv = POPs; + PUTBACK; + + if (croak_on_error && SvTRUE(GvSV(errgv))) + croak(SvPVx(GvSV(errgv), na)); + + return sv; +} + +#endif +#endif +#ifndef newRV_inc +# define newRV_inc(sv) newRV(sv) /* Replace */ +#endif + +#ifndef newRV_noinc +#if defined(NEED_newRV_noinc) +static SV * DPPP_(my_newRV_noinc)(SV *sv); +static +#else +extern SV * DPPP_(my_newRV_noinc)(SV *sv); +#endif + +#ifdef newRV_noinc +# undef newRV_noinc +#endif +#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) +#define Perl_newRV_noinc DPPP_(my_newRV_noinc) + +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) +SV * +DPPP_(my_newRV_noinc)(SV *sv) +{ + SV *rv = (SV *)newRV(sv); + SvREFCNT_dec(sv); + return rv; +} +#endif +#endif + +/* Hint: newCONSTSUB + * Returns a CV* as of perl-5.7.1. This return value is not supported + * by Devel::PPPort. + */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5)) +#if defined(NEED_newCONSTSUB) +static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv); +static +#else +extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv); +#endif + +#ifdef newCONSTSUB +# undef newCONSTSUB +#endif +#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) +#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + +void +DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv) +{ + U32 oldhints = PL_hints; + HV *old_cop_stash = PL_curcop->cop_stash; + HV *old_curstash = PL_curstash; + line_t oldline = PL_curcop->cop_line; + PL_curcop->cop_line = PL_copline; + + PL_hints &= ~HINT_BLOCK_SCOPE; + if (stash) + PL_curstash = PL_curcop->cop_stash = stash; + + newSUB( + +#if ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22))) + start_subparse(), +#elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22)) + start_subparse(0), +#else /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +#endif + + newSVOP(OP_CONST, 0, newSVpv(name,0)), + newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ + newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) + ); + + PL_hints = oldhints; + PL_curcop->cop_stash = old_cop_stash; + PL_curstash = old_curstash; + PL_curcop->cop_line = oldline; +} +#endif +#endif + +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ + defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) + +#ifndef START_MY_CXT + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 68))) +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) +#else /* >= perl5.004_68 */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) +#endif /* < perl5.004_68 */ + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +/* Clones the per-interpreter data. */ +#define MY_CXT_CLONE \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) +#endif + +#else /* single interpreter */ + +#ifndef START_MY_CXT + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +#define MY_CXT_CLONE NOOP +#endif + +#endif + +#ifndef IVdf +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# define UVuf "lu" +# define UVof "lo" +# define UVxf "lx" +# define UVXf "lX" +# else +# if IVSIZE == INTSIZE +# define IVdf "d" +# define UVuf "u" +# define UVof "o" +# define UVxf "x" +# define UVXf "X" +# endif +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */ +# define NVef PERL_PRIeldbl +# define NVff PERL_PRIfldbl +# define NVgf PERL_PRIgldbl +# else +# define NVef "e" +# define NVff "f" +# define NVgf "g" +# endif +#endif + +#ifndef SvREFCNT_inc +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (SvREFCNT(_sv))++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc(sv) \ + ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_simple +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_simple(sv) \ + ({ \ + if (sv) \ + (SvREFCNT(sv))++; \ + (SV *)(sv); \ + }) +# else +# define SvREFCNT_inc_simple(sv) \ + ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_NN +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_NN(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + SvREFCNT(_sv)++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc_NN(sv) \ + (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) +# endif +#endif + +#ifndef SvREFCNT_inc_void +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_void(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (void)(SvREFCNT(_sv)++); \ + }) +# else +# define SvREFCNT_inc_void(sv) \ + (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) +# endif +#endif +#ifndef SvREFCNT_inc_simple_void +# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#endif + +#ifndef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) +#endif + +#ifndef SvREFCNT_inc_void_NN +# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvPV_nolen + +#if defined(NEED_sv_2pv_nolen) +static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv); +static +#else +extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv); +#endif + +#ifdef sv_2pv_nolen +# undef sv_2pv_nolen +#endif +#define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a) +#define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen) + +#if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL) + +char * +DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv) +{ + STRLEN n_a; + return sv_2pv(sv, &n_a); +} + +#endif + +/* Hint: sv_2pv_nolen + * Use the SvPV_nolen() macro instead of sv_2pv_nolen(). + */ + +/* SvPV_nolen depends on sv_2pv_nolen */ +#define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_nolen(sv)) + +#endif + +#ifdef SvPVbyte + +/* Hint: SvPVbyte + * Does not work in perl-5.6.1, ppport.h implements a version + * borrowed from perl-5.7.3. + */ + +#if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0))) + +#if defined(NEED_sv_2pvbyte) +static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp); +static +#else +extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp); +#endif + +#ifdef sv_2pvbyte +# undef sv_2pvbyte +#endif +#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) +#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) + +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + +char * +DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp) +{ + sv_utf8_downgrade(sv,0); + return SvPV(sv,*lp); +} + +#endif + +/* Hint: sv_2pvbyte + * Use the SvPVbyte() macro instead of sv_2pvbyte(). + */ + +#undef SvPVbyte + +/* SvPVbyte depends on sv_2pvbyte */ +#define SvPVbyte(sv, lp) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + +#endif + +#else + +# define SvPVbyte SvPV +# define sv_2pvbyte sv_2pv + +#endif + +/* sv_2pvbyte_nolen depends on sv_2pv_nolen */ +#ifndef sv_2pvbyte_nolen +# define sv_2pvbyte_nolen sv_2pv_nolen +#endif + +/* Hint: sv_pvn + * Always use the SvPV() macro instead of sv_pvn(). + */ +#ifndef sv_pvn +# define sv_pvn(sv, len) SvPV(sv, len) +#endif + +/* Hint: sv_pvn_force + * Always use the SvPV_force() macro instead of sv_pvn_force(). + */ +#ifndef sv_pvn_force +# define sv_pvn_force(sv, len) SvPV_force(sv, len) +#endif +#ifndef SvMAGIC_set +# define SvMAGIC_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END +#endif + +#if ((PERL_VERSION < 9) || ((PERL_VERSION == 9) && (PERL_SUBVERSION < 3))) +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) (0 + SvPVX(sv)) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END +#endif + +#else +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + ((sv)->sv_u.svu_rv = (val)); } STMT_END +#endif + +#endif +#ifndef SvSTASH_set +# define SvSTASH_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END +#endif + +#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 0))) +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END +#endif + +#else +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END +#endif + +#endif + +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf) +#if defined(NEED_vnewSVpvf) +static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args); +static +#else +extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args); +#endif + +#ifdef vnewSVpvf +# undef vnewSVpvf +#endif +#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) +#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) + +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + +SV * +DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) +{ + register SV *sv = newSV(0); + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); + return sv; +} + +#endif +#endif + +/* sv_vcatpvf depends on sv_vcatpvfn */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf) +# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +/* sv_vsetpvf depends on sv_vsetpvfn */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf) +# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +/* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg) +#if defined(NEED_sv_catpvf_mg) +static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +#endif + +#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) + +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +/* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */ +#ifdef PERL_IMPLICIT_CONTEXT +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext) +#if defined(NEED_sv_catpvf_mg_nocontext) +static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...); +#endif + +#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) +#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) + +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +#ifndef sv_catpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# else +# define sv_catpvf_mg Perl_sv_catpvf_mg +# endif +#endif + +/* sv_vcatpvf_mg depends on sv_vcatpvfn */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg) +# define sv_vcatpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +/* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg) +#if defined(NEED_sv_setpvf_mg) +static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...); +#endif + +#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) + +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +/* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */ +#ifdef PERL_IMPLICIT_CONTEXT +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext) +#if defined(NEED_sv_setpvf_mg_nocontext) +static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...); +#endif + +#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) +#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) + +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +#ifndef sv_setpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# else +# define sv_setpvf_mg Perl_sv_setpvf_mg +# endif +#endif + +/* sv_vsetpvf_mg depends on sv_vsetpvfn */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg) +# define sv_vsetpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +/* warner depends on vnewSVpvf */ +#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#define Perl_warner DPPP_(my_warner) + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +/* Perl_warner_nocontext depends on warner */ +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +/* concatenating with "" ensures that only literal strings are accepted as argument + * note that STR_WITH_LEN() can't be used as argument to macros or functions that + * under some configurations might be macros + */ +#ifndef STR_WITH_LEN +# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) +#endif +#ifndef newSVpvs +# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) +#endif + +#ifndef sv_catpvs +# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef sv_setpvs +# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef hv_fetchs +# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) +#endif + +#ifndef hv_stores +# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) +#endif +#ifndef SvGETMAGIC +# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END +#endif +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +/* That's the best we can do... */ +#ifndef SvPV_force_nomg +# define SvPV_force_nomg SvPV_force +#endif + +#ifndef SvPV_nomg +# define SvPV_nomg SvPV +#endif + +#ifndef sv_catpvn_nomg +# define sv_catpvn_nomg sv_catpvn +#endif + +#ifndef sv_catsv_nomg +# define sv_catsv_nomg sv_catsv +#endif + +#ifndef sv_setsv_nomg +# define sv_setsv_nomg sv_setsv +#endif + +#ifndef sv_pvn_nomg +# define sv_pvn_nomg sv_pvn +#endif + +#ifndef SvIV_nomg +# define SvIV_nomg SvIV +#endif + +#ifndef SvUV_nomg +# define SvUV_nomg SvUV +#endif + +#ifndef sv_catpv_mg +# define sv_catpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catpvn_mg +# define sv_catpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catsv_mg +# define sv_catsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_catsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setiv_mg +# define sv_setiv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setiv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setnv_mg +# define sv_setnv_mg(sv, num) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setnv(TeMpSv,num); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpv_mg +# define sv_setpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpvn_mg +# define sv_setpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setsv_mg +# define sv_setsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_setsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setuv_mg +# define sv_setuv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setuv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_usepvn_mg +# define sv_usepvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_usepvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif +#ifndef SvVSTRING_mg +# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) +#endif + +#ifdef USE_ITHREADS +#ifndef CopFILE +# define CopFILE(c) ((c)->cop_file) +#endif + +#ifndef CopFILEGV +# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) ((c)->cop_stashpv) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ + || (CopSTASHPV(c) && HvNAME(hv) \ + && strEQ(CopSTASHPV(c), HvNAME(hv))))) +#endif + +#else +#ifndef CopFILEGV +# define CopFILEGV(c) ((c)->cop_filegv) +#endif + +#ifndef CopFILEGV_set +# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) +#endif + +#ifndef CopFILE +# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) ((c)->cop_stash) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) +#endif + +#endif /* USE_ITHREADS */ +#ifndef IN_PERL_COMPILETIME +# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) +#endif + +#ifndef IN_LOCALE_RUNTIME +# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE_COMPILETIME +# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE +# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) +#endif +#ifndef IS_NUMBER_IN_UV +# define IS_NUMBER_IN_UV 0x01 +#endif + +#ifndef IS_NUMBER_GREATER_THAN_UV_MAX +# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef IS_NUMBER_NOT_INT +# define IS_NUMBER_NOT_INT 0x04 +#endif + +#ifndef IS_NUMBER_NEG +# define IS_NUMBER_NEG 0x08 +#endif + +#ifndef IS_NUMBER_INFINITY +# define IS_NUMBER_INFINITY 0x10 +#endif + +#ifndef IS_NUMBER_NAN +# define IS_NUMBER_NAN 0x20 +#endif + +/* GROK_NUMERIC_RADIX depends on grok_numeric_radix */ +#ifndef GROK_NUMERIC_RADIX +# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +#endif +#ifndef PERL_SCAN_GREATER_THAN_UV_MAX +# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef PERL_SCAN_SILENT_ILLDIGIT +# define PERL_SCAN_SILENT_ILLDIGIT 0x04 +#endif + +#ifndef PERL_SCAN_ALLOW_UNDERSCORES +# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 +#endif + +#ifndef PERL_SCAN_DISALLOW_PREFIX +# define PERL_SCAN_DISALLOW_PREFIX 0x02 +#endif + +#ifndef grok_numeric_radix +#if defined(NEED_grok_numeric_radix) +static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +static +#else +extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +#endif + +#ifdef grok_numeric_radix +# undef grok_numeric_radix +#endif +#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) +#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) + +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) +bool +DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) +{ +#ifdef USE_LOCALE_NUMERIC +#ifdef PL_numeric_radix_sv + if (PL_numeric_radix_sv && IN_LOCALE) { + STRLEN len; + char* radix = SvPV(PL_numeric_radix_sv, len); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#else + /* older perls don't have PL_numeric_radix_sv so the radix + * must manually be requested from locale.h + */ +#include + dTHR; /* needed for older threaded perls */ + struct lconv *lc = localeconv(); + char *radix = lc->decimal_point; + if (radix && IN_LOCALE) { + STRLEN len = strlen(radix); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#endif +#endif /* USE_LOCALE_NUMERIC */ + /* always try "." if numeric radix didn't match because + * we may have data from different locales mixed */ + if (*sp < send && **sp == '.') { + ++*sp; + return TRUE; + } + return FALSE; +} +#endif +#endif + +/* grok_number depends on grok_numeric_radix */ + +#ifndef grok_number +#if defined(NEED_grok_number) +static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +static +#else +extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +#endif + +#ifdef grok_number +# undef grok_number +#endif +#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) +#define Perl_grok_number DPPP_(my_grok_number) + +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) +int +DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) +{ + const char *s = pv; + const char *send = pv + len; + const UV max_div_10 = UV_MAX / 10; + const char max_mod_10 = UV_MAX % 10; + int numtype = 0; + int sawinf = 0; + int sawnan = 0; + + while (s < send && isSPACE(*s)) + s++; + if (s == send) { + return 0; + } else if (*s == '-') { + s++; + numtype = IS_NUMBER_NEG; + } + else if (*s == '+') + s++; + + if (s == send) + return 0; + + /* next must be digit or the radix separator or beginning of infinity */ + if (isDIGIT(*s)) { + /* UVs are at least 32 bits, so the first 9 decimal digits cannot + overflow. */ + UV value = *s - '0'; + /* This construction seems to be more optimiser friendly. + (without it gcc does the isDIGIT test and the *s - '0' separately) + With it gcc on arm is managing 6 instructions (6 cycles) per digit. + In theory the optimiser could deduce how far to unroll the loop + before checking for overflow. */ + if (++s < send) { + int digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + /* Now got 9 digits, so need to check + each time for overflow. */ + digit = *s - '0'; + while (digit >= 0 && digit <= 9 + && (value < max_div_10 + || (value == max_div_10 + && digit <= max_mod_10))) { + value = value * 10 + digit; + if (++s < send) + digit = *s - '0'; + else + break; + } + if (digit >= 0 && digit <= 9 + && (s < send)) { + /* value overflowed. + skip the remaining digits, don't + worry about setting *valuep. */ + do { + s++; + } while (s < send && isDIGIT(*s)); + numtype |= + IS_NUMBER_GREATER_THAN_UV_MAX; + goto skip_value; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + numtype |= IS_NUMBER_IN_UV; + if (valuep) + *valuep = value; + + skip_value: + if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT; + while (s < send && isDIGIT(*s)) /* optional digits after the radix */ + s++; + } + } + else if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ + /* no digits before the radix means we need digits after it */ + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + if (valuep) { + /* integer approximation is valid - it's 0. */ + *valuep = 0; + } + } + else + return 0; + } else if (*s == 'I' || *s == 'i') { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; + s++; if (s < send && (*s == 'I' || *s == 'i')) { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; + s++; if (s == send || (*s != 'T' && *s != 't')) return 0; + s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; + s++; + } + sawinf = 1; + } else if (*s == 'N' || *s == 'n') { + /* XXX TODO: There are signaling NaNs and quiet NaNs. */ + s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; + sawnan = 1; + } else + return 0; + + if (sawinf) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; + } else if (sawnan) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; + } else if (s < send) { + /* we can have an optional exponent part */ + if (*s == 'e' || *s == 'E') { + /* The only flag we keep is sign. Blow away any "it's UV" */ + numtype &= IS_NUMBER_NEG; + numtype |= IS_NUMBER_NOT_INT; + s++; + if (s < send && (*s == '-' || *s == '+')) + s++; + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + } + else + return 0; + } + } + while (s < send && isSPACE(*s)) + s++; + if (s >= send) + return numtype; + if (len == 10 && memEQ(pv, "0 but true", 10)) { + if (valuep) + *valuep = 0; + return IS_NUMBER_IN_UV; + } + return 0; +} +#endif +#endif + +/* + * The grok_* routines have been modified to use warn() instead of + * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, + * which is why the stack variable has been renamed to 'xdigit'. + */ + +#ifndef grok_bin +#if defined(NEED_grok_bin) +static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result); +static +#else +extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result); +#endif + +#ifdef grok_bin +# undef grok_bin +#endif +#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) +#define Perl_grok_bin DPPP_(my_grok_bin) + +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) +UV +DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_2 = UV_MAX / 2; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading b or 0b. + for compatibility silently suffer "b" and "0b" as valid binary + numbers. */ + if (len >= 1) { + if (s[0] == 'b') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'b') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + char bit = *s; + if (bit == '0' || bit == '1') { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_bin. */ + redo: + if (!overflowed) { + if (value <= max_div_2) { + value = (value << 1) | (bit - '0'); + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in binary number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 2.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount. */ + value_nv += (NV)(bit - '0'); + continue; + } + if (bit == '_' && len && allow_underscores && (bit = s[1]) + && (bit == '0' || bit == '1')) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal binary digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Binary number > 0b11111111111111111111111111111111 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_hex +#if defined(NEED_grok_hex) +static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result); +static +#else +extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result); +#endif + +#ifdef grok_hex +# undef grok_hex +#endif +#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) +#define Perl_grok_hex DPPP_(my_grok_hex) + +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) +UV +DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_16 = UV_MAX / 16; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + const char *xdigit; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading x or 0x. + for compatibility silently suffer "x" and "0x" as valid hex numbers. + */ + if (len >= 1) { + if (s[0] == 'x') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'x') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + xdigit = strchr((char *) PL_hexdigit, *s); + if (xdigit) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_hex. */ + redo: + if (!overflowed) { + if (value <= max_div_16) { + value = (value << 4) | ((xdigit - PL_hexdigit) & 15); + continue; + } + warn("Integer overflow in hexadecimal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 16.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 16-tuples. */ + value_nv += (NV)((xdigit - PL_hexdigit) & 15); + continue; + } + if (*s == '_' && len && allow_underscores && s[1] + && (xdigit = strchr((char *) PL_hexdigit, s[1]))) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal hexadecimal digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Hexadecimal number > 0xffffffff non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_oct +#if defined(NEED_grok_oct) +static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result); +static +#else +extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result); +#endif + +#ifdef grok_oct +# undef grok_oct +#endif +#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) +#define Perl_grok_oct DPPP_(my_grok_oct) + +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) +UV +DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_8 = UV_MAX / 8; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + for (; len-- && *s; s++) { + /* gcc 2.95 optimiser not smart enough to figure that this subtraction + out front allows slicker code. */ + int digit = *s - '0'; + if (digit >= 0 && digit <= 7) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + */ + redo: + if (!overflowed) { + if (value <= max_div_8) { + value = (value << 3) | digit; + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in octal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 8.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 8-tuples. */ + value_nv += (NV)digit; + continue; + } + if (digit == ('_' - '0') && len && allow_underscores + && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) + { + --len; + ++s; + goto redo; + } + /* Allow \octal to work the DWIM way (that is, stop scanning + * as soon as non-octal characters are seen, complain only iff + * someone seems to want to use the digits eight and nine). */ + if (digit == 8 || digit == 9) { + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal octal digit '%c' ignored", *s); + } + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Octal number > 037777777777 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#if !defined(my_snprintf) +#if defined(NEED_my_snprintf) +static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +static +#else +extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +#endif + +#define my_snprintf DPPP_(my_my_snprintf) +#define Perl_my_snprintf DPPP_(my_my_snprintf) + +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + +int +DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) +{ + dTHX; + int retval; + va_list ap; + va_start(ap, format); +#ifdef HAS_VSNPRINTF + retval = vsnprintf(buffer, len, format, ap); +#else + retval = vsprintf(buffer, format, ap); +#endif + va_end(ap); + if (retval >= (int)len) + Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); + return retval; +} + +#endif +#endif + +#ifdef NO_XSLOCKS +# ifdef dJMPENV +# define dXCPT dJMPENV; int rEtV = 0 +# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) +# define XCPT_TRY_END JMPENV_POP; +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW JMPENV_JUMP(rEtV) +# else +# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 +# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) +# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW Siglongjmp(top_env, rEtV) +# endif +#endif + +#if !defined(my_strlcat) +#if defined(NEED_my_strlcat) +static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcat DPPP_(my_my_strlcat) +#define Perl_my_strlcat DPPP_(my_my_strlcat) + +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + +Size_t +DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif +#endif + +#if !defined(my_strlcpy) +#if defined(NEED_my_strlcpy) +static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcpy DPPP_(my_my_strlcpy) +#define Perl_my_strlcpy DPPP_(my_my_strlcpy) + +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + +Size_t +DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} + +#endif +#endif + +#endif /* _P_P_PORTABILITY_H_ */ + +/* End of File ppport.h */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/private/MakeUtil.pm b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/private/MakeUtil.pm new file mode 100644 index 0000000..4c706e0 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/private/MakeUtil.pm @@ -0,0 +1,304 @@ +package MakeUtil ; +package main ; + +use strict ; + +use Config qw(%Config); +use File::Copy; + +my $VERSION = '1.0'; + + +BEGIN +{ + eval { require File::Spec::Functions ; File::Spec::Functions->import() } ; + if ($@) + { + *catfile = sub { return "$_[0]/$_[1]" } + } +} + +require VMS::Filespec if $^O eq 'VMS'; + + +unless($ENV{PERL_CORE}) { + $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV; +} + +$ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ; + + + +sub MY::libscan +{ + my $self = shift; + my $path = shift; + + return undef + if $path =~ /(~|\.bak|_bak)$/ || + $path =~ /\..*\.sw(o|p)$/ || + $path =~ /\B\.svn\b/; + + return $path; +} + +sub MY::postamble +{ + return '' + if $ENV{PERL_CORE} ; + + my @files = getPerlFiles('MANIFEST'); + + # Note: Once you remove all the layers of shell/makefile escaping + # the regular expression below reads + # + # /^\s*local\s*\(\s*\$^W\s*\)/ + # + my $postamble = ' + +MyTrebleCheck: + @echo Checking for $$^W in files: '. "@files" . ' + @perl -ne \' \ + exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \ + \' ' . " @files || " . ' \ + (echo found unexpected $$^W ; exit 1) + @echo All is ok. + +'; + + return $postamble; +} + +sub getPerlFiles +{ + my @manifests = @_ ; + + my @files = (); + + for my $manifest (@manifests) + { + my $prefix = './'; + + $prefix = $1 + if $manifest =~ m#^(.*/)#; + + open M, "<$manifest" + or die "Cannot open '$manifest': $!\n"; + while () + { + chomp ; + next if /^\s*#/ || /^\s*$/ ; + + s/^\s+//; + s/\s+$//; + + /^(\S+)\s*(.*)$/; + + my ($file, $rest) = ($1, $2); + + if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/) + { + push @files, "$prefix$file"; + } + elsif ($rest =~ /perl/i) + { + push @files, "$prefix$file"; + } + + } + close M; + } + + return @files; +} + +sub UpDowngrade +{ + return if defined $ENV{TipTop}; + + my @files = @_ ; + + # our and use bytes/utf8 is stable from 5.6.0 onward + # warnings is stable from 5.6.1 onward + + # Note: this code assumes that each statement it modifies is not + # split across multiple lines. + + + my $warn_sub = ''; + my $our_sub = '' ; + + my $upgrade ; + my $downgrade ; + my $do_downgrade ; + + my $caller = (caller(1))[3] || ''; + + if ($caller =~ /downgrade/) + { + $downgrade = 1; + } + elsif ($caller =~ /upgrade/) + { + $upgrade = 1; + } + else + { + $do_downgrade = 1 + if $] < 5.006001 ; + } + +# else +# { +# my $opt = shift @ARGV || '' ; +# $upgrade = ($opt =~ /^-upgrade/i); +# $downgrade = ($opt =~ /^-downgrade/i); +# push @ARGV, $opt unless $downgrade || $upgrade; +# } + + + if ($downgrade || $do_downgrade) { + # From: use|no warnings "blah" + # To: local ($^W) = 1; # use|no warnings "blah" + $warn_sub = sub { + s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ; + s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ; + }; + } + #elsif ($] >= 5.006001 || $upgrade) { + elsif ($upgrade) { + # From: local ($^W) = 1; # use|no warnings "blah" + # To: use|no warnings "blah" + $warn_sub = sub { + s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ; + }; + } + + if ($downgrade || $do_downgrade) { + $our_sub = sub { + if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) { + my $indent = $1; + my $vars = join ' ', split /\s*,\s*/, $2; + $_ = "${indent}use vars qw($vars);\n"; + } + elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/) + { + $_ = "$1# $2\n"; + } + }; + } + #elsif ($] >= 5.006000 || $upgrade) { + elsif ($upgrade) { + $our_sub = sub { + if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) { + my $indent = $1; + my $vars = join ', ', split ' ', $2; + $_ = "${indent}our ($vars);\n"; + } + elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/) + { + $_ = "$1$2\n"; + } + }; + } + + if (! $our_sub && ! $warn_sub) { + warn "Up/Downgrade not needed.\n"; + if ($upgrade || $downgrade) + { exit 0 } + else + { return } + } + + foreach (@files) { + #if (-l $_ ) + { doUpDown($our_sub, $warn_sub, $_) } + #else + #{ doUpDownViaCopy($our_sub, $warn_sub, $_) } + } + + warn "Up/Downgrade complete.\n" ; + exit 0 if $upgrade || $downgrade; + +} + + +sub doUpDown +{ + my $our_sub = shift; + my $warn_sub = shift; + + return if -d $_[0]; + + local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak"; + local (@ARGV) = shift; + + while (<>) + { + print, last if /^__(END|DATA)__/ ; + + &{ $our_sub }() if $our_sub ; + &{ $warn_sub }() if $warn_sub ; + print ; + } + + return if eof ; + + while (<>) + { print } +} + +sub doUpDownViaCopy +{ + my $our_sub = shift; + my $warn_sub = shift; + my $file = shift ; + + use File::Copy ; + + return if -d $file ; + + my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak"; + + copy($file, $backup) + or die "Cannot copy $file to $backup: $!"; + + my @keep = (); + + { + open F, "<$file" + or die "Cannot open $file: $!\n" ; + while () + { + if (/^__(END|DATA)__/) + { + push @keep, $_; + last ; + } + + &{ $our_sub }() if $our_sub ; + &{ $warn_sub }() if $warn_sub ; + push @keep, $_; + } + + if (! eof F) + { + while () + { push @keep, $_ } + } + close F; + } + + { + open F, ">$file" + or die "Cannot open $file: $!\n"; + print F @keep ; + close F; + } +} + +package MakeUtil ; + +1; + + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/000prereq.t b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/000prereq.t new file mode 100644 index 0000000..2552e4e --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/000prereq.t @@ -0,0 +1,57 @@ +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = ("../lib", "lib/compress"); + } +} + +use lib qw(t t/compress); +use strict ; +use warnings ; + +use Test::More ; + +BEGIN +{ + # use Test::NoWarnings, if available + my $extra = 0 ; + $extra = 1 + if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; + + + my $VERSION = '2.012'; + my @NAMES = qw( + + ); + + my @OPT = qw( + + ); + + plan tests => 1 + @NAMES + @OPT + $extra ; + + ok 1; + + foreach my $name (@NAMES) + { + use_ok($name, $VERSION); + } + + + foreach my $name (@OPT) + { + eval " require $name " ; + if ($@) + { + ok 1, "$name not available" + } + else + { + my $ver = eval("\$${name}::VERSION"); + is $ver, $VERSION, "$name version should be $VERSION" + or diag "$name version is $ver, need $VERSION" ; + } + } + +} + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/01version.t b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/01version.t new file mode 100644 index 0000000..1eccbd3 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/01version.t @@ -0,0 +1,42 @@ +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = ("../lib", "lib/compress"); + } +} + +use lib qw(t t/compress); +use strict ; +use warnings ; + +use Test::More ; + +BEGIN +{ + # use Test::NoWarnings, if available + my $extra = 0 ; + $extra = 1 + if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; + + plan tests => 2 + $extra ; + + use_ok('Compress::Raw::Zlib', 2) ; +} + +# Check zlib_version and ZLIB_VERSION are the same. + +my $zlib_h = ZLIB_VERSION ; +my $libz = Compress::Raw::Zlib::zlib_version; + +is($zlib_h, $libz, "ZLIB_VERSION ($zlib_h) matches Compress::Raw::Zlib::zlib_version") + or diag <= 5.006) { + $count = 283 ; + } + else { + $count = 241 ; + } + + plan tests => $count + $extra; + + use_ok('Compress::Raw::Zlib', 2) ; +} + + +my $hello = < 1) }; + like $@, mkErr('^Compress::Raw::Zlib::Deflate::new: unknown key value\(s\) Joe'); + + eval { new Compress::Raw::Zlib::Inflate(-Joe => 1) }; + like $@, mkErr('^Compress::Raw::Zlib::Inflate::new: unknown key value\(s\) Joe'); + + eval { new Compress::Raw::Zlib::Deflate(-Bufsize => 0) }; + like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Bufsize must be >= 1, you specified 0"); + + eval { new Compress::Raw::Zlib::Inflate(-Bufsize => 0) }; + like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Bufsize must be >= 1, you specified 0"); + + eval { new Compress::Raw::Zlib::Deflate(-Bufsize => -1) }; + like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'"); + + eval { new Compress::Raw::Zlib::Inflate(-Bufsize => -1) }; + like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'"); + + eval { new Compress::Raw::Zlib::Deflate(-Bufsize => "xxx") }; + like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'"); + + eval { new Compress::Raw::Zlib::Inflate(-Bufsize => "xxx") }; + like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'"); + + eval { new Compress::Raw::Zlib::Inflate(-Bufsize => 1, 2) }; + like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Expected even number of parameters, got 3"); + + eval { new Compress::Raw::Zlib::Deflate(-Bufsize => 1, 2) }; + like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Expected even number of parameters, got 3"); + +} + +{ + + title "deflate/inflate - small buffer"; + # ============================== + + my $hello = "I am a HAL 9000 computer" ; + my @hello = split('', $hello) ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1 ), "Create deflate object" ); + ok $x, "Compress::Raw::Zlib::Deflate ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + ok ! defined $x->msg() ; + is $x->total_in(), 0, "total_in() == 0" ; + is $x->total_out(), 0, "total_out() == 0" ; + + $X = "" ; + my $Answer = ''; + foreach (@hello) + { + $status = $x->deflate($_, $X) ; + last unless $status == Z_OK ; + + $Answer .= $X ; + } + + cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ; + + cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ; + $Answer .= $X ; + + ok ! defined $x->msg() ; + is $x->total_in(), length $hello, "total_in ok" ; + is $x->total_out(), length $Answer, "total_out ok" ; + + my @Answer = split('', $Answer) ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate( {-Bufsize => 1}) ); + ok $k, "Compress::Raw::Zlib::Inflate ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + ok ! defined $k->msg(), "No error messages" ; + is $k->total_in(), 0, "total_in() == 0" ; + is $k->total_out(), 0, "total_out() == 0" ; + my $GOT = ''; + my $Z; + $Z = 1 ;#x 2000 ; + foreach (@Answer) + { + $status = $k->inflate($_, $Z) ; + $GOT .= $Z ; + last if $status == Z_STREAM_END or $status != Z_OK ; + + } + + cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ; + is $GOT, $hello, "uncompressed data matches ok" ; + ok ! defined $k->msg(), "No error messages" ; + is $k->total_in(), length $Answer, "total_in ok" ; + is $k->total_out(), length $hello , "total_out ok"; + +} + + +{ + # deflate/inflate - small buffer with a number + # ============================== + + my $hello = 6529 ; + + ok my ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1, -AppendOutput => 1 ) ; + ok $x ; + cmp_ok $err, '==', Z_OK ; + + my $status; + my $Answer = ''; + + cmp_ok $x->deflate($hello, $Answer), '==', Z_OK ; + + cmp_ok $x->flush($Answer), '==', Z_OK ; + + my @Answer = split('', $Answer) ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}) ); + ok $k ; + cmp_ok $err, '==', Z_OK ; + + #my $GOT = ''; + my $GOT ; + foreach (@Answer) + { + $status = $k->inflate($_, $GOT) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + + } + + cmp_ok $status, '==', Z_STREAM_END ; + is $GOT, $hello ; + +} + +{ + +# deflate/inflate options - AppendOutput +# ================================ + + # AppendOutput + # CRC + + my $hello = "I am a HAL 9000 computer" ; + my @hello = split('', $hello) ; + + ok my ($x, $err) = new Compress::Raw::Zlib::Deflate ( {-Bufsize => 1, -AppendOutput =>1} ) ; + ok $x ; + cmp_ok $err, '==', Z_OK ; + + my $status; + my $X; + foreach (@hello) + { + $status = $x->deflate($_, $X) ; + last unless $status == Z_OK ; + } + + cmp_ok $status, '==', Z_OK ; + + cmp_ok $x->flush($X), '==', Z_OK ; + + + my @Answer = split('', $X) ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1})); + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $Z; + foreach (@Answer) + { + $status = $k->inflate($_, $Z) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + + } + + cmp_ok $status, '==', Z_STREAM_END ; + is $Z, $hello ; +} + + +{ + + title "deflate/inflate - larger buffer"; + # ============================== + + # generate a long random string + my $contents = '' ; + foreach (1 .. 50000) + { $contents .= chr int rand 255 } + + + ok my ($x, $err) = new Compress::Raw::Zlib::Deflate() ; + ok $x ; + cmp_ok $err, '==', Z_OK ; + + my (%X, $Y, %Z, $X, $Z); + #cmp_ok $x->deflate($contents, $X{key}), '==', Z_OK ; + cmp_ok $x->deflate($contents, $X), '==', Z_OK ; + + #$Y = $X{key} ; + $Y = $X ; + + + #cmp_ok $x->flush($X{key}), '==', Z_OK ; + #$Y .= $X{key} ; + cmp_ok $x->flush($X), '==', Z_OK ; + $Y .= $X ; + + + + my $keep = $Y ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate() ); + ok $k ; + cmp_ok $err, '==', Z_OK ; + + #cmp_ok $k->inflate($Y, $Z{key}), '==', Z_STREAM_END ; + #ok $contents eq $Z{key} ; + cmp_ok $k->inflate($Y, $Z), '==', Z_STREAM_END ; + ok $contents eq $Z ; + + # redo deflate with AppendOutput + + ok (($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1)) ; + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $s ; + my $out ; + my @bits = split('', $keep) ; + foreach my $bit (@bits) { + $s = $k->inflate($bit, $out) ; + } + + cmp_ok $s, '==', Z_STREAM_END ; + + ok $contents eq $out ; + + +} + +{ + + title "deflate/inflate - preset dictionary"; + # =================================== + + my $dictionary = "hello" ; + ok my $x = new Compress::Raw::Zlib::Deflate({-Level => Z_BEST_COMPRESSION, + -Dictionary => $dictionary}) ; + + my $dictID = $x->dict_adler() ; + + my ($X, $Y, $Z); + cmp_ok $x->deflate($hello, $X), '==', Z_OK; + cmp_ok $x->flush($Y), '==', Z_OK; + $X .= $Y ; + + ok my $k = new Compress::Raw::Zlib::Inflate(-Dictionary => $dictionary) ; + + cmp_ok $k->inflate($X, $Z), '==', Z_STREAM_END; + is $k->dict_adler(), $dictID; + is $hello, $Z ; + +} + +title 'inflate - check remaining buffer after Z_STREAM_END'; +# and that ConsumeInput works. +# =================================================== + +for my $consume ( 0 .. 1) +{ + ok my $x = new Compress::Raw::Zlib::Deflate(-Level => Z_BEST_COMPRESSION ) ; + + my ($X, $Y, $Z); + cmp_ok $x->deflate($hello, $X), '==', Z_OK; + cmp_ok $x->flush($Y), '==', Z_OK; + $X .= $Y ; + + ok my $k = new Compress::Raw::Zlib::Inflate( -ConsumeInput => $consume) ; + + my $first = substr($X, 0, 2) ; + my $remember_first = $first ; + my $last = substr($X, 2) ; + cmp_ok $k->inflate($first, $Z), '==', Z_OK; + if ($consume) { + ok $first eq "" ; + } + else { + ok $first eq $remember_first ; + } + + my $T ; + $last .= "appendage" ; + my $remember_last = $last ; + cmp_ok $k->inflate($last, $T), '==', Z_STREAM_END; + is $hello, $Z . $T ; + if ($consume) { + is $last, "appendage" ; + } + else { + is $last, $remember_last ; + } + +} + + + +{ + + title 'Check - MAX_WBITS'; + # ================= + + my $hello = "Test test test test test"; + my @hello = split('', $hello) ; + + ok my ($x, $err) = + new Compress::Raw::Zlib::Deflate ( -Bufsize => 1, + -WindowBits => -MAX_WBITS(), + -AppendOutput => 1 ) ; + ok $x ; + cmp_ok $err, '==', Z_OK ; + + my $Answer = ''; + my $status; + foreach (@hello) + { + $status = $x->deflate($_, $Answer) ; + last unless $status == Z_OK ; + } + + cmp_ok $status, '==', Z_OK ; + + cmp_ok $x->flush($Answer), '==', Z_OK ; + + my @Answer = split('', $Answer) ; + # Undocumented corner -- extra byte needed to get inflate to return + # Z_STREAM_END when done. + push @Answer, " " ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate( + {-Bufsize => 1, + -AppendOutput =>1, + -WindowBits => -MAX_WBITS()})) ; + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $GOT = ''; + foreach (@Answer) + { + $status = $k->inflate($_, $GOT) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + + } + + cmp_ok $status, '==', Z_STREAM_END ; + is $GOT, $hello ; + +} + +{ + title 'inflateSync'; + + # create a deflate stream with flush points + + my $hello = "I am a HAL 9000 computer" x 2001 ; + my $goodbye = "Will I dream?" x 2010; + my ($x, $err, $answer, $X, $Z, $status); + my $Answer ; + + #use Devel::Peek ; + ok(($x, $err) = new Compress::Raw::Zlib::Deflate(AppendOutput => 1)) ; + ok $x ; + cmp_ok $err, '==', Z_OK ; + + cmp_ok $x->deflate($hello, $Answer), '==', Z_OK; + + # create a flush point + cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ; + + cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK; + + cmp_ok $x->flush($Answer), '==', Z_OK ; + + my ($first, @Answer) = split('', $Answer) ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate()) ; + ok $k ; + cmp_ok $err, '==', Z_OK ; + + cmp_ok $k->inflate($first, $Z), '==', Z_OK; + + # skip to the first flush point. + while (@Answer) + { + my $byte = shift @Answer; + $status = $k->inflateSync($byte) ; + last unless $status == Z_DATA_ERROR; + } + + cmp_ok $status, '==', Z_OK; + + my $GOT = ''; + foreach (@Answer) + { + my $Z = ''; + $status = $k->inflate($_, $Z) ; + $GOT .= $Z if defined $Z ; + # print "x $status\n"; + last if $status == Z_STREAM_END or $status != Z_OK ; + + } + + cmp_ok $status, '==', Z_DATA_ERROR ; + is $GOT, $goodbye ; + + + # Check inflateSync leaves good data in buffer + my $rest = $Answer ; + $rest =~ s/^(.)//; + my $initial = $1 ; + + + ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-ConsumeInput => 0)) ; + ok $k ; + cmp_ok $err, '==', Z_OK ; + + cmp_ok $k->inflate($initial, $Z), '==', Z_OK; + + # Skip to the flush point + $status = $k->inflateSync($rest); + cmp_ok $status, '==', Z_OK + or diag "status '$status'\nlength rest is " . length($rest) . "\n" ; + + cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR; + is $Z . $GOT, $goodbye ; +} + +{ + title 'deflateParams'; + + my $hello = "I am a HAL 9000 computer" x 2001 ; + my $goodbye = "Will I dream?" x 2010; + my ($x, $input, $err, $answer, $X, $status, $Answer); + + ok(($x, $err) = new Compress::Raw::Zlib::Deflate( + -AppendOutput => 1, + -Level => Z_DEFAULT_COMPRESSION, + -Strategy => Z_DEFAULT_STRATEGY)) ; + ok $x ; + cmp_ok $err, '==', Z_OK ; + + ok $x->get_Level() == Z_DEFAULT_COMPRESSION; + ok $x->get_Strategy() == Z_DEFAULT_STRATEGY; + + $status = $x->deflate($hello, $Answer) ; + cmp_ok $status, '==', Z_OK ; + $input .= $hello; + + # error cases + eval { $x->deflateParams() }; + like $@, mkErr('^Compress::Raw::Zlib::deflateParams needs Level and\/or Strategy'); + + eval { $x->deflateParams(-Bufsize => 0) }; + like $@, mkErr('^Compress::Raw::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified 0'); + + eval { $x->deflateParams(-Joe => 3) }; + like $@, mkErr('^Compress::Raw::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe'); + + is $x->get_Level(), Z_DEFAULT_COMPRESSION; + is $x->get_Strategy(), Z_DEFAULT_STRATEGY; + + # change both Level & Strategy + $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY, -Bufsize => 1234) ; + cmp_ok $status, '==', Z_OK ; + + is $x->get_Level(), Z_BEST_SPEED; + is $x->get_Strategy(), Z_HUFFMAN_ONLY; + + $status = $x->deflate($goodbye, $Answer) ; + cmp_ok $status, '==', Z_OK ; + $input .= $goodbye; + + # change only Level + $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ; + cmp_ok $status, '==', Z_OK ; + + is $x->get_Level(), Z_NO_COMPRESSION; + is $x->get_Strategy(), Z_HUFFMAN_ONLY; + + $status = $x->deflate($goodbye, $Answer) ; + cmp_ok $status, '==', Z_OK ; + $input .= $goodbye; + + # change only Strategy + $status = $x->deflateParams(-Strategy => Z_FILTERED) ; + cmp_ok $status, '==', Z_OK ; + + is $x->get_Level(), Z_NO_COMPRESSION; + is $x->get_Strategy(), Z_FILTERED; + + $status = $x->deflate($goodbye, $Answer) ; + cmp_ok $status, '==', Z_OK ; + $input .= $goodbye; + + cmp_ok $x->flush($Answer), '==', Z_OK ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate()) ; + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $Z; + $status = $k->inflate($Answer, $Z) ; + + cmp_ok $status, '==', Z_STREAM_END ; + is $Z, $input ; +} + + +{ + title "ConsumeInput and a read-only buffer trapped" ; + + ok my $k = new Compress::Raw::Zlib::Inflate(-ConsumeInput => 1) ; + + my $Z; + eval { $k->inflate("abc", $Z) ; }; + like $@, mkErr("Compress::Raw::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified"); + +} + +foreach (1 .. 2) +{ + next if $[ < 5.005 ; + + title 'test inflate/deflate with a substr'; + + my $contents = '' ; + foreach (1 .. 5000) + { $contents .= chr int rand 255 } + ok my $x = new Compress::Raw::Zlib::Deflate(-AppendOutput => 1) ; + + my $X ; + my $status = $x->deflate(substr($contents,0), $X); + cmp_ok $status, '==', Z_OK ; + + cmp_ok $x->flush($X), '==', Z_OK ; + + my $append = "Appended" ; + $X .= $append ; + + ok my $k = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) ; + + my $Z; + my $keep = $X ; + $status = $k->inflate(substr($X, 0), $Z) ; + + cmp_ok $status, '==', Z_STREAM_END ; + #print "status $status X [$X]\n" ; + is $contents, $Z ; + ok $X eq $append; + #is length($X), length($append); + #ok $X eq $keep; + #is length($X), length($keep); +} + +title 'Looping Append test - checks that deRef_l resets the output buffer'; +foreach (1 .. 2) +{ + + my $hello = "I am a HAL 9000 computer" ; + my @hello = split('', $hello) ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1 ) ); + ok $x ; + cmp_ok $err, '==', Z_OK ; + + $X = "" ; + my $Answer = ''; + foreach (@hello) + { + $status = $x->deflate($_, $X) ; + last unless $status == Z_OK ; + + $Answer .= $X ; + } + + cmp_ok $status, '==', Z_OK ; + + cmp_ok $x->flush($X), '==', Z_OK ; + $Answer .= $X ; + + my @Answer = split('', $Answer) ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) ); + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $GOT ; + my $Z; + $Z = 1 ;#x 2000 ; + foreach (@Answer) + { + $status = $k->inflate($_, $GOT) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + } + + cmp_ok $status, '==', Z_STREAM_END ; + is $GOT, $hello ; + +} + +if ($] >= 5.005) +{ + title 'test inflate input parameter via substr'; + + my $hello = "I am a HAL 9000 computer" ; + my $data = $hello ; + + my($X, $Z); + + ok my $x = new Compress::Raw::Zlib::Deflate ( -AppendOutput => 1 ); + + cmp_ok $x->deflate($data, $X), '==', Z_OK ; + + cmp_ok $x->flush($X), '==', Z_OK ; + + my $append = "Appended" ; + $X .= $append ; + my $keep = $X ; + + ok my $k = new Compress::Raw::Zlib::Inflate ( -AppendOutput => 1, + -ConsumeInput => 1 ) ; + + cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ; + + ok $hello eq $Z ; + is $X, $append; + + $X = $keep ; + $Z = ''; + ok $k = new Compress::Raw::Zlib::Inflate ( -AppendOutput => 1, + -ConsumeInput => 0 ) ; + + cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ; + #cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ; + + ok $hello eq $Z ; + is $X, $keep; + +} + +{ + # regression - check that resetLastBlockByte can cope with a NULL + # pointer. + Compress::Raw::Zlib::InflateScan->new->resetLastBlockByte(undef); + ok 1, "resetLastBlockByte(undef) is ok" ; +} + +{ + + title "gzip mode"; + # ================ + + my $hello = "I am a HAL 9000 computer" ; + my @hello = split('', $hello) ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( + WindowBits => WANT_GZIP , + AppendOutput => 1 + ), "Create deflate object" ); + ok $x, "Compress::Raw::Zlib::Deflate ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $x->deflate($hello, $X) ; + cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ; + + cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ; + + my ($k, $GOT); + ($k, $err) = new Compress::Raw::Zlib::Inflate( + WindowBits => WANT_GZIP , + ConsumeInput => 0 , + AppendOutput => 1); + ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $k->inflate($X, $GOT) ; + cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ; + is $GOT, $hello, "uncompressed data matches ok" ; + + $GOT = ''; + ($k, $err) = new Compress::Raw::Zlib::Inflate( + WindowBits => WANT_GZIP_OR_ZLIB , + AppendOutput => 1); + ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP_OR_ZLIB ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $k->inflate($X, $GOT) ; + cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ; + is $GOT, $hello, "uncompressed data matches ok" ; +} + +{ + + title "gzip error mode"; + # Create gzip - + # read with no special windowbits setting - this will fail + # then read with WANT_GZIP_OR_ZLIB - thi swill work + # ================ + + my $hello = "I am a HAL 9000 computer" ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( + WindowBits => WANT_GZIP , + AppendOutput => 1 + ), "Create deflate object" ); + ok $x, "Compress::Raw::Zlib::Deflate ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $x->deflate($hello, $X) ; + cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ; + + cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ; + + my ($k, $GOT); + ($k, $err) = new Compress::Raw::Zlib::Inflate( + WindowBits => MAX_WBITS , + ConsumeInput => 0 , + AppendOutput => 1); + ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $k->inflate($X, $GOT) ; + cmp_ok $status, '==', Z_DATA_ERROR, "Got Z_DATA_ERROR" ; + + $GOT = ''; + ($k, $err) = new Compress::Raw::Zlib::Inflate( + WindowBits => WANT_GZIP_OR_ZLIB , + AppendOutput => 1); + ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP_OR_ZLIB ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $k->inflate($X, $GOT) ; + cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ; + is $GOT, $hello, "uncompressed data matches ok" ; +} + +{ + + title "gzip/zlib error mode"; + # Create zlib - + # read with no WANT_GZIP windowbits setting - this will fail + # then read with WANT_GZIP_OR_ZLIB - thi swill work + # ================ + + my $hello = "I am a HAL 9000 computer" ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( + AppendOutput => 1 + ), "Create deflate object" ); + ok $x, "Compress::Raw::Zlib::Deflate ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $x->deflate($hello, $X) ; + cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ; + + cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ; + + my ($k, $GOT); + ($k, $err) = new Compress::Raw::Zlib::Inflate( + WindowBits => WANT_GZIP , + ConsumeInput => 0 , + AppendOutput => 1); + ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $k->inflate($X, $GOT) ; + cmp_ok $status, '==', Z_DATA_ERROR, "Got Z_DATA_ERROR" ; + + $GOT = ''; + ($k, $err) = new Compress::Raw::Zlib::Inflate( + WindowBits => WANT_GZIP_OR_ZLIB , + AppendOutput => 1); + ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP_OR_ZLIB ok" ; + cmp_ok $err, '==', Z_OK, "status is Z_OK" ; + + $status = $k->inflate($X, $GOT) ; + cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ; + is $GOT, $hello, "uncompressed data matches ok" ; +} + +exit if $] < 5.006 ; + +title 'Looping Append test with substr output - substr the end of the string'; +foreach (1 .. 2) +{ + + my $hello = "I am a HAL 9000 computer" ; + my @hello = split('', $hello) ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1, + -AppendOutput => 1 ) ); + ok $x ; + cmp_ok $err, '==', Z_OK ; + + $X = "" ; + my $Answer = ''; + foreach (@hello) + { + $status = $x->deflate($_, substr($Answer, length($Answer))) ; + last unless $status == Z_OK ; + + } + + cmp_ok $status, '==', Z_OK ; + + cmp_ok $x->flush(substr($Answer, length($Answer))), '==', Z_OK ; + + #cmp_ok length $Answer, ">", 0 ; + + my @Answer = split('', $Answer) ; + + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) ); + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $GOT = ''; + my $Z; + $Z = 1 ;#x 2000 ; + foreach (@Answer) + { + $status = $k->inflate($_, substr($GOT, length($GOT))) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + } + + cmp_ok $status, '==', Z_STREAM_END ; + is $GOT, $hello ; + +} + +title 'Looping Append test with substr output - substr the complete string'; +foreach (1 .. 2) +{ + + my $hello = "I am a HAL 9000 computer" ; + my @hello = split('', $hello) ; + my ($err, $x, $X, $status); + + ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1, + -AppendOutput => 1 ) ); + ok $x ; + cmp_ok $err, '==', Z_OK ; + + $X = "" ; + my $Answer = ''; + foreach (@hello) + { + $status = $x->deflate($_, substr($Answer, 0)) ; + last unless $status == Z_OK ; + + } + + cmp_ok $status, '==', Z_OK ; + + cmp_ok $x->flush(substr($Answer, 0)), '==', Z_OK ; + + my @Answer = split('', $Answer) ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) ); + ok $k ; + cmp_ok $err, '==', Z_OK ; + + my $GOT = ''; + my $Z; + $Z = 1 ;#x 2000 ; + foreach (@Answer) + { + $status = $k->inflate($_, substr($GOT, 0)) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + } + + cmp_ok $status, '==', Z_STREAM_END ; + is $GOT, $hello ; +} + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/07bufsize.t b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/07bufsize.t new file mode 100644 index 0000000..3412bc8 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/07bufsize.t @@ -0,0 +1,107 @@ +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = ("../lib", "lib/compress"); + } +} + +use lib qw(t t/compress); +use strict; +use warnings; +use bytes; + +use Test::More ; +use CompTestUtils; + +BEGIN +{ + # use Test::NoWarnings, if available + my $extra = 0 ; + $extra = 1 + if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; + + plan tests => 288 + $extra ; + + use_ok('Compress::Raw::Zlib', 2) ; +} + + +my $hello = < 1)); + ok $x ; + cmp_ok $err, '==', Z_OK, " status is Z_OK" ; + + ok ! defined $x->msg(), " no msg" ; + is $x->total_in(), 0, " total_in == 0" ; + is $x->total_out(), 0, " total_out == 0" ; + + my $out ; + foreach (@hello) + { + $status = $x->deflate($_, $out) ; + last unless $status == Z_OK ; + + } + cmp_ok $status, '==', Z_OK, " status is Z_OK" ; + + cmp_ok $x->flush($out), '==', Z_OK, " flush returned Z_OK" ; + + ok ! defined $x->msg(), " no msg" ; + is $x->total_in(), length $hello, " length total_in" ; + is $x->total_out(), length $out, " length total_out" ; + + my @Answer = (); + $tmp = $out; + push @Answer, $1 while $tmp =~ s/^(.{$i})//; + push @Answer, $tmp if length $tmp ; + + my $k; + ok(($k, $err) = new Compress::Raw::Zlib::Inflate( -AppendOutput => 1)); + ok $k ; + cmp_ok $err, '==', Z_OK, " status is Z_OK" ; + + ok ! defined $k->msg(), " no msg" ; + is $k->total_in(), 0, " total_in == 0" ; + is $k->total_out(), 0, " total_out == 0" ; + my $GOT = ''; + my $Z; + $Z = 1 ;#x 2000 ; + foreach (@Answer) + { + $status = $k->inflate($_, $GOT) ; + last if $status == Z_STREAM_END or $status != Z_OK ; + + } + + cmp_ok $status, '==', Z_STREAM_END, " status is Z_STREAM_END" ; + is $GOT, $hello, " got expected output" ; + ok ! defined $k->msg(), " no msg" ; + is $k->total_in(), length $out, " length total_in ok" ; + is $k->total_out(), length $hello, " length total_out ok" ; + +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/18lvalue.t b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/18lvalue.t new file mode 100644 index 0000000..860c50c --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/18lvalue.t @@ -0,0 +1,74 @@ +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = ("../lib", "lib/compress"); + } +} + +use lib qw(t t/compress); +use strict; +use warnings; +use bytes; + +use Test::More ; +use CompTestUtils; + +BEGIN +{ + plan(skip_all => "lvalue sub tests need Perl ??") + if $] < 5.006 ; + + # use Test::NoWarnings, if available + my $extra = 0 ; + $extra = 1 + if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; + + plan tests => 10 + $extra ; + + use_ok('Compress::Raw::Zlib', 2) ; +} + + + +my $hello = < 1 ); + + cmp_ok $x->deflate(getData, getX), '==', Z_OK ; + + cmp_ok $x->flush(getX), '==', Z_OK ; + + my $append = "Appended" ; + $X .= $append ; + + ok my $k = new Compress::Raw::Zlib::Inflate ( -AppendOutput => 1 ) ; + + cmp_ok $k->inflate(getX, getZ), '==', Z_STREAM_END ; ; + + ok $hello eq $Z ; + is $X, $append; + +} + + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/99pod.t b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/99pod.t new file mode 100644 index 0000000..760f737 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/99pod.t @@ -0,0 +1,16 @@ +BEGIN { + if ($ENV{PERL_CORE}) { + chdir 't' if -d 't'; + @INC = ("../lib", "lib/compress"); + } +} + +use lib qw(t t/compress); +use Test::More; + +eval "use Test::Pod 1.00"; + +plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; + +all_pod_files_ok(); + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Builder.pm b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Builder.pm new file mode 100644 index 0000000..29b6e1c --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Builder.pm @@ -0,0 +1,1625 @@ +package Test::Builder; + +use 5.004; + +# $^C was only introduced in 5.005-ish. We do this to prevent +# use of uninitialized value warnings in older perls. +$^C ||= 0; + +use strict; +our ($VERSION); +$VERSION = '0.30'; +$VERSION = eval $VERSION; # make the alpha version come out as a number + +# Make Test::Builder thread-safe for ithreads. +BEGIN { + use Config; + # Load threads::shared when threads are turned on + if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) { + require threads::shared; + + # Hack around YET ANOTHER threads::shared bug. It would + # occassionally forget the contents of the variable when sharing it. + # So we first copy the data, then share, then put our copy back. + *share = sub (\[$@%]) { + my $type = ref $_[0]; + my $data; + + if( $type eq 'HASH' ) { + %$data = %{$_[0]}; + } + elsif( $type eq 'ARRAY' ) { + @$data = @{$_[0]}; + } + elsif( $type eq 'SCALAR' ) { + $$data = ${$_[0]}; + } + else { + die "Unknown type: ".$type; + } + + $_[0] = &threads::shared::share($_[0]); + + if( $type eq 'HASH' ) { + %{$_[0]} = %$data; + } + elsif( $type eq 'ARRAY' ) { + @{$_[0]} = @$data; + } + elsif( $type eq 'SCALAR' ) { + ${$_[0]} = $$data; + } + else { + die "Unknown type: ".$type; + } + + return $_[0]; + }; + } + # 5.8.0's threads::shared is busted when threads are off. + # We emulate it here. + else { + *share = sub { return $_[0] }; + *lock = sub { 0 }; + } +} + + +=head1 NAME + +Test::Builder - Backend for building test libraries + +=head1 SYNOPSIS + + package My::Test::Module; + use Test::Builder; + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw(ok); + + my $Test = Test::Builder->new; + $Test->output('my_logfile'); + + sub import { + my($self) = shift; + my $pack = caller; + + $Test->exported_to($pack); + $Test->plan(@_); + + $self->export_to_level(1, $self, 'ok'); + } + + sub ok { + my($test, $name) = @_; + + $Test->ok($test, $name); + } + + +=head1 DESCRIPTION + +Test::Simple and Test::More have proven to be popular testing modules, +but they're not always flexible enough. Test::Builder provides the a +building block upon which to write your own test libraries I. + +=head2 Construction + +=over 4 + +=item B + + my $Test = Test::Builder->new; + +Returns a Test::Builder object representing the current state of the +test. + +Since you only run one test per program C always returns the same +Test::Builder object. No matter how many times you call new(), you're +getting the same object. This is called a singleton. This is done so that +multiple modules share such global information as the test counter and +where test output is going. + +If you want a completely new Test::Builder object different from the +singleton, use C. + +=cut + +my $Test = Test::Builder->new; +sub new { + my($class) = shift; + $Test ||= $class->create; + return $Test; +} + + +=item B + + my $Test = Test::Builder->create; + +Ok, so there can be more than one Test::Builder object and this is how +you get it. You might use this instead of C if you're testing +a Test::Builder based module, but otherwise you probably want C. + +B: the implementation is not complete. C, for example, is +still shared amongst B Test::Builder objects, even ones created using +this method. Also, the method name may change in the future. + +=cut + +sub create { + my $class = shift; + + my $self = bless {}, $class; + $self->reset; + + return $self; +} + +=item B + + $Test->reset; + +Reinitializes the Test::Builder singleton to its original state. +Mostly useful for tests run in persistent environments where the same +test might be run multiple times in the same process. + +=cut + +our ($Level); + +sub reset { + my ($self) = @_; + + # We leave this a global because it has to be localized and localizing + # hash keys is just asking for pain. Also, it was documented. + $Level = 1; + + $self->{Test_Died} = 0; + $self->{Have_Plan} = 0; + $self->{No_Plan} = 0; + $self->{Original_Pid} = $$; + + share($self->{Curr_Test}); + $self->{Curr_Test} = 0; + $self->{Test_Results} = &share([]); + + $self->{Exported_To} = undef; + $self->{Expected_Tests} = 0; + + $self->{Skip_All} = 0; + + $self->{Use_Nums} = 1; + + $self->{No_Header} = 0; + $self->{No_Ending} = 0; + + $self->_dup_stdhandles unless $^C; + + return undef; +} + +=back + +=head2 Setting up tests + +These methods are for setting up tests and declaring how many there +are. You usually only want to call one of these methods. + +=over 4 + +=item B + + my $pack = $Test->exported_to; + $Test->exported_to($pack); + +Tells Test::Builder what package you exported your functions to. +This is important for getting TODO tests right. + +=cut + +sub exported_to { + my($self, $pack) = @_; + + if( defined $pack ) { + $self->{Exported_To} = $pack; + } + return $self->{Exported_To}; +} + +=item B + + $Test->plan('no_plan'); + $Test->plan( skip_all => $reason ); + $Test->plan( tests => $num_tests ); + +A convenient way to set up your tests. Call this and Test::Builder +will print the appropriate headers and take the appropriate actions. + +If you call plan(), don't call any of the other methods below. + +=cut + +sub plan { + my($self, $cmd, $arg) = @_; + + return unless $cmd; + + if( $self->{Have_Plan} ) { + die sprintf "You tried to plan twice! Second plan at %s line %d\n", + ($self->caller)[1,2]; + } + + if( $cmd eq 'no_plan' ) { + $self->no_plan; + } + elsif( $cmd eq 'skip_all' ) { + return $self->skip_all($arg); + } + elsif( $cmd eq 'tests' ) { + if( $arg ) { + return $self->expected_tests($arg); + } + elsif( !defined $arg ) { + die "Got an undefined number of tests. Looks like you tried to ". + "say how many tests you plan to run but made a mistake.\n"; + } + elsif( !$arg ) { + die "You said to run 0 tests! You've got to run something.\n"; + } + } + else { + require Carp; + my @args = grep { defined } ($cmd, $arg); + Carp::croak("plan() doesn't understand @args"); + } + + return 1; +} + +=item B + + my $max = $Test->expected_tests; + $Test->expected_tests($max); + +Gets/sets the # of tests we expect this test to run and prints out +the appropriate headers. + +=cut + +sub expected_tests { + my $self = shift; + my($max) = @_; + + if( @_ ) { + die "Number of tests must be a postive integer. You gave it '$max'.\n" + unless $max =~ /^\+?\d+$/ and $max > 0; + + $self->{Expected_Tests} = $max; + $self->{Have_Plan} = 1; + + $self->_print("1..$max\n") unless $self->no_header; + } + return $self->{Expected_Tests}; +} + + +=item B + + $Test->no_plan; + +Declares that this test will run an indeterminate # of tests. + +=cut + +sub no_plan { + my $self = shift; + + $self->{No_Plan} = 1; + $self->{Have_Plan} = 1; +} + +=item B + + $plan = $Test->has_plan + +Find out whether a plan has been defined. $plan is either C (no plan has been set), C (indeterminate # of tests) or an integer (the number of expected tests). + +=cut + +sub has_plan { + my $self = shift; + + return($self->{Expected_Tests}) if $self->{Expected_Tests}; + return('no_plan') if $self->{No_Plan}; + return(undef); +}; + + +=item B + + $Test->skip_all; + $Test->skip_all($reason); + +Skips all the tests, using the given $reason. Exits immediately with 0. + +=cut + +sub skip_all { + my($self, $reason) = @_; + + my $out = "1..0"; + $out .= " # Skip $reason" if $reason; + $out .= "\n"; + + $self->{Skip_All} = 1; + + $self->_print($out) unless $self->no_header; + exit(0); +} + +=back + +=head2 Running tests + +These actually run the tests, analogous to the functions in +Test::More. + +$name is always optional. + +=over 4 + +=item B + + $Test->ok($test, $name); + +Your basic test. Pass if $test is true, fail if $test is false. Just +like Test::Simple's ok(). + +=cut + +sub ok { + my($self, $test, $name) = @_; + + # $test might contain an object which we don't want to accidentally + # store, so we turn it into a boolean. + $test = $test ? 1 : 0; + + unless( $self->{Have_Plan} ) { + require Carp; + Carp::croak("You tried to run a test without a plan! Gotta have a plan."); + } + + lock $self->{Curr_Test}; + $self->{Curr_Test}++; + + # In case $name is a string overloaded object, force it to stringify. + $self->_unoverload(\$name); + + $self->diag(<caller; + + my $todo = $self->todo($pack); + $self->_unoverload(\$todo); + + my $out; + my $result = &share({}); + + unless( $test ) { + $out .= "not "; + @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 ); + } + else { + @$result{ 'ok', 'actual_ok' } = ( 1, $test ); + } + + $out .= "ok"; + $out .= " $self->{Curr_Test}" if $self->use_numbers; + + if( defined $name ) { + $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. + $out .= " - $name"; + $result->{name} = $name; + } + else { + $result->{name} = ''; + } + + if( $todo ) { + $out .= " # TODO $todo"; + $result->{reason} = $todo; + $result->{type} = 'todo'; + } + else { + $result->{reason} = ''; + $result->{type} = ''; + } + + $self->{Test_Results}[$self->{Curr_Test}-1] = $result; + $out .= "\n"; + + $self->_print($out); + + unless( $test ) { + my $msg = $todo ? "Failed (TODO)" : "Failed"; + $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE}; + $self->diag(" $msg test ($file at line $line)\n"); + } + + return $test ? 1 : 0; +} + + +sub _unoverload { + my $self = shift; + + local($@,$!); + + eval { require overload } || return; + + foreach my $thing (@_) { + eval { + if( defined $$thing ) { + if( my $string_meth = overload::Method($$thing, '""') ) { + $$thing = $$thing->$string_meth(); + } + } + }; + } +} + + +=item B + + $Test->is_eq($got, $expected, $name); + +Like Test::More's is(). Checks if $got eq $expected. This is the +string version. + +=item B + + $Test->is_num($got, $expected, $name); + +Like Test::More's is(). Checks if $got == $expected. This is the +numeric version. + +=cut + +sub is_eq { + my($self, $got, $expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $expect ) { + # undef only matches undef and nothing else + my $test = !defined $got && !defined $expect; + + $self->ok($test, $name); + $self->_is_diag($got, 'eq', $expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, 'eq', $expect, $name); +} + +sub is_num { + my($self, $got, $expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $expect ) { + # undef only matches undef and nothing else + my $test = !defined $got && !defined $expect; + + $self->ok($test, $name); + $self->_is_diag($got, '==', $expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, '==', $expect, $name); +} + +sub _is_diag { + my($self, $got, $type, $expect) = @_; + + foreach my $val (\$got, \$expect) { + if( defined $$val ) { + if( $type eq 'eq' ) { + # quote and force string context + $$val = "'$$val'" + } + else { + # force numeric context + $$val = $$val+0; + } + } + else { + $$val = 'undef'; + } + } + + return $self->diag(sprintf < + + $Test->isnt_eq($got, $dont_expect, $name); + +Like Test::More's isnt(). Checks if $got ne $dont_expect. This is +the string version. + +=item B + + $Test->is_num($got, $dont_expect, $name); + +Like Test::More's isnt(). Checks if $got ne $dont_expect. This is +the numeric version. + +=cut + +sub isnt_eq { + my($self, $got, $dont_expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $dont_expect ) { + # undef only matches undef and nothing else + my $test = defined $got || defined $dont_expect; + + $self->ok($test, $name); + $self->_cmp_diag($got, 'ne', $dont_expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, 'ne', $dont_expect, $name); +} + +sub isnt_num { + my($self, $got, $dont_expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $dont_expect ) { + # undef only matches undef and nothing else + my $test = defined $got || defined $dont_expect; + + $self->ok($test, $name); + $self->_cmp_diag($got, '!=', $dont_expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, '!=', $dont_expect, $name); +} + + +=item B + + $Test->like($this, qr/$regex/, $name); + $Test->like($this, '/$regex/', $name); + +Like Test::More's like(). Checks if $this matches the given $regex. + +You'll want to avoid qr// if you want your tests to work before 5.005. + +=item B + + $Test->unlike($this, qr/$regex/, $name); + $Test->unlike($this, '/$regex/', $name); + +Like Test::More's unlike(). Checks if $this B the +given $regex. + +=cut + +sub like { + my($self, $this, $regex, $name) = @_; + + local $Level = $Level + 1; + $self->_regex_ok($this, $regex, '=~', $name); +} + +sub unlike { + my($self, $this, $regex, $name) = @_; + + local $Level = $Level + 1; + $self->_regex_ok($this, $regex, '!~', $name); +} + +=item B + + $Test->maybe_regex(qr/$regex/); + $Test->maybe_regex('/$regex/'); + +Convenience method for building testing functions that take regular +expressions as arguments, but need to work before perl 5.005. + +Takes a quoted regular expression produced by qr//, or a string +representing a regular expression. + +Returns a Perl value which may be used instead of the corresponding +regular expression, or undef if it's argument is not recognised. + +For example, a version of like(), sans the useful diagnostic messages, +could be written as: + + sub laconic_like { + my ($self, $this, $regex, $name) = @_; + my $usable_regex = $self->maybe_regex($regex); + die "expecting regex, found '$regex'\n" + unless $usable_regex; + $self->ok($this =~ m/$usable_regex/, $name); + } + +=cut + + +sub maybe_regex { + my ($self, $regex) = @_; + my $usable_regex = undef; + + return $usable_regex unless defined $regex; + + my($re, $opts); + + # Check for qr/foo/ + if( ref $regex eq 'Regexp' ) { + $usable_regex = $regex; + } + # Check for '/foo/' or 'm,foo,' + elsif( ($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx or + (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx + ) + { + $usable_regex = length $opts ? "(?$opts)$re" : $re; + } + + return $usable_regex; +}; + +sub _regex_ok { + my($self, $this, $regex, $cmp, $name) = @_; + + local $Level = $Level + 1; + + my $ok = 0; + my $usable_regex = $self->maybe_regex($regex); + unless (defined $usable_regex) { + $ok = $self->ok( 0, $name ); + $self->diag(" '$regex' doesn't look much like a regex to me."); + return $ok; + } + + { + local $^W = 0; + my $test = $this =~ /$usable_regex/ ? 1 : 0; + $test = !$test if $cmp eq '!~'; + $ok = $self->ok( $test, $name ); + } + + unless( $ok ) { + $this = defined $this ? "'$this'" : 'undef'; + my $match = $cmp eq '=~' ? "doesn't match" : "matches"; + $self->diag(sprintf < + + $Test->cmp_ok($this, $type, $that, $name); + +Works just like Test::More's cmp_ok(). + + $Test->cmp_ok($big_num, '!=', $other_big_num); + +=cut + +sub cmp_ok { + my($self, $got, $type, $expect, $name) = @_; + + my $test; + { + local $^W = 0; + local($@,$!); # don't interfere with $@ + # eval() sometimes resets $! + $test = eval "\$got $type \$expect"; + } + local $Level = $Level + 1; + my $ok = $self->ok($test, $name); + + unless( $ok ) { + if( $type =~ /^(eq|==)$/ ) { + $self->_is_diag($got, $type, $expect); + } + else { + $self->_cmp_diag($got, $type, $expect); + } + } + return $ok; +} + +sub _cmp_diag { + my($self, $got, $type, $expect) = @_; + + $got = defined $got ? "'$got'" : 'undef'; + $expect = defined $expect ? "'$expect'" : 'undef'; + return $self->diag(sprintf < + + $Test->BAILOUT($reason); + +Indicates to the Test::Harness that things are going so badly all +testing should terminate. This includes running any additional test +scripts. + +It will exit with 255. + +=cut + +sub BAILOUT { + my($self, $reason) = @_; + + $self->_print("Bail out! $reason"); + exit 255; +} + +=item B + + $Test->skip; + $Test->skip($why); + +Skips the current test, reporting $why. + +=cut + +sub skip { + my($self, $why) = @_; + $why ||= ''; + $self->_unoverload(\$why); + + unless( $self->{Have_Plan} ) { + require Carp; + Carp::croak("You tried to run tests without a plan! Gotta have a plan."); + } + + lock($self->{Curr_Test}); + $self->{Curr_Test}++; + + $self->{Test_Results}[$self->{Curr_Test}-1] = &share({ + 'ok' => 1, + actual_ok => 1, + name => '', + type => 'skip', + reason => $why, + }); + + my $out = "ok"; + $out .= " $self->{Curr_Test}" if $self->use_numbers; + $out .= " # skip"; + $out .= " $why" if length $why; + $out .= "\n"; + + $self->_print($out); + + return 1; +} + + +=item B + + $Test->todo_skip; + $Test->todo_skip($why); + +Like skip(), only it will declare the test as failing and TODO. Similar +to + + print "not ok $tnum # TODO $why\n"; + +=cut + +sub todo_skip { + my($self, $why) = @_; + $why ||= ''; + + unless( $self->{Have_Plan} ) { + require Carp; + Carp::croak("You tried to run tests without a plan! Gotta have a plan."); + } + + lock($self->{Curr_Test}); + $self->{Curr_Test}++; + + $self->{Test_Results}[$self->{Curr_Test}-1] = &share({ + 'ok' => 1, + actual_ok => 0, + name => '', + type => 'todo_skip', + reason => $why, + }); + + my $out = "not ok"; + $out .= " $self->{Curr_Test}" if $self->use_numbers; + $out .= " # TODO & SKIP $why\n"; + + $self->_print($out); + + return 1; +} + + +=begin _unimplemented + +=item B + + $Test->skip_rest; + $Test->skip_rest($reason); + +Like skip(), only it skips all the rest of the tests you plan to run +and terminates the test. + +If you're running under no_plan, it skips once and terminates the +test. + +=end _unimplemented + +=back + + +=head2 Test style + +=over 4 + +=item B + + $Test->level($how_high); + +How far up the call stack should $Test look when reporting where the +test failed. + +Defaults to 1. + +Setting $Test::Builder::Level overrides. This is typically useful +localized: + + { + local $Test::Builder::Level = 2; + $Test->ok($test); + } + +=cut + +sub level { + my($self, $level) = @_; + + if( defined $level ) { + $Level = $level; + } + return $Level; +} + + +=item B + + $Test->use_numbers($on_or_off); + +Whether or not the test should output numbers. That is, this if true: + + ok 1 + ok 2 + ok 3 + +or this if false + + ok + ok + ok + +Most useful when you can't depend on the test output order, such as +when threads or forking is involved. + +Test::Harness will accept either, but avoid mixing the two styles. + +Defaults to on. + +=cut + +sub use_numbers { + my($self, $use_nums) = @_; + + if( defined $use_nums ) { + $self->{Use_Nums} = $use_nums; + } + return $self->{Use_Nums}; +} + +=item B + + $Test->no_header($no_header); + +If set to true, no "1..N" header will be printed. + +=item B + + $Test->no_ending($no_ending); + +Normally, Test::Builder does some extra diagnostics when the test +ends. It also changes the exit code as described below. + +If this is true, none of that will be done. + +=cut + +sub no_header { + my($self, $no_header) = @_; + + if( defined $no_header ) { + $self->{No_Header} = $no_header; + } + return $self->{No_Header}; +} + +sub no_ending { + my($self, $no_ending) = @_; + + if( defined $no_ending ) { + $self->{No_Ending} = $no_ending; + } + return $self->{No_Ending}; +} + + +=back + +=head2 Output + +Controlling where the test output goes. + +It's ok for your test to change where STDOUT and STDERR point to, +Test::Builder's default output settings will not be affected. + +=over 4 + +=item B + + $Test->diag(@msgs); + +Prints out the given @msgs. Like C, arguments are simply +appended together. + +Normally, it uses the failure_output() handle, but if this is for a +TODO test, the todo_output() handle is used. + +Output will be indented and marked with a # so as not to interfere +with test output. A newline will be put on the end if there isn't one +already. + +We encourage using this rather than calling print directly. + +Returns false. Why? Because diag() is often used in conjunction with +a failing test (C) it "passes through" the failure. + + return ok(...) || diag(...); + +=for blame transfer +Mark Fowler + +=cut + +sub diag { + my($self, @msgs) = @_; + return unless @msgs; + + # Prevent printing headers when compiling (i.e. -c) + return if $^C; + + # Smash args together like print does. + # Convert undef to 'undef' so its readable. + my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs; + + # Escape each line with a #. + $msg =~ s/^/# /gm; + + # Stick a newline on the end if it needs it. + $msg .= "\n" unless $msg =~ /\n\Z/; + + local $Level = $Level + 1; + $self->_print_diag($msg); + + return 0; +} + +=begin _private + +=item B<_print> + + $Test->_print(@msgs); + +Prints to the output() filehandle. + +=end _private + +=cut + +sub _print { + my($self, @msgs) = @_; + + # Prevent printing headers when only compiling. Mostly for when + # tests are deparsed with B::Deparse + return if $^C; + + my $msg = join '', @msgs; + + local($\, $", $,) = (undef, ' ', ''); + my $fh = $self->output; + + # Escape each line after the first with a # so we don't + # confuse Test::Harness. + $msg =~ s/\n(.)/\n# $1/sg; + + # Stick a newline on the end if it needs it. + $msg .= "\n" unless $msg =~ /\n\Z/; + + print $fh $msg; +} + + +=item B<_print_diag> + + $Test->_print_diag(@msg); + +Like _print, but prints to the current diagnostic filehandle. + +=cut + +sub _print_diag { + my $self = shift; + + local($\, $", $,) = (undef, ' ', ''); + my $fh = $self->todo ? $self->todo_output : $self->failure_output; + print $fh @_; +} + +=item B + + $Test->output($fh); + $Test->output($file); + +Where normal "ok/not ok" test output should go. + +Defaults to STDOUT. + +=item B + + $Test->failure_output($fh); + $Test->failure_output($file); + +Where diagnostic output on test failures and diag() should go. + +Defaults to STDERR. + +=item B + + $Test->todo_output($fh); + $Test->todo_output($file); + +Where diagnostics about todo test failures and diag() should go. + +Defaults to STDOUT. + +=cut + +sub output { + my($self, $fh) = @_; + + if( defined $fh ) { + $self->{Out_FH} = _new_fh($fh); + } + return $self->{Out_FH}; +} + +sub failure_output { + my($self, $fh) = @_; + + if( defined $fh ) { + $self->{Fail_FH} = _new_fh($fh); + } + return $self->{Fail_FH}; +} + +sub todo_output { + my($self, $fh) = @_; + + if( defined $fh ) { + $self->{Todo_FH} = _new_fh($fh); + } + return $self->{Todo_FH}; +} + + +sub _new_fh { + my($file_or_fh) = shift; + + my $fh; + if( _is_fh($file_or_fh) ) { + $fh = $file_or_fh; + } + else { + $fh = do { local *FH }; + open $fh, ">$file_or_fh" or + die "Can't open test output log $file_or_fh: $!"; + _autoflush($fh); + } + + return $fh; +} + + +sub _is_fh { + my $maybe_fh = shift; + + return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob + + return UNIVERSAL::isa($maybe_fh, 'GLOB') || + UNIVERSAL::isa($maybe_fh, 'IO::Handle') || + + # 5.5.4's tied() and can() doesn't like getting undef + UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE'); +} + + +sub _autoflush { + my($fh) = shift; + my $old_fh = select $fh; + $| = 1; + select $old_fh; +} + + +sub _dup_stdhandles { + my $self = shift; + + $self->_open_testhandles; + + # Set everything to unbuffered else plain prints to STDOUT will + # come out in the wrong order from our own prints. + _autoflush(\*TESTOUT); + _autoflush(\*STDOUT); + _autoflush(\*TESTERR); + _autoflush(\*STDERR); + + $self->output(\*TESTOUT); + $self->failure_output(\*TESTERR); + $self->todo_output(\*TESTOUT); +} + + +my $Opened_Testhandles = 0; +sub _open_testhandles { + return if $Opened_Testhandles; + # We dup STDOUT and STDERR so people can change them in their + # test suites while still getting normal test output. + open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!"; + open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!"; + $Opened_Testhandles = 1; +} + + +=back + + +=head2 Test Status and Info + +=over 4 + +=item B + + my $curr_test = $Test->current_test; + $Test->current_test($num); + +Gets/sets the current test number we're on. You usually shouldn't +have to set this. + +If set forward, the details of the missing tests are filled in as 'unknown'. +if set backward, the details of the intervening tests are deleted. You +can erase history if you really want to. + +=cut + +sub current_test { + my($self, $num) = @_; + + lock($self->{Curr_Test}); + if( defined $num ) { + unless( $self->{Have_Plan} ) { + require Carp; + Carp::croak("Can't change the current test number without a plan!"); + } + + $self->{Curr_Test} = $num; + + # If the test counter is being pushed forward fill in the details. + my $test_results = $self->{Test_Results}; + if( $num > @$test_results ) { + my $start = @$test_results ? @$test_results : 0; + for ($start..$num-1) { + $test_results->[$_] = &share({ + 'ok' => 1, + actual_ok => undef, + reason => 'incrementing test number', + type => 'unknown', + name => undef + }); + } + } + # If backward, wipe history. Its their funeral. + elsif( $num < @$test_results ) { + $#{$test_results} = $num - 1; + } + } + return $self->{Curr_Test}; +} + + +=item B + + my @tests = $Test->summary; + +A simple summary of the tests so far. True for pass, false for fail. +This is a logical pass/fail, so todos are passes. + +Of course, test #1 is $tests[0], etc... + +=cut + +sub summary { + my($self) = shift; + + return map { $_->{'ok'} } @{ $self->{Test_Results} }; +} + +=item B
+ + my @tests = $Test->details; + +Like summary(), but with a lot more detail. + + $tests[$test_num - 1] = + { 'ok' => is the test considered a pass? + actual_ok => did it literally say 'ok'? + name => name of the test (if any) + type => type of test (if any, see below). + reason => reason for the above (if any) + }; + +'ok' is true if Test::Harness will consider the test to be a pass. + +'actual_ok' is a reflection of whether or not the test literally +printed 'ok' or 'not ok'. This is for examining the result of 'todo' +tests. + +'name' is the name of the test. + +'type' indicates if it was a special test. Normal tests have a type +of ''. Type can be one of the following: + + skip see skip() + todo see todo() + todo_skip see todo_skip() + unknown see below + +Sometimes the Test::Builder test counter is incremented without it +printing any test output, for example, when current_test() is changed. +In these cases, Test::Builder doesn't know the result of the test, so +it's type is 'unkown'. These details for these tests are filled in. +They are considered ok, but the name and actual_ok is left undef. + +For example "not ok 23 - hole count # TODO insufficient donuts" would +result in this structure: + + $tests[22] = # 23 - 1, since arrays start from 0. + { ok => 1, # logically, the test passed since it's todo + actual_ok => 0, # in absolute terms, it failed + name => 'hole count', + type => 'todo', + reason => 'insufficient donuts' + }; + +=cut + +sub details { + my $self = shift; + return @{ $self->{Test_Results} }; +} + +=item B + + my $todo_reason = $Test->todo; + my $todo_reason = $Test->todo($pack); + +todo() looks for a $TODO variable in your tests. If set, all tests +will be considered 'todo' (see Test::More and Test::Harness for +details). Returns the reason (ie. the value of $TODO) if running as +todo tests, false otherwise. + +todo() is about finding the right package to look for $TODO in. It +uses the exported_to() package to find it. If that's not set, it's +pretty good at guessing the right package to look at based on $Level. + +Sometimes there is some confusion about where todo() should be looking +for the $TODO variable. If you want to be sure, tell it explicitly +what $pack to use. + +=cut + +sub todo { + my($self, $pack) = @_; + + $pack = $pack || $self->exported_to || $self->caller($Level); + return 0 unless $pack; + + no strict 'refs'; + return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'} + : 0; +} + +=item B + + my $package = $Test->caller; + my($pack, $file, $line) = $Test->caller; + my($pack, $file, $line) = $Test->caller($height); + +Like the normal caller(), except it reports according to your level(). + +=cut + +sub caller { + my($self, $height) = @_; + $height ||= 0; + + my @caller = CORE::caller($self->level + $height + 1); + return wantarray ? @caller : $caller[0]; +} + +=back + +=cut + +=begin _private + +=over 4 + +=item B<_sanity_check> + + $self->_sanity_check(); + +Runs a bunch of end of test sanity checks to make sure reality came +through ok. If anything is wrong it will die with a fairly friendly +error message. + +=cut + +#'# +sub _sanity_check { + my $self = shift; + + _whoa($self->{Curr_Test} < 0, 'Says here you ran a negative number of tests!'); + _whoa(!$self->{Have_Plan} and $self->{Curr_Test}, + 'Somehow your tests ran without a plan!'); + _whoa($self->{Curr_Test} != @{ $self->{Test_Results} }, + 'Somehow you got a different number of results than tests ran!'); +} + +=item B<_whoa> + + _whoa($check, $description); + +A sanity check, similar to assert(). If the $check is true, something +has gone horribly wrong. It will die with the given $description and +a note to contact the author. + +=cut + +sub _whoa { + my($check, $desc) = @_; + if( $check ) { + die < + + _my_exit($exit_num); + +Perl seems to have some trouble with exiting inside an END block. 5.005_03 +and 5.6.1 both seem to do odd things. Instead, this function edits $? +directly. It should ONLY be called from inside an END block. It +doesn't actually exit, that's your job. + +=cut + +sub _my_exit { + $? = $_[0]; + + return 1; +} + + +=back + +=end _private + +=cut + +$SIG{__DIE__} = sub { + # We don't want to muck with death in an eval, but $^S isn't + # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing + # with it. Instead, we use caller. This also means it runs under + # 5.004! + my $in_eval = 0; + for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) { + $in_eval = 1 if $sub =~ /^\(eval\)/; + } + $Test->{Test_Died} = 1 unless $in_eval; +}; + +sub _ending { + my $self = shift; + + $self->_sanity_check(); + + # Don't bother with an ending if this is a forked copy. Only the parent + # should do the ending. + # Exit if plan() was never called. This is so "require Test::Simple" + # doesn't puke. + if( ($self->{Original_Pid} != $$) or + (!$self->{Have_Plan} && !$self->{Test_Died}) ) + { + _my_exit($?); + return; + } + + # Figure out if we passed or failed and print helpful messages. + my $test_results = $self->{Test_Results}; + if( @$test_results ) { + # The plan? We have no plan. + if( $self->{No_Plan} ) { + $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header; + $self->{Expected_Tests} = $self->{Curr_Test}; + } + + # Auto-extended arrays and elements which aren't explicitly + # filled in with a shared reference will puke under 5.8.0 + # ithreads. So we have to fill them in by hand. :( + my $empty_result = &share({}); + for my $idx ( 0..$self->{Expected_Tests}-1 ) { + $test_results->[$idx] = $empty_result + unless defined $test_results->[$idx]; + } + + my $num_failed = grep !$_->{'ok'}, + @{$test_results}[0..$self->{Expected_Tests}-1]; + $num_failed += abs($self->{Expected_Tests} - @$test_results); + + if( $self->{Curr_Test} < $self->{Expected_Tests} ) { + my $s = $self->{Expected_Tests} == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}. +FAIL + } + elsif( $self->{Curr_Test} > $self->{Expected_Tests} ) { + my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests}; + my $s = $self->{Expected_Tests} == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra. +FAIL + } + elsif ( $num_failed ) { + my $s = $num_failed == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you failed $num_failed test$s of $self->{Expected_Tests}. +FAIL + } + + if( $self->{Test_Died} ) { + $self->diag(<<"FAIL"); +Looks like your test died just after $self->{Curr_Test}. +FAIL + + _my_exit( 255 ) && return; + } + + _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return; + } + elsif ( $self->{Skip_All} ) { + _my_exit( 0 ) && return; + } + elsif ( $self->{Test_Died} ) { + $self->diag(<<'FAIL'); +Looks like your test died before it could output anything. +FAIL + _my_exit( 255 ) && return; + } + else { + $self->diag("No tests run!\n"); + _my_exit( 255 ) && return; + } +} + +END { + $Test->_ending if defined $Test and !$Test->no_ending; +} + +=head1 EXIT CODES + +If all your tests passed, Test::Builder will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Builder +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + + +=head1 THREADS + +In perl 5.8.0 and later, Test::Builder is thread-safe. The test +number is shared amongst all threads. This means if one thread sets +the test number using current_test() they will all be effected. + +Test::Builder is only thread-aware if threads.pm is loaded I +Test::Builder. + +=head1 EXAMPLES + +CPAN can provide the best examples. Test::Simple, Test::More, +Test::Exception and Test::Differences all use Test::Builder. + +=head1 SEE ALSO + +Test::Simple, Test::More, Test::Harness + +=head1 AUTHORS + +Original code by chromatic, maintained by Michael G Schwern +Eschwern@pobox.comE + +=head1 COPYRIGHT + +Copyright 2002, 2004 by chromatic Echromatic@wgz.orgE and + Michael G Schwern Eschwern@pobox.comE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F + +=cut + +1; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/More.pm b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/More.pm new file mode 100644 index 0000000..74eaa42 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/More.pm @@ -0,0 +1,1493 @@ +package Test::More; + +use 5.004; + +use strict; +use Test::Builder; + + +# Can't use Carp because it might cause use_ok() to accidentally succeed +# even though the module being used forgot to use Carp. Yes, this +# actually happened. +sub _carp { + my($file, $line) = (caller(1))[1,2]; + warn @_, " at $file line $line\n"; +} + + + +require Exporter; +our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $TODO); +$VERSION = '0.60'; +$VERSION = eval $VERSION; # make the alpha version come out as a number + +@ISA = qw(Exporter); +@EXPORT = qw(ok use_ok require_ok + is isnt like unlike is_deeply + cmp_ok + skip todo todo_skip + pass fail + eq_array eq_hash eq_set + $TODO + plan + can_ok isa_ok + diag + ); + +my $Test = Test::Builder->new; +my $Show_Diag = 1; + + +# 5.004's Exporter doesn't have export_to_level. +sub _export_to_level +{ + my $pkg = shift; + my $level = shift; + (undef) = shift; # redundant arg + my $callpkg = caller($level); + $pkg->export($callpkg, @_); +} + + +=head1 NAME + +Test::More - yet another framework for writing test scripts + +=head1 SYNOPSIS + + use Test::More tests => $Num_Tests; + # or + use Test::More qw(no_plan); + # or + use Test::More skip_all => $reason; + + BEGIN { use_ok( 'Some::Module' ); } + require_ok( 'Some::Module' ); + + # Various ways to say "ok" + ok($this eq $that, $test_name); + + is ($this, $that, $test_name); + isnt($this, $that, $test_name); + + # Rather than print STDERR "# here's what went wrong\n" + diag("here's what went wrong"); + + like ($this, qr/that/, $test_name); + unlike($this, qr/that/, $test_name); + + cmp_ok($this, '==', $that, $test_name); + + is_deeply($complex_structure1, $complex_structure2, $test_name); + + SKIP: { + skip $why, $how_many unless $have_some_feature; + + ok( foo(), $test_name ); + is( foo(42), 23, $test_name ); + }; + + TODO: { + local $TODO = $why; + + ok( foo(), $test_name ); + is( foo(42), 23, $test_name ); + }; + + can_ok($module, @methods); + isa_ok($object, $class); + + pass($test_name); + fail($test_name); + + # UNIMPLEMENTED!!! + my @status = Test::More::status; + + # UNIMPLEMENTED!!! + BAIL_OUT($why); + + +=head1 DESCRIPTION + +B If you're just getting started writing tests, have a look at +Test::Simple first. This is a drop in replacement for Test::Simple +which you can switch to once you get the hang of basic testing. + +The purpose of this module is to provide a wide range of testing +utilities. Various ways to say "ok" with better diagnostics, +facilities to skip tests, test future features and compare complicated +data structures. While you can do almost anything with a simple +C function, it doesn't provide good diagnostic output. + + +=head2 I love it when a plan comes together + +Before anything else, you need a testing plan. This basically declares +how many tests your script is going to run to protect against premature +failure. + +The preferred way to do this is to declare a plan when you C. + + use Test::More tests => $Num_Tests; + +There are rare cases when you will not know beforehand how many tests +your script is going to run. In this case, you can declare that you +have no plan. (Try to avoid using this as it weakens your test.) + + use Test::More qw(no_plan); + +B: using no_plan requires a Test::Harness upgrade else it will +think everything has failed. See L) + +In some cases, you'll want to completely skip an entire testing script. + + use Test::More skip_all => $skip_reason; + +Your script will declare a skip with the reason why you skipped and +exit immediately with a zero (success). See L for +details. + +If you want to control what functions Test::More will export, you +have to use the 'import' option. For example, to import everything +but 'fail', you'd do: + + use Test::More tests => 23, import => ['!fail']; + +Alternatively, you can use the plan() function. Useful for when you +have to calculate the number of tests. + + use Test::More; + plan tests => keys %Stuff * 3; + +or for deciding between running the tests at all: + + use Test::More; + if( $^O eq 'MacOS' ) { + plan skip_all => 'Test irrelevant on MacOS'; + } + else { + plan tests => 42; + } + +=cut + +sub plan { + my(@plan) = @_; + + my $idx = 0; + my @cleaned_plan; + while( $idx <= $#plan ) { + my $item = $plan[$idx]; + + if( $item eq 'no_diag' ) { + $Show_Diag = 0; + } + else { + push @cleaned_plan, $item; + } + + $idx++; + } + + $Test->plan(@cleaned_plan); +} + +sub import { + my($class) = shift; + + my $caller = caller; + + $Test->exported_to($caller); + + my $idx = 0; + my @plan; + my @imports; + while( $idx <= $#_ ) { + my $item = $_[$idx]; + + if( $item eq 'import' ) { + push @imports, @{$_[$idx+1]}; + $idx++; + } + else { + push @plan, $item; + } + + $idx++; + } + + plan(@plan); + + __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports); +} + + +=head2 Test names + +By convention, each test is assigned a number in order. This is +largely done automatically for you. However, it's often very useful to +assign a name to each test. Which would you rather see: + + ok 4 + not ok 5 + ok 6 + +or + + ok 4 - basic multi-variable + not ok 5 - simple exponential + ok 6 - force == mass * acceleration + +The later gives you some idea of what failed. It also makes it easier +to find the test in your script, simply search for "simple +exponential". + +All test functions take a name argument. It's optional, but highly +suggested that you use it. + + +=head2 I'm ok, you're not ok. + +The basic purpose of this module is to print out either "ok #" or "not +ok #" depending on if a given test succeeded or failed. Everything +else is just gravy. + +All of the following print "ok" or "not ok" depending on if the test +succeeded or failed. They all also return true or false, +respectively. + +=over 4 + +=item B + + ok($this eq $that, $test_name); + +This simply evaluates any expression (C<$this eq $that> is just a +simple example) and uses that to determine if the test succeeded or +failed. A true expression passes, a false one fails. Very simple. + +For example: + + ok( $exp{9} == 81, 'simple exponential' ); + ok( Film->can('db_Main'), 'set_db()' ); + ok( $p->tests == 4, 'saw tests' ); + ok( !grep !defined $_, @items, 'items populated' ); + +(Mnemonic: "This is ok.") + +$test_name is a very short description of the test that will be printed +out. It makes it very easy to find a test in your script when it fails +and gives others an idea of your intentions. $test_name is optional, +but we B strongly encourage its use. + +Should an ok() fail, it will produce some diagnostics: + + not ok 18 - sufficient mucus + # Failed test 18 (foo.t at line 42) + +This is actually Test::Simple's ok() routine. + +=cut + +sub ok ($;$) { + my($test, $name) = @_; + $Test->ok($test, $name); +} + +=item B + +=item B + + is ( $this, $that, $test_name ); + isnt( $this, $that, $test_name ); + +Similar to ok(), is() and isnt() compare their two arguments +with C and C respectively and use the result of that to +determine if the test succeeded or failed. So these: + + # Is the ultimate answer 42? + is( ultimate_answer(), 42, "Meaning of Life" ); + + # $foo isn't empty + isnt( $foo, '', "Got some foo" ); + +are similar to these: + + ok( ultimate_answer() eq 42, "Meaning of Life" ); + ok( $foo ne '', "Got some foo" ); + +(Mnemonic: "This is that." "This isn't that.") + +So why use these? They produce better diagnostics on failure. ok() +cannot know what you are testing for (beyond the name), but is() and +isnt() know what the test was and why it failed. For example this +test: + + my $foo = 'waffle'; my $bar = 'yarblokos'; + is( $foo, $bar, 'Is foo the same as bar?' ); + +Will produce something like this: + + not ok 17 - Is foo the same as bar? + # Failed test (foo.t at line 139) + # got: 'waffle' + # expected: 'yarblokos' + +So you can figure out what went wrong without rerunning the test. + +You are encouraged to use is() and isnt() over ok() where possible, +however do not be tempted to use them to find out if something is +true or false! + + # XXX BAD! + is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' ); + +This does not check if C is true, it checks if +it returns 1. Very different. Similar caveats exist for false and 0. +In these cases, use ok(). + + ok( exists $brooklyn{tree}, 'A tree grows in Brooklyn' ); + +For those grammatical pedants out there, there's an C +function which is an alias of isnt(). + +=cut + +sub is ($$;$) { + $Test->is_eq(@_); +} + +sub isnt ($$;$) { + $Test->isnt_eq(@_); +} + +*isn't = \&isnt; + + +=item B + + like( $this, qr/that/, $test_name ); + +Similar to ok(), like() matches $this against the regex C. + +So this: + + like($this, qr/that/, 'this is like that'); + +is similar to: + + ok( $this =~ /that/, 'this is like that'); + +(Mnemonic "This is like that".) + +The second argument is a regular expression. It may be given as a +regex reference (i.e. C) or (for better compatibility with older +perls) as a string that looks like a regex (alternative delimiters are +currently not supported): + + like( $this, '/that/', 'this is like that' ); + +Regex options may be placed on the end (C<'/that/i'>). + +Its advantages over ok() are similar to that of is() and isnt(). Better +diagnostics on failure. + +=cut + +sub like ($$;$) { + $Test->like(@_); +} + + +=item B + + unlike( $this, qr/that/, $test_name ); + +Works exactly as like(), only it checks if $this B match the +given pattern. + +=cut + +sub unlike ($$;$) { + $Test->unlike(@_); +} + + +=item B + + cmp_ok( $this, $op, $that, $test_name ); + +Halfway between ok() and is() lies cmp_ok(). This allows you to +compare two arguments using any binary perl operator. + + # ok( $this eq $that ); + cmp_ok( $this, 'eq', $that, 'this eq that' ); + + # ok( $this == $that ); + cmp_ok( $this, '==', $that, 'this == that' ); + + # ok( $this && $that ); + cmp_ok( $this, '&&', $that, 'this && that' ); + ...etc... + +Its advantage over ok() is when the test fails you'll know what $this +and $that were: + + not ok 1 + # Failed test (foo.t at line 12) + # '23' + # && + # undef + +It's also useful in those cases where you are comparing numbers and +is()'s use of C will interfere: + + cmp_ok( $big_hairy_number, '==', $another_big_hairy_number ); + +=cut + +sub cmp_ok($$$;$) { + $Test->cmp_ok(@_); +} + + +=item B + + can_ok($module, @methods); + can_ok($object, @methods); + +Checks to make sure the $module or $object can do these @methods +(works with functions, too). + + can_ok('Foo', qw(this that whatever)); + +is almost exactly like saying: + + ok( Foo->can('this') && + Foo->can('that') && + Foo->can('whatever') + ); + +only without all the typing and with a better interface. Handy for +quickly testing an interface. + +No matter how many @methods you check, a single can_ok() call counts +as one test. If you desire otherwise, use: + + foreach my $meth (@methods) { + can_ok('Foo', $meth); + } + +=cut + +sub can_ok ($@) { + my($proto, @methods) = @_; + my $class = ref $proto || $proto; + + unless( @methods ) { + my $ok = $Test->ok( 0, "$class->can(...)" ); + $Test->diag(' can_ok() called with no methods'); + return $ok; + } + + my @nok = (); + foreach my $method (@methods) { + local($!, $@); # don't interfere with caller's $@ + # eval sometimes resets $! + eval { $proto->can($method) } || push @nok, $method; + } + + my $name; + $name = @methods == 1 ? "$class->can('$methods[0]')" + : "$class->can(...)"; + + my $ok = $Test->ok( !@nok, $name ); + + $Test->diag(map " $class->can('$_') failed\n", @nok); + + return $ok; +} + +=item B + + isa_ok($object, $class, $object_name); + isa_ok($ref, $type, $ref_name); + +Checks to see if the given C<< $object->isa($class) >>. Also checks to make +sure the object was defined in the first place. Handy for this sort +of thing: + + my $obj = Some::Module->new; + isa_ok( $obj, 'Some::Module' ); + +where you'd otherwise have to write + + my $obj = Some::Module->new; + ok( defined $obj && $obj->isa('Some::Module') ); + +to safeguard against your test script blowing up. + +It works on references, too: + + isa_ok( $array_ref, 'ARRAY' ); + +The diagnostics of this test normally just refer to 'the object'. If +you'd like them to be more specific, you can supply an $object_name +(for example 'Test customer'). + +=cut + +sub isa_ok ($$;$) { + my($object, $class, $obj_name) = @_; + + my $diag; + $obj_name = 'The object' unless defined $obj_name; + my $name = "$obj_name isa $class"; + if( !defined $object ) { + $diag = "$obj_name isn't defined"; + } + elsif( !ref $object ) { + $diag = "$obj_name isn't a reference"; + } + else { + # We can't use UNIVERSAL::isa because we want to honor isa() overrides + local($@, $!); # eval sometimes resets $! + my $rslt = eval { $object->isa($class) }; + if( $@ ) { + if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) { + if( !UNIVERSAL::isa($object, $class) ) { + my $ref = ref $object; + $diag = "$obj_name isn't a '$class' it's a '$ref'"; + } + } else { + die <isa on your object and got some weird error. +This should never happen. Please contact the author immediately. +Here's the error. +$@ +WHOA + } + } + elsif( !$rslt ) { + my $ref = ref $object; + $diag = "$obj_name isn't a '$class' it's a '$ref'"; + } + } + + + + my $ok; + if( $diag ) { + $ok = $Test->ok( 0, $name ); + $Test->diag(" $diag\n"); + } + else { + $ok = $Test->ok( 1, $name ); + } + + return $ok; +} + + +=item B + +=item B + + pass($test_name); + fail($test_name); + +Sometimes you just want to say that the tests have passed. Usually +the case is you've got some complicated condition that is difficult to +wedge into an ok(). In this case, you can simply use pass() (to +declare the test ok) or fail (for not ok). They are synonyms for +ok(1) and ok(0). + +Use these very, very, very sparingly. + +=cut + +sub pass (;$) { + $Test->ok(1, @_); +} + +sub fail (;$) { + $Test->ok(0, @_); +} + +=back + +=head2 Diagnostics + +If you pick the right test function, you'll usually get a good idea of +what went wrong when it failed. But sometimes it doesn't work out +that way. So here we have ways for you to write your own diagnostic +messages which are safer than just C. + +=over 4 + +=item B + + diag(@diagnostic_message); + +Prints a diagnostic message which is guaranteed not to interfere with +test output. Like C @diagnostic_message is simply concatinated +together. + +Handy for this sort of thing: + + ok( grep(/foo/, @users), "There's a foo user" ) or + diag("Since there's no foo, check that /etc/bar is set up right"); + +which would produce: + + not ok 42 - There's a foo user + # Failed test (foo.t at line 52) + # Since there's no foo, check that /etc/bar is set up right. + +You might remember C with the mnemonic C. + +All diag()s can be made silent by passing the "no_diag" option to +Test::More. C 1, 'no_diag'>. This is useful +if you have diagnostics for personal testing but then wish to make +them silent for release without commenting out each individual +statement. + +B The exact formatting of the diagnostic output is still +changing, but it is guaranteed that whatever you throw at it it won't +interfere with the test. + +=cut + +sub diag { + return unless $Show_Diag; + $Test->diag(@_); +} + + +=back + +=head2 Module tests + +You usually want to test if the module you're testing loads ok, rather +than just vomiting if its load fails. For such purposes we have +C and C. + +=over 4 + +=item B + + BEGIN { use_ok($module); } + BEGIN { use_ok($module, @imports); } + +These simply use the given $module and test to make sure the load +happened ok. It's recommended that you run use_ok() inside a BEGIN +block so its functions are exported at compile-time and prototypes are +properly honored. + +If @imports are given, they are passed through to the use. So this: + + BEGIN { use_ok('Some::Module', qw(foo bar)) } + +is like doing this: + + use Some::Module qw(foo bar); + +Version numbers can be checked like so: + + # Just like "use Some::Module 1.02" + BEGIN { use_ok('Some::Module', 1.02) } + +Don't try to do this: + + BEGIN { + use_ok('Some::Module'); + + ...some code that depends on the use... + ...happening at compile time... + } + +because the notion of "compile-time" is relative. Instead, you want: + + BEGIN { use_ok('Some::Module') } + BEGIN { ...some code that depends on the use... } + + +=cut + +sub use_ok ($;@) { + my($module, @imports) = @_; + @imports = () unless @imports; + + my($pack,$filename,$line) = caller; + + local($@,$!); # eval sometimes interferes with $! + + if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) { + # probably a version check. Perl needs to see the bare number + # for it to work with non-Exporter based modules. + eval <ok( !$@, "use $module;" ); + + unless( $ok ) { + chomp $@; + $@ =~ s{^BEGIN failed--compilation aborted at .*$} + {BEGIN failed--compilation aborted at $filename line $line.}m; + $Test->diag(< + + require_ok($module); + require_ok($file); + +Like use_ok(), except it requires the $module or $file. + +=cut + +sub require_ok ($) { + my($module) = shift; + + my $pack = caller; + + # Try to deterine if we've been given a module name or file. + # Module names must be barewords, files not. + $module = qq['$module'] unless _is_module_name($module); + + local($!, $@); # eval sometimes interferes with $! + eval <ok( !$@, "require $module;" ); + + unless( $ok ) { + chomp $@; + $Test->diag(<. + +The way Test::More handles this is with a named block. Basically, a +block of tests which can be skipped over or made todo. It's best if I +just show you... + +=over 4 + +=item B + + SKIP: { + skip $why, $how_many if $condition; + + ...normal testing code goes here... + } + +This declares a block of tests that might be skipped, $how_many tests +there are, $why and under what $condition to skip them. An example is +the easiest way to illustrate: + + SKIP: { + eval { require HTML::Lint }; + + skip "HTML::Lint not installed", 2 if $@; + + my $lint = new HTML::Lint; + isa_ok( $lint, "HTML::Lint" ); + + $lint->parse( $html ); + is( $lint->errors, 0, "No errors found in HTML" ); + } + +If the user does not have HTML::Lint installed, the whole block of +code I. Test::More will output special ok's +which Test::Harness interprets as skipped, but passing, tests. + +It's important that $how_many accurately reflects the number of tests +in the SKIP block so the # of tests run will match up with your plan. +If your plan is C $how_many is optional and will default to 1. + +It's perfectly safe to nest SKIP blocks. Each SKIP block must have +the label C, or Test::More can't work its magic. + +You don't skip tests which are failing because there's a bug in your +program, or for which you don't yet have code written. For that you +use TODO. Read on. + +=cut + +#'# +sub skip { + my($why, $how_many) = @_; + + unless( defined $how_many ) { + # $how_many can only be avoided when no_plan is in use. + _carp "skip() needs to know \$how_many tests are in the block" + unless $Test->has_plan eq 'no_plan'; + $how_many = 1; + } + + for( 1..$how_many ) { + $Test->skip($why); + } + + local $^W = 0; + last SKIP; +} + + +=item B + + TODO: { + local $TODO = $why if $condition; + + ...normal testing code goes here... + } + +Declares a block of tests you expect to fail and $why. Perhaps it's +because you haven't fixed a bug or haven't finished a new feature: + + TODO: { + local $TODO = "URI::Geller not finished"; + + my $card = "Eight of clubs"; + is( URI::Geller->your_card, $card, 'Is THIS your card?' ); + + my $spoon; + URI::Geller->bend_spoon; + is( $spoon, 'bent', "Spoon bending, that's original" ); + } + +With a todo block, the tests inside are expected to fail. Test::More +will run the tests normally, but print out special flags indicating +they are "todo". Test::Harness will interpret failures as being ok. +Should anything succeed, it will report it as an unexpected success. +You then know the thing you had todo is done and can remove the +TODO flag. + +The nice part about todo tests, as opposed to simply commenting out a +block of tests, is it's like having a programmatic todo list. You know +how much work is left to be done, you're aware of what bugs there are, +and you'll know immediately when they're fixed. + +Once a todo test starts succeeding, simply move it outside the block. +When the block is empty, delete it. + +B: TODO tests require a Test::Harness upgrade else it will +treat it as a normal failure. See L) + + +=item B + + TODO: { + todo_skip $why, $how_many if $condition; + + ...normal testing code... + } + +With todo tests, it's best to have the tests actually run. That way +you'll know when they start passing. Sometimes this isn't possible. +Often a failing test will cause the whole program to die or hang, even +inside an C with and using C. In these extreme +cases you have no choice but to skip over the broken tests entirely. + +The syntax and behavior is similar to a C except the +tests will be marked as failing but todo. Test::Harness will +interpret them as passing. + +=cut + +sub todo_skip { + my($why, $how_many) = @_; + + unless( defined $how_many ) { + # $how_many can only be avoided when no_plan is in use. + _carp "todo_skip() needs to know \$how_many tests are in the block" + unless $Test->has_plan eq 'no_plan'; + $how_many = 1; + } + + for( 1..$how_many ) { + $Test->todo_skip($why); + } + + local $^W = 0; + last TODO; +} + +=item When do I use SKIP vs. TODO? + +B, use SKIP. +This includes optional modules that aren't installed, running under +an OS that doesn't have some feature (like fork() or symlinks), or maybe +you need an Internet connection and one isn't available. + +B, use TODO. This +is for any code you haven't written yet, or bugs you have yet to fix, +but want to put tests in your testing script (always a good idea). + + +=back + +=head2 Complex data structures + +Not everything is a simple eq check or regex. There are times you +need to see if two data structures are equivalent. For these +instances Test::More provides a handful of useful functions. + +B I'm not quite sure what will happen with filehandles. + +=over 4 + +=item B + + is_deeply( $this, $that, $test_name ); + +Similar to is(), except that if $this and $that are hash or array +references, it does a deep comparison walking each data structure to +see if they are equivalent. If the two structures are different, it +will display the place where they start differing. + +Test::Differences and Test::Deep provide more in-depth functionality +along these lines. + +=back + +=cut + +our (@Data_Stack, %Refs_Seen); +my $DNE = bless [], 'Does::Not::Exist'; +sub is_deeply { + unless( @_ == 2 or @_ == 3 ) { + my $msg = <ok(0); + } + + my($this, $that, $name) = @_; + + my $ok; + if( !ref $this and !ref $that ) { # neither is a reference + $ok = $Test->is_eq($this, $that, $name); + } + elsif( !ref $this xor !ref $that ) { # one's a reference, one isn't + $ok = $Test->ok(0, $name); + $Test->diag( _format_stack({ vals => [ $this, $that ] }) ); + } + else { # both references + local @Data_Stack = (); + if( _deep_check($this, $that) ) { + $ok = $Test->ok(1, $name); + } + else { + $ok = $Test->ok(0, $name); + $Test->diag(_format_stack(@Data_Stack)); + } + } + + return $ok; +} + +sub _format_stack { + my(@Stack) = @_; + + my $var = '$FOO'; + my $did_arrow = 0; + foreach my $entry (@Stack) { + my $type = $entry->{type} || ''; + my $idx = $entry->{'idx'}; + if( $type eq 'HASH' ) { + $var .= "->" unless $did_arrow++; + $var .= "{$idx}"; + } + elsif( $type eq 'ARRAY' ) { + $var .= "->" unless $did_arrow++; + $var .= "[$idx]"; + } + elsif( $type eq 'REF' ) { + $var = "\${$var}"; + } + } + + my @vals = @{$Stack[-1]{vals}}[0,1]; + my @vars = (); + ($vars[0] = $var) =~ s/\$FOO/ \$got/; + ($vars[1] = $var) =~ s/\$FOO/\$expected/; + + my $out = "Structures begin differing at:\n"; + foreach my $idx (0..$#vals) { + my $val = $vals[$idx]; + $vals[$idx] = !defined $val ? 'undef' : + $val eq $DNE ? "Does not exist" : + ref $val ? "$val" : + "'$val'"; + } + + $out .= "$vars[0] = $vals[0]\n"; + $out .= "$vars[1] = $vals[1]\n"; + + $out =~ s/^/ /msg; + return $out; +} + + +sub _type { + my $thing = shift; + + return '' if !ref $thing; + + for my $type (qw(ARRAY HASH REF SCALAR GLOB Regexp)) { + return $type if UNIVERSAL::isa($thing, $type); + } + + return ''; +} + + +=head2 Discouraged comparison functions + +The use of the following functions is discouraged as they are not +actually testing functions and produce no diagnostics to help figure +out what went wrong. They were written before is_deeply() existed +because I couldn't figure out how to display a useful diff of two +arbitrary data structures. + +These functions are usually used inside an ok(). + + ok( eq_array(\@this, \@that) ); + +C can do that better and with diagnostics. + + is_deeply( \@this, \@that ); + +They may be deprecated in future versions. + +=over 4 + +=item B + + my $is_eq = eq_array(\@this, \@that); + +Checks if two arrays are equivalent. This is a deep check, so +multi-level structures are handled correctly. + +=cut + +#'# +sub eq_array { + local @Data_Stack; + _deep_check(@_); +} + +sub _eq_array { + my($a1, $a2) = @_; + + if( grep !_type($_) eq 'ARRAY', $a1, $a2 ) { + warn "eq_array passed a non-array ref"; + return 0; + } + + return 1 if $a1 eq $a2; + + my $ok = 1; + my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; + for (0..$max) { + my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; + my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; + + push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] }; + $ok = _deep_check($e1,$e2); + pop @Data_Stack if $ok; + + last unless $ok; + } + + return $ok; +} + +sub _deep_check { + my($e1, $e2) = @_; + my $ok = 0; + + # Effectively turn %Refs_Seen into a stack. This avoids picking up + # the same referenced used twice (such as [\$a, \$a]) to be considered + # circular. + local %Refs_Seen = %Refs_Seen; + + { + # Quiet uninitialized value warnings when comparing undefs. + local $^W = 0; + + $Test->_unoverload(\$e1, \$e2); + + # Either they're both references or both not. + my $same_ref = !(!ref $e1 xor !ref $e2); + my $not_ref = (!ref $e1 and !ref $e2); + + if( defined $e1 xor defined $e2 ) { + $ok = 0; + } + elsif ( $e1 == $DNE xor $e2 == $DNE ) { + $ok = 0; + } + elsif ( $same_ref and ($e1 eq $e2) ) { + $ok = 1; + } + elsif ( $not_ref ) { + push @Data_Stack, { type => '', vals => [$e1, $e2] }; + $ok = 0; + } + else { + if( $Refs_Seen{$e1} ) { + return $Refs_Seen{$e1} eq $e2; + } + else { + $Refs_Seen{$e1} = "$e2"; + } + + my $type = _type($e1); + $type = 'DIFFERENT' unless _type($e2) eq $type; + + if( $type eq 'DIFFERENT' ) { + push @Data_Stack, { type => $type, vals => [$e1, $e2] }; + $ok = 0; + } + elsif( $type eq 'ARRAY' ) { + $ok = _eq_array($e1, $e2); + } + elsif( $type eq 'HASH' ) { + $ok = _eq_hash($e1, $e2); + } + elsif( $type eq 'REF' ) { + push @Data_Stack, { type => $type, vals => [$e1, $e2] }; + $ok = _deep_check($$e1, $$e2); + pop @Data_Stack if $ok; + } + elsif( $type eq 'SCALAR' ) { + push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; + $ok = _deep_check($$e1, $$e2); + pop @Data_Stack if $ok; + } + else { + _whoa(1, "No type in _deep_check"); + } + } + } + + return $ok; +} + + +sub _whoa { + my($check, $desc) = @_; + if( $check ) { + die < + + my $is_eq = eq_hash(\%this, \%that); + +Determines if the two hashes contain the same keys and values. This +is a deep check. + +=cut + +sub eq_hash { + local @Data_Stack; + return _deep_check(@_); +} + +sub _eq_hash { + my($a1, $a2) = @_; + + if( grep !_type($_) eq 'HASH', $a1, $a2 ) { + warn "eq_hash passed a non-hash ref"; + return 0; + } + + return 1 if $a1 eq $a2; + + my $ok = 1; + my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; + foreach my $k (keys %$bigger) { + my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; + my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; + + push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] }; + $ok = _deep_check($e1, $e2); + pop @Data_Stack if $ok; + + last unless $ok; + } + + return $ok; +} + +=item B + + my $is_eq = eq_set(\@this, \@that); + +Similar to eq_array(), except the order of the elements is B +important. This is a deep check, but the irrelevancy of order only +applies to the top level. + + ok( eq_set(\@this, \@that) ); + +Is better written: + + is_deeply( [sort @this], [sort @that] ); + +B By historical accident, this is not a true set comparision. +While the order of elements does not matter, duplicate elements do. + +Test::Deep contains much better set comparison functions. + +=cut + +sub eq_set { + my($a1, $a2) = @_; + return 0 unless @$a1 == @$a2; + + # There's faster ways to do this, but this is easiest. + local $^W = 0; + + # We must make sure that references are treated neutrally. It really + # doesn't matter how we sort them, as long as both arrays are sorted + # with the same algorithm. + # Have to inline the sort routine due to a threading/sort bug. + # See [rt.cpan.org 6782] + return eq_array( + [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a1], + [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a2] + ); +} + +=back + + +=head2 Extending and Embedding Test::More + +Sometimes the Test::More interface isn't quite enough. Fortunately, +Test::More is built on top of Test::Builder which provides a single, +unified backend for any test library to use. This means two test +libraries which both use Test::Builder B. + +If you simply want to do a little tweaking of how the tests behave, +you can access the underlying Test::Builder object like so: + +=over 4 + +=item B + + my $test_builder = Test::More->builder; + +Returns the Test::Builder object underlying Test::More for you to play +with. + +=cut + +sub builder { + return Test::Builder->new; +} + +=back + + +=head1 EXIT CODES + +If all your tests passed, Test::Builder will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Builder +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + +B This behavior may go away in future versions. + + +=head1 CAVEATS and NOTES + +=over 4 + +=item Backwards compatibility + +Test::More works with Perls as old as 5.004_05. + + +=item Overloaded objects + +String overloaded objects are compared B. This prevents +Test::More from piercing an object's interface allowing better blackbox +testing. So if a function starts returning overloaded objects instead of +bare strings your tests won't notice the difference. This is good. + +However, it does mean that functions like is_deeply() cannot be used to +test the internals of string overloaded objects. In this case I would +suggest Test::Deep which contains more flexible testing functions for +complex data structures. + + +=item Threads + +Test::More will only be aware of threads if "use threads" has been done +I Test::More is loaded. This is ok: + + use threads; + use Test::More; + +This may cause problems: + + use Test::More + use threads; + + +=item Test::Harness upgrade + +no_plan and todo depend on new Test::Harness features and fixes. If +you're going to distribute tests that use no_plan or todo your +end-users will have to upgrade Test::Harness to the latest one on +CPAN. If you avoid no_plan and TODO tests, the stock Test::Harness +will work fine. + +Installing Test::More should also upgrade Test::Harness. + +=back + + +=head1 HISTORY + +This is a case of convergent evolution with Joshua Pritikin's Test +module. I was largely unaware of its existence when I'd first +written my own ok() routines. This module exists because I can't +figure out how to easily wedge test names into Test's interface (along +with a few other problems). + +The goal here is to have a testing utility that's simple to learn, +quick to use and difficult to trip yourself up with while still +providing more flexibility than the existing Test.pm. As such, the +names of the most common routines are kept tiny, special cases and +magic side-effects are kept to a minimum. WYSIWYG. + + +=head1 SEE ALSO + +L if all this confuses you and you just want to write +some tests. You can upgrade to Test::More later (it's forward +compatible). + +L is the old testing module. Its main benefit is that it has +been distributed with Perl since 5.004_05. + +L for details on how your test results are interpreted +by Perl. + +L for more ways to test complex data structures. +And it plays well with Test::More. + +L is like XUnit but more perlish. + +L gives you more powerful complex data structure testing. + +L is XUnit style testing. + +L shows the idea of embedded testing. + +L installs a whole bunch of useful test modules. + + +=head1 AUTHORS + +Michael G Schwern Eschwern@pobox.comE with much inspiration +from Joshua Pritikin's Test module and lots of help from Barrie +Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and +the perl-qa gang. + + +=head1 BUGS + +See F to report and view bugs. + + +=head1 COPYRIGHT + +Copyright 2001, 2002, 2004 by Michael G Schwern Eschwern@pobox.comE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F + +=cut + +1; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Simple.pm b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Simple.pm new file mode 100644 index 0000000..2317f54 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/Test/Simple.pm @@ -0,0 +1,236 @@ +package Test::Simple; + +use 5.004; + +use strict 'vars'; +our ($VERSION); +$VERSION = '0.60'; +$VERSION = eval $VERSION; # make the alpha version come out as a number + + +use Test::Builder; +my $Test = Test::Builder->new; + +sub import { + my $self = shift; + my $caller = caller; + *{$caller.'::ok'} = \&ok; + + $Test->exported_to($caller); + $Test->plan(@_); +} + + +=head1 NAME + +Test::Simple - Basic utilities for writing tests. + +=head1 SYNOPSIS + + use Test::Simple tests => 1; + + ok( $foo eq $bar, 'foo is bar' ); + + +=head1 DESCRIPTION + +** If you are unfamiliar with testing B first! ** + +This is an extremely simple, extremely basic module for writing tests +suitable for CPAN modules and other pursuits. If you wish to do more +complicated testing, use the Test::More module (a drop-in replacement +for this one). + +The basic unit of Perl testing is the ok. For each thing you want to +test your program will print out an "ok" or "not ok" to indicate pass +or fail. You do this with the ok() function (see below). + +The only other constraint is you must pre-declare how many tests you +plan to run. This is in case something goes horribly wrong during the +test and your test program aborts, or skips a test or whatever. You +do this like so: + + use Test::Simple tests => 23; + +You must have a plan. + + +=over 4 + +=item B + + ok( $foo eq $bar, $name ); + ok( $foo eq $bar ); + +ok() is given an expression (in this case C<$foo eq $bar>). If it's +true, the test passed. If it's false, it didn't. That's about it. + +ok() prints out either "ok" or "not ok" along with a test number (it +keeps track of that for you). + + # This produces "ok 1 - Hell not yet frozen over" (or not ok) + ok( get_temperature($hell) > 0, 'Hell not yet frozen over' ); + +If you provide a $name, that will be printed along with the "ok/not +ok" to make it easier to find your test when if fails (just search for +the name). It also makes it easier for the next guy to understand +what your test is for. It's highly recommended you use test names. + +All tests are run in scalar context. So this: + + ok( @stuff, 'I have some stuff' ); + +will do what you mean (fail if stuff is empty) + +=cut + +sub ok ($;$) { + $Test->ok(@_); +} + + +=back + +Test::Simple will start by printing number of tests run in the form +"1..M" (so "1..5" means you're going to run 5 tests). This strange +format lets Test::Harness know how many tests you plan on running in +case something goes horribly wrong. + +If all your tests passed, Test::Simple will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Simple +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + +This module is by no means trying to be a complete testing system. +It's just to get you started. Once you're off the ground its +recommended you look at L. + + +=head1 EXAMPLE + +Here's an example of a simple .t file for the fictional Film module. + + use Test::Simple tests => 5; + + use Film; # What you're testing. + + my $btaste = Film->new({ Title => 'Bad Taste', + Director => 'Peter Jackson', + Rating => 'R', + NumExplodingSheep => 1 + }); + ok( defined($btaste) && ref $btaste eq 'Film, 'new() works' ); + + ok( $btaste->Title eq 'Bad Taste', 'Title() get' ); + ok( $btaste->Director eq 'Peter Jackson', 'Director() get' ); + ok( $btaste->Rating eq 'R', 'Rating() get' ); + ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' ); + +It will produce output like this: + + 1..5 + ok 1 - new() works + ok 2 - Title() get + ok 3 - Director() get + not ok 4 - Rating() get + # Failed test (t/film.t at line 14) + ok 5 - NumExplodingSheep() get + # Looks like you failed 1 tests of 5 + +Indicating the Film::Rating() method is broken. + + +=head1 CAVEATS + +Test::Simple will only report a maximum of 254 failures in its exit +code. If this is a problem, you probably have a huge test script. +Split it into multiple files. (Otherwise blame the Unix folks for +using an unsigned short integer as the exit status). + +Because VMS's exit codes are much, much different than the rest of the +universe, and perl does horrible mangling to them that gets in my way, +it works like this on VMS. + + 0 SS$_NORMAL all tests successful + 4 SS$_ABORT something went wrong + +Unfortunately, I can't differentiate any further. + + +=head1 NOTES + +Test::Simple is B tested all the way back to perl 5.004. + +Test::Simple is thread-safe in perl 5.8.0 and up. + +=head1 HISTORY + +This module was conceived while talking with Tony Bowden in his +kitchen one night about the problems I was having writing some really +complicated feature into the new Testing module. He observed that the +main problem is not dealing with these edge cases but that people hate +to write tests B. What was needed was a dead simple module +that took all the hard work out of testing and was really, really easy +to learn. Paul Johnson simultaneously had this idea (unfortunately, +he wasn't in Tony's kitchen). This is it. + + +=head1 SEE ALSO + +=over 4 + +=item L + +More testing functions! Once you outgrow Test::Simple, look at +Test::More. Test::Simple is 100% forward compatible with Test::More +(i.e. you can just use Test::More instead of Test::Simple in your +programs and things will still work). + +=item L + +The original Perl testing module. + +=item L + +Elaborate unit testing. + +=item L, L + +Embed tests in your code! + +=item L + +Interprets the output of your test program. + +=back + + +=head1 AUTHORS + +Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern +Eschwern@pobox.comE, wardrobe by Calvin Klein. + + +=head1 COPYRIGHT + +Copyright 2001, 2002, 2004 by Michael G Schwern Eschwern@pobox.comE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F + +=cut + +1; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/compress/CompTestUtils.pm b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/compress/CompTestUtils.pm new file mode 100644 index 0000000..22b6d56 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/t/compress/CompTestUtils.pm @@ -0,0 +1,669 @@ +package CompTestUtils; + +package main ; + +use strict ; +use warnings; +use bytes; + +#use lib qw(t t/compress); + +use Carp ; +#use Test::More ; + + + +sub title +{ + #diag "" ; + ok 1, $_[0] ; + #diag "" ; +} + +sub like_eval +{ + like $@, @_ ; +} + +{ + package LexFile ; + + our ($index); + $index = '00000'; + + sub new + { + my $self = shift ; + foreach (@_) + { + # autogenerate the name unless if none supplied + $_ = "tst" . $index ++ . ".tmp" + unless defined $_; + } + chmod 0777, @_; + for (@_) { 1 while unlink $_ } ; + bless [ @_ ], $self ; + } + + sub DESTROY + { + my $self = shift ; + chmod 0777, @{ $self } ; + for (@$self) { 1 while unlink $_ } ; + } + +} + +{ + package LexDir ; + + use File::Path; + sub new + { + my $self = shift ; + foreach (@_) { rmtree $_ } + bless [ @_ ], $self ; + } + + sub DESTROY + { + my $self = shift ; + foreach (@$self) { rmtree $_ } + } +} +sub readFile +{ + my $f = shift ; + + my @strings ; + + if (IO::Compress::Base::Common::isaFilehandle($f)) + { + my $pos = tell($f); + seek($f, 0,0); + @strings = <$f> ; + seek($f, 0, $pos); + } + else + { + open (F, "<$f") + or croak "Cannot open $f: $!\n" ; + binmode F; + @strings = ; + close F ; + } + + return @strings if wantarray ; + return join "", @strings ; +} + +sub touch +{ + foreach (@_) { writeFile($_, '') } +} + +sub writeFile +{ + my($filename, @strings) = @_ ; + 1 while unlink $filename ; + open (F, ">$filename") + or croak "Cannot open $filename: $!\n" ; + binmode F; + foreach (@strings) { + no warnings ; + print F $_ ; + } + close F ; +} + +sub GZreadFile +{ + my ($filename) = shift ; + + my ($uncomp) = "" ; + my $line = "" ; + my $fil = gzopen($filename, "rb") + or croak "Cannopt open '$filename': $Compress::Zlib::gzerrno" ; + + $uncomp .= $line + while $fil->gzread($line) > 0; + + $fil->gzclose ; + return $uncomp ; +} + +sub hexDump +{ + my $d = shift ; + + if (IO::Compress::Base::Common::isaFilehandle($d)) + { + $d = readFile($d); + } + elsif (IO::Compress::Base::Common::isaFilename($d)) + { + $d = readFile($d); + } + else + { + $d = $$d ; + } + + my $offset = 0 ; + + $d = '' unless defined $d ; + #while (read(STDIN, $data, 16)) { + while (my $data = substr($d, 0, 16)) { + substr($d, 0, 16) = '' ; + printf "# %8.8lx ", $offset; + $offset += 16; + + my @array = unpack('C*', $data); + foreach (@array) { + printf('%2.2x ', $_); + } + print " " x (16 - @array) + if @array < 16 ; + $data =~ tr/\0-\37\177-\377/./; + print " $data\n"; + } + +} + +sub readHeaderInfo +{ + my $name = shift ; + my %opts = @_ ; + + my $string = <write($string) ; + ok $x->close ; + + #is GZreadFile($name), $string ; + + ok my $gunz = new IO::Uncompress::Gunzip $name, Strict => 0 + or diag "GunzipError is $IO::Uncompress::Gunzip::GunzipError" ; + ok my $hdr = $gunz->getHeaderInfo(); + my $uncomp ; + ok $gunz->read($uncomp) ; + ok $uncomp eq $string; + ok $gunz->close ; + + return $hdr ; +} + +sub cmpFile +{ + my ($filename, $uue) = @_ ; + return readFile($filename) eq unpack("u", $uue) ; +} + +sub isRawFormat +{ + my $class = shift; + my %raw = map { $_ => 1 } qw( RawDeflate ); + + return defined $raw{$class}; +} + +sub uncompressBuffer +{ + my $compWith = shift ; + my $buffer = shift ; + + my %mapping = ( 'IO::Compress::Gzip' => 'IO::Uncompress::Gunzip', + 'IO::Compress::Gzip::gzip' => 'IO::Uncompress::Gunzip', + 'IO::Compress::Deflate' => 'IO::Uncompress::Inflate', + 'IO::Compress::Deflate::deflate' => 'IO::Uncompress::Inflate', + 'IO::Compress::RawDeflate' => 'IO::Uncompress::RawInflate', + 'IO::Compress::RawDeflate::rawdeflate' => 'IO::Uncompress::RawInflate', + 'IO::Compress::Bzip2' => 'IO::Uncompress::Bunzip2', + 'IO::Compress::Bzip2::bzip2' => 'IO::Uncompress::Bunzip2', + 'IO::Compress::Zip' => 'IO::Uncompress::Unzip', + 'IO::Compress::Zip::zip' => 'IO::Uncompress::Unzip', + 'IO::Compress::Lzop' => 'IO::Uncompress::UnLzop', + 'IO::Compress::Lzop::lzop' => 'IO::Uncompress::UnLzop', + 'IO::Compress::Lzf' => 'IO::Uncompress::UnLzf' , + 'IO::Compress::Lzf::lzf' => 'IO::Uncompress::UnLzf', + 'IO::Compress::PPMd' => 'IO::Uncompress::UnPPMd' , + 'IO::Compress::PPMd::ppmd' => 'IO::Uncompress::UnPPMd', + 'IO::Compress::DummyComp' => 'IO::Uncompress::DummyUncomp', + 'IO::Compress::DummyComp::dummycomp' => 'IO::Uncompress::DummyUncomp', + ); + + my $out ; + my $obj = $mapping{$compWith}->new( \$buffer, -Append => 1); + 1 while $obj->read($out) > 0 ; + return $out ; + +} + +my %ErrorMap = ( 'IO::Compress::Gzip' => \$IO::Compress::Gzip::GzipError, + 'IO::Compress::Gzip::gzip' => \$IO::Compress::Gzip::GzipError, + 'IO::Uncompress::Gunzip' => \$IO::Uncompress::Gunzip::GunzipError, + 'IO::Uncompress::Gunzip::gunzip' => \$IO::Uncompress::Gunzip::GunzipError, + 'IO::Uncompress::Inflate' => \$IO::Uncompress::Inflate::InflateError, + 'IO::Uncompress::Inflate::inflate' => \$IO::Uncompress::Inflate::InflateError, + 'IO::Compress::Deflate' => \$IO::Compress::Deflate::DeflateError, + 'IO::Compress::Deflate::deflate' => \$IO::Compress::Deflate::DeflateError, + 'IO::Uncompress::RawInflate' => \$IO::Uncompress::RawInflate::RawInflateError, + 'IO::Uncompress::RawInflate::rawinflate' => \$IO::Uncompress::RawInflate::RawInflateError, + 'IO::Uncompress::AnyInflate' => \$IO::Uncompress::AnyInflate::AnyInflateError, + 'IO::Uncompress::AnyInflate::anyinflate' => \$IO::Uncompress::AnyInflate::AnyInflateError, + 'IO::Uncompress::AnyUncompress' => \$IO::Uncompress::AnyUncompress::AnyUncompressError, + 'IO::Uncompress::AnyUncompress::anyUncompress' => \$IO::Uncompress::AnyUncompress::AnyUncompressError, + 'IO::Compress::RawDeflate' => \$IO::Compress::RawDeflate::RawDeflateError, + 'IO::Compress::RawDeflate::rawdeflate' => \$IO::Compress::RawDeflate::RawDeflateError, + 'IO::Compress::Bzip2' => \$IO::Compress::Bzip2::Bzip2Error, + 'IO::Compress::Bzip2::bzip2' => \$IO::Compress::Bzip2::Bzip2Error, + 'IO::Uncompress::Bunzip2' => \$IO::Uncompress::Bunzip2::Bunzip2Error, + 'IO::Uncompress::Bunzip2::bunzip2' => \$IO::Uncompress::Bunzip2::Bunzip2Error, + 'IO::Compress::Zip' => \$IO::Compress::Zip::ZipError, + 'IO::Compress::Zip::zip' => \$IO::Compress::Zip::ZipError, + 'IO::Uncompress::Unzip' => \$IO::Uncompress::Unzip::UnzipError, + 'IO::Uncompress::Unzip::unzip' => \$IO::Uncompress::Unzip::UnzipError, + 'IO::Compress::Lzop' => \$IO::Compress::Lzop::LzopError, + 'IO::Compress::Lzop::lzop' => \$IO::Compress::Lzop::LzopError, + 'IO::Uncompress::UnLzop' => \$IO::Uncompress::UnLzop::UnLzopError, + 'IO::Uncompress::UnLzop::unlzop' => \$IO::Uncompress::UnLzop::UnLzopError, + 'IO::Compress::Lzf' => \$IO::Compress::Lzf::LzfError, + 'IO::Compress::Lzf::lzf' => \$IO::Compress::Lzf::LzfError, + 'IO::Uncompress::UnLzf' => \$IO::Uncompress::UnLzf::UnLzfError, + 'IO::Uncompress::UnLzf::unlzf' => \$IO::Uncompress::UnLzf::UnLzfError, + 'IO::Compress::PPMd' => \$IO::Compress::PPMd::PPMdError, + 'IO::Compress::PPMd::ppmd' => \$IO::Compress::PPMd::PPMdError, + 'IO::Uncompress::UnPPMd' => \$IO::Uncompress::UnPPMd::UnPPMdError, + 'IO::Uncompress::UnPPMd::unppmd' => \$IO::Uncompress::UnPPMd::UnPPMdError, + + 'IO::Compress::DummyComp' => \$IO::Compress::DummyComp::DummyCompError, + 'IO::Compress::DummyComp::dummycomp'=> \$IO::Compress::DummyComp::DummyCompError, + 'IO::Uncompress::DummyUncomp' => \$IO::Uncompress::DummyUncomp::DummyUncompError, + 'IO::Uncompress::DummyUncomp::dummyuncomp' => \$IO::Uncompress::DummyUncomp::DummyUncompError, + ); + +my %TopFuncMap = ( 'IO::Compress::Gzip' => 'IO::Compress::Gzip::gzip', + 'IO::Uncompress::Gunzip' => 'IO::Uncompress::Gunzip::gunzip', + + 'IO::Compress::Deflate' => 'IO::Compress::Deflate::deflate', + 'IO::Uncompress::Inflate' => 'IO::Uncompress::Inflate::inflate', + + 'IO::Compress::RawDeflate' => 'IO::Compress::RawDeflate::rawdeflate', + 'IO::Uncompress::RawInflate' => 'IO::Uncompress::RawInflate::rawinflate', + + 'IO::Uncompress::AnyInflate' => 'IO::Uncompress::AnyInflate::anyinflate', + 'IO::Uncompress::AnyUncompress' => 'IO::Uncompress::AnyUncompress::anyuncompress', + + 'IO::Compress::Bzip2' => 'IO::Compress::Bzip2::bzip2', + 'IO::Uncompress::Bunzip2' => 'IO::Uncompress::Bunzip2::bunzip2', + + 'IO::Compress::Zip' => 'IO::Compress::Zip::zip', + 'IO::Uncompress::Unzip' => 'IO::Uncompress::Unzip::unzip', + 'IO::Compress::Lzop' => 'IO::Compress::Lzop::lzop', + 'IO::Uncompress::UnLzop' => 'IO::Uncompress::UnLzop::unlzop', + 'IO::Compress::Lzf' => 'IO::Compress::Lzf::lzf', + 'IO::Uncompress::UnLzf' => 'IO::Uncompress::UnLzf::unlzf', + 'IO::Compress::PPMd' => 'IO::Compress::PPMd::ppmd', + 'IO::Uncompress::UnPPMd' => 'IO::Uncompress::UnPPMd::unppmd', + 'IO::Compress::DummyComp' => 'IO::Compress::DummyComp::dummyuncomp', + 'IO::Uncompress::DummyUncomp' => 'IO::Uncompress::DummyUncomp::dummyuncomp', + ); + + %TopFuncMap = map { ($_ => $TopFuncMap{$_}, + $TopFuncMap{$_} => $TopFuncMap{$_}) } + keys %TopFuncMap ; + + #%TopFuncMap = map { ($_ => \&{ $TopFuncMap{$_} ) } + #keys %TopFuncMap ; + + +my %inverse = ( 'IO::Compress::Gzip' => 'IO::Uncompress::Gunzip', + 'IO::Compress::Gzip::gzip' => 'IO::Uncompress::Gunzip::gunzip', + 'IO::Compress::Deflate' => 'IO::Uncompress::Inflate', + 'IO::Compress::Deflate::deflate' => 'IO::Uncompress::Inflate::inflate', + 'IO::Compress::RawDeflate' => 'IO::Uncompress::RawInflate', + 'IO::Compress::RawDeflate::rawdeflate' => 'IO::Uncompress::RawInflate::rawinflate', + 'IO::Compress::Bzip2::bzip2' => 'IO::Uncompress::Bunzip2::bunzip2', + 'IO::Compress::Bzip2' => 'IO::Uncompress::Bunzip2', + 'IO::Compress::Zip::zip' => 'IO::Uncompress::Unzip::unzip', + 'IO::Compress::Zip' => 'IO::Uncompress::Unzip', + 'IO::Compress::Lzop::lzop' => 'IO::Uncompress::UnLzop::unlzop', + 'IO::Compress::Lzop' => 'IO::Uncompress::UnLzop', + 'IO::Compress::Lzf::lzf' => 'IO::Uncompress::UnLzf::unlzf', + 'IO::Compress::Lzf' => 'IO::Uncompress::UnLzf', + 'IO::Compress::PPMd::ppmd' => 'IO::Uncompress::UnPPMd::unppmd', + 'IO::Compress::PPMd' => 'IO::Uncompress::UnPPMd', + 'IO::Compress::DummyComp::dummycomp' => 'IO::Uncompress::DummyUncomp::dummyuncomp', + 'IO::Compress::DummyComp' => 'IO::Uncompress::DummyUncomp', + ); + +%inverse = map { ($_ => $inverse{$_}, $inverse{$_} => $_) } keys %inverse; + +sub getInverse +{ + my $class = shift ; + + return $inverse{$class} ; +} + +sub getErrorRef +{ + my $class = shift ; + + return $ErrorMap{$class} ; +} + +sub getTopFuncRef +{ + my $class = shift ; + + return \&{ $TopFuncMap{$class} } ; +} + +sub getTopFuncName +{ + my $class = shift ; + + return $TopFuncMap{$class} ; +} + +sub compressBuffer +{ + my $compWith = shift ; + my $buffer = shift ; + + my %mapping = ( 'IO::Uncompress::Gunzip' => 'IO::Compress::Gzip', + 'IO::Uncompress::Gunzip::gunzip' => 'IO::Compress::Gzip', + 'IO::Uncompress::Inflate' => 'IO::Compress::Deflate', + 'IO::Uncompress::Inflate::inflate' => 'IO::Compress::Deflate', + 'IO::Uncompress::RawInflate' => 'IO::Compress::RawDeflate', + 'IO::Uncompress::RawInflate::rawinflate' => 'IO::Compress::RawDeflate', + 'IO::Uncompress::Bunzip2' => 'IO::Compress::Bzip2', + 'IO::Uncompress::Bunzip2::bunzip2' => 'IO::Compress::Bzip2', + 'IO::Uncompress::Unzip' => 'IO::Compress::Zip', + 'IO::Uncompress::Unzip::unzip' => 'IO::Compress::Zip', + 'IO::Uncompress::UnLzop' => 'IO::Compress::Lzop', + 'IO::Uncompress::UnLzop::unlzop' => 'IO::Compress::Lzop', + 'IO::Uncompress::UnLzp' => 'IO::Compress::Lzf', + 'IO::Uncompress::UnLzf::unlzf' => 'IO::Compress::Lzf', + 'IO::Uncompress::UnPPMd' => 'IO::Compress::PPMd', + 'IO::Uncompress::UnPPMd::unppmd' => 'IO::Compress::PPMd', + 'IO::Uncompress::AnyInflate' => 'IO::Compress::Gzip', + 'IO::Uncompress::AnyInflate::anyinflate' => 'IO::Compress::Gzip', + 'IO::Uncompress::AnyUncompress' => 'IO::Compress::Gzip', + 'IO::Uncompress::AnyUncompress::anyuncompress' => 'IO::Compress::Gzip', + 'IO::Uncompress::DummyUncomp' => 'IO::Compress::DummyComp', + 'IO::Uncompress::DummyUncomp::dummyuncomp'=> 'IO::Compress::DummyComp', + ); + + my $out ; + my $obj = $mapping{$compWith}->new( \$out); + $obj->write($buffer) ; + $obj->close(); + return $out ; +} + +our ($AnyUncompressError); +BEGIN +{ + eval ' use IO::Uncompress::AnyUncompress qw($AnyUncompressError); '; +} + +sub anyUncompress +{ + my $buffer = shift ; + my $already = shift; + + my @opts = (); + if (ref $buffer && ref $buffer eq 'ARRAY') + { + @opts = @$buffer; + $buffer = shift @opts; + } + + if (ref $buffer) + { + croak "buffer is undef" unless defined $$buffer; + croak "buffer is empty" unless length $$buffer; + + } + + + my $data ; + if (IO::Compress::Base::Common::isaFilehandle($buffer)) + { + $data = readFile($buffer); + } + elsif (IO::Compress::Base::Common::isaFilename($buffer)) + { + $data = readFile($buffer); + } + else + { + $data = $$buffer ; + } + + if (defined $already && length $already) + { + + my $got = substr($data, 0, length($already)); + substr($data, 0, length($already)) = ''; + + is $got, $already, ' Already OK' ; + } + + my $out = ''; + my $o = new IO::Uncompress::AnyUncompress \$data, + Append => 1, + Transparent => 0, + RawInflate => 1, + @opts + or croak "Cannot open buffer/file: $AnyUncompressError" ; + + 1 while $o->read($out) > 0 ; + + croak "Error uncompressing -- " . $o->error() + if $o->error() ; + + return $out ; + +} + +sub getHeaders +{ + my $buffer = shift ; + my $already = shift; + + my @opts = (); + if (ref $buffer && ref $buffer eq 'ARRAY') + { + @opts = @$buffer; + $buffer = shift @opts; + } + + if (ref $buffer) + { + croak "buffer is undef" unless defined $$buffer; + croak "buffer is empty" unless length $$buffer; + + } + + + my $data ; + if (IO::Compress::Base::Common::isaFilehandle($buffer)) + { + $data = readFile($buffer); + } + elsif (IO::Compress::Base::Common::isaFilename($buffer)) + { + $data = readFile($buffer); + } + else + { + $data = $$buffer ; + } + + if (defined $already && length $already) + { + + my $got = substr($data, 0, length($already)); + substr($data, 0, length($already)) = ''; + + is $got, $already, ' Already OK' ; + } + + my $out = ''; + my $o = new IO::Uncompress::AnyUncompress \$data, + MultiStream => 1, + Append => 1, + Transparent => 0, + RawInflate => 1, + @opts + or croak "Cannot open buffer/file: $AnyUncompressError" ; + + 1 while $o->read($out) > 0 ; + + croak "Error uncompressing -- " . $o->error() + if $o->error() ; + + return ($o->getHeaderInfo()) ; + +} + +sub mkComplete +{ + my $class = shift ; + my $data = shift; + my $Error = getErrorRef($class); + + my $buffer ; + my %params = (); + + if ($class eq 'IO::Compress::Gzip') { + %params = ( + Name => "My name", + Comment => "a comment", + ExtraField => ['ab' => "extra"], + HeaderCRC => 1); + } + elsif ($class eq 'IO::Compress::Zip'){ + %params = ( + Name => "My name", + Comment => "a comment", + ZipComment => "last comment", + exTime => [100, 200, 300], + ExtraFieldLocal => ["ab" => "extra1"], + ExtraFieldCentral => ["cd" => "extra2"], + ); + } + + my $z = new $class( \$buffer, %params) + or croak "Cannot create $class object: $$Error"; + $z->write($data); + $z->close(); + + my $unc = getInverse($class); + anyUncompress(\$buffer) eq $data + or die "bad bad bad"; + my $u = new $unc( \$buffer); + my $info = $u->getHeaderInfo() ; + + + return wantarray ? ($info, $buffer) : $buffer ; +} + +sub mkErr +{ + my $string = shift ; + my ($dummy, $file, $line) = caller ; + -- $line ; + + $file = quotemeta($file); + + return "/$string\\s+at $file line $line/" if $] >= 5.006 ; + return "/$string\\s+at /" ; +} + +sub mkEvalErr +{ + my $string = shift ; + + return "/$string\\s+at \\(eval /" if $] > 5.006 ; + return "/$string\\s+at /" ; +} + +sub dumpObj +{ + my $obj = shift ; + + my ($dummy, $file, $line) = caller ; + + if (@_) + { + print "#\n# dumpOBJ from $file line $line @_\n" ; + } + else + { + print "#\n# dumpOBJ from $file line $line \n" ; + } + + my $max = 0 ;; + foreach my $k (keys %{ *$obj }) + { + $max = length $k if length $k > $max ; + } + + foreach my $k (sort keys %{ *$obj }) + { + my $v = $obj->{$k} ; + $v = '-undef-' unless defined $v; + my $pad = ' ' x ($max - length($k) + 2) ; + print "# $k$pad: [$v]\n"; + } + print "#\n" ; +} + + +sub getMultiValues +{ + my $class = shift ; + + return (0,0) if $class =~ /lzf/i; + return (1,0); +} + + +sub gotScalarUtilXS +{ + eval ' use Scalar::Util "dualvar" '; + return $@ ? 0 : 1 ; +} + +package CompTestUtils; + +1; +__END__ + t/Test/Builder.pm + t/Test/More.pm + t/Test/Simple.pm + t/compress/CompTestUtils.pm + t/compress/any.pl + t/compress/anyunc.pl + t/compress/destroy.pl + t/compress/generic.pl + t/compress/merge.pl + t/compress/multi.pl + t/compress/newtied.pl + t/compress/oneshot.pl + t/compress/prime.pl + t/compress/tied.pl + t/compress/truncate.pl + t/compress/zlib-generic.plParsing config.in... +Building Zlib enabled +Auto Detect Gzip OS Code.. +Setting Gzip OS Code to 3 [Unix/Default] +Looks Good. diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/typemap b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/typemap new file mode 100644 index 0000000..6d426e1 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/typemap @@ -0,0 +1,61 @@ +Compress::Raw::Zlib::gzFile T_PTROBJ +Compress::Raw::Zlib::deflateStream T_PTROBJ +Compress::Raw::Zlib::inflateStream T_PTROBJ +Compress::Raw::Zlib::inflateScanStream T_PTROBJ + +#Compress::Raw::Zlib::gzFile T_PTROBJ_AV +#Compress::Raw::Zlib::Deflate T_PTROBJ_AV +#Compress::Raw::Zlib::Inflate T_PTROBJ_AV +#Compress::Raw::Zlib::InflateScan T_PTROBJ_AV + +Bytef * T_PV +#uInt T_IV +#uLongf T_IV +const char * T_PV +char * T_PV +uLong T_UV +z_off_t T_UV +DualType T_DUAL +int_undef T_IV_undef + + +############################################################################# +INPUT +T_UV + $var = (unsigned long)SvUV($arg) +T_IV_undef + if (SvOK($arg)) + $var = SvIV($arg); + else + $var = 0 ; +T_PV + if (SvOK($arg)) + $var = ($type)SvPVbyte_nolen($arg); + else + $var = NULL ; + +T_PTROBJ_AV + if ($arg == &PL_sv_undef || $arg == NULL) + $var = NULL ; + else if (sv_derived_from($arg, \"${ntype}\")) { + IV tmp = SvIV(getInnerObject($arg)) ; + $var = INT2PTR($type, tmp); + + } + else + croak(\"$var is not of type ${ntype}\") + + + +############################################################################# +OUTPUT +T_UV + sv_setuv($arg, (IV)$var); + +T_DUAL + setDUALstatus($arg, $var) ; + +T_PV + sv_setpv((SV*)$arg, $var); + + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/adler32.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/adler32.c new file mode 100644 index 0000000..74160ee --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32( + uLong adler, + const Bytef *buf, + uInt len) +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine( + uLong adler1, + uLong adler2, + z_off_t len2) +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/compress.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/compress.c new file mode 100644 index 0000000..30970af --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/compress.c @@ -0,0 +1,79 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 ( + Bytef *dest, + uLongf *destLen, + const Bytef *source, + uLong sourceLen, + int level) +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress ( + Bytef *dest, + uLongf *destLen, + const Bytef *source, + uLong sourceLen) +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound ( + uLong sourceLen) +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.c new file mode 100644 index 0000000..17f3499 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.c @@ -0,0 +1,423 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table( + FILE *out, + const unsigned long FAR *table) +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32( + unsigned long crc, + const unsigned char FAR *buf, + unsigned len) +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little( + unsigned long crc, + const unsigned char FAR *buf, + unsigned len) +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big( + unsigned long crc, + const unsigned char FAR *buf, + unsigned len) +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times( + unsigned long *mat, + unsigned long vec) +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square( + unsigned long *square, + unsigned long *mat) +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine( + uLong crc1, + uLong crc2, + z_off_t len2) +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.h new file mode 100644 index 0000000..8053b61 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.c new file mode 100644 index 0000000..3a8f388 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.c @@ -0,0 +1,1736 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_( + z_streamp strm, + int level, + const char *version, + int stream_size) +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_( + z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy, + const char *version, + int stream_size) +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary ( + z_streamp strm, + const Bytef *dictionary, + uInt dictLength) +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset ( + z_streamp strm) +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader ( + z_streamp strm, + gz_headerp head) +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime ( + z_streamp strm, + int bits, + int value) +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams( + z_streamp strm, + int level, + int strategy) +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune( + z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain) +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong ZEXPORT deflateBound( + z_streamp strm, + uLong sourceLen) +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB ( + deflate_state *s, + uInt b) +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending( + z_streamp strm) +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate ( + z_streamp strm, + int flush) +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd ( + z_streamp strm) +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy ( + z_streamp dest, + z_streamp source) +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf( + z_streamp strm, + Bytef *buf, + unsigned size) +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init ( + deflate_state *s) +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match( + deflate_state *s, + IPos cur_match) +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast( + deflate_state *s, + IPos cur_match) +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match( + deflate_state *s, + IPos start, + IPos match, + int length) +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window( + deflate_state *s) +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored( + deflate_state *s, + int flush) +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast( + deflate_state *s, + int flush) +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow( + deflate_state *s, + int flush) +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +#if 0 +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle( + deflate_state *s, + int flush) +{ + int bflush; /* set if current block must be flushed */ + uInt run; /* length of run */ + uInt max; /* maximum length of run */ + uInt prev; /* byte at distance one to match */ + Bytef *scan; /* scan for end of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + run = 0; + if (s->strstart > 0) { /* if there is a previous byte, that is */ + max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + scan = s->window + s->strstart - 1; + prev = *scan++; + do { + if (*scan++ != prev) + break; + } while (++run < max); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (run >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, run); + _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); + s->lookahead -= run; + s->strstart += run; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.h new file mode 100644 index 0000000..05a5ab3 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/deflate.h @@ -0,0 +1,331 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/infback.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/infback.c new file mode 100644 index 0000000..9f64041 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/infback.c @@ -0,0 +1,623 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_( + z_streamp strm, + int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size) +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->write = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables( + struct inflate_state FAR *state) +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack( + z_streamp strm, + in_func in, + void FAR *in_desc, + out_func out, + void FAR *out_desc) +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd( + z_streamp strm) +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.c new file mode 100644 index 0000000..0246852 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.c @@ -0,0 +1,318 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast( + z_streamp strm, + unsigned start) +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.h new file mode 100644 index 0000000..1e88d2d --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffixed.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffixed.h new file mode 100644 index 0000000..75ed4b5 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.c new file mode 100644 index 0000000..7e3d036 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.c @@ -0,0 +1,1368 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset( + z_streamp strm) +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime( + z_streamp strm, + int bits, + int value) +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_( + z_streamp strm, + int windowBits, + const char *version, + int stream_size) +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_( + z_streamp strm, + const char *version, + int stream_size) +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables( + struct inflate_state FAR *state) +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow( + z_streamp strm, + unsigned out) +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate( + z_streamp strm, + int flush) +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd( + z_streamp strm) +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary( + z_streamp strm, + const Bytef *dictionary, + uInt dictLength) +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader( + z_streamp strm, + gz_headerp head) +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch( + unsigned FAR *have, + unsigned char FAR *buf, + unsigned len) +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync( + z_streamp strm) +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint( + z_streamp strm) +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy( + z_streamp dest, + z_streamp source) +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.h new file mode 100644 index 0000000..07bd3e7 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.c new file mode 100644 index 0000000..5016d8f --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.c @@ -0,0 +1,329 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table( + codetype type, + unsigned short FAR *lens, + unsigned codes, + code FAR * FAR *table, + unsigned FAR *bits, + unsigned short FAR *work) +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + here.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = here; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.h new file mode 100644 index 0000000..b1104c8 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.c new file mode 100644 index 0000000..652e372 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.c @@ -0,0 +1,1233 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +#if defined(__SYMBIAN32__) +# define NO_WRITEABLE_DATA +#endif + +#ifdef NO_WRITEABLE_DATA +# define DEFINE_LOCAL_STATIC const local +#else /* #ifdef NO_WRITEABLE_DATA */ +# define DEFINE_LOCAL_STATIC local +#endif /* #ifdef NO_WRITEABLE_DATA */ + +DEFINE_LOCAL_STATIC static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +DEFINE_LOCAL_STATIC static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +DEFINE_LOCAL_STATIC static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits( + deflate_state *s, + int value, + int length) +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + +#ifndef NO_WRITEABLE_DATA + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif /* #ifndef NO_WRITEABLE_DATA */ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init( + deflate_state *s) +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block( + deflate_state *s) +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap( + deflate_state *s, + ct_data *tree, + int k) +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen( + deflate_state *s, + tree_desc *desc) +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes ( + ct_data *tree, + int max_code, + ushf *bl_count) +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree ( + deflate_state *s, + ct_data *tree, + int max_code) +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree ( + deflate_state *s, + ct_data *tree, + int max_code) +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree( + deflate_state *s) +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees( + deflate_state *s, + int lcodes, + int dcodes, + int blcodes) +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block( + deflate_state *s, + charf *buf, + ulg stored_len, + int eof) +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align( + deflate_state *s) +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block( + deflate_state *s, + charf *buf, + ulg stored_len, + int eof) +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally ( + deflate_state *s, + unsigned dist, + unsigned lc) +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block( + deflate_state *s, + ct_data *ltree, + ct_data *dtree) +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type( + deflate_state *s) +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse( + unsigned code, + int len) +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush( + deflate_state *s) +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup( + deflate_state *s) +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block( + deflate_state *s, + charf *buf, + unsigned len, + int header) +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.h new file mode 100644 index 0000000..72facf9 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/uncompr.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/uncompr.c new file mode 100644 index 0000000..89d42a4 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/uncompr.c @@ -0,0 +1,61 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress ( + Bytef *dest, + uLongf *destLen, + const Bytef *source, + uLong sourceLen) +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zconf.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zconf.h new file mode 100644 index 0000000..30cf424 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zconf.h @@ -0,0 +1,329 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zlib.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zlib.h new file mode 100644 index 0000000..0228179 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.c b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.c new file mode 100644 index 0000000..0c13662 --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error ( + char *m) +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError( + int err) +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy( + Bytef* dest, + const Bytef* source, + uInt len) +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp( + const Bytef* s1, + const Bytef* s2, + uInt len) +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero( + Bytef* dest, + uInt len) +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc ( + voidpf opaque, + unsigned items, + unsigned size) +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree ( + voidpf opaque, + voidpf ptr) +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.h b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.h new file mode 100644 index 0000000..b7d5eff --- /dev/null +++ b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl-2.012/zlib-src/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz deleted file mode 100644 index fdf16663c3967ac771ef2b23f91f0e5f7ef3358a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3727 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 diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.dsc b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.dsc deleted file mode 100644 index d7e7f15..0000000 --- a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011-2ubuntu0.1.dsc +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -Format: 1.0 -Source: libcompress-raw-zlib-perl -Binary: libcompress-raw-zlib-perl -Architecture: any -Version: 2.011-2ubuntu0.1 -Maintainer: Ubuntu Core Developers -Uploaders: Krzysztof Krzyzaniak (eloy) , Damyan Ivanov , gregor herrmann -Homepage: http://search.cpan.org/dist/Compress-Raw-Zlib/ -Standards-Version: 3.7.3 -Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libcompress-raw-zlib-perl/ -Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libcompress-raw-zlib-perl/ -Build-Depends: debhelper (>= 7), perl (>= 5.8.8-7), libtest-pod-perl, zlib1g-dev, quilt (>= 0.40) -Checksums-Sha1: - 99e1ba1b6c9c26ecff759a25208629cd35b8291d 207842 libcompress-raw-zlib-perl_2.011.orig.tar.gz - f92c7a0041a80d3abc89082a0e088cbeebfecc7d 3727 libcompress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz -Checksums-Sha256: - 9493420c480c06353c13d8c5ac999552848e0df2412416b685038533b3701eb6 207842 libcompress-raw-zlib-perl_2.011.orig.tar.gz - 6dda2d6eff0d2bdfbf8fddfda7bd1b0cb1a0deca350efeec0ff524b268199cef 3727 libcompress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz -Files: - 15456e9a79e87996a9b79e575d513276 207842 libcompress-raw-zlib-perl_2.011.orig.tar.gz - 09f1a38aa7afb7f20872ad597164b175 3727 libcompress-raw-zlib-perl_2.011-2ubuntu0.1.diff.gz -Original-Maintainer: Debian Perl Group - ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.9 (GNU/Linux) - -iEYEARECAAYFAkpFDNAACgkQLMAs/0C4zNrn5ACgmj7/6so9NyPaFDqtCkiVqs0x -nTkAn3jRFPHfUXKIufEdZtfjL9hsuTlq -=wDrv ------END PGP SIGNATURE----- diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011.orig.tar.gz b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.011.orig.tar.gz deleted file mode 100644 index f2fa7982015fe1f76f8d144151738a2368aa4b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207842 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 N$r-{VX5KC?syTp?^u|KJ1n#> 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

  • 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 +Uploaders: Krzysztof Krzyzaniak (eloy) , Damyan Ivanov , gregor herrmann +Homepage: http://search.cpan.org/dist/Compress-Raw-Zlib/ +Standards-Version: 3.8.0 +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libcompress-raw-zlib-perl/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libcompress-raw-zlib-perl/ +Build-Depends: debhelper (>= 7), perl (>= 5.8.8-7), libtest-pod-perl, zlib1g-dev, quilt (>= 0.40) +Checksums-Sha1: + 3bb771db299de526749ead5a6f6897d94f74b413 208481 libcompress-raw-zlib-perl_2.012.orig.tar.gz + 95fcd6e72af1a51f0cf1f08d4d63fcb132d7da8a 3689 libcompress-raw-zlib-perl_2.012-1lenny1.diff.gz +Checksums-Sha256: + ac197083541d1a900f7ecd43a6c3a4b83bd5ca26bd02730e612de579b8bf5b21 208481 libcompress-raw-zlib-perl_2.012.orig.tar.gz + 9e1eee454ee0ad40dbe10c3b95125a4b2e8b43fabeefbc0abde3762277d7508b 3689 libcompress-raw-zlib-perl_2.012-1lenny1.diff.gz +Files: + 7eb9fc5a21232700db8708e5a07e5cb6 208481 libcompress-raw-zlib-perl_2.012.orig.tar.gz + 5d88b947abf8ceccd67bb21802969a5e 3689 libcompress-raw-zlib-perl_2.012-1lenny1.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEARECAAYFAkqW3CAACgkQiyizGWoHLTlrCQCeKhdD+0yxImwaYNoB7cOaBBQh +cIoAn3vOdGVVDJxUqVWv/xCqXZbnDXCt +=OqfP +-----END PGP SIGNATURE----- diff --git a/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.012.orig.tar.gz b/dev/i386/libcompress-raw-zlib-perl/libcompress-raw-zlib-perl_2.012.orig.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e4d46d8a02ad131bbab7200dcc1a5d8c766b969e GIT binary patch literal 208481 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

    Nj)>rwGjL%e!y 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

    w{qf9 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

    W{(SQ-=k+JKPGjx@zBtDBl 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�Hu}KhB~1J&Z&rdH)RB~rZTej zF*?h#h%(RDHOngSnYZ0xi_V~gVD

    Q)Sks#soYOBtuAip~HC>$Wkcvf52fbw!HS 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 literal 0 HcmV?d00001 diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog new file mode 100644 index 0000000..72753e4 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog @@ -0,0 +1,192 @@ +2007-10-11 Andreas J. Koenig + + * release 2.08 + + * skip the recurse test on 5.005 + +2007-01-05 Andreas J. Koenig + + * release 2.07 + + * rewrite symdump.t using Test::More + + * adjust test suite to accept main::- also introduced for named + captures + +2006-10-08 Andreas J. Koenig + + * release 2.0604 + + * adjust test suite to accept main::+ introduced by named captures + +2006-09-20 Andreas J. Koenig + + * relase 2.0603 + + * add LICENSE field to Makefile.PL to also have it in the META.yml + +2006-07-19 Andreas J. Koenig + + * release 2.0602 + + * adjust test suite to accept new variable in bleadperl, the hash + $main::^H + +2006-05-03 Andreas J. Koenig + + * release 2.0601 + + * add copyright and license + +2006-01-18 Andreas J. Koenig + + * release 2.06 + + * New warnings in bleadperl now suppressed; minor pod issues fixed + +2006-01-02 Andreas J. Koenig + + * release 2.05 + + * fix the testcase for recursion so that it compiles and works + also after patch 26370 to perl after which stashes are not + autovivified anymore. + +2005-12-25 Andreas J. Koenig + + * release 2.04 + + * Export.pm now strict clean + + * Makefile.PL up to date + + * added ChangeLog.svn + + * added tests for recursion, pod, podcover + + * Fixed rt.cpan.org #8766--recursion + +2002-03-01 Andreas J. Koenig + + * lib/Devel/Symdump.pm: perl 5.6.1 introduced a package name of + "" to work around a bug if somebody uses the deprecated + C without an argument. I believe we need to ignore that + symbol completely so that at least we follow the lead of the B:: + extensions. Thanks to Sreeji K Das /sreeji_k at yahoo.com/ for the + report. + +2000-10-31 Andreas J. Koenig + + * Typo fix: hashs --> hashes. Thanks to Sebastien Blondeel + for the report. + +2000-06-14 Andreas J. Koenig + + * Fixed my email address in and made a few tiny editorial changes + to the manpage. + + * Replaced Changes file with this ChangeLog file, appended the + full Changes file below. + + * Fixed the test 6 in t/symdump.t. This test was broken by + perl-5.6.0 but not Devel::Symdump itself. + +1997-05-16 Andreas Koenig + + * Release 2.00 + + * Fixed typos in the manpage, added a test for tree, no functional + change, released 2.00. + +1997-03-31 Andreas Koenig + + * 1.99_01 + + * 1.99_01 is the designated 2.00. + + * Between 1.20 and 1.23 the method as_HTML was introduced and a + few code cleanups happened. + + * 2.00 switches implementation to use *ENTRY{XXX} internally. This + means that we can determine scalarness even for undefined scalars. + We don't expect unknowns anymore. + + * 2.00 introduces the new ios() method which should replace the + older filehandles() and dirhandles() methods. For backwards + compatibility the old methods continue to work as they used to. + + * 2.00 comes with isa_tree and inh_tree utility methods for + analysing the inheritance tree. Devel::Symdump objects may be used + to create snapshots, but their typical use would be as class + methods. + +1995-08-16 Andreas Koenig + + * 1.20 + + * test 7 of t/symdump.t was too capricious. In fact the test was + based on wrong assumptions about loaded packages in the perl + binary. Static perls and dynamic perls have different symbol + tables when they run thetests. So test 7 is gone. + + * test 4 of t/symdump.t relied on $@ being set like in perl5.001m. + This might not be a correct assumption. So test 4 is replaced with + a dummy 'print ok' until the $@ problem is sorted out + +1995-07-03 Andreas Koenig + + * 1.19 + + * Added an as_string method. + + * Rewrote the test scripts so they output standard test strings + "ok nnn". This is dangerous for new perl releases, but will help + me do get bug reports early. + + * Renamed the exporting example package to Devel::Symdump::Export. + +1995-05-29 Andreas Koenig + + * 1.16 + + * Changed '${pack}::' and relatives back to "$pack\:\:" to make + the package "-w" safe. Deleted the debug statement in _doit() + after Gurusamy Sarathy fixed the bug in perl5.001, but left a + comment there. + + * Changed the AUTHORS section to plain "Andreas & Tom". + + * Added this Changes file :) + +1995-05-28 Andreas Koenig + + * 1.14 + + * After a considerable amount of mail exchange between Tom and me, + we now have a unknowns() method for all the rest in the symbol + table that we currently don't follow further. new() is renamed to + rnew() which stands for recursive new. new() now does not go into + recursion which becomes the default behaviour for people calling + directly Devel::Symdump->arrays etc. + + * Added a Devel::Symdump::Exp package for Tom who wanted the + methods exported. Tom had tried to add Exporter to the package and + to export the undefined methods directly. Andreas didn't trust + this trick although it seemed to work fine. So they are still + considering if it can be done. + +1995-05-27 Andreas Koenig + + * 1.09 + + * Drops all prettyprint functionality and becomes a primitiv + package after some talk with Tom Christiansen and Gurusamy + Sarathy. Moreover, Dean Roehrich's additions to the perlbot + manpage gave me (Andreas) some hints about package globals which + now get a new dress within the object. + +1995-05-xx Andreas Koenig + + * 1.05 + + * First release of the formerly Devel::Debug called package. diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog.svn b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog.svn new file mode 100644 index 0000000..16c87cb --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/ChangeLog.svn @@ -0,0 +1,222 @@ +------------------------------------------------------------------------ +r31 | k | 2007-10-11 07:19:45 +0200 (Thu, 11 Oct 2007) | 1 line +Changed paths: + M /trunk/Makefile.PL + +locale for svn fix +------------------------------------------------------------------------ +r30 | k | 2007-10-11 07:18:28 +0200 (Thu, 11 Oct 2007) | 1 line +Changed paths: + M /trunk/ChangeLog + +release notes 2.08 +------------------------------------------------------------------------ +r29 | k | 2007-06-25 08:09:04 +0200 (Mon, 25 Jun 2007) | 2 lines +Changed paths: + M /trunk/lib/Devel/Symdump.pm + M /trunk/t/recur.t + +skip the recurse test on 5.005 + +------------------------------------------------------------------------ +r28 | k | 2007-01-05 05:27:26 +0100 (Fri, 05 Jan 2007) | 1 line +Changed paths: + M /trunk/ChangeLog + M /trunk/Makefile.PL + M /trunk/lib/Devel/Symdump.pm + M /trunk/t/symdump.t + +support %-; use Test::More +------------------------------------------------------------------------ +r27 | k | 2006-10-08 08:25:25 +0200 (Sun, 08 Oct 2006) | 1 line +Changed paths: + M /trunk/ChangeLog + M /trunk/lib/Devel/Symdump.pm + M /trunk/t/symdump.t + +adjust test suite to accept main::+ introduced by named captures +------------------------------------------------------------------------ +r26 | k | 2006-09-20 22:34:18 +0200 (Wed, 20 Sep 2006) | 1 line +Changed paths: + M /trunk/Makefile.PL + +wrongly done, the $VERSION = eval $VERSION thing, was not always biting +------------------------------------------------------------------------ +r25 | k | 2006-09-20 22:26:43 +0200 (Wed, 20 Sep 2006) | 1 line +Changed paths: + M /trunk/ChangeLog + +prepare for 2.0603 that shall have LICENSE in the META.yaml +------------------------------------------------------------------------ +r24 | k | 2006-09-20 22:24:27 +0200 (Wed, 20 Sep 2006) | 1 line +Changed paths: + M /trunk/Makefile.PL + M /trunk/lib/Devel/Symdump.pm + +prepare for 2.0603 that shall have LICENSE in the META.yaml +------------------------------------------------------------------------ +r23 | k | 2006-07-19 05:06:25 +0200 (Wed, 19 Jul 2006) | 2 lines +Changed paths: + M /trunk/ChangeLog + M /trunk/Makefile.PL + M /trunk/lib/Devel/Symdump.pm + +Prepare release 2.0602 + +------------------------------------------------------------------------ +r22 | k | 2006-07-19 04:55:05 +0200 (Wed, 19 Jul 2006) | 2 lines +Changed paths: + M /trunk/t/symdump.t + +bleadperl has $^H around, another hash in main + +------------------------------------------------------------------------ +r21 | k | 2006-05-04 09:23:43 +0200 (Thu, 04 May 2006) | 1 line +Changed paths: + M /trunk/README + +blah +------------------------------------------------------------------------ +r20 | k | 2006-05-03 05:08:59 +0200 (Wed, 03 May 2006) | 1 line +Changed paths: + M /trunk/lib/Devel/Symdump.pm + +added copyright and license; fixes #19040 +------------------------------------------------------------------------ +r19 | k | 2006-02-07 14:04:21 +0100 (Tue, 07 Feb 2006) | 1 line +Changed paths: + M /trunk/README + +blah +------------------------------------------------------------------------ +r18 | k | 2006-01-18 05:57:47 +0100 (Wed, 18 Jan 2006) | 1 line +Changed paths: + M /trunk/Makefile.PL + +let Debian's pod2text do the work, mine is broken +------------------------------------------------------------------------ +r17 | k | 2006-01-18 05:53:21 +0100 (Wed, 18 Jan 2006) | 2 lines +Changed paths: + M /trunk/README + M /trunk/lib/Devel/Symdump.pm + +Maybe it was the E in the pod that made pod2text die? + +------------------------------------------------------------------------ +r16 | k | 2006-01-18 05:47:37 +0100 (Wed, 18 Jan 2006) | 2 lines +Changed paths: + M /trunk/Makefile.PL + +Let pod2man be run from current perl + +------------------------------------------------------------------------ +r15 | k | 2006-01-18 05:44:20 +0100 (Wed, 18 Jan 2006) | 3 lines +Changed paths: + M /trunk/lib/Devel/Symdump.pm + +New warning in perl suppressed + + +------------------------------------------------------------------------ +r14 | k | 2006-01-02 22:30:57 +0100 (Mon, 02 Jan 2006) | 2 lines +Changed paths: + M /trunk/README + +autogenerated + +------------------------------------------------------------------------ +r13 | k | 2006-01-02 22:28:12 +0100 (Mon, 02 Jan 2006) | 2 lines +Changed paths: + M /trunk/ChangeLog + M /trunk/lib/Devel/Symdump.pm + M /trunk/t/recur.t + +fix testcase, up version number, document change in ChangeLog + +------------------------------------------------------------------------ +r11 | k | 2005-12-25 07:17:16 +0100 (Sun, 25 Dec 2005) | 2 lines +Changed paths: + M /trunk/Makefile.PL + +release better with debian perl and -I + +------------------------------------------------------------------------ +r10 | k | 2005-12-25 07:13:29 +0100 (Sun, 25 Dec 2005) | 2 lines +Changed paths: + M /trunk/MANIFEST + +podcover + +------------------------------------------------------------------------ +r9 | k | 2005-12-25 07:12:20 +0100 (Sun, 25 Dec 2005) | 2 lines +Changed paths: + M /trunk/ChangeLog + M /trunk/MANIFEST + +blah + +------------------------------------------------------------------------ +r8 | k | 2005-12-25 07:07:26 +0100 (Sun, 25 Dec 2005) | 1 line +Changed paths: + A /trunk/ChangeLog.local + M /trunk/README + + +------------------------------------------------------------------------ +r7 | k | 2005-12-25 07:06:18 +0100 (Sun, 25 Dec 2005) | 2 lines +Changed paths: + M /trunk/Makefile.PL + +first stab + +------------------------------------------------------------------------ +r6 | k | 2005-12-25 06:58:23 +0100 (Sun, 25 Dec 2005) | 1 line +Changed paths: + M /trunk/MANIFEST + M /trunk/lib/Devel/Symdump.pm + A /trunk/t/pod.t + A /trunk/t/podcover.t + A /trunk/t/recur.t + +Fix rt.cpan.org #8766--recursion; add tests for recursion, pod, podcover +------------------------------------------------------------------------ +r5 | k | 2005-12-25 05:15:02 +0100 (Sun, 25 Dec 2005) | 1 line +Changed paths: + M /trunk/lib/Devel/Symdump/Export.pm + +fix strict +------------------------------------------------------------------------ +r4 | k | 2005-12-25 04:59:41 +0100 (Sun, 25 Dec 2005) | 1 line +Changed paths: + A /trunk/ChangeLog + A /trunk/MANIFEST + A /trunk/MANIFEST.SKIP + A /trunk/Makefile.PL + A /trunk/README + A /trunk/benchmark + A /trunk/benchmark/benchmark.out + A /trunk/benchmark/benchmark.pl + A /trunk/lib + A /trunk/lib/Devel + A /trunk/lib/Devel/Symdump + A /trunk/lib/Devel/Symdump/Export.pm + A /trunk/lib/Devel/Symdump.pm + A /trunk/t + A /trunk/t/autogen.t + A /trunk/t/diff.t + A /trunk/t/export.t + A /trunk/t/symdump.t + A /trunk/t/tree.t + +starting in subversion without history +------------------------------------------------------------------------ +r1 | k | 2005-12-25 04:55:42 +0100 (Sun, 25 Dec 2005) | 1 line +Changed paths: + A /trunk + + +------------------------------------------------------------------------ + +Local Variables: +mode: text +End: diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/MANIFEST b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/MANIFEST new file mode 100644 index 0000000..c7a5163 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/MANIFEST @@ -0,0 +1,17 @@ +ChangeLog +ChangeLog.svn +MANIFEST +Makefile.PL +README +lib/Devel/Symdump.pm +lib/Devel/Symdump/Export.pm +t/autogen.t +t/diff.t +t/export.t +t/pod.t +t/podcover.t +t/recur.t +t/symdump.t +t/tree.t +META.yml Module meta-data (added by MakeMaker) +SIGNATURE Public-key signature (added by MakeMaker) diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/META.yml b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/META.yml new file mode 100644 index 0000000..de21544 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/META.yml @@ -0,0 +1,12 @@ +--- #YAML:1.0 +name: Devel-Symdump +version: 2.08 +abstract: ~ +license: perl +generated_by: ExtUtils::MakeMaker version 6.3601 +distribution_type: module +requires: + Test::More: 0 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/Makefile.PL b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/Makefile.PL new file mode 100644 index 0000000..151d19d --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/Makefile.PL @@ -0,0 +1,169 @@ +use lib "./lib"; +use Devel::Symdump (); +use ExtUtils::MakeMaker qw(:DEFAULT); + +eval { require File::Spec; }; +my $HAVE_FILE_SPEC = !$@; +use strict; +use vars qw($VERSION); + +my $Id = q$Id: Makefile.PL 146 2005-08-09 04:25:21Z k $; +$VERSION = sprintf "%.3f", 1 + substr(q$Rev: 146 $,4)/1000; + +my $version_diff = 0; # we'll have to die if this becomes true +{ + local $^W; + $ExtUtils::MakeMaker::VERSION = eval $ExtUtils::MakeMaker::VERSION; +} +if ($HAVE_FILE_SPEC) { + my $version_from = File::Spec->catfile(qw(lib Devel Symdump.pm)); + my $version_set_manually = 1; # not by SVN + + if ($ARGV[0] && $ARGV[0] eq "--setversion") { + die "Your perl is a bit dated[$]].\nDo not make a release with it\n" if $] < 5.008; + die "Your MakeMaker is a bit dated[$]].\nDo not make a release with it\n" + if $ExtUtils::MakeMaker::VERSION < 6.3004; + die "Your MakeMaker doesn't do the sign woodoo" unless + MM->can("signature_target"); + shift @ARGV; + my $st; + local $ENV{LANG} = "C"; + open $st, "svn st -u|" or die; + my $dirty = 0; + while (<$st>) { + next if /^\?/; + next if /^Head revision:/; + next if /^Status against revision:/; + print; + $dirty++; + } + close $st; + die "Not everything checked in?" if $dirty; + + # $re parses the upper boundary of the output of svnversion + my $re; + eval q{ $re = qr/(?:\d+:)?(\d+)[SM]*$/; }; + die $@ if $@; # old perl + my($sv_dot) = `svnversion .` =~ $re; + my($sv_from) = `svn st -u -v $version_from` =~ /^.{8}\s*(?:\d+)\s*(\d+)/; + die "Could not determine sv_from or sv_dot" + unless $sv_from > 0 && $sv_dot > 0; + if ($version_set_manually) { + unshift @INC, "lib"; + require $version_from; + open my $fh, "make the-release-name|" or die; + my $have_version; + while (<$fh>) { + next unless /^version\s+([\d\._]+)/; + $have_version = eval $1; + } + die "could not determine current version from Makefile" unless $have_version; + eval q{ + no warnings "numeric"; + if ($Devel::Symdump::VERSION != $have_version) { + warn "Not equal: D:S:VERSION[$Devel::Symdump::VERSION] Makefile version[$have_version]"; + $version_diff = 1; + } +}; + die $@ if $@; + } else { + if ($sv_dot > $sv_from) { + warn "setting some property to make a checkin of this file possible"; + 0==system(svn => "propset", + "cpan:release", + "after_$sv_dot", + $version_from) or die; + warn "checking in to get the version up to the bleading edge"; + 0==system(svn => "ci", + "-m", + "Property set for release after_$sv_dot", + $version_from) or die; + # will have to die after Makefile is rewritten: + $version_diff = 1; + } + } + exit unless $version_diff; + } +} + +my @sign = (MM->can("signature_target") ? (SIGN => 1) : ()); +WriteMakefile( + NAME => "Devel::Symdump", + DISTNAME => "Devel-Symdump", + VERSION_FROM => "lib/Devel/Symdump.pm", + ($ExtUtils::MakeMaker::VERSION >= 6.3001 ? + (LICENSE => "perl") : (), + ), + PREREQ_PM => { + 'Test::More' => 0, + }, + 'clean' => {FILES => '*/*/*~'}, + 'dist' => { + DIST_DEFAULT => 'Makefile setversion README all chlog tardist', + COMPRESS => 'gzip -9f' + }, + @sign, + ); + +if ($version_diff){ + die " +==> I had to update some \$VERSIONs <== +==> Your Makefile has been rebuilt. <== +==> Please rerun the make command. <== +"; +} + +# Exclude .svn directories. +sub MY::libscan { + my($self,$path) = @_; + return '' if $path =~ m:(\b(RCS|CVS|SCCS)|\.svn)\b: ; + $path; +} + +sub MY::postamble { + q{ +setversion: + $(PERL) Makefile.PL --setversion + +README: lib/Devel/Symdump.pm Makefile + chmod +w $@ + /usr/bin/pod2text lib/Devel/Symdump.pm > $@ + +chlog :: + LC_ALL=en_GB.utf8 svn log -v -r `svnversion . | perl -ne '/(?:\d+:)?(\d+)[SM]*$$/&&print $$1'`:1 > ChangeLog.svn + cat ChangeLog.local >> ChangeLog.svn + +the-release-name : + $(NOECHO) $(ECHO) 'version ' $(VERSION) + $(NOECHO) $(ECHO) 'release-name ' $(DISTVNAME).tar$(SUFFIX) + +release :: + /usr/bin/perl -I../../CPAN/SVN/release-lib -S release $(DISTVNAME).tar$(SUFFIX) + +sign: + cpansign -s + +howto-release: + @$(ECHO) manually set version in Symdump.pm, edit ChangeLog + @$(ECHO) make ci dist \&\& make release +} +} + +sub MY::dist_ci { + return qq{ci : + svn ci +}; +} + +sub MY::dist_test { + return q{ +# if we depend on $(DISTVNAME).tar$(SUFFIX), then the rest of the +# Makefile breaks our intent to NOT remake dist +disttest : + rm -rf $(DISTVNAME) + tar xvzf $(DISTVNAME).tar$(SUFFIX) + cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL + cd $(DISTVNAME) && $(MAKE) $(PASTHRU) + cd $(DISTVNAME) && $(MAKE) test $(PASTHRU) +} +} diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/README b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/README new file mode 100644 index 0000000..6f89aa2 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/README @@ -0,0 +1,140 @@ +NAME + Devel::Symdump - dump symbol names or the symbol table + +SYNOPSIS + # Constructor + require Devel::Symdump; + @packs = qw(some_package another_package); + $obj = Devel::Symdump->new(@packs); # no recursion + $obj = Devel::Symdump->rnew(@packs); # with recursion + + # Methods + @array = $obj->packages; + @array = $obj->scalars; + @array = $obj->arrays; + @array = $obj->hashes; + @array = $obj->functions; + @array = $obj->filehandles; # deprecated, use ios instead + @array = $obj->dirhandles; # deprecated, use ios instead + @array = $obj->ios; + @array = $obj->unknowns; # only perl version < 5.003 had some + + $string = $obj->as_string; + $string = $obj->as_HTML; + $string = $obj1->diff($obj2); + + $string = Devel::Symdump->isa_tree; # or $obj->isa_tree + $string = Devel::Symdump->inh_tree; # or $obj->inh_tree + + # Methods with autogenerated objects + # all of those call new(@packs) internally + @array = Devel::Symdump->packages(@packs); + @array = Devel::Symdump->scalars(@packs); + @array = Devel::Symdump->arrays(@packs); + @array = Devel::Symdump->hashes(@packs); + @array = Devel::Symdump->functions(@packs); + @array = Devel::Symdump->ios(@packs); + @array = Devel::Symdump->unknowns(@packs); + +DESCRIPTION + This little package serves to access the symbol table of perl. + + "Devel::Symdump->rnew(@packages)" + returns a symbol table object for all subtrees below @packages. + Nested Modules are analyzed recursively. If no package is given as + argument, it defaults to "main". That means to get the whole symbol + table, just do a "rnew" without arguments. + + The global variable $Devel::Symdump::MAX_RECURSION limits the + recursion to prevent contention. The default value is set to 97, + just low enough to survive the test suite without a warning about + deep recursion. + + "Devel::Symdump->new(@packages)" + does not go into recursion and only analyzes the packages that are + given as arguments. + + packages, scalars, arrays, hashes, functions, ios + The methods packages(), scalars(), arrays(), hashes(), functions(), + ios(), and (for older perls) unknowns() each return an array of + fully qualified symbols of the specified type in all packages that + are held within a Devel::Symdump object, but without the leading + "$", "@" or "%". In a scalar context, they will return the number of + such symbols. Unknown symbols are usually either formats or + variables that haven't yet got a defined value. + + as_string + as_HTML + As_string() and as_HTML() return a simple string/HTML + representations of the object. + + diff + Diff() prints the difference between two Devel::Symdump objects in + human readable form. The format is similar to the one used by the + as_string method. + + isa_tree + inh_tree + Isa_tree() and inh_tree() both return a simple string representation + of the current inheritance tree. The difference between the two + methods is the direction from which the tree is viewed: top-down or + bottom-up. As I'm sure, many users will have different expectation + about what is top and what is bottom, I'll provide an example what + happens when the Socket module is loaded: + + % print Devel::Symdump->inh_tree + AutoLoader + DynaLoader + Socket + DynaLoader + Socket + Exporter + Carp + Config + Socket + + The inh_tree method shows on the left hand side a package name and + indented to the right the packages that use the former. + + % print Devel::Symdump->isa_tree + Carp + Exporter + Config + Exporter + DynaLoader + AutoLoader + Socket + Exporter + DynaLoader + AutoLoader + + The isa_tree method displays from left to right ISA relationships, + so Socket IS A DynaLoader and DynaLoader IS A AutoLoader. (Actually, + they were at the time this manpage was written) + + You may call both methods, isa_tree() and inh_tree(), with an object. If + you do that, the object will store the output and retrieve it when you + call the same method again later. The typical usage would be to use them + as class methods directly though. + +SUBCLASSING + The design of this package is intentionally primitive and allows it to + be subclassed easily. An example of a (maybe) useful subclass is + Devel::Symdump::Export, a package which exports all methods of the + Devel::Symdump package and turns them into functions. + +AUTHORS + Andreas Koenig and Tom Christiansen . + Based on the old dumpvar.pl by Larry Wall. + +COPYRIGHT, LICENSE + This module is + + Copyright (c) 1995, 1997, 2000, 2002, 2005, 2006 Andreas Koenig + "". + + All rights reserved. + + This library is free software; you may use, redistribute and/or modify + it under the same terms as Perl itself. + diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/SIGNATURE b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/SIGNATURE new file mode 100644 index 0000000..e017602 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/SIGNATURE @@ -0,0 +1,39 @@ +This file contains message digests of all files listed in MANIFEST, +signed via the Module::Signature module, version 0.55. + +To verify the content in this distribution, first make sure you have +Module::Signature installed, then type: + + % cpansign -v + +It will check each file's integrity, as well as the signature's +validity. If "==> Signature verified OK! <==" is not displayed, +the distribution may already have been compromised, and you should +not run its Makefile.PL or Build.PL. + +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +SHA1 b26062e593b7601804ac92858069f5ffb067a2bd ChangeLog +SHA1 2ea2a2d7e313dc9128a0333ad72151a1c02ba06e ChangeLog.svn +SHA1 57c703a831e1f5ff653e6030716b9280baea9e2a MANIFEST +SHA1 4108143832179c2b5550a88c0054185aca37f6c5 META.yml +SHA1 571cb623c8bcf95707e3152e8de44316212b04fd Makefile.PL +SHA1 35d8e1b8675e6acc3d66307ab11b39b5641f5725 README +SHA1 3fcf4379b16168928cd98ecaad17bbbbc89eb177 lib/Devel/Symdump.pm +SHA1 fef2e4c5ea88bd09f2af618e32a58ee87be965a4 lib/Devel/Symdump/Export.pm +SHA1 08075038f75f26eeac19654d9cc0d96c729c23d7 t/autogen.t +SHA1 ac80cb093bffdce80ea28209197e58ec40b0cdd4 t/diff.t +SHA1 6bc8983394b0a72d8ee3234b4788f9f81fbefca1 t/export.t +SHA1 6a79f15a10337bd3450604abf39d4462df2a550b t/pod.t +SHA1 0890cfccb8d1d026a7f142df290ac5b4e64f5e56 t/podcover.t +SHA1 a3c92f14ca7be245384a8a9f1425f6b99c2f42f1 t/recur.t +SHA1 2713852654d6d7a133694e75122cefa2db5c37c4 t/symdump.t +SHA1 d7e8e57a5c9676c8fd716b6b0fe13559c83d8711 t/tree.t +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.6 (GNU/Linux) + +iD8DBQFHDbKF7IA58KMXwV0RAuPzAJ0fpaTdhrqUEgqoxee4uVB3ElPmwwCfVcNp +QsD0qvUU2YnEWnbQ4JjBh4w= +=D1eb +-----END PGP SIGNATURE----- diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/changelog b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/changelog new file mode 100644 index 0000000..9559ada --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/changelog @@ -0,0 +1,97 @@ +libdevel-symdump-perl (2.08-1) unstable; urgency=low + + * New upstream release. + * Update debian/copyright. + + -- Colin Watson Tue, 01 Apr 2008 12:16:58 +0100 + +libdevel-symdump-perl (2.03-4) unstable; urgency=low + + * Include Perl's licensing terms in debian/copyright. + * debian/watch: use dist-based URL. + * Build package in binary-indep, not binary-arch. + * Use debhelper v5. + * Remove /usr/lib/perl5 in a more standard way. + * Don't ignore errors from 'make distclean' other than the Makefile not + existing. + * Move debhelper to Build-Depends, as it's used in the clean target. + * Policy version 3.7.3. + + -- Colin Watson Tue, 29 Jan 2008 01:09:22 +0000 + +libdevel-symdump-perl (2.03-3) unstable; urgency=low + + * Recode debian/copyright to UTF-8. + * Add local override to Makefile.PL to handle .svn directories (see + #190065). + * Sync with override file: change section to perl. + * Policy version 3.5.9: no changes required. + + -- Colin Watson Sat, 26 Apr 2003 01:32:33 +0100 + +libdevel-symdump-perl (2.03-2) unstable; urgency=low + + * Policy version 3.5.7: support DEB_BUILD_OPTIONS=noopt. + * Remove some cruft from debian/rules. + + -- Colin Watson Mon, 11 Nov 2002 20:15:36 +0000 + +libdevel-symdump-perl (2.03-1) unstable; urgency=low + + * New upstream release. + * Add a debian/watch file for uscan. + + -- Colin Watson Thu, 25 Apr 2002 19:06:50 +0100 + +libdevel-symdump-perl (2.02-1) unstable; urgency=low + + * New upstream release. + * Don't install /usr/lib/perl5. + + -- Colin Watson Sat, 9 Mar 2002 22:11:40 +0000 + +libdevel-symdump-perl (2.01-1) unstable; urgency=low + + * New maintainer. + * New upstream release. + * Policy version 3.5.6. + * Perl policy version 1.20, including removing .packlist from old perl + 5.6.0 archlib directory (closes: #95419, #104748). + * Fix spelling error in description (closes: #124937). + * Remove redundant README.debian, which is just the package description. + * Fix licence paths in copyright file. + * Removed user emacs settings from this changelog. + + -- Colin Watson Wed, 19 Dec 2001 19:25:21 +0000 + +libdevel-symdump-perl (2.00-5) unstable; urgency=low + + * recompiled to match doc & man policies. closes: #91193, #91546 + * .packlist bug was fixed ages ago. closes: #38958 + + -- Craig Sanders Sat, 31 Mar 2001 12:15:47 +1000 + +libdevel-symdump-perl (2.00-4) unstable; urgency=low + + * rebuilt again with improved debian/rules file + + -- Craig Sanders Mon, 5 Jul 1999 13:35:35 +1000 + +libdevel-symdump-perl (2.00-3) unstable; urgency=low + + * rebuilt for new perl standards + * removed .packlist fixes #38958 + + -- Craig Sanders Sun, 4 Jul 1999 11:47:25 +1000 + +libdevel-symdump-perl (2.00-2) unstable; urgency=low + + * fixed hard-code i386 architecture bug (#28045) + + -- Craig Sanders Fri, 16 Oct 1998 20:06:35 +1000 + +libdevel-symdump-perl (2.00-1) unstable; urgency=low + + * Initial Release. + + -- Craig Sanders Sun, 27 Sep 1998 09:09:57 +1000 diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/compat b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/control b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/control new file mode 100644 index 0000000..4c9604e --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/control @@ -0,0 +1,15 @@ +Source: libdevel-symdump-perl +Section: perl +Priority: optional +Maintainer: Colin Watson +Standards-Version: 3.7.3 +Build-Depends: debhelper (>= 5.0.0) +Build-Depends-Indep: perl (>= 5.6.0-16) + +Package: libdevel-symdump-perl +Architecture: all +Depends: ${misc:Depends}, ${perl:Depends} +Description: Perl module for inspecting perl's symbol table + The perl module Devel::Symdump provides a convenient way to inspect + perl's symbol table and the class hierarchies within a running program. + diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/copyright b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/copyright new file mode 100644 index 0000000..f7f806a --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/copyright @@ -0,0 +1,35 @@ +This package was debianized by Craig Sanders cas@taz.net.au on +Mon, 5 Jul 1999 13:36:07 +1000, and is now maintained by Colin Watson +. + +It was downloaded from CPAN. +http://search.cpan.org/CPAN/authors/id/A/AN/ANDK/Devel-Symdump-2.08.tar.gz + +Author: Andreas König + +Copyright: + + This module is + + Copyright (c) 1995, 1997, 2000, 2002, 2005, 2006 Andreas Koenig + "". + + All rights reserved. + + This library is free software; you may use, redistribute and/or modify + it under the same terms as Perl itself. + +Perl's licensing terms at the time of writing are as follows: + + This program is free software; you can redistribute it and/or modify + it under the terms of either: + + a) the GNU General Public License as published by the Free Software + Foundation; either version 1, or (at your option) any later + version, or + + b) the "Artistic License" which comes with Perl. + + On Debian GNU/Linux systems, the complete text of the GNU General + Public License can be found in `/usr/share/common-licenses/GPL' and + the Artistic Licence in `/usr/share/common-licenses/Artistic'. diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/docs b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/docs new file mode 100644 index 0000000..c4b30fd --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/docs @@ -0,0 +1 @@ +README diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/rules b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/rules new file mode 100755 index 0000000..e9207a3 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/rules @@ -0,0 +1,69 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +ifndef PERL +PERL = /usr/bin/perl +endif + +TMP =$(CURDIR)/debian/libdevel-symdump-perl +config =INSTALLDIRS=vendor + +ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) +CFLAGS := -O2 -g -Wall +else +CFLAGS := -g -Wall +endif + +build: build-stamp +build-stamp: + dh_testdir + $(PERL) Makefile.PL $(config) + $(MAKE) OPTIMIZE="$(CFLAGS)" + touch $@ + +clean: + dh_testdir + dh_testroot + [ ! -f Makefile ] || $(MAKE) distclean + rm -f Makefile.old + dh_clean build-stamp install-stamp + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + $(MAKE) install PREFIX=$(TMP)/usr + [ ! -d $(TMP)/usr/lib/perl5 ] || rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/lib/perl5 + + touch $@ + +# Build architecture-independent files here. +binary-indep: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installchangelogs ChangeLog + dh_strip + dh_compress + dh_fixperms + dh_perl + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture-dependent files here. +binary-arch: build install +# We have nothing to do by default. + +binary: binary-indep binary-arch +.PHONY: build clean install binary-indep binary-arch binary diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/substvars b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/substvars new file mode 100644 index 0000000..88085b2 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/substvars @@ -0,0 +1 @@ +perl:Depends=perl (>= 5.6.0-16) diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/watch b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/watch new file mode 100644 index 0000000..207b33d --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Devel-Symdump/ .*/Devel-Symdump-v?(\d[\d_.]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip) debian uupdate diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump.pm b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump.pm new file mode 100644 index 0000000..01a8e78 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump.pm @@ -0,0 +1,468 @@ +package Devel::Symdump; + +use 5.003; +use Carp (); +use strict; +use vars qw($Defaults $VERSION *ENTRY $MAX_RECURSION); + +$VERSION = '2.08'; +$MAX_RECURSION = 97; + +$Defaults = { + 'RECURS' => 0, + 'AUTOLOAD' => { + 'packages' => 1, + 'scalars' => 1, + 'arrays' => 1, + 'hashes' => 1, + 'functions' => 1, + 'ios' => 1, + 'unknowns' => 1, + }, + 'SEEN' => {}, + }; + +sub rnew { + my($class,@packages) = @_; + no strict "refs"; + my $self = bless {%${"$class\::Defaults"}}, $class; + $self->{RECURS}++; + $self->_doit(@packages); +} + +sub new { + my($class,@packages) = @_; + no strict "refs"; + my $self = bless {%${"$class\::Defaults"}}, $class; + $self->_doit(@packages); +} + +sub _doit { + my($self,@packages) = @_; + @packages = ("main") unless @packages; + $self->{RESULT} = $self->_symdump(@packages); + return $self; +} + +sub _symdump { + my($self,@packages) = @_ ; + my($key,$val,$num,$pack,@todo,$tmp); + my $result = {}; + foreach $pack (@packages){ + no strict; + while (($key,$val) = each(%{*{"$pack\::"}})) { + my $gotone = 0; + local(*ENTRY) = $val; + #### SCALAR #### + if (defined $val && defined *ENTRY{SCALAR}) { + $result->{$pack}{SCALARS}{$key}++; + $gotone++; + } + #### ARRAY #### + if (defined $val && defined *ENTRY{ARRAY}) { + $result->{$pack}{ARRAYS}{$key}++; + $gotone++; + } + #### HASH #### + if (defined $val && defined *ENTRY{HASH} && $key !~ /::/) { + $result->{$pack}{HASHES}{$key}++; + $gotone++; + } + #### PACKAGE #### + if (defined $val && defined *ENTRY{HASH} && $key =~ /::$/ && + $key ne "main::" && $key ne "::") { + my($p) = $pack ne "main" ? "$pack\::" : ""; + ($p .= $key) =~ s/::$//; + $result->{$pack}{PACKAGES}{$p}++; + $gotone++; + if (++$self->{SEEN}{*$val} > $Devel::Symdump::MAX_RECURSION){ + next; + } + push @todo, $p; + } + #### FUNCTION #### + if (defined $val && defined *ENTRY{CODE}) { + $result->{$pack}{FUNCTIONS}{$key}++; + $gotone++; + } + + #### IO #### had to change after 5.003_10 + if ($] > 5.003_10){ + if (defined $val && defined *ENTRY{IO}){ # fileno and telldir... + $result->{$pack}{IOS}{$key}++; + $gotone++; + } + } else { + #### FILEHANDLE #### + if (defined fileno(ENTRY)){ + $result->{$pack}{IOS}{$key}++; + $gotone++; + } elsif (defined telldir(ENTRY)){ + #### DIRHANDLE #### + $result->{$pack}{IOS}{$key}++; + $gotone++; + } + } + + #### SOMETHING ELSE #### + unless ($gotone) { + $result->{$pack}{UNKNOWNS}{$key}++; + } + } + } + + return (@todo && $self->{RECURS}) + ? { %$result, %{$self->_symdump(@todo)} } + : $result; +} + +sub _partdump { + my($self,$part)=@_; + my ($pack, @result); + my $prepend = ""; + foreach $pack (keys %{$self->{RESULT}}){ + $prepend = "$pack\::" unless $part eq 'PACKAGES'; + push @result, map {"$prepend$_"} keys %{$self->{RESULT}{$pack}{$part} || {}}; + } + return @result; +} + +# this is needed so we don't try to AUTOLOAD the DESTROY method +sub DESTROY {} + +sub as_string { + my $self = shift; + my($type,@m); + for $type (sort keys %{$self->{'AUTOLOAD'}}) { + push @m, $type; + push @m, "\t" . join "\n\t", map { + s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64) /eg; + $_; + } sort $self->_partdump(uc $type); + } + return join "\n", @m; +} + +sub as_HTML { + my $self = shift; + my($type,@m); + push @m, ""; + for $type (sort keys %{$self->{'AUTOLOAD'}}) { + push @m, ""; + push @m, ""; + } + push @m, "
    $type" . join ", ", map { + s/([\000-\037\177])/ '^' . + pack('c', ord($1) ^ 64) + /eg; $_; + } sort $self->_partdump(uc $type); + push @m, "
    "; + return join "\n", @m; +} + +sub diff { + my($self,$second) = @_; + my($type,@m); + for $type (sort keys %{$self->{'AUTOLOAD'}}) { + my(%first,%second,%all,$symbol); + foreach $symbol ($self->_partdump(uc $type)){ + $first{$symbol}++; + $all{$symbol}++; + } + foreach $symbol ($second->_partdump(uc $type)){ + $second{$symbol}++; + $all{$symbol}++; + } + my(@typediff); + foreach $symbol (sort keys %all){ + next if $first{$symbol} && $second{$symbol}; + push @typediff, "- $symbol" unless $second{$symbol}; + push @typediff, "+ $symbol" unless $first{$symbol}; + } + foreach (@typediff) { + s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64) /eg; + } + push @m, $type, @typediff if @typediff; + } + return join "\n", @m; +} + +sub inh_tree { + my($self) = @_; + return $self->{INHTREE} if ref $self && defined $self->{INHTREE}; + my($inherited_by) = {}; + my($m)=""; + my(@isa) = grep /\bISA$/, Devel::Symdump->rnew->arrays; + my $isa; + foreach $isa (sort @isa) { + $isa =~ s/::ISA$//; + my($isaisa); + no strict 'refs'; + foreach $isaisa (@{"$isa\::ISA"}){ + $inherited_by->{$isaisa}{$isa}++; + } + } + my $item; + foreach $item (sort keys %$inherited_by) { + $m .= "$item\n"; + $m .= _inh_tree($item,$inherited_by); + } + $self->{INHTREE} = $m if ref $self; + $m; +} + +sub _inh_tree { + my($package,$href,$depth) = @_; + return unless defined $href; + $depth ||= 0; + $depth++; + if ($depth > 100){ + warn "Deep recursion in ISA\n"; + return; + } + my($m) = ""; + # print "DEBUG: package[$package]depth[$depth]\n"; + my $i; + foreach $i (sort keys %{$href->{$package}}) { + $m .= qq{\t} x $depth; + $m .= qq{$i\n}; + $m .= _inh_tree($i,$href,$depth); + } + $m; +} + +sub isa_tree{ + my($self) = @_; + return $self->{ISATREE} if ref $self && defined $self->{ISATREE}; + my(@isa) = grep /\bISA$/, Devel::Symdump->rnew->arrays; + my($m) = ""; + my($isa); + foreach $isa (sort @isa) { + $isa =~ s/::ISA$//; + $m .= qq{$isa\n}; + $m .= _isa_tree($isa) + } + $self->{ISATREE} = $m if ref $self; + $m; +} + +sub _isa_tree{ + my($package,$depth) = @_; + $depth ||= 0; + $depth++; + if ($depth > 100){ + warn "Deep recursion in ISA\n"; + return; + } + my($m) = ""; + # print "DEBUG: package[$package]depth[$depth]\n"; + my $isaisa; + no strict 'refs'; + foreach $isaisa (@{"$package\::ISA"}) { + $m .= qq{\t} x $depth; + $m .= qq{$isaisa\n}; + $m .= _isa_tree($isaisa,$depth); + } + $m; +} + +AUTOLOAD { + my($self,@packages) = @_; + unless (ref $self) { + $self = $self->new(@packages); + } + no strict "vars"; + (my $auto = $AUTOLOAD) =~ s/.*:://; + + $auto =~ s/(file|dir)handles/ios/; + my $compat = $1; + + unless ($self->{'AUTOLOAD'}{$auto}) { + Carp::croak("invalid Devel::Symdump method: $auto()"); + } + + my @syms = $self->_partdump(uc $auto); + if (defined $compat) { + no strict 'refs'; + local $^W; # bleadperl@26631 introduced an io warning here + if ($compat eq "file") { + @syms = grep { defined(fileno($_)) } @syms; + } else { + @syms = grep { defined(telldir($_)) } @syms; + } + } + return @syms; # make sure now it gets context right +} + +1; + +__END__ + +=head1 NAME + +Devel::Symdump - dump symbol names or the symbol table + +=head1 SYNOPSIS + + # Constructor + require Devel::Symdump; + @packs = qw(some_package another_package); + $obj = Devel::Symdump->new(@packs); # no recursion + $obj = Devel::Symdump->rnew(@packs); # with recursion + + # Methods + @array = $obj->packages; + @array = $obj->scalars; + @array = $obj->arrays; + @array = $obj->hashes; + @array = $obj->functions; + @array = $obj->filehandles; # deprecated, use ios instead + @array = $obj->dirhandles; # deprecated, use ios instead + @array = $obj->ios; + @array = $obj->unknowns; # only perl version < 5.003 had some + + $string = $obj->as_string; + $string = $obj->as_HTML; + $string = $obj1->diff($obj2); + + $string = Devel::Symdump->isa_tree; # or $obj->isa_tree + $string = Devel::Symdump->inh_tree; # or $obj->inh_tree + + # Methods with autogenerated objects + # all of those call new(@packs) internally + @array = Devel::Symdump->packages(@packs); + @array = Devel::Symdump->scalars(@packs); + @array = Devel::Symdump->arrays(@packs); + @array = Devel::Symdump->hashes(@packs); + @array = Devel::Symdump->functions(@packs); + @array = Devel::Symdump->ios(@packs); + @array = Devel::Symdump->unknowns(@packs); + +=head1 DESCRIPTION + +This little package serves to access the symbol table of perl. + +=over 4 + +=item Crnew(@packages)> + +returns a symbol table object for all subtrees below @packages. +Nested Modules are analyzed recursively. If no package is given as +argument, it defaults to C
    . That means to get the whole symbol +table, just do a C without arguments. + +The global variable $Devel::Symdump::MAX_RECURSION limits the +recursion to prevent contention. The default value is set to 97, just +low enough to survive the test suite without a warning about deep +recursion. + +=item Cnew(@packages)> + +does not go into recursion and only analyzes the packages that are +given as arguments. + +=item packages, scalars, arrays, hashes, functions, ios + +The methods packages(), scalars(), arrays(), hashes(), functions(), +ios(), and (for older perls) unknowns() each return an array of fully +qualified symbols of the specified type in all packages that are held +within a Devel::Symdump object, but without the leading C<$>, C<@> or +C<%>. In a scalar context, they will return the number of such +symbols. Unknown symbols are usually either formats or variables that +haven't yet got a defined value. + +=item as_string + +=item as_HTML + +As_string() and as_HTML() return a simple string/HTML representations +of the object. + +=item diff + +Diff() prints the difference between two Devel::Symdump objects in +human readable form. The format is similar to the one used by the +as_string method. + +=item isa_tree + +=item inh_tree + +Isa_tree() and inh_tree() both return a simple string representation +of the current inheritance tree. The difference between the two +methods is the direction from which the tree is viewed: top-down or +bottom-up. As I'm sure, many users will have different expectation +about what is top and what is bottom, I'll provide an example what +happens when the Socket module is loaded: + +=item % print Devel::Symdump-Einh_tree + + AutoLoader + DynaLoader + Socket + DynaLoader + Socket + Exporter + Carp + Config + Socket + +The inh_tree method shows on the left hand side a package name and +indented to the right the packages that use the former. + +=item % print Devel::Symdump-Eisa_tree + + Carp + Exporter + Config + Exporter + DynaLoader + AutoLoader + Socket + Exporter + DynaLoader + AutoLoader + +The isa_tree method displays from left to right ISA relationships, so +Socket IS A DynaLoader and DynaLoader IS A AutoLoader. (Actually, they +were at the time this manpage was written) + +=back + +You may call both methods, isa_tree() and inh_tree(), with an +object. If you do that, the object will store the output and retrieve +it when you call the same method again later. The typical usage would +be to use them as class methods directly though. + +=head1 SUBCLASSING + +The design of this package is intentionally primitive and allows it to +be subclassed easily. An example of a (maybe) useful subclass is +Devel::Symdump::Export, a package which exports all methods of the +Devel::Symdump package and turns them into functions. + +=head1 AUTHORS + +Andreas Koenig F<< >> and Tom Christiansen +F<< >>. Based on the old F by Larry +Wall. + +=head1 COPYRIGHT, LICENSE + +This module is + +Copyright (c) 1995, 1997, 2000, 2002, 2005, 2006 Andreas Koenig C<< >>. + +All rights reserved. + +This library is free software; +you may use, redistribute and/or modify it under the same +terms as Perl itself. + +=cut + + +# Local Variables: +# mode: cperl +# cperl-indent-level: 4 +# End: diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump/Export.pm b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump/Export.pm new file mode 100644 index 0000000..2401e5f --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/lib/Devel/Symdump/Export.pm @@ -0,0 +1,39 @@ +package Devel::Symdump::Export; +require Devel::Symdump; +require Exporter; +use Carp; +use strict; +use vars qw(@ISA @EXPORT_OK $AUTOLOAD); +@ISA=('Exporter'); + +@EXPORT_OK=( + 'packages' , + 'scalars' , + 'arrays' , + 'hashes' , + 'functions' , + 'filehandles' , + 'dirhandles' , + 'ios' , + 'unknowns' , +); +my %OK; +@OK{@EXPORT_OK}=(1) x @EXPORT_OK; + +push @EXPORT_OK, "symdump"; + +# undocumented feature symdump() -- does it save enough typing? +sub symdump { + my @packages = @_; + Devel::Symdump->new(@packages)->as_string; +} + +AUTOLOAD { + my @packages = @_; + (my $auto = $AUTOLOAD) =~ s/.*:://; + confess("Unknown function call $auto") unless $OK{$auto}; + my @ret = Devel::Symdump->new->$auto(@packages); + return @ret; +} + +1; diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/autogen.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/autogen.t new file mode 100644 index 0000000..3512f57 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/autogen.t @@ -0,0 +1,23 @@ +#!/usr/bin/perl -w + +BEGIN { unshift @INC, '.' ;} + +require Devel::Symdump; + +print "1..8\n"; + +@p = qw( +scalars arrays hashes functions +unknowns filehandles dirhandles packages); + +$i=0; +for (@p){ + @x1 = Devel::Symdump->new->$_(); + @x2 = Devel::Symdump->$_(); + unless ("@x1" eq "@x2"){ + print "x1 [@x1] x2 [@x2]\n"; + print "not "; + } + print "ok ", ++$i, "\n"; +} + diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/diff.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/diff.t new file mode 100644 index 0000000..63f3b08 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/diff.t @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w + +use lib 'lib' ; + +use Devel::Symdump (); +BEGIN { + $SIG{__WARN__}=sub {return "" if $_[0] =~ /used only once/; print @_;}; +} + +print "1..1\n"; + +$scalar = 1; +@array = 1; +%hash = (A=>B); +%package::hash = (A=>B); +sub package::function {} +open FH, ">/dev/null"; +opendir DH, "."; + +my $a = Devel::Symdump->rnew; + +my($eval) = <<'END'; +$scalar2 = 1; +undef @array; +undef %hash; +%hash2 = (A=>B); +$package2::scalar3 = 3; +close FH; +closedir DH; +END + +eval $eval; + +my $b = Devel::Symdump->rnew; + +# testing diff is too difficult at the stage between 5.003 and 5.004 +# we have new variables and new methods to determine them. Both have +# an impact on diff, so we're backing out this test and always say ok + +if ( 1 || $a->diff($b) eq 'arrays +- main::array +dirhandles +- main::DH +filehandles +- main::FH +hashes +- main::hash ++ main::hash2 +packages ++ package2 +scalars ++ main::scalar2 ++ package2::scalar3 +unknowns ++ main::DH ++ main::FH ++ main::array ++ main::hash' +){ + print "ok 1\n"; +} else { + print "not ok: +a +- +", $a->as_string, " +b +- +", $b->as_string, " +diff +---- +", $a->diff($b), "\n"; +} diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/export.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/export.t new file mode 100644 index 0000000..9ee4971 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/export.t @@ -0,0 +1,16 @@ +print "1..2\n"; + +use Devel::Symdump::Export "symdump"; +$x = symdump(); +if (length($x) > 500){ + print "ok 1\n"; +} else { + print "not ok 1\n", length($x), ":\n$x\n"; +} + +if ($x =~ /arrays.*functions.*hashes.*ios.*packages.*scalars.*unknowns/xs){ + print "ok 2\n"; +} else { + print "not ok 2 $x\n"; +} + diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/pod.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/pod.t new file mode 100644 index 0000000..105953b --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/pod.t @@ -0,0 +1,6 @@ +# -*- mode: cperl -*- + +use Test::More; +eval "use Test::Pod 1.00"; +plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; +all_pod_files_ok(); diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/podcover.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/podcover.t new file mode 100644 index 0000000..0b81665 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/podcover.t @@ -0,0 +1,5 @@ +use Test::More; +eval "use Test::Pod::Coverage"; +plan skip_all => "Test::Pod::Coverage required for testing pod coverage" if $@; +plan tests => 1; +pod_coverage_ok( "Devel::Symdump" ); diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/recur.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/recur.t new file mode 100644 index 0000000..1e1baf3 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/recur.t @@ -0,0 +1,32 @@ +BEGIN { + $|++; + if ($] <= 5.006) { + print "1..0 # Skip: this test is known to fail with 5.005xx\n"; + # (2007-06-25 akoenig: I have seen it working in the debugger) + eval "require POSIX; 1" and POSIX::_exit(0); + } +} +package Acme::Meta; + +BEGIN { + $::Meta::VERSION = $VERSION = 0; # autovivify for perl >= @26370 + $Meta::{'Meta::'} = $main::{'Meta::'}; + $Acme::Meta::{'Meta::'} = $main::{'Meta::'}; +} +use strict; +require Test::More; +my $tests = 3; +Test::More->import( tests => $tests ); +exit unless $tests; +Test::More::ok(1); +$Acme::Meta::Meta::Pie = "good"; +Test::More::is ($Acme::Meta::Meta::Meta::Meta::Pie, "good"); +Test::More::use_ok('Devel::Symdump'); +Devel::Symdump->rnew("Acme"); + +__END__ + +# Local Variables: +# mode: cperl +# cperl-indent-level: 2 +# End: diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/symdump.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/symdump.t new file mode 100644 index 0000000..465c930 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/symdump.t @@ -0,0 +1,221 @@ +#!/usr/bin/perl -w + +BEGIN { unshift @INC, '.' ; + $SIG{__WARN__}=sub {return "" if $_[0] =~ /used only once/; print @_;}; +} + +use Devel::Symdump::Export qw(filehandles hashes arrays); +use Test::More; + +plan tests => 13; + +init(); + +my %prefices = qw( + scalars $ + arrays @ + hashes % + functions & + unknowns * + ); + +@prefices{qw(filehandles dirhandles packages)}=("") x 3; + + +format i_am_the_symbol_printing_format_lest_there_be_any_doubt = +Got these @* + "$t:" +~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $a + +. + +$~ = 'i_am_the_symbol_printing_format_lest_there_be_any_doubt'; + +@a = packsort(filehandles('main')); +$t = 'filehandles'; +$a = "@a"; +# write; +ok ( + $a eq "main::DATA main::Hmmmm main::STDERR main::STDIN main::STDOUT main::stderr main::stdin main::stdout" + || + $a eq "main::ARGV main::DATA main::Hmmmm main::STDERR main::STDIN main::STDOUT main::i_am_the_symbol_printing_format_lest_there_be_any_doubt main::stderr main::stdin main::stdout", + $a + ); + +@a = packsort(hashes 'main'); +$t = 'hashes'; +$a = uncontrol("@a"); +$a =~ s/main:://g; +#write; +ok ( + $a eq "^H + - @ ENV INC SIG" # + named capture 29682 + || + $a eq "^H + @ ENV INC SIG" # + named capture 28957 + || + $a eq "^H @ ENV INC SIG" # ^H hints 27643 (?) + || + $a eq "@ ENV INC SIG" + || + $a eq "ENV INC SIG", + $a + ); + +@a = packsort(arrays()); +$t = 'arrays'; +$a = "@a"; +#write; +like ( + $a, "/main::INC.*main::_.*main::a/" + ); + +eval { + @a = Devel::Symdump->really_bogus('main'); +}; +$a = $@ ? $@ : "@a"; +like ($a, + "/^invalid Devel::Symdump method: really_bogus\(\)/", + ); + +$sob = rnew Devel::Symdump; + +@m=(); +for (active_packages($sob)) { + push @m, "$_"; +} +$a="@m"; +like ($a, + "/Carp.*Devel.*Devel::Symdump.*Devel::Symdump::Export.*DynaLoader.*Exporter.*Hidden.*big::long::hairy.*funny::little.*strict/"); + +my %m=(); +for (active_modules($sob)) { + $m{$_}=undef; +} +$a = join " ", keys %m; +#print "[$a]\n"; +ok (exists $m{"Carp"} && + exists $m{"Devel::Symdump"} && + exists $m{"Devel::Symdump::Export"} && + exists $m{"Exporter"} && + exists $m{"strict"} && + exists $m{"vars"}); + +# Cannot test on the number of packages and functions because not +# every perl is built the same way. Static perls will reveal more +# packages and more functions being in them +# Testing on >= seems no problem to me, we'll see + +# (Time passes) Much less unknowns in version 1.22 (perl5.003_10). + +my %Expect=qw( +packages 13 scalars 28 arrays 7 hashes 5 functions 35 filehandles 9 +dirhandles 2 unknowns 53 +); + +#we don't count the unknowns. Newer perls might have different outcomes +for $type ( qw{ + packages + scalars arrays hashes + functions filehandles dirhandles + }){ + next unless @syms = $sob->$type(); + + if ($I_REALLY_WANT_A_CORE_DUMP) { + # if this block execute , mysteriously COREDUMPS at for() below + # NOT TRUE anymore (watched by Andreas, 15.6.1995) + @vars = ($type eq 'packages') ? sort(@syms) : packsort(@syms); + } else { + if ($type eq 'packages') { + @syms = sort @syms; + } else { + @syms = packsort(@syms); + } + } + + ok (@syms >= $Expect{$type}); +} + +exit; + +sub active_modules { + my $ob = shift; + my @modules = (); + my($pack); + for $pack ("main", $ob->packages) { + if ( + defined &{ "$pack\::import" } || + defined &{ "$pack\::AUTOLOAD" } || + defined @{ "$pack\::ISA" } || + defined @{ "$pack\::EXPORT" } || + defined @{ "$pack\::EXPORT_OK"} + ) + { + push @modules, $pack; + } + } + return sort @modules; +} + +sub active_packages { + my $ob = shift; + + my @modules = (); + my $pack; + for $pack ($ob->packages) { + $pob = new Devel::Symdump $pack; + if ( $pob->scalars() || + $pob->hashes() || + $pob->arrays() || + $pob->functions() || + $pob->filehandles()|| + $pob->dirhandles() + ) + { + push @modules, $pack; + } + } + return sort @modules; +} + + +sub uncontrol { + local $_ = $_[0]; + s/([\200-\377])/ 'M-' . pack('c', ord($1) & 0177 ) /eg; + s/([\000-\037\177])/ '^' . pack('c', ord($1) ^ 64 ) /eg; + return $_; +} + +sub packsort { + my (@vars, @pax, @fullnames); + + for (@_) { + my($pack, $name) = /^(.*::)(.*)$/s; + push(@vars, $name); + push(@pax, $pack); + push(@fullnames, $_); + } + + return @fullnames [ + sort { + ($pax[$a] ne 'main::') <=> ($pax[$b] ne 'main::') + || + $pax[$a] cmp $pax[$b] + || + $vars[$a] cmp $vars[$b] + } 0 .. $#fullnames + ]; +} + + +sub init { + $big::long::hairy::thing++; + sub Devel::testsub {}; + opendir(DOT, '.'); + opendir(funny::little::imadir, '/'); + $i_am_a_scalar_variable = 1; + open(Hmmmm, ">/dev/null"); + open(Hidden::FH, ">/dev/null"); +} + + +__END__ diff --git a/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/tree.t b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/tree.t new file mode 100644 index 0000000..b97ebc4 --- /dev/null +++ b/dev/i386/libdevel-symdump-perl/libdevel-symdump-perl-2.08/t/tree.t @@ -0,0 +1,28 @@ +#!/usr/bin/perl -w + +# tree.t + +use Devel::Symdump; + +package Coffee; +@ISA = qw(Liquid Black); + +package Liquid; +package Black; + +package Martini; +@ISA = qw(Liquid); + +package Martini::White; +@ISA = qw(Martini); +package Martini::Red; +@ISA = qw(Martini); + +print "1..2\n"; +my @s = split /\n/, Devel::Symdump->isa_tree; +print @s >= 11 ? "ok 1\n" : "not ok [@s]\n"; +@s = split /\n/, Devel::Symdump->inh_tree; +print @s >= 9 ? "ok 2\n" : "not ok [@s]\n"; + +# The tests are testing with the > operator, because we never know where +# Exporter and Carp (and others) are developing into. diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Changes b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Changes new file mode 100644 index 0000000..ddccb31 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Changes @@ -0,0 +1,10 @@ +Revision history for Email-Date-Format + +1.002 2007-12-03 + brings all docs into agreement: this produces 2822, not 822, dates + +1.001 2007-12-01 + be isa Exporter, since "use Exporter 'import'" wasn't in 5.006 + +1.000 2007-11-30 + refactored from Email::Date to avoid large prereq chain diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/LICENSE b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/LICENSE new file mode 100644 index 0000000..05e86e0 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/LICENSE @@ -0,0 +1,378 @@ + +Terms of Perl itself + +a) the GNU General Public License as published by the Free + Software Foundation; either version 1, or (at your option) any + later version, or +b) the "Artistic License" + +---------------------------------------------------------------------------- + +The General Public License (GPL) +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, +Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute +verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most of +the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for this service if you wish), that +you receive source code or can get it if you want it, that you can change the +software or use pieces of it in new free programs; and that you know you can do +these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show +them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced by +others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually obtain +patent licenses, in effect making the program proprietary. To prevent this, we +have made it clear that any patent must be licensed for everyone's free use or +not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or translated +into another language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and appropriately +publish on each copy an appropriate copyright notice and disclaimer of warranty; +keep intact all the notices that refer to this License and to the absence of any +warranty; and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at +your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you also +meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you +changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in +part contains or is derived from the Program or any part thereof, to be licensed +as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you +must cause it, when started running for such interactive use in the most ordinary +way, to print or display an announcement including an appropriate copyright +notice and a notice that there is no warranty (or else, saying that you provide a +warranty) and that users may redistribute the program under these conditions, +and telling the user how to view a copy of this License. (Exception: if the +Program itself is interactive but does not normally print such an announcement, +your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Program, the distribution of the whole must be on +the terms of this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to +work written entirely by you; rather, the intent is to exercise the right to control +the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source +code, which must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any +third party, for a charge no more than your cost of physically performing source +distribution, a complete machine-readable copy of the corresponding source +code, to be distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute +corresponding source code. (This alternative is allowed only for noncommercial +distribution and only if you received the program in object code or executable +form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all the +source code for all modules it contains, plus any associated interface definition +files, plus the scripts used to control compilation and installation of the +executable. However, as a special exception, the source code distributed need +not include anything that is normally distributed (in either source or binary form) +with the major components (compiler, kernel, and so on) of the operating system +on which the executable runs, unless that component itself accompanies the +executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so long +as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not accept +this License. Therefore, by modifying or distributing the Program (or any work +based on the Program), you indicate your acceptance of this License to do so, +and all its terms and conditions for copying, distributing or modifying the +Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to copy, +distribute or modify the Program subject to these terms and conditions. You +may not impose any further restrictions on the recipients' exercise of the rights +granted herein. You are not responsible for enforcing compliance by third parties +to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement +or for any other reason (not limited to patent issues), conditions are imposed on +you (whether by court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the conditions of this +License. If you cannot distribute so as to satisfy simultaneously your obligations +under this License and any other pertinent obligations, then as a consequence +you may not distribute the Program at all. For example, if a patent license would +not permit royalty-free redistribution of the Program by all those who receive +copies directly or indirectly through you, then the only way you could satisfy +both it and this License would be to refrain entirely from distribution of the +Program. + +If any portion of this section is held invalid or unenforceable under any particular +circumstance, the balance of the section is intended to apply and the section as +a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other +property right claims or to contest validity of any such claims; this section has +the sole purpose of protecting the integrity of the free software distribution +system, which is implemented by public license practices. Many people have +made generous contributions to the wide range of software distributed through +that system in reliance on consistent application of that system; it is up to the +author/donor to decide if he or she is willing to distribute software through any +other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries +either by patents or by copyrighted interfaces, the original copyright holder who +places the Program under this License may add an explicit geographical +distribution limitation excluding those countries, so that distribution is permitted +only in or among countries not thus excluded. In such case, this License +incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems or +concerns. + +Each version is given a distinguishing version number. If the Program specifies a +version number of this License which applies to it and "any later version", you +have the option of following the terms and conditions either of that version or of +any later version published by the Free Software Foundation. If the Program does +not specify a version number of this License, you may choose any version ever +published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of all +derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS +NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE +COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR +IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE +ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED +TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY +WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM +(INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY +OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + +---------------------------------------------------------------------------- + +The Artistic License + +Preamble + +The intent of this document is to state the conditions under which a Package +may be copied, such that the Copyright Holder maintains some semblance of +artistic control over the development of the package, while giving the users of the +package the right to use and distribute the Package in a more-or-less customary +fashion, plus the right to make reasonable modifications. + +Definitions: + +- "Package" refers to the collection of files distributed by the Copyright + Holder, and derivatives of that collection of files created through textual + modification. +- "Standard Version" refers to such a Package if it has not been modified, + or has been modified in accordance with the wishes of the Copyright + Holder. +- "Copyright Holder" is whoever is named in the copyright or copyrights for + the package. +- "You" is you, if you're thinking about copying or distributing this Package. +- "Reasonable copying fee" is whatever you can justify on the basis of + media cost, duplication charges, time of people involved, and so on. (You + will not be required to justify it to the Copyright Holder, but only to the + computing community at large as a market that must bear the fee.) +- "Freely Available" means that no fee is charged for the item itself, though + there may be fees involved in handling the item. It also means that + recipients of the item may redistribute it under the same conditions they + received it. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you duplicate +all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from +the Public Domain or from the Copyright Holder. A Package modified in such a +way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and when +you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise + make them Freely Available, such as by posting said modifications + to Usenet or an equivalent medium, or placing the modifications on + a major archive site such as ftp.uu.net, or by allowing the + Copyright Holder to include your modifications in the Standard + Version of the Package. + + b) use the modified Package only within your corporation or + organization. + + c) rename any non-standard executables so the names do not + conflict with standard executables, which must also be provided, + and provide a separate manual page for each non-standard + executable that clearly documents how it differs from the Standard + Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable +form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library + files, together with instructions (in the manual page or equivalent) + on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) accompany any non-standard executables with their + corresponding Standard Version executables, giving the + non-standard executables non-standard names, and clearly + documenting the differences in manual pages (or equivalent), + together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. +You may charge any fee you choose for support of this Package. You may not +charge a fee for this Package itself. However, you may distribute this Package in +aggregate with other (possibly commercial) programs as part of a larger +(possibly commercial) software distribution provided that you do not advertise +this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from +the programs of this Package do not automatically fall under the copyright of this +Package, but belong to whomever generated them, and may be sold +commercially, and may be aggregated with this Package. + +7. C or perl subroutines supplied by you and linked into this Package shall not +be considered part of this Package. + +8. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR +PURPOSE. + +The End + + diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/MANIFEST b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/MANIFEST new file mode 100644 index 0000000..fe9d189 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/MANIFEST @@ -0,0 +1,10 @@ +Changes +lib/Email/Date/Format.pm +Makefile.PL +MANIFEST This list of files +README +t/pod-coverage.t +t/pod.t +t/basic.t +LICENSE +META.yml Module meta-data (added by MakeMaker) diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/META.yml b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/META.yml new file mode 100644 index 0000000..0de6096 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/META.yml @@ -0,0 +1,15 @@ +--- #YAML:1.0 +name: Email-Date-Format +version: 1.002 +abstract: produce RFC 8822 date strings +license: perl +generated_by: ExtUtils::MakeMaker version 6.36_01 +distribution_type: module +requires: + Test::More: 0.47 + Time::Local: 0.000 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 +author: + - Ricardo SIGNES diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Makefile.PL b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Makefile.PL new file mode 100644 index 0000000..18928ec --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/Makefile.PL @@ -0,0 +1,14 @@ +use strict; +use ExtUtils::MakeMaker; + +WriteMakefile ( + AUTHOR => 'Ricardo SIGNES ', + ABSTRACT => "produce RFC 8822 date strings", + NAME => 'Email::Date::Format', + (eval { ExtUtils::MakeMaker->VERSION(6.21) } ? (LICENSE => 'perl') : ()), + PREREQ_PM => { + 'Test::More' => '0.47', # core + 'Time::Local' => '0.000', # core + }, + VERSION_FROM => 'lib/Email/Date/Format.pm', +); diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/README b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/README new file mode 100644 index 0000000..0e0034d --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/README @@ -0,0 +1,3 @@ + +This module can be used to emit RFC 2822 style date strings. + diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/changelog b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/changelog new file mode 100644 index 0000000..78cee78 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/changelog @@ -0,0 +1,5 @@ +libemail-date-format-perl (1.002-1) unstable; urgency=low + + * Initial Release. (Closes: #456252) + + -- Gunnar Wolf Thu, 13 Dec 2007 17:24:20 -0600 diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/compat b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/control b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/control new file mode 100644 index 0000000..fd3d2d1 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/control @@ -0,0 +1,19 @@ +Source: libemail-date-format-perl +Section: perl +Priority: optional +Build-Depends: debhelper (>= 5.0.0) +Build-Depends-Indep: perl (>= 5.8.8-12) +Maintainer: Debian Perl Group +Uploaders: Gunnar Wolf +Standards-Version: 3.7.3 +Homepage: http://search.cpan.org/dist/Email-Date-Format/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libemail-date-format-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libemail-date-format-perl/ + +Package: libemail-date-format-perl +Architecture: all +Depends: ${perl:Depends}, ${misc:Depends}, +Description: Module to generate RFC-2822-valid date strings + This module provides a simple means for generating an RFC 2822 compliant + datetime string. It was refactored from Email::Date to avoid large + dependency chains. diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/copyright b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/copyright new file mode 100644 index 0000000..0ca00bc --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/copyright @@ -0,0 +1,17 @@ +This is the debian package for the Email-Date-Format module. +It was created by Gunnar Wolf using dh-make-perl. + +It was downloaded from http://search.cpan.org/dist/Email-Date-Format/ + +The upstream author is: Ricardo SIGNES . + +Copyright (c) 2007, Ricarod SIGNES. This module is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +Perl is distributed under your choice of the GNU General Public License or +the Artistic License. On Debian GNU/Linux systems, the complete text of the +GNU General Public License can be found in `/usr/share/common-licenses/GPL' +and the Artistic Licence in `/usr/share/common-licenses/Artistic'. + +The Debian packaging is (C) 2007, Gunnar Wolf and +is licensed under the same terms as the software itself (see above). diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/rules b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/rules new file mode 100755 index 0000000..768a505 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/rules @@ -0,0 +1,81 @@ +#!/usr/bin/make -f +# This debian/rules file is provided as a template for normal perl +# packages. It was created by Marc Brockschmidt for +# the Debian Perl Group (http://pkg-perl.alioth.debian.org/) but may +# be used freely wherever it is useful. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# If set to a true value then MakeMaker's prompt function will +# always return the default without waiting for user input. +export PERL_MM_USE_DEFAULT=1 + +PACKAGE=$(shell dh_listpackages) + +ifndef PERL +PERL = /usr/bin/perl +endif + +TMP =$(CURDIR)/debian/$(PACKAGE) + +build: build-stamp +build-stamp: + dh_testdir + + # As this is a architecture independent package, we are not + # supposed to install stuff to /usr/lib. MakeMaker creates + # the dirs, we prevent this by setting the INSTALLVENDORARCH + # and VENDORARCHEXP environment variables. + + # Add commands to compile the package here + $(PERL) Makefile.PL INSTALLDIRS=vendor \ + INSTALLVENDORARCH=/usr/share/perl5/ \ + VENDORARCHEXP=/usr/share/perl5/ + $(MAKE) + $(MAKE) test + + touch $@ + +clean: + dh_testdir + dh_testroot + + dh_clean build-stamp install-stamp + + # Add commands to clean up after the build process here + [ ! -f Makefile ] || $(MAKE) realclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + + # Add commands to install the package into debian/$PACKAGE_NAME here + $(MAKE) install DESTDIR=$(TMP) PREFIX=/usr + + touch $@ + +binary-arch: +# We have nothing to do here for an architecture-independent package + +binary-indep: build install + dh_testdir + dh_testroot + dh_installexamples + dh_installdocs README + dh_installchangelogs Changes + dh_perl + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/watch b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/watch new file mode 100644 index 0000000..6b237e2 --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/debian/watch @@ -0,0 +1,3 @@ +# format version number, currently 3; this line is compulsory! +version=3 +http://search.cpan.org/dist/Email-Date-Format/ .*/Email-Date-Format-([\.\d]+)\.(?:tar\.gz|tar|tgz)$ diff --git a/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/lib/Email/Date/Format.pm b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/lib/Email/Date/Format.pm new file mode 100644 index 0000000..70a889b --- /dev/null +++ b/dev/i386/libemail-date-format-perl/libemail-date-format-perl-1.002/lib/Email/Date/Format.pm @@ -0,0 +1,128 @@ +use 5.006; +use strict; +use warnings; + +package Email::Date::Format; + +our $VERSION = '1.002'; +our @EXPORT_OK = qw[email_date email_gmdate]; + +use Exporter; +BEGIN { our @ISA = 'Exporter' } +use Time::Local (); + +=head1 NAME + +Email::Date::Format - produce RFC 2822 date strings + +=head1 SYNOPSIS + + use Email::Date::Format qw(email_date); + + my $header = email_date($date->epoch); + + Email::Simple->create( + header => [ + Date => $header, + ], + body => '...', + ); + +=head1 DESCRIPTION + +This module provides a simple means for generating an RFC 2822 compliant +datetime string. (In case you care, they're not RFC 822 dates, because they +use a four digit year, which is not allowed in RFC 822.) + +=head2 FUNCTIONS + +=over 4 + +=item email_date + + my $date = email_date; # now + my $date = email_date( time - 60*60 ); # one hour ago + +C accepts an epoch value, such as the one returned by C + + my @tests = $Test->summary; + +A simple summary of the tests so far. True for pass, false for fail. +This is a logical pass/fail, so todos are passes. + +Of course, test #1 is $tests[0], etc... + +=cut + +sub summary { + my($self) = shift; + + return @Test_Results; +} + +=item B
    I + + my @tests = $Test->details; + +Like summary(), but with a lot more detail. + + $tests[$test_num - 1] = + { ok => is the test considered ok? + actual_ok => did it literally say 'ok'? + name => name of the test (if any) + type => 'skip' or 'todo' (if any) + reason => reason for the above (if any) + }; + +=item B + + my $todo_reason = $Test->todo; + my $todo_reason = $Test->todo($pack); + +todo() looks for a $TODO variable in your tests. If set, all tests +will be considered 'todo' (see Test::More and Test::Harness for +details). Returns the reason (ie. the value of $TODO) if running as +todo tests, false otherwise. + +todo() is pretty part about finding the right package to look for +$TODO in. It uses the exported_to() package to find it. If that's +not set, it's pretty good at guessing the right package to look at. + +Sometimes there is some confusion about where todo() should be looking +for the $TODO variable. If you want to be sure, tell it explicitly +what $pack to use. + +=cut + +sub todo { + my($self, $pack) = @_; + + $pack = $pack || $self->exported_to || $self->caller(1); + + no strict 'refs'; + return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'} + : 0; +} + +=item B + + my $package = $Test->caller; + my($pack, $file, $line) = $Test->caller; + my($pack, $file, $line) = $Test->caller($height); + +Like the normal caller(), except it reports according to your level(). + +=cut + +sub caller { + my($self, $height) = @_; + $height ||= 0; + + my @caller = CORE::caller($self->level + $height + 1); + return wantarray ? @caller : $caller[0]; +} + +=back + +=cut + +=begin _private + +=over 4 + +=item B<_sanity_check> + + _sanity_check(); + +Runs a bunch of end of test sanity checks to make sure reality came +through ok. If anything is wrong it will die with a fairly friendly +error message. + +=cut + +#'# +sub _sanity_check { + _whoa($Curr_Test < 0, 'Says here you ran a negative number of tests!'); + _whoa(!$Have_Plan and $Curr_Test, + 'Somehow your tests ran without a plan!'); + _whoa($Curr_Test != @Test_Results, + 'Somehow you got a different number of results than tests ran!'); +} + +=item B<_whoa> + + _whoa($check, $description); + +A sanity check, similar to assert(). If the $check is true, something +has gone horribly wrong. It will die with the given $description and +a note to contact the author. + +=cut + +sub _whoa { + my($check, $desc) = @_; + if( $check ) { + die < + + _my_exit($exit_num); + +Perl seems to have some trouble with exiting inside an END block. 5.005_03 +and 5.6.1 both seem to do odd things. Instead, this function edits $? +directly. It should ONLY be called from inside an END block. It +doesn't actually exit, that's your job. + +=cut + +sub _my_exit { + $? = $_[0]; + + return 1; +} + + +=back + +=end _private + +=cut + +$SIG{__DIE__} = sub { + # We don't want to muck with death in an eval, but $^S isn't + # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing + # with it. Instead, we use caller. This also means it runs under + # 5.004! + my $in_eval = 0; + for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) { + $in_eval = 1 if $sub =~ /^\(eval\)/; + } + $Test_Died = 1 unless $in_eval; +}; + +sub _ending { + my $self = shift; + + _sanity_check(); + + # Bailout if plan() was never called. This is so + # "require Test::Simple" doesn't puke. + do{ _my_exit(0) && return } if !$Have_Plan; + + # Figure out if we passed or failed and print helpful messages. + if( @Test_Results ) { + # The plan? We have no plan. + if( $No_Plan ) { + $self->_print("1..$Curr_Test\n") unless $self->no_header; + $Expected_Tests = $Curr_Test; + } + + my $num_failed = grep !$_, @Test_Results[0..$Expected_Tests-1]; + $num_failed += abs($Expected_Tests - @Test_Results); + + if( $Curr_Test < $Expected_Tests ) { + $self->diag(<<"FAIL"); +# Looks like you planned $Expected_Tests tests but only ran $Curr_Test. +FAIL + } + elsif( $Curr_Test > $Expected_Tests ) { + my $num_extra = $Curr_Test - $Expected_Tests; + $self->diag(<<"FAIL"); +# Looks like you planned $Expected_Tests tests but ran $num_extra extra. +FAIL + } + elsif ( $num_failed ) { + $self->diag(<<"FAIL"); +# Looks like you failed $num_failed tests of $Expected_Tests. +FAIL + } + + if( $Test_Died ) { + $self->diag(<<"FAIL"); +# Looks like your test died just after $Curr_Test. +FAIL + + _my_exit( 255 ) && return; + } + + _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return; + } + elsif ( $Skip_All ) { + _my_exit( 0 ) && return; + } + else { + $self->diag("# No tests run!\n"); + _my_exit( 255 ) && return; + } +} + +END { + $Test->_ending if defined $Test and !$Test->no_ending; +} + +=head1 EXAMPLES + +At this point, Test::Simple and Test::More are your best examples. + +=head1 SEE ALSO + +Test::Simple, Test::More, Test::Harness + +=head1 AUTHORS + +Original code by chromatic, maintained by Michael G Schwern +Eschwern@pobox.comE + +=head1 COPYRIGHT + +Copyright 2001 by chromatic Echromatic@wgz.orgE, + Michael G Schwern Eschwern@pobox.comE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See L + +=cut + +1; diff --git a/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/More.pm b/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/More.pm new file mode 100644 index 0000000..617455f --- /dev/null +++ b/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/More.pm @@ -0,0 +1,1023 @@ +package Test::More; + +use 5.004; + +use strict; +use Test::Builder; + + +# Can't use Carp because it might cause use_ok() to accidentally succeed +# even though the module being used forgot to use Carp. Yes, this +# actually happened. +sub _carp { + my($file, $line) = (caller(1))[1,2]; + warn @_, sprintf " at $file line $line\n"; +} + + + +require Exporter; +use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO); +$VERSION = '0.33'; +@ISA = qw(Exporter); +@EXPORT = qw(ok use_ok require_ok + is isnt like is_deeply + skip todo + pass fail + eq_array eq_hash eq_set + $TODO + plan + can_ok isa_ok + ); + +my $Test = Test::Builder->new; + + +# 5.004's Exporter doesn't have export_to_level. +sub _export_to_level +{ + my $pkg = shift; + my $level = shift; + (undef) = shift; # XXX redundant arg + my $callpkg = caller($level); + $pkg->export($callpkg, @_); +} + + +=head1 NAME + +Test::More - yet another framework for writing test scripts + +=head1 SYNOPSIS + + use Test::More tests => $Num_Tests; + # or + use Test::More qw(no_plan); + # or + use Test::More skip_all => $reason; + + BEGIN { use_ok( 'Some::Module' ); } + require_ok( 'Some::Module' ); + + # Various ways to say "ok" + ok($this eq $that, $test_name); + + is ($this, $that, $test_name); + isnt($this, $that, $test_name); + like($this, qr/that/, $test_name); + + is_deeply($complex_structure1, $complex_structure2, $test_name); + + SKIP: { + skip $why, $how_many unless $have_some_feature; + + ok( foo(), $test_name ); + is( foo(42), 23, $test_name ); + }; + + TODO: { + local $TODO = $why; + + ok( foo(), $test_name ); + is( foo(42), 23, $test_name ); + }; + + can_ok($module, @methods); + isa_ok($object, $class); + + pass($test_name); + fail($test_name); + + # Utility comparison functions. + eq_array(\@this, \@that); + eq_hash(\%this, \%that); + eq_set(\@this, \@that); + + # UNIMPLEMENTED!!! + my @status = Test::More::status; + + # UNIMPLEMENTED!!! + BAIL_OUT($why); + + +=head1 DESCRIPTION + +If you're just getting started writing tests, have a look at +Test::Simple first. This is a drop in replacement for Test::Simple +which you can switch to once you get the hang of basic testing. + +This module provides a very wide range of testing utilities. Various +ways to say "ok", facilities to skip tests, test future features +and compare complicated data structures. + + +=head2 I love it when a plan comes together + +Before anything else, you need a testing plan. This basically declares +how many tests your script is going to run to protect against premature +failure. + +The preferred way to do this is to declare a plan when you C. + + use Test::More tests => $Num_Tests; + +There are rare cases when you will not know beforehand how many tests +your script is going to run. In this case, you can declare that you +have no plan. (Try to avoid using this as it weakens your test.) + + use Test::More qw(no_plan); + +In some cases, you'll want to completely skip an entire testing script. + + use Test::More skip_all => $skip_reason; + +Your script will declare a skip with the reason why you skipped and +exit immediately with a zero (success). See L for +details. + +If you want to control what functions Test::More will export, you +have to use the 'import' option. For example, to import everything +but 'fail', you'd do: + + use Test::More tests => 23, import => ['!fail']; + +Alternatively, you can use the plan() function. Useful for when you +have to calculate the number of tests. + + use Test::More; + plan tests => keys %Stuff * 3; + +or for deciding between running the tests at all: + + use Test::More; + if( $^O eq 'MacOS' ) { + plan skip_all => 'Test irrelevant on MacOS'; + } + else { + plan tests => 42; + } + +=cut + +sub plan { + my(@plan) = @_; + + my $caller = caller; + + $Test->exported_to($caller); + $Test->plan(@plan); + + my @imports = (); + foreach my $idx (0..$#plan) { + if( $plan[$idx] eq 'import' ) { + @imports = @{$plan[$idx+1]}; + last; + } + } + + __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports); +} + +sub import { + my($class) = shift; + goto &plan; +} + + +=head2 Test names + +By convention, each test is assigned a number in order. This is +largely done automatically for you. However, its often very useful to +assign a name to each test. Which would you rather see: + + ok 4 + not ok 5 + ok 6 + +or + + ok 4 - basic multi-variable + not ok 5 - simple exponential + ok 6 - force == mass * acceleration + +The later gives you some idea of what failed. It also makes it easier +to find the test in your script, simply search for "simple +exponential". + +All test functions take a name argument. Its optional, but highly +suggested that you use it. + + +=head2 I'm ok, you're not ok. + +The basic purpose of this module is to print out either "ok #" or "not +ok #" depending on if a given test succeeded or failed. Everything +else is just gravy. + +All of the following print "ok" or "not ok" depending on if the test +succeeded or failed. They all also return true or false, +respectively. + +=over 4 + +=item B + + ok($this eq $that, $test_name); + +This simply evaluates any expression (C<$this eq $that> is just a +simple example) and uses that to determine if the test succeeded or +failed. A true expression passes, a false one fails. Very simple. + +For example: + + ok( $exp{9} == 81, 'simple exponential' ); + ok( Film->can('db_Main'), 'set_db()' ); + ok( $p->tests == 4, 'saw tests' ); + ok( !grep !defined $_, @items, 'items populated' ); + +(Mnemonic: "This is ok.") + +$test_name is a very short description of the test that will be printed +out. It makes it very easy to find a test in your script when it fails +and gives others an idea of your intentions. $test_name is optional, +but we B strongly encourage its use. + +Should an ok() fail, it will produce some diagnostics: + + not ok 18 - sufficient mucus + # Failed test 18 (foo.t at line 42) + +This is actually Test::Simple's ok() routine. + +=cut + +sub ok ($;$) { + my($test, $name) = @_; + $Test->ok($test, $name); +} + +=item B + +=item B + + is ( $this, $that, $test_name ); + isnt( $this, $that, $test_name ); + +Similar to ok(), is() and isnt() compare their two arguments +with C and C respectively and use the result of that to +determine if the test succeeded or failed. So these: + + # Is the ultimate answer 42? + is( ultimate_answer(), 42, "Meaning of Life" ); + + # $foo isn't empty + isnt( $foo, '', "Got some foo" ); + +are similar to these: + + ok( ultimate_answer() eq 42, "Meaning of Life" ); + ok( $foo ne '', "Got some foo" ); + +(Mnemonic: "This is that." "This isn't that.") + +So why use these? They produce better diagnostics on failure. ok() +cannot know what you are testing for (beyond the name), but is() and +isnt() know what the test was and why it failed. For example this +test: + + my $foo = 'waffle'; my $bar = 'yarblokos'; + is( $foo, $bar, 'Is foo the same as bar?' ); + +Will produce something like this: + + not ok 17 - Is foo the same as bar? + # Failed test 1 (foo.t at line 139) + # got: 'waffle' + # expected: 'yarblokos' + +So you can figure out what went wrong without rerunning the test. + +You are encouraged to use is() and isnt() over ok() where possible, +however do not be tempted to use them to find out if something is +true or false! + + # XXX BAD! $pope->isa('Catholic') eq 1 + is( $pope->isa('Catholic'), 1, 'Is the Pope Catholic?' ); + +This does not check if C<$pope->isa('Catholic')> is true, it checks if +it returns 1. Very different. Similar caveats exist for false and 0. +In these cases, use ok(). + + ok( $pope->isa('Catholic') ), 'Is the Pope Catholic?' ); + +For those grammatical pedants out there, there's an C +function which is an alias of isnt(). + +=cut + +sub is ($$;$) { + $Test->is_eq(@_); +} + +sub isnt ($$;$) { + my($this, $that, $name) = @_; + + my $test; + { + local $^W = 0; # so isnt(undef, undef) works quietly. + $test = $this ne $that; + } + + my $ok = $Test->ok($test, $name); + + unless( $ok ) { + $that = defined $that ? "'$that'" : 'undef'; + + $Test->diag(sprintf < + + like( $this, qr/that/, $test_name ); + +Similar to ok(), like() matches $this against the regex C. + +So this: + + like($this, qr/that/, 'this is like that'); + +is similar to: + + ok( $this =~ /that/, 'this is like that'); + +(Mnemonic "This is like that".) + +The second argument is a regular expression. It may be given as a +regex reference (i.e. C) or (for better compatibility with older +perls) as a string that looks like a regex (alternative delimiters are +currently not supported): + + like( $this, '/that/', 'this is like that' ); + +Regex options may be placed on the end (C<'/that/i'>). + +Its advantages over ok() are similar to that of is() and isnt(). Better +diagnostics on failure. + +=cut + +sub like ($$;$) { + $Test->like(@_); +} + +=item B + + can_ok($module, @methods); + can_ok($object, @methods); + +Checks to make sure the $module or $object can do these @methods +(works with functions, too). + + can_ok('Foo', qw(this that whatever)); + +is almost exactly like saying: + + ok( Foo->can('this') && + Foo->can('that') && + Foo->can('whatever') + ); + +only without all the typing and with a better interface. Handy for +quickly testing an interface. + +=cut + +sub can_ok ($@) { + my($proto, @methods) = @_; + my $class= ref $proto || $proto; + + my @nok = (); + foreach my $method (@methods) { + my $test = "'$class'->can('$method')"; + eval $test || push @nok, $method; + } + + my $name; + $name = @methods == 1 ? "$class->can($methods[0])" + : "$class->can(...)"; + + my $ok = $Test->ok( !@nok, $name ); + + $Test->diag(map "$class->can('$_') failed\n", @nok); + + return $ok; +} + +=item B + + isa_ok($object, $class, $object_name); + +Checks to see if the given $object->isa($class). Also checks to make +sure the object was defined in the first place. Handy for this sort +of thing: + + my $obj = Some::Module->new; + isa_ok( $obj, 'Some::Module' ); + +where you'd otherwise have to write + + my $obj = Some::Module->new; + ok( defined $obj && $obj->isa('Some::Module') ); + +to safeguard against your test script blowing up. + +The diagnostics of this test normally just refer to 'the object'. If +you'd like them to be more specific, you can supply an $object_name +(for example 'Test customer'). + +=cut + +sub isa_ok ($$;$) { + my($object, $class, $obj_name) = @_; + + my $diag; + $obj_name = 'The object' unless defined $obj_name; + my $name = "$obj_name isa $class"; + if( !defined $object ) { + $diag = "$obj_name isn't defined"; + } + elsif( !ref $object ) { + $diag = "$obj_name isn't a reference"; + } + elsif( !$object->isa($class) ) { + $diag = "$obj_name isn't a '$class'"; + } + + my $ok; + if( $diag ) { + $ok = $Test->ok( 0, $name ); + $Test->diag("$diag\n"); + } + else { + $ok = $Test->ok( 1, $name ); + } + + return $ok; +} + + +=item B + +=item B + + pass($test_name); + fail($test_name); + +Sometimes you just want to say that the tests have passed. Usually +the case is you've got some complicated condition that is difficult to +wedge into an ok(). In this case, you can simply use pass() (to +declare the test ok) or fail (for not ok). They are synonyms for +ok(1) and ok(0). + +Use these very, very, very sparingly. + +=cut + +sub pass (;$) { + $Test->ok(1, @_); +} + +sub fail (;$) { + $Test->ok(0, @_); +} + +=back + +=head2 Module tests + +You usually want to test if the module you're testing loads ok, rather +than just vomiting if its load fails. For such purposes we have +C and C. + +=over 4 + +=item B + + BEGIN { use_ok($module); } + BEGIN { use_ok($module, @imports); } + +These simply use the given $module and test to make sure the load +happened ok. Its recommended that you run use_ok() inside a BEGIN +block so its functions are exported at compile-time and prototypes are +properly honored. + +If @imports are given, they are passed through to the use. So this: + + BEGIN { use_ok('Some::Module', qw(foo bar)) } + +is like doing this: + + use Some::Module qw(foo bar); + + +=cut + +sub use_ok ($;@) { + my($module, @imports) = @_; + @imports = () unless @imports; + + my $pack = caller; + + eval <import(\@imports); +USE + + my $ok = $Test->ok( !$@, "use $module;" ); + + unless( $ok ) { + chomp $@; + $Test->diag(< + + require_ok($module); + +Like use_ok(), except it requires the $module. + +=cut + +sub require_ok ($) { + my($module) = shift; + + my $pack = caller; + + eval <ok( !$@, "require $module;" ); + + unless( $ok ) { + chomp $@; + $Test->diag(< The following describes an I interface that +is subject to change B! Use at your peril. + +Sometimes running a test under certain conditions will cause the +test script to die. A certain function or method isn't implemented +(such as fork() on MacOS), some resource isn't available (like a +net connection) or a module isn't available. In these cases it's +necessary to skip tests, or declare that they are supposed to fail +but will work in the future (a todo test). + +For more details on skip and todo tests see L. + +The way Test::More handles this is with a named block. Basically, a +block of tests which can be skipped over or made todo. It's best if I +just show you... + +=over 4 + +=item B + + SKIP: { + skip $why, $how_many if $condition; + + ...normal testing code goes here... + } + +This declares a block of tests to skip, $how_many tests there are, +$why and under what $condition to skip them. An example is the +easiest way to illustrate: + + SKIP: { + skip "Pigs don't fly here", 2 unless Pigs->can('fly'); + + my $pig = Pigs->new; + $pig->takeoff; + + ok( $pig->altitude > 0, 'Pig is airborne' ); + ok( $pig->airspeed > 0, ' and moving' ); + } + +If pigs cannot fly, the whole block of tests will be skipped +completely. Test::More will output special ok's which Test::Harness +interprets as skipped tests. Its important to include $how_many tests +are in the block so the total number of tests comes out right (unless +you're using C, in which case you can leave $how_many off if +you like). + +You'll typically use this when a feature is missing, like an optional +module is not installed or the operating system doesn't have some +feature (like fork() or symlinks) or maybe you need an Internet +connection and one isn't available. + +=for _Future +See L + +=cut + +#'# +sub skip { + my($why, $how_many) = @_; + + unless( defined $how_many ) { + # $how_many can only be avoided when no_plan is in use. + _carp "skip() needs to know \$how_many tests are in the block" + unless $Test::Builder::No_Plan; + $how_many = 1; + } + + for( 1..$how_many ) { + $Test->skip($why); + } + + local $^W = 0; + last SKIP; +} + + +=item B + + TODO: { + local $TODO = $why; + + ...normal testing code goes here... + } + +Declares a block of tests you expect to fail and $why. Perhaps it's +because you haven't fixed a bug or haven't finished a new feature: + + TODO: { + local $TODO = "URI::Geller not finished"; + + my $card = "Eight of clubs"; + is( URI::Geller->your_card, $card, 'Is THIS your card?' ); + + my $spoon; + URI::Geller->bend_spoon; + is( $spoon, 'bent', "Spoon bending, that's original" ); + } + +With a todo block, the tests inside are expected to fail. Test::More +will run the tests normally, but print out special flags indicating +they are "todo". Test::Harness will interpret failures as being ok. +Should anything succeed, it will report it as an unexpected success. + +The nice part about todo tests, as opposed to simply commenting out a +block of tests, is it's like having a programmatic todo list. You know +how much work is left to be done, you're aware of what bugs there are, +and you'll know immediately when they're fixed. + +Once a todo test starts succeeding, simply move it outside the block. +When the block is empty, delete it. + + +=back + +=head2 Comparison functions + +Not everything is a simple eq check or regex. There are times you +need to see if two arrays are equivalent, for instance. For these +instances, Test::More provides a handful of useful functions. + +B These are NOT well-tested on circular references. Nor am I +quite sure what will happen with filehandles. + +=over 4 + +=item B + + is_deeply( $this, $that, $test_name ); + +Similar to is(), except that if $this and $that are hash or array +references, it does a deep comparison walking each data structure to +see if they are equivalent. If the two structures are different, it +will display the place where they start differing. + +B Display of scalar refs is not quite 100% + +=cut + +use vars qw(@Data_Stack); +my $DNE = bless [], 'Does::Not::Exist'; +sub is_deeply { + my($this, $that, $name) = @_; + + my $ok; + if( !ref $this || !ref $that ) { + $ok = $Test->is_eq($this, $that, $name); + } + else { + local @Data_Stack = (); + if( _deep_check($this, $that) ) { + $ok = $Test->ok(1, $name); + } + else { + $ok = $Test->ok(0, $name); + $ok = $Test->diag(_format_stack(@Data_Stack)); + } + } + + return $ok; +} + +sub _format_stack { + my(@Stack) = @_; + + my $var = '$FOO'; + my $did_arrow = 0; + foreach my $entry (@Stack) { + my $type = $entry->{type} || ''; + my $idx = $entry->{'idx'}; + if( $type eq 'HASH' ) { + $var .= "->" unless $did_arrow++; + $var .= "{$idx}"; + } + elsif( $type eq 'ARRAY' ) { + $var .= "->" unless $did_arrow++; + $var .= "[$idx]"; + } + elsif( $type eq 'REF' ) { + $var = "\${$var}"; + } + } + + my @vals = @{$Stack[-1]{vals}}[0,1]; + my @vars = (); + ($vars[0] = $var) =~ s/\$FOO/ \$got/; + ($vars[1] = $var) =~ s/\$FOO/\$expected/; + + my $out = "Structures begin differing at:\n"; + foreach my $idx (0..$#vals) { + my $val = $vals[$idx]; + $vals[$idx] = !defined $val ? 'undef' : + $val eq $DNE ? "Does not exist" + : "'$val'"; + } + + $out .= "$vars[0] = $vals[0]\n"; + $out .= "$vars[1] = $vals[1]\n"; + + return $out; +} + + +=item B + + eq_array(\@this, \@that); + +Checks if two arrays are equivalent. This is a deep check, so +multi-level structures are handled correctly. + +=cut + +#'# +sub eq_array { + my($a1, $a2) = @_; + return 1 if $a1 eq $a2; + + my $ok = 1; + my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; + for (0..$max) { + my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; + my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; + + push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] }; + $ok = _deep_check($e1,$e2); + pop @Data_Stack if $ok; + + last unless $ok; + } + return $ok; +} + +sub _deep_check { + my($e1, $e2) = @_; + my $ok = 0; + + my $eq; + { + # Quiet uninitialized value warnings when comparing undefs. + local $^W = 0; + + if( $e1 eq $e2 ) { + $ok = 1; + } + else { + if( UNIVERSAL::isa($e1, 'ARRAY') and + UNIVERSAL::isa($e2, 'ARRAY') ) + { + $ok = eq_array($e1, $e2); + } + elsif( UNIVERSAL::isa($e1, 'HASH') and + UNIVERSAL::isa($e2, 'HASH') ) + { + $ok = eq_hash($e1, $e2); + } + elsif( UNIVERSAL::isa($e1, 'REF') and + UNIVERSAL::isa($e2, 'REF') ) + { + push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; + $ok = _deep_check($$e1, $$e2); + pop @Data_Stack if $ok; + } + elsif( UNIVERSAL::isa($e1, 'SCALAR') and + UNIVERSAL::isa($e2, 'SCALAR') ) + { + push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; + $ok = _deep_check($$e1, $$e2); + } + else { + push @Data_Stack, { vals => [$e1, $e2] }; + $ok = 0; + } + } + } + + return $ok; +} + + +=item B + + eq_hash(\%this, \%that); + +Determines if the two hashes contain the same keys and values. This +is a deep check. + +=cut + +sub eq_hash { + my($a1, $a2) = @_; + return 1 if $a1 eq $a2; + + my $ok = 1; + my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; + foreach my $k (keys %$bigger) { + my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; + my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; + + push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] }; + $ok = _deep_check($e1, $e2); + pop @Data_Stack if $ok; + + last unless $ok; + } + + return $ok; +} + +=item B + + eq_set(\@this, \@that); + +Similar to eq_array(), except the order of the elements is B +important. This is a deep check, but the irrelevancy of order only +applies to the top level. + +=cut + +# We must make sure that references are treated neutrally. It really +# doesn't matter how we sort them, as long as both arrays are sorted +# with the same algorithm. +sub _bogus_sort { local $^W = 0; ref $a ? 0 : $a cmp $b } + +sub eq_set { + my($a1, $a2) = @_; + return 0 unless @$a1 == @$a2; + + # There's faster ways to do this, but this is easiest. + return eq_array( [sort _bogus_sort @$a1], [sort _bogus_sort @$a2] ); +} + + +=back + +=head1 NOTES + +Test::More is B tested all the way back to perl 5.004. + +=head1 BUGS and CAVEATS + +=over 4 + +=item Making your own ok() + +This will not do what you mean: + + sub my_ok { + ok( @_ ); + } + + my_ok( 2 + 2 == 5, 'Basic addition' ); + +since ok() takes it's arguments as scalars, it will see the length of +@_ (2) and always pass the test. You want to do this instead: + + sub my_ok { + ok( $_[0], $_[1] ); + } + +The other functions act similarly. + +=item The eq_* family have some caveats. + +=item Test::Harness upgrades + +no_plan and todo depend on new Test::Harness features and fixes. If +you're going to distribute tests that use no_plan your end-users will +have to upgrade Test::Harness to the latest one on CPAN. + +If you simply depend on Test::More, it's own dependencies will cause a +Test::Harness upgrade. + +=back + + +=head1 HISTORY + +This is a case of convergent evolution with Joshua Pritikin's Test +module. I was largely unaware of its existence when I'd first +written my own ok() routines. This module exists because I can't +figure out how to easily wedge test names into Test's interface (along +with a few other problems). + +The goal here is to have a testing utility that's simple to learn, +quick to use and difficult to trip yourself up with while still +providing more flexibility than the existing Test.pm. As such, the +names of the most common routines are kept tiny, special cases and +magic side-effects are kept to a minimum. WYSIWYG. + + +=head1 SEE ALSO + +L if all this confuses you and you just want to write +some tests. You can upgrade to Test::More later (its forward +compatible). + +L for a similar testing module. + +L for details on how your test results are interpreted +by Perl. + +L describes a very featureful unit testing interface. + +L shows the idea of embedded testing. + +L is another approach to embedded testing. + + +=head1 AUTHORS + +Michael G Schwern Eschwern@pobox.comE with much inspiration from +Joshua Pritikin's Test module and lots of discussion with Barrie +Slaymaker and the perl-qa gang. + + +=head1 COPYRIGHT + +Copyright 2001 by Michael G Schwern Eschwern@pobox.comE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See L + +=cut + +1; diff --git a/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/Simple.pm b/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/Simple.pm new file mode 100644 index 0000000..6d0a0a0 --- /dev/null +++ b/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/lib/Test/Simple.pm @@ -0,0 +1,234 @@ +package Test::Simple; + +use 5.004; + +use strict 'vars'; +use vars qw($VERSION); +$VERSION = '0.33'; + + +use Test::Builder; +my $Test = Test::Builder->new; + +sub import { + my $self = shift; + my $caller = caller; + *{$caller.'::ok'} = \&ok; + + $Test->exported_to($caller); + $Test->plan(@_); +} + + +=head1 NAME + +Test::Simple - Basic utilities for writing tests. + +=head1 SYNOPSIS + + use Test::Simple tests => 1; + + ok( $foo eq $bar, 'foo is bar' ); + + +=head1 DESCRIPTION + +** If you are unfamiliar with testing B first! ** + +This is an extremely simple, extremely basic module for writing tests +suitable for CPAN modules and other pursuits. If you wish to do more +complicated testing, use the Test::More module (a drop-in replacement +for this one). + +The basic unit of Perl testing is the ok. For each thing you want to +test your program will print out an "ok" or "not ok" to indicate pass +or fail. You do this with the ok() function (see below). + +The only other constraint is you must pre-declare how many tests you +plan to run. This is in case something goes horribly wrong during the +test and your test program aborts, or skips a test or whatever. You +do this like so: + + use Test::Simple tests => 23; + +You must have a plan. + + +=over 4 + +=item B + + ok( $foo eq $bar, $name ); + ok( $foo eq $bar ); + +ok() is given an expression (in this case C<$foo eq $bar>). If its +true, the test passed. If its false, it didn't. That's about it. + +ok() prints out either "ok" or "not ok" along with a test number (it +keeps track of that for you). + + # This produces "ok 1 - Hell not yet frozen over" (or not ok) + ok( get_temperature($hell) > 0, 'Hell not yet frozen over' ); + +If you provide a $name, that will be printed along with the "ok/not +ok" to make it easier to find your test when if fails (just search for +the name). It also makes it easier for the next guy to understand +what your test is for. Its highly recommended you use test names. + +All tests are run in scalar context. So this: + + ok( @stuff, 'I have some stuff' ); + +will do what you mean (fail if stuff is empty) + +=cut + +sub ok ($;$) { + $Test->ok(@_); +} + + +=back + +Test::Simple will start by printing number of tests run in the form +"1..M" (so "1..5" means you're going to run 5 tests). This strange +format lets Test::Harness know how many tests you plan on running in +case something goes horribly wrong. + +If all your tests passed, Test::Simple will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Simple +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + +This module is by no means trying to be a complete testing system. +Its just to get you started. Once you're off the ground its +recommended you look at L. + + +=head1 EXAMPLE + +Here's an example of a simple .t file for the fictional Film module. + + use Test::Simple tests => 5; + + use Film; # What you're testing. + + my $btaste = Film->new({ Title => 'Bad Taste', + Director => 'Peter Jackson', + Rating => 'R', + NumExplodingSheep => 1 + }); + ok( defined($btaste) and ref $btaste eq 'Film', 'new() works' ); + + ok( $btaste->Title eq 'Bad Taste', 'Title() get' ); + ok( $btaste->Director eq 'Peter Jackson', 'Director() get' ); + ok( $btaste->Rating eq 'R', 'Rating() get' ); + ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' ); + +It will produce output like this: + + 1..5 + ok 1 - new() works + ok 2 - Title() get + ok 3 - Director() get + not ok 4 - Rating() get + # Failed test (t/film.t at line 14) + ok 5 - NumExplodingSheep() get + # Looks like you failed 1 tests of 5 + +Indicating the Film::Rating() method is broken. + + +=head1 CAVEATS + +Test::Simple will only report a maximum of 254 failures in its exit +code. If this is a problem, you probably have a huge test script. +Split it into multiple files. (Otherwise blame the Unix folks for +using an unsigned short integer as the exit status). + +Because VMS's exit codes are much, much different than the rest of the +universe, and perl does horrible mangling to them that gets in my way, +it works like this on VMS. + + 0 SS$_NORMAL all tests successful + 4 SS$_ABORT something went wrong + +Unfortunately, I can't differentiate any further. + + +=head1 NOTES + +Test::Simple is B tested all the way back to perl 5.004. + + +=head1 HISTORY + +This module was conceived while talking with Tony Bowden in his +kitchen one night about the problems I was having writing some really +complicated feature into the new Testing module. He observed that the +main problem is not dealing with these edge cases but that people hate +to write tests B. What was needed was a dead simple module +that took all the hard work out of testing and was really, really easy +to learn. Paul Johnson simultaneously had this idea (unfortunately, +he wasn't in Tony's kitchen). This is it. + + +=head1 SEE ALSO + +=over 4 + +=item L + +More testing functions! Once you outgrow Test::Simple, look at +Test::More. Test::Simple is 100% forward compatible with Test::More +(i.e. you can just use Test::More instead of Test::Simple in your +programs and things will still work). + +=item L + +The original Perl testing module. + +=item L + +Elaborate unit testing. + +=item L, L + +Embed tests in your code! + +=item L + +Interprets the output of your test program. + +=back + + +=head1 AUTHORS + +Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern +Eschwern@pobox.comE, wardrobe by Calvin Klein. + + +=head1 COPYRIGHT + +Copyright 2001 by Michael G Schwern Eschwern@pobox.comE. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See L + +=cut + +1; diff --git a/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/var.t b/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/var.t new file mode 100644 index 0000000..7465ee8 --- /dev/null +++ b/dev/i386/libfile-chdir-perl/libfile-chdir-perl-0.06/t/var.t @@ -0,0 +1,44 @@ +#!/usr/bin/perl -Tw + +use strict; +use lib qw(t/lib); +use Test::More tests => 11; + +BEGIN { use_ok('File::chdir') } + +use Cwd; + +# Don't want to depend on File::Spec::Functions +sub catdir { File::Spec->catdir(@_) } + +my $cwd = getcwd; + +ok( tied $CWD, '$CWD is fit to be tied' ); + +# First, let's try unlocalized $CWD. +{ + $CWD = 't'; + ::is( getcwd, catdir($cwd,'t'), 'unlocalized $CWD works' ); + ::is( $CWD, catdir($cwd,'t'), ' $CWD set' ); +} + +::is( getcwd, catdir($cwd,'t'), 'unlocalized $CWD unneffected by blocks' ); +::is( $CWD, catdir($cwd,'t'), ' and still set' ); + + +# Ok, reset ourself for the real test. +$CWD = $cwd; + +{ + my $old_dir = $CWD; + local $CWD = "t"; + ::is( $old_dir, $cwd, '$CWD fetch works' ); + ::is( getcwd, catdir($cwd,'t'), 'localized $CWD works' ); +} + +::is( getcwd, $cwd, ' and resets automatically!' ); +::is( $CWD, $cwd, ' $CWD reset, too' ); + + +chdir('t'); +is( $CWD, catdir($cwd,'t'), 'chdir() and $CWD work together' ); diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Changes b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Changes new file mode 100644 index 0000000..b6a6ec7 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Changes @@ -0,0 +1,44 @@ +Revision history for File::Which. + +0.05 Mon 24 Jun 23:06:45 CET 2002 + - Made sure the file wasn't a directory, as directories usually + have x set. + - made pwhich say so if it didn't find a file. + - improve file searching: file doesn't have to be -x on MacOS, + only -e. Same thing on DOSish, but only if the file extension is + in PATHEXT (so we don't look for non-executable files that + happen to be in PATH). + - For DOSish, VMS and Mac, add current directory in front of path, + as (on Win32) this one is searched first. (could someone tell me + if this assumption is true on VMS and MacOS too?) + - large updates to test suite: we now emulate executable files + inside t/test-bin/. Like this we have more control. I hope + this test suite will be better, but it is probably still + shaky. Any reports would do me a lot of good. + +0.04 Thu 20 Jun 21:50:30 CET 2002 + - Re-wrote some parts for more platform-specific code (Mac and VMS + primarily). Thanks to Abigail and the PPT `which': + http://www.perl.com/language/ppt/src/which/index.html + - Removed the '~' handling: was probably broken anyway. + - fixed a bug with pwhich -a where it would return the number of + results instead of the results + +0.03 Wed 24 Apr 14:48:50 CET 2002 + - Changed the '~' handling: last version was buggy, it needs to + only replace it on Unix and if $ENV{HOME} exists, replacing it + then with $ENV{HOME} (removes File::HomeDir dependency). + - Added documentation to pwhich (you can run perldoc on it now) + +0.02 Fri 19 Apr 02:52:15 CET 2002 + - Some documentation changes + - Added where($short_exec_name) as an alias for + which($short_exec_name, { all => 1 }). + [Request from Jerrad Pierce ] + - Added the which option --all. Other options just bloat everything. + - Added `pwhich', perl-only replacement for `which'. + +0.01 Sun 14 Apr 23:05:37 CET 2002 + - original version; extracted from DocSet. Only plain which() with + docs and tests. + diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/MANIFEST b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/MANIFEST new file mode 100644 index 0000000..a300dad --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/MANIFEST @@ -0,0 +1,17 @@ +Changes +Makefile.PL +MANIFEST +README +Which.pm +bin/pwhich +t/load.t +t/simple.t +t/all.t +t/test-bin/test1.exe +t/test-bin/test2.bat +t/test-bin/test3 +t/test-bin/test4/foo.txt +t/test-bin/all +t/test-bin/all.bat +t/test-bin/all.exe +t/test-bin/README.txt \ No newline at end of file diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Makefile.PL b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Makefile.PL new file mode 100644 index 0000000..73a69e3 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Makefile.PL @@ -0,0 +1,13 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + 'NAME' => 'File::Which', + 'VERSION_FROM' => 'Which.pm', # finds $VERSION + 'PREREQ_PM' => { + 'File::Spec' => 0.60, # The version coming with perl-5.005_03 + }, + 'EXE_FILES' => ['bin/pwhich'], + ($] >= 5.005 ? + (ABSTRACT_FROM => 'Which.pm', # retrieve abstract from module + AUTHOR => 'Per Einar Ellefsen ') : ()), +); diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/README b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/README new file mode 100644 index 0000000..acf55b1 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/README @@ -0,0 +1,56 @@ +File::Which +=========== + +File::Which is a portable implementation (in Perl) of `which', and can +be used to get the absolute filename of an executable program +installed somewhere in your PATH, or just check for its existence. It +includes the command-line utility `pwhich' which has the same function +as `which'. + +INSTALLATION + +To install this module type the following (on Windows, use `nmake', +which can be obtained freely from Microsoft: see ActivePerl +documentation): + + $ tar zxvf File-Which-x.xx.tar.gz (replace x.xx with the correct version number) + $ cd File-Which-x.xx + $ perl Makefile.PL + $ make + $ make test + $ make install + +Using the CPAN shell: + + $ perl -MCPAN -eshell + cpan> install File::Which + cpan> exit + +TESTING + +When you run `make test', File::Which will test some of its +functionality. It uses the t/test-bin/ directory for this, treating +the files below it as programs. + +The tests might still be a bit shaky because there is a bit of magic +involved in doing this -- please report any problems you might have. + +Furthermore, the files under t/test-bin/ are *not* supposed to be +executed: do so at your own risk. Especially, the *.exe files are not +valid applications as they aren't compiled and might make your system +crash or whatever. Execute them at your own risk. (But don't worry, +this package doesn't bite otherwise :) + +DEPENDENCIES + +This module requires these other modules and libraries: + + File::Spec - distributed with perl. + +COPYRIGHT AND LICENCE + +Copyright (C) 2002 Per Einar Ellefsen + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Which.pm b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Which.pm new file mode 100644 index 0000000..2066181 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/Which.pm @@ -0,0 +1,225 @@ +package File::Which; + +use strict; + +require Exporter; + +@File::Which::ISA = qw(Exporter); + +@File::Which::EXPORT = qw(which); +@File::Which::EXPORT_OK = qw(where); + +$File::Which::VERSION = '0.05'; + +use File::Spec; + +my $Is_VMS = ($^O eq 'VMS'); +my $Is_MacOS = ($^O eq 'MacOS'); +my $Is_DOSish = (($^O eq 'MSWin32') or + ($^O eq 'dos') or + ($^O eq 'os2')); + +# For Win32 systems, stores the extensions used for +# executable files +# For others, the empty string is used +# because 'perl' . '' eq 'perl' => easier +my @path_ext = (''); +if ($Is_DOSish) { + if ($ENV{PATHEXT} and $Is_DOSish) { # WinNT. PATHEXT might be set on Cygwin, but not used. + push @path_ext, split ';', $ENV{PATHEXT}; + } + else { + push @path_ext, qw(.com .exe .bat); # Win9X or other: doesn't have PATHEXT, so needs hardcoded. + } +} +elsif ($Is_VMS) { + push @path_ext, qw(.exe .com); +} + +sub which { + my ($exec) = @_; + + return undef unless $exec; + + my $all = wantarray; + my @results = (); + + # check for aliases first + if ($Is_VMS) { + my $symbol = `SHOW SYMBOL $exec`; + chomp($symbol); + if (!$?) { + return $symbol unless $all; + push @results, $symbol; + } + } + if ($Is_MacOS) { + my @aliases = split /\,/, $ENV{Aliases}; + foreach my $alias (@aliases) { + # This has not been tested!! + # PPT which says MPW-Perl cannot resolve `Alias $alias`, + # let's just hope it's fixed + if (lc($alias) eq lc($exec)) { + chomp(my $file = `Alias $alias`); + last unless $file; # if it failed, just go on the normal way + return $file unless $all; + push @results, $file; + # we can stop this loop as if it finds more aliases matching, + # it'll just be the same result anyway + last; + } + } + } + + my @path = File::Spec->path(); + unshift @path, File::Spec->curdir if $Is_DOSish or $Is_VMS or $Is_MacOS; + + for my $base (map { File::Spec->catfile($_, $exec) } @path) { + for my $ext (@path_ext) { + my $file = $base.$ext; +# print STDERR "$file\n"; + + if ((-x $file or # executable, normal case + ($Is_MacOS || # MacOS doesn't mark as executable so we check -e + ($Is_DOSish and grep { $file =~ /$_$/i } @path_ext[1..$#path_ext]) + # DOSish systems don't pass -x on non-exe/bat/com files. + # so we check -e. However, we don't want to pass -e on files + # that aren't in PATHEXT, like README. + and -e _) + ) and !-d _) + { # and finally, we don't want dirs to pass (as they are -x) + +# print STDERR "-x: ", -x $file, " -e: ", -e _, " -d: ", -d _, "\n"; + + return $file unless $all; + push @results, $file; # Make list to return later + } + } + } + + if($all) { + return @results; + } else { + return undef; + } +} + +sub where { + my @res = which($_[0]); # force wantarray + return @res; +} + +1; +__END__ + +=head1 NAME + +File::Which - Portable implementation of the `which' utility + +=head1 SYNOPSIS + + use File::Which; # exports which() + use File::Which qw(which where); # exports which() and where() + + my $exe_path = which('perldoc'); + + my @paths = where('perl'); + - Or - + my @paths = which('perl'); # an array forces search for all of them + +=head1 DESCRIPTION + +C was created to be able to get the paths to executable programs +on systems under which the `which' program wasn't implemented in the shell. + +C searches the directories of the user's C (as returned by +Cpath()>), looking for executable files having the name specified +as a parameter to C. Under Win32 systems, which do not have a notion of +directly executable files, but uses special extensions such as C<.exe> and +C<.bat> to identify them, C takes extra steps to assure that you +will find the correct file (so for example, you might be searching for C, +it'll try C, C, etc.) + +=head1 Steps Used on Win32, DOS, OS2 and VMS + +=head2 Windows NT + +Windows NT has a special environment variable called C, which is used +by the shell to look for executable files. Usually, it will contain a list in +the form C<.EXE;.BAT;.COM;.JS;.VBS> etc. If C finds such an +environment variable, it parses the list and uses it as the different extensions. + +=head2 Windows 9x and other ancient Win/DOS/OS2 + +This set of operating systems don't have the C variable, and usually +you will find executable files there with the extensions C<.exe>, C<.bat> and +(less likely) C<.com>. C uses this hardcoded list if it's running +under Win32 but does not find a C variable. + +=head2 VMS + +Same case as Windows 9x: uses C<.exe> and C<.com> (in that order). + +=head1 Functions + +=head2 which($short_exe_name) + +Exported by default. + +C<$short_exe_name> is the name used in the shell to call the program (for +example, C). + +If it finds an executable with the name you specified, C will return +the absolute path leading to this executable (for example, C or +C). + +If it does I find the executable, it returns C. + +If C is called in list context, it will return I the +matches. + +=head2 where($short_exe_name) + +Not exported by default. + +Same as C in array context. Same as the +C<`where'> utility, will return an array containing all the path names +matching C<$short_exe_name>. + + +=head1 Bugs and Caveats + +Not tested on VMS or MacOS, although there is platform specific code +for those. Anyone who haves a second would be very kind to send me a +report of how it went. + +File::Spec adds the current directory to the front of PATH if on +Win32, VMS or MacOS. I have no knowledge of those so don't know if the +current directory is searced first or not. Could someone please tell +me? + +=head1 Author + +Per Einar Ellefsen, Eper.einar (at) skynet.beE + +Originated in I. Changed for use in DocSet +(for the mod_perl site) and Win32-awareness by me, with slight modifications +by Stas Bekman, then extracted to create C. + +Version 0.04 had some significant platform-related changes, taken from +the Perl Power Tools C<`which'> implementation by Abigail with +enhancements from Peter Prymmer. See +http://www.perl.com/language/ppt/src/which/index.html for more +information. + +=head1 License + +This library is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +=head1 See Also + +L, L, Perl Power Tools: +http://www.perl.com/language/ppt/index.html . + +=cut diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/bin/pwhich b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/bin/pwhich new file mode 100644 index 0000000..5e8d953 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/bin/pwhich @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w + +use strict; + +use File::Which; +use Getopt::Std; + +my %opts = (); + +getopts('av', \%opts); + +my @files = @ARGV; + +if ($opts{v}) { + print <<"END"; +This is pwhich running File::Which version $File::Which::VERSION + +Copyright 2002 Per Einar Ellefsen. +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. +END + + exit; +} + +unless(@files) { + print <<"EOS"; +Usage: $0 [-a] [-v] programname [programname ...] + -a Print all matches in PATH, not just the first. + -v Prints version and exits + +EOS + + exit; +} + +for my $file (@files) { + my @result = $opts{a} ? which($file) : scalar which($file); # need to force scalar + @result = () unless defined $result[0]; # we might end up with @result = (undef) -> 1 elem + for my $result (@result) { + print "$result\n" if $result; + } + print STDERR "pwhich: no $file in PATH\n" unless @result; +} + +__END__ + +=head1 NAME + +pwhich - Perl-only `which' + +=head1 Synopsis + + $ pwhich perl + $ pwhich -a perl # print all matches + $ pwhich perl perldoc ... # look for multiple programs + $ pwhich -a perl perldoc ... + +=head1 DESCRIPTION + +`pwhich' is a command-line utility program for finding paths to other +programs based on the user's C. It is similar to the usualy Unix +tool `which', and tries to emulate its functionality, but is written +purely in Perl (uses the module C), so is portable. + + +=head1 Calling syntax + + $ pwhich [-a] [-v] programname [programname ...] + +=head2 Options + +=over + +=item -a + +The option I<-a> will make C print all matches found in the +C variable instead of just the first one. Each match is printed +on a separate line. + +=item -v + +Prints version (of C) and copyright notice and exits. + +=back + +=head1 License + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 See Also + +L, L, L + +=head1 Author + +Per Einar Ellefsen, Eper.einar (at) skynet.beE + +=cut + diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/changelog b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/changelog new file mode 100644 index 0000000..0935fef --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/changelog @@ -0,0 +1,51 @@ +libfile-which-perl (0.05-7) unstable; urgency=low + + * Use $(CURDIR) [make] instead of $(PWD) [sh] to fix issues with sudo. + + -- gregor herrmann Sun, 1 Oct 2006 14:09:18 +0200 + +libfile-which-perl (0.05-6) unstable; urgency=low + + * Moved debhelper to Build-Depends. + * Set Standards-Version to 3.7.2 (no changes). + * Set Debhelper Compatibility Level to 5. + + -- gregor herrmann Fri, 16 Jun 2006 15:45:59 +0200 + +libfile-which-perl (0.05-5) unstable; urgency=low + + * Adopting package. + + -- Daniel Ruoso Wed, 26 May 2004 16:21:27 -0300 + +libfile-which-perl (0.05-4) unstable; urgency=low + + * debian/copyright: updated + + -- Ardo van Rangelrooij Sat, 7 Feb 2004 10:28:25 -0600 + +libfile-which-perl (0.05-3) unstable; urgency=low + + * debian/control: now really changed build dependency on 'debhelper' to + '(>= 4.1)' + * debian/control: upgraded to Debian Policy 3.6.1 (no changes) + + -- Ardo van Rangelrooij Sat, 13 Dec 2003 11:54:40 -0600 + +libfile-which-perl (0.05-2) unstable; urgency=low + + * debian/rules: moved debhelper compatibility level setting to + 'debian/compat' per latest debhelper best practices + * debian/control: updated sections according to latest archive changes: + - 'libfile-which-perl' from 'interpreters' to 'perl' + * debian/control: changed build dependency on 'debhelper' to '(>= 4.1)' + * debian/control: upgraded to Debian Policy 3.6.0 (no changes) + + -- Ardo van Rangelrooij Sat, 26 Jul 2003 13:54:50 -0500 + +libfile-which-perl (0.05-1) unstable; urgency=low + + * Initial Release + (closes: Bug#166553) + + -- Ardo van Rangelrooij Sat, 26 Oct 2002 20:46:13 -0500 diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/compat b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/compat @@ -0,0 +1 @@ +5 diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/control b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/control new file mode 100644 index 0000000..77d477f --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/control @@ -0,0 +1,18 @@ +Source: libfile-which-perl +Section: perl +Priority: optional +Maintainer: Debian Perl Group +Uploaders: Daniel Ruoso , gregor herrmann , Carlo Segre +Standards-Version: 3.7.2 +Build-Depends: debhelper (>= 5.0.0) +Build-Depends-Indep: perl + +Package: libfile-which-perl +Section: perl +Priority: optional +Architecture: all +Depends: ${perl:Depends} +Description: Perl module for searching paths for executable programs + This module searches the directories of the user's PATH (as returned + by File::Spec->path()), looking for executable files having the name + specified as a parameter to which(). diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/copyright b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/copyright new file mode 100644 index 0000000..715ee92 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/copyright @@ -0,0 +1,25 @@ +This package was debianized by Ardo van Rangelrooij +on Sat, 26 Oct 2002 20:05:12 -0500. + +It was downloaded from the Comprehensive Perl Archive Network (CPAN). +Visit to find a CPAN site near you. + +Upstream Author: Per Einar Ellefsen + +Copyright: + +Copyright (C) 2002 Per Einar Ellefsen + +This library is free software; you can redistribute it and/or modify +it under the terms of either: + +a) the GNU General Public License as published by the Free Software + Foundation; either version 1, or (at your option) any later + version, or + +b) the "Artistic License" which comes with Perl. + +On a Debian system the complete text of the GNU General Public License +can be found in the file `/usr/share/common-licenses/GPL' and the +complete text of the the Artistic Licence can be found in the file +`/usr/share/common-licenses/Artistic'. diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.docs b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.docs new file mode 100644 index 0000000..e845566 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.docs @@ -0,0 +1 @@ +README diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.examples b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.examples new file mode 100644 index 0000000..8b9546f --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.examples @@ -0,0 +1 @@ +bin/pwhich diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.install b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.install new file mode 100644 index 0000000..dd222db --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/libfile-which-perl.install @@ -0,0 +1 @@ +usr/share diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/rules b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/rules new file mode 100755 index 0000000..a46d926 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/rules @@ -0,0 +1,62 @@ +#!/usr/bin/make -f +## ---------------------------------------------------------------------- +## debian/rules : package script for libfile-which-perl +## ---------------------------------------------------------------------- + +## ---------------------------------------------------------------------- +## uncomment this to turn on verbose mode +#export DH_VERBOSE=1 + +## ---------------------------------------------------------------------- +TMP_DIR = debian/tmp + +## ---------------------------------------------------------------------- +## targets + +clean: + dh_testdir + dh_testroot + [ ! -f Makefile ] || $(MAKE) realclean + dh_clean + rm -f build-stamp install-stamp + +build: build-stamp +build-stamp: + dh_testdir + perl Makefile.PL INSTALLDIRS=vendor + $(MAKE) OPTIMIZE="-O2 -g -Wall" + $(MAKE) test + touch build-stamp + +install: install-stamp +install-stamp: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + $(MAKE) install PREFIX=$(CURDIR)/$(TMP_DIR)/usr + touch install-stamp + +binary-indep: build install + dh_testdir + dh_testroot + dh_install --sourcedir=$(TMP_DIR) \ + -Xpwhich + dh_installdocs + dh_installexamples + dh_installchangelogs Changes + dh_compress + dh_fixperms + dh_installdeb + dh_perl + dh_gencontrol + dh_md5sums + dh_builddeb + +binary-arch: + +binary: binary-indep binary-arch + +.PHONY: clean build install binary-indep binary-arch binary + +## ---------------------------------------------------------------------- diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/watch b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/watch new file mode 100644 index 0000000..8a19ad9 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/debian/watch @@ -0,0 +1,4 @@ +# format version number, currently 3; this line is compulsory! +version=3 + +http://mirrors.kernel.org/cpan/modules/by-module/File/File-Which-([\d\.]+)\.tar\.gz diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/all.t b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/all.t new file mode 100644 index 0000000..44c0520 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/all.t @@ -0,0 +1,28 @@ + +use Test; +BEGIN { plan tests => 3 } +use File::Which qw(which where); + +# So let's try using test-bin, huh? + +my $Is_VMS = ($^O eq 'VMS'); +my $Is_MacOS = ($^O eq 'MacOS'); +my $Is_DOSish = (($^O eq 'MSWin32') or + ($^O eq 'dos') or + ($^O eq 'os2')); +my $Is_Cygwin = $^O eq 'cygwin'; + +{ + chdir 't' if (-d 't'); + local $ENV{PATH} = 'test-bin'; + + if (not ($Is_VMS or $Is_MacOS or $Is_DOSish)) { # dunno about VMS + chmod 0755, "test-bin/all"; + } + + my @result = which('all'); + ok($result[0], qr/all/i); + ok(@result > 0, 1); + ok(scalar @result, scalar where('all')); # should have as many elements. + +} diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/load.t b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/load.t new file mode 100644 index 0000000..477c399 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/load.t @@ -0,0 +1,7 @@ +use Test; + +BEGIN { plan tests => 1 }; + +use File::Which; + +ok(1); diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/simple.t b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/simple.t new file mode 100644 index 0000000..db4d284 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/simple.t @@ -0,0 +1,66 @@ +use Test; +BEGIN { plan tests => 9; } +use File::Which; +use File::Spec; + +# check that it returns undef if no file is passed +ok(scalar which(''), undef); + +ok(scalar which('non_existent_very_unlinkely_thingy_executable'), undef); + +# So let's try using test-bin, huh? + +my $Is_VMS = ($^O eq 'VMS'); +my $Is_MacOS = ($^O eq 'MacOS'); +my $Is_DOSish = (($^O eq 'MSWin32') or + ($^O eq 'dos') or + ($^O eq 'os2')); +my $Is_Cygwin = $^O eq 'cygwin'; + +{ + chdir 't' if (-d 't'); + local $ENV{PATH} = 'test-bin'; + + unless ($Is_VMS or $Is_MacOS or $Is_DOSish) { # dunno about VMS, think not + chmod 0755, "test-bin/test3"; + } + + my $skip = 0; + # test1.exe + $skip = 1 unless $Is_DOSish; + skip($skip, lc scalar which('test1'), 'test-bin\test1.exe', 'Looking for test1.exe'); + + # test2.bat + skip($skip, lc scalar which('test2'), 'test-bin\test2.bat', 'Looking for test2.bat'); + + # Make sure that test3 isn't returned by File::Which on DOSish. (it is in + # PATH, but is a normal file on DOSish) + skip($skip, scalar which('test3'), undef); + + $skip = 0; + + # testing Unix finally: + $skip = 1 if $Is_DOSish or $Is_MacOS or $Is_VMS; + skip($skip, scalar which('test3'), 'test-bin/test3', 'Check test3 for Unix'); + + $skip = 0; + # Cygwin: should make test1.exe transparent + $skip = 1 unless $Is_Cygwin; + skip($skip, scalar which('test1'), 'test-bin/test1', 'Looking for test1 on Cygwin: transparent to test1.exe'); + + ok(scalar which('test4'), undef, 'Make sure that which() doesn\'t return a directory'); + + chdir 'test-bin'; + + $skip = 0; + + # Make sure that .\ stuff works on DOSish, VMS, MacOS (. is in PATH implicitly). + $skip = 1 unless $Is_DOSish or $Is_VMS; # or $Is_MacOS; # no idea + # how binaries should look + # like on Mac + skip($skip, lc scalar which('test1'), + File::Spec->catfile(File::Spec->curdir(), 'test1.exe'), + 'Looking for test1.exe in curdir' + ); + +} diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/README.txt b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/README.txt new file mode 100644 index 0000000..f7b062a --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/README.txt @@ -0,0 +1,5 @@ +The files included in this directory are only used for testing: they +should not be executed: especially the *.exe files which aren't really +compiled programs, only empty files with special filenames (as +File::Which only cares about special attributes). Do NOT try to run +them. diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all new file mode 100644 index 0000000..b76df2e --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all @@ -0,0 +1,2 @@ +#!bash +# above shebang needed so Cygwin treats it as -x \ No newline at end of file diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all.bat b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all.bat new file mode 100755 index 0000000..e69de29 diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all.exe b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/all.exe new file mode 100755 index 0000000..e69de29 diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test1.exe b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test1.exe new file mode 100755 index 0000000..3cb13a5 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test1.exe @@ -0,0 +1,2 @@ +DO NOT RUN THIS PROGRAM +IT IS ONLY TO TEST File::Which diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test2.bat b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test2.bat new file mode 100755 index 0000000..fdaae7c --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test2.bat @@ -0,0 +1,3 @@ +@echo off +echo This is for testing File::Which +echo Nothing interesting here! \ No newline at end of file diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test3 b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test3 new file mode 100644 index 0000000..ef252be --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test3 @@ -0,0 +1,5 @@ +#!sh + +# ^ above shebang is needed for Cygwin +echo "Just testing File::Which" +echo "Nothing interesting here" diff --git a/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test4/foo.txt b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test4/foo.txt new file mode 100644 index 0000000..7e34287 --- /dev/null +++ b/dev/i386/libfile-which-perl/libfile-which-perl-0.05/t/test-bin/test4/foo.txt @@ -0,0 +1 @@ +This file only needs to be here to test4 dir is copied over. \ No newline at end of file diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Changes b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Changes new file mode 100644 index 0000000..385a5c9 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/Changes @@ -0,0 +1,1468 @@ +2007-01-12 Gisle Aas + + Release 3.56 + + Cloning of parser state for compatiblity with threads. + Fixed by Bo Lindbergh . + + Don't require whitespace between declaration tokens. + + + + +2006-07-10 Gisle Aas + + Release 3.55 + + Treat <> at the end of document as text. Used to be + reported as a comment. + + Improved Firefox compatiblity for bad HTML: + - Unclosed + +å +EOT + +$p->parse($doc)->eof; + +is($text, $doc); +is($dtext, <<"EOT"); +å +ååAAAA + +foo\240bar +foo\240bar +&xyzzy +&xyzzy; + +\1 +\377 +\377 +\377G + +� +� +& +&# +&#x +&aring + + +å +EOT diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities.t new file mode 100644 index 0000000..15c6e28 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities.t @@ -0,0 +1,195 @@ +use HTML::Entities qw(decode_entities encode_entities encode_entities_numeric); + +use Test::More tests => 13; + +$a = "Våre norske tegn bør æres"; + +decode_entities($a); + +is($a, "Våre norske tegn bør æres"); + +encode_entities($a); + +is($a, "Våre norske tegn bør æres"); + +decode_entities($a); +encode_entities_numeric($a); + +is($a, "Våre norske tegn bør æres"); + +$a = "<&>\"'"; +is(encode_entities($a), "<&>"'"); +is(encode_entities_numeric($a), "<&>"'"); + +$a = "abcdef"; +is(encode_entities($a, 'a-c'), "abcdef"); + + +# See how well it does against rfc1866... +$ent = $plain = ""; +while () { + next unless /^\s* +# Subject: HTML entities problem with 5.11 +# To: libwww-perl@ics.uci.edu +# Date: Fri, 05 Sep 1997 16:56:55 +1000 +# Message-Id: <199709050657.QAA10089@snowy.nsw.cmis.CSIRO.AU> +# +# Hi. I've got a problem that has surfaced with the changes to +# HTML::Entities.pm for 5.11 (it doesn't happen with 5.08). It's happening +# in the process of encoding then decoding special entities. Eg, what goes +# in as "abc&def&ghi" comes out as "abc&def;&ghi;". + +is(decode_entities("abc&def&ghi&abc;&def;"), "abc&def&ghi&abc;&def;"); + +# Decoding of ' +is(decode_entities("'"), "'"); +is(encode_entities("'", "'"), "'"); + +is(decode_entities("Attention Homeοωnөrs...1ѕt Tімe Eνөг"), + "Attention Home\x{3BF}\x{3C9}n\x{4E9}rs...1\x{455}t T\x{456}\x{43C}e E\x{3BD}\x{4E9}\x{433}"); + +__END__ +# Quoted from rfc1866.txt + +14. Proposed Entities + + The HTML DTD references the "Added Latin 1" entity set, which only + supplies named entities for a subset of the non-ASCII characters in + [ISO-8859-1], namely the accented characters. The following entities + should be supported so that all ISO 8859-1 characters may only be + referenced symbolically. The names for these entities are taken from + the appendixes of [SGML]. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Berners-Lee & Connolly Standards Track [Page 75] + +RFC 1866 Hypertext Markup Language - 2.0 November 1995 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Berners-Lee & Connolly Standards Track [Page 76] + +RFC 1866 Hypertext Markup Language - 2.0 November 1995 + + + + + + + + + + + + + + + diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities2.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities2.t new file mode 100644 index 0000000..7840c71 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/entities2.t @@ -0,0 +1,57 @@ +#!perl -w + +use strict; +use Test::More tests => 9; + +use HTML::Entities qw(_decode_entities); + +eval { + _decode_entities("<", undef); +}; +like($@, qr/^Can't inline decode readonly string/); + +eval { + my $a = ""; + _decode_entities($a, $a); +}; +like($@, qr/^2nd argument must be hash reference/); + +eval { + my $a = ""; + _decode_entities($a, []); +}; +like($@, qr/^2nd argument must be hash reference/); + +$a = "<"; +_decode_entities($a, undef); +is($a, "<"); + +_decode_entities($a, { "lt" => "<" }); +is($a, "<"); + +my $x = "x" x 20; + +my $err; +for (":", ":a", "a:", "a:a", "a:a:a", "a:::a") { + my $a = $_; + $a =~ s/:/&a;/g; + my $b = $_; + $b =~ s/:/$x/g; + _decode_entities($a, { "a" => $x }); + if ($a ne $b) { + diag "Something went wrong with '$_'"; + $err++; + } +} +ok(!$err); + +$a = "foo bar"; +_decode_entities($a, \%HTML::Entities::entity2char); +is($a, "foo\xA0bar"); + +$a = "foo bar"; +_decode_entities($a, \%HTML::Entities::entity2char); +is($a, "foo bar"); + +_decode_entities($a, \%HTML::Entities::entity2char, 1); +is($a, "foo\xA0bar"); diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/filter-methods.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/filter-methods.t new file mode 100644 index 0000000..9eccaf1 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/filter-methods.t @@ -0,0 +1,205 @@ +#!/usr/bin/perl -w + +use Test::More tests => 12; +use strict; + +use HTML::Parser; + +my $p = HTML::Parser->new(api_version => 3, ignore_tags => [qw(b i em tt)]); +$p->ignore_elements("script"); +$p->unbroken_text(1); + +$p->handler(default => [], "event, text"); +$p->parse(<<"EOT")->eof; +foo +This is an italic and bold text. + + +EOT + +my $t = join("||", map join("|", @$_), @{$p->handler("default")}); +#diag $t; + +is($t, "start_document|||start|||start|||start|||text|foo||end|||start|||text| +This is an italic and bold text. +||end|||text| +||end|||text| +||end_document|", 'ignore_elements'); + + +#------------------------------------------------------ + +$p = HTML::Parser->new(api_version => 3); +$p->report_tags("a"); +$p->handler(start => sub { + my($tagname, %attr) = @_; + ok($tagname eq "a" && $attr{href} eq "#a", 'report_tags start'); + }, 'tagname, @attr'); +$p->handler(end => sub { + my $tagname = shift; + is($tagname, "a", 'report_tags end'); + }, 'tagname'); + +$p->parse(<eof; + +

    Next example

    + +This is very nice example. + +EOT + + +#------------------------------------------------------ + +my @tags; +$p = HTML::Parser->new(api_version => 3); +$p->report_tags(qw(a em)); +$p->ignore_tags(qw(em)); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    + +This is yet another very nice example. + +EOT +is(join('|', @tags), 'a', 'report_tags followed by ignore_tags'); + + +#------------------------------------------------------ + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->report_tags(qw(h1)); +$p->report_tags(); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h1|h2', 'reset report_tags filter'); + + +#------------------------------------------------------ + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->report_tags(qw(h1 h2)); +$p->ignore_tags(qw(h2)); +$p->report_tags(qw(h1 h2)); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h1', 'report_tags does not reset ignore_tags'); + + +#------------------------------------------------------ + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->report_tags(qw(h1 h2)); +$p->ignore_tags(qw(h2)); +$p->report_tags(); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h1', 'reset report_tags does no reset ignore_tags'); + + +#------------------------------------------------------ + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->report_tags(qw(h1 h2)); +$p->report_tags(qw(h3)); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h3', 'report_tags replaces filter'); + + +#------------------------------------------------------ + + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->ignore_tags(qw(h1 h2)); +$p->ignore_tags(qw(h3)); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h1|h2', 'ignore_tags replaces filter'); + + +#------------------------------------------------------ + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->ignore_tags(qw(h2)); +$p->ignore_tags(); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h1|h2', 'reset ignore_tags filter'); + + +#------------------------------------------------------ + +@tags = (); +$p = HTML::Parser->new(api_version => 3); +$p->ignore_tags(qw(h2)); +$p->report_tags(qw(h1 h2)); +$p->handler(end => sub {push @tags, @_;}, 'tagname'); + +$p->parse(<eof; + +

    Next example

    +

    Next example

    + +EOT +is(join('|', @tags), 'h1', 'ignore_tags before report_tags'); +#------------------------------------------------------ + +$p = HTML::Parser->new(api_version => 3); +$p->ignore_elements("script"); +my $res=""; +$p->handler(default=> sub {$res.=$_[0];}, 'text'); +$p->parse(<<'EOT')->eof; +A C D F +EOT +is($res,"A C D F\n","ignore without " + ignore this + + + + + + + +Dette er vanlig tekst. Denne teksten definerer også slutten på +<head> delen av dokumentet. + +" + ignore this too + + + + + +Dette er også vanlig tekst som ikke skal blir parset i det hele tatt. + +EOT + +$| = 1; + +#$HTML::HeadParser::DEBUG = 1; +require HTML::HeadParser; +my $p = HTML::HeadParser->new( H->new ); + +if ($p->parse($HTML)) { + fail("Need more data which should not happen"); +} else { + #diag $p->as_string; + pass(); +} + +like($p->header('Title'), qr/Å være eller å ikke være/); +is($p->header('Expires'), 'Soon'); +is($p->header('Content-Base'), 'http://www.sn.no'); +like($p->header('Link'), qr//); + +# This header should not be present because the head ended +ok(!$p->header('Isindex')); + + +# Try feeding one char at a time +my $expected = $p->as_string; +my $nl = 1; +$p = HTML::HeadParser->new(H->new); +while ($HTML =~ /(.)/sg) { + #print STDERR '#' if $nl; + #print STDERR $1; + $nl = $1 eq "\n"; + $p->parse($1) or last; +} +is($p->as_string, $expected); + + +# Try reading it from a file +my $file = "hptest$$.html"; +die "$file already exists" if -e $file; + +open(FILE, ">$file") or die "Can't create $file: $!"; +binmode(FILE); +print FILE $HTML; +print FILE "

    This is more content...

    \n" x 2000; +print FILE "Buuuh!\n" x 200; +close FILE or die "Can't close $file: $!"; + +$p = HTML::HeadParser->new(H->new); +$p->parse_file($file); +unlink($file) or warn "Can't unlink $file: $!"; + +is($p->header("Title"), "Å være eller å ikke være"); + + +# We got into an infinite loop on data without tags and no EOL. +# This was actually a HTML::Parser bug. +open(FILE, ">$file") or die "Can't create $file: $!"; +print FILE "Foo"; +close(FILE); + +$p = HTML::HeadParser->new(H->new); +$p->parse_file($file); +unlink($file) or warn "Can't unlink $file: $!"; + +ok(!$p->as_string); + +SKIP: { + skip "Need Unicode support", 2 if $] < 5.008; + + # Test that the Unicode BOM does not confuse us? + $p = HTML::HeadParser->new(H->new); + ok($p->parse("\x{FEFF}\nHi <foo>")); + $p->eof; + + is($p->header("title"), "Hi "); +} diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/ignore.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/ignore.t new file mode 100644 index 0000000..008739e --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/ignore.t @@ -0,0 +1,27 @@ + +use Test::More tests => 4; + +use strict; +use HTML::Parser (); + +my $html = 'text'; + +my $text = ''; +my $p = HTML::Parser->new(default_h => [sub {$text .= shift;}, 'text']); +$p->parse($html)->eof; +is($text, $html); + +$text = ''; +$p->handler(start => ""); +$p->parse($html)->eof; +is($text, 'text'); + +$text = ''; +$p->handler(end => 0); +$p->parse($html)->eof; +is($text, 'text'); + +$text = ''; +$p->handler(start => undef); +$p->parse($html)->eof; +is($text, 'text'); diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/largetags.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/largetags.t new file mode 100644 index 0000000..a9ed3ff --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/largetags.t @@ -0,0 +1,38 @@ +# Exercise the tokenpos buffer allocation routines by feeding it +# very large tags. + +use Test::More tests => 2; + +use strict; +use HTML::Parser (); + +my $p = HTML::Parser->new(api_version => 3); + +$p->handler("start" => + sub { + my $tp = shift; + #diag int(@$tp), " - ", join(", ", @$tp); + is(@$tp, 2 + 26 * 6 * 4); + }, "tokenpos"); + +$p->handler("declaration" => + sub { + my $t = shift; + #diag int(@$t), " - @$t"; + is(@$t, 26 * 6 * 2 + 1); + }, "tokens"); + +$p->parse("parse("$_=1 "); +} +$p->parse(">"); + +$p->parse("parse("$_ -- $_ -- "); +} +$p->parse(">"); +$p->eof; +exit; + diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-base.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-base.t new file mode 100644 index 0000000..7ef8f02 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-base.t @@ -0,0 +1,41 @@ +# This test that HTML::LinkExtor really absolutize links correctly +# when a base URL is given to the constructor. + +use Test::More tests => 5; +require HTML::LinkExtor; + +SKIP: { +eval { + require URI; +}; +skip $@, 5 if $@; + +# Try with base URL and the $p->links interface. +$p = HTML::LinkExtor->new(undef, "http://www.sn.no/foo/foo.html"); +$p->parse(<eof; + + + + + +This is link and an Image. +HTML + +@p = $p->links; + +# There should be 4 links in the document +is(@p, 4); + +for (@p) { + ($t, %attr) = @$_ if $_->[0] eq 'img'; +} + +is($t, 'img'); + +is(delete $attr{src}, "http://www.sn.no/foo/img.jpg"); + +is(delete $attr{lowsrc}, "http://www.sn.no/foo/img.gif"); + +ok(!scalar(keys %attr)); # there should be no more attributes +} diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-rel.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-rel.t new file mode 100644 index 0000000..1190a96 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/linkextor-rel.t @@ -0,0 +1,36 @@ +use Test::More tests => 4; + +require HTML::LinkExtor; + +$HTML = < + + + + +This is link and an Image. +HTML + + +# Try the callback interface +$links = ""; +$p = HTML::LinkExtor->new( + sub { + my($tag, %links) = @_; + #diag "$tag @{[%links]}"; + $links .= "$tag @{[%links]}\n"; + }); + +$p->parse($HTML); $p->eof; + +ok($links =~ m|^base href http://www\.sn\.no/$|m); +ok($links =~ m|^body background http://www\.sn\.no/sn\.gif$|m); +ok($links =~ m|^a href link\.html$|m); + +# Used to be problems when using the links method on a document with +# no links it it. This is a test to prove that it works. +$p = new HTML::LinkExtor; +$p->parse("this is a document with no links"); $p->eof; +@a = $p->links; +is(@a, 0); diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/magic.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/magic.t new file mode 100644 index 0000000..366f275 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/magic.t @@ -0,0 +1,41 @@ +# Check that the magic signature at the top of struct p_state works and that we +# catch modifications to _hparser_xs_state gracefully + +use Test::More tests => 5; + +use HTML::Parser; + +$p = HTML::Parser->new(api_version => 3); + +$p->xml_mode(1); + +# We should not be able to simply modify this stuff +eval { + ${$p->{_hparser_xs_state}} += 4; +}; +like($@, qr/^Modification of a read-only value attempted/); + + +my $x = delete $p->{_hparser_xs_state}; + +eval { + $p->xml_mode(1); +}; +like($@, qr/^Can't find '_hparser_xs_state'/); + +$p->{_hparser_xs_state} = \($$x + 16); + +eval { + $p->xml_mode(1); +}; +like($@, $] >= 5.008 ? qr/^Lost parser state magic/ : qr/^Bad signature in parser state object/); + +$p->{_hparser_xs_state} = 33; +eval { + $p->xml_mode(1); +}; +like($@, qr/^_hparser_xs_state element is not a reference/); + +$p->{_hparser_xs_state} = $x; + +ok($p->xml_mode(0)); diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/marked-sect.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/marked-sect.t new file mode 100644 index 0000000..6a63478 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/marked-sect.t @@ -0,0 +1,121 @@ +#!/usr/bin/perl -w + +use strict; +my $tag; +my $text; + +use HTML::Parser (); +my $p = HTML::Parser->new(start_h => [sub { $tag = shift }, "tagname"], + text_h => [sub { $text .= shift }, "dtext"], + ); + + +use Test::More tests => 14; + +SKIP: { +eval { + $p->marked_sections(1); +}; +skip $@, 14 if $@; + +$p->parse(""); +is($text, "foo"); + +$p->parse(""); +is($text, "foobar"); + +$p->parse("]]>\n
    "); +is($text, "foobarfoo\n"); + +$text = ""; +$p->parse("parse(",bar>]]>
    "); +is($text, "<foo]]>"); + +$text = ""; +$p->parse("]]>]]>å
    "); +is($text, "å
    åå"); +is($tag, "br"); + +$text = ""; +$p->parse("]]>
    "); +is($text, ""); + +$text = ""; +$p->parse("]]>
    "); +is($text, "fooå
    "); + +$text = ""; +$p->parse("]]>
    "); +is($text, "fooå
    "); + +$text = ""; +$p->parse("]]>
    "); +is($text, "fooå"); + +$text = ""; +$p->parse("]]>
    "); +is($text, "fooå"); + +# offsets/line/column numbers +$p = HTML::Parser->new(default_h => [\&x, "line,column,offset,event,text"], + marked_sections => 1, + ); +$p->parse(<<'EOT')->eof; +Test + +]]> + +

    Test

    +EOT + +my @x; +sub x { + my($line, $col, $offset, $event, $text) = @_; + $text =~ s/\n/\\n/g; + $text =~ s/ /./g; + push(@x, "$line.$col:$offset $event \"$text\"\n"); +} + +#diag @x; +is(join("", @x), <<'EOT'); +1.0:0 start_document "" +1.0:0 start "" +1.7:7 text "Test" +1.11:11 end "" +1.19:19 text "\n" +3.3:32 text "fooå
    \n" +4.3:49 text "\n" +5.4:54 text "\nINCLUDE\nSTUFF\n" +8.3:72 text "\n.." +9.2:75 start "

    " +9.6:79 text "Test" +9.10:83 end "

    " +9.15:88 text "\n" +10.0:89 end_document "" +EOT + +my $doc = ""; +my $result = ""; +$p = HTML::Parser->new( + marked_sections => 1, + handlers => { + default => [ sub { $result .= join("",@_); }, "skipped_text,text" ] + } +)->parse($doc)->eof; +is($doc, $result); + +$text = ""; +$p = HTML::Parser->new( + text_h => [sub { $text .= shift }, "dtext"], + marked_sections => 1, +); + +$p->parse(""); +is($text, "foo [1]", "CDATA text ending in square bracket"); + +} # SKIP diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/msie-compat.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/msie-compat.t new file mode 100644 index 0000000..90d4b7e --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/msie-compat.t @@ -0,0 +1,58 @@ +#!perl -w + +use strict; +use HTML::Parser; + +use Test::More tests => 2; + +my $TEXT = ""; +sub h +{ + my($event, $tagname, $text) = @_; + for ($event, $tagname, $text) { + if (defined) { + s/([\n\r\t])/sprintf "\\%03o", ord($1)/ge; + } + else { + $_ = ""; + } + } + + $TEXT .= "[$event,$tagname,$text]\n"; +} + +my $p = HTML::Parser->new(default_h => [\&h, "event,tagname,text"]); +$p->parse("
    "); +$p->parse(""); +$p->parse("' 'bar>' x>"); +$p->parse("\""); +$p->parse(" \"bar>\" x>"); +$p->parse(""); +$p->parse("\" >"); +$p->parse(" +xmp + +EOT + +my $p = HTML::Parser->new(api_version => 3); + +my $sum_len = 0; +my $count = 0; +my $err; + +$p->handler(default => + sub { + my($offset, $length, $offset_end, $line, $col, $text) = @_; + my $copy = $text; + $copy =~ s/\n/\\n/g; + substr($copy, 30) = "..." if length($copy) > 32; + #diag sprintf ">>> %d.%d %s", $line, $col, $copy; + if ($offset != $sum_len) { + diag "offset mismatch $offset vs $sum_len"; + $err++; + } + if ($offset_end != $offset + $length) { + diag "offset_end $offset_end wrong"; + $err++; + } + if ($length != length($text)) { + diag "length mismatch"; + $err++; + } + if (substr($HTML, $offset, $length) ne $text) { + diag "content mismatch"; + $err++; + } + $sum_len += $length; + $count++; + }, + 'offset,length,offset_end,line,column,text'); + +for (split(//, $HTML)) { + $p->parse($_); +} +$p->eof; + +ok($count > 5 && !$err); + + diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/options.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/options.t new file mode 100644 index 0000000..ff5f7db --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/options.t @@ -0,0 +1,36 @@ +# Test option setting methods + +use Test::More tests => 10; + +use strict; +use HTML::Parser (); + +my $p = HTML::Parser->new(api_version => 3, + xml_mode => 1); +my $old; + +$old = $p->boolean_attribute_value("foo"); +ok(!defined $old); + +$old = $p->boolean_attribute_value(); +is($old, "foo"); + +$old = $p->boolean_attribute_value(undef); +is($old, "foo"); +ok(!defined($p->boolean_attribute_value)); + +ok($p->xml_mode(0)); +ok(!$p->xml_mode); + +my $seen_buggy_comment_warning; +$SIG{__WARN__} = + sub { + local $_ = shift; + $seen_buggy_comment_warning++ + if /^netscape_buggy_comment\(\) is deprecated/; + }; + +ok(!$p->strict_comment(1)); +ok($p->strict_comment); +ok(!$p->netscape_buggy_comment); +ok($seen_buggy_comment_warning); diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parsefile.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parsefile.t new file mode 100644 index 0000000..f373f06 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parsefile.t @@ -0,0 +1,45 @@ +use Test::More tests => 6; + +my $filename = "file$$.htm"; +die "$filename is already there" if -e $filename; +open(FILE, ">$filename") || die "Can't create $filename: $!"; +print FILE <<'EOT'; close(FILE); +Heisan +EOT + +{ + package MyParser; + require HTML::Parser; + @ISA=qw(HTML::Parser); + + sub start + { + my($self, $tag, $attr) = @_; + Test::More::is($tag, "title"); + } +} + +MyParser->new->parse_file($filename); +open(FILE, $filename) || die; +MyParser->new->parse_file(*FILE); +seek(FILE, 0, 0) || die; +MyParser->new->parse_file(\*FILE); +close(FILE); + +require IO::File; +my $io = IO::File->new($filename) || die; +MyParser->new->parse_file($io); +$io->seek(0, 0) || die; +MyParser->new->parse_file(*$io); + +my $text = ''; +$io->seek(0, 0) || die; +MyParser->new( + start_h => [ sub{ shift->eof; }, "self" ], + text_h => [ sub{ $text = shift; }, "text" ])->parse_file(*$io); +ok(!$text); + +close($io); # needed because of bug in perl +undef($io); + +unlink($filename) or warn "Can't unlink $filename: $!"; diff --git a/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parser.t b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parser.t new file mode 100644 index 0000000..0ce4d95 --- /dev/null +++ b/dev/i386/libhtml-parser-perl/libhtml-parser-perl-3.56/t/parser.t @@ -0,0 +1,184 @@ +use Test::More tests => 7; + +$HTML = <<'HTML'; + + + + + +Various entities. The parser must never break them in the middle: + +/ +/ +È +௖ +￿ +å-Å + + + +

    + + and this is not. + + that Netscape hates --> + +< this > was not a tag. + + + +HTML + +#------------------------------------------------------------------- + +{ + package P; + require HTML::Parser; + @ISA=qw(HTML::Parser); + $OUT=''; + $COUNT=0; + + sub new + { + my $class = shift; + my $self = $class->SUPER::new; + $OUT = ''; + die "Can only have one" if $COUNT++; + $self; + } + + sub DESTROY + { + my $self = shift; + eval { $self->SUPER::DESTROY; }; + $COUNT--; + } + + sub declaration + { + my($self, $decl) = @_; + $OUT .= "[[$decl]]|"; + } + + sub start + { + my($self, $tag, $attr) = @_; + $attr = join("/", map "$_=$attr->{$_}", sort keys %$attr); + $attr = "/$attr" if length $attr; + $OUT .= "<<$tag$attr>>|"; + } + + sub end + { + my($self, $tag) = @_; + $OUT .= ">>$tag<<|"; + } + + sub comment + { + my($self, $comment) = @_; + $OUT .= "##$comment##|"; + } + + sub text + { + my($self, $text) = @_; + #$text =~ s/\n/\\n/g; + #$text =~ s/\t/\\t/g; + #$text =~ s/ /·/g; + $OUT .= "$text|"; + } + + sub result + { + $OUT; + } +} + +for $chunksize (64*1024, 64, 13, 3, 1, "file", "filehandle") { +#for $chunksize (1) { + if ($chunksize =~ /^file/) { + #print "Parsing from $chunksize"; + } else { + #print "Parsing using $chunksize byte chunks"; + } + my $p = P->new; + + if ($chunksize =~ /^file/) { + # First we must create the file + my $tmpfile = "tmp-$$.html"; + my $file = $tmpfile; + die "$file already exists" if -e $file; + open(FILE, ">$file") or die "Can't create $file: $!"; + binmode FILE; + print FILE $HTML; + close(FILE); + + if ($chunksize eq "filehandle") { + require FileHandle; + my $fh = FileHandle->new($file) || die "Can't open $file: $!"; + $file = $fh; + } + + # then we can parse it. + $p->parse_file($file); + close $file if $chunksize eq "filehandle"; + unlink($tmpfile) || warn "Can't unlink $tmpfile: $!"; + } else { + my $copy = $HTML; + while (length $copy) { + my $chunk = substr($copy, 0, $chunksize); + substr($copy, 0, $chunksize) = ''; + $p->parse($chunk); + } + $p->eof; + } + + my $res = $p->result; + my $bad; + + # Then we start looking for things that should not happen + if ($res =~ /\s\|\s/) { + diag "broken space"; + $bad++; + } + for ( + # Make sure entities are not broken + '/', '/', 'È', '௖', '￿', 'å', 'Å', + + # Some elements that should be produced + "|[[DOCTYPE HTML]]|", + "|## this is\na comment ##|", + "|<