From 3df72cc8383a92be91804b0f275517da27f60b20 Mon Sep 17 00:00:00 2001 From: Nito Martinez Date: Wed, 14 Apr 2010 07:38:38 +0100 Subject: [PATCH] Add the following packages libalgorithm-diff-perl libspiffy-perl libtext-diff-perl libfilter-perl libtest-base-perl --- .../libalgorithm-diff-perl-1.19.02/Changes | 47 + .../libalgorithm-diff-perl-1.19.02/MANIFEST | 13 + .../libalgorithm-diff-perl-1.19.02/META.yml | 10 + .../libalgorithm-diff-perl-1.19.02/Makefile.PL | 7 + .../libalgorithm-diff-perl-1.19.02/README | 81 + .../libalgorithm-diff-perl-1.19.02/cdiff.pl | 385 +++++ .../debian/changelog | 113 ++ .../libalgorithm-diff-perl-1.19.02/debian/compat | 1 + .../libalgorithm-diff-perl-1.19.02/debian/control | 19 + .../debian/copyright | 31 + .../libalgorithm-diff-perl-1.19.02/debian/rules | 75 + .../libalgorithm-diff-perl-1.19.02/debian/watch | 4 + .../libalgorithm-diff-perl-1.19.02/diff.pl | 47 + .../libalgorithm-diff-perl-1.19.02/diffnew.pl | 528 ++++++ .../libalgorithm-diff-perl-1.19.02/htmldiff.pl | 100 ++ .../lib/Algorithm/Diff.pm | 1713 ++++++++++++++++++++ .../lib/Algorithm/DiffOld.pm | 305 ++++ .../libalgorithm-diff-perl-1.19.02/t/base.t | 402 +++++ .../libalgorithm-diff-perl-1.19.02/t/oo.t | 212 +++ .../libalgorithm-diff-perl_1.19.02-1.diff.gz | Bin 0 -> 3250 bytes .../libalgorithm-diff-perl_1.19.02-1.dsc | 27 + .../libalgorithm-diff-perl_1.19.02-1maemo1.diff.gz | Bin 0 -> 3320 bytes .../libalgorithm-diff-perl_1.19.02-1maemo1.dsc | 13 + ...gorithm-diff-perl_1.19.02-1maemo1_armel.changes | 20 + .../libalgorithm-diff-perl_1.19.02.orig.tar.gz | Bin 0 -> 33529 bytes .../libfilter-perl-1.34/Call/Call.pm | 498 ++++++ .../libfilter-perl-1.34/Call/Call.xs | 262 +++ .../libfilter-perl-1.34/Call/Makefile.PL | 7 + .../libfilter-perl-1.34/Call/ppport.h | 286 ++++ deb-src/libfilter-perl/libfilter-perl-1.34/Changes | 292 ++++ .../libfilter-perl-1.34/Exec/Exec.pm | 40 + .../libfilter-perl-1.34/Exec/Exec.xs | 625 +++++++ .../libfilter-perl-1.34/Exec/Makefile.PL | 7 + .../libfilter-perl/libfilter-perl-1.34/MANIFEST | 49 + .../libfilter-perl/libfilter-perl-1.34/META.yml | 13 + .../libfilter-perl/libfilter-perl-1.34/Makefile.PL | 153 ++ deb-src/libfilter-perl/libfilter-perl-1.34/README | 76 + .../libfilter-perl-1.34/debian/changelog | 144 ++ .../libfilter-perl-1.34/debian/compat | 1 + .../libfilter-perl-1.34/debian/control | 25 + .../libfilter-perl-1.34/debian/copyright | 27 + .../libfilter-perl/libfilter-perl-1.34/debian/docs | 1 + .../libfilter-perl-1.34/debian/examples | 1 + .../libfilter-perl-1.34/debian/rules | 74 + .../libfilter-perl-1.34/debian/watch | 2 + .../libfilter-perl-1.34/decrypt/Makefile.PL | 12 + .../libfilter-perl-1.34/decrypt/decr | 70 + .../libfilter-perl-1.34/decrypt/decrypt.pm | 115 ++ .../libfilter-perl-1.34/decrypt/decrypt.xs | 321 ++++ .../libfilter-perl-1.34/decrypt/encrypt | 71 + .../libfilter-perl-1.34/examples/closure/Count.pm | 32 + .../examples/closure/Decompress.pm | 33 + .../examples/closure/Include.pm | 38 + .../examples/closure/Joe2Jim.pm | 23 + .../examples/closure/NewSubst.pm | 37 + .../libfilter-perl-1.34/examples/closure/Subst.pm | 24 + .../examples/closure/UUdecode.pm | 52 + .../libfilter-perl-1.34/examples/filtdef | 37 + .../libfilter-perl-1.34/examples/filtuu | 6 + .../libfilter-perl-1.34/examples/method/Count.pm | 34 + .../examples/method/Decompress.pm | 36 + .../libfilter-perl-1.34/examples/method/Joe2Jim.pm | 26 + .../examples/method/NewSubst.pm | 43 + .../libfilter-perl-1.34/examples/method/Subst.pm | 30 + .../examples/method/UUdecode.pm | 54 + .../libfilter-perl-1.34/filter-util.pl | 55 + .../libfilter-perl-1.34/lib/Filter/cpp.pm | 126 ++ .../libfilter-perl-1.34/lib/Filter/exec.pm | 71 + .../libfilter-perl-1.34/lib/Filter/sh.pm | 78 + deb-src/libfilter-perl/libfilter-perl-1.34/mytest | 10 + .../libfilter-perl-1.34/perlfilter.pod | 573 +++++++ .../libfilter-perl/libfilter-perl-1.34/t/call.t | 824 ++++++++++ deb-src/libfilter-perl/libfilter-perl-1.34/t/cpp.t | 84 + .../libfilter-perl/libfilter-perl-1.34/t/decrypt.t | 111 ++ .../libfilter-perl/libfilter-perl-1.34/t/exec.t | 75 + .../libfilter-perl/libfilter-perl-1.34/t/order.t | 70 + deb-src/libfilter-perl/libfilter-perl-1.34/t/pod.t | 18 + deb-src/libfilter-perl/libfilter-perl-1.34/t/sh.t | 75 + deb-src/libfilter-perl/libfilter-perl-1.34/t/tee.t | 76 + .../libfilter-perl-1.34/tee/Makefile.PL | 7 + .../libfilter-perl/libfilter-perl-1.34/tee/tee.pm | 50 + .../libfilter-perl/libfilter-perl-1.34/tee/tee.xs | 63 + .../libfilter-perl/libfilter-perl_1.34-1.diff.gz | Bin 0 -> 3714 bytes deb-src/libfilter-perl/libfilter-perl_1.34-1.dsc | 24 + .../libfilter-perl_1.34-1maemo1.diff.gz | Bin 0 -> 3794 bytes .../libfilter-perl/libfilter-perl_1.34-1maemo1.dsc | 11 + .../libfilter-perl_1.34-1maemo1_armel.changes | 20 + .../libfilter-perl/libfilter-perl_1.34.orig.tar.gz | Bin 0 -> 40756 bytes deb-src/libspiffy-perl/libspiffy-perl-0.30/Changes | 133 ++ .../libspiffy-perl/libspiffy-perl-0.30/MANIFEST | 50 + .../libspiffy-perl/libspiffy-perl-0.30/META.yml | 16 + .../libspiffy-perl/libspiffy-perl-0.30/Makefile.PL | 10 + deb-src/libspiffy-perl/libspiffy-perl-0.30/README | 489 ++++++ .../libspiffy-perl-0.30/debian/changelog | 56 + .../libspiffy-perl-0.30/debian/compat | 1 + .../libspiffy-perl-0.30/debian/control | 34 + .../libspiffy-perl-0.30/debian/copyright | 20 + .../libspiffy-perl-0.30/debian/rules | 64 + .../libspiffy-perl-0.30/debian/watch | 2 + .../libspiffy-perl-0.30/inc/Module/Install.pm | 222 +++ .../libspiffy-perl-0.30/inc/Module/Install/Base.pm | 63 + .../libspiffy-perl-0.30/inc/Module/Install/Can.pm | 69 + .../inc/Module/Install/Fetch.pm | 86 + .../inc/Module/Install/Makefile.pm | 157 ++ .../inc/Module/Install/Metadata.pm | 301 ++++ .../inc/Module/Install/Win32.pm | 63 + .../inc/Module/Install/WriteAll.pm | 36 + .../libspiffy-perl-0.30/lib/Spiffy.pm | 1066 ++++++++++++ .../libspiffy-perl-0.30/t/Filter4.pm | 23 + .../libspiffy-perl-0.30/t/Filter5.pm | 10 + .../libspiffy-perl-0.30/t/NonSpiffy.pm | 5 + .../libspiffy-perl-0.30/t/Something.pm | 11 + .../libspiffy-perl/libspiffy-perl-0.30/t/Thing.pm | 11 + .../libspiffy-perl-0.30/t/autoload.t | 31 + .../libspiffy-perl/libspiffy-perl-0.30/t/base.t | 64 + .../libspiffy-perl/libspiffy-perl-0.30/t/base2.t | 10 + .../libspiffy-perl/libspiffy-perl-0.30/t/cascade.t | 37 + .../libspiffy-perl/libspiffy-perl-0.30/t/const.t | 15 + .../libspiffy-perl/libspiffy-perl-0.30/t/early.t | 16 + .../libspiffy-perl/libspiffy-perl-0.30/t/export1.t | 28 + .../libspiffy-perl/libspiffy-perl-0.30/t/export2.t | 25 + .../libspiffy-perl/libspiffy-perl-0.30/t/export3.t | 27 + .../libspiffy-perl/libspiffy-perl-0.30/t/export4.t | 56 + .../libspiffy-perl/libspiffy-perl-0.30/t/export5.t | 24 + .../libspiffy-perl/libspiffy-perl-0.30/t/export6.t | 16 + .../libspiffy-perl/libspiffy-perl-0.30/t/export7.t | 17 + .../libspiffy-perl-0.30/t/exporter.t | 9 + .../libspiffy-perl/libspiffy-perl-0.30/t/field.t | 21 + .../libspiffy-perl/libspiffy-perl-0.30/t/field2.t | 22 + .../libspiffy-perl/libspiffy-perl-0.30/t/field3.t | 95 ++ .../libspiffy-perl/libspiffy-perl-0.30/t/filter.t | 24 + .../libspiffy-perl/libspiffy-perl-0.30/t/filter2.t | 27 + .../libspiffy-perl/libspiffy-perl-0.30/t/filter3.t | 23 + .../libspiffy-perl/libspiffy-perl-0.30/t/filter4.t | 36 + .../libspiffy-perl/libspiffy-perl-0.30/t/filter5.t | 23 + .../libspiffy-perl/libspiffy-perl-0.30/t/mixin.t | 36 + .../libspiffy-perl/libspiffy-perl-0.30/t/mixin2.t | 71 + .../libspiffy-perl/libspiffy-perl-0.30/t/mixin3.t | 15 + deb-src/libspiffy-perl/libspiffy-perl-0.30/t/new.t | 20 + .../libspiffy-perl/libspiffy-perl-0.30/t/package.t | 11 + .../libspiffy-perl/libspiffy-perl-0.30/t/parse.t | 9 + .../libspiffy-perl/libspiffy-perl-0.30/t/stub.t | 17 + .../libspiffy-perl/libspiffy-perl-0.30/t/super.t | 55 + .../libspiffy-perl/libspiffy-perl-0.30/t/super2.t | 60 + .../libspiffy-perl/libspiffy-perl_0.30-1.diff.gz | Bin 0 -> 2922 bytes deb-src/libspiffy-perl/libspiffy-perl_0.30-1.dsc | 33 + .../libspiffy-perl_0.30-1maemo1.diff.gz | Bin 0 -> 2999 bytes .../libspiffy-perl/libspiffy-perl_0.30-1maemo1.dsc | 13 + .../libspiffy-perl_0.30-1maemo1_armel.changes | 20 + .../libspiffy-perl/libspiffy-perl_0.30.orig.tar.gz | Bin 0 -> 27631 bytes .../libtest-base-perl-0.54/Changes | 285 ++++ .../libtest-base-perl-0.54/MANIFEST | 126 ++ .../libtest-base-perl-0.54/META.yml | 16 + .../libtest-base-perl-0.54/Makefile.PL | 13 + .../libtest-base-perl-0.54/README | 630 +++++++ .../libtest-base-perl-0.54/debian/changelog | 45 + .../libtest-base-perl-0.54/debian/compat | 1 + .../libtest-base-perl-0.54/debian/control | 45 + .../libtest-base-perl-0.54/debian/copyright | 15 + .../libtest-base-perl-0.54/debian/rules | 23 + .../libtest-base-perl-0.54/debian/watch | 2 + .../libtest-base-perl-0.54/inc/Module/Install.pm | 281 ++++ .../inc/Module/Install/Base.pm | 70 + .../inc/Module/Install/Can.pm | 82 + .../inc/Module/Install/Fetch.pm | 93 ++ .../inc/Module/Install/Makefile.pm | 208 +++ .../inc/Module/Install/Metadata.pm | 315 ++++ .../inc/Module/Install/Win32.pm | 65 + .../inc/Module/Install/WriteAll.pm | 43 + .../lib/Module/Install/TestBase.pm | 67 + .../libtest-base-perl-0.54/lib/Test/Base.pm | 1328 +++++++++++++++ .../libtest-base-perl-0.54/lib/Test/Base/Filter.pm | 639 ++++++++ .../libtest-base-perl-0.54/t/BaseTest.pm | 6 + .../libtest-base-perl-0.54/t/Subclass.pm | 2 + .../libtest-base-perl-0.54/t/Test-Less/index.txt | 15 + .../libtest-base-perl-0.54/t/TestA.pm | 2 + .../libtest-base-perl-0.54/t/TestB.pm | 2 + .../libtest-base-perl-0.54/t/TestBass.pm | 30 + .../libtest-base-perl-0.54/t/TestC.pm | 2 + .../libtest-base-perl-0.54/t/append.t | 36 + .../libtest-base-perl-0.54/t/arguments.t | 23 + .../libtest-base-perl-0.54/t/array.t | 12 + .../libtest-base-perl-0.54/t/autoload.t | 17 + .../libtest-base-perl-0.54/t/base64.t | 34 + .../libtest-base-perl-0.54/t/blocks-scalar.t | 24 + .../libtest-base-perl-0.54/t/blocks_grep.t | 34 + .../libtest-base-perl-0.54/t/chomp.t | 29 + .../libtest-base-perl-0.54/t/chop.t | 30 + .../libtest-base-perl-0.54/t/compact.t | 56 + .../libtest-base-perl-0.54/t/compile.t | 3 + .../libtest-base-perl-0.54/t/delimiters.t | 22 + .../libtest-base-perl-0.54/t/description.t | 30 + .../libtest-base-perl-0.54/t/diff_is.t | 112 ++ .../libtest-base-perl-0.54/t/dos_spec | 16 + .../libtest-base-perl-0.54/t/dumper.t | 35 + .../libtest-base-perl-0.54/t/embed_perl.t | 28 + .../libtest-base-perl-0.54/t/escape.t | 17 + .../libtest-base-perl-0.54/t/eval.t | 25 + .../libtest-base-perl-0.54/t/eval_all.t | 25 + .../libtest-base-perl-0.54/t/eval_stderr.t | 14 + .../libtest-base-perl-0.54/t/eval_stdout.t | 14 + .../libtest-base-perl-0.54/t/export.t | 49 + .../libtest-base-perl-0.54/t/filter_arguments.t | 23 + .../libtest-base-perl-0.54/t/filter_delay.t | 30 + .../libtest-base-perl-0.54/t/filter_functions.t | 23 + .../libtest-base-perl-0.54/t/filters-append.t | 19 + .../libtest-base-perl-0.54/t/filters.t | 25 + .../libtest-base-perl-0.54/t/filters_map.t | 42 + .../libtest-base-perl-0.54/t/first_block.t | 24 + .../libtest-base-perl-0.54/t/flatten.t | 46 + .../libtest-base-perl-0.54/t/get_url.t | 12 + .../libtest-base-perl-0.54/t/hash.t | 17 + .../libtest-base-perl-0.54/t/head.t | 19 + .../libtest-base-perl-0.54/t/internals.t | 137 ++ .../libtest-base-perl-0.54/t/is.t | 13 + .../libtest-base-perl-0.54/t/jit-run.t | 29 + .../libtest-base-perl-0.54/t/join-deep.t | 31 + .../libtest-base-perl-0.54/t/join.t | 24 + .../libtest-base-perl-0.54/t/last.t | 33 + .../libtest-base-perl-0.54/t/late.t | 34 + .../libtest-base-perl-0.54/t/lazy-filters.t | 24 + .../libtest-base-perl-0.54/t/lines.t | 36 + .../libtest-base-perl-0.54/t/list.t | 44 + .../libtest-base-perl-0.54/t/main_filters.t | 63 + .../libtest-base-perl-0.54/t/multi-level-inherit.t | 15 + .../libtest-base-perl-0.54/t/name.t | 20 + .../libtest-base-perl-0.54/t/next.t | 21 + .../libtest-base-perl-0.54/t/no_diff.t | 6 + .../libtest-base-perl-0.54/t/no_plan.t | 5 + .../libtest-base-perl-0.54/t/normalize.t | 10 + .../libtest-base-perl-0.54/t/only-with-implicit.t | 14 + .../libtest-base-perl-0.54/t/only.t | 19 + .../libtest-base-perl-0.54/t/oo.t | 33 + .../libtest-base-perl-0.54/t/oo_run.t | 23 + .../libtest-base-perl-0.54/t/parentheses.t | 34 + .../libtest-base-perl-0.54/t/prepend.t | 38 + .../libtest-base-perl-0.54/t/preserve-order.t | 34 + .../libtest-base-perl-0.54/t/prototypes.t | 7 + .../libtest-base-perl-0.54/t/quick-plan.t | 16 + .../libtest-base-perl-0.54/t/quick_test.t | 15 + .../libtest-base-perl-0.54/t/read_file.t | 15 + .../libtest-base-perl-0.54/t/regexp.t | 39 + .../libtest-base-perl-0.54/t/repeated-filters.t | 14 + .../libtest-base-perl-0.54/t/require.t | 7 + .../libtest-base-perl-0.54/t/reserved_names.t | 56 + .../libtest-base-perl-0.54/t/reverse-deep.t | 42 + .../libtest-base-perl-0.54/t/reverse.t | 16 + .../libtest-base-perl-0.54/t/run-args.t | 9 + .../libtest-base-perl-0.54/t/run_compare.t | 17 + .../libtest-base-perl-0.54/t/run_is.t | 38 + .../libtest-base-perl-0.54/t/run_is_deeply.t | 18 + .../libtest-base-perl-0.54/t/run_like.t | 24 + .../libtest-base-perl-0.54/t/run_unlike.t | 20 + .../libtest-base-perl-0.54/t/sample-file.txt | 2 + .../libtest-base-perl-0.54/t/simple.t | 30 + .../libtest-base-perl-0.54/t/skip.t | 25 + .../libtest-base-perl-0.54/t/slice.t | 33 + .../libtest-base-perl-0.54/t/sort-deep.t | 16 + .../libtest-base-perl-0.54/t/sort.t | 12 + .../libtest-base-perl-0.54/t/spec1 | 14 + .../libtest-base-perl-0.54/t/spec2 | 10 + .../libtest-base-perl-0.54/t/spec_file.t | 18 + .../libtest-base-perl-0.54/t/spec_string.t | 29 + .../libtest-base-perl-0.54/t/split-deep.t | 14 + .../libtest-base-perl-0.54/t/split-regexp.t | 18 + .../libtest-base-perl-0.54/t/split.t | 37 + .../libtest-base-perl-0.54/t/strict-warnings.t | 6 + .../libtest-base-perl-0.54/t/strict-warnings.test | 3 + .../libtest-base-perl-0.54/t/strict.t | 11 + .../libtest-base-perl-0.54/t/subclass-autoclass.t | 38 + .../libtest-base-perl-0.54/t/subclass-import.t | 4 + .../libtest-base-perl-0.54/t/subclass.t | 35 + .../libtest-base-perl-0.54/t/subclass_late.t | 13 + .../libtest-base-perl-0.54/t/tail.t | 19 + .../libtest-base-perl-0.54/t/tie_output.t | 21 + .../libtest-base-perl-0.54/t/trim.t | 38 + .../libtest-base-perl-0.54/t/unchomp.t | 12 + .../libtest-base-perl-0.54/t/use-test-more.t | 3 + .../libtest-base-perl-0.54/t/write_file.t | 24 + .../libtest-base-perl-0.54/t/xxx.t | 24 + .../libtest-base-perl-0.54/t/yaml.t | 50 + .../libtest-base-perl-0.54/t/zero-blocks.t | 9 + .../libtest-base-perl_0.54-1.diff.gz | Bin 0 -> 2270 bytes .../libtest-base-perl/libtest-base-perl_0.54-1.dsc | 33 + .../libtest-base-perl_0.54.orig.tar.gz | Bin 0 -> 45525 bytes .../libtext-diff-perl-0.35/Changes | 42 + .../libtext-diff-perl-0.35/MANIFEST | 12 + .../libtext-diff-perl-0.35/MANIFEST.SKIP | 10 + .../libtext-diff-perl-0.35/Makefile.PL | 20 + .../libtext-diff-perl-0.35/debian/changelog | 41 + .../libtext-diff-perl-0.35/debian/compat | 1 + .../libtext-diff-perl-0.35/debian/control | 19 + .../libtext-diff-perl-0.35/debian/copyright | 18 + .../libtext-diff-perl-0.35/debian/rules | 53 + .../libtext-diff-perl-0.35/debian/watch | 2 + .../libtext-diff-perl-0.35/lib/Text/Diff.pm | 725 +++++++++ .../libtext-diff-perl-0.35/lib/Text/Diff/Table.pm | 411 +++++ .../libtext-diff-perl-0.35/t/ext_format.t | 74 + .../libtext-diff-perl-0.35/t/general.t | 275 ++++ .../libtext-diff-perl-0.35/t/inputs.t | 64 + .../libtext-diff-perl-0.35/t/keygen.t | 25 + .../libtext-diff-perl-0.35/t/outputs.t | 49 + .../libtext-diff-perl-0.35/t/table.t | 32 + .../libtext-diff-perl_0.35-3.diff.gz | Bin 0 -> 2174 bytes .../libtext-diff-perl/libtext-diff-perl_0.35-3.dsc | 27 + .../libtext-diff-perl_0.35-3maemo1.diff.gz | Bin 0 -> 2239 bytes .../libtext-diff-perl_0.35-3maemo1.dsc | 13 + .../libtext-diff-perl_0.35-3maemo1_armel.changes | 20 + .../libtext-diff-perl_0.35.orig.tar.gz | Bin 0 -> 14746 bytes .../libalgorithm-diff-perl_1.19.02-1maemo1_all.deb | Bin 0 -> 51688 bytes .../libfilter-perl_1.34-1maemo1_armel.deb | Bin 0 -> 71078 bytes .../libspiffy-perl_0.30-1maemo1_all.deb | Bin 0 -> 26018 bytes .../libtext-diff-perl_0.35-3maemo1_all.deb | Bin 0 -> 23710 bytes 313 files changed, 23298 insertions(+) create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Changes create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/MANIFEST create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/META.yml create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Makefile.PL create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/README create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/cdiff.pl create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/changelog create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/compat create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/control create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/copyright create mode 100755 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/rules create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/watch create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diff.pl create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diffnew.pl create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/htmldiff.pl create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/Diff.pm create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/DiffOld.pm create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/base.t create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/oo.t create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1.diff.gz create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1.dsc create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.diff.gz create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.dsc create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1_armel.changes create mode 100644 deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02.orig.tar.gz create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.xs create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/Call/Makefile.PL create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Call/ppport.h create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Changes create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.xs create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Makefile.PL create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/MANIFEST create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/META.yml create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/Makefile.PL create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/README create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/changelog create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/compat create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/control create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/copyright create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/docs create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/examples create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/debian/rules create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/debian/watch create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/Makefile.PL create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decr create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.xs create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/encrypt create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Count.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Decompress.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Include.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Joe2Jim.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/NewSubst.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Subst.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/UUdecode.pm create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtdef create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtuu create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Count.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Decompress.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Joe2Jim.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/NewSubst.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Subst.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/UUdecode.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/filter-util.pl create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/cpp.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/exec.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/sh.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/mytest create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/perlfilter.pod create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/call.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/cpp.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/decrypt.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/exec.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/order.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/pod.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/sh.t create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/t/tee.t create mode 100755 deb-src/libfilter-perl/libfilter-perl-1.34/tee/Makefile.PL create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.pm create mode 100644 deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.xs create mode 100644 deb-src/libfilter-perl/libfilter-perl_1.34-1.diff.gz create mode 100644 deb-src/libfilter-perl/libfilter-perl_1.34-1.dsc create mode 100644 deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1.diff.gz create mode 100644 deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1.dsc create mode 100644 deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1_armel.changes create mode 100644 deb-src/libfilter-perl/libfilter-perl_1.34.orig.tar.gz create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/Changes create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/MANIFEST create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/META.yml create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/Makefile.PL create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/README create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/changelog create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/compat create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/control create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/copyright create mode 100755 deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/rules create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/watch create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Base.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Can.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Fetch.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Makefile.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Metadata.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Win32.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/WriteAll.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/lib/Spiffy.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter4.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter5.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/NonSpiffy.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Something.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Thing.pm create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/autoload.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base2.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/cascade.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/const.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/early.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export1.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export2.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export3.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export4.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export5.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export6.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export7.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/exporter.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field2.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field3.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter2.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter3.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter4.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter5.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin2.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin3.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/new.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/package.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/parse.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/stub.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super2.t create mode 100644 deb-src/libspiffy-perl/libspiffy-perl_0.30-1.diff.gz create mode 100644 deb-src/libspiffy-perl/libspiffy-perl_0.30-1.dsc create mode 100644 deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1.diff.gz create mode 100644 deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1.dsc create mode 100644 deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1_armel.changes create mode 100644 deb-src/libspiffy-perl/libspiffy-perl_0.30.orig.tar.gz create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/Changes create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/MANIFEST create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/META.yml create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/Makefile.PL create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/README create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/changelog create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/compat create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/control create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/copyright create mode 100755 deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/rules create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/watch create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Base.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Can.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Fetch.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Makefile.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Metadata.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Win32.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/WriteAll.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Module/Install/TestBase.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base/Filter.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/BaseTest.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Subclass.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Test-Less/index.txt create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestA.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestB.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestBass.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestC.pm create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/append.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/arguments.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/array.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/autoload.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/base64.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks-scalar.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks_grep.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chomp.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chop.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compact.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compile.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/delimiters.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/description.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/diff_is.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/dos_spec create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/dumper.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/embed_perl.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/escape.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_all.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stderr.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stdout.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/export.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_arguments.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_delay.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_functions.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters-append.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters_map.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/first_block.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/flatten.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/get_url.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/hash.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/head.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/internals.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/is.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/jit-run.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join-deep.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/last.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/late.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lazy-filters.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lines.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/list.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/main_filters.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/multi-level-inherit.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/name.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/next.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_diff.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_plan.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/normalize.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only-with-implicit.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo_run.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/parentheses.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prepend.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/preserve-order.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prototypes.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick-plan.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick_test.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/read_file.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/regexp.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/repeated-filters.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/require.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reserved_names.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse-deep.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run-args.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_compare.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is_deeply.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_like.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_unlike.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sample-file.txt create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/simple.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/skip.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/slice.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort-deep.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec1 create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec2 create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_file.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_string.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-deep.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-regexp.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.test create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-autoclass.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-import.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass_late.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tail.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tie_output.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/trim.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/unchomp.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/use-test-more.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/write_file.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/xxx.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/yaml.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl-0.54/t/zero-blocks.t create mode 100644 deb-src/libtest-base-perl/libtest-base-perl_0.54-1.diff.gz create mode 100644 deb-src/libtest-base-perl/libtest-base-perl_0.54-1.dsc create mode 100644 deb-src/libtest-base-perl/libtest-base-perl_0.54.orig.tar.gz create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/Changes create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST.SKIP create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/Makefile.PL create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/changelog create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/compat create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/control create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/copyright create mode 100755 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/rules create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/watch create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/lib/Text/Diff.pm create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/lib/Text/Diff/Table.pm create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/t/ext_format.t create mode 100755 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/t/general.t create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/t/inputs.t create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/t/keygen.t create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/t/outputs.t create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl-0.35/t/table.t create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl_0.35-3.diff.gz create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl_0.35-3.dsc create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl_0.35-3maemo1.diff.gz create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl_0.35-3maemo1.dsc create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl_0.35-3maemo1_armel.changes create mode 100644 deb-src/libtext-diff-perl/libtext-diff-perl_0.35.orig.tar.gz create mode 100644 deb/pool/main/liba/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1_all.deb create mode 100644 deb/pool/main/libf/libfilter-perl/libfilter-perl_1.34-1maemo1_armel.deb create mode 100644 deb/pool/main/libs/libspiffy-perl/libspiffy-perl_0.30-1maemo1_all.deb create mode 100644 deb/pool/main/libt/libtext-diff-perl/libtext-diff-perl_0.35-3maemo1_all.deb diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Changes b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Changes new file mode 100644 index 0000000..19c58b4 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Changes @@ -0,0 +1,47 @@ +Revision history for Perl module Algorithm::Diff. + +1.19_02 2006-07-31 +- Fix typo in @EXPORT_OK (s/LCDidx/LCSidx/) (RT 8576) +- Use 'printf' in example code, not 'sprintf' nor 'sprint' (RT 16067) +- DiffOld wasn't passing extra arguments to compare routine (RT 20650) + +1.19 2004-09-22 +- Added OO interface. +- Based on Ned's v1.18 (unreleased) + +1.13 Sun Mar 24 16:05:32 PST 2002 +- sdiff and traverse_balanced added by Mike Schilli . + +1.11 Thu Jul 12 12:52:18 PDT 2001 +- Added A_FINISHED and B_FINISHED per docs +- Called user callback function from keygen properly + +1.10 July 7 2000 +- Uploaded to CPAN +- More optimizations +- Added Algorithm::DiffOld + +1.08 +- Fixed bug with binary search that was making diff output too big + +1.06 Wed Jun 14 14:15:31 PDT 2000 +- First CPAN version by NEDKONZ +- Added MJD's list info to README + +1.05 Sun Jun 11 15:17:05 PDT 2000 +- Changed version label string. +- Put MJD's PPT diff version into this distribution as diffnew.pl + +1.04 Added documentation. + +1.03 Working version + +1.01 First version by Ned Konz. +- Total re-write to cure problems with memory usage and speed. + Now takes only a few seconds and less than three megabytes + to compare two 4000-line files. + +- Changed optional callback function reference from being equality + function to being key (hash) generation function. + +0.59 Last version maintained by Mark-Jason Dominus diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/MANIFEST b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/MANIFEST new file mode 100644 index 0000000..8e139c8 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/MANIFEST @@ -0,0 +1,13 @@ +Changes +lib/Algorithm/Diff.pm Algorithm::Diff perl module +lib/Algorithm/DiffOld.pm Algorithm::Diff perl module with old behavior +Makefile.PL +MANIFEST +README +t/base.t Basic test script +t/oo.t OO interface test script +cdiff.pl Context diff utility +diff.pl Simple Unix diff utility written in Perl +diffnew.pl Full-featured Unix diff utility written in Perl +htmldiff.pl Sample using traverse_sequences +META.yml Module meta-data (added by MakeMaker) diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/META.yml b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/META.yml new file mode 100644 index 0000000..57c174f --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/META.yml @@ -0,0 +1,10 @@ +# http://module-build.sourceforge.net/META-spec.html +#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# +name: Algorithm-Diff +version: 1.1902 +version_from: lib/Algorithm/Diff.pm +installdirs: site +requires: + +distribution_type: module +generated_by: ExtUtils::MakeMaker version 6.17 diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Makefile.PL b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/Makefile.PL new file mode 100644 index 0000000..253f1df --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/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' => 'Algorithm::Diff', + 'VERSION_FROM' => 'lib/Algorithm/Diff.pm', # finds $VERSION +); diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/README b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/README new file mode 100644 index 0000000..f12a0f4 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/README @@ -0,0 +1,81 @@ +This is a module for computing the difference between two files, two +strings, or any other two lists of things. It uses an intelligent +algorithm similar to (or identical to) the one used by the Unix "diff" +program. It is guaranteed to find the *smallest possible* set of +differences. + +This package contains a few parts. + +Algorithm::Diff is the module that contains several interfaces for which +computing the differences betwen two lists. + +The several "diff" programs also included in this package use +Algorithm::Diff to find the differences and then they format the output. + +Algorithm::Diff also includes some other useful functions such as "LCS", +which computes the longest common subsequence of two lists. + +A::D is suitable for many uses. You can use it for finding the smallest +set of differences between two strings, or for computing the most +efficient way to update the screen if you were replacing "curses". + +Algorithm::DiffOld is a previous version of the module which is included +primarilly for those wanting to use a custom comparison function rather +than a key generating function (and who don't mind the significant +performance penalty of perhaps 20-fold). + +diff.pl implements a "diff" in Perl that is as simple as (was +previously) possible so that you can see how it works. The output +format is not compatible with regular "diff". It needs to be +reimplemented using the OO interface to greatly simplify the code. + +diffnew.pl implements a "diff" in Perl with full bells and whistles. By +Mark-Jason, with code from cdiff.pl included. + +cdiff.pl implements "diff" that generates real context diffs in either +traditional format or GNU unified format. Original contextless +"context" diff supplied by Christian Murphy. Modifications to make it +into a real full-featured diff with -c and -u options supplied by Amir +D. Karger. + +Yes, you can use this program to generate patches. + +OTHER RESOURCES + +"Longest Common Subsequences", at +http://www.ics.uci.edu/~eppstein/161/960229.html + +This code was adapted from the Smalltalk code of Mario Wolczko +, which is available at +ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st + +THANKS SECTION + +Thanks to Ned Konz's for rewriting the module to greatly improve +performance, for maintaining it over the years, and for readilly handing +it over to me so I could plod along with my improvements. + +(From Ned Konz's earlier versions): + +Thanks to Mark-Jason Dominus for doing the original Perl version and +maintaining it over the last couple of years. Mark-Jason has been a huge +contributor to the Perl community and CPAN; it's because of people like +him that Perl has become a success. + +Thanks to Mario Wolczko for writing and making +publicly available his Smalltalk version of diff, which this Perl +version is heavily based on. + +Thanks to Mike Schilli for writing sdiff and +traverse_balanced and making them available for the Algorithm::Diff +distribution. + +(From Mark-Jason Dominus' earlier versions): + +Huge thanks to Amir Karger for adding full context diff supprt to +"cdiff.pl", and then for waiting patiently for five months while I let +it sit in a closet and didn't release it. Thank you thank you thank +you, Amir! + +Thanks to Christian Murphy for adding the first context diff format +support to "cdiff.pl". diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/cdiff.pl b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/cdiff.pl new file mode 100644 index 0000000..7c9140b --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/cdiff.pl @@ -0,0 +1,385 @@ +#!/usr/bin/perl -w +# +# `Diff' program in Perl +# Copyright 1998 M-J. Dominus. (mjd-perl-diff@plover.com) +# +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. +# +# Altered to output in `context diff' format (but without context) +# September 1998 Christian Murphy (cpm@muc.de) +# +# Command-line arguments and context lines feature added +# September 1998 Amir D. Karger (karger@bead.aecom.yu.edu) +# +# In this file, "item" usually means "line of text", and "item number" usually +# means "line number". But theoretically the code could be used more generally +use strict; + +use Algorithm::Diff qw(diff); +use File::stat; +use vars qw ($opt_C $opt_c $opt_u $opt_U); +use Getopt::Std; + +my $usage = << "ENDUSAGE"; +Usage: $0 [{-c | -u}] [{-C | -U} lines] oldfile newfile + -c will do a context diff with 3 lines of context + -C will do a context diff with 'lines' lines of context + -u will do a unified diff with 3 lines of context + -U will do a unified diff with 'lines' lines of context +ENDUSAGE + +getopts('U:C:cu') or bag("$usage"); +bag("$usage") unless @ARGV == 2; +my ($file1, $file2) = @ARGV; +if (defined $opt_C || defined $opt_c) { + $opt_c = ""; # -c on if -C given on command line + $opt_u = undef; +} elsif (defined $opt_U || defined $opt_u) { + $opt_u = ""; # -u on if -U given on command line + $opt_c = undef; +} else { + $opt_c = ""; # by default, do context diff, not old diff +} + +my ($char1, $char2); # string to print before file names +my $Context_Lines; # lines of context to print +if (defined $opt_c) { + $Context_Lines = defined $opt_C ? $opt_C : 3; + $char1 = '*' x 3; $char2 = '-' x 3; +} elsif (defined $opt_u) { + $Context_Lines = defined $opt_U ? $opt_U : 3; + $char1 = '-' x 3; $char2 = '+' x 3; +} + +# After we've read up to a certain point in each file, the number of items +# we've read from each file will differ by $FLD (could be 0) +my $File_Length_Difference = 0; + +open (F1, $file1) or bag("Couldn't open $file1: $!"); +open (F2, $file2) or bag("Couldn't open $file2: $!"); +my (@f1, @f2); +chomp(@f1 = ); +close F1; +chomp(@f2 = ); +close F2; + +# diff yields lots of pieces, each of which is basically a Block object +my $diffs = diff(\@f1, \@f2); +exit 0 unless @$diffs; + +my $st = stat($file1); +print "$char1 $file1\t", scalar localtime($st->mtime), "\n"; +$st = stat($file2); +print "$char2 $file2\t", scalar localtime($st->mtime), "\n"; + +my ($hunk,$oldhunk); +# Loop over hunks. If a hunk overlaps with the last hunk, join them. +# Otherwise, print out the old one. +foreach my $piece (@$diffs) { + $hunk = new Hunk ($piece, $Context_Lines); + next unless $oldhunk; + + if ($hunk->does_overlap($oldhunk)) { + $hunk->prepend_hunk($oldhunk); + } else { + $oldhunk->output_diff(\@f1, \@f2); + } + +} continue { + $oldhunk = $hunk; +} + +# print the last hunk +$oldhunk->output_diff(\@f1, \@f2); +exit 1; +# END MAIN PROGRAM + +sub bag { + my $msg = shift; + $msg .= "\n"; + warn $msg; + exit 2; +} + +# Package Hunk. A Hunk is a group of Blocks which overlap because of the +# context surrounding each block. (So if we're not using context, every +# hunk will contain one block.) +{ +package Hunk; + +sub new { +# Arg1 is output from &LCS::diff (which corresponds to one Block) +# Arg2 is the number of items (lines, e.g.,) of context around each block +# +# This subroutine changes $File_Length_Difference +# +# Fields in a Hunk: +# blocks - a list of Block objects +# start - index in file 1 where first block of the hunk starts +# end - index in file 1 where last block of the hunk ends +# +# Variables: +# before_diff - how much longer file 2 is than file 1 due to all hunks +# until but NOT including this one +# after_diff - difference due to all hunks including this one + my ($class, $piece, $context_items) = @_; + + my $block = new Block ($piece); # this modifies $FLD! + + my $before_diff = $File_Length_Difference; # BEFORE this hunk + my $after_diff = $before_diff + $block->{"length_diff"}; + $File_Length_Difference += $block->{"length_diff"}; + + # @remove_array and @insert_array hold the items to insert and remove + # Save the start & beginning of each array. If the array doesn't exist + # though (e.g., we're only adding items in this block), then figure + # out the line number based on the line number of the other file and + # the current difference in file lenghts + my @remove_array = $block->remove; + my @insert_array = $block->insert; + my ($a1, $a2, $b1, $b2, $start1, $start2, $end1, $end2); + $a1 = @remove_array ? $remove_array[0 ]->{"item_no"} : -1; + $a2 = @remove_array ? $remove_array[-1]->{"item_no"} : -1; + $b1 = @insert_array ? $insert_array[0 ]->{"item_no"} : -1; + $b2 = @insert_array ? $insert_array[-1]->{"item_no"} : -1; + + $start1 = $a1 == -1 ? $b1 - $before_diff : $a1; + $end1 = $a2 == -1 ? $b2 - $after_diff : $a2; + $start2 = $b1 == -1 ? $a1 + $before_diff : $b1; + $end2 = $b2 == -1 ? $a2 + $after_diff : $b2; + + # At first, a hunk will have just one Block in it + my $hunk = { + "start1" => $start1, + "start2" => $start2, + "end1" => $end1, + "end2" => $end2, + "blocks" => [$block], + }; + bless $hunk, $class; + + $hunk->flag_context($context_items); + + return $hunk; +} + +# Change the "start" and "end" fields to note that context should be added +# to this hunk +sub flag_context { + my ($hunk, $context_items) = @_; + return unless $context_items; # no context + + # add context before + my $start1 = $hunk->{"start1"}; + my $num_added = $context_items > $start1 ? $start1 : $context_items; + $hunk->{"start1"} -= $num_added; + $hunk->{"start2"} -= $num_added; + + # context after + my $end1 = $hunk->{"end1"}; + $num_added = ($end1+$context_items > $#f1) ? + $#f1 - $end1 : + $context_items; + $hunk->{"end1"} += $num_added; + $hunk->{"end2"} += $num_added; +} + +# Is there an overlap between hunk arg0 and old hunk arg1? +# Note: if end of old hunk is one less than beginning of second, they overlap +sub does_overlap { + my ($hunk, $oldhunk) = @_; + return "" unless $oldhunk; # first time through, $oldhunk is empty + + # Do I actually need to test both? + return ($hunk->{"start1"} - $oldhunk->{"end1"} <= 1 || + $hunk->{"start2"} - $oldhunk->{"end2"} <= 1); +} + +# Prepend hunk arg1 to hunk arg0 +# Note that arg1 isn't updated! Only arg0 is. +sub prepend_hunk { + my ($hunk, $oldhunk) = @_; + + $hunk->{"start1"} = $oldhunk->{"start1"}; + $hunk->{"start2"} = $oldhunk->{"start2"}; + + unshift (@{$hunk->{"blocks"}}, @{$oldhunk->{"blocks"}}); +} + + +# DIFF OUTPUT ROUTINES. THESE ROUTINES CONTAIN DIFF FORMATTING INFO... +sub output_diff { + if (defined $main::opt_u) {&output_unified_diff(@_)} + elsif (defined $main::opt_c) {&output_context_diff(@_)} + else {die "unknown diff"} +} + +sub output_unified_diff { + my ($hunk, $fileref1, $fileref2) = @_; + my @blocklist; + + # Calculate item number range. + my $range1 = $hunk->unified_range(1); + my $range2 = $hunk->unified_range(2); + print "@@ -$range1 +$range2 @@\n"; + + # Outlist starts containing the hunk of file 1. + # Removing an item just means putting a '-' in front of it. + # Inserting an item requires getting it from file2 and splicing it in. + # We splice in $num_added items. Remove blocks use $num_added because + # splicing changed the length of outlist. + # We remove $num_removed items. Insert blocks use $num_removed because + # their item numbers---corresponding to positions in file *2*--- don't take + # removed items into account. + my $low = $hunk->{"start1"}; + my $hi = $hunk->{"end1"}; + my ($num_added, $num_removed) = (0,0); + my @outlist = @$fileref1[$low..$hi]; + map {s/^/ /} @outlist; # assume it's just context + + foreach my $block (@{$hunk->{"blocks"}}) { + foreach my $item ($block->remove) { + my $op = $item->{"sign"}; # - + my $offset = $item->{"item_no"} - $low + $num_added; + $outlist[$offset] =~ s/^ /$op/; + $num_removed++; + } + foreach my $item ($block->insert) { + my $op = $item->{"sign"}; # + + my $i = $item->{"item_no"}; + my $offset = $i - $hunk->{"start2"} + $num_removed; + splice(@outlist,$offset,0,"$op$$fileref2[$i]"); + $num_added++; + } + } + + map {s/$/\n/} @outlist; # add \n's + print @outlist; + +} + +sub output_context_diff { + my ($hunk, $fileref1, $fileref2) = @_; + my @blocklist; + + print "***************\n"; + # Calculate item number range. + my $range1 = $hunk->context_range(1); + my $range2 = $hunk->context_range(2); + + # Print out file 1 part for each block in context diff format if there are + # any blocks that remove items + print "*** $range1 ****\n"; + my $low = $hunk->{"start1"}; + my $hi = $hunk->{"end1"}; + if (@blocklist = grep {$_->remove} @{$hunk->{"blocks"}}) { + my @outlist = @$fileref1[$low..$hi]; + map {s/^/ /} @outlist; # assume it's just context + foreach my $block (@blocklist) { + my $op = $block->op; # - or ! + foreach my $item ($block->remove) { + $outlist[$item->{"item_no"} - $low] =~ s/^ /$op/; + } + } + map {s/$/\n/} @outlist; # add \n's + print @outlist; + } + + print "--- $range2 ----\n"; + $low = $hunk->{"start2"}; + $hi = $hunk->{"end2"}; + if (@blocklist = grep {$_->insert} @{$hunk->{"blocks"}}) { + my @outlist = @$fileref2[$low..$hi]; + map {s/^/ /} @outlist; # assume it's just context + foreach my $block (@blocklist) { + my $op = $block->op; # + or ! + foreach my $item ($block->insert) { + $outlist[$item->{"item_no"} - $low] =~ s/^ /$op/; + } + } + map {s/$/\n/} @outlist; # add \n's + print @outlist; + } +} + +sub context_range { +# Generate a range of item numbers to print. Only print 1 number if the range +# has only one item in it. Otherwise, it's 'start,end' + my ($hunk, $flag) = @_; + my ($start, $end) = ($hunk->{"start$flag"},$hunk->{"end$flag"}); + $start++; $end++; # index from 1, not zero + my $range = ($start < $end) ? "$start,$end" : $end; + return $range; +} + +sub unified_range { +# Generate a range of item numbers to print for unified diff +# Print number where block starts, followed by number of lines in the block +# (don't print number of lines if it's 1) + my ($hunk, $flag) = @_; + my ($start, $end) = ($hunk->{"start$flag"},$hunk->{"end$flag"}); + $start++; $end++; # index from 1, not zero + my $length = $end - $start + 1; + my $first = $length < 2 ? $end : $start; # strange, but correct... + my $range = $length== 1 ? $first : "$first,$length"; + return $range; +} +} # end Package Hunk + +# Package Block. A block is an operation removing, adding, or changing +# a group of items. Basically, this is just a list of changes, where each +# change adds or deletes a single item. +# (Change could be a separate class, but it didn't seem worth it) +{ +package Block; +sub new { +# Input is a chunk from &Algorithm::LCS::diff +# Fields in a block: +# length_diff - how much longer file 2 is than file 1 due to this block +# Each change has: +# sign - '+' for insert, '-' for remove +# item_no - number of the item in the file (e.g., line number) +# We don't bother storing the text of the item +# + my ($class,$chunk) = @_; + my @changes = (); + +# This just turns each change into a hash. + foreach my $item (@$chunk) { + my ($sign, $item_no, $text) = @$item; + my $hashref = {"sign" => $sign, "item_no" => $item_no}; + push @changes, $hashref; + } + + my $block = { "changes" => \@changes }; + bless $block, $class; + + $block->{"length_diff"} = $block->insert - $block->remove; + return $block; +} + + +# LOW LEVEL FUNCTIONS +sub op { +# what kind of block is this? + my $block = shift; + my $insert = $block->insert; + my $remove = $block->remove; + + $remove && $insert and return '!'; + $remove and return '-'; + $insert and return '+'; + warn "unknown block type"; + return '^'; # context block +} + +# Returns a list of the changes in this block that remove items +# (or the number of removals if called in scalar context) +sub remove { return grep {$_->{"sign"} eq '-'} @{shift->{"changes"}}; } + +# Returns a list of the changes in this block that insert items +sub insert { return grep {$_->{"sign"} eq '+'} @{shift->{"changes"}}; } + +} # end of package Block + diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/changelog b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/changelog new file mode 100644 index 0000000..ce7d4aa --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/changelog @@ -0,0 +1,113 @@ +libalgorithm-diff-perl (1.19.02-1maemo1) fremantle; urgency=low + + * New Maemo packaging + + -- Nito Martinez Wed, 14 Apr 2010 07:09:51 +0100 + + +llibalgorithm-diff-perl (1.19.02-1) unstable; urgency=low + + * Take over for the Debian Perl Group on maintainer's request + (http://lists.debian.org/debian-perl/2008/03/msg00055.html) + * debian/control: Added: Vcs-Svn field (source stanza); Vcs-Browser + field (source stanza); Homepage field (source stanza). Changed: + Maintainer set to Debian Perl Group (was: Florian Weimer + ). + * debian/watch: add uversionmangle. + + * New upstream release (includes both patches from earlier Debian + versions: "export LCSidx" and "typo in example"). + * Set Standards-Version to 3.7.3 (no changes). + * Set debhelper compatibility level to 5 (and add debian/compat). + * debian/control: + - add /me to Uploaders + - remove Section and Priority from binary package stanza + - move debhelper to Build-Depends + * Remove debian/libalgorithm-diff-perl.dirs. + * debian/rules: update based on dh-make-perl's templates. + * debian/copyright: mention Debian Perl Group, add additional copyright + holder, use specific download URL instead of pointing to CPAN at large. + + -- gregor herrmann Sun, 09 Mar 2008 23:20:32 +0100 + +libalgorithm-diff-perl (1.19.01-2) unstable; urgency=low + + * Update debian/watch to match only relevant .tar.gz files. + * Apply patch from Martin Zobel-Helas to properly export LCSidx. + Closes: #341227. + * Fix typo in Diff.pm example (upstream bug 16067). + * Bump Standards-Version to 3.6.2.1. No changes necessary. + + -- Florian Weimer Tue, 29 Nov 2005 15:05:46 +0100 + +libalgorithm-diff-perl (1.19.01-1) unstable; urgency=low + + * New upstream release. + * Adopt the package. Closes: #274119. + + -- Florian Weimer Fri, 1 Oct 2004 10:52:39 +0200 + +libalgorithm-diff-perl (1.15-5) unstable; urgency=low + + * Rebuild so that .arch-ids/ files don't get included in the package. + + -- Michael Alan Dorman Tue, 23 Dec 2003 19:37:44 -0500 + +libalgorithm-diff-perl (1.15-4) unstable; urgency=low + + * Update standards version + * Remove examples file, since examples are being dealt with in a + different manner + + -- Michael Alan Dorman Fri, 19 Dec 2003 14:43:54 -0500 + +libalgorithm-diff-perl (1.15-3) unstable; urgency=low + + * Fix override disparity. + + -- Michael Alan Dorman Fri, 15 Aug 2003 18:40:06 -0400 + +libalgorithm-diff-perl (1.15-2) unstable; urgency=low + + * Fix some problems with the copyright statement. (closes: Bug#157538) + + -- Michael Alan Dorman Sat, 15 Mar 2003 14:12:36 -0500 + +libalgorithm-diff-perl (1.15-1) unstable; urgency=low + + * New upstream version. + + -- Michael Alan Dorman Sun, 7 Jul 2002 16:04:53 -0400 + +libalgorithm-diff-perl (1.11a-1) unstable; urgency=low + + * New upstream version (closes: bug#128190) + + -- Michael Alan Dorman Tue, 22 Jan 2002 13:12:31 -0500 + +libalgorithm-diff-perl (1.10-3) unstable; urgency=low + + * Whooops! My package somehow got screwed up, with the newer version of + the module appended to the text of the older module. Fixed. + + -- Michael Alan Dorman Sun, 15 Apr 2001 21:11:44 -0400 + +libalgorithm-diff-perl (1.10-2) unstable; urgency=low + + * Add build-depends. + * Many edits to rules file. + + -- Michael Alan Dorman Sun, 15 Apr 2001 14:39:34 -0400 + +libalgorithm-diff-perl (1.10-1) unstable; urgency=low + + * New upstream release + + -- Michael Alan Dorman Wed, 20 Sep 2000 15:31:15 -0400 + +libalgorithm-diff-perl (0.59-1) unstable; urgency=low + + * Initial packaging + + -- Michael Alan Dorman Sat, 8 Apr 2000 17:55:34 -0400 diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/compat b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/compat @@ -0,0 +1 @@ +5 diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/control b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/control new file mode 100644 index 0000000..76f5f67 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/control @@ -0,0 +1,19 @@ +Source: libalgorithm-diff-perl +Maintainer: Debian Perl Group +Uploaders: gregor herrmann +Priority: optional +Section: perl +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl (>= 5.6.0-16) +Standards-Version: 3.7.3 +Homepage: http://search.cpan.org/dist/Algorithm-Diff/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libalgorithm-diff-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libalgorithm-diff-perl/ + +Package: libalgorithm-diff-perl +Architecture: all +Depends: ${perl:Depends} +Description: a perl library for finding Longest Common Sequences in text + This module provides routines that allow one to analyze text in perl + arrays to produce a Longest Common Sequence, which can in turn be + used to produce the same information as the common Unix tool 'diff' diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/copyright b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/copyright new file mode 100644 index 0000000..dbbc0d9 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/copyright @@ -0,0 +1,31 @@ +This is Debian GNU/Linux's prepackaged version of Algorithm::Diff This +is a perl library for finding Longest Common Sequences on textual +information. + +Michael Alan Dorman originally built this package. It was later maintained +by Florian Weimer and is now taken care of by the Debian +Perl Group. + +The original sources should always be available from the Comprehensive +Perl Archive Network (CPAN): http://www.cpan.org/modules/by-module/Algorithm/ + +The only change for the Debian package was the addition of the debian/ +files. + +The Algorithm::Diff copyright is as follows: + +| Parts Copyright (c) 2000-2004 Ned Konz. All rights reserved. +| Parts by Tye McQueen. +| +| This program is free software; you can redistribute it and/or modify it +| under the same terms as Perl. + +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'. + +cdiff.pl, diff.pl, diffnw.pl: + Copyright 1998 M-J. Dominus. (mjd-perl-diff@plover.com) + This program is free software; you can redistribute it and/or modify it + under the same terms as Perl. diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/rules b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/rules new file mode 100755 index 0000000..12bb149 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/rules @@ -0,0 +1,75 @@ +#!/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 + + $(PERL) Makefile.PL INSTALLDIRS=vendor + $(MAKE) + $(MAKE) test + + touch $@ + +clean: + dh_testdir + dh_testroot + + dh_clean build-stamp install-stamp + [ ! -f Makefile ] || $(MAKE) realclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + + $(MAKE) install DESTDIR=$(TMP) PREFIX=/usr + + # remove scripts, we install them as examples later + $(RM) -fv $(TMP)/usr/share/perl5/Algorithm/*.pl + + [ ! -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 *.pl + 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 install diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/watch b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/watch new file mode 100644 index 0000000..02fa773 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/debian/watch @@ -0,0 +1,4 @@ +version=3 +# http://search.cpan.org/dist/Algorithm-Diff/ doesn't carry current versions +options=uversionmangle=s/\.(\d\d)(\d\d)/.$1.$2/ \ +http://www.cpan.org/modules/by-module/Algorithm/Algorithm-Diff-([^-]+)\.tar\.gz diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diff.pl b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diff.pl new file mode 100644 index 0000000..9bddb15 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diff.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl +# +# `Diff' program in Perl +# Copyright 1998 M-J. Dominus. (mjd-perl-diff@plover.com) +# +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. +# + +use Algorithm::Diff qw(diff); + +bag("Usage: $0 oldfile newfile") unless @ARGV == 2; + +my ($file1, $file2) = @ARGV; + +# -f $file1 or bag("$file1: not a regular file"); +# -f $file2 or bag("$file2: not a regular file"); + +-T $file1 or bag("$file1: binary"); +-T $file2 or bag("$file2: binary"); + +open (F1, $file1) or bag("Couldn't open $file1: $!"); +open (F2, $file2) or bag("Couldn't open $file2: $!"); +chomp(@f1 = ); +close F1; +chomp(@f2 = ); +close F2; + +$diffs = diff(\@f1, \@f2); +exit 0 unless @$diffs; + +foreach $chunk (@$diffs) { + + foreach $line (@$chunk) { + my ($sign, $lineno, $text) = @$line; + printf "%4d$sign %s\n", $lineno+1, $text; + } + print "--------\n"; +} +exit 1; + +sub bag { + my $msg = shift; + $msg .= "\n"; + warn $msg; + exit 2; +} diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diffnew.pl b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diffnew.pl new file mode 100644 index 0000000..492e52b --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/diffnew.pl @@ -0,0 +1,528 @@ +#!/usr/bin/perl +# +# `Diff' program in Perl +# Copyright 1998 M-J. Dominus. (mjd-perl-diff@plover.com) +# +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. +# +# Altered to output in `context diff' format (but without context) +# September 1998 Christian Murphy (cpm@muc.de) +# +# Context lines feature added +# Unified, "Old" (Standard UNIX), Ed diff added September 1998 +# Reverse_Ed (-f option) added March 1999 +# Amir D. Karger (karger@bead.aecom.yu.edu) +# +# Modular functions integrated into program +# February 1999 M-J. Dominus (mjd-perl-diff@plover.com) +# +# In this file, "item" usually means "line of text", and "item number" usually +# means "line number". But theoretically the code could be used more generally +use strict; +use Algorithm::Diff qw(diff); + +# GLOBAL VARIABLES #### +# After we've read up to a certain point in each file, the number of items +# we've read from each file will differ by $FLD (could be 0) +my $File_Length_Difference = 0; + +#ed diff outputs hunks *backwards*, so we need to save hunks when doing ed diff +my @Ed_Hunks = (); +######################## + +my $usage = << "ENDUSAGE"; +Usage: $0 [{-c | -C lines -e | -f | -u | -U lines}] oldfile newfile + -c do a context diff with 3 lines of context + -C do a context diff with 'lines' lines of context (implies -c) + -e create a script for the ed editor to change oldfile to newfile + -f like -e but in reverse order + -u do a unified diff with 3 lines of context + -U do a unified diff with 'lines' lines of context (implies -u) + -q report only whether or not the files differ + +By default it will do an "old-style" diff, with output like UNIX diff +ENDUSAGE + +my $Context_Lines = 0; # lines of context to print. 0 for old-style diff +my $Diff_Type = "OLD"; # by default, do standard UNIX diff +my ($opt_c, $opt_u, $opt_e, $opt_f, $opt_q); +while ($ARGV[0] =~ /^-/) { + my $opt = shift; + last if $opt eq '--'; + if ($opt =~ /^-C(.*)/) { + $Context_Lines = $1 || shift; + $opt_c = 1; + $Diff_Type = "CONTEXT"; + } elsif ($opt =~ /^-c$/) { + $Context_Lines = 3; + $opt_c = 1; + $Diff_Type = "CONTEXT"; + } elsif ($opt =~ /^-e$/) { + $opt_e = 1; + $Diff_Type = "ED"; + } elsif ($opt =~ /^-f$/) { + $opt_f = 1; + $Diff_Type = "REVERSE_ED"; + } elsif ($opt =~ /^-U(.*)$/) { + $Context_Lines = $1 || shift; + $opt_u = 1; + $Diff_Type = "UNIFIED"; + } elsif ($opt =~ /^-u$/) { + $Context_Lines = 3; + $opt_u = 1; + $Diff_Type = "UNIFIED"; + } elsif ($opt =~ /^-q$/) { + $Context_Lines = 0; + $opt_q = 1; + $opt_e = 1; + $Diff_Type = "ED"; + } else { + $opt =~ s/^-//; + bag("Illegal option -- $opt"); + } +} + +if ($opt_q and grep($_,($opt_c, $opt_f, $opt_u)) > 1) { + bag("Combining -q with other options is nonsensical"); +} + +if (grep($_,($opt_c, $opt_e, $opt_f, $opt_u)) > 1) { + bag("Only one of -c, -u, -f, -e are allowed"); +} + +bag($usage) unless @ARGV == 2; + +######## DO THE DIFF! +my ($file1, $file2) = @ARGV; + +my ($char1, $char2); # string to print before file names +if ($Diff_Type eq "CONTEXT") { + $char1 = '*' x 3; $char2 = '-' x 3; +} elsif ($Diff_Type eq "UNIFIED") { + $char1 = '-' x 3; $char2 = '+' x 3; +} + +open (F1, $file1) or bag("Couldn't open $file1: $!"); +open (F2, $file2) or bag("Couldn't open $file2: $!"); +my (@f1, @f2); +chomp(@f1 = ); +close F1; +chomp(@f2 = ); +close F2; + +# diff yields lots of pieces, each of which is basically a Block object +my $diffs = diff(\@f1, \@f2); +exit 0 unless @$diffs; + +if ($opt_q and @$diffs) { + print "Files $file1 and $file2 differ\n"; + exit 1; +} + +if ($Diff_Type =~ /UNIFIED|CONTEXT/) { + my @st = stat($file1); + my $MTIME = 9; + print "$char1 $file1\t", scalar localtime($st[$MTIME]), "\n"; + @st = stat($file2); + print "$char2 $file2\t", scalar localtime($st[$MTIME]), "\n"; +} + +my ($hunk,$oldhunk); +# Loop over hunks. If a hunk overlaps with the last hunk, join them. +# Otherwise, print out the old one. +foreach my $piece (@$diffs) { + $hunk = new Hunk ($piece, $Context_Lines); + next unless $oldhunk; # first time through + + # Don't need to check for overlap if blocks have no context lines + if ($Context_Lines && $hunk->does_overlap($oldhunk)) { + $hunk->prepend_hunk($oldhunk); + } else { + $oldhunk->output_diff(\@f1, \@f2, $Diff_Type); + } + +} continue { + $oldhunk = $hunk; +} + +# print the last hunk +$oldhunk->output_diff(\@f1, \@f2, $Diff_Type); + +# Print hunks backwards if we're doing an ed diff +map {$_->output_ed_diff(\@f1, \@f2, $Diff_Type)} @Ed_Hunks if @Ed_Hunks; + +exit 1; +# END MAIN PROGRAM + +sub bag { + my $msg = shift; + $msg .= "\n"; + warn $msg; + exit 2; +} + +######## +# Package Hunk. A Hunk is a group of Blocks which overlap because of the +# context surrounding each block. (So if we're not using context, every +# hunk will contain one block.) +{ +package Hunk; + +sub new { +# Arg1 is output from &LCS::diff (which corresponds to one Block) +# Arg2 is the number of items (lines, e.g.,) of context around each block +# +# This subroutine changes $File_Length_Difference +# +# Fields in a Hunk: +# blocks - a list of Block objects +# start - index in file 1 where first block of the hunk starts +# end - index in file 1 where last block of the hunk ends +# +# Variables: +# before_diff - how much longer file 2 is than file 1 due to all hunks +# until but NOT including this one +# after_diff - difference due to all hunks including this one + my ($class, $piece, $context_items) = @_; + + my $block = new Block ($piece); # this modifies $FLD! + + my $before_diff = $File_Length_Difference; # BEFORE this hunk + my $after_diff = $before_diff + $block->{"length_diff"}; + $File_Length_Difference += $block->{"length_diff"}; + + # @remove_array and @insert_array hold the items to insert and remove + # Save the start & beginning of each array. If the array doesn't exist + # though (e.g., we're only adding items in this block), then figure + # out the line number based on the line number of the other file and + # the current difference in file lenghts + my @remove_array = $block->remove; + my @insert_array = $block->insert; + my ($a1, $a2, $b1, $b2, $start1, $start2, $end1, $end2); + $a1 = @remove_array ? $remove_array[0 ]->{"item_no"} : -1; + $a2 = @remove_array ? $remove_array[-1]->{"item_no"} : -1; + $b1 = @insert_array ? $insert_array[0 ]->{"item_no"} : -1; + $b2 = @insert_array ? $insert_array[-1]->{"item_no"} : -1; + + $start1 = $a1 == -1 ? $b1 - $before_diff : $a1; + $end1 = $a2 == -1 ? $b2 - $after_diff : $a2; + $start2 = $b1 == -1 ? $a1 + $before_diff : $b1; + $end2 = $b2 == -1 ? $a2 + $after_diff : $b2; + + # At first, a hunk will have just one Block in it + my $hunk = { + "start1" => $start1, + "start2" => $start2, + "end1" => $end1, + "end2" => $end2, + "blocks" => [$block], + }; + bless $hunk, $class; + + $hunk->flag_context($context_items); + + return $hunk; +} + +# Change the "start" and "end" fields to note that context should be added +# to this hunk +sub flag_context { + my ($hunk, $context_items) = @_; + return unless $context_items; # no context + + # add context before + my $start1 = $hunk->{"start1"}; + my $num_added = $context_items > $start1 ? $start1 : $context_items; + $hunk->{"start1"} -= $num_added; + $hunk->{"start2"} -= $num_added; + + # context after + my $end1 = $hunk->{"end1"}; + $num_added = ($end1+$context_items > $#f1) ? + $#f1 - $end1 : + $context_items; + $hunk->{"end1"} += $num_added; + $hunk->{"end2"} += $num_added; +} + +# Is there an overlap between hunk arg0 and old hunk arg1? +# Note: if end of old hunk is one less than beginning of second, they overlap +sub does_overlap { + my ($hunk, $oldhunk) = @_; + return "" unless $oldhunk; # first time through, $oldhunk is empty + + # Do I actually need to test both? + return ($hunk->{"start1"} - $oldhunk->{"end1"} <= 1 || + $hunk->{"start2"} - $oldhunk->{"end2"} <= 1); +} + +# Prepend hunk arg1 to hunk arg0 +# Note that arg1 isn't updated! Only arg0 is. +sub prepend_hunk { + my ($hunk, $oldhunk) = @_; + + $hunk->{"start1"} = $oldhunk->{"start1"}; + $hunk->{"start2"} = $oldhunk->{"start2"}; + + unshift (@{$hunk->{"blocks"}}, @{$oldhunk->{"blocks"}}); +} + + +# DIFF OUTPUT ROUTINES. THESE ROUTINES CONTAIN DIFF FORMATTING INFO... +sub output_diff { +# First arg is the current hunk of course +# Next args are refs to the files +# last arg is type of diff + my $diff_type = $_[-1]; + my %funchash = ("OLD" => \&output_old_diff, + "CONTEXT" => \&output_context_diff, + "ED" => \&store_ed_diff, + "REVERSE_ED" => \&output_ed_diff, + "UNIFIED" => \&output_unified_diff, + ); + if (exists $funchash{$diff_type}) { + &{$funchash{$diff_type}}(@_); # pass in all args + } else {die "unknown diff type $diff_type"} +} + +sub output_old_diff { +# Note that an old diff can't have any context. Therefore, we know that +# there's only one block in the hunk. + my ($hunk, $fileref1, $fileref2) = @_; + my %op_hash = ('+' => 'a', '-' => 'd', '!' => 'c'); + + my @blocklist = @{$hunk->{"blocks"}}; + warn ("Expecting one block in an old diff hunk!") if scalar @blocklist != 1; + my $block = $blocklist[0]; + my $op = $block->op; # +, -, or ! + + # Calculate item number range. + # old diff range is just like a context diff range, except the ranges + # are on one line with the action between them. + my $range1 = $hunk->context_range(1); + my $range2 = $hunk->context_range(2); + my $action = $op_hash{$op} || warn "unknown op $op"; + print "$range1$action$range2\n"; + + # If removing anything, just print out all the remove lines in the hunk + # which is just all the remove lines in the block + if ($block->remove) { + my @outlist = @$fileref1[$hunk->{"start1"}..$hunk->{"end1"}]; + map {$_ = "< $_\n"} @outlist; # all lines will be '< text\n' + print @outlist; + } + + print "---\n" if $op eq '!'; # only if inserting and removing + if ($block->insert) { + my @outlist = @$fileref2[$hunk->{"start2"}..$hunk->{"end2"}]; + map {$_ = "> $_\n"} @outlist; # all lines will be '> text\n' + print @outlist; + } +} + +sub output_unified_diff { + my ($hunk, $fileref1, $fileref2) = @_; + my @blocklist; + + # Calculate item number range. + my $range1 = $hunk->unified_range(1); + my $range2 = $hunk->unified_range(2); + print "@@ -$range1 +$range2 @@\n"; + + # Outlist starts containing the hunk of file 1. + # Removing an item just means putting a '-' in front of it. + # Inserting an item requires getting it from file2 and splicing it in. + # We splice in $num_added items. Remove blocks use $num_added because + # splicing changed the length of outlist. + # We remove $num_removed items. Insert blocks use $num_removed because + # their item numbers---corresponding to positions in file *2*--- don't take + # removed items into account. + my $low = $hunk->{"start1"}; + my $hi = $hunk->{"end1"}; + my ($num_added, $num_removed) = (0,0); + my @outlist = @$fileref1[$low..$hi]; + map {s/^/ /} @outlist; # assume it's just context + + foreach my $block (@{$hunk->{"blocks"}}) { + foreach my $item ($block->remove) { + my $op = $item->{"sign"}; # - + my $offset = $item->{"item_no"} - $low + $num_added; + $outlist[$offset] =~ s/^ /$op/; + $num_removed++; + } + foreach my $item ($block->insert) { + my $op = $item->{"sign"}; # + + my $i = $item->{"item_no"}; + my $offset = $i - $hunk->{"start2"} + $num_removed; + splice(@outlist,$offset,0,"$op$$fileref2[$i]"); + $num_added++; + } + } + + map {s/$/\n/} @outlist; # add \n's + print @outlist; + +} + +sub output_context_diff { + my ($hunk, $fileref1, $fileref2) = @_; + my @blocklist; + + print "***************\n"; + # Calculate item number range. + my $range1 = $hunk->context_range(1); + my $range2 = $hunk->context_range(2); + + # Print out file 1 part for each block in context diff format if there are + # any blocks that remove items + print "*** $range1 ****\n"; + my $low = $hunk->{"start1"}; + my $hi = $hunk->{"end1"}; + if (@blocklist = grep {$_->remove} @{$hunk->{"blocks"}}) { + my @outlist = @$fileref1[$low..$hi]; + map {s/^/ /} @outlist; # assume it's just context + foreach my $block (@blocklist) { + my $op = $block->op; # - or ! + foreach my $item ($block->remove) { + $outlist[$item->{"item_no"} - $low] =~ s/^ /$op/; + } + } + map {s/$/\n/} @outlist; # add \n's + print @outlist; + } + + print "--- $range2 ----\n"; + $low = $hunk->{"start2"}; + $hi = $hunk->{"end2"}; + if (@blocklist = grep {$_->insert} @{$hunk->{"blocks"}}) { + my @outlist = @$fileref2[$low..$hi]; + map {s/^/ /} @outlist; # assume it's just context + foreach my $block (@blocklist) { + my $op = $block->op; # + or ! + foreach my $item ($block->insert) { + $outlist[$item->{"item_no"} - $low] =~ s/^ /$op/; + } + } + map {s/$/\n/} @outlist; # add \n's + print @outlist; + } +} + +sub store_ed_diff { +# ed diff prints out diffs *backwards*. So save them while we're generating +# them, then print them out at the end + my $hunk = shift; + unshift @Ed_Hunks, $hunk; +} + +sub output_ed_diff { +# This sub is used for ed ('diff -e') OR reverse_ed ('diff -f'). +# last arg is type of diff + my $diff_type = $_[-1]; + my ($hunk, $fileref1, $fileref2) = @_; + my %op_hash = ('+' => 'a', '-' => 'd', '!' => 'c'); + + # Can't be any context for this kind of diff, so each hunk has one block + my @blocklist = @{$hunk->{"blocks"}}; + warn ("Expecting one block in an ed diff hunk!") if scalar @blocklist != 1; + my $block = $blocklist[0]; + my $op = $block->op; # +, -, or ! + + # Calculate item number range. + # old diff range is just like a context diff range, except the ranges + # are on one line with the action between them. + my $range1 = $hunk->context_range(1); + $range1 =~ s/,/ / if $diff_type eq "REVERSE_ED"; + my $action = $op_hash{$op} || warn "unknown op $op"; + print ($diff_type eq "ED" ? "$range1$action\n" : "$action$range1\n"); + + if ($block->insert) { + my @outlist = @$fileref2[$hunk->{"start2"}..$hunk->{"end2"}]; + map {s/$/\n/} @outlist; # add \n's + print @outlist; + print ".\n"; # end of ed 'c' or 'a' command + } +} + +sub context_range { +# Generate a range of item numbers to print. Only print 1 number if the range +# has only one item in it. Otherwise, it's 'start,end' +# Flag is the number of the file (1 or 2) + my ($hunk, $flag) = @_; + my ($start, $end) = ($hunk->{"start$flag"},$hunk->{"end$flag"}); + $start++; $end++; # index from 1, not zero + my $range = ($start < $end) ? "$start,$end" : $end; + return $range; +} + +sub unified_range { +# Generate a range of item numbers to print for unified diff +# Print number where block starts, followed by number of lines in the block +# (don't print number of lines if it's 1) + my ($hunk, $flag) = @_; + my ($start, $end) = ($hunk->{"start$flag"},$hunk->{"end$flag"}); + $start++; $end++; # index from 1, not zero + my $length = $end - $start + 1; + my $first = $length < 2 ? $end : $start; # strange, but correct... + my $range = $length== 1 ? $first : "$first,$length"; + return $range; +} +} # end Package Hunk + +######## +# Package Block. A block is an operation removing, adding, or changing +# a group of items. Basically, this is just a list of changes, where each +# change adds or deletes a single item. +# (Change could be a separate class, but it didn't seem worth it) +{ +package Block; +sub new { +# Input is a chunk from &Algorithm::LCS::diff +# Fields in a block: +# length_diff - how much longer file 2 is than file 1 due to this block +# Each change has: +# sign - '+' for insert, '-' for remove +# item_no - number of the item in the file (e.g., line number) +# We don't bother storing the text of the item +# + my ($class,$chunk) = @_; + my @changes = (); + +# This just turns each change into a hash. + foreach my $item (@$chunk) { + my ($sign, $item_no, $text) = @$item; + my $hashref = {"sign" => $sign, "item_no" => $item_no}; + push @changes, $hashref; + } + + my $block = { "changes" => \@changes }; + bless $block, $class; + + $block->{"length_diff"} = $block->insert - $block->remove; + return $block; +} + + +# LOW LEVEL FUNCTIONS +sub op { +# what kind of block is this? + my $block = shift; + my $insert = $block->insert; + my $remove = $block->remove; + + $remove && $insert and return '!'; + $remove and return '-'; + $insert and return '+'; + warn "unknown block type"; + return '^'; # context block +} + +# Returns a list of the changes in this block that remove items +# (or the number of removals if called in scalar context) +sub remove { return grep {$_->{"sign"} eq '-'} @{shift->{"changes"}}; } + +# Returns a list of the changes in this block that insert items +sub insert { return grep {$_->{"sign"} eq '+'} @{shift->{"changes"}}; } + +} # end of package Block diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/htmldiff.pl b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/htmldiff.pl new file mode 100644 index 0000000..fdc8102 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/htmldiff.pl @@ -0,0 +1,100 @@ +#!/usr/bin/perl -w +# diffs two files and writes an HTML output file. +use strict; +use CGI qw(:standard :html3); +use Algorithm::Diff 'traverse_sequences'; +use Text::Tabs; + +my ( @a, @b ); + +# Take care of whitespace. +sub preprocess +{ + my $arrayRef = shift; + chomp(@$arrayRef); + @$arrayRef = expand(@$arrayRef); +} + +# This will be called with both lines are the same +sub match +{ + my ( $ia, $ib ) = @_; + print pre( $a[$ia] ), "\n"; +} + +# This will be called when there is a line in A that isn't in B +sub only_a +{ + my ( $ia, $ib ) = @_; + print pre( { -class => 'onlyA' }, $a[$ia] ), "\n"; +} + +# This will be called when there is a line in B that isn't in A +sub only_b +{ + my ( $ia, $ib ) = @_; + print pre( { -class => 'onlyB' }, $b[$ib] ), "\n"; +} + +# MAIN PROGRAM + +# Check for two arguments. +print "usage: $0 file1 file2 > diff.html\n" if @ARGV != 2; + +$tabstop = 4; # For Text::Tabs + +# Read each file into an array. +open FH, $ARGV[0]; +@a = ; +close FH; + +open FH, $ARGV[1]; +@b = ; +close FH; + +# Expand whitespace +preprocess( \@a ); +preprocess( \@b ); + +# inline style +my $style = < "$ARGV[0] vs. $ARGV[1]", + -style => { -code => $style } + } + ), + h1( + { -style => 'margin-left: 24pt' }, + span( { -style => 'color: red' }, $ARGV[0] ), + span(" vs. "), + span( { -style => 'color: blue' }, $ARGV[1] ) + ), + "\n"; + +# And compare the arrays +traverse_sequences( + \@a, # first sequence + \@b, # second sequence + { + MATCH => \&match, # callback on identical lines + DISCARD_A => \&only_a, # callback on A-only + DISCARD_B => \&only_b, # callback on B-only + } +); + +print end_html(); diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/Diff.pm b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/Diff.pm new file mode 100644 index 0000000..c3ceead --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/Diff.pm @@ -0,0 +1,1713 @@ +package Algorithm::Diff; +# Skip to first "=head" line for documentation. +use strict; + +use integer; # see below in _replaceNextLargerWith() for mod to make + # if you don't use this +use vars qw( $VERSION @EXPORT_OK ); +$VERSION = 1.19_02; +# ^ ^^ ^^-- Incremented at will +# | \+----- Incremented for non-trivial changes to features +# \-------- Incremented for fundamental changes +require Exporter; +*import = \&Exporter::import; +@EXPORT_OK = qw( + prepare LCS LCSidx LCS_length + diff sdiff compact_diff + traverse_sequences traverse_balanced +); + +# McIlroy-Hunt diff algorithm +# Adapted from the Smalltalk code of Mario I. Wolczko, +# by Ned Konz, perl@bike-nomad.com +# Updates by Tye McQueen, http://perlmonks.org/?node=tye + +# Create a hash that maps each element of $aCollection to the set of +# positions it occupies in $aCollection, restricted to the elements +# within the range of indexes specified by $start and $end. +# The fourth parameter is a subroutine reference that will be called to +# generate a string to use as a key. +# Additional parameters, if any, will be passed to this subroutine. +# +# my $hashRef = _withPositionsOfInInterval( \@array, $start, $end, $keyGen ); + +sub _withPositionsOfInInterval +{ + my $aCollection = shift; # array ref + my $start = shift; + my $end = shift; + my $keyGen = shift; + my %d; + my $index; + for ( $index = $start ; $index <= $end ; $index++ ) + { + my $element = $aCollection->[$index]; + my $key = &$keyGen( $element, @_ ); + if ( exists( $d{$key} ) ) + { + unshift ( @{ $d{$key} }, $index ); + } + else + { + $d{$key} = [$index]; + } + } + return wantarray ? %d : \%d; +} + +# Find the place at which aValue would normally be inserted into the +# array. If that place is already occupied by aValue, do nothing, and +# return undef. If the place does not exist (i.e., it is off the end of +# the array), add it to the end, otherwise replace the element at that +# point with aValue. It is assumed that the array's values are numeric. +# This is where the bulk (75%) of the time is spent in this module, so +# try to make it fast! + +sub _replaceNextLargerWith +{ + my ( $array, $aValue, $high ) = @_; + $high ||= $#$array; + + # off the end? + if ( $high == -1 || $aValue > $array->[-1] ) + { + push ( @$array, $aValue ); + return $high + 1; + } + + # binary search for insertion point... + my $low = 0; + my $index; + my $found; + while ( $low <= $high ) + { + $index = ( $high + $low ) / 2; + + # $index = int(( $high + $low ) / 2); # without 'use integer' + $found = $array->[$index]; + + if ( $aValue == $found ) + { + return undef; + } + elsif ( $aValue > $found ) + { + $low = $index + 1; + } + else + { + $high = $index - 1; + } + } + + # now insertion point is in $low. + $array->[$low] = $aValue; # overwrite next larger + return $low; +} + +# This method computes the longest common subsequence in $a and $b. + +# Result is array or ref, whose contents is such that +# $a->[ $i ] == $b->[ $result[ $i ] ] +# foreach $i in ( 0 .. $#result ) if $result[ $i ] is defined. + +# An additional argument may be passed; this is a hash or key generating +# function that should return a string that uniquely identifies the given +# element. It should be the case that if the key is the same, the elements +# will compare the same. If this parameter is undef or missing, the key +# will be the element as a string. + +# By default, comparisons will use "eq" and elements will be turned into keys +# using the default stringizing operator '""'. + +# Additional parameters, if any, will be passed to the key generation +# routine. + +sub _longestCommonSubsequence +{ + my $a = shift; # array ref or hash ref + my $b = shift; # array ref or hash ref + my $counting = shift; # scalar + my $keyGen = shift; # code ref + my $compare; # code ref + + if ( ref($a) eq 'HASH' ) + { # prepared hash must be in $b + my $tmp = $b; + $b = $a; + $a = $tmp; + } + + # Check for bogus (non-ref) argument values + if ( !ref($a) || !ref($b) ) + { + my @callerInfo = caller(1); + die 'error: must pass array or hash references to ' . $callerInfo[3]; + } + + # set up code refs + # Note that these are optimized. + if ( !defined($keyGen) ) # optimize for strings + { + $keyGen = sub { $_[0] }; + $compare = sub { my ( $a, $b ) = @_; $a eq $b }; + } + else + { + $compare = sub { + my $a = shift; + my $b = shift; + &$keyGen( $a, @_ ) eq &$keyGen( $b, @_ ); + }; + } + + my ( $aStart, $aFinish, $matchVector ) = ( 0, $#$a, [] ); + my ( $prunedCount, $bMatches ) = ( 0, {} ); + + if ( ref($b) eq 'HASH' ) # was $bMatches prepared for us? + { + $bMatches = $b; + } + else + { + my ( $bStart, $bFinish ) = ( 0, $#$b ); + + # First we prune off any common elements at the beginning + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[$aStart], $b->[$bStart], @_ ) ) + { + $matchVector->[ $aStart++ ] = $bStart++; + $prunedCount++; + } + + # now the end + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[$aFinish], $b->[$bFinish], @_ ) ) + { + $matchVector->[ $aFinish-- ] = $bFinish--; + $prunedCount++; + } + + # Now compute the equivalence classes of positions of elements + $bMatches = + _withPositionsOfInInterval( $b, $bStart, $bFinish, $keyGen, @_ ); + } + my $thresh = []; + my $links = []; + + my ( $i, $ai, $j, $k ); + for ( $i = $aStart ; $i <= $aFinish ; $i++ ) + { + $ai = &$keyGen( $a->[$i], @_ ); + if ( exists( $bMatches->{$ai} ) ) + { + $k = 0; + for $j ( @{ $bMatches->{$ai} } ) + { + + # optimization: most of the time this will be true + if ( $k and $thresh->[$k] > $j and $thresh->[ $k - 1 ] < $j ) + { + $thresh->[$k] = $j; + } + else + { + $k = _replaceNextLargerWith( $thresh, $j, $k ); + } + + # oddly, it's faster to always test this (CPU cache?). + if ( defined($k) ) + { + $links->[$k] = + [ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ]; + } + } + } + } + + if (@$thresh) + { + return $prunedCount + @$thresh if $counting; + for ( my $link = $links->[$#$thresh] ; $link ; $link = $link->[0] ) + { + $matchVector->[ $link->[1] ] = $link->[2]; + } + } + elsif ($counting) + { + return $prunedCount; + } + + return wantarray ? @$matchVector : $matchVector; +} + +sub traverse_sequences +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $callbacks = shift || {}; + my $keyGen = shift; + my $matchCallback = $callbacks->{'MATCH'} || sub { }; + my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; + my $finishedACallback = $callbacks->{'A_FINISHED'}; + my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; + my $finishedBCallback = $callbacks->{'B_FINISHED'}; + my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ ); + + # Process all the lines in @$matchVector + my $lastA = $#$a; + my $lastB = $#$b; + my $bi = 0; + my $ai; + + for ( $ai = 0 ; $ai <= $#$matchVector ; $ai++ ) + { + my $bLine = $matchVector->[$ai]; + if ( defined($bLine) ) # matched + { + &$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine; + &$matchCallback( $ai, $bi++, @_ ); + } + else + { + &$discardACallback( $ai, $bi, @_ ); + } + } + + # The last entry (if any) processed was a match. + # $ai and $bi point just past the last matching lines in their sequences. + + while ( $ai <= $lastA or $bi <= $lastB ) + { + + # last A? + if ( $ai == $lastA + 1 and $bi <= $lastB ) + { + if ( defined($finishedACallback) ) + { + &$finishedACallback( $lastA, @_ ); + $finishedACallback = undef; + } + else + { + &$discardBCallback( $ai, $bi++, @_ ) while $bi <= $lastB; + } + } + + # last B? + if ( $bi == $lastB + 1 and $ai <= $lastA ) + { + if ( defined($finishedBCallback) ) + { + &$finishedBCallback( $lastB, @_ ); + $finishedBCallback = undef; + } + else + { + &$discardACallback( $ai++, $bi, @_ ) while $ai <= $lastA; + } + } + + &$discardACallback( $ai++, $bi, @_ ) if $ai <= $lastA; + &$discardBCallback( $ai, $bi++, @_ ) if $bi <= $lastB; + } + + return 1; +} + +sub traverse_balanced +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $callbacks = shift || {}; + my $keyGen = shift; + my $matchCallback = $callbacks->{'MATCH'} || sub { }; + my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; + my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; + my $changeCallback = $callbacks->{'CHANGE'}; + my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ ); + + # Process all the lines in match vector + my $lastA = $#$a; + my $lastB = $#$b; + my $bi = 0; + my $ai = 0; + my $ma = -1; + my $mb; + + while (1) + { + + # Find next match indices $ma and $mb + do { + $ma++; + } while( + $ma <= $#$matchVector + && !defined $matchVector->[$ma] + ); + + last if $ma > $#$matchVector; # end of matchVector? + $mb = $matchVector->[$ma]; + + # Proceed with discard a/b or change events until + # next match + while ( $ai < $ma || $bi < $mb ) + { + + if ( $ai < $ma && $bi < $mb ) + { + + # Change + if ( defined $changeCallback ) + { + &$changeCallback( $ai++, $bi++, @_ ); + } + else + { + &$discardACallback( $ai++, $bi, @_ ); + &$discardBCallback( $ai, $bi++, @_ ); + } + } + elsif ( $ai < $ma ) + { + &$discardACallback( $ai++, $bi, @_ ); + } + else + { + + # $bi < $mb + &$discardBCallback( $ai, $bi++, @_ ); + } + } + + # Match + &$matchCallback( $ai++, $bi++, @_ ); + } + + while ( $ai <= $lastA || $bi <= $lastB ) + { + if ( $ai <= $lastA && $bi <= $lastB ) + { + + # Change + if ( defined $changeCallback ) + { + &$changeCallback( $ai++, $bi++, @_ ); + } + else + { + &$discardACallback( $ai++, $bi, @_ ); + &$discardBCallback( $ai, $bi++, @_ ); + } + } + elsif ( $ai <= $lastA ) + { + &$discardACallback( $ai++, $bi, @_ ); + } + else + { + + # $bi <= $lastB + &$discardBCallback( $ai, $bi++, @_ ); + } + } + + return 1; +} + +sub prepare +{ + my $a = shift; # array ref + my $keyGen = shift; # code ref + + # set up code ref + $keyGen = sub { $_[0] } unless defined($keyGen); + + return scalar _withPositionsOfInInterval( $a, 0, $#$a, $keyGen, @_ ); +} + +sub LCS +{ + my $a = shift; # array ref + my $b = shift; # array ref or hash ref + my $matchVector = _longestCommonSubsequence( $a, $b, 0, @_ ); + my @retval; + my $i; + for ( $i = 0 ; $i <= $#$matchVector ; $i++ ) + { + if ( defined( $matchVector->[$i] ) ) + { + push ( @retval, $a->[$i] ); + } + } + return wantarray ? @retval : \@retval; +} + +sub LCS_length +{ + my $a = shift; # array ref + my $b = shift; # array ref or hash ref + return _longestCommonSubsequence( $a, $b, 1, @_ ); +} + +sub LCSidx +{ + my $a= shift @_; + my $b= shift @_; + my $match= _longestCommonSubsequence( $a, $b, 0, @_ ); + my @am= grep defined $match->[$_], 0..$#$match; + my @bm= @{$match}[@am]; + return \@am, \@bm; +} + +sub compact_diff +{ + my $a= shift @_; + my $b= shift @_; + my( $am, $bm )= LCSidx( $a, $b, @_ ); + my @cdiff; + my( $ai, $bi )= ( 0, 0 ); + push @cdiff, $ai, $bi; + while( 1 ) { + while( @$am && $ai == $am->[0] && $bi == $bm->[0] ) { + shift @$am; + shift @$bm; + ++$ai, ++$bi; + } + push @cdiff, $ai, $bi; + last if ! @$am; + $ai = $am->[0]; + $bi = $bm->[0]; + push @cdiff, $ai, $bi; + } + push @cdiff, 0+@$a, 0+@$b + if $ai < @$a || $bi < @$b; + return wantarray ? @cdiff : \@cdiff; +} + +sub diff +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $retval = []; + my $hunk = []; + my $discard = sub { + push @$hunk, [ '-', $_[0], $a->[ $_[0] ] ]; + }; + my $add = sub { + push @$hunk, [ '+', $_[1], $b->[ $_[1] ] ]; + }; + my $match = sub { + push @$retval, $hunk + if 0 < @$hunk; + $hunk = [] + }; + traverse_sequences( $a, $b, + { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add }, @_ ); + &$match(); + return wantarray ? @$retval : $retval; +} + +sub sdiff +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $retval = []; + my $discard = sub { push ( @$retval, [ '-', $a->[ $_[0] ], "" ] ) }; + my $add = sub { push ( @$retval, [ '+', "", $b->[ $_[1] ] ] ) }; + my $change = sub { + push ( @$retval, [ 'c', $a->[ $_[0] ], $b->[ $_[1] ] ] ); + }; + my $match = sub { + push ( @$retval, [ 'u', $a->[ $_[0] ], $b->[ $_[1] ] ] ); + }; + traverse_balanced( + $a, + $b, + { + MATCH => $match, + DISCARD_A => $discard, + DISCARD_B => $add, + CHANGE => $change, + }, + @_ + ); + return wantarray ? @$retval : $retval; +} + +######################################## +my $Root= __PACKAGE__; +package Algorithm::Diff::_impl; +use strict; + +sub _Idx() { 0 } # $me->[_Idx]: Ref to array of hunk indices + # 1 # $me->[1]: Ref to first sequence + # 2 # $me->[2]: Ref to second sequence +sub _End() { 3 } # $me->[_End]: Diff between forward and reverse pos +sub _Same() { 4 } # $me->[_Same]: 1 if pos 1 contains unchanged items +sub _Base() { 5 } # $me->[_Base]: Added to range's min and max +sub _Pos() { 6 } # $me->[_Pos]: Which hunk is currently selected +sub _Off() { 7 } # $me->[_Off]: Offset into _Idx for current position +sub _Min() { -2 } # Added to _Off to get min instead of max+1 + +sub Die +{ + require Carp; + Carp::confess( @_ ); +} + +sub _ChkPos +{ + my( $me )= @_; + return if $me->[_Pos]; + my $meth= ( caller(1) )[3]; + Die( "Called $meth on 'reset' object" ); +} + +sub _ChkSeq +{ + my( $me, $seq )= @_; + return $seq + $me->[_Off] + if 1 == $seq || 2 == $seq; + my $meth= ( caller(1) )[3]; + Die( "$meth: Invalid sequence number ($seq); must be 1 or 2" ); +} + +sub getObjPkg +{ + my( $us )= @_; + return ref $us if ref $us; + return $us . "::_obj"; +} + +sub new +{ + my( $us, $seq1, $seq2, $opts ) = @_; + my @args; + for( $opts->{keyGen} ) { + push @args, $_ if $_; + } + for( $opts->{keyGenArgs} ) { + push @args, @$_ if $_; + } + my $cdif= Algorithm::Diff::compact_diff( $seq1, $seq2, @args ); + my $same= 1; + if( 0 == $cdif->[2] && 0 == $cdif->[3] ) { + $same= 0; + splice @$cdif, 0, 2; + } + my @obj= ( $cdif, $seq1, $seq2 ); + $obj[_End] = (1+@$cdif)/2; + $obj[_Same] = $same; + $obj[_Base] = 0; + my $me = bless \@obj, $us->getObjPkg(); + $me->Reset( 0 ); + return $me; +} + +sub Reset +{ + my( $me, $pos )= @_; + $pos= int( $pos || 0 ); + $pos += $me->[_End] + if $pos < 0; + $pos= 0 + if $pos < 0 || $me->[_End] <= $pos; + $me->[_Pos]= $pos || !1; + $me->[_Off]= 2*$pos - 1; + return $me; +} + +sub Base +{ + my( $me, $base )= @_; + my $oldBase= $me->[_Base]; + $me->[_Base]= 0+$base if defined $base; + return $oldBase; +} + +sub Copy +{ + my( $me, $pos, $base )= @_; + my @obj= @$me; + my $you= bless \@obj, ref($me); + $you->Reset( $pos ) if defined $pos; + $you->Base( $base ); + return $you; +} + +sub Next { + my( $me, $steps )= @_; + $steps= 1 if ! defined $steps; + if( $steps ) { + my $pos= $me->[_Pos]; + my $new= $pos + $steps; + $new= 0 if $pos && $new < 0; + $me->Reset( $new ) + } + return $me->[_Pos]; +} + +sub Prev { + my( $me, $steps )= @_; + $steps= 1 if ! defined $steps; + my $pos= $me->Next(-$steps); + $pos -= $me->[_End] if $pos; + return $pos; +} + +sub Diff { + my( $me )= @_; + $me->_ChkPos(); + return 0 if $me->[_Same] == ( 1 & $me->[_Pos] ); + my $ret= 0; + my $off= $me->[_Off]; + for my $seq ( 1, 2 ) { + $ret |= $seq + if $me->[_Idx][ $off + $seq + _Min ] + < $me->[_Idx][ $off + $seq ]; + } + return $ret; +} + +sub Min { + my( $me, $seq, $base )= @_; + $me->_ChkPos(); + my $off= $me->_ChkSeq($seq); + $base= $me->[_Base] if !defined $base; + return $base + $me->[_Idx][ $off + _Min ]; +} + +sub Max { + my( $me, $seq, $base )= @_; + $me->_ChkPos(); + my $off= $me->_ChkSeq($seq); + $base= $me->[_Base] if !defined $base; + return $base + $me->[_Idx][ $off ] -1; +} + +sub Range { + my( $me, $seq, $base )= @_; + $me->_ChkPos(); + my $off = $me->_ChkSeq($seq); + if( !wantarray ) { + return $me->[_Idx][ $off ] + - $me->[_Idx][ $off + _Min ]; + } + $base= $me->[_Base] if !defined $base; + return ( $base + $me->[_Idx][ $off + _Min ] ) + .. ( $base + $me->[_Idx][ $off ] - 1 ); +} + +sub Items { + my( $me, $seq )= @_; + $me->_ChkPos(); + my $off = $me->_ChkSeq($seq); + if( !wantarray ) { + return $me->[_Idx][ $off ] + - $me->[_Idx][ $off + _Min ]; + } + return + @{$me->[$seq]}[ + $me->[_Idx][ $off + _Min ] + .. ( $me->[_Idx][ $off ] - 1 ) + ]; +} + +sub Same { + my( $me )= @_; + $me->_ChkPos(); + return wantarray ? () : 0 + if $me->[_Same] != ( 1 & $me->[_Pos] ); + return $me->Items(1); +} + +my %getName; +BEGIN { + %getName= ( + same => \&Same, + diff => \&Diff, + base => \&Base, + min => \&Min, + max => \&Max, + range=> \&Range, + items=> \&Items, # same thing + ); +} + +sub Get +{ + my $me= shift @_; + $me->_ChkPos(); + my @value; + for my $arg ( @_ ) { + for my $word ( split ' ', $arg ) { + my $meth; + if( $word !~ /^(-?\d+)?([a-zA-Z]+)([12])?$/ + || not $meth= $getName{ lc $2 } + ) { + Die( $Root, ", Get: Invalid request ($word)" ); + } + my( $base, $name, $seq )= ( $1, $2, $3 ); + push @value, scalar( + 4 == length($name) + ? $meth->( $me ) + : $meth->( $me, $seq, $base ) + ); + } + } + if( wantarray ) { + return @value; + } elsif( 1 == @value ) { + return $value[0]; + } + Die( 0+@value, " values requested from ", + $Root, "'s Get in scalar context" ); +} + + +my $Obj= getObjPkg($Root); +no strict 'refs'; + +for my $meth ( qw( new getObjPkg ) ) { + *{$Root."::".$meth} = \&{$meth}; + *{$Obj ."::".$meth} = \&{$meth}; +} +for my $meth ( qw( + Next Prev Reset Copy Base Diff + Same Items Range Min Max Get + _ChkPos _ChkSeq +) ) { + *{$Obj."::".$meth} = \&{$meth}; +} + +1; +__END__ + +=head1 NAME + +Algorithm::Diff - Compute `intelligent' differences between two files / lists + +=head1 SYNOPSIS + + require Algorithm::Diff; + + # This example produces traditional 'diff' output: + + my $diff = Algorithm::Diff->new( \@seq1, \@seq2 ); + + $diff->Base( 1 ); # Return line numbers, not indices + while( $diff->Next() ) { + next if $diff->Same(); + my $sep = ''; + if( ! $diff->Items(2) ) { + printf "%d,%dd%d\n", + $diff->Get(qw( Min1 Max1 Max2 )); + } elsif( ! $diff->Items(1) ) { + printf "%da%d,%d\n", + $diff->Get(qw( Max1 Min2 Max2 )); + } else { + $sep = "---\n"; + printf "%d,%dc%d,%d\n", + $diff->Get(qw( Min1 Max1 Min2 Max2 )); + } + print "< $_" for $diff->Items(1); + print $sep; + print "> $_" for $diff->Items(2); + } + + + # Alternate interfaces: + + use Algorithm::Diff qw( + LCS LCS_length LCSidx + diff sdiff compact_diff + traverse_sequences traverse_balanced ); + + @lcs = LCS( \@seq1, \@seq2 ); + $lcsref = LCS( \@seq1, \@seq2 ); + $count = LCS_length( \@seq1, \@seq2 ); + + ( $seq1idxref, $seq2idxref ) = LCSidx( \@seq1, \@seq2 ); + + + # Complicated interfaces: + + @diffs = diff( \@seq1, \@seq2 ); + + @sdiffs = sdiff( \@seq1, \@seq2 ); + + @cdiffs = compact_diff( \@seq1, \@seq2 ); + + traverse_sequences( + \@seq1, + \@seq2, + { MATCH => \&callback1, + DISCARD_A => \&callback2, + DISCARD_B => \&callback3, + }, + \&key_generator, + @extra_args, + ); + + traverse_balanced( + \@seq1, + \@seq2, + { MATCH => \&callback1, + DISCARD_A => \&callback2, + DISCARD_B => \&callback3, + CHANGE => \&callback4, + }, + \&key_generator, + @extra_args, + ); + + +=head1 INTRODUCTION + +(by Mark-Jason Dominus) + +I once read an article written by the authors of C; they said +that they worked very hard on the algorithm until they found the +right one. + +I think what they ended up using (and I hope someone will correct me, +because I am not very confident about this) was the `longest common +subsequence' method. In the LCS problem, you have two sequences of +items: + + a b c d f g h j q z + + a b c d e f g i j k r x y z + +and you want to find the longest sequence of items that is present in +both original sequences in the same order. That is, you want to find +a new sequence I which can be obtained from the first sequence by +deleting some items, and from the secend sequence by deleting other +items. You also want I to be as long as possible. In this case I +is + + a b c d f g j z + +From there it's only a small step to get diff-like output: + + e h i k q r x y + + - + + - + + + + +This module solves the LCS problem. It also includes a canned function +to generate C-like output. + +It might seem from the example above that the LCS of two sequences is +always pretty obvious, but that's not always the case, especially when +the two sequences have many repeated elements. For example, consider + + a x b y c z p d q + a b c a x b y c z + +A naive approach might start by matching up the C and C that +appear at the beginning of each sequence, like this: + + a x b y c z p d q + a b c a b y c z + +This finds the common subsequence C. But actually, the LCS +is C: + + a x b y c z p d q + a b c a x b y c z + +or + + a x b y c z p d q + a b c a x b y c z + +=head1 USAGE + +(See also the README file and several example +scripts include with this module.) + +This module now provides an object-oriented interface that uses less +memory and is easier to use than most of the previous procedural +interfaces. It also still provides several exportable functions. We'll +deal with these in ascending order of difficulty: C, +C, C, OO interface, C, C, C, +C, and C. + +=head2 C + +Given references to two lists of items, LCS returns an array containing +their longest common subsequence. In scalar context, it returns a +reference to such a list. + + @lcs = LCS( \@seq1, \@seq2 ); + $lcsref = LCS( \@seq1, \@seq2 ); + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + + @lcs = LCS( \@seq1, \@seq2, \&keyGen, @args ); + $lcsref = LCS( \@seq1, \@seq2, \&keyGen, @args ); + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + +This is just like C except it only returns the length of the +longest common subsequence. This provides a performance gain of about +9% compared to C. + +=head2 C + +Like C except it returns references to two arrays. The first array +contains the indices into @seq1 where the LCS items are located. The +second array contains the indices into @seq2 where the LCS items are located. + +Therefore, the following three lists will contain the same values: + + my( $idx1, $idx2 ) = LCSidx( \@seq1, \@seq2 ); + my @list1 = @seq1[ @$idx1 ]; + my @list2 = @seq2[ @$idx2 ]; + my @list3 = LCS( \@seq1, \@seq2 ); + +=head2 C + + $diff = Algorithm::Diffs->new( \@seq1, \@seq2 ); + $diff = Algorithm::Diffs->new( \@seq1, \@seq2, \%opts ); + +C computes the smallest set of additions and deletions necessary +to turn the first sequence into the second and compactly records them +in the object. + +You use the object to iterate over I, where each hunk represents +a contiguous section of items which should be added, deleted, replaced, +or left unchanged. + +=over 4 + +The following summary of all of the methods looks a lot like Perl code +but some of the symbols have different meanings: + + [ ] Encloses optional arguments + : Is followed by the default value for an optional argument + | Separates alternate return results + +Method summary: + + $obj = Algorithm::Diff->new( \@seq1, \@seq2, [ \%opts ] ); + $pos = $obj->Next( [ $count : 1 ] ); + $revPos = $obj->Prev( [ $count : 1 ] ); + $obj = $obj->Reset( [ $pos : 0 ] ); + $copy = $obj->Copy( [ $pos, [ $newBase ] ] ); + $oldBase = $obj->Base( [ $newBase ] ); + +Note that all of the following methods C if used on an object that +is "reset" (not currently pointing at any hunk). + + $bits = $obj->Diff( ); + @items|$cnt = $obj->Same( ); + @items|$cnt = $obj->Items( $seqNum ); + @idxs |$cnt = $obj->Range( $seqNum, [ $base ] ); + $minIdx = $obj->Min( $seqNum, [ $base ] ); + $maxIdx = $obj->Max( $seqNum, [ $base ] ); + @values = $obj->Get( @names ); + +Passing in C for an optional argument is always treated the same +as if no argument were passed in. + +=item C + + $pos = $diff->Next(); # Move forward 1 hunk + $pos = $diff->Next( 2 ); # Move forward 2 hunks + $pos = $diff->Next(-5); # Move backward 5 hunks + +C moves the object to point at the next hunk. The object starts +out "reset", which means it isn't pointing at any hunk. If the object +is reset, then C moves to the first hunk. + +C returns a true value iff the move didn't go past the last hunk. +So C will return true iff the object is not reset. + +Actually, C returns the object's new position, which is a number +between 1 and the number of hunks (inclusive), or returns a false value. + +=item C + +C is almost identical to C; it moves to the $Nth +previous hunk. On a 'reset' object, C [and C] move +to the last hunk. + +The position returned by C is relative to the I of the +hunks; -1 for the last hunk, -2 for the second-to-last, etc. + +=item C + + $diff->Reset(); # Reset the object's position + $diff->Reset($pos); # Move to the specified hunk + $diff->Reset(1); # Move to the first hunk + $diff->Reset(-1); # Move to the last hunk + +C returns the object, so, for example, you could use +C<< $diff->Reset()->Next(-1) >> to get the number of hunks. + +=item C + + $copy = $diff->Copy( $newPos, $newBase ); + +C returns a copy of the object. The copy and the orignal object +share most of their data, so making copies takes very little memory. +The copy maintains its own position (separate from the original), which +is the main purpose of copies. It also maintains its own base. + +By default, the copy's position starts out the same as the original +object's position. But C takes an optional first argument to set the +new position, so the following three snippets are equivalent: + + $copy = $diff->Copy($pos); + + $copy = $diff->Copy(); + $copy->Reset($pos); + + $copy = $diff->Copy()->Reset($pos); + +C takes an optional second argument to set the base for +the copy. If you wish to change the base of the copy but leave +the position the same as in the original, here are two +equivalent ways: + + $copy = $diff->Copy(); + $copy->Base( 0 ); + + $copy = $diff->Copy(undef,0); + +Here are two equivalent way to get a "reset" copy: + + $copy = $diff->Copy(0); + + $copy = $diff->Copy()->Reset(); + +=item C + + $bits = $obj->Diff(); + +C returns a true value iff the current hunk contains items that are +different between the two sequences. It actually returns one of the +follow 4 values: + +=over 4 + +=item 3 + +C<3==(1|2)>. This hunk contains items from @seq1 and the items +from @seq2 that should replace them. Both sequence 1 and 2 +contain changed items so both the 1 and 2 bits are set. + +=item 2 + +This hunk only contains items from @seq2 that should be inserted (not +items from @seq1). Only sequence 2 contains changed items so only the 2 +bit is set. + +=item 1 + +This hunk only contains items from @seq1 that should be deleted (not +items from @seq2). Only sequence 1 contains changed items so only the 1 +bit is set. + +=item 0 + +This means that the items in this hunk are the same in both sequences. +Neither sequence 1 nor 2 contain changed items so neither the 1 nor the +2 bits are set. + +=back + +=item C + +C returns a true value iff the current hunk contains items that +are the same in both sequences. It actually returns the list of items +if they are the same or an emty list if they aren't. In a scalar +context, it returns the size of the list. + +=item C + + $count = $diff->Items(2); + @items = $diff->Items($seqNum); + +C returns the (number of) items from the specified sequence that +are part of the current hunk. + +If the current hunk contains only insertions, then +C<< $diff->Items(1) >> will return an empty list (0 in a scalar conext). +If the current hunk contains only deletions, then C<< $diff->Items(2) >> +will return an empty list (0 in a scalar conext). + +If the hunk contains replacements, then both C<< $diff->Items(1) >> and +C<< $diff->Items(2) >> will return different, non-empty lists. + +Otherwise, the hunk contains identical items and all of the following +will return the same lists: + + @items = $diff->Items(1); + @items = $diff->Items(2); + @items = $diff->Same(); + +=item C + + $count = $diff->Range( $seqNum ); + @indices = $diff->Range( $seqNum ); + @indices = $diff->Range( $seqNum, $base ); + +C is like C except that it returns a list of I to +the items rather than the items themselves. By default, the index of +the first item (in each sequence) is 0 but this can be changed by +calling the C method. So, by default, the following two snippets +return the same lists: + + @list = $diff->Items(2); + @list = @seq2[ $diff->Range(2) ]; + +You can also specify the base to use as the second argument. So the +following two snippets I return the same lists: + + @list = $diff->Items(1); + @list = @seq1[ $diff->Range(1,0) ]; + +=item C + + $curBase = $diff->Base(); + $oldBase = $diff->Base($newBase); + +C sets and/or returns the current base (usually 0 or 1) that is +used when you request range information. The base defaults to 0 so +that range information is returned as array indices. You can set the +base to 1 if you want to report traditional line numbers instead. + +=item C + + $min1 = $diff->Min(1); + $min = $diff->Min( $seqNum, $base ); + +C returns the first value that C would return (given the +same arguments) or returns C if C would return an empty +list. + +=item C + +C returns the last value that C would return or C. + +=item C + + ( $n, $x, $r ) = $diff->Get(qw( min1 max1 range1 )); + @values = $diff->Get(qw( 0min2 1max2 range2 same base )); + +C returns one or more scalar values. You pass in a list of the +names of the values you want returned. Each name must match one of the +following regexes: + + /^(-?\d+)?(min|max)[12]$/i + /^(range[12]|same|diff|base)$/i + +The 1 or 2 after a name says which sequence you want the information +for (and where allowed, it is required). The optional number before +"min" or "max" is the base to use. So the following equalities hold: + + $diff->Get('min1') == $diff->Min(1) + $diff->Get('0min2') == $diff->Min(2,0) + +Using C in a scalar context when you've passed in more than one +name is a fatal error (C is called). + +=back + +=head2 C + +Given a reference to a list of items, C returns a reference +to a hash which can be used when comparing this sequence to other +sequences with C or C. + + $prep = prepare( \@seq1 ); + for $i ( 0 .. 10_000 ) + { + @lcs = LCS( $prep, $seq[$i] ); + # do something useful with @lcs + } + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + + $prep = prepare( \@seq1, \&keyGen ); + for $i ( 0 .. 10_000 ) + { + @lcs = LCS( $seq[$i], $prep, \&keyGen ); + # do something useful with @lcs + } + +Using C provides a performance gain of about 50% when calling LCS +many times compared with not preparing. + +=head2 C + + @diffs = diff( \@seq1, \@seq2 ); + $diffs_ref = diff( \@seq1, \@seq2 ); + +C computes the smallest set of additions and deletions necessary +to turn the first sequence into the second, and returns a description +of these changes. The description is a list of I; each hunk +represents a contiguous section of items which should be added, +deleted, or replaced. (Hunks containing unchanged items are not +included.) + +The return value of C is a list of hunks, or, in scalar context, a +reference to such a list. If there are no differences, the list will be +empty. + +Here is an example. Calling C for the following two sequences: + + a b c e h j l m n p + b c d e f j k l m r s t + +would produce the following list: + + ( + [ [ '-', 0, 'a' ] ], + + [ [ '+', 2, 'd' ] ], + + [ [ '-', 4, 'h' ], + [ '+', 4, 'f' ] ], + + [ [ '+', 6, 'k' ] ], + + [ [ '-', 8, 'n' ], + [ '-', 9, 'p' ], + [ '+', 9, 'r' ], + [ '+', 10, 's' ], + [ '+', 11, 't' ] ], + ) + +There are five hunks here. The first hunk says that the C at +position 0 of the first sequence should be deleted (C<->). The second +hunk says that the C at position 2 of the second sequence should +be inserted (C<+>). The third hunk says that the C at position 4 +of the first sequence should be removed and replaced with the C +from position 4 of the second sequence. And so on. + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + + @sdiffs = sdiff( \@seq1, \@seq2 ); + $sdiffs_ref = sdiff( \@seq1, \@seq2 ); + +C computes all necessary components to show two sequences +and their minimized differences side by side, just like the +Unix-utility I does: + + same same + before | after + old < - + - > new + +It returns a list of array refs, each pointing to an array of +display instructions. In scalar context it returns a reference +to such a list. If there are no differences, the list will have one +entry per item, each indicating that the item was unchanged. + +Display instructions consist of three elements: A modifier indicator +(C<+>: Element added, C<->: Element removed, C: Element unmodified, +C: Element changed) and the value of the old and new elements, to +be displayed side-by-side. + +An C of the following two sequences: + + a b c e h j l m n p + b c d e f j k l m r s t + +results in + + ( [ '-', 'a', '' ], + [ 'u', 'b', 'b' ], + [ 'u', 'c', 'c' ], + [ '+', '', 'd' ], + [ 'u', 'e', 'e' ], + [ 'c', 'h', 'f' ], + [ 'u', 'j', 'j' ], + [ '+', '', 'k' ], + [ 'u', 'l', 'l' ], + [ 'u', 'm', 'm' ], + [ 'c', 'n', 'r' ], + [ 'c', 'p', 's' ], + [ '+', '', 't' ], + ) + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + +C is much like C except it returns a much more +compact description consisting of just one flat list of indices. An +example helps explain the format: + + my @a = qw( a b c e h j l m n p ); + my @b = qw( b c d e f j k l m r s t ); + @cdiff = compact_diff( \@a, \@b ); + # Returns: + # @a @b @a @b + # start start values values + ( 0, 0, # = + 0, 0, # a ! + 1, 0, # b c = b c + 3, 2, # ! d + 3, 3, # e = e + 4, 4, # f ! h + 5, 5, # j = j + 6, 6, # ! k + 6, 7, # l m = l m + 8, 9, # n p ! r s t + 10, 12, # + ); + +The 0th, 2nd, 4th, etc. entries are all indices into @seq1 (@a in the +above example) indicating where a hunk begins. The 1st, 3rd, 5th, etc. +entries are all indices into @seq2 (@b in the above example) indicating +where the same hunk begins. + +So each pair of indices (except the last pair) describes where a hunk +begins (in each sequence). Since each hunk must end at the item just +before the item that starts the next hunk, the next pair of indices can +be used to determine where the hunk ends. + +So, the first 4 entries (0..3) describe the first hunk. Entries 0 and 1 +describe where the first hunk begins (and so are always both 0). +Entries 2 and 3 describe where the next hunk begins, so subtracting 1 +from each tells us where the first hunk ends. That is, the first hunk +contains items C<$diff[0]> through C<$diff[2] - 1> of the first sequence +and contains items C<$diff[1]> through C<$diff[3] - 1> of the second +sequence. + +In other words, the first hunk consists of the following two lists of items: + + # 1st pair 2nd pair + # of indices of indices + @list1 = @a[ $cdiff[0] .. $cdiff[2]-1 ]; + @list2 = @b[ $cdiff[1] .. $cdiff[3]-1 ]; + # Hunk start Hunk end + +Note that the hunks will always alternate between those that are part of +the LCS (those that contain unchanged items) and those that contain +changes. This means that all we need to be told is whether the first +hunk is a 'same' or 'diff' hunk and we can determine which of the other +hunks contain 'same' items or 'diff' items. + +By convention, we always make the first hunk contain unchanged items. +So the 1st, 3rd, 5th, etc. hunks (all odd-numbered hunks if you start +counting from 1) all contain unchanged items. And the 2nd, 4th, 6th, +etc. hunks (all even-numbered hunks if you start counting from 1) all +contain changed items. + +Since @a and @b don't begin with the same value, the first hunk in our +example is empty (otherwise we'd violate the above convention). Note +that the first 4 index values in our example are all zero. Plug these +values into our previous code block and we get: + + @hunk1a = @a[ 0 .. 0-1 ]; + @hunk1b = @b[ 0 .. 0-1 ]; + +And C<0..-1> returns the empty list. + +Move down one pair of indices (2..5) and we get the offset ranges for +the second hunk, which contains changed items. + +Since C<@diff[2..5]> contains (0,0,1,0) in our example, the second hunk +consists of these two lists of items: + + @hunk2a = @a[ $cdiff[2] .. $cdiff[4]-1 ]; + @hunk2b = @b[ $cdiff[3] .. $cdiff[5]-1 ]; + # or + @hunk2a = @a[ 0 .. 1-1 ]; + @hunk2b = @b[ 0 .. 0-1 ]; + # or + @hunk2a = @a[ 0 .. 0 ]; + @hunk2b = @b[ 0 .. -1 ]; + # or + @hunk2a = ( 'a' ); + @hunk2b = ( ); + +That is, we would delete item 0 ('a') from @a. + +Since C<@diff[4..7]> contains (1,0,3,2) in our example, the third hunk +consists of these two lists of items: + + @hunk3a = @a[ $cdiff[4] .. $cdiff[6]-1 ]; + @hunk3a = @b[ $cdiff[5] .. $cdiff[7]-1 ]; + # or + @hunk3a = @a[ 1 .. 3-1 ]; + @hunk3a = @b[ 0 .. 2-1 ]; + # or + @hunk3a = @a[ 1 .. 2 ]; + @hunk3a = @b[ 0 .. 1 ]; + # or + @hunk3a = qw( b c ); + @hunk3a = qw( b c ); + +Note that this third hunk contains unchanged items as our convention demands. + +You can continue this process until you reach the last two indices, +which will always be the number of items in each sequence. This is +required so that subtracting one from each will give you the indices to +the last items in each sequence. + +=head2 C + +C used to be the most general facility provided by +this module (the new OO interface is more powerful and much easier to +use). + +Imagine that there are two arrows. Arrow A points to an element of +sequence A, and arrow B points to an element of the sequence B. +Initially, the arrows point to the first elements of the respective +sequences. C will advance the arrows through the +sequences one element at a time, calling an appropriate user-specified +callback function before each advance. It willadvance the arrows in +such a way that if there are equal elements C<$A[$i]> and C<$B[$j]> +which are equal and which are part of the LCS, there will be some moment +during the execution of C when arrow A is pointing +to C<$A[$i]> and arrow B is pointing to C<$B[$j]>. When this happens, +C will call the C callback function and then +it will advance both arrows. + +Otherwise, one of the arrows is pointing to an element of its sequence +that is not part of the LCS. C will advance that +arrow and will call the C or the C callback, +depending on which arrow it advanced. If both arrows point to elements +that are not part of the LCS, then C will advance +one of them and call the appropriate callback, but it is not specified +which it will call. + +The arguments to C are the two sequences to +traverse, and a hash which specifies the callback functions, like this: + + traverse_sequences( + \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + } + ); + +Callbacks for MATCH, DISCARD_A, and DISCARD_B are invoked with at least +the indices of the two arrows as their arguments. They are not expected +to return any values. If a callback is omitted from the table, it is +not called. + +Callbacks for A_FINISHED and B_FINISHED are invoked with at least the +corresponding index in A or B. + +If arrow A reaches the end of its sequence, before arrow B does, +C will call the C callback when it +advances arrow B, if there is such a function; if not it will call +C instead. Similarly if arrow B finishes first. +C returns when both arrows are at the ends of their +respective sequences. It returns true on success and false on failure. +At present there is no way to fail. + +C may be passed an optional fourth parameter; this +is a CODE reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation function. + +If you want to pass additional parameters to your callbacks, but don't +need a custom key generation function, you can get the default by +passing undef: + + traverse_sequences( + \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + }, + undef, # default key-gen + $myArgument1, + $myArgument2, + $myArgument3, + ); + +C does not have a useful return value; you are +expected to plug in the appropriate behavior with the callback +functions. + +=head2 C + +C is an alternative to C. It +uses a different algorithm to iterate through the entries in the +computed LCS. Instead of sticking to one side and showing element changes +as insertions and deletions only, it will jump back and forth between +the two sequences and report I occurring as deletions on one +side followed immediatly by an insertion on the other side. + +In addition to the C, C, and C callbacks +supported by C, C supports +a C callback indicating that one element got C by another: + + traverse_balanced( + \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + CHANGE => $callback_4, + } + ); + +If no C callback is specified, C +will map C events to C and C actions, +therefore resulting in a similar behaviour as C +with different order of events. + +C might be a bit slower than C, +noticable only while processing huge amounts of data. + +The C function of this module +is implemented as call to C. + +C does not have a useful return value; you are expected to +plug in the appropriate behavior with the callback functions. + +=head1 KEY GENERATION FUNCTIONS + +Most of the functions accept an optional extra parameter. This is a +CODE reference to a key generating (hashing) function that should return +a string that uniquely identifies a given element. It should be the +case that if two elements are to be considered equal, their keys should +be the same (and the other way around). If no key generation function +is provided, the key will be the element as a string. + +By default, comparisons will use "eq" and elements will be turned into keys +using the default stringizing operator '""'. + +Where this is important is when you're comparing something other than +strings. If it is the case that you have multiple different objects +that should be considered to be equal, you should supply a key +generation function. Otherwise, you have to make sure that your arrays +contain unique references. + +For instance, consider this example: + + package Person; + + sub new + { + my $package = shift; + return bless { name => '', ssn => '', @_ }, $package; + } + + sub clone + { + my $old = shift; + my $new = bless { %$old }, ref($old); + } + + sub hash + { + return shift()->{'ssn'}; + } + + my $person1 = Person->new( name => 'Joe', ssn => '123-45-6789' ); + my $person2 = Person->new( name => 'Mary', ssn => '123-47-0000' ); + my $person3 = Person->new( name => 'Pete', ssn => '999-45-2222' ); + my $person4 = Person->new( name => 'Peggy', ssn => '123-45-9999' ); + my $person5 = Person->new( name => 'Frank', ssn => '000-45-9999' ); + +If you did this: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4, $person5 ]; + Algorithm::Diff::diff( $array1, $array2 ); + +everything would work out OK (each of the objects would be converted +into a string like "Person=HASH(0x82425b0)" for comparison). + +But if you did this: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; + Algorithm::Diff::diff( $array1, $array2 ); + +$person4 and $person4->clone() (which have the same name and SSN) +would be seen as different objects. If you wanted them to be considered +equivalent, you would have to pass in a key generation function: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; + Algorithm::Diff::diff( $array1, $array2, \&Person::hash ); + +This would use the 'ssn' field in each Person as a comparison key, and +so would consider $person4 and $person4->clone() as equal. + +You may also pass additional parameters to the key generation function +if you wish. + +=head1 ERROR CHECKING + +If you pass these routines a non-reference and they expect a reference, +they will die with a message. + +=head1 AUTHOR + +This version released by Tye McQueen (http://perlmonks.org/?node=tye). + +=head1 LICENSE + +Parts Copyright (c) 2000-2004 Ned Konz. All rights reserved. +Parts by Tye McQueen. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl. + +=head1 MAILING LIST + +Mark-Jason still maintains a mailing list. To join a low-volume mailing +list for announcements related to diff and Algorithm::Diff, send an +empty mail message to mjd-perl-diff-request@plover.com. + +=head1 CREDITS + +Versions through 0.59 (and much of this documentation) were written by: + +Mark-Jason Dominus, mjd-perl-diff@plover.com + +This version borrows some documentation and routine names from +Mark-Jason's, but Diff.pm's code was completely replaced. + +This code was adapted from the Smalltalk code of Mario Wolczko +, which is available at +ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st + +C and C were written by Mike Schilli +. + +The algorithm is that described in +I, +CACM, vol.20, no.5, pp.350-353, May 1977, with a few +minor improvements to improve the speed. + +Much work was done by Ned Konz (perl@bike-nomad.com). + +The OO interface and some other changes are by Tye McQueen. + +=cut diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/DiffOld.pm b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/DiffOld.pm new file mode 100644 index 0000000..511741a --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/lib/Algorithm/DiffOld.pm @@ -0,0 +1,305 @@ +# This is a version of Algorithm::Diff that uses only a comparison function, +# like versions <= 0.59 used to. +# $Revision: 1.3 $ + +package Algorithm::DiffOld; +use strict; +use vars qw($VERSION @EXPORT_OK @ISA @EXPORT); +use integer; # see below in _replaceNextLargerWith() for mod to make + # if you don't use this +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw(LCS diff traverse_sequences); +$VERSION = 1.10; # manually tracking Algorithm::Diff + +# McIlroy-Hunt diff algorithm +# Adapted from the Smalltalk code of Mario I. Wolczko, +# by Ned Konz, perl@bike-nomad.com + +=head1 NAME + +Algorithm::DiffOld - Compute `intelligent' differences between two files / lists +but use the old (<=0.59) interface. + +=head1 NOTE + +This has been provided as part of the Algorithm::Diff package by Ned Konz. +This particular module is B for people who B to have the old +interface, which uses a comparison function rather than a key generating +function. + +Because each of the lines in one array have to be compared with each +of the lines in the other array, this does M*N comparisions. This can +be very slow. I clocked it at taking 18 times as long as the stock +version of Algorithm::Diff for a 4000-line file. It will get worse +quadratically as array sizes increase. + +=head1 SYNOPSIS + + use Algorithm::DiffOld qw(diff LCS traverse_sequences); + + @lcs = LCS( \@seq1, \@seq2, $comparison_function ); + + $lcsref = LCS( \@seq1, \@seq2, $comparison_function ); + + @diffs = diff( \@seq1, \@seq2, $comparison_function ); + + traverse_sequences( \@seq1, \@seq2, + { MATCH => $callback, + DISCARD_A => $callback, + DISCARD_B => $callback, + }, + $comparison_function ); + +=head1 COMPARISON FUNCTIONS + +Each of the main routines should be passed a comparison function. If you +aren't passing one in, B. + +These functions should return a true value when two items should compare +as equal. + +For instance, + + @lcs = LCS( \@seq1, \@seq2, sub { my ($a, $b) = @_; $a eq $b } ); + +but if that is all you're doing with your comparison function, just use +Algorithm::Diff and let it do this (this is its default). + +Or: + + sub someFunkyComparisonFunction + { + my ($a, $b) = @_; + $a =~ m{$b}; + } + + @diffs = diff( \@lines, \@patterns, \&someFunkyComparisonFunction ); + +which would allow you to diff an array @lines which consists of text +lines with an array @patterns which consists of regular expressions. + +This is actually the reason I wrote this version -- there is no way +to do this with a key generation function as in the stock Algorithm::Diff. + +=cut + +# Find the place at which aValue would normally be inserted into the array. If +# that place is already occupied by aValue, do nothing, and return undef. If +# the place does not exist (i.e., it is off the end of the array), add it to +# the end, otherwise replace the element at that point with aValue. +# It is assumed that the array's values are numeric. +# This is where the bulk (75%) of the time is spent in this module, so try to +# make it fast! + +sub _replaceNextLargerWith +{ + my ( $array, $aValue, $high ) = @_; + $high ||= $#$array; + + # off the end? + if ( $high == -1 || $aValue > $array->[ -1 ] ) + { + push( @$array, $aValue ); + return $high + 1; + } + + # binary search for insertion point... + my $low = 0; + my $index; + my $found; + while ( $low <= $high ) + { + $index = ( $high + $low ) / 2; +# $index = int(( $high + $low ) / 2); # without 'use integer' + $found = $array->[ $index ]; + + if ( $aValue == $found ) + { + return undef; + } + elsif ( $aValue > $found ) + { + $low = $index + 1; + } + else + { + $high = $index - 1; + } + } + + # now insertion point is in $low. + $array->[ $low ] = $aValue; # overwrite next larger + return $low; +} + +# This method computes the longest common subsequence in $a and $b. + +# Result is array or ref, whose contents is such that +# $a->[ $i ] == $b->[ $result[ $i ] ] +# foreach $i in ( 0 .. $#result ) if $result[ $i ] is defined. + +# An additional argument may be passed; this is a CODE ref to a comparison +# routine. By default, comparisons will use "eq" . +# Note that this routine will be called as many as M*N times, so make it fast! + +# Additional parameters, if any, will be passed to the key generation routine. + +sub _longestCommonSubsequence +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $compare = shift || sub { my $a = shift; my $b = shift; $a eq $b }; + + my $aStart = 0; + my $aFinish = $#$a; + my $bStart = 0; + my $bFinish = $#$b; + my $matchVector = []; + + # First we prune off any common elements at the beginning + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[ $aStart ], $b->[ $bStart ], @_ ) ) + { + $matchVector->[ $aStart++ ] = $bStart++; + } + + # now the end + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[ $aFinish ], $b->[ $bFinish ], @_ ) ) + { + $matchVector->[ $aFinish-- ] = $bFinish--; + } + + my $thresh = []; + my $links = []; + + my ( $i, $ai, $j, $k ); + for ( $i = $aStart; $i <= $aFinish; $i++ ) + { + $k = 0; + # look for each element of @b between $bStart and $bFinish + # that matches $a->[ $i ], in reverse order + for ($j = $bFinish; $j >= $bStart; $j--) + { + next if ! &$compare( $a->[$i], $b->[$j], @_ ); + # optimization: most of the time this will be true + if ( $k + and $thresh->[ $k ] > $j + and $thresh->[ $k - 1 ] < $j ) + { + $thresh->[ $k ] = $j; + } + else + { + $k = _replaceNextLargerWith( $thresh, $j, $k ); + } + + # oddly, it's faster to always test this (CPU cache?). + if ( defined( $k ) ) + { + $links->[ $k ] = + [ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ]; + } + } + } + + if ( @$thresh ) + { + for ( my $link = $links->[ $#$thresh ]; $link; $link = $link->[ 0 ] ) + { + $matchVector->[ $link->[ 1 ] ] = $link->[ 2 ]; + } + } + + return wantarray ? @$matchVector : $matchVector; +} + +sub traverse_sequences +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $callbacks = shift || { }; + my $compare = shift; + my $matchCallback = $callbacks->{'MATCH'} || sub { }; + my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; + my $finishedACallback = $callbacks->{'A_FINISHED'}; + my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; + my $finishedBCallback = $callbacks->{'B_FINISHED'}; + my $matchVector = _longestCommonSubsequence( $a, $b, $compare, @_ ); + # Process all the lines in match vector + my $lastA = $#$a; + my $lastB = $#$b; + my $bi = 0; + my $ai; + for ( $ai = 0; $ai <= $#$matchVector; $ai++ ) + { + my $bLine = $matchVector->[ $ai ]; + if ( defined( $bLine ) ) # matched + { + &$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine; + &$matchCallback( $ai, $bi++, @_ ); + } + else + { + &$discardACallback( $ai, $bi, @_ ); + } + } + # the last entry (if any) processed was a match. + + if ( defined( $finishedBCallback ) && $ai <= $lastA ) + { + &$finishedBCallback( $bi, @_ ); + } + else + { + &$discardACallback( $ai++, $bi, @_ ) while ( $ai <= $lastA ); + } + + if ( defined( $finishedACallback ) && $bi <= $lastB ) + { + &$finishedACallback( $ai, @_ ); + } + else + { + &$discardBCallback( $ai, $bi++, @_ ) while ( $bi <= $lastB ); + } + return 1; +} + +sub LCS +{ + my $a = shift; # array ref + my $matchVector = _longestCommonSubsequence( $a, @_ ); + my @retval; + my $i; + for ( $i = 0; $i <= $#$matchVector; $i++ ) + { + if ( defined( $matchVector->[ $i ] ) ) + { + push( @retval, $a->[ $i ] ); + } + } + return wantarray ? @retval : \@retval; +} + +sub diff +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $retval = []; + my $hunk = []; + my $discard = sub { push( @$hunk, [ '-', $_[ 0 ], $a->[ $_[ 0 ] ] ] ) }; + my $add = sub { push( @$hunk, [ '+', $_[ 1 ], $b->[ $_[ 1 ] ] ] ) }; + my $match = sub { push( @$retval, $hunk ) if scalar(@$hunk); $hunk = [] }; + traverse_sequences( $a, $b, + { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add }, + @_ ); + &$match(); + return wantarray ? @$retval : $retval; +} + +1; diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/base.t b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/base.t new file mode 100644 index 0000000..7ad823a --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/base.t @@ -0,0 +1,402 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl base.t' +use strict; +$^W++; +use lib qw(blib lib); +use Algorithm::Diff qw(diff LCS traverse_sequences traverse_balanced sdiff); +use Data::Dumper; +use Test; + +BEGIN +{ + $|++; + plan tests => 35; + $SIG{__DIE__} = sub # breakpoint on die + { + $DB::single = 1; + $DB::single = 1; # avoid complaint + die @_; + } +} + +my @a = qw(a b c e h j l m n p); +my @b = qw(b c d e f j k l m r s t); +my @correctResult = qw(b c e j l m); +my $correctResult = join(' ', @correctResult); +my $skippedA = 'a h n p'; +my $skippedB = 'd f k r s t'; + +# From the Algorithm::Diff manpage: +my $correctDiffResult = [ + [ [ '-', 0, 'a' ] ], + + [ [ '+', 2, 'd' ] ], + + [ [ '-', 4, 'h' ], [ '+', 4, 'f' ] ], + + [ [ '+', 6, 'k' ] ], + + [ + [ '-', 8, 'n' ], + [ '+', 9, 'r' ], + [ '-', 9, 'p' ], + [ '+', 10, 's' ], + [ '+', 11, 't' ], + ] +]; + +# Result of LCS must be as long as @a +my @result = Algorithm::Diff::_longestCommonSubsequence( \@a, \@b ); +ok( scalar(grep { defined } @result), + scalar(@correctResult), + "length of _longestCommonSubsequence" ); + +# result has b[] line#s keyed by a[] line# +# print "result =", join(" ", map { defined($_) ? $_ : 'undef' } @result), "\n"; + +my @aresult = map { defined( $result[$_] ) ? $a[$_] : () } 0 .. $#result; +my @bresult = + map { defined( $result[$_] ) ? $b[ $result[$_] ] : () } 0 .. $#result; + +ok( "@aresult", $correctResult, "A results" ); +ok( "@bresult", $correctResult, "B results" ); + +my ( @matchedA, @matchedB, @discardsA, @discardsB, $finishedA, $finishedB ); + +sub match +{ + my ( $a, $b ) = @_; + push ( @matchedA, $a[$a] ); + push ( @matchedB, $b[$b] ); +} + +sub discard_b +{ + my ( $a, $b ) = @_; + push ( @discardsB, $b[$b] ); +} + +sub discard_a +{ + my ( $a, $b ) = @_; + push ( @discardsA, $a[$a] ); +} + +sub finished_a +{ + my ( $a, $b ) = @_; + $finishedA = $a; +} + +sub finished_b +{ + my ( $a, $b ) = @_; + $finishedB = $b; +} + +traverse_sequences( + \@a, + \@b, + { + MATCH => \&match, + DISCARD_A => \&discard_a, + DISCARD_B => \&discard_b + } +); + +ok( "@matchedA", $correctResult); +ok( "@matchedB", $correctResult); +ok( "@discardsA", $skippedA); +ok( "@discardsB", $skippedB); + +@matchedA = @matchedB = @discardsA = @discardsB = (); +$finishedA = $finishedB = undef; + +traverse_sequences( + \@a, + \@b, + { + MATCH => \&match, + DISCARD_A => \&discard_a, + DISCARD_B => \&discard_b, + A_FINISHED => \&finished_a, + B_FINISHED => \&finished_b, + } +); + +ok( "@matchedA", $correctResult); +ok( "@matchedB", $correctResult); +ok( "@discardsA", $skippedA); +ok( "@discardsB", $skippedB); +ok( $finishedA, 9, "index of finishedA" ); +ok( $finishedB, undef, "index of finishedB" ); + +my @lcs = LCS( \@a, \@b ); +ok( "@lcs", $correctResult ); + +# Compare the diff output with the one from the Algorithm::Diff manpage. +my $diff = diff( \@a, \@b ); +$Data::Dumper::Indent = 0; +my $cds = Dumper($correctDiffResult); +my $dds = Dumper($diff); +ok( $dds, $cds ); + +################################################## +# m@perlmeister.com 03/23/2002: +# Tests for sdiff-interface +################################################# + +@a = qw(abc def yyy xxx ghi jkl); +@b = qw(abc dxf xxx ghi jkl); +$correctDiffResult = [ ['u', 'abc', 'abc'], + ['c', 'def', 'dxf'], + ['-', 'yyy', ''], + ['u', 'xxx', 'xxx'], + ['u', 'ghi', 'ghi'], + ['u', 'jkl', 'jkl'] ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + + +################################################# +@a = qw(a b c e h j l m n p); +@b = qw(b c d e f j k l m r s t); +$correctDiffResult = [ ['-', 'a', '' ], + ['u', 'b', 'b'], + ['u', 'c', 'c'], + ['+', '', 'd'], + ['u', 'e', 'e'], + ['c', 'h', 'f'], + ['u', 'j', 'j'], + ['+', '', 'k'], + ['u', 'l', 'l'], + ['u', 'm', 'm'], + ['c', 'n', 'r'], + ['c', 'p', 's'], + ['+', '', 't'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a b c d e); +@b = qw(a e); +$correctDiffResult = [ ['u', 'a', 'a' ], + ['-', 'b', ''], + ['-', 'c', ''], + ['-', 'd', ''], + ['u', 'e', 'e'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a e); +@b = qw(a b c d e); +$correctDiffResult = [ ['u', 'a', 'a' ], + ['+', '', 'b'], + ['+', '', 'c'], + ['+', '', 'd'], + ['u', 'e', 'e'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(v x a e); +@b = qw(w y a b c d e); +$correctDiffResult = [ + ['c', 'v', 'w' ], + ['c', 'x', 'y' ], + ['u', 'a', 'a' ], + ['+', '', 'b'], + ['+', '', 'c'], + ['+', '', 'd'], + ['u', 'e', 'e'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(x a e); +@b = qw(a b c d e); +$correctDiffResult = [ + ['-', 'x', '' ], + ['u', 'a', 'a' ], + ['+', '', 'b'], + ['+', '', 'c'], + ['+', '', 'd'], + ['u', 'e', 'e'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a e); +@b = qw(x a b c d e); +$correctDiffResult = [ + ['+', '', 'x' ], + ['u', 'a', 'a' ], + ['+', '', 'b'], + ['+', '', 'c'], + ['+', '', 'd'], + ['u', 'e', 'e'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a e v); +@b = qw(x a b c d e w x); +$correctDiffResult = [ + ['+', '', 'x' ], + ['u', 'a', 'a' ], + ['+', '', 'b'], + ['+', '', 'c'], + ['+', '', 'd'], + ['u', 'e', 'e'], + ['c', 'v', 'w'], + ['+', '', 'x'], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(); +@b = qw(a b c); +$correctDiffResult = [ + ['+', '', 'a' ], + ['+', '', 'b' ], + ['+', '', 'c' ], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a b c); +@b = qw(); +$correctDiffResult = [ + ['-', 'a', '' ], + ['-', 'b', '' ], + ['-', 'c', '' ], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a b c); +@b = qw(1); +$correctDiffResult = [ + ['c', 'a', '1' ], + ['-', 'b', '' ], + ['-', 'c', '' ], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a b c); +@b = qw(c); +$correctDiffResult = [ + ['-', 'a', '' ], + ['-', 'b', '' ], + ['u', 'c', 'c' ], + ]; +@result = sdiff(\@a, \@b); +ok(Dumper(\@result), Dumper($correctDiffResult)); + +################################################# +@a = qw(a b c); +@b = qw(a x c); +my $r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "M 0 0C 1 1M 2 2"); + +################################################# +# No CHANGE callback => use discard_a/b instead +@a = qw(a b c); +@b = qw(a x c); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + } ); +ok($r, "M 0 0DA 1 1DB 2 1M 2 2"); + +################################################# +@a = qw(a x y c); +@b = qw(a v w c); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "M 0 0C 1 1C 2 2M 3 3"); + +################################################# +@a = qw(x y c); +@b = qw(v w c); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "C 0 0C 1 1M 2 2"); + +################################################# +@a = qw(a x y z); +@b = qw(b v w); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "C 0 0C 1 1C 2 2DA 3 3"); + +################################################# +@a = qw(a z); +@b = qw(a); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "M 0 0DA 1 1"); + +################################################# +@a = qw(z a); +@b = qw(a); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "DA 0 0M 1 0"); + +################################################# +@a = qw(a b c); +@b = qw(x y z); +$r = ""; +traverse_balanced( \@a, \@b, + { MATCH => sub { $r .= "M @_";}, + DISCARD_A => sub { $r .= "DA @_";}, + DISCARD_B => sub { $r .= "DB @_";}, + CHANGE => sub { $r .= "C @_";}, + } ); +ok($r, "C 0 0C 1 1C 2 2"); diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/oo.t b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/oo.t new file mode 100644 index 0000000..a4cf26a --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl-1.19.02/t/oo.t @@ -0,0 +1,212 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl oo.t' +use strict; +BEGIN { $^W++; } +use lib qw( blib lib ); +use Algorithm::Diff qw( compact_diff ); +use Data::Dumper; +use Test qw( plan ok $ntest ); + +BEGIN +{ + $|++; + plan( tests => 969 ); + $SIG{__DIE__} = sub # breakpoint on die + { + $DB::single = 1 + if ! $^S; + die @_; + }; + $SIG{__WARN__} = sub # breakpoint on warn + { + $DB::single = 1; + warn @_; + }; +} + +sub Ok($$) { @_= reverse @_; goto &ok } + +my( $first, $a, $b, $hunks ); +for my $pair ( + [ "a b c e h j l m n p", + " b c d e f j k l m r s t", 9 ], + [ "", "", 0 ], + [ "a b c", "", 1 ], + [ "", "a b c d", 1 ], + [ "a b", "x y z", 1 ], + [ " c e h j l m n p r", + "a b c d f g j k l m s t", 7 ], + [ "a b c d", + "a b c d", 1 ], + [ "a d", + "a b c d", 3 ], + [ "a b c d", + "a d", 3 ], + [ "a b c d", + " b c ", 3 ], + [ " b c ", + "a b c d", 3 ], +) { + $first= $ntest; + ( $a, $b, $hunks )= @$pair; + my @a = split ' ', $a; + my @b = split ' ', $b; + + my $d = Algorithm::Diff->new( \@a, \@b ); + + if( @ARGV ) { + print "1: $a$/2: $b$/"; + while( $d->Next() ) { + printf "%10s %s %s$/", + join(' ',$d->Items(1)), + $d->Same() ? '=' : '|', + join(' ',$d->Items(2)); + } + } + + Ok( 0, $d->Base() ); + Ok( 0, $d->Base(undef) ); + Ok( 0, $d->Base(1) ); + Ok( 1, $d->Base(undef) ); + Ok( 1, $d->Base(0) ); + + ok( ! eval { $d->Diff(); 1 } ); + ok( $@, qr/\breset\b/i ); + ok( ! eval { $d->Same(); 1 } ); + ok( $@, qr/\breset\b/i ); + ok( ! eval { $d->Items(1); 1 } ); + ok( $@, qr/\breset\b/i ); + ok( ! eval { $d->Range(2); 1 } ); + ok( $@, qr/\breset\b/i ); + ok( ! eval { $d->Min(1); 1 } ); + ok( $@, qr/\breset\b/i ); + ok( ! eval { $d->Max(2); 1 } ); + ok( $@, qr/\breset\b/i ); + ok( ! eval { $d->Get('Min1'); 1 } ); + ok( $@, qr/\breset\b/i ); + + ok( ! $d->Next(0) ); + ok( ! eval { $d->Same(); 1 } ); + ok( $@, qr/\breset\b/i ); + Ok( 1, $d->Next() ) if 0 < $hunks; + Ok( 2, $d->Next(undef) ) if 1 < $hunks; + Ok( 3, $d->Next(1) ) if 2 < $hunks; + Ok( 2, $d->Next(-1) ) if 1 < $hunks; + ok( ! $d->Next(-2) ); + ok( ! eval { $d->Same(); 1 } ); + ok( $@, qr/\breset\b/i ); + + ok( ! $d->Prev(0) ); + ok( ! eval { $d->Same(); 1 } ); + ok( $@, qr/\breset\b/i ); + Ok( -1, $d->Prev() ) if 0 < $hunks; + Ok( -2, $d->Prev(undef) ) if 1 < $hunks; + Ok( -3, $d->Prev(1) ) if 2 < $hunks; + Ok( -2, $d->Prev(-1) ) if 1 < $hunks; + ok( ! $d->Prev(-2) ); + + Ok( 1, $d->Next() ) if 0 < $hunks; + ok( ! $d->Prev() ); + Ok( 1, $d->Next() ) if 0 < $hunks; + ok( ! $d->Prev(2) ); + Ok( -1, $d->Prev() ) if 0 < $hunks; + ok( ! $d->Next() ); + Ok( -1, $d->Prev() ) if 0 < $hunks; + ok( ! $d->Next(5) ); + + Ok( 1, $d->Next() ) if 0 < $hunks; + Ok( $d, $d->Reset() ); + ok( ! $d->Prev(0) ); + Ok( 3, $d->Reset(3)->Next(0) ) if 2 < $hunks; + Ok( -3, $d->Reset(-2)->Prev() ) if 2 < $hunks; + Ok( $hunks || !1, $d->Reset(0)->Next(-1) ); + + my $c = $d->Copy(); + ok( $c->Base(), $d->Base() ); + ok( $c->Next(0), $d->Next(0) ); + ok( $d->Copy(-4)->Next(0), + $d->Copy()->Reset(-4)->Next(0) ); + + $c = $d->Copy( undef, 1 ); + Ok( 1, $c->Base() ); + ok( $c->Next(0), $d->Next(0) ); + + $d->Reset(); + my( @A, @B ); + while( $d->Next() ) { + if( $d->Same() ) { + Ok( 0, $d->Diff() ); + ok( $d->Same(), $d->Range(2) ); + ok( $d->Items(2), $d->Range(1) ); + ok( "@{[$d->Same()]}", + "@{[$d->Items(1)]}" ); + ok( "@{[$d->Items(1)]}", + "@{[$d->Items(2)]}" ); + ok( "@{[$d->Items(2)]}", + "@a[$d->Range(1)]" ); + ok( "@a[$d->Range(1,0)]", + "@b[$d->Range(2)]" ); + push @A, $d->Same(); + push @B, @b[$d->Range(2)]; + } else { + Ok( 0, $d->Same() ); + ok( $d->Diff() & 1, 1*!!$d->Range(1) ); + ok( $d->Diff() & 2, 2*!!$d->Range(2) ); + ok( "@{[$d->Items(1)]}", + "@a[$d->Range(1)]" ); + ok( "@{[$d->Items(2)]}", + "@b[$d->Range(2,0)]" ); + push @A, @a[$d->Range(1)]; + push @B, $d->Items(2); + } + } + ok( "@A", "@a" ); + ok( "@B", "@b" ); + + next if ! $hunks; + + Ok( 1, $d->Next() ); + { local $^W= 0; + ok( ! eval { $d->Items(); 1 } ); } + ok( ! eval { $d->Items(0); 1 } ); + { local $^W= 0; + ok( ! eval { $d->Range(); 1 } ); } + ok( ! eval { $d->Range(3); 1 } ); + { local $^W= 0; + ok( ! eval { $d->Min(); 1 } ); } + ok( ! eval { $d->Min(-1); 1 } ); + { local $^W= 0; + ok( ! eval { $d->Max(); 1 } ); } + ok( ! eval { $d->Max(9); 1 } ); + + $d->Reset(-1); + $c= $d->Copy(undef,1); + ok( "@a[$d->Range(1)]", + "@{[(0,@a)[$c->Range(1)]]}" ); + ok( "@b[$c->Range(2,0)]", + "@{[(0,@b)[$d->Range(2,1)]]}" ); + ok( "@a[$d->Get('min1')..$d->Get('0Max1')]", + "@{[(0,@a)[$d->Get('1MIN1')..$c->Get('MAX1')]]}" ); + + ok( "@{[$c->Min(1),$c->Max(2,0)]}", + "@{[$c->Get('Min1','0Max2')]}" ); + ok( ! eval { scalar $c->Get('Min1','0Max2'); 1 } ); + ok( "@{[0+$d->Same(),$d->Diff(),$d->Base()]}", + "@{[$d->Get(qq)]}" ); + ok( "@{[0+$d->Range(1),0+$d->Range(2)]}", + "@{[$d->Get(qq)]}" ); + { local $^W= 0; + ok( ! eval { $c->Get('range'); 1 } ); + ok( ! eval { $c->Get('min'); 1 } ); + ok( ! eval { $c->Get('max'); 1 } ); } + +} continue { + if( @ARGV ) { + my $tests= $ntest - $first; + print "$hunks hunks, $tests tests.$/"; + } +} + +# $d = Algorithm::Diff->new( \@a, \@b, {KeyGen=>sub...} ); + +# @cdiffs = compact_diff( \@seq1, \@seq2 ); diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1.diff.gz b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c5bd82bdb26b2326af60a2fbf36d18baf5ab9f7 GIT binary patch literal 3250 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 +Uploaders: gregor herrmann +Homepage: http://search.cpan.org/dist/Algorithm-Diff/ +Standards-Version: 3.7.3 +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libalgorithm-diff-perl/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libalgorithm-diff-perl/ +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl (>= 5.6.0-16) +Files: + ff3e17ae485f8adfb8857b183991fbce 33529 libalgorithm-diff-perl_1.19.02.orig.tar.gz + dcef32c267f1f8955ae168b1a2256b3e 3250 libalgorithm-diff-perl_1.19.02-1.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.6 (GNU/Linux) + +iD8DBQFH1QQqHqjlqpcl9jsRAk4zAJ9N9ZqnSEkrkb1YxRPLtL6o/LaNpwCgts0y +17YZq6b5k5dEIIqMy6E81Zk= +=6+cJ +-----END PGP SIGNATURE----- diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.diff.gz b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..47143af32f1ac0e13953702876291be72cee904d GIT binary patch literal 3320 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 CZ+-p% literal 0 HcmV?d00001 diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.dsc b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.dsc new file mode 100644 index 0000000..d9c5867 --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1.dsc @@ -0,0 +1,13 @@ +Format: 1.0 +Source: libalgorithm-diff-perl +Version: 1.19.02-1maemo1 +Binary: libalgorithm-diff-perl +Maintainer: Debian Perl Group +Architecture: all +Standards-Version: 3.7.3 +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl (>= 5.6.0-16) +Uploaders: gregor herrmann +Files: + ff3e17ae485f8adfb8857b183991fbce 33529 libalgorithm-diff-perl_1.19.02.orig.tar.gz + 161cb9a9e0c9f31cb67509ed14f90a0c 3320 libalgorithm-diff-perl_1.19.02-1maemo1.diff.gz diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1_armel.changes b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1_armel.changes new file mode 100644 index 0000000..17e59ad --- /dev/null +++ b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02-1maemo1_armel.changes @@ -0,0 +1,20 @@ +Format: 1.7 +Date: Wed, 14 Apr 2010 07:09:51 +0100 +Source: libalgorithm-diff-perl +Binary: libalgorithm-diff-perl +Architecture: source all +Version: 1.19.02-1maemo1 +Distribution: fremantle +Urgency: low +Maintainer: Debian Perl Group +Changed-By: Nito Martinez +Description: + libalgorithm-diff-perl - a perl library for finding Longest Common Sequences in text +Changes: + libalgorithm-diff-perl (1.19.02-1maemo1) fremantle; urgency=low + . + * New Maemo packaging +Files: + ee8443a24044661783215f6b4264b6a3 526 perl optional libalgorithm-diff-perl_1.19.02-1maemo1.dsc + 161cb9a9e0c9f31cb67509ed14f90a0c 3320 perl optional libalgorithm-diff-perl_1.19.02-1maemo1.diff.gz + 117881f1f9020a0ccff71382f64527cf 51688 perl optional libalgorithm-diff-perl_1.19.02-1maemo1_all.deb diff --git a/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02.orig.tar.gz b/deb-src/libalgorithm-diff-perl/libalgorithm-diff-perl_1.19.02.orig.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..162751454430e0ec520f1422b702aec0d3397a64 GIT binary patch literal 33529 zcmV(wK5ivk|t3Y3Kra)O6#1tVXBN{r1a8Rd+QHS)TFkTwDwh zHmJHPGb=0Km9XQF!pKX;ljgoR95y?x&dYXp{lRyAwcAhIFP=Ta_x7{rFS_*JdGV}G z@8uDUV z_q|}9c3)a8t-{YF3RRd!;V5z@;05rWAHiNYy^g%mIDyW~m;V9pn*Z5?{cz$1Y21R^ zpE>IHx;7ag>LGj77Wv1Kpt5`>E%LvwIA_fYkt)QPScQ$Ym2 zCILqQ9vYpz=PTrZhkGkS8mEr$U&BN>h_*~@gK!AM!*YX8UnWA35+kzt2+m%ipSEBZ zj}Ijyj8x(c7%<7nAav=!)OVq;5CraOf>U6m0u?bh90L-&L9)r8Gqbp{LCOGMu4=TW z`eq3+zdb(P-8qIIcFvA=c8?Fv0ao!vTpyyq!Ii51Q=uR`E~HZuJ_iOWN*olvX^7k; zDO3)gl`w(`6#8l7wAmOzSwMzSILQ~Fl=?nP2`=bgL*?*zAH~pYu3axpXb@-ij#V&9 z#=U)>tAc@oEojpYlom75iWtUea2dnnzB9N)ZFJ+u4b)5|0RkoJ6FW$Z%(@z@09@S1 z2s9W%xP9RE{?5<0poUypUGge1b!qI3h?rNepnPz$|KWV+?Lm37^nr#qpwfnqH_ZY3 z2F*RKM@>b44e7s>{`(-~x1S;OUFHgUD|#;hzHqI}T(>lxl^dRDc*tn|P!{YhTTtcs z)wyL*^CnZ@Bhm(Sfq@c+$AwnQfp`#k(}ZjbpDywVty)5Vg)kU90dC&VjUxrphluJ@ z5wyP8t4MSn!U(ON%t?jXRE)_zw)bJ#f_rQ))!X}mluW}YfiOU=LMgzVp~OZIgsgHb zoUsP{y4%9l3}CO;dR*5~V4fwF4*d384ito*0Y2&IzYBZcJ3YBL_{T+=p521- z;~8v&%5qdsz6SzjAz)4}19Y&z6vl7{#&8*ovx6TF&dv{dcfk5U?5%t&f74|cQFacG z?m(B`lfS$0lvjB4d0-&Z5Y*MSN&n>@8#X9%U+ zQpr$@_{r6e(8Sa#y+%>Xj8>)fI=qIC*$-pb3nv)5k~2aBC5A-o(p1MWG1{jfRzXbR z0Abcx7o$@5KzT~`FO)E)i3^)(1)8`3O}0a!p6`cO%GIc7g}A#qnqM@KF>I4XfUPa) zk}K9P*gu7fzaPN<(c$4kF*IaPJ4gq;ck9S|UbtD3r|3o^dP?uzI@vD@Uyu*R{9!OK zq!>rMBL>Q`a63OuG%}ffWNG31n>h2Vc&^$ zJnF!%9}X@d?Ej($3A-bLL<&jowNFgnCm~S%iq5m0Nsi3ioYNcqz%X9UzkJ9JS=h$Y zgcsUHe+tT?sf?qODTb}?XhQU%{-y;bvnCYt#q7WmC(*)M-!zXZ?=Fts9pKZKn>IyS zB4qX_3h-lO3ML-N5ywxwiK}TKt9N*R$hTUXD70-jEre)f+;ARk}bOOVl*p4XDI0j z#Ux}xS|w6Zk`>|^3lGX?@i3V-+&V^yKoK@l%M%+j23_+bpb$vQi`fuahoKiCjl>8f zAPUpbxWx0(@`R);Cej~_6$&TEO|nf2K>8%Hm?lsb5QJHz#i18NVZkZ-mq(9;^yX_f zRB=y3t7S~4{jKO3Q#8gZaC`Ju%{m4Goq3uS^Pu@!g2mp9zBDXXWfqsvS`oRJpXT05 zz>qg*?vNC$>H{jAX6YL-B9!+GMKYx~DqzqI?{{+RC&Ii4J&>{$RLW zVUkJWaG$t0%Harm3wA^@(at&O!$Zt^(e~|%(1-~%!qis-hw^Jm@y7}Q8CiV~rR zXw)Ivbqd1i_M_vy^NkHQ@ip1OAdDgvPs0GulL|@*op)Fl2wj4(AeDz2YY7tC8nqgA zJ5h0X!`5!|IvJ9O4-+bFNWK^^OX+#dp?D$Ow8I_i%eC{v;0*VQN1hpKed0Zq2oB|Xo2ATG3Qxqs%jswn&tV-y z=klk=QgFQg&{}G-X=|B?5R~16!_%_^0mi1yK(IEvRfM;uDQmvIDf=-lEm%@w zTH9K_PJ5i~NKMcn^qeSit|fr+Fh-9OJu)WuNCF}nglw0`JXO|eNay5{xDw1#{0QY{ zv#=QB7BhlS`Ozw>Ah89}s1>nxoWxl$R^VxV1~Qxl zW<^Hl(`0xv7h#9uafiH5pFZ{J6EnGEKF|m%Z%5utJcbKNz6;d6fr|b2$2NQ>;UJFo zg0OrG8_+b#rqliE@@8lG@;+lPY!a8-f8U9{-~H)XaESOyY}mplv>u6S7IkZb zCTN_*Lww(oy=QB>w8l0^w5Gdh;py`ES$GiV+8my~g{Lcc`W7C&T5hK)P_Ze>)2~{#heh7SBGY68g?Z!@ z@=)HKHj)SkjDNvo}%WscZ9lSsixj@McEBcsV{H&1DoDizeK)Wg&!p z=&}v7{Lf8c89d?$lxk3c6>uk43VjsoqZ5tVESBV8%}D1BEpY=_BX9_lE|0abnr=ea-zXP0*M(z-sO_mb%5yeG=CqtWLe_Q8>? zgu;|`>e5Z@L*UXQAEFnxn9p|R{B=Gr(XXun*+sRU-{gYX-7L6E1I{X;wtbVW)VBHd zwgEV5t<4??dvN}!UHbe`J`bw(JoDUU^jsL&f<+1|D7YL{ zD0Kl9q?KMnhmP* zKQxAZ&+!MT?%Gb;@_x(JhfjQwoO(link=TSroDYgK zqzo=A{yN+;lQ~+c{hEC+2rJew3d-X(yJF5G-DNYo)=Z6%?64d>8rA77-AnRGWpa)@ z#0TYKom>dgFf>vw`{`|Bp3KRX)G4nq5Di8RVOn0oCLLo2aayLY;4LZEu(I0^UVhgi zDSu^^ngXcCZ)9%`E_v4&H zE^fFxx8c|K-0PzZHcyc2p%RODQmfJlNuz2cw1O3Pg3@Cj4sN@-!k*rLIbCH%1t4!&b>h#teUAou6 zG89sumU^9(`#66PRuxfe&1abMIm0a5oWpEp6>%dfFS11>M*Yj{^X3*jj6KuLD2MX6 z`xqx;ZbE)LaV`zK0xi<-=nOC*43b>xeDvaX=DuTZSw_ifk@2xn*cs_Wt=(wnQoF>= zA%0SH&-h5v?|A*Eby%NK>^M#*q(4<{b_*H4ecdP?cwwN<7Ra8JMH_481REMkqunSYQ5DPVd!MO+VWn82(3`a!k`|20 z`ln!4GF%tXy2qB$%Pstjakuk`?_=Dxm3>@%W!L+^)As+7a7yESpG7tL8fi*533LIT zU(AsODa4ApYup=}f=gEZr%XUwF-{n?&6Bp?A|tZx6gY8TW3$ZKP&`ox?5Wd9?wEy^ zTUe^{_cA{#x$U{P@mX19crqdvsA3`VZ%Wj^GHbz>TBViTYAmxg3+>1)TaJ6E(EUQf zObVM4AL@$AqSNi>^_ID#?cU>P#io7x(RTmjqg}h#(OMS!&pKLd9}ATet__%eYF@@o z1R(ufRy%zQ&UFtxWrrZG!E(hYUqPTaPU-^_eW#eUqf8{@l8jX8+d=Dw#p*>h#kZ_2 zq+wlASk~Pp-?ST0n#Ny@V9V!1ttxl#s#=HBGt-6Mvz`pA_0}J(hW*Qn9OPCg*y|Tc zG`cY#3BL5C+%1jhaVR#QIg7~hLdW;6n5e%BCV!}4l1(E;Z(tD2sdp}E)Q&pS?fr*q zC$$;)RPlT>TT!7Zzy=Q5^_30|8iD*5X8Yf0*7QKRMUDwp&BYH&Ch8AK4XPKO_he!^ z5;7ZDI1)A@Z^ej_gvg-oelqEq^_>j9!VuIQBY+Y{$x>?Na;yp|gW;>?mfcRteyGY! zX&~iQD)IZyXub){6z-wcp-pw`^R@@q%@~`S+)zqq1E*-kbKo`Q+lGAIW{tus$u5oPf5{fwF zu-0r_E!UM>+2mKyrE70mu%Q>|j(stqeg4vE6rs1E3#?gz&|tRc4)TqGPF6-bGxX!~ z5{bCg%5Ar7F6`ypm5$3D{__`Bf*Q+`l*XLyQb;AA>KBt z1ZT~Ny1B8TrHZ^S^@K_<1)_-whpT**DC#Yx)=yt-0)-wm-E@(C`4ML*Oy5Y(bqgMU ziH`ggeToa7h6X>8*Ga35w`%-7B{WIz-mfi`LOt*xXV|3!K%b zMm?@SDqT41OSc+D!lv}eF@XiHv^v`hSsBdU_mj&ry{+<{Q4@`_jF1q=5{~JeOI?l_ zFm9C==L_2gjkr`a5Xh#6JjLzfC;nbHyI30A&bGtnr*(=m&DU&8zk|c&u+r~jsADPJ6|QXPO# zg`OCx!{h{h-xf4GWec1u%D~qMS-X>v+dSwjnBmfczg~a#@4qD9^%sDC$M63BZ;#xddk((ar6QsHs72nd9Hl`(U)bTw4*hHpL!ds(YD@nV$}G@qIR@dE^qW0D z6U%{wty=gEmfeH5M5Y1u75^u0d)5DU5{{6PQeOMk3|Di`Qg^bMAtx9=nl zPDv+-R7NhSDU_y9eadw%p%QSPC`F@8LP>vT@He_?<600-tnnse3gccre`%W8D(6RU zZ+gA`qk~?LVl#4-tI)?7^-_NJC8X9fxhKlo+A90I8yh;W!The!Vut|%JVX|pZ)U^P z$Yvtw+XCJncg{|hBc`zDZp=9j4v{P*x~On^S*uhqw8lqU*{_n|G#G^#m_I`1@waJf zIzgqckI)xKbPYNtHc?K(-*k1n2x<)fBa|^?f&qOI8DI>*;0GTj5Wuu-8V<|wzwLc_ zW7|fO@BC|giZ-o;Um zl`ATp_i}IODPDdw=jONEEBxv5V6&q&lXSe=D2?_cGhUfHzHpCqGGGd zThn^WiwT5Hu9$nepi}3g%qza3yGIbGGPnMay0G%8{1*aS$9*CTWm5*ic=yM-R~^q` z4wm`3Jzw7>xxGSCRS2(HrVOfYtr(5CV0>#*RemCzK)7-T@c}w3cS_zKz!eQmp;zC8 zL2#v-sqI=gHl^=c&BT0%|5F3=CbIAcuV4yjY9AbQrB$uYm&5CWa1d3X?<;SV&6+9y zUcOR$?P@h0c*YojwybH^xb2-VLEBm~{{kV^ju*adW!|)w*7M&st8N`e^y;RGNX`LK zrvg|s68Z_pFKl&`S=p+YUnh5dA?lSx(_cDwV*hQX1%cMrv|yLxYub2a?Fqi3jc2r^ zUpIg+3Rha!pmg6g6}0w5wkV>l{vft9I^vIfzhxr6(0$0hKB_ zR4l+zZ|6ys)v8B7mS91q5-qGZ*+q4f`S|^JbF<~wZdUzm>@gPzWrkvibz1Q^OxGTw zMF*-ap|hwhB8jf$`rUNS=_#Lf>}GklnrTQQEBS-ufT+h{7jx*@{oGLob_}|bmL01Q z3so~)JGPzW+!1&#kDbXgP9Aq5On~v&7avYizm_>>7nQY~kYBo0Sh}?J>22Ej;Y9(@ zW{X(Z$t!kQTkWg0)n3$A_|~7^;ew_zrD{zoSJYPLtq<7ww&a3iyXK!F1qF5p zF>+0L+^8QWt^ffniWD!ZqR00@=GLEY-n?vSGj-_1XlLrQt6#B*R|EW&)-VGsUY&)I z&v&~3{(h(Pl0Z7VZOF7+VaX>4rL7%)+9^2#z#*iZ_Ce|CqQgO2`Xq6-pssOo1sAZ} zjur8SR#2>&Wm&G&fxzj~4y4%X7jytd{nF-9sNVXL)`^L~ymcz{L)v(bV%MF4RM$Ho z5wVv%imx^60$!z}z>S<>|W{Y;M#8u<35S=jki(DsZTNqW1$I>oWbK`f5 zqZf7yYR&QA=%IPrJLXd2RZH26`9bNFfBp3#2R~K-t5th2Q`DqNMb(rP`g z5>kfoRPAR))64%hoQCK^?t-tNh^m=Se~Zq4jD{PV$*j|8G-TJ_GFx36_0iWM z%Aw!rZySaGG50?RS@f-LfR^9?wC}IB@8<7+?ycUtzW@1ObN?gAmc0Rzn;-w)$6otX zmxky!KkXiv=_C|;b=pKTgw0CQM;)Tm^rUAJjp)DlYRJ0*K9dFIG(S5pB}$YAJc+p1AnO*Qyy{)@(`tez{836ux=lY@h~me!f2D+ zGot?GsXRLj4%fwGhi5tx>>j{C4(5&t+Y;jMRv1VSIE6?KgllU@Y;~AScSi%FbO*DJ z-5J?S6CAw4$yCIs2Ql&EA?=n6+j^D8rA2b9PcKTT3-H1oOL_$AU}5gvd3(tAhPM*) zJ~|ge;?O>G!C6aodL@aoTPfkfijCjxFe@uZxIkGs!u<*Jy=8yo8sb#;j{{b=1(=rM z#oLvmL&J@Q{B_NcymMiirqM7fx1@}2G}}^OE^VvxHuG#zvw`x)^1D>a?LnHzw!$wd z*>x+~ffNo|@&m-gU~cu_0im0QUSR9mrgU(!qp zD~{_oU$t|2)g88wStYoEZHs?9H91+HZNJ`qn#TBHV1leX-apvge)afhTb?@@ z`0sYI?>abUstyb7qRruzLp-~3i%U3wqKG{p=HBjjZ+9>N*Ehgpd%<_tp8sP z_W{ZzVg0iqx)7vGVVVOfUTz;f*?+!&@O1C7yi9QkZ+8~GMcsdn6=6M_M+ts_i8Omm zaOewt?r2g9{F+r$&llfuG-<2fg-Aq)-2Aar!ppho=vlH0A!;J=7roR*snZ#JiH)t$)mxHNe@Gpx0QJ|MR}uMrj&A^qP*-u-b5=^FEPZ` zKLmw`&)}wa&^?X&{dm(1w!mEvqBxmK9xl^dz0;=ulhCzhU~bQREUa>v7p^1g*W@@v zRO!#|J#Y+Zr;GE?oS&bYj~_pplhfF|d*7!?S&o!Td_2y*E#~aZ+wu&qom9vEIb0Bk z%urb_gi{}XJ{~VE3#P10qr{)31$h88So`PFvNS3C=hCt?dHaXh0Roa^OA?I)FBm9j zqKNZL%F!%FIH1uNEaY;*;&Q2C;W{$B*=M(GE(J?R{<*YVSN>U6?lyM`?z?w+dy)Ke zDUO|%Sx~rqdF7w0jqm;C?e*oKOUn)9pG)U4#6OeE%Z`LW#;MVO~aBI+qfby2Iehi}kKXrY^zXe=7KAA)l_s*TdhU;w2Qs6}uV%`3Cgk zp9uaR%tw=5gENElM3=6^C6wX={yAH|K3tH`)AK8w1=lP7ZB{(L-e0xWb+?4qEBFth znIFGyw>l7gyk5aSas|zY;x#m9=HvA`UWxnGGv;dC=*NEryvUQ~uR?^Yudlh{0-Jvo zhTenY7oTcZkWoDb-&~Qy|5pTI>x;QShGFX(i1fSr&wz-&vgBV8h#^TUUDcsZ5Z1c1 z9?V_o`*t@)GyG&Smn686`Gn?>`|z3BIx4MSEPzbr5+zgb@%EJ}?#x%*Sz2-T>Gty< z_lickyQJQQYRgw9HB6~#n!BcDTF*?|v`b&MB1nH=M}znj2y2Kj!AQbgeB9xn5Ys5^ zUAlt*8*e@NnkA>nS1!VDCcIvRFIxl} z8m+=JT7+il+w!@VTwO24myxH^|G35c|AzQar_(_n;$LIj{~x#iZ?4{baL?KQ-^2UX z{ncyx|3Aq7|K^=pGP%=&qk8-kOL{65ti^*^YrzzpR9cq-ZwIK z`}n^5<34EF8i97$Bl*y*0ijkG819$njq%FX2LI!9ZS8f~Nu0@Q2zOI8`g#rLf-c7y zKZZ{-jc*)wqck(-WJGNxYHGQ{`I}#HoKFo|d82ze8jLGj?iH+2xBP<9$1zPITjIh+ zDz&+@G;AXqn;|@^hBLMXY4Fr4vXPBp`WgGyr)=g-Bd@U4X$-SdYqPw#*Ha0iK8Yk+ zEyrz*hh|%YH*yM5`n@CZJ%{~s-*9!=7(SUghau&l`lz^FHW#&TFtnZA(6-Z|b-r+D zJ2JEm4Xu+O+B0MeefjFekFU0$Nv`Io`(Ba&5Q>MBli45|PLoEUX6Ca5-Ueo+$>`nE z#9EuYEgHaN&GjaZW;Zts(q*qq2~DRQhX3xmM8JPSJ)|fscKl&ag4%MVT?uJB)ExD} zXiVUG@|325hB>@Hvk4EMJl$Lmy8RJti6>8C1ez^~j0(&@%oV(4_85V^-4Uc4gEq`Ko}3}{pfhQX4-eh({;E#9FK<6 zdJ_LekZiTb({-EVgPtCTgSdabW_CxjNgUBBPQ-V_qeEV#8$8%L|6ap#tIr+!YcLwp z@^?r5(PYg`;F*xV*-77Y`m=~$(MW^9&+@|?5)rr&ycncRRvkW~x6CQ6Pc*4;LZQ?d(WJ|qpd2ql>C))h#bjH07nq>0V(@IrDmaqFiov})4gqgUfTfO6GXkwV%BCfbl*?9|hA#t_&n%i}} znm2nF!c$OTM=OZwwNMAnwhW~B_h2-O`M-YL`Gyf-zaakW1Mq*>@n8Ru>+jy&`Qz9B z{{8!_*X#e!vi^@*5*+-`$bYT7tM}WhZvF4A((`t+`QSSK?;rB9q1SUl**cy22k+xC za#6@RUfKY2R1zK@ymN2VWxkoSgJfku{sCu_lW4MTkNk)P1Ejtqe*cL0%|3B=2qNw`(+B*ba5|eriQmXCb^XjWay%oEnc?ah2{h#|nEBCU3J>)^#{+z2 zZizS;`(kZPo|8O~&Yks&n#d|*9u7{#^k3Zjh(AZ-vl~c!VG_s_NpJ7PrQmm0ajFkQ zba>X??@vbO^{2C;CJPHKeu16rg=3zs^~X9G5Yt5yes7p#CTadzIEhDQzhQnJ^}D~l zAJxpm0Um9g$!~ZwZBkR6bMu^9`rByuTMYpV`dgj&eN-Qg24N3nsK}dfFNEfTioQON zXlVau7DdCFIh{_&Yj;@dfxVwJMw62}kA^gWjp=#Ba^fVClu4X;jz!i%IM%ErQJ+^0 zgIx)CMulhl4ZfKRfBgfZ=R@UThI=GHc%{RhL$vY z6TIlCrDPm+C0kSH+$JM}#D{D{4VKHXU1!L7gVZ>K2yq!$8Yh{1LJ|@7^CUVZA)OXb zW|Ea9%}EU97BhQsrkYj;eNyPc?{AJl#^5Q0fPibm6ZxOAA z$Y!#mJ^&+ER=}*Tq4@+TNNQmgz0{EvzWlD|XHlW$UAK8|SRKM{lN+}4b^GL@rlPVB zZr?W5T&QmzmE!A0W~TMcw^GZCEvCbylHcoaE3SIYY#sUG%8<{_L?7d1n!tte6DnMo zs*WH#3O_|<#cX{_%R~B<$;`zs!v`_s7PRM@*f8@G@gtyVrjoOe2rDn=BLcTsGrs`n ztR;GaY&Y0qd^9oTKaFXlhkp;DN;u=VB|{|s?f1`t#gYYu)3wN!4HQ)xX8%|=k~D?g z)+buhJGTTt0vvF|H9E_XW$aW^YYlrG8G#4O4zt>r9ae8ddmc&280e-FH=;(3^SmcS z6^?C|P@z3eRE)=uG1>0m~^XVBqkA1o$DM!O8lQ0Ortlg9`H;mbr+*q6ywkMNy zy_FL>jH#GtK!;ROuIC z%jc*SHa1MXg+Qa)wAs|oXphxZt>UAv4K#gGkQV__K7W8ENEJ6gu2401SRtD7Y_22? zsZvzB%8B=YV9?N&J?^obcE z45MnkcAt*((~)QbXW*!?6Ew&RX9}f(Bx#rz;cba7Qs3H-9vz4eHjnmQ)B_}5~ zRQAQ*3J{e!Pg$0Am&j0=LYe}O%1jn#;^37P1Xa|4R|?XUdBVHdFeX^hX(Bq!<5+=u z5`Tz>$Sp0TSjcS}c#G3@g^4n2nmrZ6(CnwUZ>r7nki>iWN?erE!v(>lM=EuQkJI9SQZ5{@)^iH)0g8O0Z>L7pOfr- zNu@4PA-=!JR+6Yp^Q>mJ6pL8d))*<)bCR|zmmYNVtFjVSIl0@@?SrRfdnhb0J2$ti z$k~%g*vM5N4V`Rs#=%(Q-8f>{(bzfe0q(+3Fn0{5*Lj`M$t*Dy$l()&pm&>C*pYN1 zH|Ibc;v-t5YWaK+kyvLULJ zHv4wRQD=hIocn2l< zBVAEu!`k8;;acg!TLMc!Y>9#pMp!385PER2?lIu**!#4wwai&4J1Qe0`L8;~uRMt* z6j=ph@t$__63j(DV<)N}s5BWq;Se?SjjyBrPC^p_k8=%k2j$UT77VwPdCZ@-nFp*Px?mIfJazH0KiHAd+hnb8zDR7yuRPbh2Q22$kOlLuv z?=ALJgg?-B4{O38XcLEu1PeJfZ(W(KkXA^BW`3!ozp_Z?udx5_!iN_aG!+&8Kp05D z6bSD3XF@^h)$0ld`|}In@SNbF9HYSF*I7*Dm^nl?;fNAW0qWFbNJ4MfmICDVMzBmX z#EGZ!2<|jPJ`uQZ2jTRT_(SmDZx2(ss2?L7us-y5c?|M^f8L>0+nCkW@X>YP6gB=z z^Me8<4Yih4x$ug{hs#wi7BKbAPt?FN)yvBJRQ|Ic40q+7YGd+EU3g7Na|QZ%Jyn=% zq9bsWCX{7Ce(GBVO((N?mA*(=?*->&1u*aThY+{kEm5)eDhOwQ_r+Z zOYv@fuH41klZ>EtNe6)Kf?EySdmdG?ofm<&*F);`cv?V?|Yu6p`Re1+L&*p~t==T?SwS<8&j#ig9T+9{H2Op&Z&v2|Wa-uc3M)&eKV*8{iy z>7rPdzChj1lijr@JyIm?fGAy=&5p_!Xj@oXuLE^&+)f+F*LJ2y3tDgy5nU7c7Sf22 z<@ug>F7J8glAd=K_PkTrvyUwsW=Ys!o8GZGcdDwy@={C+iDLCdRm4WIB>H7gGCgRC z#BsdNTV5VWe!3%1JL%I-EKBLBGs9Rr)+3lt(pm zd+1d>akhg=BgpEkb+rYXz}|Gy2Rm-LJqDG#*?yE)BFC(2lxA+zfo4aVZ)+ZoST+=y!6U-?cM-Xd1)e}SJA|a^CXBGn`3dZXZ!cYX@=+cnn8Hz z3j0bwCePT$)cj_yb-hdwQv>6@NU1qZt$>N5&N6yMURdiqrC4eZPlQlLP|idjShWa| zsPAjo98?PwY|J;&xN#pZOcagAKQ`vijkFR$tEkdKCCDz1bE)h-w|}lGhku`|=o9LB zM(>+wGp=$vtS_&*qRC z50~6tSZg^MRL$LvnCg}7J+&^3KHc2XWwKWAS6i(wUA3#Mo(}yAOV*mlwz&7vpMn)w ztZgHYujnDK#h2kpIM^_pEG)}kVttMdseGehu_LY1p*mZi^}^?!-1FPFd2sZ{4ljE^ESZOs18hR*Y_Fnb zwZr#~cldcH|9nYL7xN%(-riywOMf~(5m9cCUZ(v0mX+y>c0RYq8(-JfB?QYN)74I- z&ee)3xyfE9Bd@G6xrbKl$=ksQFt|?5W-R1GtY&Q@`9wRkH*22c4Ri0yn!7E{wXC^- z{3vWrgx3WPI+~1@^Sob^*9LDq>|iJW27W&U?&NlZ2KnGdaH>}i@r?Jk1!XN8lZe4_ z;qP;0r)^IA!izI^UaaJfi{y{Tn;eRy*5elV7Cn5tsF_m9;8ZO}jKW5M6s6J}Mr0dN z!MqS3a_x2J2Q}C9=b&4z`Pt_-KOaxaBW5*^fYlaoBAGY^iiE+!Fj@{FgM|UJuq4^n znXp(2?6iaz6l?1!P^Hc1A@P;NlwmPmjYd=A431uI@BVH3$GsyuQx|xRuB{!#gK>X7 z>kP{Fv-@=1RDoS5q@*c)RsJ3L0;i3}_v=vDKPp#bZTftLmWxLlC<7G*+o|r*APZVPkc}QKJn&nfr_=)d3z3WM zw6TmV7HC7xm`j>@77uwE^)@%-Mvj*7_k`NP=rw?_=o3HQZVBc*j;+vWyEKjJrMHz||Ivy2@rl(-}oZYXfI&)nbR>hQd z#X*uwB49{)5)o9&X4H8{a4hA9a}fQS9S-~!qhAXK#gA|M5YMnbEoKi<2K)~pxc>Z{ zp>vTnvp*!75U1M!?pmFQBs{cNU3V7SEr=;?e@3)yFFNmDzCZEjG)oF*10e@*Wbpbc zJ70R+FeRcN1i6yyVi=ue8yA4JO2!OVk z#EBGYcGE81hOO@45D!#^3ak_p~Fv{R6lnuR4~?|SX99)(_dGZKol;f8Uum3axm zuwmMN=GV?!tYF%J?A)w7a3QK@w$93^-$U7r%xRP9lb_I>ZcBZclau`MEISHq(G6vH zG(Im{fZ_oO&TXw&M8O!(N3$GGum$}fvP(n-95Tq-=7*U=nalD?Yx~a*pWeHn!?4rL z5%6g=&SDQg*jmee?0FIZ>#>tKiW3V4))-B|?3?EIDIQC31Kb>^rGrg(D+0pWgc z7fwlLpN>8J_^&edLpCI^hY}0ZUp;cOc<7)uH&eN=I&V^3G{y{C)fb?ZU4s;@J|9k| za)o8~t_B*7=sr3Izs$n>X7jFy9LKZceDXP$11jWG1 z4y5n|Vf-Qj>#HV6CS1$2Mn2uWxrFZeCloI(J7r#Qkl^o#IegBX<<8!Z`_FZp_9-=* zvb>lEM}S0+HP5LNOOEF_Nz&(xZ~Pocoj!-~D$fbH-eV$1`Z)ZUK4yWPAHT}#by)Q0 z7d)jJZZ$*kp;14&6r+FixLAN8f8ntJnYY*xHhUtGcwulSag>!1?CZ19q=)yA52mJU zSl>of<}M|y*twoNzbb-@+|JGaXYTx0rT*xb-tFq6%G%ylQE=F#+Q` zkbpoi41F3x&mjsyB3;e5A)?_2i8dm)%JUXncfn@J4P=Get`^$YJQ6U}H+9n$7Fx>` z%AF)xa24O3@|vYvwTP(sh;$)l3>DQ&$g9FyEBwk`2wkM=h~{kzp^}XqqibX1gq1wq ztS)9b!D_+?P%rB_gv3XucVX@23kVRYyvTLw^>CyLO6Y8k5pX=P7|+Tanhj#ffi-rO zAxGF*{rMBO)F`d3l^R^-f+MkglJD!b5Y;q`3tbd-%2ip`U~ZeabQYUfjAQPWi!c?I zqfIynkaqAuAP(#wDf{2)p0dNIku4ioK>W$k(cbgNM@K=xvHx1;`S!EDAjrpWuhZbf zzw^HlwWZ&WPom+p%w*I$zFW0v8dLs`>BEK5wSDlP&tJSe*gps|y1u!vgwEk0PE7PM z9E|($NFMcO8jj9|ekh~+vc{=j3%rXIKF@Ov*EeaU5l>8%8vM8Ij3K#_6%)Z&@EBeR zQgc8=(V7v>2Cec{*Y?U+n_wxYn%x|1$EXLOloI`MR_;q81V|{CeGilhL@TW$$6&iU zPXsw`@v$j=*QwVYzWmuX|tD&tB>QsRDgi0;o68}Sh@F|7c?zz5OOZyJF`z!U$ z-NwWAg1)1?m8^iKRIk@LVD-YecdtH#bo#~P2r?a*(nGUyRMJy350&*?VT?EbthBkX zfp%)wr^vtEpGK1*V)0?WO^!oCHpTFw{0f$&;G>Zr)!4-vjAR&}1<@a`8UfO6nyr2} zk?T(CrD$u3muWYdaG1Ykh1eZZThgH~+^ecSrD<_&Ay!Yy57rY~%a4NEHk=5}ydQT% zjqH|%@0O&-poTGoiIlThG#8fZ+HzS9@Pgt+0oPqbQK^#s-S%(Jb61zYd~c2S zTTAXQ(^BmvSD0z3)xvwqU%r1IogZm@ozcX*z$Dr?36EHD9{Bd>ORj1E`DQwIXPcI~ z`wie>kI4P!uV1}*{ATy{{)^{9Q0bf_OzQjkU&CZHG>=ClhRl*`5bT=~E^-iXP?Aeb z<1U?&2=z6kBbcgjq`ukobTr{`3%d`2b(;uo6`hmJ5%&TcXy)7yWBi_W0xib5ImM0V zNCJ_%fUaVfFNGyM8bTpX;*--Ul|=xheHLNf(^+U6jfS`boQ*ZMQw0~7`{r~sj!ZHd zL{!bjtKzJ(2GUt4>V_b1`z9RlG0Q{3x&_-eMQgo4bmq~vaN9I%+CNTb-4fVU{m8>b_sVn)I}5OQQ_ze05yzv#;>n0Plx12c ziMo+@*$yOhl{gHgfR%>&pESa-pNwRfJRTZrhvUowKKMHxB}q){WY-RN*kFxOI*60` zwRs1yKheP;8x3MAAh!eJmLZ_0f!^6(M)T?0kKadG?h%(Arv|P;u;BVt)|21dW-ZQb z?;HIu2wta=D+x0F4;tOg!!wEO#?y_5-TthHn3;e)16rHA0BoXZqTve zk|-LaP`3;+ZH*6U@F*Stf^=jso4}@_B?!l+({oz*5Ag_BuAP}g0xe76Q5%3lgV5DX z#36_|Dk>8G1RVS$(>8CU0m21MqH)A0s}1o&5I~w79Vx=a4HMeW6T5~VX%%Ugo8Qcs z*78?xWxaPKlbB%`Qzzk=Ad4t~3J#9ILdfRah>7N4e7g_BO~%mOhn-D{G)Pq=k|FZ} zj5r<*TC~%t8HPQuZY@7b`^k>h7+8LFdE7c)Mh$F01>}76L>eJa^S4a`(GD#EaR)O1 zxn|dpFr7;|Fl?^*w*6Oz-N*r3K3A-!htiva?H@@ftQ$@is=p@o6?LM15;)!QX&P4% zL4|NZ7!0Dph)xNN0Rm%~#1chCBF9rpe#9C=d`5Y3Tkp+i#6ijddV4jQ;&5^UN@s`I z>mhAyw|7zN=cwH86OE)2I?sp$oDwAiQDhtgoyIV*x#RAvKRsU~mf|6;@@6gIzsmP+ z*5olUvGn!Di*)LEp`apX`T>sg%+$2fM4242AOkwgm(c^HjvDSHUuH?tu? z8U4npWFV9!j>tus^uvShzIeQs9cGvdGUfp)&Y>XQBJ7L<72O;5EquMbQXDg-~f68-&7%+#2opzCZ1WoAHy z?dPM&Mj@8Go5CjJ*D!(yd^kA=L&&Pf0&d*KqPOO)p-tV^o$^*9iAs2mL7?j=XDKZ| zIBz)@?L(k3Aqq2|h!#x@Hf%<5Y6vzlW5i~p$RNm~39*rk9`VTxM`@xN6`Uj^!bKX) zID|Q9O{R%28bqyEBfi8S8D44}i!I5+xXZZeA!sri3=j$(&?EHJ^IQZxhz+CnoPKho zbmk>8ox)Wx0B_4ei&ja_2c1!0IaaH{hWr`g*t>jH3>e?Bt*BuLx&6Nx->Aw zRW#o)tyio)%vip;R?w!ZvjGoP(XDahH(P<&sh3*ER=|zM;tH8@N(Hr1dMn+pnWk5~ zi#w5Qaa@x~`)pG7mW`YE+T_shM{LskilW=kR=|c$!|r;Bl_H)+F|b?FCeFth4#d$g z!;r3wD7$PJpEw+1nm<^mzsu+`0|4jPsQ$r~>1#^?a2!S4kGtso#?<3S0-8 zN3L{FD+M}Al6R~cA|>$>d`ksizKud9AcxsvF+OJKDH`bOKHW;BcZ!KV!|yf$BuIdl<;cC>Kgh8af!+?wZse zb2CarxjoyGPCFKz2M?A8vF&8={BY7bP?JPw&IiJRiG>2WCJgLtsD!p+sEgITI=>{Q z!jf@90#~&rc@pfbkHdbV)AmphbafLzVgkGJoTkRO&EjpEF?H%DUq_jBEL#TTE6=B= zfs=!E?Oq^nLDsdQrhQ_~-iib%&9({lU_opmHy;q=XZ`!zV2*r&q%)Tg65-q%bt?RwDSLuE5_w=3t2>{Y(o1v8de zROi$(R|~r_-LIDaa(TJZo$gm^W$3~j#?M!%xAflGui$2nwU=oXpd|9<)EG8S&jv+s zmw7Ncu&D0C93U)JX;sbUrd5m>UqaLa@;|XC1|ST%gcw!FdmPi zsYsPB%(vB^7omh~oW<{bMlZYBmek1?Ts&VVKF>{9O#NuX1Qz;ogz@zWVt7+g^?`Mz z6=Qiw5G(po2rB54Jb$gM^rg#HGb~VXa+b4Ekb=*EJz2XdjD(GCnq?4Trl{6Lk*8jt zCfldo^P%Hg(bSTGG_SNOEQTw=04KZYGrAcTSJsZpEI;(E*CETHP7C7Qn<4H@D$6-j zr2I97ZcIJmU7w?&UE4q~-rP;q9ZnvVIjv&Is~a1Y*6;1=rd2`}4UCD0=z1(g6W34o zqMgehB+!E(+)7z)SOo*!fDDr0OF zjj?HOFPJrU_ij?#rnKV;_{o^?rsJE1)8JU0NFJHIcf=eb(_5z{X>2cgY`RCIU1 zEg=n#(rdjnuz+C6IOSqyA_^DTV~Jdyf2-oF5HD#g({;u1PgNgZvmB#aZ3oUV?lDL6 z@WPR=qTa(fi^a{& z;Pbn-eP{brGRZ19?UAu>!Hkh^vv@=qV7SAh#yOtT(SiMaVY6t~3dWO)UaD{hzfqt_ z$^gJ2J9l9%&kE74wGKr4ful6XYfJ9M(Q%LpWDF$|$+Lz4 zRgAN#<`Hay!Ui*zB6rRM7=hW`b-NG2n{B36M+YR5b#i@sEHyY2WvGLtc)=i8wD9^; zZ%i^PKxmFgtkC*ns7{ zF|j-ci^dFLi^a1E%a|J(>+QS-IQ!NLrh<&JUI|My!`>ZF3**x~22*90$Z6KZ0Y$V$ z?X?2d2E!_bMF;C{B1ydCA>T);X!hEIToHm*GEF4B<+kRkh^|CcD51?cr@KJysIab9 zgtN=Z;YWNkFd~`AB=6hK`zGx+EQfbSK8uGI$^#fmJ0L>u+w%0n**C>o9*t!HD_c%j z4xYLr3uk^N%?c;UM$T0%X!jH@l;cu2n39m9d8iVcI zYxGB_c7i&D0P&IjlZ0|P3v>qT02b)H@-1h6ZnfZZHJSsMs<#HPRp&Zw*=ho70rro+ zeuxE|i5ZN*6w2u;Z7cS0DnmYdEtO?e0BhRy{L-;Fbg~FZE$o3*qOgPzk%&%nvJ^zhjbBlwlo?1S>J&F>)q_GKvIR ze!YCO>{YrAPBVLpy>i$nRjxThxx2G@w$(YMSG6i~t58thuEUq;L5ap+!bnOqiIPpu z>XB7PKRvonO^1Ejhp?I>BDI!LQevsgz>IR0gM0Y9Zmt~T!(72O(aa!t!&fAV4>|S< z9J3=?TY38L0M4yQ1GLK;j{u~%V<1fS_uJ!!+wro>m1(DG5tvYO?uM{0eV+A6Y%mYR6*CiZMr?5!LILmN=X zWG_$s9B?bK%|P609yOcIxlpKV$)lDE+@829r3GM04UWDXU<#?41zo3J!o*F&Q%Vn%^mADT@btOtx@E+PfsRC*uBa zg(U4uhGe%7dZ`A?dX|`F&LwV-Cr4t?wa{He+y3J$O==nn&F)TuARBptoC?WLEN^TL zqP!x4hAB5MW+v;Yfk}`Wn3yjyFbSN233CTxV*Su=|-<`6SYD?4-FJK;~p&H$o_1t>b(?Faw zK~g(JdrOvM+bs>uI5$M>*w8lvGc;pfNPxr)9iJ^AU0-yf|La;C*`cenErgFZ6PlZ;{{p zKySuHees(~(VG_Ll@z|Ay;`2?AlS=CjqiA^k8%4c*T8s|u^wdYLL&C}s#O$I_G#d5 z8JbSJklnBaiqPGM^-asg$TkiNd+4Eu^d6(_%%!q16t#;WqY&PGc-!?MM^IrGr`ay< z2A54@65*QJMqrc;?F_7`K_aZIT1%T;FlrjxHhw~@+ej(rKgU7(KV*oT_$N=|A3e#^ zvnTNnpJd7DljM#cD81aV!jFlC9Ey}nYkHQYK!M(g#1jZYlH)w%PYxduXixCB=2;L! zvUoF$Kh|l+#73XfQKBR1jT~WPu_zNa8wNj2+L&`Usns2e5d4amaX-S6G4;R(Z_&@D zdUKz#KhC_4%0>F6_2YBRnaTi7hA#eT(2Em7XV%+JCo}6uFlQ2<)r4iZ;mk?$83zfQ zJ%YEFJbuLg@FA$xHIbaTfyU&i)@oZ!0Kj;;oUB50<} z3EFwWxq9ckj=$KUL${yi?E}BbxvJKkaQai-fu2fqYSKStlO8b|5xLxvf979w<)6%p z+uRBrWqi`+Yee!-<^{KMTGnGWU*nzpv!IXn1vUEe&-{yl{4?MAu$((~?Tc|acj{(3 zpO(EN*Dc$>HL3SK%UPq9d4RbLKrK|^t`M1bZV06qQ~-gtkYV6;d#lGBQ)Fm+j{D&> zmFAsxa(ft9=fu;fKSnGM+FfcBA$piJX2%vXaX`f-JBK|nv3ZQ$KAC7XoL)jJ_?yb@ zDufro#&TB_T{Y*=`{0M1g2EQF0Y7LP%TI%WiEL`K4B7|u#1;}4#PqK-VwEqtq3P4C zNmc%P%NqTr4t?|Qsk58u`&RBfgKC5SriE6uP}}e1rZK(wBCD=Q#O-)tweQxvzg&ca zJeo9HmAO~*{&JCb+{(MO$o-o4*Bi_G`63Ur2ru6T|4j@1MGO6)g%}}j>LR;hErnl8 zrtX~U!In0srzB}WhP{h#Fc#!Yw$Q?bqW>#$(y7pL3(5xKVXG)z^-oIGAPUpVUZqz2 zZNV^c6}bxT*y%9cw(au-71U_F-nn?>vABtneRUJn^=rskm!4)pDaiRd;y@ zx-oAqfizceEe2{AgCwTjA*=$11GvvMfJOw$ak+X9nVORM=Rnpt03#V=9I^;f$E+p(tq)ilR3+ zZhP<~#mraMH+5|;l^@ZImSVaP#$k_t%$M^J&Uio4TT1p_3*Sn7Yyb}0O#RV5tUFh> z)Q_#>3b*{it6t&E5T3H&tOvva{mX~L}{;99svuz1ZrY%b73AVbWl1MfxcKdF_4#M|Q0ooP8g&hp0#nj!} z_Ok&KB;q=wd@+%q5IQ9qnU z-jSCs6HXi8zl&Jo$hz2ZD7z(Hr2#SYc>OJ!jHrQ^{n?3Vr~_9XS3^|8`9g4J!A^hF zb;x%TSsrx@(`kje|M?c9>FsxZ+tCg0zYVt8bAryDdMkU$oSGOBoY~;N2lH@n)N`kH zyV1B;^#&#AFZnt6t~7C$%&Pg4^HlH33T+(S>h3<=5&}k@9B!tiE6rN7#s(N!(AG?@ zpCCt{lV~|zW@xp;EG=#O%YfbSBqN%Noxw?PZNMFKO!1 zmMW|nuNE~@QTA0&b6R`Rzl(BLxT&V8Q2nZ!xrTGAdbiPdkXcn)(b{UQUA(HP_V$Yw zbv3uBcl{;0U$m%FBVE*cevJo97u9vvLY38Jjq^&huijYulBOc7y@D0Qu;{fFbIY3wH85qc{ZF$2pfrYl4y2qwNheU(h31sSfw?!Kxl@~ zTqvWQx&=8a=ZsWf`GFYLY+^nkek5S`J$9CL29BZSj$r7+1M>qLsFk0jC@=2O(}5HO zJ_(BBp*Sf*=fxgHqG0KpF3#PRY|EW2S2R0|$}7Rv zIy((R40k+@(@;awv3iMS9M!Cj)V4C=P*CvR3w(3$Vn7QL^*)3{y)4vztbD+hU1{L8 zp;H*MXDQ#a*WC3x)aMBOG@iuZ6bPD=y0fPaY%o5jkh6+@Mi?D~*rj7s1%rwaJC1eg z>>9&F*H^2v*-i=%l5MtOpkQN6t?ayAd3U&}+b69cCPwy|Z{$sEcum{4ia(B1Fc@)M zfZl9k4NIesQFmsqz!!iTmI|SwO`N!khk*S-{h?Z1@d}C4sLlZ4j7}r#!GMriB$5V8 z78sz{3ptL-xM}7WLv``PAf9Hif(2#8`;4J=YDeZ4D9K-^co+`X2PdA|P# zFWa*XNSDK{WIkHk6@sWP2`S168MT+AW#L5AQp>`LrltJAsZKd*^R6=oFC*|0o(ee9 z_5ibKE|9vj2Sl;OX9Dp4^W2bJ6Vhq~J)Q$#^6i zN@PFc2)3~Ycf?!75u zQKFnL7IW7n{KPb~mx2r_v6k7;w+`ZdIDxOvu^absJd6`eln-k<*NdlM#m+P5EMw6E zFqm2}CC;xpNRRovSC+3Ux#p}U&YDU8iMM?2oiOIgqH>Fd|OGLHzMz8 zyYT618k)HnIYBXa@3K8bXl+k@i@|kqLyMJWlpVTryrz| zCX3`97tJv2Ve4_}>}s$qP_f+OMhJkGB%XTJ*1!^WwDHJv@cCrg%#rDq$?_G(@fA?`r$LEbMM49UMar<6f>!PHWh34drW z3S)^p?sO$A^|8Lq#{NclaHvOWDwfcw6VJ5R-6~aFEFifa4k55013^_p656W^c%L8* z4cn_Zp3HJ zxU>fYkQZE)d8C2^3aP#!U0rY0WEpks_)<|y;f&!}`!w;Okk|HfJ89;HkzBkcvq?I- ziN@3o(z{ULqZfOZfQ5+i5RO6?=j;FldU~UwN7R`1W_ZF8L1`g1fQ?N(o^?RtbhTPs z)9tP26P!s_;!omnNaqQR4wGbPziu57i|Sf&X?<*;-9DI!`Cf5LKG&n>0(R-KKbh~i z;Dx3`rtj6c9I@;+I0&pXZm65-Uq_KQ*;aeCe)nGe z{)4~#Q1+AMN-OP!tvm}S=lNzH)SL7vXl8X`GcSo6dd>Xs!w(oun?422++EVl$;tWr ztf;x7S>0RM&XY+veDAeG)5)}B<-T6r^EFkHosqB|P=D)|pyt3>OQ(=VL6$1*;wr0Y zm0CJ(tvr{OUenRb7;3I%j2I#B&xO9owIlMxa6qybe=`-*115&< zcwt3dNg%lKbo=0GrTOtM?Yr%Joo2Pf%Au6x;;sb2%;J9l;Od*aQ7hH2gP2Un-1maT=X2Wij_&y?XJAM4Y|dzwJN&(a{<1MXv4DV4Q=K65&eu zMdhu|mGSjGOjr<6cBvO@_KwgD;M{W(rM+*zdHwXoD+Mx`ZwdPerLD-Rug@d%towgv zK;O#gbUI$UbB93HAB+%Lax^))^JqBgMH|y|z8uwNf7;*Odw#HoP`|JeMSMBQHdX0X zO&he8{<&+OQy+gD4S&OpDPrrOh=iS;e1PIvYG+5$(7_UKctU^&e{{^D4M)e*Gh$TN zoz9H*O$@r#nX#>fjS#|qC+AT1LIE{NcP?zySksQ!Am*7^o>y5gsUSq_rO1R}TY1vu^JeuvSmK~2bjvUr?MxxW^JJd`^qVSPjU?jK& zE-k#y%BouhcpBqDS#81K^aNS}Ya5PZrar~mvnvz!!g1y*j@vPg3db2y@S?7-HVq!H^!=E|yTzL}iqSNW z*WUR#?O?1npw_|}q&3)oxNV-`0>|MXBC$xcZFo5(Ix%)`{ZNsqfDn0{l zGFO9D>_PKIGq+U5R50hQ4gsP*91X%A=3Ui!XRJTO{(E4hR8=Xm*gHpjHoCKE@TWiW z<3L~MWB{#3>xX9hPCxG4ac}P6&5M4IaR1BtXttWo`*-jDiAeLk`w!aq+j?-XiNEr7 zb@flJ=H2_NtF3#jHa%}Q@2$4}WSV~j0A?_JHRew^bFid~%h8_r)4$#4R;n>_#F8jd zK8I|YR!g(yd0ddYPzr7d5C6du{D&Jt>(!>JK?PP`MIU0kT{Er5s#ysFD^usXB!pYX zeS@aymhT@zVuXG@tE~Ke@6`d6W?Osz@$$v1*GD9DZ0#Rx+uv0wj!k$HP1bMRxCI`W z*j|Khr9<;bsWoC;{}fKB%+J&_@ny$yhFjf3a08!PPRw8fXJHgmLpHO=dB3QifXBc_ zeD)cQM8_o0)87~~KZ3l0M8_rC7_8>_(j*7FfB^lhyWgLT z&g)MR%uh~xTZrCnU-eMhZ`gCGW(p1_YRV&uHB&$omuC;BW&X+p;y9XJ+8S!D@^Ax4 zS4~N9%9A{Q@p{k3j}6f%wdid5kXX{Qp2=?ki>Kav8_F$miq#nu@T#DuhdU2nJpbuG zCDz6`8bOtIb~>WRPq+WR#}UD4S(s-Yl z{a8%N#pB!xdYvd2wub8k`HHE+m8;h*^G0u<{rR~YusE&1*1(9++j7Kp+#HZp3SC$C zJ)5nvje!JcZ~aBX=Xkk3`AD8p;a~}QVpiAO1@F(X>wqB*YtF~_+jNj8Q9vSB4{+-8 z_Hj}35D%7<5l$kBzh01&z96$UaF_NkZ!T=&!u=aunzd~uUE?FS#!~Z=%xz0*ZrQ}r zMKKx{*EA+5yy#zeVVC)QD!98_P;}8H-lfHNu2TGB!SjUxvogzzXD_#3?H^>XWA?oL z!!iAx(41<)tszR$hP7IlK!Ow-Yg~aX7!PYi6N=Kdt96g^(usc)l)0bD25IKY05;i{ zfY7I^mf(FIcxs1?j{FK(3ia_PXlyDgAtE>;X5rS+x>*USN&0Or7?7QrTE>Q&U8ira zCVC@Q7J{&d z-*ufmu?iDWg5Q{%QE-E%wDJGU;L}Qn)!-L}`-$lxz%ve~u%5v8@0aw)&{6YwUK0)~ zD0b~m99McIji(MesjCI?D}labna0(yqbR5}iB9-ziax^FD$z?w$M)Gk++x7Z()B*c zdg6QFiO}_W-bf49fOaud#9E-8@)8~}Ezcvn6@7@Ecw&=bOT7DVYE5JRF8Ix`8zMpg z2JJ^0askO0B-nJ+93!GM#psBv=;v(CF^)wEB@Ndw6Id@0lKP>{#E{4}W{2gjj-!tp zq&jXy4I3VEq;b;Kw$P2JT7zZ}g{C8IEP}gU>h0zQ`S*?8We#ljD`5V+WdFH^6ArUV zlG%W@yK1h--IWvT{Ki(CRD$?uRI)3dIth1X#P?Mm-21NTtV3go?MT8fXB+pg-z5Ra zmp?<5_ZAFLCHL{grJ{{vBYqd!98~PUvF8NKypf(@p2E!K%lJwN3rfjqsb2YmN5TBe+ zn^nA8D+#d*$8o{IG((XoSSYZWoP25nLH6qnaMPeUOuclaMd|429F>59JJ8E`LM#{5 zOWt*syi+F3mH@qSOqJKD$+qJ$SlFXn_JDo0Q%Vy)VN-7-6jL8|@})X{sg6G6xXgc# zx-d1_FmDfq)IMSNt}_^H&Dbx5!D(?nHQmuF8)X%N9xBbTV(g zw-7>g#(ixBab9IJbliijBSLjcH@!)C^={u5GSJaq>pn5jgXEi!SYhl9IeoHx%uHZ-SQ{ z+uw~pg@(s`g-|_fxCfY;Mmc>de&{o>c zGE04fv4!W_>xmUKF@hkM>}TrIokodL;L7gHH$--6g&vXcWap~~MunTr44zTW8@s4T z-!hEMBa?YA^IsE&!Qkqi@eWQ05{))#r66UwwQyKPm43`GixU z=ydVPyY;ZbEL|(G^kQvI`64}uY-7DR>4uZu_QIM@c~ewd9gmh&Pu---xh{7u?Q&;X zmy4_K%y*eR`xc)2pempzPHPr9nsUp$RQGx70_N1DlJMXIx30vRHsN;mjK-s#?19{g z{ewMDsdp$Z_{&4C;^Q42rv#iE`U#BHhM7NUV!`m-Mwjxm+4+V6B)exf&-ZhyQ_(Y~ zL!IiuCI>0T|4Af9oD;oFD6UZmgZO z?#}#J^I%*$*2@>UlJ8I2Qd-$^L=ZvouR!%aYai;+5#^Ek`w;f6w4LR1nvTQC?-OsE zjMOQ2TxDxuC6kTp@=D@qX*Nq75dR zRtq9wfHaou$`PNKZeH?}|5tTn7W%7&t=!gDS|0a%WDi)s6(NoJb{t%J_${azy( z%_d!Vnw>78UJvuf7+=v=5J9x3FgB&6FDBLBO|K{eCZ=Bvd(xr;)YPfPJ_#+e9-M z@S3W%tz$~mJL;UTnZ1wGH`BPEtgSr@-$(dw;;usOH(C#Ze~V_CmN=OIo+){ zf2g}@62LEg^R6x-QSUoE1;GxOJ3-?ZBF|FwJVH5$^($J|%TO=NLs z736v7jk*aH-4z8qu)QEs6Pt^@kIqlTZVJOW=OHxF{keI-_V-xWaeox{MB~2ua{D$c@r*AE*nWsXN=rLNO4iYcN}q5;_s!4L z$X{teTC^B<*IKj~EeoI~_X2%42AW!opPT1GJQu|G!y4;>&55XOi z7QfTyY+G2BK{NpAn6Z-p+dGR5HA1tV!MH268$FKBG&*RaHXZDW!s&V8X)%aS!p`}W z<0^X_78Wg8^Dfvhq%d_J(epT)y0kF%b|Np$;yLw_x;~HeC9a3qHM+VWObZ*e{uFvp zvyK|NZRZ>nf`6^^pCfD%PW=(*|0S2SiJRVn*n!{W330c(kmqYwg-9QX4*Z4cs! zdE796<0~IidCz~hItcj{M)0*dpTXfrdfitW9ni*_DZ%`&WNcb$iNapu5vdtjNvxc> zphjPDIk#;;7lszH*33V-C3D) zYj?tvN=e{aBCuzEQa5~}Z*9N&@$ax=X|D%tVF}>D7Z-oqZ0dy)>u_7Gs0P;P^8Wt2 z$vo*+HC%zN`-Ul%*3B&}16ZSDKvv?9a2g`sd_1YN(u^vp)zXDgi=|8-Z{~WPWqO^Z zz0Pc}Z!YV#o9i_yo=3+sp6QJ;s39^Cyc$?jd=UsRyQkpZoEEhEDMk_}-f zs0*h?-V3|Z^bsy+5>(4Cy=!28UD8#^v;vFR?D9RbU)Id3W)0-=Qpxh4%jP3J)sf># zU7jphmf6)hePcU)Q`BjFuG8DLQ??-DEa7JnQeDG3)Xc_e>J&{l!iZX%sVlh9*MgAO z)Rfmq8pE2`Kz*g*&w}+{dGga^IyfxNB=Hl=1G;zg6Q`O!dhC2(Noy02`mkhs z(n?>p`DNRCNn4*_!t~}G-t_S45R2q-9C7kN>zLx4TRUN5eKX7s=UR|J27z2-cox{d z@c4d_0Y)E*O=vpWBPEsoCoqA+S)w$Eipv%$DTc`7UvMC5ensjy?86|WLbdCg1AML0 znfl9+4vu_-?OcOxh2@nSlr7D-C7ix#$C#rsp$Hacp z+(Js`a=D7Y; zfz#|tx72Uy_c_;iQFV&WVxpGtjc6VFQ;k!ul?aC>8M zJxxZkCE0S1oZl9c*3hz^;H=-)+NhEKZ+k;`qGpuS*`{Ve8q-UFHMb9-)U_;KSh|JF@pHm0Yy-8aug*G5$(1DXiuk!%QTvSX}SjTI88{J0d!hS9);y$xn;lL32ok%{ITa7RRn%#M)L>;3F+^*O>+q307Q?5qtXTO%Jr75-oCVY zy|uV{hkMUV@)2A)(%(ya@3b$izMyx_O3n~s>*khv13ltF)w6qR4F$AMz>vKidG4-G z8+CkgggWhYub(!rpVtrdd3&y(j@M6H`ssN6P@lKw`suXYUfrGw^{-i$FHO(wQtJxQ ziaE5rr7OzM5MzWVB>_x{?OGI#{5NgyP20W!VB|TYS^Bi?p1QJf+VS(Zg42h2&s(Ki z5~NU#g@jVu)f2|*xF4PzDaEejNVk@B9$G20Ci;Kgv@#`$zKP+MB!(9gvZ3=jag2}i z+_l;_d&9zX8jOlRB4rsWgvWpE}Ago|6CEq!TrQ00vdV@w|GWK zvdYPcq>RM@YoD|psW;Rb7;W_xbp?dA@ovX5C#+nc)g(Tfb}9CRo>WzUvQ~(iN7hnl zPGqBH6b4jXBRF&c1AVIh+^l zuZ_&Gv)g)pk_DyPj=7r+#Ur4y^~u##+I(?QGxXG}>s|1Ar+Wu`?zh=}@%%NUS}sg%?X&IIuMxU#|M`;_@PGweJn2}$Lb#0t=T2RR zi_*0#Okf1s)St6YXsA}U9Ya)*mHGB&PQ~@5>0!E8_!5UV#(TL~Aa2w_Xwv z7&%&7$g0+utwe0zEn9zIe0RMDtVtfCvq&I&)d8^fOsxp|aaUi(L)#R6evagwxZb8G zhi1d&!A4dThu*_0qpA>X%ynVYD6*));uF(j0adnZ;fkeA`R;m_Y0mX*OJ)0(;N~8R zB=vedo5u+1_)!u|)DJ6y{JH&SDyYGzU|gZ?WyT^VBVm^l`leW?uGoutiPLz|3C-KW z!LgQ^8TJG+!lqcerJ%!Ral7a(J8L(n6B_^)$5e9XzwVej7p@9U9tmk6&TEWn8IH-< zS&A56NcdQr=$BQron>*C!9b3qQsJg2z8NP@|R~r89v`Aby^7X>`VLo%`(Cy4HwW93C zie15)wo+@>N;IeyM?2w~i3^4sS(Z;H>qi_H#8|oW%P@}_#4G z5gs?lf~}}qbu?xog1fhyQshch=|)O57SWnQIwGD(SJ*-~^83fzfx5srX)G4f_qto) z!qsi3{OjD(wy&_XLeoBfY1{wcrM-QnrS&NGKWb@}K4!=W-^To?&JT$5%@6e^#j+;O zGN2*ikTl=21TNMDz^ICAp->GzIm8*7VKr4I&j+tTnbD?3=uw_0&;9TuM~^F_!w}sk zGaXs{<2t2_nvZw-tm^CV=)mD7@Ry(_Hz&+}w#4M(w`elT5@GI4^xY4&`$wjv<5^*S z(;7d|$kkHU`TJ#9_s@en({kU4C$L0cmq4z21a*bAucbN3I_IA5I}^%LufRymVt#V$ zH<^|_mgQO@pb^~`ng{*bLVIVLL0sB&TK zSrWRt;UYVww*Pv6+cmQQj#v;ND}q(nVc zAx3T~xUM@U`I-KJ`~o*(H-nmMWG;`9z4rZNN?Mqk`o&E?dtt%F^EVd77p-&mdVKvf ze;;TGK}V2WRB%7N_}Tol_xHV@yuhO@$&4BM&%lJgk3~!D=mD_u(cH|uL{Sokj>od_ z(ot{u3N9~Yvicf91~T`-Jc;tn@_MG2|E_M|71X<}@7UJGspw=1@XE{*&GLVh*S%{6 z*@zbsYE3XRrD1%5t81CLH!hH5h-PVy_H++&fw0eqo`xf%X4I0)*@a_mw5d;alqnx; zg>OXeA~1lVH70;`&r=s zzx{mw$=<>1Kg9pHMW4L?&ua7Dwg1l_@lj9jpwN{*@0f2R;ivAw!J)e*Ca zk~1}ci#^9}fB92j@h?#S%IO{0@-(JJF}<0qm3v0ymKjf}^k`IE)?`z&_?4{7TT!K5 zUuia*#_Tz`q`W!c?6l_1F#edSK0>`Kw1vGok)_vEQvYNd8lif9Nc=m||8MI4c`5yW(4M3JcUQ0Dzx*To zKmU!KKQD1K6u-694KU~ESM18R+?S2URzFsMlGIU7{c)hL3SBII>0;fh(azRrFRBsL zUoYxHf+L`iEi>O}TILV+DEbN)qA&3KaUrrrQFZM^o|7za% z=s%Tf-EUpT|N3J-Ad&^4uGZNdJ>m#k_Vpe27X1A&Yl5dCy@1L9+En%!IPOcZbhV_n zvF=r?VG+wEh*2iC5&Vq!BKCEK_g5Ji!^$ZmiqzRTf?gJLo`~UvkRx`K%?=|l}xZeMN#3zm5r-Hf7vo0A} zv1dImn7J%`HGB=k`#j+rC|HijjRXqyUFISr)*&ttp#dee9Y-~?$^L>gRcsOuVlX^J zO`x2Od-NLDR`j4MZaYJbGSQLv6D%2*SO*^{gDL&cv`%K>1gX!(82Q-d7W#97^g)pR z$D<^PJN@X-23Aj_q6YQ**T!;zeK! ztAg44eJ6h6Tk7_B*7viR;qs06_R>$g2c=qI{XMUia|I~nL1UYGmwYPml#?TKB2VBV zkd4scKUKcqj5u{aI;D*R-$R}9E;;BjHU_Z5)cgNw&+{sEKC9mqdp>l>+a@^Rj6Ub zOk{%v%Mx>DNO;$q*AA-#YZoUez8EZ1Zicm%Rw9!T38{g*Ln0Bxf=T2C&XM#ic4SqL zBiz!2)Bd@PAJVN2rlTNGz2Gt^@OWrfAz?+oFWdDDksSMs^gHKX8gos9&Cz=J?%ZiS zEw)g<-2&KapA0`6BNe&i!+yq^kguu%jskK0qFB&n61ucJ3QWSjAD_Q*7A*3V#`t0q zpTxtoEr@bKNq>|?R!}mM30axCEJ1-@QS(rbGuqTN3QoPtP(xUk zv879CZ-~JZxEM?Xp#Q{~ckU6Bsjt_-s#=4dv7|jgLc-Ti_gHO=b+t2@Y zU=H^9vK!+M;onUVwBZNKi5g8nMo3AloT};e(cJAmeW@w=kDX@&?Q;&LfhNwQ5GkUt z>e4>pDhMPE0OvvA$`T?m<=9t?mT`ZCw2dR1#&U3;NhD7zU3mg{dlR6p2$fvq;H0|d z&vZUcpomo?JKK@n9K72t(TB70qRFwlKMfZYkrtWf+VDGad5_^(dJ+ZLX{>G=O>BBB z?hI!xZPuxHiX$}Uy4Zkuu_QFFF_L}&IOs!X=s7NnH}Ye(KFH_q_M?0{w3^43av^>_ov}x(od$=I(-?A`Cs`cp`P9f* zgM;o(I5}m>9s?RAPTcJ=+fZhU^N>(pxr*cX12*PxdYWj0h<)U0#YRflbq6d46nbI; zqQ+kuFPF_i4MSa$p=Q4Y^sUBoxaqIWTogWUW@0!sNsW7bWA^~F9PuF?{ki^Jf382*pX<-{=ilP<{{c?R J;u`=60ss}3W`zI% literal 0 HcmV?d00001 diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.pm new file mode 100644 index 0000000..6bbf79b --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.pm @@ -0,0 +1,498 @@ + +# Call.pm +# +# Copyright (c) 1995-2001 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. + +package Filter::Util::Call ; + +require 5.002 ; +require DynaLoader; +require Exporter; +use Carp ; +use strict; +use warnings; +use vars qw($VERSION @ISA @EXPORT) ; + +@ISA = qw(Exporter DynaLoader); +@EXPORT = qw( filter_add filter_del filter_read filter_read_exact) ; +$VERSION = "1.07" ; + +sub filter_read_exact($) +{ + my ($size) = @_ ; + my ($left) = $size ; + my ($status) ; + + croak ("filter_read_exact: size parameter must be > 0") + unless $size > 0 ; + + # try to read a block which is exactly $size bytes long + while ($left and ($status = filter_read($left)) > 0) { + $left = $size - length $_ ; + } + + # EOF with pending data is a special case + return 1 if $status == 0 and length $_ ; + + return $status ; +} + +sub filter_add($) +{ + my($obj) = @_ ; + + # Did we get a code reference? + my $coderef = (ref $obj eq 'CODE') ; + + # If the parameter isn't already a reference, make it one. + $obj = \$obj unless ref $obj ; + + $obj = bless ($obj, (caller)[0]) unless $coderef ; + + # finish off the installation of the filter in C. + Filter::Util::Call::real_import($obj, (caller)[0], $coderef) ; +} + +bootstrap Filter::Util::Call ; + +1; +__END__ + +=head1 NAME + +Filter::Util::Call - Perl Source Filter Utility Module + +=head1 SYNOPSIS + + use Filter::Util::Call ; + +=head1 DESCRIPTION + +This module provides you with the framework to write I +in Perl. + +An alternate interface to Filter::Util::Call is now available. See +L for more details. + +A I is implemented as a Perl module. The structure +of the module can take one of two broadly similar formats. To +distinguish between them, the first will be referred to as I and the second as I. + +Here is a skeleton for the I: + + package MyFilter ; + + use Filter::Util::Call ; + + sub import + { + my($type, @arguments) = @_ ; + filter_add([]) ; + } + + sub filter + { + my($self) = @_ ; + my($status) ; + + $status = filter_read() ; + $status ; + } + + 1 ; + +and this is the equivalent skeleton for the I: + + package MyFilter ; + + use Filter::Util::Call ; + + sub import + { + my($type, @arguments) = @_ ; + + filter_add( + sub + { + my($status) ; + $status = filter_read() ; + $status ; + } ) + } + + 1 ; + +To make use of either of the two filter modules above, place the line +below in a Perl source file. + + use MyFilter; + +In fact, the skeleton modules shown above are fully functional I, albeit fairly useless ones. All they does is filter the +source stream without modifying it at all. + +As you can see both modules have a broadly similar structure. They both +make use of the C module and both have an C +method. The difference between them is that the I +requires a I method, whereas the I gets the +equivalent of a I method with the anonymous sub passed to +I. + +To make proper use of the I shown above you need to +have a good understanding of the concept of a I. See +L for more details on the mechanics of I. + +=head2 B + +The following functions are exported by C: + + filter_add() + filter_read() + filter_read_exact() + filter_del() + +=head2 B + +The C method is used to create an instance of the filter. It is +called indirectly by Perl when it encounters the C line +in a source file (See L for more details on +C). + +It will always have at least one parameter automatically passed by Perl +- this corresponds to the name of the package. In the example above it +will be C<"MyFilter">. + +Apart from the first parameter, import can accept an optional list of +parameters. These can be used to pass parameters to the filter. For +example: + + use MyFilter qw(a b c) ; + +will result in the C<@_> array having the following values: + + @_ [0] => "MyFilter" + @_ [1] => "a" + @_ [2] => "b" + @_ [3] => "c" + +Before terminating, the C function must explicitly install the +filter by calling C. + +B + +The function, C, actually installs the filter. It takes one +parameter which should be a reference. The kind of reference used will +dictate which of the two filter types will be used. + +If a CODE reference is used then a I will be assumed. + +If a CODE reference is not used, a I will be assumed. +In a I, the reference can be used to store context +information. The reference will be I into the package by +C. + +See the filters at the end of this documents for examples of using +context information using both I and I. + +=head2 B + +Both the C method used with a I and the +anonymous sub used with a I is where the main +processing for the filter is done. + +The big difference between the two types of filter is that the I uses the object passed to the method to store any context data, +whereas the I uses the lexical variables that are +maintained by the closure. + +Note that the single parameter passed to the I, +C<$self>, is the same reference that was passed to C +blessed into the filter's package. See the example filters later on for +details of using C<$self>. + +Here is a list of the common features of the anonymous sub and the +C method. + +=over 5 + +=item B<$_> + +Although C<$_> doesn't actually appear explicitly in the sample filters +above, it is implicitly used in a number of places. + +Firstly, when either C or the anonymous sub are called, a local +copy of C<$_> will automatically be created. It will always contain the +empty string at this point. + +Next, both C and C will append any +source data that is read to the end of C<$_>. + +Finally, when C or the anonymous sub are finished processing, +they are expected to return the filtered source using C<$_>. + +This implicit use of C<$_> greatly simplifies the filter. + +=item B<$status> + +The status value that is returned by the user's C method or +anonymous sub and the C and C functions take +the same set of values, namely: + + < 0 Error + = 0 EOF + > 0 OK + +=item B and B + +These functions are used by the filter to obtain either a line or block +from the next filter in the chain or the actual source file if there +aren't any other filters. + +The function C takes two forms: + + $status = filter_read() ; + $status = filter_read($size) ; + +The first form is used to request a I, the second requests a +I. + +In line mode, C will append the next source line to the +end of the C<$_> scalar. + +In block mode, C will append a block of data which is <= +C<$size> to the end of the C<$_> scalar. It is important to emphasise +the that C will not necessarily read a block which is +I C<$size> bytes. + +If you need to be able to read a block which has an exact size, you can +use the function C. It works identically to +C in block mode, except it will try to read a block which +is exactly C<$size> bytes in length. The only circumstances when it +will not return a block which is C<$size> bytes long is on EOF or +error. + +It is I important to check the value of C<$status> after I +call to C or C. + +=item B + +The function, C, is used to disable the current filter. It +does not affect the running of the filter. All it does is tell Perl not +to call filter any more. + +See L for details. + +=back + +=head1 EXAMPLES + +Here are a few examples which illustrate the key concepts - as such +most of them are of little practical use. + +The C sub-directory has copies of all these filters +implemented both as I and as I. + +=head2 Example 1: A simple filter. + +Below is a I which is hard-wired to replace all +occurrences of the string C<"Joe"> to C<"Jim">. Not particularly +Useful, but it is the first example and I wanted to keep it simple. + + package Joe2Jim ; + + use Filter::Util::Call ; + + sub import + { + my($type) = @_ ; + + filter_add(bless []) ; + } + + sub filter + { + my($self) = @_ ; + my($status) ; + + s/Joe/Jim/g + if ($status = filter_read()) > 0 ; + $status ; + } + + 1 ; + +Here is an example of using the filter: + + use Joe2Jim ; + print "Where is Joe?\n" ; + +And this is what the script above will print: + + Where is Jim? + +=head2 Example 2: Using the context + +The previous example was not particularly useful. To make it more +general purpose we will make use of the context data and allow any +arbitrary I and I strings to be used. This time we will use a +I. To reflect its enhanced role, the filter is called +C. + + package Subst ; + + use Filter::Util::Call ; + use Carp ; + + sub import + { + croak("usage: use Subst qw(from to)") + unless @_ == 3 ; + my ($self, $from, $to) = @_ ; + filter_add( + sub + { + my ($status) ; + s/$from/$to/ + if ($status = filter_read()) > 0 ; + $status ; + }) + } + 1 ; + +and is used like this: + + use Subst qw(Joe Jim) ; + print "Where is Joe?\n" ; + + +=head2 Example 3: Using the context within the filter + +Here is a filter which a variation of the C filter. As well as +substituting all occurrences of C<"Joe"> to C<"Jim"> it keeps a count +of the number of substitutions made in the context object. + +Once EOF is detected (C<$status> is zero) the filter will insert an +extra line into the source stream. When this extra line is executed it +will print a count of the number of substitutions actually made. +Note that C<$status> is set to C<1> in this case. + + package Count ; + + use Filter::Util::Call ; + + sub filter + { + my ($self) = @_ ; + my ($status) ; + + if (($status = filter_read()) > 0 ) { + s/Joe/Jim/g ; + ++ $$self ; + } + elsif ($$self >= 0) { # EOF + $_ = "print q[Made ${$self} substitutions\n]" ; + $status = 1 ; + $$self = -1 ; + } + + $status ; + } + + sub import + { + my ($self) = @_ ; + my ($count) = 0 ; + filter_add(\$count) ; + } + + 1 ; + +Here is a script which uses it: + + use Count ; + print "Hello Joe\n" ; + print "Where is Joe\n" ; + +Outputs: + + Hello Jim + Where is Jim + Made 2 substitutions + +=head2 Example 4: Using filter_del + +Another variation on a theme. This time we will modify the C +filter to allow a starting and stopping pattern to be specified as well +as the I and I patterns. If you know the I editor, it is +the equivalent of this command: + + :/start/,/stop/s/from/to/ + +When used as a filter we want to invoke it like this: + + use NewSubst qw(start stop from to) ; + +Here is the module. + + package NewSubst ; + + use Filter::Util::Call ; + use Carp ; + + sub import + { + my ($self, $start, $stop, $from, $to) = @_ ; + my ($found) = 0 ; + croak("usage: use Subst qw(start stop from to)") + unless @_ == 5 ; + + filter_add( + sub + { + my ($status) ; + + if (($status = filter_read()) > 0) { + + $found = 1 + if $found == 0 and /$start/ ; + + if ($found) { + s/$from/$to/ ; + filter_del() if /$stop/ ; + } + + } + $status ; + } ) + + } + + 1 ; + +=head1 Filter::Simple + +If you intend using the Filter::Call functionality, I would strongly +recommend that you check out Damian Conway's excellent Filter::Simple +module. Damian's module provides a much cleaner interface than +Filter::Util::Call. Although it doesn't allow the fine control that +Filter::Util::Call does, it should be adequate for the majority of +applications. It's available at + + http://www.cpan.org/modules/by-author/Damian_Conway/Filter-Simple.tar.gz + http://www.csse.monash.edu.au/~damian/CPAN/Filter-Simple.tar.gz + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +26th January 1996 + +=cut + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.xs b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.xs new file mode 100644 index 0000000..7755618 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Call.xs @@ -0,0 +1,262 @@ +/* + * Filename : Call.xs + * + * Author : Paul Marquess + * Date : 11th November 2001 + * Version : 1.06 + * + * Copyright (c) 1995-2001 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. + * + */ + +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#ifdef _NOT_CORE +# include "ppport.h" +#endif + +/* Internal defines */ +#define PERL_MODULE(s) IoBOTTOM_NAME(s) +#define PERL_OBJECT(s) IoTOP_GV(s) +#define FILTER_ACTIVE(s) IoLINES(s) +#define BUF_OFFSET(sv) IoPAGE_LEN(sv) +#define CODE_REF(sv) IoPAGE(sv) +#ifndef PERL_FILTER_EXISTS +# define PERL_FILTER_EXISTS(i) (PL_rsfp_filters && (i) <= av_len(PL_rsfp_filters)) +#endif + +#define SET_LEN(sv,len) \ + do { SvPVX(sv)[len] = '\0'; SvCUR_set(sv, len); } while (0) + + +/* Global Data */ + +#define MY_CXT_KEY "Filter::Util::Call::_guts" XS_VERSION + +typedef struct { + int x_fdebug ; + int x_current_idx ; +} my_cxt_t; + +START_MY_CXT + +#define fdebug (MY_CXT.x_fdebug) +#define current_idx (MY_CXT.x_current_idx) + + +static I32 +filter_call(pTHX_ int idx, SV *buf_sv, int maxlen) +{ + dMY_CXT; + SV *my_sv = FILTER_DATA(idx); + char *nl = "\n"; + char *p; + char *out_ptr; + int n; + + if (fdebug) + warn("**** In filter_call - maxlen = %d, out len buf = %d idx = %d my_sv = %d [%s]\n", + maxlen, SvCUR(buf_sv), idx, SvCUR(my_sv), SvPVX(my_sv) ) ; + + while (1) { + + /* anything left from last time */ + if ((n = SvCUR(my_sv))) { + + out_ptr = SvPVX(my_sv) + BUF_OFFSET(my_sv) ; + + if (maxlen) { + /* want a block */ + if (fdebug) + warn("BLOCK(%d): size = %d, maxlen = %d\n", + idx, n, maxlen) ; + + sv_catpvn(buf_sv, out_ptr, maxlen > n ? n : maxlen ); + if(n <= maxlen) { + BUF_OFFSET(my_sv) = 0 ; + SET_LEN(my_sv, 0) ; + } + else { + BUF_OFFSET(my_sv) += maxlen ; + SvCUR_set(my_sv, n - maxlen) ; + } + return SvCUR(buf_sv); + } + else { + /* want lines */ + if ((p = ninstr(out_ptr, out_ptr + n, nl, nl + 1))) { + + sv_catpvn(buf_sv, out_ptr, p - out_ptr + 1); + + n = n - (p - out_ptr + 1); + BUF_OFFSET(my_sv) += (p - out_ptr + 1); + SvCUR_set(my_sv, n) ; + if (fdebug) + warn("recycle %d - leaving %d, returning %d [%s]", + idx, n, SvCUR(buf_sv), SvPVX(buf_sv)) ; + + return SvCUR(buf_sv); + } + else /* no EOL, so append the complete buffer */ + sv_catpvn(buf_sv, out_ptr, n) ; + } + + } + + + SET_LEN(my_sv, 0) ; + BUF_OFFSET(my_sv) = 0 ; + + if (FILTER_ACTIVE(my_sv)) + { + dSP ; + int count ; + + if (fdebug) + warn("gonna call %s::filter\n", PERL_MODULE(my_sv)) ; + + ENTER ; + SAVETMPS; + + SAVEINT(current_idx) ; /* save current idx */ + current_idx = idx ; + + SAVESPTR(DEFSV) ; /* save $_ */ + /* make $_ use our buffer */ + DEFSV = sv_2mortal(newSVpv("", 0)) ; + + PUSHMARK(sp) ; + + if (CODE_REF(my_sv)) { + /* if (SvROK(PERL_OBJECT(my_sv)) && SvTYPE(SvRV(PERL_OBJECT(my_sv))) == SVt_PVCV) { */ + count = perl_call_sv((SV*)PERL_OBJECT(my_sv), G_SCALAR); + } + else { + XPUSHs((SV*)PERL_OBJECT(my_sv)) ; + + PUTBACK ; + + count = perl_call_method("filter", G_SCALAR); + } + + SPAGAIN ; + + if (count != 1) + croak("Filter::Util::Call - %s::filter returned %d values, 1 was expected \n", + PERL_MODULE(my_sv), count ) ; + + n = POPi ; + + if (fdebug) + warn("status = %d, length op buf = %d [%s]\n", + n, SvCUR(DEFSV), SvPVX(DEFSV) ) ; + if (SvCUR(DEFSV)) + sv_setpvn(my_sv, SvPVX(DEFSV), SvCUR(DEFSV)) ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + } + else + n = FILTER_READ(idx + 1, my_sv, maxlen) ; + + if (n <= 0) + { + /* Either EOF or an error */ + + if (fdebug) + warn ("filter_read %d returned %d , returning %d\n", idx, n, + (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n); + + /* PERL_MODULE(my_sv) ; */ + /* PERL_OBJECT(my_sv) ; */ + filter_del(filter_call); + + /* If error, return the code */ + if (n < 0) + return n ; + + /* return what we have so far else signal eof */ + return (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n; + } + + } +} + + + +MODULE = Filter::Util::Call PACKAGE = Filter::Util::Call + +REQUIRE: 1.924 +PROTOTYPES: ENABLE + +#define IDX current_idx + +int +filter_read(size=0) + int size + CODE: + { + dMY_CXT; + SV * buffer = DEFSV ; + + RETVAL = FILTER_READ(IDX + 1, buffer, size) ; + } + OUTPUT: + RETVAL + + + + +void +real_import(object, perlmodule, coderef) + SV * object + char * perlmodule + int coderef + PPCODE: + { + SV * sv = newSV(1) ; + + (void)SvPOK_only(sv) ; + filter_add(filter_call, sv) ; + + PERL_MODULE(sv) = savepv(perlmodule) ; + PERL_OBJECT(sv) = (GV*) newSVsv(object) ; + FILTER_ACTIVE(sv) = TRUE ; + BUF_OFFSET(sv) = 0 ; + CODE_REF(sv) = coderef ; + + SvCUR_set(sv, 0) ; + + } + +void +filter_del() + CODE: + dMY_CXT; + if (PERL_FILTER_EXISTS(IDX) && FILTER_DATA(IDX) && FILTER_ACTIVE(FILTER_DATA(IDX))) + FILTER_ACTIVE(FILTER_DATA(IDX)) = FALSE ; + + + +void +unimport(package="$Package", ...) + char *package + PPCODE: + filter_del(filter_call); + + +BOOT: + { + MY_CXT_INIT; + fdebug = 0; + /* temporary hack to control debugging in toke.c */ + if (fdebug) + filter_add(NULL, (fdebug) ? (SV*)"1" : (SV*)"0"); + } + + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Makefile.PL b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Makefile.PL new file mode 100755 index 0000000..1ab017e --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/Makefile.PL @@ -0,0 +1,7 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Filter::Util::Call', + DEFINE => '-D_NOT_CORE', + VERSION_FROM => 'Call.pm', +); diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Call/ppport.h b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/ppport.h new file mode 100644 index 0000000..c264f43 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Call/ppport.h @@ -0,0 +1,286 @@ +/* This file is Based on output from + * Perl/Pollution/Portability Version 2.0000 */ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef PERL_REVISION +# ifndef __PATCHLEVEL_H_INCLUDED__ +# include "patchlevel.h" +# 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) + +#ifndef ERRSV +# define ERRSV perl_get_sv("@",FALSE) +#endif + +#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5)) +/* Replace: 1 */ +# define PL_Sv Sv +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_defgv defgv +# define PL_dirty dirty +# define PL_hints hints +# define PL_na na +# define PL_perldb perldb +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stdingv stdingv +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +/* Replace: 0 */ +#endif + +#ifndef pTHX +# define pTHX +# define pTHX_ +# define aTHX +# define aTHX_ +#endif + +#ifndef PTR2IV +# define PTR2IV(d) (IV)(d) +#endif + +#ifndef INT2PTR +# define INT2PTR(any,d) (any)(d) +#endif + +#ifndef dTHR +# ifdef WIN32 +# define dTHR extern int Perl___notused +# else +# define dTHR extern int errno +# endif +#endif + +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,flags) gv_stashpv(str,flags) +#endif + +#ifndef newSVpvn +# define newSVpvn(data,len) ((len) ? newSVpv ((data), (len)) : newSVpv ("", 0)) +#endif + +#ifndef Pid_t +# define Pid_t pid_t +#endif + +#ifndef newRV_inc +/* Replace: 1 */ +# define newRV_inc(sv) newRV(sv) +/* Replace: 0 */ +#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 + +#ifndef newRV_noinc +# ifdef __GNUC__ +# define newRV_noinc(sv) \ + ({ \ + SV *nsv = (SV*)newRV(sv); \ + SvREFCNT_dec(sv); \ + nsv; \ + }) +# else +# if defined(CRIPPLED_CC) || defined(USE_THREADS) +static SV * newRV_noinc (SV * sv) +{ + SV *nsv = (SV*)newRV(sv); + SvREFCNT_dec(sv); + return nsv; +} +# else +# define newRV_noinc(sv) \ + ((PL_Sv=(SV*)newRV(sv), SvREFCNT_dec(sv), (SV*)PL_Sv) +# endif +# endif +#endif + +/* Provide: newCONSTSUB */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63)) + +#if defined(NEED_newCONSTSUB) +static +#else +extern void newCONSTSUB _((HV * stash, char * name, SV *sv)); +#endif + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) +void +newCONSTSUB(stash,name,sv) +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)) + /* before 5.003_22 */ + start_subparse(), +#else +# if (PERL_VERSION == 3) && (PERL_SUBVERSION == 22) + /* 5.003_22 */ + start_subparse(0), +# else + /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +# endif +#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 /* newCONSTSUB */ + + +#ifndef START_MY_CXT + +/* + * 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) + +/* 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_REVISION == 5 && \ + (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 = perl_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 + +#else /* single interpreter */ + +#ifndef NOOP +# define NOOP (void)0 +#endif + +#ifdef HASATTRIBUTE +# define PERL_UNUSED_DECL __attribute__((unused)) +#else +# define PERL_UNUSED_DECL +#endif + +#ifndef dNOOP +# define dNOOP extern int Perl___notused PERL_UNUSED_DECL +#endif + +#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 + +#endif /* START_MY_CXT */ + + +#endif /* _P_P_PORTABILITY_H_ */ diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Changes b/deb-src/libfilter-perl/libfilter-perl-1.34/Changes new file mode 100644 index 0000000..8367b12 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Changes @@ -0,0 +1,292 @@ + +1.02 Tuesday 20th June 1995 +---- + + * First release. + +1.03 Sunday 25th June 1995 +---- + + * Tidied up the build process so that it doesn't need an empty + Filter.xs file. + +1.04 Sunday 25th June 1995 +---- + + * The test harness now uses $^X to invoke Perl. + + +1.05 Monday 26th June 1995 +---- + + * updated MANIFEST + + * tee.t test 5 has been hard-wired to return true if run as root. + + * The test files don't use $^X to invoke perl any more. I've passed + the MakeMaker symbol FULLPERL via an environment variable. A bit + of a kludge, but it does work :-) + + * added a mytest target to allow users to play with the Filters + without having to install them. + + * The EWOULDBLOCK/EAGAIN stuff has been wrapped in preprocessor code. + + * The hints files don't seem to be needed anymore. + + +1.06 Sunday 2nd July 1995 +---- + + * Renamed decrypt.test to decrypt.tst. + + * Renamed mytest.pl to mytest - it was getting installed. + + * exec.xs had a bit of debugging code lurking around. This meant + that O_NONBLOCK was *always* being used to set non-blocking i/o. + This has been removed. + + * Changed the way O_NONBLOCK/O_NDELAY was being detected. The Tk + method is now used. + + * Addition of Filter::call - first go at implementation of perl filters. + + +1.07 Wednesday 29th November 1995 +---- + + * exec now uses the non-blocking IO constants from Configure. Thanks + to Raphael for writing the dist module and to Andy for including it + in Configure. + + * The decrypt filter has been enhanced to detect when it is + executing as a dynamically linked module and if DEBUGGING is + enabled. Thanks to Tim for providing the dynamic module test. + + * Tim provided a pile of bug fixes for decrypt.xs + + * Filter::call has been renamed Filter::Util::Call and the logic for + installing it has been changed. + + * The workings of the filter method in Filter::Util::Call has been + changed. + + +1.08 Friday 15th December 1995 +---- + + * Fixed a bug in Exec.xs - wait was being called without a parameter. + + * Added a closure option to Call + + +1.09 Wednesday 22nd April 1996 +---- + + * Fixed a warning in Exec.xs - added a cast to safefree + + * Makefile.PL now uses VERSION_FROM + + * Made all filter modules strict clean. + + * The simple encrypt script supplied with the decryption filter will + now preserve the original file permissions. In addition if the + first line of the script begins with "#!", the line will be + preserved in the encrypted version. + +1.10 Thursday 20th June 1996 +---- + + * decrypt now calls filter_del. + +1.11 Tuesday 29th October 1996 +---- + + * test harness for decrypt doesn't display the debugger banner + message any more. + + * casted uses of IoTOP_GV in Call.xs, decrypt.xs and Exec.xs to keep + the IRIX compiler happy. + +1.12 Tuesday 25th March 1997 +---- + + * Patch from Andreas Koenig to make tee.xs compile when useperio is + enabled. + + * Fix Call interface to work with 5.003_94 + + +1.13 Monday 29th December 1997 +---- + + * added the order test harness. + + * patch from Gurusamy Sarathy to get the filters to build and pass + all tests on NT. + +1.14 Thursday 1st January 1998 +---- + + * patch from Gurusamy Sarathy to allow the filters to build when + threading is enabled. + +1.15 Monday 26th October 1998 +---- + + * Fixed a bug in the tee filter. + + * Applied patch from Gurusamy Sarathy which prevents Exec from coredump + when perl |is run with PERL_DESTRUCT_LEVEL. + +1.16 wednesday 17th March 1999 +---- + + * Upgraded to use the new PL_* symbols. Means the module can build with + Perl5.005_5*. + +1.17 Friday 10th December 1999 +---- + + * Addition of perlfilter.pod. This is the Source Filters article from + The Perl Journal, issue 11 and is identical to the file that is + distributed with Perl starting withversion 5.005_63. + +1.18 Sunday 2nd April 2000 +---- + + * Test harnesses are more robust on Win32. + + * Fixed a problem where an __END__ or __DATA__ could crash Perl. + +1.19 Thursday 20th July 2000 +---- + + * Added a test in decrypt.xs to check if the Compiler backend is in use. + Thanks to Andrew Johnson for bringing this to my attention. + +1.20 Sunday 7th January 2001 +---- + + * Added a SYNOPSIS to Call.pm & Exec.pm + + * Integrated perl core patches 7849, 7913 & 7931. + + * Modified decrypt.t to fix a case where HP-UX didn't pass test 4. + + +1.21 Monday 19th February 20001 +---- + + * Added logic in Makefile.PL to toggle between using $^W and + the warnings pragma in the module. + + * The module, the examples & the test harness are now all strict + & warnings clean. + +1.22 Wednesday 21st February 20001 +---- + + * Added Michael G Schwern's example of a practical use of Filter::cpp + into the pod. + + * Filter::cpp assumed that cpp.exe is always available on MSWin32. Logic + has been added to check for the existence of cpp.exe. + + * Added a reference to Damian Conway's excellent Filter::Simple module. + + * Merged Core patch 9176 + +1.23 Monday 23rd April 2001 +---- + + * Modified Makefile.PL to only enable the warnings pragma if using perl + 5.6.1 or better. + +1.24 +---- + + * Fixed sh.t, exec.t & cpp.t to work properly on NT + patch courtesy of Steve Hay. + + * The detection of cpp in cpp.pm is now more robust + patch courtesy of Michael Schwern + + * Changed na to PL_na in decrypt.xs + + * Merged Core patches 10752, 11434 + +1.25 +---- + + * Fixed minor typo in Makefile.PL + +1.26 +---- + + * Call & Exec now use the CXT* macros + + * moved all backward compatability code into ppport.h + +1.27 +---- + + * Patch from Wim Verhaegen to allow cpp to be an absolute path + + * Patch from Gurusamy Sarathy to fix a Windods core dump in Exec.xs -- + dMY_CXT was being accessed before it was ititialised. + + * Merged core patch 13940 + +1.28 +---- + + * Fixed bug in Filter::cpp where $Config{cppstdin} refered to an executable + with an absolute path. Bug spotted by P. Kent. + +1.29 29 June 2002 +---- + + * Fixed problem with sleep in Exec.xs. Patch provided by Charles Randall. + + * Exec.xs now used waitpid, when available, instead or wait. Patch provided + by Richard Clamp. + + * Also the place where the wait is called has been changed. + Deadlock condition spotted by Andrej Czapszys. + +1.30 16 August 2003 +---- + + * rewording of reference to Filter::Simple + + * merged core patch 18269 + +1.31 31 August 2005 +---- + + * added 'libscan' to Makefile.PL to stop .bak files being installed. + [rt.cpan.org: Ticket #14356 .bak files are being installed ] + +1.32 3 January 2006 +---- + + * Added core patch 26509 -- fix out by one bug in Call.xs + Problem reported & fixed by Gisle Aas. + +1.33 1 March 2007 +---- + + * fixed ninstr issue for 5.8.9 + + * added t/pod.t + +1.34 7 July 2007 +---- + + * Included Core patch #31200 - change to support perl 5.10 for + Filter::Util::Call + + * Also included the equivalent changes for the other filters. Patch + kindly provided by Steve Hay. + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.pm new file mode 100644 index 0000000..9d1150a --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.pm @@ -0,0 +1,40 @@ +package Filter::Util::Exec ; + +require 5.002 ; +require DynaLoader; +use strict; +use warnings; +use vars qw(@ISA $VERSION) ; +@ISA = qw(DynaLoader); +$VERSION = "1.03" ; + +bootstrap Filter::Util::Exec ; +1 ; +__END__ + +=head1 NAME + +Filter::Util::Exec - exec source filter + +=head1 SYNOPSIS + + use Filter::Util::Exec; + +=head1 DESCRIPTION + +This module is provides the interface to allow the creation of I which use a Unix coprocess. + +See L, L and L for examples of +the use of this module. + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +11th December 1995. + +=cut + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.xs b/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.xs new file mode 100644 index 0000000..2b7ae13 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Exec.xs @@ -0,0 +1,625 @@ +/* + * Filename : exec.xs + * + * Author : Paul Marquess + * Date : 26th March 2000 + * Version : 1.05 + * + */ + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include "../Call/ppport.h" + +#include + +/* Global Data */ + +#define MY_CXT_KEY "Filter::Util::Exec::_guts" XS_VERSION + +typedef struct { + int x_fdebug ; +#ifdef WIN32 + int x_write_started; + int x_pipe_pid; +#endif +} my_cxt_t; + +START_MY_CXT + +#define fdebug (MY_CXT.x_fdebug) +#ifdef WIN32 +#define write_started (MY_CXT.x_write_started) +#define pipe_pid (MY_CXT.x_pipe_pid) +#endif + +#ifdef PERL_FILTER_EXISTS +# define CORE_FILTER_SCRIPT PL_parser->rsfp +#else +# define CORE_FILTER_SCRIPT PL_rsfp +#endif + + +#define PIPE_IN(sv) IoLINES(sv) +#define PIPE_OUT(sv) IoPAGE(sv) +#define PIPE_PID(sv) IoLINES_LEFT(sv) + +#define BUF_SV(sv) IoTOP_GV(sv) +#define BUF_START(sv) SvPVX((SV*) BUF_SV(sv)) +#define BUF_SIZE(sv) SvCUR((SV*) BUF_SV(sv)) +#define BUF_NEXT(sv) IoFMT_NAME(sv) +#define BUF_END(sv) (BUF_START(sv) + BUF_SIZE(sv)) +#define BUF_OFFSET(sv) IoPAGE_LEN(sv) + +#define SET_LEN(sv,len) \ + do { SvPVX(sv)[len] = '\0'; SvCUR_set(sv, len); } while (0) + +#define BLOCKSIZE 100 + + +#ifdef WIN32 + +typedef struct { + SV * sv; + int idx; +#ifdef USE_THREADS + struct perl_thread * parent; +#endif +#ifdef USE_ITHREADS + PerlInterpreter * parent; +#endif +} thrarg; + +static void +pipe_write(void *args) +{ + thrarg *targ = (thrarg *)args; + SV *sv = targ->sv; + int idx = targ->idx; + int pipe_in = PIPE_IN(sv) ; + int pipe_out = PIPE_OUT(sv) ; + int rawread_eof = 0; + int r,w,len; +#ifdef USE_THREADS + /* use the parent's perl thread context */ + SET_THR(targ->parent); +#endif +#ifdef USE_ITHREADS + PERL_SET_THX(targ->parent); +#endif + { + dMY_CXT; + free(args); + for(;;) + { + + /* get some raw data to stuff down the pipe */ + /* But only when BUF_SV is empty */ + if (!rawread_eof && BUF_NEXT(sv) >= BUF_END(sv)) { + /* empty BUF_SV */ + SvCUR_set((SV*)BUF_SV(sv), 0) ; + if ((len = FILTER_READ(idx+1, (SV*) BUF_SV(sv), 0)) > 0) { + BUF_NEXT(sv) = BUF_START(sv); + if (fdebug) + warn ("*pipe_write(%d) Filt Rd returned %d %d [%*s]\n", + idx, len, BUF_SIZE(sv), BUF_SIZE(sv), BUF_START(sv)) ; + } + else { + /* eof, close write end of pipe after writing to it */ + rawread_eof = 1; + } + } + + /* write down the pipe */ + if ((w = BUF_END(sv) - BUF_NEXT(sv)) > 0) { + errno = 0; + if ((w = write(pipe_out, BUF_NEXT(sv), w)) > 0) { + BUF_NEXT(sv) += w; + if (fdebug) + warn ("*pipe_write(%d) wrote %d bytes to pipe\n", idx, w) ; + } + else { + if (fdebug) + warn ("*pipe_write(%d) closing pipe_out errno = %d %s\n", + idx, errno, Strerror(errno)) ; + close(pipe_out) ; + CloseHandle((HANDLE)pipe_pid); + write_started = 0; + return; + } + } + else if (rawread_eof) { + if (fdebug) + warn ("*pipe_write(%d) closing pipe_out errno = %d %s\n", + idx, errno, Strerror(errno)) ; + close(pipe_out); + CloseHandle((HANDLE)pipe_pid); + write_started = 0; + return; + } + } + } +} + +static int +pipe_read(SV *sv, int idx, int maxlen) +{ + dMY_CXT; + int pipe_in = PIPE_IN(sv) ; + int pipe_out = PIPE_OUT(sv) ; + + int r ; + int w ; + int len ; + + if (fdebug) + warn ("*pipe_read(sv=%d, SvCUR(sv)=%d, idx=%d, maxlen=%d\n", + sv, SvCUR(sv), idx, maxlen) ; + + if (!maxlen) + maxlen = 1024 ; + + /* just make sure the SV is big enough */ + SvGROW(sv, SvCUR(sv) + maxlen) ; + + if ( !BUF_NEXT(sv) ) + BUF_NEXT(sv) = BUF_START(sv); + + if (!write_started) { + thrarg *targ = (thrarg*)malloc(sizeof(thrarg)); + targ->sv = sv; targ->idx = idx; +#ifdef USE_THREADS + targ->parent = THR; +#endif +#ifdef USE_ITHREADS + targ->parent = aTHX; +#endif + /* thread handle is closed when pipe_write() returns */ + _beginthread(pipe_write,0,(void *)targ); + write_started = 1; + } + + /* try to get data from filter, if any */ + errno = 0; + len = SvCUR(sv) ; + if ((r = read(pipe_in, SvPVX(sv) + len, maxlen)) > 0) + { + if (fdebug) + warn ("*pipe_read(%d) from pipe returned %d [%*s]\n", + idx, r, r, SvPVX(sv) + len) ; + SvCUR_set(sv, r + len) ; + return SvCUR(sv); + } + + if (fdebug) + warn ("*pipe_read(%d) returned %d, errno = %d %s\n", + idx, r, errno, Strerror(errno)) ; + + /* close the read pipe on error/eof */ + if (fdebug) + warn("*pipe_read(%d) -- EOF <#########\n", idx) ; + close (pipe_in) ; + return 0; +} + +#else /* !WIN32 */ + + +static int +pipe_read(SV *sv, int idx, int maxlen) +{ + dMY_CXT; + int pipe_in = PIPE_IN(sv) ; + int pipe_out = PIPE_OUT(sv) ; + int pipe_pid = PIPE_PID(sv) ; + + int r ; + int w ; + int len ; + + if (fdebug) + warn ("*pipe_read(sv=%d, SvCUR(sv)=%d, idx=%d, maxlen=%d\n", + sv, SvCUR(sv), idx, maxlen) ; + + if (!maxlen) + maxlen = 1024 ; + + /* just make sure the SV is big enough */ + SvGROW(sv, SvCUR(sv) + maxlen) ; + + for(;;) + { + if ( !BUF_NEXT(sv) ) + BUF_NEXT(sv) = BUF_START(sv); + else + { + /* try to get data from filter, if any */ + errno = 0; + len = SvCUR(sv) ; + if ((r = read(pipe_in, SvPVX(sv) + len, maxlen)) > 0) + { + if (fdebug) + warn ("*pipe_read(%d) from pipe returned %d [%*s]\n", + idx, r, r, SvPVX(sv) + len) ; + SvCUR_set(sv, r + len) ; + return SvCUR(sv); + } + + if (fdebug) + warn ("*pipe_read(%d) returned %d, errno = %d %s\n", + idx, r, errno, Strerror(errno)) ; + + if (errno != VAL_EAGAIN) + { + /* close the read pipe on error/eof */ + if (fdebug) + warn("*pipe_read(%d) -- EOF <#########\n", idx) ; + close (pipe_in) ; +#ifdef HAVE_WAITPID + waitpid(pipe_pid, NULL, 0) ; +#else + wait(NULL); +#endif + return 0; + } + } + + /* get some raw data to stuff down the pipe */ + /* But only when BUF_SV is empty */ + if (BUF_NEXT(sv) >= BUF_END(sv)) + { + /* empty BUF_SV */ + SvCUR_set((SV*)BUF_SV(sv), 0) ; + if ((len = FILTER_READ(idx+1, (SV*) BUF_SV(sv), 0)) > 0) { + BUF_NEXT(sv) = BUF_START(sv); + if (fdebug) + warn ("*pipe_write(%d) Filt Rd returned %d %d [%*s]\n", + idx, len, BUF_SIZE(sv), BUF_SIZE(sv), BUF_START(sv)) ; + } + else { + /* eof, close write end of pipe */ + close(pipe_out) ; + if (fdebug) + warn ("*pipe_read(%d) closing pipe_out errno = %d %s\n", + idx, errno, + Strerror(errno)) ; + } + } + + /* write down the pipe */ + if ((w = BUF_END(sv) - BUF_NEXT(sv)) > 0) + { + errno = 0; + if ((w = write(pipe_out, BUF_NEXT(sv), w)) > 0) { + BUF_NEXT(sv) += w; + if (fdebug) + warn ("*pipe_read(%d) wrote %d bytes to pipe\n", idx, w) ; + } + else if (errno != VAL_EAGAIN) { + if (fdebug) + warn ("*pipe_read(%d) closing pipe_out errno = %d %s\n", + idx, errno, Strerror(errno)) ; + /* close(pipe_out) ; */ + return 0; + } + else { /* pipe is full, sleep for a while, then continue */ + if (fdebug) + warn ("*pipe_read(%d) - sleeping\n", idx ) ; + sleep(0); + } + } + } +} + + +static void +make_nonblock(int f) +{ + int RETVAL ; + int mode = fcntl(f, F_GETFL); + + if (mode < 0) + croak("fcntl(f, F_GETFL) failed, RETVAL = %d, errno = %d", + mode, errno) ; + + if (!(mode & VAL_O_NONBLOCK)) + RETVAL = fcntl(f, F_SETFL, mode | VAL_O_NONBLOCK); + + if (RETVAL < 0) + croak("cannot create a non-blocking pipe, RETVAL = %d, errno = %d", + RETVAL, errno) ; +} + +#endif + + +#define READER 0 +#define WRITER 1 + +static Pid_t +spawnCommand(PerlIO *fil, char *command, char *parameters[], int *p0, int *p1) +{ + dMY_CXT; +#ifdef WIN32 + +#if defined(PERL_OBJECT) +# define win32_pipe(p,n,f) _pipe(p,n,f) +#endif + + int p[2], c[2]; + SV * sv ; + int oldstdout, oldstdin; + + /* create the pipes */ + if (win32_pipe(p,512,O_TEXT|O_NOINHERIT) == -1 + || win32_pipe(c,512,O_BINARY|O_NOINHERIT) == -1) { + PerlIO_close( fil ); + croak("Can't get pipe for %s", command); + } + + /* duplicate stdout and stdin */ + oldstdout = dup(fileno(stdout)); + if (oldstdout == -1) { + PerlIO_close( fil ); + croak("Can't dup stdout for %s", command); + } + oldstdin = dup(fileno(stdin)); + if (oldstdin == -1) { + PerlIO_close( fil ); + croak("Can't dup stdin for %s", command); + } + + /* duplicate inheritable ends as std handles for the child */ + if (dup2(p[WRITER], fileno(stdout))) { + PerlIO_close( fil ); + croak("Can't attach pipe to stdout for %s", command); + } + if (dup2(c[READER], fileno(stdin))) { + PerlIO_close( fil ); + croak("Can't attach pipe to stdin for %s", command); + } + + /* close original inheritable ends in parent */ + close(p[WRITER]); + close(c[READER]); + + /* spawn child process (which inherits the redirected std handles) */ + pipe_pid = spawnvp(P_NOWAIT, command, parameters); + if (pipe_pid == -1) { + PerlIO_close( fil ); + croak("Can't spawn %s", command); + } + + /* restore std handles */ + if (dup2(oldstdout, fileno(stdout))) { + PerlIO_close( fil ); + croak("Can't restore stdout for %s", command); + } + if (dup2(oldstdin, fileno(stdin))) { + PerlIO_close( fil ); + croak("Can't restore stdin for %s", command); + } + + /* close saved handles */ + close(oldstdout); + close(oldstdin); + + *p0 = p[READER] ; + *p1 = c[WRITER] ; + +#else /* !WIN32 */ + + int p[2], c[2]; + SV * sv ; + int pipepid; + + /* Check that the file is seekable */ + /* if (lseek(fileno(fil), ftell(fil), 0) == -1) { */ + /* croak("lseek failed: %s", Strerror(errno)) ; */ + /* } */ + + if (pipe(p) < 0 || pipe(c)) { + PerlIO_close( fil ); + croak("Can't get pipe for %s", command); + } + + /* make sure that the child doesn't get anything extra */ + fflush(stdout); + fflush(stderr); + + while ((pipepid = fork()) < 0) { + if (errno != EAGAIN) { + close(p[0]); + close(p[1]); + close(c[0]) ; + close(c[1]) ; + PerlIO_close( fil ); + croak("Can't fork for %s", command); + } + sleep(1); + } + + if (pipepid == 0) { + /* The Child */ + + close(p[READER]) ; + close(c[WRITER]) ; + if (c[READER] != 0) { + dup2(c[READER], 0); + close(c[READER]); + } + if (p[WRITER] != 1) { + dup2(p[WRITER], 1); + close(p[WRITER]); + } + + /* Run command */ + execvp(command, parameters) ; + croak("execvp failed for command '%s': %s", command, Strerror(errno)) ; + fflush(stdout); + fflush(stderr); + _exit(0); + } + + /* The parent */ + + close(p[WRITER]) ; + close(c[READER]) ; + + /* make the pipe non-blocking */ + make_nonblock(p[READER]) ; + make_nonblock(c[WRITER]) ; + + *p0 = p[READER] ; + *p1 = c[WRITER] ; + + return pipepid; +#endif +} + + +static I32 +filter_exec(pTHX_ int idx, SV *buf_sv, int maxlen) +{ + dMY_CXT; + I32 len; + SV *buffer = FILTER_DATA(idx); + char * out_ptr = SvPVX(buffer) ; + int n ; + char * p ; + char * nl = "\n" ; + + if (fdebug) + warn ("filter_sh(idx=%d, SvCUR(buf_sv)=%d, maxlen=%d\n", + idx, SvCUR(buf_sv), maxlen) ; + while (1) { + STRLEN n_a; + + /* If there was a partial line/block left from last time + copy it now + */ + if (n = SvCUR(buffer)) { + out_ptr = SvPVX(buffer) + BUF_OFFSET(buffer) ; + if (maxlen) { + /* want a block */ + if (fdebug) + warn("filter_sh(%d) - wants a block\n", idx) ; + sv_catpvn(buf_sv, out_ptr, maxlen > n ? n : maxlen ); + if(n <= maxlen) { + BUF_OFFSET(buffer) = 0 ; + SET_LEN(buffer, 0) ; + } + else { + BUF_OFFSET(buffer) += maxlen ; + SvCUR_set(buffer, n - maxlen) ; + } + return SvCUR(buf_sv); + } + else { + /* want a line */ + if (fdebug) + warn("filter_sh(%d) - wants a line\n", idx) ; + if (p = ninstr(out_ptr, out_ptr + n, nl, nl + 1)) { + sv_catpvn(buf_sv, out_ptr, p - out_ptr + 1); + n = n - (p - out_ptr + 1); + BUF_OFFSET(buffer) += (p - out_ptr + 1); + SvCUR_set(buffer, n) ; + if (fdebug) + warn("recycle(%d) - leaving %d [%s], returning %d %d [%s]", + idx, n, + SvPVX(buffer), p - out_ptr + 1, + SvCUR(buf_sv), SvPVX(buf_sv)) ; + + return SvCUR(buf_sv); + } + else /* partial buffer didn't have any newlines, so copy it all */ + sv_catpvn(buf_sv, out_ptr, n) ; + } + + } + + + /* the buffer has been consumed, so reset the length */ + SET_LEN(buffer, 0) ; + BUF_OFFSET(buffer) = 0 ; + + /* read from the sub-process */ + if ( (n=pipe_read(buffer, idx, maxlen)) <= 0) { + + if (fdebug) + warn ("filter_sh(%d) - pipe_read returned %d , returning %d\n", + idx, n, (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n); + + SvCUR_set(buffer, 0); + BUF_NEXT(buffer) = Nullch; /* or perl will try to free() it */ + /* filter_del(filter_sh); */ + + /* If error, return the code */ + if (n < 0) + return n ; + + /* return what we have so far else signal eof */ + return (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n; + } + + if (fdebug) + warn(" filter_sh(%d): pipe_read returned %d %d: '%s'", + idx, n, SvCUR(buffer), SvPV(buffer,n_a)); + + } + +} + + +MODULE = Filter::Util::Exec PACKAGE = Filter::Util::Exec + +REQUIRE: 1.924 +PROTOTYPES: ENABLE + +BOOT: + { + MY_CXT_INIT; + fdebug = 0; + /* temporary hack to control debugging in toke.c */ + filter_add(NULL, (fdebug) ? (SV*)"1" : (SV*)"0"); + } + + +void +filter_add(module, command, ...) + SV * module = NO_INIT + char ** command = (char**) safemalloc(items * sizeof(char*)) ; + PROTOTYPE: $@ + CODE: + dMY_CXT; + int i ; + int pipe_in, pipe_out ; + STRLEN n_a ; + /* SV * sv = newSVpv("", 0) ; */ + SV * sv = newSV(1) ; + Pid_t pid; + + if (fdebug) + warn("Filter::exec::import\n") ; + for (i = 1 ; i < items ; ++i) + { + command[i-1] = SvPV(ST(i), n_a) ; + if (fdebug) + warn(" %s\n", command[i-1]) ; + } + command[i-1] = NULL ; + filter_add(filter_exec, sv); + pid = spawnCommand(CORE_FILTER_SCRIPT, command[0], command, &pipe_in, &pipe_out) ; + safefree((char*)command) ; + + PIPE_PID(sv) = pid ; + PIPE_IN(sv) = pipe_in ; + PIPE_OUT(sv) = pipe_out ; + /* BUF_SV(sv) = newSVpv("", 0) ; */ + BUF_SV(sv) = (GV*) newSV(1) ; + (void)SvPOK_only(BUF_SV(sv)) ; + BUF_NEXT(sv) = NULL ; + BUF_OFFSET(sv) = 0 ; + + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Makefile.PL b/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Makefile.PL new file mode 100755 index 0000000..5b8974a --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Exec/Makefile.PL @@ -0,0 +1,7 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Filter::Util::Exec', + VERSION_FROM => 'Exec.pm', +); + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/MANIFEST b/deb-src/libfilter-perl/libfilter-perl-1.34/MANIFEST new file mode 100644 index 0000000..c3d7be5 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/MANIFEST @@ -0,0 +1,49 @@ +Changes +MANIFEST +Makefile.PL +README +Call/Makefile.PL +Call/Call.pm +Call/Call.xs +Call/ppport.h +Exec/Makefile.PL +Exec/Exec.pm +Exec/Exec.xs +decrypt/Makefile.PL +decrypt/decr +decrypt/decrypt.pm +decrypt/decrypt.xs +decrypt/encrypt +examples/method/Count.pm +examples/method/NewSubst.pm +examples/method/UUdecode.pm +examples/method/Decompress.pm +examples/method/Joe2Jim.pm +examples/method/Subst.pm +examples/closure/Count.pm +examples/closure/NewSubst.pm +examples/closure/UUdecode.pm +examples/closure/Decompress.pm +examples/closure/Include.pm +examples/closure/Joe2Jim.pm +examples/closure/Subst.pm +examples/filtdef +examples/filtuu +lib/Filter/cpp.pm +lib/Filter/exec.pm +lib/Filter/sh.pm +mytest +t/call.t +t/cpp.t +t/decrypt.t +t/exec.t +t/order.t +t/pod.t +t/sh.t +t/tee.t +tee/Makefile.PL +tee/tee.pm +tee/tee.xs +filter-util.pl +perlfilter.pod +META.yml Module meta-data (added by MakeMaker) diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/META.yml b/deb-src/libfilter-perl/libfilter-perl-1.34/META.yml new file mode 100644 index 0000000..ef3166e --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/META.yml @@ -0,0 +1,13 @@ +--- #YAML:1.0 +name: Filter +version: 1.34 +abstract: Source Filters +license: perl +generated_by: ExtUtils::MakeMaker version 6.36 +distribution_type: module +requires: +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 +author: + - Paul Marquess diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/Makefile.PL b/deb-src/libfilter-perl/libfilter-perl-1.34/Makefile.PL new file mode 100644 index 0000000..04dd1cb --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/Makefile.PL @@ -0,0 +1,153 @@ +use ExtUtils::MakeMaker; + +BEGIN +{ + die "Filters needs Perl version 5.004 or better, you have $]\n" + if $] < 5.004 ; + + warn "Perl 5.6.0 or better is strongly recommended for Win32\n" + if $^O eq 'MSWin32' && $] < 5.006 ; +} + +use strict; + +my @files = qw( filter-util.pl + Call/Call.pm + Exec/Exec.pm + decrypt/decrypt.pm decrypt/decr decrypt/encrypt + tee/tee.pm + lib/Filter/cpp.pm lib/Filter/exec.pm lib/Filter/sh.pm + examples/filtdef + examples/method/Count.pm + examples/method/NewSubst.pm + examples/method/UUdecode.pm + examples/method/Decompress.pm + examples/method/Joe2Jim.pm + examples/method/Subst.pm + examples/closure/Count.pm + examples/closure/NewSubst.pm + examples/closure/UUdecode.pm + examples/closure/Decompress.pm + examples/closure/Include.pm + examples/closure/Joe2Jim.pm + examples/closure/Subst.pm + examples/filtdef + examples/filtuu + t/call.t + t/cpp.t + t/decrypt.t + t/exec.t + t/order.t + t/sh.t + t/tee.t + ); + +if ($] < 5.006001) + { oldWarnings(@files) } +else + { newWarnings(@files) } + + +{ + package MY; + + # Fun hack by cjwatson to get perlfilter.pod manified in section 1 with + # all the other perl*.pod pages. + sub constants { + my ($self) = @_; + $self->{MAN1PODS}->{'perlfilter.pod'} = + $self->catfile("\$(INST_MAN1DIR)", "perlfilter.\$(MAN1EXT)"); + delete $self->{MAN3PODS}->{'perlfilter.pod'}; + $self->SUPER::constants(); + } +} + + +WriteMakefile( + NAME => 'Filter', + VERSION => '1.34', + 'linkext' => {LINKTYPE => ''}, + 'dist' => {COMPRESS=>'gzip', SUFFIX=>'gz', + DIST_DEFAULT => 'MyDoubleCheck tardist'}, + ($] >= 5.005 + ? (ABSTRACT => 'Source Filters', + AUTHOR => 'Paul Marquess ') + : () + ), + ((ExtUtils::MakeMaker->VERSION() gt '6.30') ? + ('LICENSE' => 'perl') : ()), + ) ; + +sub MY::libscan +{ + my $self = shift ; + my $path = shift ; + + return undef + if $path =~ /(~|\.bak)$/ || + $path =~ /^\..*\.swp$/ ; + + return $path; +} + +sub MY::postamble +{ + ' + +MyDoubleCheck: + @echo Checking for $$^W in files + @perl -ne \' \ + exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \ + \' ' . " @files || " . ' \ + (echo found unexpected $$^W ; exit 1) + @echo All is ok. + +' ; +} + +sub oldWarnings +{ + local ($^I) = "" ; + local (@ARGV) = @_ ; + + while (<>) + { + if (/^__END__/) + { + print ; + my $this = $ARGV ; + while (<>) + { + last if $ARGV ne $this ; + print ; + } + } + + s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ; + s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ; + print ; + } +} + +sub newWarnings +{ + local ($^I) = "" ; + local (@ARGV) = @_ ; + + while (<>) + { + if (/^__END__/) + { + my $this = $ARGV ; + print ; + while (<>) + { + last if $ARGV ne $this ; + print ; + } + } + + s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ; + print ; + } +} diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/README b/deb-src/libfilter-perl/libfilter-perl-1.34/README new file mode 100644 index 0000000..09a5717 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/README @@ -0,0 +1,76 @@ + Source Filters + + Version 1.33 + + 1st March 2007 + + 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. + + + +DESCRIPTION +----------- + +This distribution consists of a number of Source Filters. + +For more details see the pod documentation embedded in the .pm files. + +If you intend using the Filter::Call functionality, I would strongly +recommend that you check out Damian Conway's excellent Filter::Simple +module. Damian's module provides a much cleaner interface than +Filter::Util::Call. Although it doesn't allow the fine control that +Filter::Util::Call does, it should be adequate for the majority of +applications. It's available at + + http://www.cpan.org/modules/by-author/Damian_Conway/Filter-Simple.tar.gz + http://www.csse.monash.edu.au/~damian/CPAN/Filter-Simple.tar.gz + +PREREQUISITES +------------- + +Before you can build the Source Filters you need to have the following +installed on your system: + + * Perl 5.004 or better. 5.6.0 or better is recommended for Win32. + +If your Perl is less than version 5.004_55, the "order" test harness +will be skipped. + + +BUILDING THE MODULES +-------------------- + +Assuming you have met all the prerequisites, building the modules +should be relatively straightforward. + +The modules can now be built using this sequence of commands: + + perl Makefile.PL + make + make test + +The filters have been successfully built and tested on the following +systems (at least): + + SunOS 4.1.3 (Sun C compiler & gcc 2.7.2.3) + Solaris 2.3 (Sun C Compiler) + irix 5.3 + irix 6.x + Windows NT 4.0 (Visual C++ 5.0 and Borland C++ 5.02) + +GNU tr and GNU cpp must be installed somewhere on the path for the +testsuite to pass successfully on Windows NT. + +INSTALLATION +------------ + + make install + +UPDATES +------- + +The most recent version of the Filters is always available at + + http://www.cpan.org/modules/by-module/Filter diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/debian/changelog b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/changelog new file mode 100644 index 0000000..a1a3f98 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/changelog @@ -0,0 +1,144 @@ +libfilter-perl (1.34-1maemo1) fremantle; urgency=low + + * New Maemo packaging + + -- Nito Martinez Wed, 14 Apr 2010 07:27:21 +0100 + + +llibfilter-perl (1.34-1) unstable; urgency=low + + * New upstream release. + - Support Perl 5.10 (closes: #466751). + * Update copyright dates. + + -- Colin Watson Thu, 21 Feb 2008 09:18:07 +0000 + +libfilter-perl (1.31-2) unstable; urgency=low + + * Add ${shlibs:Depends} and call dh_shlibdeps. + * Don't ignore errors from 'make realclean' other than the Makefile not + existing. + * Use debhelper v4. + * Add a Homepage field. + * Policy version 3.7.3: no changes required. + * debian/watch: use dist-based URL. + + -- Colin Watson Thu, 17 Jan 2008 23:56:29 +0000 + +libfilter-perl (1.31-1) unstable; urgency=low + + * New upstream release (closes: #329543). + * Remove my Makefile.PL hack for Subversion from 1.29-2, which is no + longer necessary with current perl. + * Policy version 3.6.2: no changes required. + + -- Colin Watson Thu, 22 Sep 2005 09:32:09 +0100 + +libfilter-perl (1.30-2) unstable; urgency=low + + * Upgrade debian/watch to format version 2. + * Improve package description, based on a suggestion by Anthony DeRobertis + (closes: #258801). + * Policy version 3.6.1: no changes required. + + -- Colin Watson Sun, 11 Jul 2004 20:22:59 +0100 + +libfilter-perl (1.30-1) unstable; urgency=low + + * New upstream release. + + -- Colin Watson Tue, 19 Aug 2003 00:47:33 +0100 + +libfilter-perl (1.29-2) unstable; urgency=low + + * debian/copyright: Copy Perl's licensing terms rather than referring to + them. + * debian/watch: Improve pattern to avoid downloading Filter::Trigraphs by + mistake. + * debian/control: Change section from interpreters to perl. + * debian/rules: Move debhelper compatibility level to debian/compat. + Requires debhelper 3.4.4. + * Makefile.PL: Add workaround from #190065 to cope with keeping the + package in Subversion. + + -- Colin Watson Sat, 24 May 2003 12:06:16 +0100 + +libfilter-perl (1.29-1) unstable; urgency=low + + * New upstream release (closes: #193820). + * Policy version 3.5.10: drop DEB_BUILD_OPTIONS=debug and support noopt. + * Clean up "Upstream Author(s)" in debian/copyright (lintian). + + -- Colin Watson Wed, 21 May 2003 00:22:55 +0100 + +libfilter-perl (1.28-3) unstable; urgency=low + + * Add a pointer to /usr/share/doc/perl/copyright in the copyright file + (closes: #157586). + + -- Colin Watson Mon, 26 Aug 2002 03:19:07 +0100 + +libfilter-perl (1.28-2) unstable; urgency=low + + * Rebuild for perl 5.8. Bumped perl build-dependency to 5.8.0-3. + + -- Colin Watson Wed, 31 Jul 2002 13:41:45 +0000 + +libfilter-perl (1.28-1) unstable; urgency=low + + * New upstream release. + + -- Colin Watson Sat, 26 Jan 2002 15:22:33 +0000 + +libfilter-perl (1.25-1) unstable; urgency=low + + * New upstream release. + * Policy version 3.5.6, Perl policy version 1.20 (versioned + build-dependency on perl). + * Actually build-depend on perl 5.6.1 so that new warnings are used. + * Add evil hack to Makefile.PL to install perlfilter.pod in section 1p. + + -- Colin Watson Thu, 4 Oct 2001 01:06:04 +0100 + +libfilter-perl (1.23-1) unstable; urgency=low + + * New upstream release. + * Build-depend on debhelper (>= 3.0.18), in accordance with version 1.19 + of the Perl policy. + + -- Colin Watson Sat, 19 May 2001 15:31:52 +0100 + +libfilter-perl (1.22-1) unstable; urgency=low + + * New upstream release. + * Updated policy version to 3.5.2. + * Install our perlfilter documentation; vendor packages now put podfiles + in a different place to core packages, and while perl-doc installs + perlfilter(1) we happen to install perlfilter(3pm). I've filed a bug + against perl-doc asking for the perlfilter documentation to be removed + from there, as otherwise man will show perlfilter(1) in preference. + + -- Colin Watson Sun, 4 Mar 2001 17:59:08 +0000 + +libfilter-perl (1.20-2) unstable; urgency=low + + * Update to new Perl policy. + * Suggest libcompress-zlib-perl for the benefit of the filtdef example. + + -- Colin Watson Thu, 15 Feb 2001 12:01:29 +0000 + +libfilter-perl (1.20-1) unstable; urgency=low + + * Uploaded to Debian (closes: #85155, #85343). + * New maintainer address. + * New upstream release. + * Updated policy version to 3.5.0. + * Fixed debian/watch. + + -- Colin Watson Fri, 9 Feb 2001 21:26:49 +0000 + +libfilter-perl (1.19-1) unstable; urgency=low + + * Initial Release. + + -- Colin Watson Wed, 27 Dec 2000 21:42:32 +0000 diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/debian/compat b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/compat @@ -0,0 +1 @@ +4 diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/debian/control b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/control new file mode 100644 index 0000000..1f59d10 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/control @@ -0,0 +1,25 @@ +Source: libfilter-perl +Section: perl +Priority: optional +Maintainer: Colin Watson +Build-Depends: debhelper (>= 4.0.0), perl (>= 5.8.0-3) +Standards-Version: 3.7.3 +Homepage: http://www.cpan.org/modules/by-module/Filter/ + +Package: libfilter-perl +Architecture: any +Depends: ${shlibs:Depends}, ${perl:Depends} +Suggests: libcompress-zlib-perl +Description: Perl source filters + Source filters alter the program text of a module before Perl sees it, much + as a C preprocessor alters the source text of a C program before the + compiler sees it. + . + This package contains a number of source filters, including: + . + exec and sh: pipe the source file through an external command + cpp: pipe the source file through the C preprocessor + decrypt: example of simple (though weak!) source obfuscation + tee: copy filtered source to a file (debugging aid) + . + A substantial amount of documentation and examples is also included. diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/debian/copyright b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/copyright new file mode 100644 index 0000000..99bbf3f --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/copyright @@ -0,0 +1,27 @@ +This package was debianized by Colin Watson on +Wed, 27 Dec 2000 21:19:47 +0000. + +It was downloaded from http://www.cpan.org/modules/by-module/Filter/ + +Upstream Author: Paul Marquess + +Copyright: + +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. + +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/deb-src/libfilter-perl/libfilter-perl-1.34/debian/docs b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/docs new file mode 100644 index 0000000..e845566 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/docs @@ -0,0 +1 @@ +README diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/debian/examples b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/examples new file mode 100644 index 0000000..e39721e --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/examples @@ -0,0 +1 @@ +examples/* diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/debian/rules b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/rules new file mode 100755 index 0000000..16c48c5 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/rules @@ -0,0 +1,74 @@ +#!/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 + +tmp = $(CURDIR)/debian/libfilter-perl +config = INSTALLDIRS=vendor INSTALLMAN3DIR=/usr/share/man/man3 +vendorarch = `perl -MConfig -e 'print $$Config{vendorarch}'` + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + perl Makefile.PL $(config) + + touch configure-stamp + +build: configure build-stamp +build-stamp: + dh_testdir + + # Add here commands to compile the package. +ifeq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + $(MAKE) OPTIMIZE="-O2 -g -Wall" +else + $(MAKE) OPTIMIZE="-g -Wall" +endif + + touch build-stamp + +clean: configure + dh_testdir + dh_testroot + + # Add here commands to clean up after the build process. + [ ! -f Makefile ] || $(MAKE) realclean + rm -f Try.pm # for 'make test' + + dh_clean build-stamp configure-stamp + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp. + $(MAKE) install PREFIX=$(tmp)/usr + +# 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_installdocs + dh_installexamples + dh_installchangelogs Changes + dh_strip + dh_compress + dh_fixperms + 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/deb-src/libfilter-perl/libfilter-perl-1.34/debian/watch b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/watch new file mode 100644 index 0000000..132eef8 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Filter/ .*/Filter-v?(\d[\d_.]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip) debian uupdate diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/Makefile.PL b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/Makefile.PL new file mode 100755 index 0000000..49988e2 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/Makefile.PL @@ -0,0 +1,12 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Filter::decrypt', + VERSION_FROM => 'decrypt.pm', + + # The line below disables both the dynamic link test and the + # test for DEBUGGING. + # It is only enabled here to allow the decrypt test harness + # to run without having to build statically. + DEFINE => "-DBYPASS", +); diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decr b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decr new file mode 100644 index 0000000..592414e --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decr @@ -0,0 +1,70 @@ +#!/usr/local/bin/perl + +# This script will decrypt a Perl script that has been encrypted using the +# "encrypt" script. It cannot decrypt any other kind of encrypted Perl script. +# +# Usage is decr file... +# + +use strict; +use warnings; + +use vars qw($XOR $BLOCKSIZE $HEADERSIZE $CRYPT_MAGIC_1 $CRYPT_MAGIC_2 + $size $mode $line $Fingerprint $file $block $sharp_bang $f + ) ; +$XOR = 'Perl' ; +$BLOCKSIZE = length $XOR ; +$HEADERSIZE = 2 ; +$CRYPT_MAGIC_1 = 0xff ; +$CRYPT_MAGIC_2 = 0x00 ; +my $Version = 1 ; +my $module_name = 'Filter::decrypt' ; + +my $Fingerprint = pack ("C*", $CRYPT_MAGIC_1, $CRYPT_MAGIC_2) ; + +die "Usage: decrypt file...\n" + unless @ARGV ; + + +# Loop through each file in turn. +foreach $file (@ARGV) +{ + if (! -f $file) + { + print "Skipping directory $file\n" if -d $file ; + #print "Skipping strange file $file\n" if ! -d $file ; + next ; + } + + open (F, "<$file") || die "Cannot open $file: $!\n" ; + + # skip the #! line + $a = ; + if ($a =~ /^#!/) + { + $sharp_bang = $a ; + $a = ; + } + + # skip "use decrypt;" line + die "No use $module_name in $file\n" + unless $a =~ /use\s+$module_name\s*;/ ; + + read(F, $f, length($Fingerprint)) || die "Cannot read from $file: $!\n" ; + (print "skipping file '$file': not encrypted\n"), next + unless $f eq $Fingerprint ; + + print "decrypting $file to $file.pd\n" ; + open (O, ">${file}.pd") || die "Cannot open ${file}.pd: $!\n" ; + print O $sharp_bang if $sharp_bang ; + while ($size = read(F, $block, $BLOCKSIZE) ) + { + print O ($block ^ substr($XOR, 0, $size)) ; + } + + + close F ; + close O ; + +} + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.pm new file mode 100644 index 0000000..c0d1acb --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.pm @@ -0,0 +1,115 @@ +package Filter::decrypt ; + +require 5.002 ; +require DynaLoader; +use strict; +use warnings; +use vars qw(@ISA $VERSION); +@ISA = qw(DynaLoader); +$VERSION = "1.05" ; + +bootstrap Filter::decrypt ; +1; +__END__ + +=head1 NAME + +Filter::decrypt - template for a decrypt source filter + +=head1 SYNOPSIS + + use Filter::decrypt ; + +=head1 DESCRIPTION + +This is a sample decrypting source filter. + +Although this is a fully functional source filter and it does implement +a I simple decrypt algorithm, it is I intended to be used as +it is supplied. Consider it to be a template which you can combine with +a proper decryption algorithm to develop your own decryption filter. + +=head1 WARNING + +It is important to note that a decryption filter can I provide +complete security against attack. At some point the parser within Perl +needs to be able to scan the original decrypted source. That means that +at some stage fragments of the source will exist in a memory buffer. + +Also, with the introduction of the Perl Compiler backend modules, and +the B::Deparse module in particular, using a Source Filter to hide source +code is becoming an increasingly futile exercise. + +The best you can hope to achieve by decrypting your Perl source using a +source filter is to make it unavailable to the casual user. + +Given that proviso, there are a number of things you can do to make +life more difficult for the prospective cracker. + +=over 5 + +=item 1. + +Strip the Perl binary to remove all symbols. + +=item 2. + +Build the decrypt extension using static linking. If the extension is +provided as a dynamic module, there is nothing to stop someone from +linking it at run time with a modified Perl binary. + +=item 3. + +Do not build Perl with C<-DDEBUGGING>. If you do then your source can +be retrieved with the C<-Dp> command line option. + +The sample filter contains logic to detect the C option. + +=item 4. + +Do not build Perl with C debugging support enabled. + +=item 5. + +Do not implement the decryption filter as a sub-process (like the cpp +source filter). It is possible to peek into the pipe that connects to +the sub-process. + +=item 6. + +Check that the Perl Compiler isn't being used. + +There is code in the BOOT: section of decrypt.xs that shows how to detect +the presence of the Compiler. Make sure you include it in your module. + +Assuming you haven't taken any steps to spot when the compiler is in +use and you have an encrypted Perl script called "myscript.pl", you can +get access the source code inside it using the perl Compiler backend, +like this + + perl -MO=Deparse myscript.pl + +Note that even if you have included the BOOT: test, it is still +possible to use the Deparse module to get the source code for individual +subroutines. + +=item 7. + +Do not use the decrypt filter as-is. The algorithm used in this filter +has been purposefully left simple. + +=back + +If you feel that the source filtering mechanism is not secure enough +you could try using the unexec/undump method. See the Perl FAQ for +further details. + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +19th December 1995 + +=cut diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.xs b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.xs new file mode 100644 index 0000000..61113be --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/decrypt.xs @@ -0,0 +1,321 @@ +/* + * Filename : decrypt.xs + * + * Author : Paul Marquess + * Date : 20th July 2000 + * Version : 1.05 + * + */ + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include "../Call/ppport.h" + +#ifdef FDEBUG +static int fdebug = 0; +#endif + +/* constants specific to the encryption format */ +#define CRYPT_MAGIC_1 0xff +#define CRYPT_MAGIC_2 0x00 + +#define HEADERSIZE 2 +#define BLOCKSIZE 4 + + +#define SET_LEN(sv,len) \ + do { SvPVX(sv)[len] = '\0'; SvCUR_set(sv, len); } while (0) + + +static unsigned XOR [BLOCKSIZE] = {'P', 'e', 'r', 'l' } ; + + +/* Internal defines */ +#ifdef PERL_FILTER_EXISTS +# define CORE_FILTER_COUNT \ + (PL_parser && PL_parser->rsfp_filters ? av_len(PL_parser->rsfp_filters) : 0) +#else +# define CORE_FILTER_COUNT \ + (PL_rsfp_filters ? av_len(PL_rsfp_filters) : 0) +#endif + +#define FILTER_COUNT(s) IoPAGE(s) +#define FILTER_LINE_NO(s) IoLINES(s) +#define FIRST_TIME(s) IoLINES_LEFT(s) + +#define ENCRYPT_GV(s) IoTOP_GV(s) +#define ENCRYPT_SV(s) ((SV*) ENCRYPT_GV(s)) +#define ENCRYPT_BUFFER(s) SvPVX(ENCRYPT_SV(s)) +#define CLEAR_ENCRYPT_SV(s) SvCUR_set(ENCRYPT_SV(s), 0) + +#define DECRYPT_SV(s) s +#define DECRYPT_BUFFER(s) SvPVX(DECRYPT_SV(s)) +#define CLEAR_DECRYPT_SV(s) SvCUR_set(DECRYPT_SV(s), 0) +#define DECRYPT_BUFFER_LEN(s) SvCUR(DECRYPT_SV(s)) +#define DECRYPT_OFFSET(s) IoPAGE_LEN(s) +#define SET_DECRYPT_BUFFER_LEN(s,n) SvCUR_set(DECRYPT_SV(s), n) + +static unsigned +Decrypt(SV *in_sv, SV *out_sv) +{ + /* Here is where the actual decryption takes place */ + + unsigned char * in_buffer = (unsigned char *) SvPVX(in_sv) ; + unsigned char * out_buffer ; + unsigned size = SvCUR(in_sv) ; + unsigned index = size ; + int i ; + + /* make certain that the output buffer is big enough */ + /* as the output from the decryption can never be larger than */ + /* the input buffer, make it that size */ + SvGROW(out_sv, size) ; + out_buffer = (unsigned char *) SvPVX(out_sv) ; + + /* XOR */ + for (i = 0 ; i < size ; ++i) + out_buffer[i] = (unsigned char)( XOR[i] ^ in_buffer[i] ) ; + + /* input has been consumed, so set length to 0 */ + SET_LEN(in_sv, 0) ; + + /* set decrypt buffer length */ + SET_LEN(out_sv, index) ; + + /* return the size of the decrypt buffer */ + return (index) ; +} + +static int +ReadBlock(int idx, SV *sv, unsigned size) +{ /* read *exactly* size bytes from the next filter */ + int i = size; + while (1) { + int n = FILTER_READ(idx, sv, i) ; + if (n <= 0 && i==size) /* eof/error when nothing read so far */ + return n ; + if (n <= 0) /* eof/error when something already read */ + return size - i; + if (n == i) + return size ; + i -= n ; + } +} + +static void +preDecrypt(int idx) +{ + /* If the encrypted data starts with a header or needs to do some + initialisation it can be done here + + In this case the encrypted data has to start with a fingerprint, + so that is checked. + */ + + SV * sv = FILTER_DATA(idx) ; + unsigned char * buffer ; + + + /* read the header */ + if (ReadBlock(idx+1, sv, HEADERSIZE) != HEADERSIZE) + croak("truncated file") ; + + buffer = (unsigned char *) SvPVX(sv) ; + + /* check for fingerprint of encrypted data */ + if (buffer[0] != CRYPT_MAGIC_1 || buffer[1] != CRYPT_MAGIC_2) + croak( "bad encryption format" ); +} + +static void +postDecrypt() +{ +} + +static I32 +filter_decrypt(pTHX_ int idx, SV *buf_sv, int maxlen) +{ + SV *my_sv = FILTER_DATA(idx); + char *nl = "\n"; + char *p; + char *out_ptr; + int n; + + /* check if this is the first time through */ + if (FIRST_TIME(my_sv)) { + + /* Mild paranoia mode - make sure that no extra filters have */ + /* been applied on the same line as the use Filter::decrypt */ + if (CORE_FILTER_COUNT > FILTER_COUNT(my_sv) ) + croak("too many filters") ; + + /* As this is the first time through, so deal with any */ + /* initialisation required */ + preDecrypt(idx) ; + + FIRST_TIME(my_sv) = FALSE ; + SET_LEN(DECRYPT_SV(my_sv), 0) ; + SET_LEN(ENCRYPT_SV(my_sv), 0) ; + DECRYPT_OFFSET(my_sv) = 0 ; + } + +#ifdef FDEBUG + if (fdebug) + warn("**** In filter_decrypt - maxlen = %d, len buf = %d idx = %d\n", + maxlen, SvCUR(buf_sv), idx ) ; +#endif + + while (1) { + + /* anything left from last time */ + if ((n = SvCUR(DECRYPT_SV(my_sv)))) { + + out_ptr = SvPVX(DECRYPT_SV(my_sv)) + DECRYPT_OFFSET(my_sv) ; + + if (maxlen) { + /* want a block */ +#ifdef FDEBUG + if (fdebug) + warn("BLOCK(%d): size = %d, maxlen = %d\n", + idx, n, maxlen) ; +#endif + + sv_catpvn(buf_sv, out_ptr, maxlen > n ? n : maxlen ); + if(n <= maxlen) { + DECRYPT_OFFSET(my_sv) = 0 ; + SET_LEN(DECRYPT_SV(my_sv), 0) ; + } + else { + DECRYPT_OFFSET(my_sv) += maxlen ; + SvCUR_set(DECRYPT_SV(my_sv), n - maxlen) ; + } + return SvCUR(buf_sv); + } + else { + /* want lines */ + if ((p = ninstr(out_ptr, out_ptr + n, nl, nl + 1))) { + + sv_catpvn(buf_sv, out_ptr, p - out_ptr + 1); + + n = n - (p - out_ptr + 1); + DECRYPT_OFFSET(my_sv) += (p - out_ptr + 1) ; + SvCUR_set(DECRYPT_SV(my_sv), n) ; +#ifdef FDEBUG + if (fdebug) + warn("recycle %d - leaving %d, returning %d [%.999s]", + idx, n, SvCUR(buf_sv), SvPVX(buf_sv)) ; +#endif + + return SvCUR(buf_sv); + } + else /* no EOL, so append the complete buffer */ + sv_catpvn(buf_sv, out_ptr, n) ; + } + + } + + + SET_LEN(DECRYPT_SV(my_sv), 0) ; + DECRYPT_OFFSET(my_sv) = 0 ; + + /* read from the file into the encrypt buffer */ + if ( (n = ReadBlock(idx+1, ENCRYPT_SV(my_sv), BLOCKSIZE)) <= 0) + { + /* Either EOF or an error */ + +#ifdef FDEBUG + if (fdebug) + warn ("filter_read %d returned %d , returning %d\n", idx, n, + (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n); +#endif + + /* If the decrypt code needs to tidy up on EOF/error, + now is the time - here is a hook */ + postDecrypt() ; + + filter_del(filter_decrypt); + + + /* If error, return the code */ + if (n < 0) + return n ; + + /* return what we have so far else signal eof */ + return (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n; + } + +#ifdef FDEBUG + if (fdebug) + warn(" filter_decrypt(%d): sub-filter returned %d: '%.999s'", + idx, n, SvPV(my_sv,PL_na)); +#endif + + /* Now decrypt a block */ + n = Decrypt(ENCRYPT_SV(my_sv), DECRYPT_SV(my_sv)) ; + +#ifdef FDEBUG + if (fdebug) + warn("Decrypt (%d) returned %d [%.999s]\n", idx, n, SvPVX(DECRYPT_SV(my_sv)) ) ; +#endif + + } +} + + +MODULE = Filter::decrypt PACKAGE = Filter::decrypt + +PROTOTYPES: DISABLE + +BOOT: + /* Check for the presence of the Perl Compiler */ + if (gv_stashpvn("B", 1, FALSE)) + croak("Aborting, Compiler detected") ; +#ifndef BYPASS + /* Don't run if this module is dynamically linked */ + if (!isALPHA(SvPV(GvSV(CvFILEGV(cv)), PL_na)[0])) + croak("module is dynamically linked. Recompile as a static module") ; +#ifdef DEBUGGING + /* Don't run if compiled with DEBUGGING */ + croak("recompile without -DDEBUGGING") ; +#endif + + /* Double check that DEBUGGING hasn't been enabled */ + if (PL_debug) + croak("debugging flags detected") ; +#endif + + +void +import(module) + SV * module + PPCODE: + { + + SV * sv = newSV(BLOCKSIZE) ; + + /* make sure the Perl debugger isn't enabled */ + if( PL_perldb ) + croak("debugger disabled") ; + + filter_add(filter_decrypt, sv) ; + FIRST_TIME(sv) = TRUE ; + + ENCRYPT_GV(sv) = (GV*) newSV(BLOCKSIZE) ; + (void)SvPOK_only(DECRYPT_SV(sv)); + (void)SvPOK_only(ENCRYPT_SV(sv)); + SET_LEN(DECRYPT_SV(sv), 0) ; + SET_LEN(ENCRYPT_SV(sv), 0) ; + + + /* remember how many filters are enabled */ + FILTER_COUNT(sv) = CORE_FILTER_COUNT ; + /* and the line number */ + FILTER_LINE_NO(sv) = PL_curcop->cop_line ; + + } + +void +unimport(...) + PPCODE: + /* filter_del(filter_decrypt); */ diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/encrypt b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/encrypt new file mode 100755 index 0000000..314612a --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/decrypt/encrypt @@ -0,0 +1,71 @@ + +require 5.002 ; + +use strict; +use warnings; + +use vars qw($XOR $BLOCKSIZE $HEADERSIZE $CRYPT_MAGIC_1 $CRYPT_MAGIC_2 + $size $mode $line $Fingerprint $file $block + ) ; + +$XOR = 'Perl' ; +$BLOCKSIZE = length $XOR ; +$HEADERSIZE = 2 ; +$CRYPT_MAGIC_1 = 0xff ; +$CRYPT_MAGIC_2 = 0x00 ; + +$Fingerprint = pack ("C*", $CRYPT_MAGIC_1, $CRYPT_MAGIC_2) ; + +die "Usage: encrypt file...\n" + unless @ARGV ; + +# Loop throught each file in turn. +foreach $file (@ARGV) +{ + + if (! -T $file) + { + print "Skipping directory $file\n" if -d $file ; + print "Skipping non-text $file\n" if ! -d $file ; + next ; + } + + open (F, "<$file") or die "Cannot open $file: $!\n" ; + open (O, ">${file}.pe") or die "Cannot open ${file}.pe: $!\n" ; + binmode O; + + # Get the mode + $mode = (stat F)[2] ; + + # Check for "#!perl" line + $line = ; + + if ( $line =~ /^#!/ ) + { print O $line } + else + { seek F, 0, 0 } + + print O "use Filter::decrypt ;\n" ; + print O $Fingerprint ; + + + $block = ''; + while ($size = read(F, $block, $BLOCKSIZE) ) + { + print O ($block ^ substr($XOR, 0, length $block)) ; + } + + close F ; + close O ; + + unlink ($file) + or die "Could not remove '$file': $!\n" ; + + rename ("${file}.pe", $file) + or die "Could not rename $file.pe to $file: $!\n" ; + + chmod $mode, $file unless $^O eq 'MSWin32' ; + + print "encrypted $file\n" ; +} + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Count.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Count.pm new file mode 100644 index 0000000..2ed8f44 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Count.pm @@ -0,0 +1,32 @@ +package Count ; + +use Filter::Util::Call ; + +use strict ; +use warnings ; + +sub import +{ + my ($self) = @_ ; + my ($count) = 0 ; + filter_add( + sub + { + my ($status) ; + + if (($status = filter_read()) > 0 ) { + s/Joe/Jim/g ; + ++ $count ; + } + elsif ($count >= 0) { # EOF + $_ = "print q[Made $count substitutions\n] ;" ; + $status = 1 ; + $count = -1 ; + } + + $status ; + }) +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Decompress.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Decompress.pm new file mode 100644 index 0000000..b086324 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Decompress.pm @@ -0,0 +1,33 @@ +package Filter::Decompress ; + +use Filter::Util::Call ; +use Compress::Zlib ; +use Carp ; + +use strict ; +use warnings ; + +my $VERSION = '1.01' ; + +sub import +{ + my ($self) = @_ ; + + # Initialise an inflation stream. + my $x = inflateInit() + or croak "Internal Error" ; + filter_add( + sub + { + my ($status, $err) ; + + if (($status = filter_read()) >0) { + ($_, $err) = $x->inflate($_) ; + return -1 unless $err == Z_OK or $err == Z_STREAM_END ; + } + $status ; + }) +} + +1 ; +__END__ diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Include.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Include.pm new file mode 100644 index 0000000..3d27888 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Include.pm @@ -0,0 +1,38 @@ +package Include ; + +use Filter::Util::Call ; +use IO::File ; +use Carp ; + +sub import +{ + my ($self) = shift ; + my ($filename) = shift ; + my $fh = new IO::File "<$filename" + or croak "Cannot open file '$filename': $!" ; + + my $first_time = 1 ; + my ($orig_filename, $orig_line) = (caller)[1,2] ; + ++ $orig_line ; + + filter_add( + sub + { + $_ = <$fh> ; + + if ($first_time) { + $_ = "#line 1 $filename\n$_" ; + $first_time = 0 ; + } + + if ($fh->eof) { + $fh->close ; + $_ .= "#line $orig_line $orig_filename\n" ; + filter_del() ; + } + 1 ; + }) +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Joe2Jim.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Joe2Jim.pm new file mode 100644 index 0000000..acdaa9a --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Joe2Jim.pm @@ -0,0 +1,23 @@ +package Joe2Jim ; + +use Filter::Util::Call ; + +use strict ; +use warnings ; + +sub import +{ + my($type) = @_ ; + + filter_add( + sub + { + my($status) ; + s/Joe/Jim/g + if ($status = filter_read()) > 0 ; + $status ; + }) +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/NewSubst.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/NewSubst.pm new file mode 100644 index 0000000..4144661 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/NewSubst.pm @@ -0,0 +1,37 @@ +package NewSubst ; + +use Filter::Util::Call ; +use Carp ; + +use strict ; +use warnings ; + +sub import +{ + my ($self, $start, $stop, $from, $to) = @_ ; + my ($found) = 0 ; + croak("usage: use Subst qw(start stop from to)") + unless @_ == 5 ; + + filter_add( + sub + { + my ($status) ; + + if (($status = filter_read()) > 0) { + + $found = 1 + if $found == 0 and /$start/ ; + + if ($found) { + s/$from/$to/ ; + filter_del() if /$stop/ ; + } + + } + $status ; + } ) + +} + +1 ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Subst.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Subst.pm new file mode 100644 index 0000000..0754fe3 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/Subst.pm @@ -0,0 +1,24 @@ +package Subst ; + +use Filter::Util::Call ; +use Carp ; + +use strict ; +use warnings ; + +sub import +{ + croak("usage: use Subst qw(from to)") + unless @_ == 3 ; + my ($self, $from, $to) = @_ ; + filter_add( + sub + { + my ($status) ; + s/$from/$to/ + if ($status = filter_read()) > 0 ; + $status ; + }) +} + +1 ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/UUdecode.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/UUdecode.pm new file mode 100644 index 0000000..b74017b --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/closure/UUdecode.pm @@ -0,0 +1,52 @@ + +package Filter::UUdecode ; + +use Filter::Util::Call ; + +use strict ; +use warnings ; + +my $VERSION = '1.00' ; + +sub import +{ + my($self) = @_ ; + my ($count) = 0 ; + + filter_add( + sub + { + my ($status) ; + + while (1) { + + return $status + if ($status = filter_read() ) <= 0; + + chomp ; + ++ $count ; + + # Skip the begin line (if it is there) + ($_ = ''), next if $count == 1 and /^begin/ ; + + # is this the last line? + if ($_ eq " " or length $_ <= 1) { + $_ = '' ; + # If there is an end line, skip it too + return $status + if ($status = filter_read() ) <= 0 ; + $_ = "\n" if /^end/ ; + filter_del() ; + return 1 ; + } + + # uudecode the line + $_ = unpack("u", $_) ; + + # return the uudecoded data + return $status ; + } + }) + +} +1 ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtdef b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtdef new file mode 100755 index 0000000..5128ec9 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtdef @@ -0,0 +1,37 @@ +#!/usr/bin/perl + +use strict ; +use warnings ; + +my ($file, $output, $status) ; + +use Compress::Zlib ; + +die "Usage: mkdef file\n" + unless @ARGV == 1; + +foreach $file (@ARGV) +{ + open (F, "<$file") or die "Cannot open $file: $!\n" ; + my $x = deflateInit() + or die "Cannot create a deflation stream\n" ; + + print "use Filter::Decompress;\n" ; + while () + { + ($output, $status) = $x->deflate($_) ; + + $status == Z_OK + or die "deflation failed\n" ; + + print $output ; + } + + ($output, $status) = $x->flush() ; + + $status == Z_OK + or die "deflation failed\n" ; + + print $output ; + close F ; +} diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtuu b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtuu new file mode 100755 index 0000000..dfebfc5 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/filtuu @@ -0,0 +1,6 @@ +#!/usr/bin/perl + +print "use Filter::UUdecode ;\n" ; +while (<>) { + print pack("u", $_) ; +} diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Count.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Count.pm new file mode 100644 index 0000000..c4491a6 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Count.pm @@ -0,0 +1,34 @@ +package Count ; + +use Filter::Util::Call ; + +use strict ; +use warnings ; + +sub filter +{ + my ($self) = @_ ; + my ($status) ; + + if (($status = filter_read()) > 0 ) { + s/Joe/Jim/g ; + ++ $$self ; + } + elsif ($$self >= 0) { # EOF + $_ = "print q[Made ${$self} substitutions\n] ;" ; + $status = 1 ; + $$self = -1 ; + } + + $status ; +} + +sub import +{ + my ($self) = @_ ; + my ($count) = 0 ; + filter_add(\$count) ; +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Decompress.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Decompress.pm new file mode 100644 index 0000000..a658853 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Decompress.pm @@ -0,0 +1,36 @@ +package Filter::Decompress ; + +use Filter::Util::Call ; +use Compress::Zlib ; +use Carp ; + +use strict ; +use warnings ; + +my $VERSION = '1.01' ; + +sub filter +{ + my ($self) = @_ ; + my ($status) ; + my ($inf) = $$self ; + + if (($status = filter_read()) >0) { + ($_, $err) = $inf->inflate($_) ; + return -1 unless $err == Z_OK or $err == Z_STREAM_END ; + } + $status ; +} + +sub import +{ + my ($self) = @_ ; + + # Initialise an inflation stream. + my $x = inflateInit() + or croak "Internal Error" ; + filter_add(\$x) ; +} + +1 ; +__END__ diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Joe2Jim.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Joe2Jim.pm new file mode 100644 index 0000000..901bef5 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Joe2Jim.pm @@ -0,0 +1,26 @@ +package Joe2Jim ; + +use Filter::Util::Call ; + +use strict ; +use warnings ; + +sub import +{ + my($type) = @_ ; + + filter_add(bless []) ; +} + +sub filter +{ + my($self) = @_ ; + my($status) ; + + s/Joe/Jim/g + if ($status = filter_read()) > 0 ; + $status ; +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/NewSubst.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/NewSubst.pm new file mode 100644 index 0000000..8eae2e8 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/NewSubst.pm @@ -0,0 +1,43 @@ +package NewSubst ; + +use Filter::Util::Call ; +use Carp ; + +use strict ; +use warnings ; + +sub filter +{ + my ($self) = @_ ; + my ($status) ; + + if (($status = filter_read()) > 0) { + + $self->{Found} = 1 + if $self->{Found} == 0 and /$self->{Start}/ ; + + if ($self->{Found}) { + s/$self->{From}/$self->{To}/ ; + filter_del() if /$self->{Stop}/ ; + } + + } + $status ; +} + +sub import +{ + my ($self, @args) = @_ ; + croak("usage: use Subst qw(start stop from to)") + unless @args == 4 ; + + filter_add( { Start => $args[0], + Stop => $args[1], + From => $args[2], + To => $args[3], + Found => 0 } + ) ; +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Subst.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Subst.pm new file mode 100644 index 0000000..3d10c0b --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/Subst.pm @@ -0,0 +1,30 @@ +package Subst ; + +use Filter::Util::Call ; +use Carp ; + +use strict ; +use warnings ; + +sub filter +{ + my ($self) = @_ ; + my ($status) ; + my ($from) = $self->[0] ; + my ($to) = $self->[1] ; + + s/$from/$to/ + if ($status = filter_read()) > 0 ; + $status ; +} + +sub import +{ + my ($self, @args) = @_ ; + croak("usage: use Subst qw(from to)") + unless @args == 2 ; + filter_add([ @args ]) ; +} + +1 ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/UUdecode.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/UUdecode.pm new file mode 100644 index 0000000..1d8bbbb --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/examples/method/UUdecode.pm @@ -0,0 +1,54 @@ + +package Filter::UUdecode ; + +use Filter::Util::Call ; + +use strict ; +use warnings ; + +my $VERSION = '1.00' ; + +sub import +{ + my($self) = @_ ; + my ($count) = 0 ; + + filter_add( \$count ) ; +} + +sub filter +{ + my ($self) = @_ ; + my ($status) ; + + while (1) { + + return $status + if ($status = filter_read() ) <= 0; + + chomp ; + ++ $$self ; + + # Skip the begin line (if it is there) + ($_ = ''), next if $$self == 1 and /^begin/ ; + + # is this the last line? + if ($_ eq " " or length $_ <= 1) { + $_ = '' ; + # If there is an end line, skip it too + return $status + if ($status = filter_read() ) <= 0 ; + $_ = "\n" if /^end/ ; + filter_del() ; + return 1 ; + } + + # uudecode the line + $_ = unpack("u", $_) ; + + # return the uudecoded data + return $status ; + } +} + +1 ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/filter-util.pl b/deb-src/libfilter-perl/libfilter-perl-1.34/filter-util.pl new file mode 100644 index 0000000..c378f22 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/filter-util.pl @@ -0,0 +1,55 @@ + +use strict ; +use warnings; + +use vars qw( $Perl $Inc); + +sub readFile +{ + my ($filename) = @_ ; + my ($string) = '' ; + + open (F, "<$filename") + or die "Cannot open $filename: $!\n" ; + while () + { $string .= $_ } + close F ; + $string ; +} + +sub writeFile +{ + my($filename, @strings) = @_ ; + open (F, ">$filename") + or die "Cannot open $filename: $!\n" ; + binmode(F) if $filename =~ /bin$/i; + foreach (@strings) + { print F } + close F or die "Could not close: $!" ; +} + +sub ok +{ + my($number, $result, $note) = @_ ; + + $note = "" if ! defined $note ; + if ($note) { + $note = "# $note" if $note !~ /^\s*#/ ; + $note =~ s/^\s*/ / ; + } + + print "not " if !$result ; + print "ok ${number}${note}\n"; +} + +$Inc = '' ; +foreach (@INC) + { $Inc .= "\"-I$_\" " } + +$Perl = '' ; +$Perl = ($ENV{'FULLPERL'} or $^X or 'perl') ; + +$Perl = "$Perl -MMac::err=unix" if $^O eq 'MacOS'; +$Perl = "$Perl -w" ; + +1; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/cpp.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/cpp.pm new file mode 100644 index 0000000..d32b2fd --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/cpp.pm @@ -0,0 +1,126 @@ +package Filter::cpp; + +use Config ; +use Carp ; +use Filter::Util::Exec ; +use strict; +use warnings; +use vars qw($VERSION); + +$VERSION = '1.03' ; + +my $cpp; +my $sep; +if ($^O eq 'MSWin32') { + $cpp = 'cpp.exe' ; + $sep = ';'; +} +else { + ($cpp) = $Config{cppstdin} =~ /^(\S+)/; + $sep = ':'; +} + +croak ("Cannot find cpp\n") + if ! $cpp; + +# Check if cpp is installed +if ( ! -x $cpp) { + my $foundCPP = 0 ; + foreach my $dir (split($sep, $ENV{PATH}), '') + { + if (-x "$dir/$cpp") + { + $foundCPP = 1; + last ; + } + } + + croak "Cannot find cpp\n" + if ! $foundCPP ; +} + +sub import +{ + my($self, @args) = @_ ; + + #require "Filter/exec.pm" ; + + if ($^O eq 'MSWin32') { + Filter::Util::Exec::filter_add ($self, 'cmd', '/c', + "cpp.exe 2>nul") ; + } + else { + Filter::Util::Exec::filter_add ($self, 'sh', '-c', + "$Config{'cppstdin'} $Config{'cppminus'} 2>/dev/null") ; + } +} + +1 ; +__END__ + +=head1 NAME + +Filter::cpp - cpp source filter + +=head1 SYNOPSIS + + use Filter::cpp ; + +=head1 DESCRIPTION + +This source filter pipes the current source file through the C +pre-processor (cpp) if it is available. + +As with all source filters its scope is limited to the current source +file only. Every file you want to be processed by the filter must have a + + use Filter::cpp ; + +near the top. + +Here is an example script which uses the filter: + + use Filter::cpp ; + + #define FRED 1 + $a = 2 + FRED ; + print "a = $a\n" ; + #ifdef FRED + print "Hello FRED\n" ; + #else + print "Where is FRED\n" ; + #endif + +And here is what it will output: + + a = 3 + Hello FRED + +This example below, provided by Michael G Schwern, shows a clever way +to get Perl to use a C pre-processor macro when the Filter::cpp module +is available, or to use a Perl sub when it is not. + + # use Filter::cpp if we can. + BEGIN { eval 'use Filter::cpp' } + + sub PRINT { + my($string) = shift; + + #define PRINT($string) \ + (print $string."\n") + } + + PRINT("Mu"); + +Look at Michael's Tie::VecArray module for a practical use. + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +11th December 1995. + +=cut + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/exec.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/exec.pm new file mode 100644 index 0000000..a46fbef --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/exec.pm @@ -0,0 +1,71 @@ +package Filter::exec ; + +use Carp ; +use Filter::Util::Exec ; +use strict ; +use warnings ; +use vars qw($VERSION) ; + +$VERSION = "1.01" ; + +sub import +{ + my($self, @args) = @_ ; + + croak("Usage: use Filter::exec 'command'") + unless @args ; + + Filter::Util::Exec::filter_add($self, @args) ; +} + +1 ; +__END__ + +=head1 NAME + +Filter::exec - exec source filter + +=head1 SYNOPSIS + + use Filter::exec qw(command parameters) ; + +=head1 DESCRIPTION + +This filter pipes the current source file through the program which +corresponds to the C parameter. + +As with all source filters its scope is limited to the current source +file only. Every file you want to be processed by the filter must have a + + use Filter::exec qw(command ) ; + +near the top. + +Here is an example script which uses the filter: + + use Filter::exec qw(tr XYZ PQR) ; + $a = 1 ; + print "XYZ a = $a\n" ; + +And here is what it will output: + + PQR = 1 + +=head1 WARNING + +You should be I careful when using this filter. Because of the +way the filter is implemented it is possible to end up with deadlock. + +Be especially careful when stacking multiple instances of the filter in +a single source file. + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +11th December 1995. + +=cut + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/sh.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/sh.pm new file mode 100644 index 0000000..e0bd755 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/lib/Filter/sh.pm @@ -0,0 +1,78 @@ +package Filter::sh; + +use Carp ; +use strict ; +use warnings ; +use vars qw($VERSION) ; +$VERSION = "1.01" ; + +use Filter::Util::Exec ; + +sub import +{ + my($self, @args) = @_ ; + + croak ("Usage: use Filter::sh 'command'") + unless @args ; + + #require "Filter/exec.pm" ; + #Filter::exec::import ($self, 'sh', '-c', "@args") ; + if ($^O eq 'MSWin32') { + Filter::Util::Exec::filter_add ($self, 'cmd', '/c', "@args") ; + } + else { + Filter::Util::Exec::filter_add ($self, 'sh', '-c', "@args") ; + } +} + +1 ; +__END__ + +=head1 NAME + +Filter::sh - sh source filter + +=head1 SYNOPSIS + + use Filter::sh 'command' ; + +=head1 DESCRIPTION + +This filter pipes the current source file through the program which +corresponds to the C parameter using the Bourne shell. + +As with all source filters its scope is limited to the current source +file only. Every file you want to be processed by the filter must have a + + use Filter::sh 'command' ; + +near the top. + +Here is an example script which uses the filter: + + use Filter::sh 'tr XYZ PQR' ; + $a = 1 ; + print "XYZ a = $a\n" ; + +And here is what it will output: + + PQR = 1 + +=head1 WARNING + +You should be I careful when using this filter. Because of the +way the filter is implemented it is possible to end up with deadlock. + +Be especially careful when stacking multiple instances of the filter in +a single source file. + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +11th December 1995. + +=cut + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/mytest b/deb-src/libfilter-perl/libfilter-perl-1.34/mytest new file mode 100644 index 0000000..1d6e605 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/mytest @@ -0,0 +1,10 @@ +# You can use this file to play with the filters. +# +# If you type +# +# make mytest +# +# this file will get executed with the same 'environment' as the +# scripts in the t subdirectory. + +print "hello\n" ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/perlfilter.pod b/deb-src/libfilter-perl/libfilter-perl-1.34/perlfilter.pod new file mode 100644 index 0000000..d2d0d37 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/perlfilter.pod @@ -0,0 +1,573 @@ +=head1 NAME + +perlfilter - Source Filters + + +=head1 DESCRIPTION + +This article is about a little-known feature of Perl called +I. Source filters alter the program text of a module +before Perl sees it, much as a C preprocessor alters the source text of +a C program before the compiler sees it. This article tells you more +about what source filters are, how they work, and how to write your +own. + +The original purpose of source filters was to let you encrypt your +program source to prevent casual piracy. This isn't all they can do, as +you'll soon learn. But first, the basics. + +=head1 CONCEPTS + +Before the Perl interpreter can execute a Perl script, it must first +read it from a file into memory for parsing and compilation. (Even +scripts specified on the command line with the C<-e> option are stored in +a temporary file for the parser to process.) If that script itself +includes other scripts with a C or C statement, then each +of those scripts will have to be read from their respective files as +well. + +Now think of each logical connection between the Perl parser and an +individual file as a I. A source stream is created when +the Perl parser opens a file, it continues to exist as the source code +is read into memory, and it is destroyed when Perl is finished parsing +the file. If the parser encounters a C or C statement in +a source stream, a new and distinct stream is created just for that +file. + +The diagram below represents a single source stream, with the flow of +source from a Perl script file on the left into the Perl parser on the +right. This is how Perl normally operates. + + file -------> parser + +There are two important points to remember: + +=over 5 + +=item 1. + +Although there can be any number of source streams in existence at any +given time, only one will be active. + +=item 2. + +Every source stream is associated with only one file. + +=back + +A source filter is a special kind of Perl module that intercepts and +modifies a source stream before it reaches the parser. A source filter +changes the our diagram like this: + + file ----> filter ----> parser + +If that doesn't make much sense, consider the analogy of a command +pipeline. Say you have a shell script stored in the compressed file +I. The simple pipeline command below runs the script without +needing to create a temporary file to hold the uncompressed file. + + gunzip -c trial.gz | sh + +In this case, the data flow from the pipeline can be represented as follows: + + trial.gz ----> gunzip ----> sh + +With source filters, you can store the text of your script compressed and use a source filter to uncompress it for Perl's parser: + + compressed gunzip + Perl program ---> source filter ---> parser + +=head1 USING FILTERS + +So how do you use a source filter in a Perl script? Above, I said that +a source filter is just a special kind of module. Like all Perl +modules, a source filter is invoked with a use statement. + +Say you want to pass your Perl source through the C preprocessor before +execution. You could use the existing C<-P> command line option to do +this, but as it happens, the source filters distribution comes with a C +preprocessor filter module called Filter::cpp. Let's use that instead. + +Below is an example program, C, which makes use of this filter. +Line numbers have been added to allow specific lines to be referenced +easily. + + 1: use Filter::cpp ; + 2: #define TRUE 1 + 3: $a = TRUE ; + 4: print "a = $a\n" ; + +When you execute this script, Perl creates a source stream for the +file. Before the parser processes any of the lines from the file, the +source stream looks like this: + + cpp_test ---------> parser + +Line 1, C, includes and installs the C filter +module. All source filters work this way. The use statement is compiled +and executed at compile time, before any more of the file is read, and +it attaches the cpp filter to the source stream behind the scenes. Now +the data flow looks like this: + + cpp_test ----> cpp filter ----> parser + +As the parser reads the second and subsequent lines from the source +stream, it feeds those lines through the C source filter before +processing them. The C filter simply passes each line through the +real C preprocessor. The output from the C preprocessor is then +inserted back into the source stream by the filter. + + .-> cpp --. + | | + | | + | <-' + cpp_test ----> cpp filter ----> parser + +The parser then sees the following code: + + use Filter::cpp ; + $a = 1 ; + print "a = $a\n" ; + +Let's consider what happens when the filtered code includes another +module with use: + + 1: use Filter::cpp ; + 2: #define TRUE 1 + 3: use Fred ; + 4: $a = TRUE ; + 5: print "a = $a\n" ; + +The C filter does not apply to the text of the Fred module, only +to the text of the file that used it (C). Although the use +statement on line 3 will pass through the cpp filter, the module that +gets included (C) will not. The source streams look like this +after line 3 has been parsed and before line 4 is parsed: + + cpp_test ---> cpp filter ---> parser (INACTIVE) + + Fred.pm ----> parser + +As you can see, a new stream has been created for reading the source +from C. This stream will remain active until all of C +has been parsed. The source stream for C will still exist, +but is inactive. Once the parser has finished reading Fred.pm, the +source stream associated with it will be destroyed. The source stream +for C then becomes active again and the parser reads line 4 +and subsequent lines from C. + +You can use more than one source filter on a single file. Similarly, +you can reuse the same filter in as many files as you like. + +For example, if you have a uuencoded and compressed source file, it is +possible to stack a uudecode filter and an uncompression filter like +this: + + use Filter::uudecode ; use Filter::uncompress ; + M'XL(".H7/;1I;_>_I3=&E=%:F*I"T?22Q/ + M6]9* + ... + +Once the first line has been processed, the flow will look like this: + + file ---> uudecode ---> uncompress ---> parser + filter filter + +Data flows through filters in the same order they appear in the source +file. The uudecode filter appeared before the uncompress filter, so the +source file will be uudecoded before it's uncompressed. + +=head1 WRITING A SOURCE FILTER + +There are three ways to write your own source filter. You can write it +in C, use an external program as a filter, or write the filter in Perl. +I won't cover the first two in any great detail, so I'll get them out +of the way first. Writing the filter in Perl is most convenient, so +I'll devote the most space to it. + +=head1 WRITING A SOURCE FILTER IN C + +The first of the three available techniques is to write the filter +completely in C. The external module you create interfaces directly +with the source filter hooks provided by Perl. + +The advantage of this technique is that you have complete control over +the implementation of your filter. The big disadvantage is the +increased complexity required to write the filter - not only do you +need to understand the source filter hooks, but you also need a +reasonable knowledge of Perl guts. One of the few times it is worth +going to this trouble is when writing a source scrambler. The +C filter (which unscrambles the source before Perl parses it) +included with the source filter distribution is an example of a C +source filter (see Decryption Filters, below). + + +=over 5 + +=item B + +All decryption filters work on the principle of "security through +obscurity." Regardless of how well you write a decryption filter and +how strong your encryption algorithm, anyone determined enough can +retrieve the original source code. The reason is quite simple - once +the decryption filter has decrypted the source back to its original +form, fragments of it will be stored in the computer's memory as Perl +parses it. The source might only be in memory for a short period of +time, but anyone possessing a debugger, skill, and lots of patience can +eventually reconstruct your program. + +That said, there are a number of steps that can be taken to make life +difficult for the potential cracker. The most important: Write your +decryption filter in C and statically link the decryption module into +the Perl binary. For further tips to make life difficult for the +potential cracker, see the file I in the source filters +module. + +=back + +=head1 CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE + +An alternative to writing the filter in C is to create a separate +executable in the language of your choice. The separate executable +reads from standard input, does whatever processing is necessary, and +writes the filtered data to standard output. C is an +example of a source filter implemented as a separate executable - the +executable is the C preprocessor bundled with your C compiler. + +The source filter distribution includes two modules that simplify this +task: C and C. Both allow you to run any +external executable. Both use a coprocess to control the flow of data +into and out of the external executable. (For details on coprocesses, +see Stephens, W.R. "Advanced Programming in the UNIX Environment." +Addison-Wesley, ISBN 0-210-56317-7, pages 441-445.) The difference +between them is that C spawns the external command +directly, while C spawns a shell to execute the external +command. (Unix uses the Bourne shell; NT uses the cmd shell.) Spawning +a shell allows you to make use of the shell metacharacters and +redirection facilities. + +Here is an example script that uses C: + + use Filter::sh 'tr XYZ PQR' ; + $a = 1 ; + print "XYZ a = $a\n" ; + +The output you'll get when the script is executed: + + PQR a = 1 + +Writing a source filter as a separate executable works fine, but a +small performance penalty is incurred. For example, if you execute the +small example above, a separate subprocess will be created to run the +Unix C command. Each use of the filter requires its own subprocess. +If creating subprocesses is expensive on your system, you might want to +consider one of the other options for creating source filters. + +=head1 WRITING A SOURCE FILTER IN PERL + +The easiest and most portable option available for creating your own +source filter is to write it completely in Perl. To distinguish this +from the previous two techniques, I'll call it a Perl source filter. + +To help understand how to write a Perl source filter we need an example +to study. Here is a complete source filter that performs rot13 +decoding. (Rot13 is a very simple encryption scheme used in Usenet +postings to hide the contents of offensive posts. It moves every letter +forward thirteen places, so that A becomes N, B becomes O, and Z +becomes M.) + + + package Rot13 ; + + use Filter::Util::Call ; + + sub import { + my ($type) = @_ ; + my ($ref) = [] ; + filter_add(bless $ref) ; + } + + sub filter { + my ($self) = @_ ; + my ($status) ; + + tr/n-za-mN-ZA-M/a-zA-Z/ + if ($status = filter_read()) > 0 ; + $status ; + } + + 1; + +All Perl source filters are implemented as Perl classes and have the +same basic structure as the example above. + +First, we include the C module, which exports a +number of functions into your filter's namespace. The filter shown +above uses two of these functions, C and +C. + +Next, we create the filter object and associate it with the source +stream by defining the C function. If you know Perl well +enough, you know that C is called automatically every time a +module is included with a use statement. This makes C the ideal +place to both create and install a filter object. + +In the example filter, the object (C<$ref>) is blessed just like any +other Perl object. Our example uses an anonymous array, but this isn't +a requirement. Because this example doesn't need to store any context +information, we could have used a scalar or hash reference just as +well. The next section demonstrates context data. + +The association between the filter object and the source stream is made +with the C function. This takes a filter object as a +parameter (C<$ref> in this case) and installs it in the source stream. + +Finally, there is the code that actually does the filtering. For this +type of Perl source filter, all the filtering is done in a method +called C. (It is also possible to write a Perl source filter +using a closure. See the C manual page for more +details.) It's called every time the Perl parser needs another line of +source to process. The C method, in turn, reads lines from +the source stream using the C function. + +If a line was available from the source stream, C +returns a status value greater than zero and appends the line to C<$_>. +A status value of zero indicates end-of-file, less than zero means an +error. The filter function itself is expected to return its status in +the same way, and put the filtered line it wants written to the source +stream in C<$_>. The use of C<$_> accounts for the brevity of most Perl +source filters. + +In order to make use of the rot13 filter we need some way of encoding +the source file in rot13 format. The script below, C, does +just that. + + die "usage mkrot13 filename\n" unless @ARGV ; + my $in = $ARGV[0] ; + my $out = "$in.tmp" ; + open(IN, "<$in") or die "Cannot open file $in: $!\n"; + open(OUT, ">$out") or die "Cannot open file $out: $!\n"; + + print OUT "use Rot13;\n" ; + while () { + tr/a-zA-Z/n-za-mN-ZA-M/ ; + print OUT ; + } + + close IN; + close OUT; + unlink $in; + rename $out, $in; + +If we encrypt this with C: + + print " hello fred \n" ; + +the result will be this: + + use Rot13; + cevag "uryyb serq\a" ; + +Running it produces this output: + + hello fred + +=head1 USING CONTEXT: THE DEBUG FILTER + +The rot13 example was a trivial example. Here's another demonstration +that shows off a few more features. + +Say you wanted to include a lot of debugging code in your Perl script +during development, but you didn't want it available in the released +product. Source filters offer a solution. In order to keep the example +simple, let's say you wanted the debugging output to be controlled by +an environment variable, C. Debugging code is enabled if the +variable exists, otherwise it is disabled. + +Two special marker lines will bracket debugging code, like this: + + ## DEBUG_BEGIN + if ($year > 1999) { + warn "Debug: millennium bug in year $year\n" ; + } + ## DEBUG_END + +When the C environment variable exists, the filter ensures that +Perl parses only the code between the C and C +markers. That means that when C does exist, the code above +should be passed through the filter unchanged. The marker lines can +also be passed through as-is, because the Perl parser will see them as +comment lines. When C isn't set, we need a way to disable the +debug code. A simple way to achieve that is to convert the lines +between the two markers into comments: + + ## DEBUG_BEGIN + #if ($year > 1999) { + # warn "Debug: millennium bug in year $year\n" ; + #} + ## DEBUG_END + +Here is the complete Debug filter: + + package Debug; + + use strict; + use warnings; + use Filter::Util::Call ; + + use constant TRUE => 1 ; + use constant FALSE => 0 ; + + sub import { + my ($type) = @_ ; + my (%context) = ( + Enabled => defined $ENV{DEBUG}, + InTraceBlock => FALSE, + Filename => (caller)[1], + LineNo => 0, + LastBegin => 0, + ) ; + filter_add(bless \%context) ; + } + + sub Die { + my ($self) = shift ; + my ($message) = shift ; + my ($line_no) = shift || $self->{LastBegin} ; + die "$message at $self->{Filename} line $line_no.\n" + } + + sub filter { + my ($self) = @_ ; + my ($status) ; + $status = filter_read() ; + ++ $self->{LineNo} ; + + # deal with EOF/error first + if ($status <= 0) { + $self->Die("DEBUG_BEGIN has no DEBUG_END") + if $self->{InTraceBlock} ; + return $status ; + } + + if ($self->{InTraceBlock}) { + if (/^\s*##\s*DEBUG_BEGIN/ ) { + $self->Die("Nested DEBUG_BEGIN", $self->{LineNo}) + } elsif (/^\s*##\s*DEBUG_END/) { + $self->{InTraceBlock} = FALSE ; + } + + # comment out the debug lines when the filter is disabled + s/^/#/ if ! $self->{Enabled} ; + } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) { + $self->{InTraceBlock} = TRUE ; + $self->{LastBegin} = $self->{LineNo} ; + } elsif ( /^\s*##\s*DEBUG_END/ ) { + $self->Die("DEBUG_END has no DEBUG_BEGIN", $self->{LineNo}); + } + return $status ; + } + + 1 ; + +The big difference between this filter and the previous example is the +use of context data in the filter object. The filter object is based on +a hash reference, and is used to keep various pieces of context +information between calls to the filter function. All but two of the +hash fields are used for error reporting. The first of those two, +Enabled, is used by the filter to determine whether the debugging code +should be given to the Perl parser. The second, InTraceBlock, is true +when the filter has encountered a C line, but has not yet +encountered the following C line. + +If you ignore all the error checking that most of the code does, the +essence of the filter is as follows: + + sub filter { + my ($self) = @_ ; + my ($status) ; + $status = filter_read() ; + + # deal with EOF/error first + return $status if $status <= 0 ; + if ($self->{InTraceBlock}) { + if (/^\s*##\s*DEBUG_END/) { + $self->{InTraceBlock} = FALSE + } + + # comment out debug lines when the filter is disabled + s/^/#/ if ! $self->{Enabled} ; + } elsif ( /^\s*##\s*DEBUG_BEGIN/ ) { + $self->{InTraceBlock} = TRUE ; + } + return $status ; + } + +Be warned: just as the C-preprocessor doesn't know C, the Debug filter +doesn't know Perl. It can be fooled quite easily: + + print < + +=head1 CONCLUSION + +You now have better understanding of what a source filter is, and you +might even have a possible use for them. If you feel like playing with +source filters but need a bit of inspiration, here are some extra +features you could add to the Debug filter. + +First, an easy one. Rather than having debugging code that is +all-or-nothing, it would be much more useful to be able to control +which specific blocks of debugging code get included. Try extending the +syntax for debug blocks to allow each to be identified. The contents of +the C environment variable can then be used to control which +blocks get included. + +Once you can identify individual blocks, try allowing them to be +nested. That isn't difficult either. + +Here is a interesting idea that doesn't involve the Debug filter. +Currently Perl subroutines have fairly limited support for formal +parameter lists. You can specify the number of parameters and their +type, but you still have to manually take them out of the C<@_> array +yourself. Write a source filter that allows you to have a named +parameter list. Such a filter would turn this: + + sub MySub ($first, $second, @rest) { ... } + +into this: + + sub MySub($$@) { + my ($first) = shift ; + my ($second) = shift ; + my (@rest) = @_ ; + ... + } + +Finally, if you feel like a real challenge, have a go at writing a +full-blown Perl macro preprocessor as a source filter. Borrow the +useful features from the C preprocessor and any other macro processors +you know. The tricky bit will be choosing how much knowledge of Perl's +syntax you want your filter to have. + +=head1 REQUIREMENTS + +The Source Filters distribution is available on CPAN, in + + CPAN/modules/by-module/Filter + +=head1 AUTHOR + +Paul Marquess EPaul.Marquess@btinternet.comE + +=head1 Copyrights + +This article originally appeared in The Perl Journal #11, and is +copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and +The Perl Journal. This document may be distributed under the same terms +as Perl itself. diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/t/call.t b/deb-src/libfilter-perl/libfilter-perl-1.34/t/call.t new file mode 100644 index 0000000..02632d8 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/t/call.t @@ -0,0 +1,824 @@ +use strict; +use warnings; + +use vars qw($Inc $Perl); + +require 'filter-util.pl'; + +print "1..32\n" ; + +$Perl = "$Perl -w" ; + +use Cwd ; +my $here = getcwd ; + + +my $filename = "call.tst" ; +my $filename2 = "call2.tst" ; +my $filenamebin = "call.bin" ; +my $module = "MyTest" ; +my $module2 = "MyTest2" ; +my $module3 = "MyTest3" ; +my $module4 = "MyTest4" ; +my $module5 = "MyTest5" ; +my $module6 = "MyTest6" ; +my $nested = "nested" ; +my $block = "block" ; +my $redir = $^O eq 'MacOS' ? "" : "2>&1"; + +# Test error cases +################## + +# no filter function in module +############################### + +writeFile("${module}.pm", <>8) != 0 or (($^O eq 'MSWin32' || $^O eq 'MacOS' || $^O eq 'NetWare' || $^O eq 'mpeix') && $? != 0))) ; +ok(2, $a =~ /^Can't locate object method "filter" via package "MyTest"/) ; + +# no reference parameter in filter_add +###################################### + +writeFile("${module}.pm", <>8) != 0 or (($^O eq 'MSWin32' || $^O eq 'MacOS' || $^O eq 'NetWare' || $^O eq 'mpeix') && $? != 0))) ; +#ok(4, $a =~ /^usage: filter_add\(ref\) at ${module}.pm/) ; +ok(4, $a =~ /^Not enough arguments for Filter::Util::Call::filter_add/) ; + + + + +# non-error cases +################# + + +# a simple filter, using a closure +################# + +writeFile("${module}.pm", < 0) { + s/ABC/DEF/g + } + $status ; + } ) ; +} + +1 ; +EOM + +writeFile($filename, <>8) == 0) ; +ok(6, $a eq < 0) { + s/ABC/DEF/g + } + $status ; +} + + +1 ; +EOM + +writeFile($filename, <>8) == 0) ; +ok(8, $a eq < 0) { + s/XYZ/PQR/g + } + $status ; +} + +1 ; +EOM + +writeFile("${module3}.pm", < 0) { + s/Fred/Joe/g + } + $status ; + } ) ; +} + +1 ; +EOM + +writeFile("${module4}.pm", < 0) { + s/Today/Tomorrow/g + } + $status ; +} + +1 ; +EOM + +writeFile($filename, <>8) == 0) ; +ok(10, $a eq < 0) { + foreach $pattern (@strings) + { s/$pattern/PQR/g } + } + + $status ; + } + ) + +} +1 ; +EOM + + +writeFile($filename, <>8) == 0) ; +ok(12, $a eq < 0) { + foreach $pattern (@$self) + { s/$pattern/PQR/g } + } + + $status ; +} + +1 ; +EOM + + +writeFile($filename, <>8) == 0) ; +ok(14, $a eq < 0) { + chop ; + s/\r$//; + # and now the second line (it will append) + $status = filter_read() ; + } + + $status ; +} + +1 ; +EOM + + +writeFile($filename, <>8) == 0) ; +ok(16, $a eq <>8) == 0) ; +ok(18, $a eq < 0) { + s/DIR/$here/g + } + $status ; +} + +1 ; +EOM + +writeFile($filename, <>8) == 0) ; +ok(20, $a eq < 0 ; + + -- $$self ; + filter_del() if $$self <= 0 ; + + $status ; +} + +1 ; +EOM + +writeFile($filename, <>8) == 0) ; +ok(22, $a eq < 0) { + s/HERE/THERE/g + } + + $status ; +} + +1 ; +EOM + +writeFile($filenamebin, <>8) == 0) ; +ok(24, $a eq < 0) { + s/HERE/THERE/g + } + + $status ; +} + +1 ; +EOM + +writeFile($filename, <; +print @a; +__DATA__ +HERE I am +I'm HERE +HERE today gone tomorrow +EOM + +$a = `$Perl "-I." $Inc $filename $redir` ; +ok(25, ($? >>8) == 0) ; +ok(26, $a eq < 0) { + s/HERE/THERE/g + } + + $status ; +} + +1 ; +EOM + +writeFile($filename, <; +print @a; +__END__ +HERE I am +I'm HERE +HERE today gone tomorrow +EOM + +$a = `$Perl "-I." $Inc $filename $redir` ; +ok(27, ($? >>8) == 0) ; +ok(28, $a eq < +#################### + +writeFile("${module6}.pm", <>8) == 0); +chomp( $a ) if $^O eq 'VMS'; +ok(30, $a eq 'ok'); + +$a = `$Perl "-I." $Inc $filename2`; +ok(31, ($? >>8) == 0); +chomp( $a ) if $^O eq 'VMS'; +ok(32, $a eq 'ok'); + +} + +END { + 1 while unlink $filename ; + 1 while unlink $filename2 ; + 1 while unlink $filenamebin ; + 1 while unlink "${module}.pm" ; + 1 while unlink "${module2}.pm" ; + 1 while unlink "${module3}.pm" ; + 1 while unlink "${module4}.pm" ; + 1 while unlink "${module5}.pm" ; + 1 while unlink "${module6}.pm" ; + 1 while unlink $nested ; + 1 while unlink "${block}.pm" ; +} + + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/t/cpp.t b/deb-src/libfilter-perl/libfilter-perl-1.34/t/cpp.t new file mode 100644 index 0000000..6ad0a62 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/t/cpp.t @@ -0,0 +1,84 @@ + +use strict; +use warnings; +use Config; + +BEGIN +{ + my $cpp; + my $sep; + if ($^O eq 'MSWin32') { + $cpp = 'cpp.exe' ; + $sep = ';'; + } + else { + ($cpp) = $Config{cppstdin} =~ /^(\S+)/; + $sep = ':'; + } + + if (! $cpp) { + print "1..0 # Skipping cpp not found on this system.\n" ; + exit 0 ; + } + + # Check if cpp is installed + if ( ! -x $cpp) { + my $foundCPP = 0 ; + foreach my $dir (split($sep, $ENV{PATH}), '') + { + if (-x "$dir/$cpp") + { + $foundCPP = 1; + last ; + } + } + + if (! $foundCPP) { + print "1..0 # Skipping cpp not found on this system.\n" ; + exit 0 ; + } + } +} + +use vars qw( $Inc $Perl ) ; + +require "./filter-util.pl" ; + +my $script = <<'EOF' ; +use Filter::cpp ; +#define FRED 1 +#define JOE + +#a perl comment, not a cpp line + +$a = FRED + 2 ; +print "a = $a\n" ; + +require "./fred" ; + +#ifdef JOE + print "Hello Joe\n" ; +#else + print "Where is Joe?\n" ; +#endif +EOF + +my $cpp_script = 'cpp.script' ; +writeFile($cpp_script, $script) ; +writeFile('fred', 'print "This is FRED, not JOE\n" ; 1 ;') ; + +my $expected_output = <<'EOM' ; +a = 3 +This is FRED, not JOE +Hello Joe +EOM + +$a = `$Perl $Inc $cpp_script 2>&1` ; + +print "1..2\n" ; +ok(1, ($? >>8) == 0) ; +#print "|$a| vs |$expected_output|\n"; +ok(2, $a eq $expected_output) ; + +unlink $cpp_script ; +unlink 'fred' ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/t/decrypt.t b/deb-src/libfilter-perl/libfilter-perl-1.34/t/decrypt.t new file mode 100644 index 0000000..a283ab4 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/t/decrypt.t @@ -0,0 +1,111 @@ + +use strict; +use warnings; + +require "filter-util.pl" ; +use Cwd ; +my $here = getcwd ; + +use vars qw( $Inc $Perl ) ; + +my $script = <<'EOM' ; + +print "testing, testing, 1, 2, 3\n" ; +require "./plain" ; +use Cwd ; +$cwd = getcwd ; +print <&1` ; + +print "1..6\n" ; + +print "# running perl with $Perl\n"; +print "# test 1: \$? $?\n" unless ($? >>8) == 0 ; + +ok(1, ($? >>8) == 0) ; +print "# test 2: Got '$a'\n" unless $a eq $expected_output ; +ok(2, $a eq $expected_output) ; + +# try to catch error cases + +# case 1 - Perl debugger +$ENV{'PERLDB_OPTS'} = 'noTTY' ; +$a = `$Perl $Inc -d $filename 2>&1` ; +print "# test 3: Got '$a'\n" unless $a =~ /debugger disabled/ ; +ok(3, $a =~ /debugger disabled/) ; + +# case 2 - Perl Compiler in use +$a = `$Perl $Inc -MCarp -MO=Deparse $filename 2>&1` ; +#print "[[$a]]\n" ; +my $skip = "" ; +$skip = "# skipped -- compiler not available" + if $a =~ /^Can't locate O\.pm in/ || + $a =~ /^Can't load '/ || + $a =~ /^"my" variable \$len masks/ ; +print "# test 4: Got '$a'\n" unless $skip || $a =~ /Aborting, Compiler detected/; +ok(4, ($skip || $a =~ /Aborting, Compiler detected/), $skip) ; + +# case 3 - unknown encryption +writeFile($filename, <&1` ; + +print "# test 5: Got '$a'\n" unless $a =~ /bad encryption format/ ; +ok(5, $a =~ /bad encryption format/) ; + +# case 4 - extra source filter on the same line +writeFile($filename, <&1` ; +print "# test 6: Got '$a'\n" unless $a =~ /too many filters/ ; +ok(6, $a =~ /too many filters/) ; + +unlink $filename ; +unlink 'plain' ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/t/exec.t b/deb-src/libfilter-perl/libfilter-perl-1.34/t/exec.t new file mode 100644 index 0000000..01be7c1 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/t/exec.t @@ -0,0 +1,75 @@ + +use strict; +use warnings; +use Config; + +BEGIN +{ + my $foundTR = 0 ; + if ($^O eq 'MSWin32') { + # Check if tr is installed + foreach (split ";", $ENV{PATH}) { + if (-e "$_/tr.exe") { + $foundTR = 1; + last ; + } + } + } + else { + $foundTR = 1 + if $Config{'tr'} ne '' ; + } + + if (! $foundTR) { + print "1..0 # Skipping tr not found on this system.\n" ; + exit 0 ; + } +} + +require "filter-util.pl" ; + +use vars qw( $Inc $Perl $script ) ; + +$script = <<'EOF' ; + +use Filter::exec qw(tr '[A-E][I-M]' '[a-e][i-m]') ; +use Filter::exec qw(tr '[N-Z]' '[n-z]') ; + +EOF + +$script .= <<'EOF' ; + +$A = 2 ; +PRINT "A = $A\N" ; + +PRINT "HELLO JOE\N" ; +PRINT <&1` ; + +print "1..2\n" ; +ok(1, ($? >> 8) == 0) ; +ok(2, $a eq $expected_output) ; + +unlink $filename ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/t/order.t b/deb-src/libfilter-perl/libfilter-perl-1.34/t/order.t new file mode 100644 index 0000000..846cdeb --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/t/order.t @@ -0,0 +1,70 @@ + +# check that the filters are destroyed in the correct order by +# installing two different types of filter. If they don't get destroyed +# in the correct order we should get a "filter_del can only delete in +# reverse order" error + +# skip this set of tests is running on anything less than 5.004_55 +if ($] < 5.004_55) { + print "1..0\n"; + exit 0; +} + +use strict; +use warnings; + +require "./filter-util.pl" ; + +use vars qw( $Inc $Perl) ; + +my $file = "tee.test" ; +my $module = "Try"; +my $tee1 = "tee1" ; + + +writeFile("${module}.pm", < 0) { + s/ABC/DEF/g + } + $status ; + } ) ; +} + +1 ; +EOM + +my $fil1 = <<"EOM"; +use $module ; + +print "ABC ABC\n" ; + +EOM + +writeFile($file, <<"EOM", $fil1) ; +use Filter::tee '>$tee1' ; +EOM + +my $a = `$Perl $Inc $file 2>&1` ; + +print "1..3\n" ; + +ok(1, ($? >> 8) == 0) ; +#print "|$a|\n"; +ok(2, $a eq <&1` ; + +print "1..2\n" ; +ok(1, ($? >> 8) == 0) ; +ok(2, $a eq $expected_output) ; + +unlink $filename ; + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/t/tee.t b/deb-src/libfilter-perl/libfilter-perl-1.34/t/tee.t new file mode 100644 index 0000000..2f8b25b --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/t/tee.t @@ -0,0 +1,76 @@ + +use strict; +use warnings; + +require "./filter-util.pl" ; + +use vars qw( $Inc $Perl $tee1) ; + +my $file = "tee.test" ; +$tee1 = "tee1" ; +my $tee2 = "tee2" ; + + +my $out1 = <<"EOF" ; +use Filter::tee '>$tee1' ; +EOF + +my $out2 = <<"EOF" ; +use Filter::tee '>>$tee2' ; +EOF + +my $out3 = <<'EOF' ; + +$a = 1 ; +print "a = $a\n" ; + +use Carp ; +require "./joe" ; + +print <&1` ; + +print "1..5\n" ; + +ok(1, ($? >> 8) == 0) ; +ok(2, $a eq <&1` ; + + ok(5, $a =~ /cannot open file 'tee1':/) ; +} + +unlink $file or die "Cannot remove $file: $!\n" ; +unlink 'joe' or die "Cannot remove joe: $!\n" ; +unlink $tee1 or die "Cannot remove $tee1: $!\n" ; +unlink $tee2 or die "Cannot remove $tee2: $!\n" ; diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/tee/Makefile.PL b/deb-src/libfilter-perl/libfilter-perl-1.34/tee/Makefile.PL new file mode 100755 index 0000000..d6bc234 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/tee/Makefile.PL @@ -0,0 +1,7 @@ +use ExtUtils::MakeMaker; + + +WriteMakefile( + NAME => 'Filter::tee', + VERSION_FROM => 'tee.pm', +); diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.pm b/deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.pm new file mode 100644 index 0000000..7d73812 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.pm @@ -0,0 +1,50 @@ +package Filter::tee ; + +require 5.002; +require DynaLoader; +use strict; +use warnings; +use vars qw( @ISA $VERSION); +@ISA = qw(DynaLoader); +$VERSION = "1.02" ; + +bootstrap Filter::tee ; + +1; +__END__ + +=head1 NAME + +Filter::tee - tee source filter + +=head1 SYNOPSIS + + use Filter::tee 'filename' ; + use Filter::tee '>filename' ; + use Filter::tee '>>filename' ; + +=head1 DESCRIPTION + +This filter copies all text from the line after the C in the +current source file to the file specified by the parameter +C. + +By default and when the filename is prefixed with a '>' the output file +will be emptied first if it already exists. + +If the output filename is prefixed with '>>' it will be opened for +appending. + +This filter is useful as a debugging aid when developing other source +filters. + +=head1 AUTHOR + +Paul Marquess + +=head1 DATE + +20th June 1995. + +=cut + diff --git a/deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.xs b/deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.xs new file mode 100644 index 0000000..0d1b347 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl-1.34/tee/tee.xs @@ -0,0 +1,63 @@ +/* + * Filename : tee.xs + * + * Author : Paul Marquess + * Date : 26th March 2000 + * Version : 1.01 + * + */ + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#include "../Call/ppport.h" + +static I32 +filter_tee(pTHX_ int idx, SV *buf_sv, int maxlen) +{ + I32 len; + PerlIO * fil = (PerlIO*) SvIV(FILTER_DATA(idx)) ; + int old_len = SvCUR(buf_sv) ; + + if ( (len = FILTER_READ(idx+1, buf_sv, maxlen)) <=0 ) { + /* error or eof */ + PerlIO_close(fil) ; + filter_del(filter_tee); /* remove me from filter stack */ + return len; + } + + /* write to the tee'd file */ + PerlIO_write(fil, SvPVX(buf_sv) + old_len, len - old_len) ; + + return SvCUR(buf_sv); +} + +MODULE = Filter::tee PACKAGE = Filter::tee + +PROTOTYPES: DISABLE + +void +import(module, filename) + SV * module = NO_INIT + char * filename + CODE: + SV * stream = newSViv(0) ; + PerlIO * fil ; + char * mode = "wb" ; + + filter_add(filter_tee, stream); + /* check for append */ + if (*filename == '>') { + ++ filename ; + if (*filename == '>') { + ++ filename ; + mode = "ab" ; + } + } + if ((fil = PerlIO_open(filename, mode)) == NULL) + croak("Filter::tee - cannot open file '%s': %s", + filename, Strerror(errno)) ; + + /* save the tee'd file handle */ + SvIV_set(stream, (IV)fil) ; + diff --git a/deb-src/libfilter-perl/libfilter-perl_1.34-1.diff.gz b/deb-src/libfilter-perl/libfilter-perl_1.34-1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..043aeda04f4df6fa7dfdd19138740ffa8cc36d62 GIT binary patch literal 3714 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 +Homepage: http://www.cpan.org/modules/by-module/Filter/ +Standards-Version: 3.7.3 +Build-Depends: debhelper (>= 4.0.0), perl (>= 5.8.0-3) +Files: + 49606303d20b90f07d697220272bf59a 40756 libfilter-perl_1.34.orig.tar.gz + 4ec7cbfd940c73269ea3f95631a273c1 3714 libfilter-perl_1.34-1.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.6 (GNU/Linux) +Comment: Colin Watson -- Debian developer + +iD8DBQFHvUJo9t0zAhD6TNERAuJaAJ4pRsyefu55LOYBwjVGjhxw7L1+PACcCAPY +YzF09Hf9s9fFieGiEoJqmlk= +=QGNe +-----END PGP SIGNATURE----- diff --git a/deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1.diff.gz b/deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..06c96d88844fe4a505cad917d752d4de036d50ca GIT binary patch literal 3794 zcmV;@4lVH?iwFRSV8u%U1HD>nSKCMu{fvJ_4dEQ@*cO%_fR&Je1W1?-goQAf*;Q)3>~a#YTGiF{>Z;q-uGj12d%eErry{OLBKGU1(P|rE z>$el&T+uTO)AX7Y;QWjRrMM%j{b1Evn+FVU((+>QSor zhvUExZ5RCeaX6x3nnu>f#&|q7oJjH97=>=ecIZv&>f?qAgAL|$5g}lOJ)*rV9fq+* zr*`Jku^s=Ni6o)t{AlElyS)^lB;r7%23-4s8NABPVa+{J*{P7(?RM(WU~8VML3_SW zk}RQEBqF{Mu8~_W4hJ#h!N-0qu%E(yid`h0(Im{su>;I-J>F%#EEVLXWC!j>7?-M0 z&g)NjBnw;-Q#!M&#%91kQFukYJnUl&PGXdYBvbX&ieg zzl0FXq#yczI8LOxgr6Uhnv~Fr)12f=6f7@1JjT=I?23H-`s9LMi$KJ-Pp4TAD$rZ0 zhLkblkz}Z%j>!*MsBRy~e<(XuwoMxOMA#_ASV=O2=V&wDQ1qgZG3as76TQA5yQZh+W zF-mHZBc~Hzq->mzDcfej5{k`&IoS9;0k=U{!uI=1Cdgz6LvVf?g+W~f0Jg~M)3@vF z8O4aX&+FibWgK$)b>l%<2N}Q_F3UKIsF-bJveA~`X_cya+b6<~o#AZfbHwGF9r_qg z^+WyU=klfd$EAB^{8_DB8s(p@)Q<7{(inXDa%uEFH7h@VN%8rU7gcl;qb!RMEaHLL zG)UvnU!F@9Sy8u+RPG#6=Ll6JdHgpn@%hpp&SFpHj)(nW79k!&vQ21a^_#Qm#rO-Z$@fQ2ARGo^v_Bk1XKC$%3*BXX++H?TYW`lu9 z(nNCRjfBLT)IZ@tFR(8XC-x#`U70Bp=>t+?pbpdd+yL49NA8k5{pI`8CZ!oRUOzuSNJJ{PlK6qFr8rs1?_~Bq_E}9Y+vXR+VuzG$T zm3d;_9NA(NniVej@OSE?+-LCsWn!`eh@i^aQ#ui2Kp#-*XoRulD+qt$!4-f-z!%~Z zJ?F>We|o?GzHxB=f=D7kvrT(Z3?yhasIg@=@y`SjG#d?O1KDmDt^zOtANKB%D$BuN zEPP=nLd87Q={$>~FizFJ?HE|N?D!$-n?+CBo10r5vtlSV7qTYM6ciIbCPuE{0}wAZ zY6iG#(xK=v+})-|*D|-QhK9RR#cwq<>&+z^?z!%_nNdb94st%Z!z=mD6;Yy<*$;#D zl)OQ}*+s;07$*u=uaE3&0V~+LjZFz zVzieVNBYP#n%#P{rZFb+Q4lIu_#x~SQy@6G+VMmoPbZ6Gq%v99?=tzO(Y(v#j}7l8 zor{QV+2QbRHLXT>wuf)AWn*c0Uqq;du9$N?XLi_T1lXQy(bUQvq2jYS^NQ%s%6*Mg zlyFW*=9f5ur{e6e7ogMt^Y4qZ5LFY{R@rpsvu0;|yD?1%x0ulUaTA_rkkK^h7aSsC z!ZvB_FtvO;A5h>#qi3)B)&z&|Em`mO-@C1}2kmUF}fWI{?m65HBolJv}{UU~JJbi#1D^s*B|HJReA(d~qXuo<7%O(xvN6 zg;!FT-7?xno^K0@#FEK(9LCpnERTj##3yFA(b()Tdl+A+RBx-_p>ToSK_R%d(jarzx|I&N;} z8Kp^$7We)n7`jitWf|oR-or6hR?bMFx^07AW}^s+Uk=Fkbywmfp3O$khuz0}s5MR2 zO)^_n+qBx9`>+Ev_@5_hwdXc-Py@j_96B;t-z`|@`;qjmJ8ZM2P<1r_3M&C*>nEWb zP~W%&ge+LTf%lv=1C*W25#~g29*QrHd|Vi?Ss~^0HiBE3fQW7ZhKd`{SKvw>NoIg6 zf2i#DMS1H-T=8-%Q~k-*~Gd-V_vGqr$0W9=$$FS0;4YAKRZ#!!Lf&0J3?|9dk`uavRUSYhe;xd z&$yBNcmPZc7h)YTTR^`S4rceIu7{i<a(bALXMV4nhPSs2r-ti^0NG;Nkk=Qf zd2i@D4xXL77hp)HkTv)i%8#+K~;UnFssws9kbJ^@!!_$^vRoPH0>ml?YgYJ z@q;_9p{WkNkDw{y@kg2IF!m4+-Is%QgyZQ%m)bcAY!{ENj&%qC%T)>zm7O*|4eiF@|(2o2JFNswAQU77hvq z)AD7~4Ahz3?iPCvf4h7d{v{L>dZWUCsV@TV^m2Mjx!DZLG{Zp(HiFxGA*X}TWh*`r zA0=Yme{=Qg!P(1q=Lb6`vq(qL3bM%#t(9M0ob4Z-RdN*<+y6LN^}T^2J~}ynzxVbn z$j^6lGS)-KdnYXn?-al*5)%J!@qH1K@(mGq{3WBJe*8-ErMjSX^*w>LH8u2kM*emE zFBVpbAg>>$AL|IFQB-)R2CPzb#T{Oy$Q`a1k#sAz>%kh0D7-_xBZ|SI5Rg$^f3oTXsBA@3o3K zduH{4vCoa{F%MOP2RMb(5{j*z`KfW|iubR_q~9#J#Im_9<^4@zVD_b*!r=5~CDCmm z{hGH;q&=n4g?j3HA0zH;&95bT>RBbkm16&1J#snA@16O1(A3jm~Fm$3tl0+-C6I7G+gf5+qF%q;&)TtgAsjZ;Pycu z>&m;*y%qW@znM{@xt|i1s-NfkSI56U%fEZ^gbuSno&OL~IqKjT8;ErA;D^29^*u3v z0+ffPoLRns)IAALe=2A4HAkX*bxGD^TgiLIgdp0=XhP*R{&r3U6>9hD8E-RwtiSk- z%4VLv+duz`&+GHztbe5)P%=wR?bs<>qP%*!R_4lh#k0A(uGVO^F!_=<@rilx+xyCD zg;#Th{CY`Y(bk=d7Nk4BI6XMCtf?|(X2$Y-EmgnDOFH@xV>jmRESG5IWbgPuIcDbt zt*bWcdJQiC5YACF^a~CH472mQ&Ds{gPGhSkzibAFvIRrm&HZ2E@9wD^4+kKwy!P)S zHsq?&v# +Architecture: any +Standards-Version: 3.7.3 +Build-Depends: debhelper (>= 4.0.0), perl (>= 5.8.0-3) +Files: + 49606303d20b90f07d697220272bf59a 40756 libfilter-perl_1.34.orig.tar.gz + b9011f11e2d873d4ed358b7b272339bc 3794 libfilter-perl_1.34-1maemo1.diff.gz diff --git a/deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1_armel.changes b/deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1_armel.changes new file mode 100644 index 0000000..23f3dc3 --- /dev/null +++ b/deb-src/libfilter-perl/libfilter-perl_1.34-1maemo1_armel.changes @@ -0,0 +1,20 @@ +Format: 1.7 +Date: Wed, 14 Apr 2010 07:27:21 +0100 +Source: libfilter-perl +Binary: libfilter-perl +Architecture: source armel +Version: 1.34-1maemo1 +Distribution: fremantle +Urgency: low +Maintainer: Colin Watson +Changed-By: Nito Martinez +Description: + libfilter-perl - Perl source filters +Changes: + libfilter-perl (1.34-1maemo1) fremantle; urgency=low + . + * New Maemo packaging +Files: + d955462ed8b935d2552df5eca63e5f14 380 perl optional libfilter-perl_1.34-1maemo1.dsc + b9011f11e2d873d4ed358b7b272339bc 3794 perl optional libfilter-perl_1.34-1maemo1.diff.gz + 8c41866bd43f754328fdf57ad3f89abb 71078 perl optional libfilter-perl_1.34-1maemo1_armel.deb diff --git a/deb-src/libfilter-perl/libfilter-perl_1.34.orig.tar.gz b/deb-src/libfilter-perl/libfilter-perl_1.34.orig.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6b2ea82cda911f9e77af9ebfc9e69d445310d428 GIT binary patch literal 40756 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⪻f;}w`VHC}p)X(Hd1-F~{ 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 +--- +version: 0.11 +date: Tue Mar 2 09:16:30 PST 2004 +changes: +- Add super powers +--- +version: 0.11 +date: Thu Feb 12 21:36:13 CST 2004 +changes: +- Use Exporter to export things diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/MANIFEST b/deb-src/libspiffy-perl/libspiffy-perl-0.30/MANIFEST new file mode 100644 index 0000000..7ce1fc8 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/MANIFEST @@ -0,0 +1,50 @@ +Changes +inc/Module/Install.pm +inc/Module/Install/Base.pm +inc/Module/Install/Can.pm +inc/Module/Install/Fetch.pm +inc/Module/Install/Makefile.pm +inc/Module/Install/Metadata.pm +inc/Module/Install/Win32.pm +inc/Module/Install/WriteAll.pm +lib/Spiffy.pm +Makefile.PL +MANIFEST This list of files +META.yml +README +t/autoload.t +t/base.t +t/base2.t +t/cascade.t +t/const.t +t/early.t +t/export1.t +t/export2.t +t/export3.t +t/export4.t +t/export5.t +t/export6.t +t/export7.t +t/exporter.t +t/field.t +t/field2.t +t/field3.t +t/filter.t +t/filter2.t +t/filter3.t +t/Filter4.pm +t/filter4.t +t/Filter5.pm +t/filter5.t +t/mixin.t +t/mixin2.t +t/mixin3.t +t/new.t +t/NonSpiffy.pm +t/package.t +t/parse.t +t/Something.pm +t/stub.t +t/super.t +t/super2.t +t/Thing.pm diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/META.yml b/deb-src/libspiffy-perl/libspiffy-perl-0.30/META.yml new file mode 100644 index 0000000..e98c083 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/META.yml @@ -0,0 +1,16 @@ + +no_index: + directory: + - inc + - t +generated_by: Module::Install version 0.54 +distribution_type: module +version: 0.25 +name: Spiffy +author: "Ingy d\xC3\xB6t Net " +license: perl +requires: + Scalar::Util: 0 + perl: 5.6.1 + Filter::Util::Call: 0 +abstract: Spiffy Perl Interface Framework For You diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/Makefile.PL b/deb-src/libspiffy-perl/libspiffy-perl-0.30/Makefile.PL new file mode 100644 index 0000000..80ad8e6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/Makefile.PL @@ -0,0 +1,10 @@ +use inc::Module::Install; + +name 'Spiffy'; +all_from 'lib/Spiffy.pm'; + +requires perl => '5.6.1'; +requires Filter::Util::Call => '0'; +requires Scalar::Util => '0'; + +WriteAll; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/README b/deb-src/libspiffy-perl/libspiffy-perl-0.30/README new file mode 100644 index 0000000..f5f80df --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/README @@ -0,0 +1,489 @@ +NAME + Spiffy - Spiffy Perl Interface Framework For You + +SYNOPSIS + package Keen; + use Spiffy -Base; + field 'mirth'; + const mood => ':-)'; + + sub happy { + if ($self->mood eq ':-(') { + $self->mirth(-1); + print "Cheer up!"; + } + super; + } + +DESCRIPTION + "Spiffy" is a framework and methodology for doing object oriented (OO) + programming in Perl. Spiffy combines the best parts of Exporter.pm, + base.pm, mixin.pm and SUPER.pm into one magic foundation class. It + attempts to fix all the nits and warts of traditional Perl OO, in a + clean, straightforward and (perhaps someday) standard way. + + Spiffy borrows ideas from other OO languages like Python, Ruby, Java and + Perl 6. It also adds a few tricks of its own. + + If you take a look on CPAN, there are a ton of OO related modules. When + starting a new project, you need to pick the set of modules that makes + most sense, and then you need to use those modules in each of your + classes. Spiffy, on the other hand, has everything you'll probably need + in one module, and you only need to use it once in one of your classes. + If you make Spiffy.pm the base class of the basest class in your + project, Spiffy will automatically pass all of its magic to all of your + subclasses. You may eventually forget that you're even using it! + + The most striking difference between Spiffy and other Perl object + oriented base classes, is that it has the ability to export things. If + you create a subclass of Spiffy, all the things that Spiffy exports will + automatically be exported by your subclass, in addition to any more + things that you want to export. And if someone creates a subclass of + your subclass, all of those things will be exported automatically, and + so on. Think of it as "Inherited Exportation", and it uses the familiar + Exporter.pm specification syntax. + + To use Spiffy or any subclass of Spiffy as a base class of your class, + you specify the "-base" argument to the "use" command. + + use MySpiffyBaseModule -base; + + You can also use the traditional "use base 'MySpiffyBaseModule';" syntax + and everything will work exactly the same. The only caveat is that + Spiffy.pm must already be loaded. That's because Spiffy rewires base.pm + on the fly to do all the Spiffy magics. + + Spiffy has support for Ruby-like mixins with Perl6-like roles. Just like + "base" you can use either of the following invocations: + + use mixin 'MySpiffyBaseModule'; + use MySpiffyBaseModule -mixin; + + The second version will only work if the class being mixed in is a + subclass of Spiffy. The first version will work in all cases, as long as + Spiffy has already been loaded. + + To limit the methods that get mixed in, use roles. (Hint: they work just + like an Exporter list): + + use MySpiffyBaseModule -mixin => qw(:basics x y !foo); + + In object oriented Perl almost every subroutine is a method. Each method + gets the object passed to it as its first argument. That means + practically every subroutine starts with the line: + + my $self = shift; + + Spiffy provides a simple, optional filter mechanism to insert that line + for you, resulting in cleaner code. If you figure an average method has + 10 lines of code, that's 10% of your code! To turn this option on, you + just use the "-Base" option instead of the "-base" option, or add the + "-selfless" option. If source filtering makes you queazy, don't use the + feature. I personally find it addictive in my quest for writing squeaky + clean, maintainable code. + + A useful feature of Spiffy is that it exports two functions: "field" and + "const" that can be used to declare the attributes of your class, and + automatically generate accessor methods for them. The only difference + between the two functions is that "const" attributes can not be + modified; thus the accessor is much faster. + + One interesting aspect of OO programming is when a method calls the same + method from a parent class. This is generally known as calling a super + method. Perl's facility for doing this is butt ugly: + + sub cleanup { + my $self = shift; + $self->scrub; + $self->SUPER::cleanup(@_); + } + + Spiffy makes it, er, super easy to call super methods. You just use the + "super" function. You don't need to pass it any arguments because it + automatically passes them on for you. Here's the same function with + Spiffy: + + sub cleanup { + $self->scrub; + super; + } + + Spiffy has a special method for parsing arguments called + "parse_arguments", that it also uses for parsing its own arguments. You + declare which arguments are boolean (singletons) and which ones are + paired, with two special methods called "boolean_arguments" and + "paired_arguments". Parse arguments pulls out the booleans and pairs and + returns them in an anonymous hash, followed by a list of the unmatched + arguments. + + Finally, Spiffy can export a few debugging functions "WWW", "XXX", "YYY" + and "ZZZ". Each of them produces a YAML dump of its arguments. WWW warns + the output, XXX dies with the output, YYY prints the output, and ZZZ + confesses the output. If YAML doesn't suit your needs, you can switch + all the dumps to Data::Dumper format with the "-dumper" option. + + That's Spiffy! + +Spiffy EXPORTING + Spiffy implements a completely new idea in Perl. Modules that act both + as object oriented classes and that also export functions. But it takes + the concept of Exporter.pm one step further; it walks the entire @ISA + path of a class and honors the export specifications of each module. + Since Spiffy calls on the Exporter module to do this, you can use all + the fancy interface features that Exporter has, including tags and + negation. + + Spiffy considers all the arguments that don't begin with a dash to + comprise the export specification. + + package Vehicle; + use Spiffy -base; + our $SERIAL_NUMBER = 0; + our @EXPORT = qw($SERIAL_NUMBER); + our @EXPORT_BASE = qw(tire horn); + + package Bicycle; + use Vehicle -base, '!field'; + $self->inflate(tire); + + In this case, "Bicycle-"isa('Vehicle')> and also all the things that + "Vehicle" and "Spiffy" export, will go into "Bicycle", except "field". + + Exporting can be very helpful when you've designed a system with + hundreds of classes, and you want them all to have access to some + functions or constants or variables. Just export them in your main base + class and every subclass will get the functions they need. + + You can do almost everything that Exporter does because Spiffy delegates + the job to Exporter (after adding some Spiffy magic). Spiffy offers a + @EXPORT_BASE variable which is like @EXPORT, but only for usages that + use "-base". + +Spiffy MIXINs & ROLEs + If you've done much OO programming in Perl you've probably used Multiple + Inheritance (MI), and if you've done much MI you've probably run into + weird problems and headaches. Some languages like Ruby, attempt to + resolve MI issues using a technique called mixins. Basically, all Ruby + classes use only Single Inheritance (SI), and then *mixin* functionality + from other modules if they need to. + + Mixins can be thought of at a simplistic level as *importing* the + methods of another class into your subclass. But from an implementation + standpoint that's not the best way to do it. Spiffy does what Ruby does. + It creates an empty anonymous class, imports everything into that class, + and then chains the new class into your SI ISA path. In other words, if + you say: + + package A; + use B -base; + use C -mixin; + use D -mixin; + + You end up with a single inheritance chain of classes like this: + + A << A-D << A-C << B; + + "A-D" and "A-C" are the actual package names of the generated classes. + The nice thing about this style is that mixing in C doesn't clobber any + methods in A, and D doesn't conflict with A or C either. If you mixed in + a method in C that was also in A, you can still get to it by using + "super". + + When Spiffy mixes in C, it pulls in all the methods in C that do not + begin with an underscore. Actually it goes farther than that. If C is a + subclass it will pull in every method that C "can" do through + inheritance. This is very powerful, maybe too powerful. + + To limit what you mixin, Spiffy borrows the concept of Roles from Perl6. + The term role is used more loosely in Spiffy though. It's much like an + import list that the Exporter module uses, and you can use groups (tags) + and negation. If the first element of your list uses negation, Spiffy + will start with all the methods that your mixin class can do. + + use E -mixin => qw(:tools walk !run !:sharp_tools); + + In this example, "walk" and "run" are methods that E can do, and "tools" + and "sharp_tools" are roles of class E. How does class E define these + roles? It very simply defines methods called "_role_tools" and + "_role_sharp_tools" which return lists of more methods. (And possibly + other roles!) The neat thing here is that since roles are just methods, + they too can be inherited. Take that Perl6! + +Spiffy FILTERING + By using the "-Base" flag instead of "-base" you never need to write the + line: + + my $self = shift; + + This statement is added to every subroutine in your class by using a + source filter. The magic is simple and fast, so there is litte + performance penalty for creating clean code on par with Ruby and Python. + + package Example; + use Spiffy -Base; + + sub crazy { + $self->nuts; + } + sub wacky { } + sub new() { + bless [], shift; + } + + is exactly the same as: + + package Example; + use Spiffy -base; + use strict;use warnings; + sub crazy {my $self = shift; + $self->nuts; + } + sub wacky {my $self = shift; } + sub new { + bless [], shift; + } + ;1; + + Note that the empty parens after the subroutine "new" keep it from + having a $self added. Also note that the extra code is added to existing + lines to ensure that line numbers are not altered. + + "-Base" also turns on the strict and warnings pragmas, and adds that + annoying '1;' line to your module. + +PRIVATE METHODS + Spiffy now has support for private methods when you use the '-Base' + filter mechanism. You just declare the subs with the "my" keyword, and + call them with a '$' in front. Like this: + + package Keen; + use SomethingSpiffy -Base; + + # normal public method + sub swell { + $self->$stinky; + } + + # private lexical method. uncallable from outside this file. + my sub stinky { + ... + } + +Spiffy DEBUGGING + The XXX function is very handy for debugging because you can insert it + almost anywhere, and it will dump your data in nice clean YAML. Take the + following statement: + + my @stuff = grep { /keen/ } $self->find($a, $b); + + If you have a problem with this statement, you can debug it in any of + the following ways: + + XXX my @stuff = grep { /keen/ } $self->find($a, $b); + my @stuff = XXX grep { /keen/ } $self->find($a, $b); + my @stuff = grep { /keen/ } XXX $self->find($a, $b); + my @stuff = grep { /keen/ } $self->find(XXX $a, $b); + + XXX is easy to insert and remove. It is also a tradition to mark + uncertain areas of code with XXX. This will make the debugging dumpers + easy to spot if you forget to take them out. + + WWW and YYY are nice because they dump their arguments and then return + the arguments. This way you can insert them into many places and still + have the code run as before. Use ZZZ when you need to die with both a + YAML dump and a full stack trace. + + The debugging functions are exported by default if you use the "-base" + option, but only if you have previously used the "-XXX" option. To + export all 4 functions use the export tag: + + use SomeSpiffyModule ':XXX'; + + To force the debugging functions to use Data::Dumper instead of YAML: + + use SomeSpiffyModule -dumper; + +Spiffy FUNCTIONS + This section describes the functions the Spiffy exports. The "field", + "const", "stub" and "super" functions are only exported when you use the + "-base" or "-Base" options. + + * field + Defines accessor methods for a field of your class: + + package Example; + use Spiffy -Base; + + field 'foo'; + field bar => []; + + sub lalala { + $self->foo(42); + push @{$self->{bar}}, $self->foo; + } + + The first parameter passed to "field" is the name of the attribute + being defined. Accessors can be given an optional default value. + This value will be returned if no value for the field has been set + in the object. + + * const + const bar => 42; + + The "const" function is similar to except that it is + immutable. It also does not store data in the object. You probably + always want to give a "const" a default value, otherwise the + generated method will be somewhat useless. + + * stub + stub 'cigar'; + + The "stub" function generates a method that will die with an + appropriate message. The idea is that subclasses must implement + these methods so that the stub methods don't get called. + + * super + If this function is called without any arguments, it will call the + same method that it is in, higher up in the ISA tree, passing it all + the same arguments. If it is called with arguments, it will use + those arguments with $self in the front. In other words, it just + works like you'd expect. + + sub foo { + super; # Same as $self->SUPER::foo(@_); + super('hello'); # Same as $self->SUPER::foo('hello'); + $self->bar(42); + } + + sub new() { + my $self = super; + $self->init; + return $self; + } + + "super" will simply do nothing if there is no super method. Finally, + "super" does the right thing in AUTOLOAD subroutines. + +Spiffy METHODS + This section lists all of the methods that any subclass of Spiffy + automatically inherits. + + * mixin + A method to mixin a class at runtime. Takes the same arguments as + "use mixin ...". Makes the target class a mixin of the caller. + + $self->mixin('SomeClass'); + $object->mixin('SomeOtherClass' => 'some_method'); + + * parse_arguments + This method takes a list of arguments and groups them into pairs. It + allows for boolean arguments which may or may not have a value + (defaulting to 1). The method returns a hash reference of all the + pairs as keys and values in the hash. Any arguments that cannot be + paired, are returned as a list. Here is an example: + + sub boolean_arguments { qw(-has_spots -is_yummy) } + sub paired_arguments { qw(-name -size) } + my ($pairs, @others) = $self->parse_arguments( + 'red', 'white', + -name => 'Ingy', + -has_spots => + -size => 'large', + 'black', + -is_yummy => 0, + ); + + After this call, $pairs will contain: + + { + -name => 'Ingy', + -has_spots => 1, + -size => 'large', + -is_yummy => 0, + } + + and @others will contain 'red', 'white', and 'black'. + + * boolean_arguments + Returns the list of arguments that are recognized as being boolean. + Override this method to define your own list. + + * paired_arguments + Returns the list of arguments that are recognized as being paired. + Override this method to define your own list. + +Spiffy ARGUMENTS + When you "use" the Spiffy module or a subclass of it, you can pass it a + list of arguments. These arguments are parsed using the + "parse_arguments" method described above. The special argument "-base", + is used to make the current package a subclass of the Spiffy module + being used. + + Any non-paired parameters act like a normal import list; just like those + used with the Exporter module. + +USING Spiffy WITH base.pm + The proper way to use a Spiffy module as a base class is with the + "-base" parameter to the "use" statement. This differs from typical + modules where you would want to "use base". + + package Something; + use Spiffy::Module -base; + use base 'NonSpiffy::Module'; + + Now it may be hard to keep track of what's Spiffy and what is not. + Therefore Spiffy has actually been made to work with base.pm. You can + say: + + package Something; + use base 'Spiffy::Module'; + use base 'NonSpiffy::Module'; + + "use base" is also very useful when your class is not an actual module + (a separate file) but just a package in some file that has already been + loaded. "base" will work whether the class is a module or not, while the + "-base" syntax cannot work that way, since "use" always tries to load a + module. + + base.pm Caveats + To make Spiffy work with base.pm, a dirty trick was played. Spiffy swaps + "base::import" with its own version. If the base modules are not Spiffy, + Spiffy calls the original base::import. If the base modules are Spiffy, + then Spiffy does its own thing. + + There are two caveats. + + * Spiffy must be loaded first. + If Spiffy is not loaded and "use base" is invoked on a Spiffy + module, Spiffy will die with a useful message telling the author to + read this documentation. That's because Spiffy needed to do the + import swap beforehand. + + If you get this error, simply put a statement like this up front in + your code: + + use Spiffy (); + + * No Mixing + "base.pm" can take multiple arguments. And this works with Spiffy as + long as all the base classes are Spiffy, or they are all non-Spiffy. + If they are mixed, Spiffy will die. In this case just use separate + "use base" statements. + +Spiffy TODO LIST + Spiffy is a wonderful way to do OO programming in Perl, but it is still + a work in progress. New things will be added, and things that don't work + well, might be removed. + +AUTHOR + Ingy döt Net + +COPYRIGHT + Copyright (c) 2006. Ingy döt Net. All rights reserved. Copyright (c) + 2004. Brian Ingerson. All rights reserved. + + This program is free software; you can redistribute it and/or modify it + under the same terms as Perl itself. + + See + diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/changelog b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/changelog new file mode 100644 index 0000000..113eb61 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/changelog @@ -0,0 +1,56 @@ +libspiffy-perl (0.30-1maemo1) fremantle; urgency=low + + * New Maemo packaging + + -- Nito Martinez Wed, 14 Apr 2010 07:08:42 +0100 + + +llibspiffy-perl (0.30-1) unstable; urgency=low + + * Take over for the Debian Perl Group with maintainer's permission + (http://lists.debian.org/debian-perl/2008/06/msg00039.html) + * debian/control: Added: Vcs-Svn field (source stanza); Vcs-Browser + field (source stanza); Homepage field (source stanza). Changed: + Maintainer set to Debian Perl Group (was: Florian Ragwitz + ); Florian Ragwitz moved to + Uploaders. + * Add debian/watch. + + * New upstream release. + * debian/copyright: add upstream source location; copy author/copyright + information verbatim from upstream README. + * Add /me to Uploaders. + * Set Standards-Version to 3.8.0 (no changes). + * Set debhelper compatibility level to 5. + * Refresh debian/rules, no functional changes. Don't install README (text + version of the POD documentation). + * Convert broken odieresis chars in manpage (that come from UTF-8 encoded + module) to plain old *roff sequence (closes: #441828). + + -- gregor herrmann Tue, 17 Jun 2008 18:14:05 +0200 + +libspiffy-perl (0.29-1.1) unstable; urgency=low + + * Non-maintainer upload. + * debian/rules: Don't FTBFS when perl is smart enough not to create + empty dirs. (Closes: #467959) + + -- Marc 'HE' Brockschmidt Sat, 05 Apr 2008 19:08:56 +0200 + +libspiffy-perl (0.29-1) unstable; urgency=low + + * New maintainer with acknowledgement from the old maintainer. + * New upstream release (Closes: #328431). + * Cleaned up debian/rules a bit. + * Enabled tests. + * Bumped up Standards-Version. + + -- Florian Ragwitz Tue, 24 Jan 2006 08:37:19 +0100 + +libspiffy-perl (0.21-1) unstable; urgency=low + + * Initial Release. + + -- Nick Phillips Fri, 17 Dec 2004 20:38:09 +1300 + diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/compat b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/compat @@ -0,0 +1 @@ +5 diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/control b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/control new file mode 100644 index 0000000..884fdc0 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/control @@ -0,0 +1,34 @@ +Source: libspiffy-perl +Section: perl +Priority: optional +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl (>= 5.8.0-7) +Maintainer: Debian Perl Group +Uploaders: Florian Ragwitz , + gregor herrmann +Standards-Version: 3.8.0 +Homepage: http://search.cpan.org/dist/Spiffy/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libspiffy-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libspiffy-perl/ + +Package: libspiffy-perl +Architecture: all +Depends: ${perl:Depends}, ${misc:Depends}, libfilter-perl, libscalar-list-utils-perl +Description: Spiffy Perl Interface Framework For You + "Spiffy" is a framework and methodology for doing object oriented (OO) + programming in Perl. Spiffy combines the best parts of Exporter.pm, + base.pm, mixin.pm and SUPER.pm into one magic foundation class. It + attempts to fix all the nits and warts of traditional Perl OO, in a + clean, straightforward and (perhaps someday) standard way. + . + Spiffy borrows ideas from other OO languages like Python, Ruby, + Java and Perl 6. It also adds a few tricks of its own. + . + If you take a look on CPAN, there are a ton of OO related modules. When + starting a new project, you need to pick the set of modules that makes + most sense, and then you need to use those modules in each of your + classes. Spiffy, on the other hand, has everything you'll probably need + in one module, and you only need to use it once in one of your classes. + If you make Spiffy.pm the base class of the basest class in your + project, Spiffy will automatically pass all of its magic to all of your + subclasses. You may eventually forget that you're even using it! diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/copyright b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/copyright new file mode 100644 index 0000000..ed4813f --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/copyright @@ -0,0 +1,20 @@ +This is the debian package for the Spiffy module. +It was created by Nick Phillips with help from +dh-make-perl. + +Upstream source location: http://search.cpan.org/dist/Spiffy/ + +AUTHOR + Ingy döt Net + +COPYRIGHT + Copyright (c) 2006. Ingy döt Net. All rights reserved. Copyright (c) + 2004. Brian Ingerson. 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 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/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/rules b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/rules new file mode 100755 index 0000000..5c7650c --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/rules @@ -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 + $(PERL) Makefile.PL INSTALLDIRS=vendor + $(MAKE) + $(MAKE) test + touch $@ + +clean: + dh_testdir + dh_testroot + dh_clean build-stamp install-stamp + [ ! -f Makefile ] || $(MAKE) realclean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + $(MAKE) install DESTDIR=$(TMP) PREFIX=/usr + + # convert broken *roff from UTF-8 encoded modules + sed -i -e 's/A\\\*~X/\\\[:o\]/' $(TMP)/usr/share/man/man3/Spiffy.3pm + + [ ! -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_installdocs + 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/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/watch b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/watch new file mode 100644 index 0000000..1f7ddbf --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Spiffy/ .+/Spiffy-v?(\d[\d_.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip)$ diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install.pm new file mode 100644 index 0000000..06952de --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install.pm @@ -0,0 +1,222 @@ +#line 1 "/Users/ingy/src/ingy/Spiffy/inc/Module/Install.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install.pm" +package Module::Install; + +use 5.004; +use strict 'vars'; +use vars qw{$VERSION}; +BEGIN { + # Don't forget to update Module::Install::Admin too! + $VERSION = '0.54'; +} + +# inc::Module::Install must be loaded first +unless ( $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'} ) { + die <<"END_DIE"; +Please invoke ${\__PACKAGE__} with: + + use inc::${\__PACKAGE__}; + +not: + + use ${\__PACKAGE__}; + +END_DIE +} + +use Cwd (); +use FindBin; +use File::Find (); +use File::Path (); + +*inc::Module::Install::VERSION = *VERSION; +@inc::Module::Install::ISA = 'Module::Install'; + +sub autoload { + my $self = shift; + my $caller = $self->_caller; + my $cwd = Cwd::cwd(); + my $sym = "$caller\::AUTOLOAD"; + + $sym->{$cwd} = sub { + my $pwd = Cwd::cwd(); + if ( my $code = $sym->{$pwd} ) { + # delegate back to parent dirs + goto &$code unless $cwd eq $pwd; + } + $$sym =~ /([^:]+)$/ or die "Cannot autoload $caller - $sym"; + unshift @_, ($self, $1); + goto &{$self->can('call')} unless uc($1) eq $1; + }; +} + +sub import { + my $class = shift; + my $self = $class->new(@_); + + unless ( -f $self->{file} ) { + require "$self->{path}/$self->{dispatch}.pm"; + File::Path::mkpath("$self->{prefix}/$self->{author}"); + $self->{admin} = + "$self->{name}::$self->{dispatch}"->new(_top => $self); + $self->{admin}->init; + @_ = ($class, _self => $self); + goto &{"$self->{name}::import"}; + } + + *{$self->_caller . "::AUTOLOAD"} = $self->autoload; + $self->preload; + + # Unregister loader and worker packages so subdirs can use them again + delete $INC{"$self->{file}"}; + delete $INC{"$self->{path}.pm"}; +} + +sub preload { + my ($self) = @_; + + unless ( $self->{extentions} ) { + $self->load_extensions( + "$self->{prefix}/$self->{path}", $self + ); + } + + my @exts = @{$self->{extensions}}; + unless ( @exts ) { + my $admin = $self->{admin}; + @exts = $admin->load_all_extensions; + } + + my %seen_method; + foreach my $obj ( @exts ) { + while (my ($method, $glob) = each %{ref($obj) . '::'}) { + next unless defined *{$glob}{CODE}; + next if $method =~ /^_/; + next if $method eq uc($method); + $seen_method{$method}++; + } + } + + my $caller = $self->_caller; + foreach my $name (sort keys %seen_method) { + *{"${caller}::$name"} = sub { + ${"${caller}::AUTOLOAD"} = "${caller}::$name"; + goto &{"${caller}::AUTOLOAD"}; + }; + } +} + +sub new { + my ($class, %args) = @_; + + # ignore the prefix on extension modules built from top level. + my $base_path = Cwd::abs_path($FindBin::Bin); + unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) { + delete $args{prefix}; + } + + return $args{_self} if $args{_self}; + + $args{dispatch} ||= 'Admin'; + $args{prefix} ||= 'inc'; + $args{author} ||= '.author'; + $args{bundle} ||= 'inc/BUNDLES'; + $args{base} ||= $base_path; + + $class =~ s/^\Q$args{prefix}\E:://; + $args{name} ||= $class; + $args{version} ||= $class->VERSION; + + unless ($args{path}) { + $args{path} = $args{name}; + $args{path} =~ s!::!/!g; + } + $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; + + bless(\%args, $class); +} + +sub call { + my $self = shift; + my $method = shift; + my $obj = $self->load($method) or return; + + unshift @_, $obj; + goto &{$obj->can($method)}; +} + +sub load { + my ($self, $method) = @_; + + $self->load_extensions( + "$self->{prefix}/$self->{path}", $self + ) unless $self->{extensions}; + + foreach my $obj (@{$self->{extensions}}) { + return $obj if $obj->can($method); + } + + my $admin = $self->{admin} or die <<"END_DIE"; +The '$method' method does not exist in the '$self->{prefix}' path! +Please remove the '$self->{prefix}' directory and run $0 again to load it. +END_DIE + + my $obj = $admin->load($method, 1); + push @{$self->{extensions}}, $obj; + + $obj; +} + +sub load_extensions { + my ($self, $path, $top_obj) = @_; + + unshift @INC, $self->{prefix} + unless grep { $_ eq $self->{prefix} } @INC; + + local @INC = ($path, @INC); + foreach my $rv ($self->find_extensions($path)) { + my ($file, $pkg) = @{$rv}; + next if $self->{pathnames}{$pkg}; + + local $@; + my $new = eval { require $file; $pkg->can('new') }; + unless ( $new ) { + warn $@ if $@; + next; + } + $self->{pathnames}{$pkg} = delete $INC{$file}; + push @{$self->{extensions}}, &{$new}($pkg, _top => $top_obj ); + } + + $self->{extensions} ||= []; +} + +sub find_extensions { + my ($self, $path) = @_; + + my @found; + File::Find::find( sub { + my $file = $File::Find::name; + return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; + return if $1 eq $self->{dispatch}; + + $file = "$self->{path}/$1.pm"; + my $pkg = "$self->{name}::$1"; $pkg =~ s!/!::!g; + push @found, [ $file, $pkg ]; + }, $path ) if -d $path; + + @found; +} + +sub _caller { + my $depth = 0; + my $caller = caller($depth); + + while ($caller eq __PACKAGE__) { + $depth++; + $caller = caller($depth); + } + + $caller; +} + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Base.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Base.pm new file mode 100644 index 0000000..95a42b6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Base.pm @@ -0,0 +1,63 @@ +#line 1 "inc/Module/Install/Base.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Base.pm" +package Module::Install::Base; + +# Suspend handler for "redefined" warnings +BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w } }; + +#line 30 + +sub new { + my ($class, %args) = @_; + + foreach my $method (qw(call load)) { + *{"$class\::$method"} = sub { + +shift->_top->$method(@_); + } unless defined &{"$class\::$method"}; + } + + bless(\%args, $class); +} + +#line 48 + +sub AUTOLOAD { + my $self = shift; + + local $@; + my $autoload = eval { $self->_top->autoload } or return; + goto &$autoload; +} + +#line 62 + +sub _top { $_[0]->{_top} } + +#line 73 + +sub admin { + my $self = shift; + $self->_top->{admin} or Module::Install::Base::FakeAdmin->new; +} + +sub is_admin { + my $self = shift; + $self->admin->VERSION; +} + +sub DESTROY {} + +package Module::Install::Base::FakeAdmin; + +my $Fake; +sub new { $Fake ||= bless(\@_, $_[0]) } +sub AUTOLOAD {} +sub DESTROY {} + +1; + +# Restore warning handler +BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->() }; + +__END__ + +#line 120 diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Can.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Can.pm new file mode 100644 index 0000000..35ac995 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Can.pm @@ -0,0 +1,69 @@ +#line 1 "inc/Module/Install/Can.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Can.pm" +package Module::Install::Can; +use Module::Install::Base; @ISA = qw(Module::Install::Base); +$VERSION = '0.01'; + +use strict; +use Config (); +use File::Spec (); +use ExtUtils::MakeMaker (); + +# check if we can load some module +sub can_use { + my ($self, $mod, $ver) = @_; + $mod =~ s{::|\\}{/}g; + $mod .= ".pm" unless $mod =~ /\.pm$/i; + + my $pkg = $mod; + $pkg =~ s{/}{::}g; + $pkg =~ s{\.pm$}{}i; + + local $@; + eval { require $mod; $pkg->VERSION($ver || 0); 1 }; +} + +# check if we can run some command +sub can_run { + my ($self, $cmd) = @_; + + my $_cmd = $cmd; + return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); + + for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { + my $abs = File::Spec->catfile($dir, $_[1]); + return $abs if (-x $abs or $abs = MM->maybe_command($abs)); + } + + return; +} + +sub can_cc { + my $self = shift; + my @chunks = split(/ /, $Config::Config{cc}) or return; + + # $Config{cc} may contain args; try to find out the program part + while (@chunks) { + return $self->can_run("@chunks") || (pop(@chunks), next); + } + + return; +} + +# Fix Cygwin bug on maybe_command(); +if ($^O eq 'cygwin') { + require ExtUtils::MM_Cygwin; + require ExtUtils::MM_Win32; + if (!defined(&ExtUtils::MM_Cygwin::maybe_command)) { + *ExtUtils::MM_Cygwin::maybe_command = sub { + my ($self, $file) = @_; + if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { + ExtUtils::MM_Win32->maybe_command($file); + } + else { + ExtUtils::MM_Unix->maybe_command($file); + } + } + } +} + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Fetch.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Fetch.pm new file mode 100644 index 0000000..35478c2 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Fetch.pm @@ -0,0 +1,86 @@ +#line 1 "inc/Module/Install/Fetch.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Fetch.pm" +package Module::Install::Fetch; +use Module::Install::Base; @ISA = qw(Module::Install::Base); + +$VERSION = '0.01'; + +sub get_file { + my ($self, %args) = @_; + my ($scheme, $host, $path, $file) = + $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; + + if ($scheme eq 'http' and !eval { require LWP::Simple; 1 }) { + $args{url} = $args{ftp_url} + or (warn("LWP support unavailable!\n"), return); + ($scheme, $host, $path, $file) = + $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; + } + + $|++; + print "Fetching '$file' from $host... "; + + unless (eval { require Socket; Socket::inet_aton($host) }) { + warn "'$host' resolve failed!\n"; + return; + } + + return unless $scheme eq 'ftp' or $scheme eq 'http'; + + require Cwd; + my $dir = Cwd::getcwd(); + chdir $args{local_dir} or return if exists $args{local_dir}; + + if (eval { require LWP::Simple; 1 }) { + LWP::Simple::mirror($args{url}, $file); + } + elsif (eval { require Net::FTP; 1 }) { eval { + # use Net::FTP to get past firewall + my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); + $ftp->login("anonymous", 'anonymous@example.com'); + $ftp->cwd($path); + $ftp->binary; + $ftp->get($file) or (warn("$!\n"), return); + $ftp->quit; + } } + elsif (my $ftp = $self->can_run('ftp')) { eval { + # no Net::FTP, fallback to ftp.exe + require FileHandle; + my $fh = FileHandle->new; + + local $SIG{CHLD} = 'IGNORE'; + unless ($fh->open("|$ftp -n")) { + warn "Couldn't open ftp: $!\n"; + chdir $dir; return; + } + + my @dialog = split(/\n/, << "."); +open $host +user anonymous anonymous\@example.com +cd $path +binary +get $file $file +quit +. + foreach (@dialog) { $fh->print("$_\n") } + $fh->close; + } } + else { + warn "No working 'ftp' program available!\n"; + chdir $dir; return; + } + + unless (-f $file) { + warn "Fetching failed: $@\n"; + chdir $dir; return; + } + + return if exists $args{size} and -s $file != $args{size}; + system($args{run}) if exists $args{run}; + unlink($file) if $args{remove}; + + print(((!exists $args{check_for} or -e $args{check_for}) + ? "done!" : "failed! ($!)"), "\n"); + chdir $dir; return !$?; +} + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Makefile.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Makefile.pm new file mode 100644 index 0000000..71c928a --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Makefile.pm @@ -0,0 +1,157 @@ +#line 1 "inc/Module/Install/Makefile.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Makefile.pm" +package Module::Install::Makefile; +use Module::Install::Base; @ISA = qw(Module::Install::Base); + +$VERSION = '0.01'; + +use strict 'vars'; +use vars '$VERSION'; + +use ExtUtils::MakeMaker (); + +sub Makefile { $_[0] } + +sub prompt { + shift; + goto &ExtUtils::MakeMaker::prompt; +} + +sub makemaker_args { + my $self = shift; + my $args = ($self->{makemaker_args} ||= {}); + %$args = ( %$args, @_ ) if @_; + $args; +} + +sub build_subdirs { + my $self = shift; + my $subdirs = $self->makemaker_args->{DIR} ||= []; + for my $subdir (@_) { + push @$subdirs, $subdir; + } +} + +sub clean_files { + my $self = shift; + my $clean = $self->makemaker_args->{clean} ||= {}; + %$clean = ( + %$clean, + FILES => join(" ", grep length, $clean->{FILES}, @_), + ); +} + +sub libs { + my $self = shift; + my $libs = ref $_[0] ? shift : [shift]; + $self->makemaker_args( LIBS => $libs ); +} + +sub inc { + my $self = shift; + $self->makemaker_args( INC => shift ); +} + +sub write { + my $self = shift; + die "&Makefile->write() takes no arguments\n" if @_; + + my $args = $self->makemaker_args; + + $args->{DISTNAME} = $self->name; + $args->{NAME} = $self->module_name || $self->name || $self->determine_NAME($args); + $args->{VERSION} = $self->version || $self->determine_VERSION($args); + $args->{NAME} =~ s/-/::/g; + + $args->{test} = {TESTS => $self->tests} if $self->tests; + + if ($] >= 5.005) { + $args->{ABSTRACT} = $self->abstract; + $args->{AUTHOR} = $self->author; + } + if ( eval($ExtUtils::MakeMaker::VERSION) >= 6.10 ) { + $args->{NO_META} = 1; + } + if ( eval($ExtUtils::MakeMaker::VERSION) > 6.17 ) { + $args->{SIGN} = 1 if $self->sign; + } + delete $args->{SIGN} unless $self->is_admin; + + # merge both kinds of requires into prereq_pm + my $prereq = ($args->{PREREQ_PM} ||= {}); + %$prereq = ( %$prereq, map { @$_ } map { @$_ } grep $_, + ($self->build_requires, $self->requires) ); + + # merge both kinds of requires into prereq_pm + my $subdirs = ($args->{DIR} ||= []); + if ($self->bundles) { + foreach my $bundle (@{ $self->bundles }) { + my ($file, $dir) = @$bundle; + push @$subdirs, $dir if -d $dir; + delete $prereq->{$file}; + } + } + + if (my $perl_version = $self->perl_version) { + eval "use $perl_version; 1" + or die "ERROR: perl: Version $] is installed, ". + "but we need version >= $perl_version"; + } + + my %args = map {($_ => $args->{$_})} grep {defined($args->{$_})} keys %$args; + + if ($self->admin->preop) { + $args{dist} = $self->admin->preop; + } + + ExtUtils::MakeMaker::WriteMakefile(%args); + + $self->fix_up_makefile(); +} + +sub fix_up_makefile { + my $self = shift; + my $top_class = ref($self->_top) || ''; + my $top_version = $self->_top->VERSION || ''; + + my $preamble = $self->preamble + ? "# Preamble by $top_class $top_version\n" . $self->preamble + : ''; + my $postamble = "# Postamble by $top_class $top_version\n" . + ($self->postamble || ''); + + local *MAKEFILE; + open MAKEFILE, '< Makefile' or die $!; + my $makefile = do { local $/; }; + close MAKEFILE; + + $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; + $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; + $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; + + $makefile =~ s/^(FULLPERL = .*)/$1 -Iinc/m; + $makefile =~ s/^(PERL = .*)/$1 -Iinc/m; + + open MAKEFILE, '> Makefile' or die $!; + print MAKEFILE "$preamble$makefile$postamble"; + close MAKEFILE; +} + +sub preamble { + my ($self, $text) = @_; + $self->{preamble} = $text . $self->{preamble} if defined $text; + $self->{preamble}; +} + +sub postamble { + my ($self, $text) = @_; + + $self->{postamble} ||= $self->admin->postamble; + $self->{postamble} .= $text if defined $text; + $self->{postamble} +} + +1; + +__END__ + +#line 286 diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Metadata.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Metadata.pm new file mode 100644 index 0000000..3b559d6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Metadata.pm @@ -0,0 +1,301 @@ +#line 1 "inc/Module/Install/Metadata.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Metadata.pm" +package Module::Install::Metadata; + +use strict 'vars'; +use Module::Install::Base; + +use vars qw($VERSION @ISA); +BEGIN { + $VERSION = '0.06'; + @ISA = 'Module::Install::Base'; +} + +my @scalar_keys = qw{ + name module_name abstract author version license + distribution_type perl_version tests +}; + +my @tuple_keys = qw{ + build_requires requires recommends bundles +}; + +sub Meta { shift } +sub Meta_ScalarKeys { @scalar_keys } +sub Meta_TupleKeys { @tuple_keys } + +foreach my $key (@scalar_keys) { + *$key = sub { + my $self = shift; + return $self->{values}{$key} if defined wantarray and !@_; + $self->{values}{$key} = shift; + return $self; + }; +} + +foreach my $key (@tuple_keys) { + *$key = sub { + my $self = shift; + return $self->{values}{$key} unless @_; + + my @rv; + while (@_) { + my $module = shift or last; + my $version = shift || 0; + if ( $module eq 'perl' ) { + $version =~ s{^(\d+)\.(\d+)\.(\d+)} + {$1 + $2/1_000 + $3/1_000_000}e; + $self->perl_version($version); + next; + } + my $rv = [ $module, $version ]; + push @rv, $rv; + } + push @{ $self->{values}{$key} }, @rv; + @rv; + }; +} + +sub sign { + my $self = shift; + return $self->{'values'}{'sign'} if defined wantarray and !@_; + $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 ); + return $self; +} + +sub all_from { + my ( $self, $file ) = @_; + + unless ( defined($file) ) { + my $name = $self->name + or die "all_from called with no args without setting name() first"; + $file = join('/', 'lib', split(/-/, $name)) . '.pm'; + $file =~ s{.*/}{} unless -e $file; + die "all_from: cannot find $file from $name" unless -e $file; + } + + $self->version_from($file) unless $self->version; + $self->perl_version_from($file) unless $self->perl_version; + + # The remaining probes read from POD sections; if the file + # has an accompanying .pod, use that instead + my $pod = $file; + if ( $pod =~ s/\.pm$/.pod/i and -e $pod ) { + $file = $pod; + } + + $self->author_from($file) unless $self->author; + $self->license_from($file) unless $self->license; + $self->abstract_from($file) unless $self->abstract; +} + +sub provides { + my $self = shift; + my $provides = ( $self->{values}{provides} ||= {} ); + %$provides = (%$provides, @_) if @_; + return $provides; +} + +sub auto_provides { + my $self = shift; + return $self unless $self->is_admin; + + unless (-e 'MANIFEST') { + warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; + return $self; + } + + # Avoid spurious warnings as we are not checking manifest here. + + local $SIG{__WARN__} = sub {1}; + require ExtUtils::Manifest; + local *ExtUtils::Manifest::manicheck = sub { return }; + + require Module::Build; + my $build = Module::Build->new( + dist_name => $self->{name}, + dist_version => $self->{version}, + license => $self->{license}, + ); + $self->provides(%{ $build->find_dist_packages || {} }); +} + +sub feature { + my $self = shift; + my $name = shift; + my $features = ( $self->{values}{features} ||= [] ); + + my $mods; + + if ( @_ == 1 and ref( $_[0] ) ) { + # The user used ->feature like ->features by passing in the second + # argument as a reference. Accomodate for that. + $mods = $_[0]; + } + else { + $mods = \@_; + } + + my $count = 0; + push @$features, ( + $name => [ + map { + ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ + : @$_ + : $_ + } @$mods + ] + ); + + return @$features; +} + +sub features { + my $self = shift; + while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { + $self->feature( $name, @$mods ); + } + return @{ $self->{values}{features} }; +} + +sub no_index { + my $self = shift; + my $type = shift; + push @{ $self->{values}{no_index}{$type} }, @_ if $type; + return $self->{values}{no_index}; +} + +sub read { + my $self = shift; + $self->include_deps( 'YAML', 0 ); + + require YAML; + my $data = YAML::LoadFile('META.yml'); + + # Call methods explicitly in case user has already set some values. + while ( my ( $key, $value ) = each %$data ) { + next unless $self->can($key); + if ( ref $value eq 'HASH' ) { + while ( my ( $module, $version ) = each %$value ) { + $self->can($key)->($self, $module => $version ); + } + } + else { + $self->can($key)->($self, $value); + } + } + return $self; +} + +sub write { + my $self = shift; + return $self unless $self->is_admin; + $self->admin->write_meta; + return $self; +} + +sub version_from { + my ( $self, $file ) = @_; + require ExtUtils::MM_Unix; + $self->version( ExtUtils::MM_Unix->parse_version($file) ); +} + +sub abstract_from { + my ( $self, $file ) = @_; + require ExtUtils::MM_Unix; + $self->abstract( + bless( + { DISTNAME => $self->name }, + 'ExtUtils::MM_Unix' + )->parse_abstract($file) + ); +} + +sub _slurp { + my ( $self, $file ) = @_; + + local *FH; + open FH, "< $file" or die "Cannot open $file.pod: $!"; + do { local $/; }; +} + +sub perl_version_from { + my ( $self, $file ) = @_; + + if ( + $self->_slurp($file) =~ m/ + ^ + use \s* + v? + ([\d\.]+) + \s* ; + /ixms + ) + { + $self->perl_version($1); + } + else { + warn "Cannot determine perl version info from $file\n"; + return; + } +} + +sub author_from { + my ( $self, $file ) = @_; + my $content = $self->_slurp($file); + if ($content =~ m/ + =head \d \s+ (?:authors?)\b \s* + ([^\n]*) + | + =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* + .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* + ([^\n]*) + /ixms) { + my $author = $1 || $2; + $author =~ s{E}{<}g; + $author =~ s{E}{>}g; + $self->author($author); + } + else { + warn "Cannot determine author info from $file\n"; + } +} + +sub license_from { + my ( $self, $file ) = @_; + + if ( + $self->_slurp($file) =~ m/ + =head \d \s+ + (?:licen[cs]e|licensing|copyright|legal)\b + (.*?) + (=head\\d.*|=cut.*|) + \z + /ixms + ) + { + my $license_text = $1; + my @phrases = ( + 'under the same (?:terms|license) as perl itself' => 'perl', + 'GNU public license' => 'gpl', + 'GNU lesser public license' => 'gpl', + 'BSD license' => 'bsd', + 'Artistic license' => 'artistic', + 'GPL' => 'gpl', + 'LGPL' => 'lgpl', + 'BSD' => 'bsd', + 'Artistic' => 'artistic', + ); + while ( my ( $pattern, $license ) = splice( @phrases, 0, 2 ) ) { + $pattern =~ s{\s+}{\\s+}g; + if ( $license_text =~ /\b$pattern\b/i ) { + $self->license($license); + return 1; + } + } + } + + warn "Cannot determine license info from $file\n"; + return 'unknown'; +} + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Win32.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Win32.pm new file mode 100644 index 0000000..c67bd06 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/Win32.pm @@ -0,0 +1,63 @@ +#line 1 "inc/Module/Install/Win32.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/Win32.pm" +package Module::Install::Win32; +use Module::Install::Base; @ISA = qw(Module::Install::Base); + +$VERSION = '0.02'; + +use strict; + +# determine if the user needs nmake, and download it if needed +sub check_nmake { + my $self = shift; + $self->load('can_run'); + $self->load('get_file'); + + require Config; + return unless ( + $Config::Config{make} and + $Config::Config{make} =~ /^nmake\b/i and + $^O eq 'MSWin32' and + !$self->can_run('nmake') + ); + + print "The required 'nmake' executable not found, fetching it...\n"; + + require File::Basename; + my $rv = $self->get_file( + url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', + ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', + local_dir => File::Basename::dirname($^X), + size => 51928, + run => 'Nmake15.exe /o > nul', + check_for => 'Nmake.exe', + remove => 1, + ); + + if (!$rv) { + die << '.'; + +------------------------------------------------------------------------------- + +Since you are using Microsoft Windows, you will need the 'nmake' utility +before installation. It's available at: + + http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe + or + ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe + +Please download the file manually, save it to a directory in %PATH% (e.g. +C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to +that directory, and run "Nmake15.exe" from there; that will create the +'nmake.exe' file needed by this module. + +You may then resume the installation process described in README. + +------------------------------------------------------------------------------- +. + } +} + +1; + +__END__ + diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/WriteAll.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/WriteAll.pm new file mode 100644 index 0000000..4d0dffd --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/inc/Module/Install/WriteAll.pm @@ -0,0 +1,36 @@ +#line 1 "inc/Module/Install/WriteAll.pm - /Users/ingy/local/lib/perl5/site_perl/5.8.6/Module/Install/WriteAll.pm" +package Module::Install::WriteAll; +use Module::Install::Base; @ISA = qw(Module::Install::Base); + +sub WriteAll { + my $self = shift; + my %args = ( + meta => 1, + sign => 0, + inline => 0, + check_nmake => 1, + @_ + ); + + $self->sign(1) if $args{sign}; + $self->Meta->write if $args{meta}; + $self->admin->WriteAll(%args) if $self->is_admin; + + if ($0 =~ /Build.PL$/i) { + $self->Build->write; + } + else { + $self->check_nmake if $args{check_nmake}; + $self->makemaker_args( PL_FILES => {} ) + unless $self->makemaker_args->{'PL_FILES'}; + + if ($args{inline}) { + $self->Inline->write; + } + else { + $self->Makefile->write; + } + } +} + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/lib/Spiffy.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/lib/Spiffy.pm new file mode 100644 index 0000000..9599c0b --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/lib/Spiffy.pm @@ -0,0 +1,1066 @@ +package Spiffy; +use strict; +use 5.006001; +use warnings; +use Carp; +require Exporter; +our $VERSION = '0.30'; +our @EXPORT = (); +our @EXPORT_BASE = qw(field const stub super); +our @EXPORT_OK = (@EXPORT_BASE, qw(id WWW XXX YYY ZZZ)); +our %EXPORT_TAGS = (XXX => [qw(WWW XXX YYY ZZZ)]); + +my $stack_frame = 0; +my $dump = 'yaml'; +my $bases_map = {}; + +sub WWW; sub XXX; sub YYY; sub ZZZ; + +# This line is here to convince "autouse" into believing we are autousable. +sub can { + ($_[1] eq 'import' and caller()->isa('autouse')) + ? \&Exporter::import # pacify autouse's equality test + : $_[0]->SUPER::can($_[1]) # normal case +} + +# TODO +# +# Exported functions like field and super should be hidden so as not to +# be confused with methods that can be inherited. +# + +sub new { + my $class = shift; + $class = ref($class) || $class; + my $self = bless {}, $class; + while (@_) { + my $method = shift; + $self->$method(shift); + } + return $self; +} + +my $filtered_files = {}; +my $filter_dump = 0; +my $filter_save = 0; +our $filter_result = ''; +sub import { + no strict 'refs'; + no warnings; + my $self_package = shift; + + # XXX Using parse_arguments here might cause confusion, because the + # subclass's boolean_arguments and paired_arguments can conflict, causing + # difficult debugging. Consider using something truly local. + my ($args, @export_list) = do { + local *boolean_arguments = sub { + qw( + -base -Base -mixin -selfless + -XXX -dumper -yaml + -filter_dump -filter_save + ) + }; + local *paired_arguments = sub { qw(-package) }; + $self_package->parse_arguments(@_); + }; + return spiffy_mixin_import(scalar(caller(0)), $self_package, @export_list) + if $args->{-mixin}; + + $filter_dump = 1 if $args->{-filter_dump}; + $filter_save = 1 if $args->{-filter_save}; + $dump = 'yaml' if $args->{-yaml}; + $dump = 'dumper' if $args->{-dumper}; + + local @EXPORT_BASE = @EXPORT_BASE; + + if ($args->{-XXX}) { + push @EXPORT_BASE, @{$EXPORT_TAGS{XXX}} + unless grep /^XXX$/, @EXPORT_BASE; + } + + spiffy_filter() + if ($args->{-selfless} or $args->{-Base}) and + not $filtered_files->{(caller($stack_frame))[1]}++; + + my $caller_package = $args->{-package} || caller($stack_frame); + push @{"$caller_package\::ISA"}, $self_package + if $args->{-Base} or $args->{-base}; + + for my $class (@{all_my_bases($self_package)}) { + next unless $class->isa('Spiffy'); + my @export = grep { + not defined &{"$caller_package\::$_"}; + } ( @{"$class\::EXPORT"}, + ($args->{-Base} or $args->{-base}) + ? @{"$class\::EXPORT_BASE"} : (), + ); + my @export_ok = grep { + not defined &{"$caller_package\::$_"}; + } @{"$class\::EXPORT_OK"}; + + # Avoid calling the expensive Exporter::export + # if there is nothing to do (optimization) + my %exportable = map { ($_, 1) } @export, @export_ok; + next unless keys %exportable; + + my @export_save = @{"$class\::EXPORT"}; + my @export_ok_save = @{"$class\::EXPORT_OK"}; + @{"$class\::EXPORT"} = @export; + @{"$class\::EXPORT_OK"} = @export_ok; + my @list = grep { + (my $v = $_) =~ s/^[\!\:]//; + $exportable{$v} or ${"$class\::EXPORT_TAGS"}{$v}; + } @export_list; + Exporter::export($class, $caller_package, @list); + @{"$class\::EXPORT"} = @export_save; + @{"$class\::EXPORT_OK"} = @export_ok_save; + } +} + +sub spiffy_filter { + require Filter::Util::Call; + my $done = 0; + Filter::Util::Call::filter_add( + sub { + return 0 if $done; + my ($data, $end) = ('', ''); + while (my $status = Filter::Util::Call::filter_read()) { + return $status if $status < 0; + if (/^__(?:END|DATA)__\r?$/) { + $end = $_; + last; + } + $data .= $_; + $_ = ''; + } + $_ = $data; + my @my_subs; + s[^(sub\s+\w+\s+\{)(.*\n)] + [${1}my \$self = shift;$2]gm; + s[^(sub\s+\w+)\s*\(\s*\)(\s+\{.*\n)] + [${1}${2}]gm; + s[^my\s+sub\s+(\w+)(\s+\{)(.*)((?s:.*?\n))\}\n] + [push @my_subs, $1; "\$$1 = sub$2my \$self = shift;$3$4\};\n"]gem; + my $preclare = ''; + if (@my_subs) { + $preclare = join ',', map "\$$_", @my_subs; + $preclare = "my($preclare);"; + } + $_ = "use strict;use warnings;$preclare${_};1;\n$end"; + if ($filter_dump) { print; exit } + if ($filter_save) { $filter_result = $_; $_ = $filter_result; } + $done = 1; + } + ); +} + +sub base { + push @_, -base; + goto &import; +} + +sub all_my_bases { + my $class = shift; + + return $bases_map->{$class} + if defined $bases_map->{$class}; + + my @bases = ($class); + no strict 'refs'; + for my $base_class (@{"${class}::ISA"}) { + push @bases, @{all_my_bases($base_class)}; + } + my $used = {}; + $bases_map->{$class} = [grep {not $used->{$_}++} @bases]; +} + +my %code = ( + sub_start => + "sub {\n", + set_default => + " \$_[0]->{%s} = %s\n unless exists \$_[0]->{%s};\n", + init => + " return \$_[0]->{%s} = do { my \$self = \$_[0]; %s }\n" . + " unless \$#_ > 0 or defined \$_[0]->{%s};\n", + weak_init => + " return do {\n" . + " \$_[0]->{%s} = do { my \$self = \$_[0]; %s };\n" . + " Scalar::Util::weaken(\$_[0]->{%s}) if ref \$_[0]->{%s};\n" . + " \$_[0]->{%s};\n" . + " } unless \$#_ > 0 or defined \$_[0]->{%s};\n", + return_if_get => + " return \$_[0]->{%s} unless \$#_ > 0;\n", + set => + " \$_[0]->{%s} = \$_[1];\n", + weaken => + " Scalar::Util::weaken(\$_[0]->{%s}) if ref \$_[0]->{%s};\n", + sub_end => + " return \$_[0]->{%s};\n}\n", +); + +sub field { + my $package = caller; + my ($args, @values) = do { + no warnings; + local *boolean_arguments = sub { (qw(-weak)) }; + local *paired_arguments = sub { (qw(-package -init)) }; + Spiffy->parse_arguments(@_); + }; + my ($field, $default) = @values; + $package = $args->{-package} if defined $args->{-package}; + die "Cannot have a default for a weakened field ($field)" + if defined $default && $args->{-weak}; + return if defined &{"${package}::$field"}; + require Scalar::Util if $args->{-weak}; + my $default_string = + ( ref($default) eq 'ARRAY' and not @$default ) + ? '[]' + : (ref($default) eq 'HASH' and not keys %$default ) + ? '{}' + : default_as_code($default); + + my $code = $code{sub_start}; + if ($args->{-init}) { + my $fragment = $args->{-weak} ? $code{weak_init} : $code{init}; + $code .= sprintf $fragment, $field, $args->{-init}, ($field) x 4; + } + $code .= sprintf $code{set_default}, $field, $default_string, $field + if defined $default; + $code .= sprintf $code{return_if_get}, $field; + $code .= sprintf $code{set}, $field; + $code .= sprintf $code{weaken}, $field, $field + if $args->{-weak}; + $code .= sprintf $code{sub_end}, $field; + + my $sub = eval $code; + die $@ if $@; + no strict 'refs'; + *{"${package}::$field"} = $sub; + return $code if defined wantarray; +} + +sub default_as_code { + require Data::Dumper; + local $Data::Dumper::Sortkeys = 1; + my $code = Data::Dumper::Dumper(shift); + $code =~ s/^\$VAR1 = //; + $code =~ s/;$//; + return $code; +} + +sub const { + my $package = caller; + my ($args, @values) = do { + no warnings; + local *paired_arguments = sub { (qw(-package)) }; + Spiffy->parse_arguments(@_); + }; + my ($field, $default) = @values; + $package = $args->{-package} if defined $args->{-package}; + no strict 'refs'; + return if defined &{"${package}::$field"}; + *{"${package}::$field"} = sub { $default } +} + +sub stub { + my $package = caller; + my ($args, @values) = do { + no warnings; + local *paired_arguments = sub { (qw(-package)) }; + Spiffy->parse_arguments(@_); + }; + my ($field, $default) = @values; + $package = $args->{-package} if defined $args->{-package}; + no strict 'refs'; + return if defined &{"${package}::$field"}; + *{"${package}::$field"} = + sub { + require Carp; + Carp::confess + "Method $field in package $package must be subclassed"; + } +} + +sub parse_arguments { + my $class = shift; + my ($args, @values) = ({}, ()); + my %booleans = map { ($_, 1) } $class->boolean_arguments; + my %pairs = map { ($_, 1) } $class->paired_arguments; + while (@_) { + my $elem = shift; + if (defined $elem and defined $booleans{$elem}) { + $args->{$elem} = (@_ and $_[0] =~ /^[01]$/) + ? shift + : 1; + } + elsif (defined $elem and defined $pairs{$elem} and @_) { + $args->{$elem} = shift; + } + else { + push @values, $elem; + } + } + return wantarray ? ($args, @values) : $args; +} + +sub boolean_arguments { () } +sub paired_arguments { () } + +# get a unique id for any node +sub id { + if (not ref $_[0]) { + return 'undef' if not defined $_[0]; + \$_[0] =~ /\((\w+)\)$/o or die; + return "$1-S"; + } + require overload; + overload::StrVal($_[0]) =~ /\((\w+)\)$/o or die; + return $1; +} + +#=============================================================================== +# It's super, man. +#=============================================================================== +package DB; +{ + no warnings 'redefine'; + sub super_args { + my @dummy = caller(@_ ? $_[0] : 2); + return @DB::args; + } +} + +package Spiffy; +sub super { + my $method; + my $frame = 1; + while ($method = (caller($frame++))[3]) { + $method =~ s/.*::// and last; + } + my @args = DB::super_args($frame); + @_ = @_ ? ($args[0], @_) : @args; + my $class = ref $_[0] ? ref $_[0] : $_[0]; + my $caller_class = caller; + my $seen = 0; + my @super_classes = reverse grep { + ($seen or $seen = ($_ eq $caller_class)) ? 0 : 1; + } reverse @{all_my_bases($class)}; + for my $super_class (@super_classes) { + no strict 'refs'; + next if $super_class eq $class; + if (defined &{"${super_class}::$method"}) { + ${"$super_class\::AUTOLOAD"} = ${"$class\::AUTOLOAD"} + if $method eq 'AUTOLOAD'; + return &{"${super_class}::$method"}; + } + } + return; +} + +#=============================================================================== +# This code deserves a spanking, because it is being very naughty. +# It is exchanging base.pm's import() for its own, so that people +# can use base.pm with Spiffy modules, without being the wiser. +#=============================================================================== +my $real_base_import; +my $real_mixin_import; + +BEGIN { + require base unless defined $INC{'base.pm'}; + $INC{'mixin.pm'} ||= 'Spiffy/mixin.pm'; + $real_base_import = \&base::import; + $real_mixin_import = \&mixin::import; + no warnings; + *base::import = \&spiffy_base_import; + *mixin::import = \&spiffy_mixin_import; +} + +# my $i = 0; +# while (my $caller = caller($i++)) { +# next unless $caller eq 'base' or $caller eq 'mixin'; +# croak <isa('Spiffy'); + } @base_classes; + my $inheritor = caller(0); + for my $base_class (@base_classes) { + next if $inheritor->isa($base_class); + croak "Can't mix Spiffy and non-Spiffy classes in 'use base'.\n", + "See the documentation of Spiffy.pm for details\n " + unless $base_class->isa('Spiffy'); + $stack_frame = 1; # tell import to use different caller + import($base_class, '-base'); + $stack_frame = 0; + } +} + +sub mixin { + my $self = shift; + my $target_class = ref($self); + spiffy_mixin_import($target_class, @_) +} + +sub spiffy_mixin_import { + my $target_class = shift; + $target_class = caller(0) + if $target_class eq 'mixin'; + my $mixin_class = shift + or die "Nothing to mixin"; + eval "require $mixin_class"; + my @roles = @_; + my $pseudo_class = join '-', $target_class, $mixin_class, @roles; + my %methods = spiffy_mixin_methods($mixin_class, @roles); + no strict 'refs'; + no warnings; + @{"$pseudo_class\::ISA"} = @{"$target_class\::ISA"}; + @{"$target_class\::ISA"} = ($pseudo_class); + for (keys %methods) { + *{"$pseudo_class\::$_"} = $methods{$_}; + } +} + +sub spiffy_mixin_methods { + my $mixin_class = shift; + no strict 'refs'; + my %methods = spiffy_all_methods($mixin_class); + map { + $methods{$_} + ? ($_, \ &{"$methods{$_}\::$_"}) + : ($_, \ &{"$mixin_class\::$_"}) + } @_ + ? (get_roles($mixin_class, @_)) + : (keys %methods); +} + +sub get_roles { + my $mixin_class = shift; + my @roles = @_; + while (grep /^!*:/, @roles) { + @roles = map { + s/!!//g; + /^!:(.*)/ ? do { + my $m = "_role_$1"; + map("!$_", $mixin_class->$m); + } : + /^:(.*)/ ? do { + my $m = "_role_$1"; + ($mixin_class->$m); + } : + ($_) + } @roles; + } + if (@roles and $roles[0] =~ /^!/) { + my %methods = spiffy_all_methods($mixin_class); + unshift @roles, keys(%methods); + } + my %roles; + for (@roles) { + s/!!//g; + delete $roles{$1}, next + if /^!(.*)/; + $roles{$_} = 1; + } + keys %roles; +} + +sub spiffy_all_methods { + no strict 'refs'; + my $class = shift; + return if $class eq 'Spiffy'; + my %methods = map { + ($_, $class) + } grep { + defined &{"$class\::$_"} and not /^_/ + } keys %{"$class\::"}; + my %super_methods; + %super_methods = spiffy_all_methods(${"$class\::ISA"}[0]) + if @{"$class\::ISA"}; + %{{%super_methods, %methods}}; +} + + +# END of naughty code. +#=============================================================================== +# Debugging support +#=============================================================================== +sub spiffy_dump { + no warnings; + if ($dump eq 'dumper') { + require Data::Dumper; + $Data::Dumper::Sortkeys = 1; + $Data::Dumper::Indent = 1; + return Data::Dumper::Dumper(@_); + } + require YAML; + $YAML::UseVersion = 0; + return YAML::Dump(@_) . "...\n"; +} + +sub at_line_number { + my ($file_path, $line_number) = (caller(1))[1,2]; + " at $file_path line $line_number\n"; +} + +sub WWW { + warn spiffy_dump(@_) . at_line_number; + return wantarray ? @_ : $_[0]; +} + +sub XXX { + die spiffy_dump(@_) . at_line_number; +} + +sub YYY { + print spiffy_dump(@_) . at_line_number; + return wantarray ? @_ : $_[0]; +} + +sub ZZZ { + require Carp; + Carp::confess spiffy_dump(@_); +} + +1; + +__END__ + +=head1 NAME + +Spiffy - Spiffy Perl Interface Framework For You + +=head1 SYNOPSIS + + package Keen; + use Spiffy -Base; + field 'mirth'; + const mood => ':-)'; + + sub happy { + if ($self->mood eq ':-(') { + $self->mirth(-1); + print "Cheer up!"; + } + super; + } + +=head1 DESCRIPTION + +"Spiffy" is a framework and methodology for doing object oriented (OO) +programming in Perl. Spiffy combines the best parts of Exporter.pm, +base.pm, mixin.pm and SUPER.pm into one magic foundation class. It +attempts to fix all the nits and warts of traditional Perl OO, in a +clean, straightforward and (perhaps someday) standard way. + +Spiffy borrows ideas from other OO languages like Python, Ruby, +Java and Perl 6. It also adds a few tricks of its own. + +If you take a look on CPAN, there are a ton of OO related modules. When +starting a new project, you need to pick the set of modules that makes +most sense, and then you need to use those modules in each of your +classes. Spiffy, on the other hand, has everything you'll probably need +in one module, and you only need to use it once in one of your classes. +If you make Spiffy.pm the base class of the basest class in your +project, Spiffy will automatically pass all of its magic to all of your +subclasses. You may eventually forget that you're even using it! + +The most striking difference between Spiffy and other Perl object +oriented base classes, is that it has the ability to export things. +If you create a subclass of Spiffy, all the things that Spiffy +exports will automatically be exported by your subclass, in addition to +any more things that you want to export. And if someone creates a +subclass of your subclass, all of those things will be exported +automatically, and so on. Think of it as "Inherited Exportation", and it +uses the familiar Exporter.pm specification syntax. + +To use Spiffy or any subclass of Spiffy as a base class of your class, +you specify the C<-base> argument to the C command. + + use MySpiffyBaseModule -base; + +You can also use the traditional C +syntax and everything will work exactly the same. The only caveat is +that Spiffy.pm must already be loaded. That's because Spiffy rewires +base.pm on the fly to do all the Spiffy magics. + +Spiffy has support for Ruby-like mixins with Perl6-like roles. Just like +C you can use either of the following invocations: + + use mixin 'MySpiffyBaseModule'; + use MySpiffyBaseModule -mixin; + +The second version will only work if the class being mixed in is a +subclass of Spiffy. The first version will work in all cases, as long +as Spiffy has already been loaded. + +To limit the methods that get mixed in, use roles. (Hint: they work just like +an Exporter list): + + use MySpiffyBaseModule -mixin => qw(:basics x y !foo); + +In object oriented Perl almost every subroutine is a method. Each method +gets the object passed to it as its first argument. That means +practically every subroutine starts with the line: + + my $self = shift; + +Spiffy provides a simple, optional filter mechanism to insert that line +for you, resulting in cleaner code. If you figure an average method has +10 lines of code, that's 10% of your code! To turn this option on, you +just use the C<-Base> option instead of the C<-base> option, or add the +C<-selfless> option. If source filtering makes you queazy, don't use the +feature. I personally find it addictive in my quest for writing squeaky +clean, maintainable code. + +A useful feature of Spiffy is that it exports two functions: C +and C that can be used to declare the attributes of your class, +and automatically generate accessor methods for them. The only +difference between the two functions is that C attributes can not +be modified; thus the accessor is much faster. + +One interesting aspect of OO programming is when a method calls the same +method from a parent class. This is generally known as calling a super +method. Perl's facility for doing this is butt ugly: + + sub cleanup { + my $self = shift; + $self->scrub; + $self->SUPER::cleanup(@_); + } + +Spiffy makes it, er, super easy to call super methods. You just use +the C function. You don't need to pass it any arguments +because it automatically passes them on for you. Here's the same +function with Spiffy: + + sub cleanup { + $self->scrub; + super; + } + +Spiffy has a special method for parsing arguments called +C, that it also uses for parsing its own arguments. You +declare which arguments are boolean (singletons) and which ones are +paired, with two special methods called C and +C. Parse arguments pulls out the booleans and pairs +and returns them in an anonymous hash, followed by a list of the +unmatched arguments. + +Finally, Spiffy can export a few debugging functions C, C, +C and C. Each of them produces a YAML dump of its arguments. +WWW warns the output, XXX dies with the output, YYY prints the output, +and ZZZ confesses the output. If YAML doesn't suit your needs, you can +switch all the dumps to Data::Dumper format with the C<-dumper> option. + +That's Spiffy! + +=head1 Spiffy EXPORTING + +Spiffy implements a completely new idea in Perl. Modules that act both +as object oriented classes and that also export functions. But it +takes the concept of Exporter.pm one step further; it walks the entire +C<@ISA> path of a class and honors the export specifications of each +module. Since Spiffy calls on the Exporter module to do this, you can +use all the fancy interface features that Exporter has, including tags +and negation. + +Spiffy considers all the arguments that don't begin with a dash to +comprise the export specification. + + package Vehicle; + use Spiffy -base; + our $SERIAL_NUMBER = 0; + our @EXPORT = qw($SERIAL_NUMBER); + our @EXPORT_BASE = qw(tire horn); + + package Bicycle; + use Vehicle -base, '!field'; + $self->inflate(tire); + +In this case, Cisa('Vehicle')> and also all the things +that C and C export, will go into C, +except C. + +Exporting can be very helpful when you've designed a system with +hundreds of classes, and you want them all to have access to some +functions or constants or variables. Just export them in your main base +class and every subclass will get the functions they need. + +You can do almost everything that Exporter does because Spiffy delegates +the job to Exporter (after adding some Spiffy magic). Spiffy offers a +C<@EXPORT_BASE> variable which is like C<@EXPORT>, but only for usages +that use C<-base>. + +=head1 Spiffy MIXINs & ROLEs + +If you've done much OO programming in Perl you've probably used Multiple +Inheritance (MI), and if you've done much MI you've probably run into +weird problems and headaches. Some languages like Ruby, attempt to +resolve MI issues using a technique called mixins. Basically, all Ruby +classes use only Single Inheritance (SI), and then I +functionality from other modules if they need to. + +Mixins can be thought of at a simplistic level as I the +methods of another class into your subclass. But from an implementation +standpoint that's not the best way to do it. Spiffy does what Ruby +does. It creates an empty anonymous class, imports everything into that +class, and then chains the new class into your SI ISA path. In other +words, if you say: + + package A; + use B -base; + use C -mixin; + use D -mixin; + +You end up with a single inheritance chain of classes like this: + + A << A-D << A-C << B; + +C and C are the actual package names of the generated +classes. The nice thing about this style is that mixing in C doesn't +clobber any methods in A, and D doesn't conflict with A or C either. If +you mixed in a method in C that was also in A, you can still get to it +by using C. + +When Spiffy mixes in C, it pulls in all the methods in C that do not +begin with an underscore. Actually it goes farther than that. If C is a +subclass it will pull in every method that C C do through +inheritance. This is very powerful, maybe too powerful. + +To limit what you mixin, Spiffy borrows the concept of Roles from +Perl6. The term role is used more loosely in Spiffy though. It's much +like an import list that the Exporter module uses, and you can use +groups (tags) and negation. If the first element of your list uses +negation, Spiffy will start with all the methods that your mixin +class can do. + + use E -mixin => qw(:tools walk !run !:sharp_tools); + +In this example, C and C are methods that E can do, and +C and C are roles of class E. How does class E +define these roles? It very simply defines methods called C<_role_tools> +and C<_role_sharp_tools> which return lists of more methods. (And +possibly other roles!) The neat thing here is that since roles are just +methods, they too can be inherited. Take B Perl6! + +=head1 Spiffy FILTERING + +By using the C<-Base> flag instead of C<-base> you never need to write the +line: + + my $self = shift; + +This statement is added to every subroutine in your class by using a source +filter. The magic is simple and fast, so there is litte performance penalty +for creating clean code on par with Ruby and Python. + + package Example; + use Spiffy -Base; + + sub crazy { + $self->nuts; + } + sub wacky { } + sub new() { + bless [], shift; + } + +is exactly the same as: + + package Example; + use Spiffy -base; + use strict;use warnings; + sub crazy {my $self = shift; + $self->nuts; + } + sub wacky {my $self = shift; } + sub new { + bless [], shift; + } + ;1; + +Note that the empty parens after the subroutine C keep it from +having a $self added. Also note that the extra code is added to existing +lines to ensure that line numbers are not altered. + +C<-Base> also turns on the strict and warnings pragmas, and adds that +annoying '1;' line to your module. + +=head1 PRIVATE METHODS + +Spiffy now has support for private methods when you use the '-Base' filter +mechanism. You just declare the subs with the C keyword, and call them +with a C<'$'> in front. Like this: + + package Keen; + use SomethingSpiffy -Base; + + # normal public method + sub swell { + $self->$stinky; + } + + # private lexical method. uncallable from outside this file. + my sub stinky { + ... + } + +=head1 Spiffy DEBUGGING + +The XXX function is very handy for debugging because you can insert it +almost anywhere, and it will dump your data in nice clean YAML. Take the +following statement: + + my @stuff = grep { /keen/ } $self->find($a, $b); + +If you have a problem with this statement, you can debug it in any of the +following ways: + + XXX my @stuff = grep { /keen/ } $self->find($a, $b); + my @stuff = XXX grep { /keen/ } $self->find($a, $b); + my @stuff = grep { /keen/ } XXX $self->find($a, $b); + my @stuff = grep { /keen/ } $self->find(XXX $a, $b); + +XXX is easy to insert and remove. It is also a tradition to mark +uncertain areas of code with XXX. This will make the debugging dumpers +easy to spot if you forget to take them out. + +WWW and YYY are nice because they dump their arguments and then return the +arguments. This way you can insert them into many places and still have the +code run as before. Use ZZZ when you need to die with both a YAML dump and a +full stack trace. + +The debugging functions are exported by default if you use the C<-base> +option, but only if you have previously used the C<-XXX> option. To +export all 4 functions use the export tag: + + use SomeSpiffyModule ':XXX'; + +To force the debugging functions to use Data::Dumper instead of YAML: + + use SomeSpiffyModule -dumper; + +=head1 Spiffy FUNCTIONS + +This section describes the functions the Spiffy exports. The C, +C, C and C functions are only exported when you use +the C<-base> or C<-Base> options. + +=over 4 + +=item * field + +Defines accessor methods for a field of your class: + + package Example; + use Spiffy -Base; + + field 'foo'; + field bar => []; + + sub lalala { + $self->foo(42); + push @{$self->{bar}}, $self->foo; + } + +The first parameter passed to C is the name of the attribute +being defined. Accessors can be given an optional default value. +This value will be returned if no value for the field has been set +in the object. + +=item * const + + const bar => 42; + +The C function is similar to except that it is immutable. +It also does not store data in the object. You probably always want to +give a C a default value, otherwise the generated method will be +somewhat useless. + +=item * stub + + stub 'cigar'; + +The C function generates a method that will die with an +appropriate message. The idea is that subclasses must implement these +methods so that the stub methods don't get called. + +=item * super + +If this function is called without any arguments, it will call the same +method that it is in, higher up in the ISA tree, passing it all the +same arguments. If it is called with arguments, it will use those +arguments with C<$self> in the front. In other words, it just works +like you'd expect. + + sub foo { + super; # Same as $self->SUPER::foo(@_); + super('hello'); # Same as $self->SUPER::foo('hello'); + $self->bar(42); + } + + sub new() { + my $self = super; + $self->init; + return $self; + } + +C will simply do nothing if there is no super method. Finally, +C does the right thing in AUTOLOAD subroutines. + +=back + +=head1 Spiffy METHODS + +This section lists all of the methods that any subclass of Spiffy +automatically inherits. + +=over 4 + +=item * mixin + +A method to mixin a class at runtime. Takes the same arguments as C. Makes the target class a mixin of the caller. + + $self->mixin('SomeClass'); + $object->mixin('SomeOtherClass' => 'some_method'); + +=item * parse_arguments + +This method takes a list of arguments and groups them into pairs. It +allows for boolean arguments which may or may not have a value +(defaulting to 1). The method returns a hash reference of all the pairs +as keys and values in the hash. Any arguments that cannot be paired, are +returned as a list. Here is an example: + + sub boolean_arguments { qw(-has_spots -is_yummy) } + sub paired_arguments { qw(-name -size) } + my ($pairs, @others) = $self->parse_arguments( + 'red', 'white', + -name => 'Ingy', + -has_spots => + -size => 'large', + 'black', + -is_yummy => 0, + ); + +After this call, C<$pairs> will contain: + + { + -name => 'Ingy', + -has_spots => 1, + -size => 'large', + -is_yummy => 0, + } + +and C<@others> will contain 'red', 'white', and 'black'. + +=item * boolean_arguments + +Returns the list of arguments that are recognized as being boolean. Override +this method to define your own list. + +=item * paired_arguments + +Returns the list of arguments that are recognized as being paired. Override +this method to define your own list. + +=back + +=head1 Spiffy ARGUMENTS + +When you C the Spiffy module or a subclass of it, you can pass it a +list of arguments. These arguments are parsed using the +C method described above. The special argument +C<-base>, is used to make the current package a subclass of the Spiffy +module being used. + +Any non-paired parameters act like a normal import list; just like those +used with the Exporter module. + +=head1 USING Spiffy WITH base.pm + +The proper way to use a Spiffy module as a base class is with the C<-base> +parameter to the C statement. This differs from typical modules where you +would want to C. + + package Something; + use Spiffy::Module -base; + use base 'NonSpiffy::Module'; + +Now it may be hard to keep track of what's Spiffy and what is not. +Therefore Spiffy has actually been made to work with base.pm. You can +say: + + package Something; + use base 'Spiffy::Module'; + use base 'NonSpiffy::Module'; + +C is also very useful when your class is not an actual module (a +separate file) but just a package in some file that has already been loaded. +C will work whether the class is a module or not, while the C<-base> +syntax cannot work that way, since C always tries to load a module. + +=head2 base.pm Caveats + +To make Spiffy work with base.pm, a dirty trick was played. Spiffy swaps +C with its own version. If the base modules are not Spiffy, +Spiffy calls the original base::import. If the base modules are Spiffy, +then Spiffy does its own thing. + +There are two caveats. + +=over 4 + +=item * Spiffy must be loaded first. + +If Spiffy is not loaded and C is invoked on a Spiffy module, +Spiffy will die with a useful message telling the author to read this +documentation. That's because Spiffy needed to do the import swap +beforehand. + +If you get this error, simply put a statement like this up front in +your code: + + use Spiffy (); + +=item * No Mixing + +C can take multiple arguments. And this works with Spiffy as +long as all the base classes are Spiffy, or they are all non-Spiffy. If +they are mixed, Spiffy will die. In this case just use separate C statements. + +=back + +=head1 Spiffy TODO LIST + +Spiffy is a wonderful way to do OO programming in Perl, but it is still +a work in progress. New things will be added, and things that don't work +well, might be removed. + +=head1 AUTHOR + +Ingy döt Net + +=head1 COPYRIGHT + +Copyright (c) 2006. Ingy döt Net. All rights reserved. +Copyright (c) 2004. Brian Ingerson. All rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +See L + +=cut diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter4.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter4.pm new file mode 100644 index 0000000..e316db6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter4.pm @@ -0,0 +1,23 @@ +package Filter4; +use Spiffy -Base; +# comment + +sub foo { + my $x = $self->$bar; +} + +sub one { } +sub uno {} +my sub bar { + if (1) { + my $y = 1; + } +} + +sub baz() { + my $z = 1; +} + +my sub bam { + $self->$bar(42); +} diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter5.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter5.pm new file mode 100644 index 0000000..4c46bc0 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Filter5.pm @@ -0,0 +1,10 @@ +package Filter5; +use Spiffy -Base; +my sub xxx { + $self->$xxx; + $self->$yyy; +} +my sub yyy { + $self->$xxx; + $self->$yyy +} diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/NonSpiffy.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/NonSpiffy.pm new file mode 100644 index 0000000..c576bea --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/NonSpiffy.pm @@ -0,0 +1,5 @@ +package NonSpiffy; + +use Filter4; # Filter4 /is/ Spiffy + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Something.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Something.pm new file mode 100644 index 0000000..3877726 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Something.pm @@ -0,0 +1,11 @@ +package Something; +use strict; +sub thing { Something->new(@_) } +our @EXPORT = qw(thing); +use Thing -base; + +field color => 'blue'; + +sub cool {} + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Thing.pm b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Thing.pm new file mode 100644 index 0000000..d73859b --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/Thing.pm @@ -0,0 +1,11 @@ +package Thing; +use strict; +use Spiffy -base; +use base 'Spiffy'; +our @EXPORT = qw(thing); + +field volume => 11; + +sub thing { Thing->new(@_) } + +1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/autoload.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/autoload.t new file mode 100644 index 0000000..206c68f --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/autoload.t @@ -0,0 +1,31 @@ +use lib 't', 'lib'; +use strict; +use warnings; +use Spiffy (); + +package A; +use Spiffy -Base; + +sub AUTOLOAD { + super; + join '+', $A::AUTOLOAD, @_; +} + +package B; +use base 'A'; + +sub AUTOLOAD { + super; +} + +package C; +use base 'B'; + +sub AUTOLOAD { + super; +} + +package main; +use Test::More tests => 1; + +is(C->foo(42), 'C::foo+42'); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base.t new file mode 100644 index 0000000..74df798 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base.t @@ -0,0 +1,64 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package XXX; +BEGIN {require Thing} +use base 'Thing'; + +package Foo; +use base 'Spiffy'; +BEGIN { @Foo::EXPORT=qw(xxx) } +sub xxx {} + +package Bar; +use base 'Foo', 'Thing'; + +package Boo; +BEGIN { @Boo::EXPORT=qw(xxx) } +sub xxx {} + +package Goo; +use base 'Boo'; + +package Something; +use base 'Spiffy'; +BEGIN { @Something::EXPORT = qw(qwerty) } +sub qwerty {} + +package SomethingGood; +use base 'Something'; + +package main; +use Test::More tests => 24; + +ok(Thing->isa('Spiffy')); +ok(defined &XXX::thing); +ok(defined &XXX::field); +ok(defined &XXX::const); + +ok(defined &Foo::field); +ok(defined &Foo::const); +ok(defined &Foo::xxx); + +ok(Bar->isa('Spiffy')); +ok(Bar->isa('Foo')); +ok(Bar->isa('Thing')); +ok(defined &Bar::field); +ok(defined &Bar::const); +ok(defined &Bar::xxx); +ok(defined &Bar::thing); + +ok(not Boo->isa('Spiffy')); +ok(defined &Boo::xxx); + +ok(not Goo->isa('Spiffy')); +ok(Goo->isa('Boo')); +ok(not defined &Goo::xxx); + +ok(SomethingGood->isa('Something')); +ok(SomethingGood->isa('Spiffy')); +ok(not SomethingGood->isa('Thing')); +ok(not defined &SomethingGood::thing); + +ok(not @Spiffy::ISA); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base2.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base2.t new file mode 100644 index 0000000..7dab136 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/base2.t @@ -0,0 +1,10 @@ +use Test::More tests => 1; + +use lib 't'; + +eval <<'...'; +package Foo; +use base 'NonSpiffy'; +... + +is $@, ''; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/cascade.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/cascade.t new file mode 100644 index 0000000..774751d --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/cascade.t @@ -0,0 +1,37 @@ +use lib 'lib'; + +package Foo; +use strict; +use Spiffy -base; +use Cwd; +our @EXPORT = qw(cwd); + +package Bar; +use strict; +Foo->base; +our @EXPORT = qw(doodle); +sub doodle {} +sub poodle {} + +package Baz; +use strict; +Bar->base; + +package main; +use strict; +use Test::More tests => 12; + +ok(not defined &Foo::import); +ok(defined &Foo::cwd); +ok(not defined &Foo::doodle); +ok(not defined &Foo::poodle); + +ok(not defined &Bar::import); +ok(defined &Bar::cwd); +ok(defined &Bar::doodle); +ok(defined &Bar::poodle); + +ok(not defined &Baz::import); +ok(defined &Baz::cwd); +ok(defined &Baz::doodle); +ok(not defined &Baz::poodle); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/const.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/const.t new file mode 100644 index 0000000..a800887 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/const.t @@ -0,0 +1,15 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package XXX; +use Spiffy -base; +const foo => 42; + +package main; +use Test::More tests => 3; + +my $xxx = XXX->new; +is($xxx->foo, 42); +is($xxx->foo(69), 42); +is($xxx->foo, 42); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/early.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/early.t new file mode 100644 index 0000000..d54e48f --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/early.t @@ -0,0 +1,16 @@ +use Test::More tests => 1; + +use lib 't'; + +SKIP: { + skip 'XXX - fix later', 1; + eval <<'...'; + +package Foo; +use base 'Filter4'; + +... + + like $@, qr/\QSpiffy.pm must be loaded before calling 'use base'/, + "Caught attempt to use 'base' on Spiffy module before loading Spiffy"; +} diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export1.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export1.t new file mode 100644 index 0000000..d1f1ba6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export1.t @@ -0,0 +1,28 @@ +package Foo; +use strict; +use Test::More tests => 20; +use lib 't'; +use Something; + +ok(not defined &Foo::import); +ok(defined &Foo::thing); +ok(ref(thing) eq 'Something'); +ok(thing()->can('cool')); +ok(thing()->isa('Something')); +ok(thing()->isa('Thing')); +ok(thing()->isa('Spiffy')); +is(join('-', @Foo::ISA), ''); +ok(not defined &Foo::field); +ok(not defined &Foo::spiffy_constructor); + +ok(not defined &Something::import); +ok(defined &Something::thing); +ok(defined &Something::field); +ok(not defined &Something::spiffy_constructor); +is(join('-', @Something::ISA), 'Thing'); + +ok(not defined &Thing::import); +ok(defined &Thing::thing); +ok(defined &Thing::field); +ok(not defined &Thing::spiffy_constructor); +is(join('-', @Thing::ISA), 'Spiffy'); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export2.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export2.t new file mode 100644 index 0000000..2a14dd7 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export2.t @@ -0,0 +1,25 @@ +use lib 't'; +use strict; +use warnings; +package A; +use Spiffy -base; +BEGIN {@A::EXPORT = qw($A1 $A2)} +$A::A1 = 5; +$A::A2 = 10; + +package B; +use base 'A'; +BEGIN {@B::EXPORT = qw($A2 $A3)} +$B::A2 = 15; +$B::A3 = 20; + +package main; +use strict; +use Test::More tests => 6; +BEGIN {B->import} +ok(defined $main::A1); +ok(defined $main::A2); +ok(defined $main::A3); +is($main::A1, 5); +is($main::A2, 15); +is($main::A3, 20); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export3.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export3.t new file mode 100644 index 0000000..2e76659 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export3.t @@ -0,0 +1,27 @@ +use lib 't'; +use strict; +use warnings; + +package A; +use Spiffy -base; +BEGIN {@A::EXPORT_OK = qw($A1 $A2)} +$A::A1 = 5; +$A::A2 = 10; + +package B; +use base 'A'; +BEGIN {@B::EXPORT_OK = qw($A2 $A3)} +$B::A2 = 15; +$B::A3 = 20; + +package main; +no warnings; +use Test::More tests => 7; +BEGIN {B->import(qw($A1 $A2 $A3 $A4))} +ok(defined $main::A1); +ok(defined $main::A2); +ok(defined $main::A3); +ok(not defined $main::A4); +is($A1, 5); +is($A2, 10); +is($A3, 20); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export4.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export4.t new file mode 100644 index 0000000..1330293 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export4.t @@ -0,0 +1,56 @@ +use lib 't'; +use strict; +use warnings; + +package A; +# Exporter before 5.8.4 needs the tag as the first thing imported +use Spiffy -base, qw(:XXX const); + +package B; +use base 'A'; + +package C; +use Spiffy -XXX, -base; + +package D; +use Spiffy -base; + +package E; +use Spiffy -base, 'XXX'; + +package F; +use Spiffy -base; +use Spiffy 'XXX'; + +package main; +use Test::More tests => 24; + +ok(not defined &A::field); +ok(defined &A::const); +ok(defined &A::XXX); +ok(defined &A::YYY); + +ok(defined &B::field); +ok(defined &B::const); +ok(not defined &B::XXX); +ok(not defined &B::YYY); + +ok(defined &C::field); +ok(defined &C::const); +ok(defined &C::XXX); +ok(defined &C::YYY); + +ok(defined &D::field); +ok(defined &D::const); +ok(not defined &D::XXX); +ok(not defined &D::YYY); + +ok(not defined &E::field); +ok(not defined &E::const); +ok(defined &E::XXX); +ok(not defined &E::YYY); + +ok(defined &F::field); +ok(defined &F::const); +ok(defined &F::XXX); +ok(not defined &F::YYY); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export5.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export5.t new file mode 100644 index 0000000..e9f8d8c --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export5.t @@ -0,0 +1,24 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package A; +use Spiffy -base; +BEGIN {@A::EXPORT_OK = qw(dude)} +const dude => 10; + +package B; +use base 'A'; +BEGIN { + @B::EXPORT_OK = qw(dude); + const dude => 20; +} + +package C; +BEGIN {B->import('dude')} + +package main; +no warnings; +use Test::More tests => 2; +ok(defined $C::{dude}); +is(C::dude(), 20); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export6.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export6.t new file mode 100644 index 0000000..5620f12 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export6.t @@ -0,0 +1,16 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package A; +use Spiffy -Base, ':XXX'; + +package B; +use Spiffy -Base, ':XXX', 'field'; + +package main; +use Test::More tests => 4; +ok(not defined &A::field); +ok(defined &B::field); +ok(defined &A::XXX); +ok(defined &B::XXX); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export7.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export7.t new file mode 100644 index 0000000..badadba --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/export7.t @@ -0,0 +1,17 @@ +use Test::More; + +plan tests => 4; + +package B; +use Spiffy -Base, -XXX; + +package A; +use Spiffy -Base; + +package main; + +ok(not defined &A::XXX); +ok(defined &A::field); + +ok(defined &B::XXX); +ok(defined &B::field); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/exporter.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/exporter.t new file mode 100644 index 0000000..fb13397 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/exporter.t @@ -0,0 +1,9 @@ +package Foo; +use Spiffy -base; + +package autouse; + +use Test::More tests => 1; + +is 'Foo'->can('import'), \&Exporter::import, + 'Spiffy modules support autouse'; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field.t new file mode 100644 index 0000000..3f01d00 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field.t @@ -0,0 +1,21 @@ +use lib 't', 'lib'; +use strict; +use warnings; +use Spiffy (); + +package Bar; + +package Foo; +use base 'Spiffy'; +sub new { + my $self = super; + field -package => 'Bar', 'xxx'; +} + +use Test::More tests => 4; + +Foo->new; +ok(not defined $Foo::{-package}); +ok(not defined &Foo::Bar); +ok(not defined &Foo::xxx); +ok(defined &Bar::xxx); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field2.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field2.t new file mode 100644 index 0000000..82c3fbb --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field2.t @@ -0,0 +1,22 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package Foo; +use Spiffy -base; +field one => []; +field two => {}; +field three => [1..4]; +field four => {1..4}; + +package main; +use Test::More tests => 5; +use Spiffy 'id'; + +my $f1 = Foo->new; +my $f2 = Foo->new; +ok(id($f1->one) ne id($f2->one)); +ok(id($f1->two) ne id($f2->two)); +is(scalar(@{$f1->three}), 4); +is_deeply($f1->three, $f2->three); +is_deeply($f1->four, $f2->four); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field3.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field3.t new file mode 100644 index 0000000..b5643dd --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/field3.t @@ -0,0 +1,95 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package Foo; +use Spiffy -Base; +my $test1 = field test1 => []; +my $test2 = field test2 => {}; +my $test3 = field test3 => [1..4]; +my $test4 = field test4 => {1..4}; +my $test5 = field test5 => -weaken; +my $test6 = field test6 => -init => '$self->setup(@_)'; +my $test7 = field test7 => -weak => -init => '$self->setup(@_)'; + +package main; +use Test::More tests => 7; + +my @expected = map { s/\r//g; $_ } split /\.\.\.\r?\n/, join '', ; + +my $i = 1; +for my $expected (@expected) { + is(eval '$test' . $i++, $expected); +} + +__DATA__ +sub { + $_[0]->{test1} = [] + unless exists $_[0]->{test1}; + return $_[0]->{test1} unless $#_ > 0; + $_[0]->{test1} = $_[1]; + return $_[0]->{test1}; +} +... +sub { + $_[0]->{test2} = {} + unless exists $_[0]->{test2}; + return $_[0]->{test2} unless $#_ > 0; + $_[0]->{test2} = $_[1]; + return $_[0]->{test2}; +} +... +sub { + $_[0]->{test3} = [ + 1, + 2, + 3, + 4 + ] + + unless exists $_[0]->{test3}; + return $_[0]->{test3} unless $#_ > 0; + $_[0]->{test3} = $_[1]; + return $_[0]->{test3}; +} +... +sub { + $_[0]->{test4} = { + '1' => 2, + '3' => 4 + } + + unless exists $_[0]->{test4}; + return $_[0]->{test4} unless $#_ > 0; + $_[0]->{test4} = $_[1]; + return $_[0]->{test4}; +} +... +sub { + $_[0]->{test5} = '-weaken' + + unless exists $_[0]->{test5}; + return $_[0]->{test5} unless $#_ > 0; + $_[0]->{test5} = $_[1]; + return $_[0]->{test5}; +} +... +sub { + return $_[0]->{test6} = do { my $self = $_[0]; $self->setup(@_) } + unless $#_ > 0 or defined $_[0]->{test6}; + return $_[0]->{test6} unless $#_ > 0; + $_[0]->{test6} = $_[1]; + return $_[0]->{test6}; +} +... +sub { + return do { + $_[0]->{test7} = do { my $self = $_[0]; $self->setup(@_) }; + Scalar::Util::weaken($_[0]->{test7}) if ref $_[0]->{test7}; + $_[0]->{test7}; + } unless $#_ > 0 or defined $_[0]->{test7}; + return $_[0]->{test7} unless $#_ > 0; + $_[0]->{test7} = $_[1]; + Scalar::Util::weaken($_[0]->{test7}) if ref $_[0]->{test7}; + return $_[0]->{test7}; +} diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter.t new file mode 100644 index 0000000..81339d6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter.t @@ -0,0 +1,24 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package XXX; +use Spiffy -Base; #, '-filter_dump'; + +const name => 'world'; + +sub foo { + "Hello, " . $self->name; +} + +sub bar() { + my $self = shift; + return $self; +} + +package main; +use Test::More tests => 2; + +my $xxx = XXX->new; +is($xxx->foo, 'Hello, world'); +is(XXX::bar(42), 42); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter2.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter2.t new file mode 100644 index 0000000..674ef09 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter2.t @@ -0,0 +1,27 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package YYY; +use Spiffy -Base; + +package XXX; +use Spiffy -Base; + +const name => 'world'; + +sub foo { + "Hello, " . $self->name; +} + +sub bar() { + my $self = shift; + return $self; +} + +package main; +use Test::More tests => 2; + +my $xxx = XXX->new; +is($xxx->foo, 'Hello, world'); +is(XXX::bar(42), 42); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter3.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter3.t new file mode 100644 index 0000000..144fde1 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter3.t @@ -0,0 +1,23 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package BOX; +use Spiffy -Base; + +package main; +use Test::More tests => 3; + +is(scalar , "one\n"); +is(scalar , "two\n"); +is(scalar , "three\n"); + +sub foo { + $self->foo; +} + +package BOX; +__DATA__ +one +two +three diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter4.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter4.t new file mode 100644 index 0000000..caeb540 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter4.t @@ -0,0 +1,36 @@ +use lib 't', 'lib'; +use strict; + +use Test::More tests => 1; +use Spiffy '-filter_save'; +use Filter4; + +my $result = $Spiffy::filter_result; +my $expected = do { local $/; }; +$result =~ s/\r//g; +$expected =~ s/\r//g; +is($result, $expected); + +__DATA__ +use strict;use warnings;my($bar,$bam);# comment + +sub foo {my $self = shift; + my $x = $self->$bar; +} + +sub one {my $self = shift; } +sub uno {my $self = shift;} +$bar = sub {my $self = shift; + if (1) { + my $y = 1; + } +}; + +sub baz { + my $z = 1; +} + +$bam = sub {my $self = shift; + $self->$bar(42); +}; +;1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter5.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter5.t new file mode 100644 index 0000000..3f65934 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/filter5.t @@ -0,0 +1,23 @@ +use lib 't', 'lib'; +use strict; + +use Test::More tests => 1; +use Spiffy -filter_save; +use Filter5; + +my $result = $Spiffy::filter_result; +my $expected = do { local $/; }; +$result =~ s/\r//g; +$expected =~ s/\r//g; +is($result, $expected); + +__DATA__ +use strict;use warnings;my($xxx,$yyy);$xxx = sub {my $self = shift; + $self->$xxx; + $self->$yyy; +}; +$yyy = sub {my $self = shift; + $self->$xxx; + $self->$yyy +}; +;1; diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin.t new file mode 100644 index 0000000..ad419ba --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin.t @@ -0,0 +1,36 @@ +use lib 't', 'lib'; +use strict; +no strict 'refs'; +use warnings; + +package A; +use Spiffy -base; +field 'foo' => 17; + +package X; +sub extra {99} + +package BB; +use base 'X'; +sub xxx {42} +sub yyy {} +sub _zzz {} + +package C; +use base 'A'; +use mixin 'BB'; + +package main; +use Test::More tests => 10; + +my $c = C->new; +ok($c->can('foo')); +is($c->foo, 17); +ok($c->can('extra')); +is($c->extra, 99); +ok($c->can('xxx')); +is($c->xxx, 42); +ok(not $c->can('_zzz')); +is(@{C::ISA}, 1); +is(${C::ISA}[0], 'C-BB'); +is(${"C-BB::ISA"}[0], 'A'); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin2.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin2.t new file mode 100644 index 0000000..f82ab50 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin2.t @@ -0,0 +1,71 @@ +use lib 't', 'lib'; +use Spiffy (); +package A; +sub _role_a { qw(a1 a2 a3) } +sub a1 {'a1' } +sub a2 {'a2' } +sub a3 {'a3' } +sub _role_A { qw(A1 A2 A3) } +sub A1 {'A1' } +sub A2 {'A2' } +sub A3 {'A3' } +sub _role_aA { qw(:a :A foo) } +sub foo {'foo'} + +package BB; +use base 'A'; + +package X; +use mixin A => qw(:a !a2); + +package X2; +use mixin BB => qw(:a !a2); + +package X3; +use mixin A => qw(!:A A2); + +package X4; +use mixin A => qw(:aA !a1 !a1 !A1); + +package X5; +use mixin A => qw(!:a !:A); + +package main; +use Test::More tests => 32; + +ok(X->can('a1')); +ok(not X->can('a2')); +ok(X->can('a3')); +ok(not X->can('A1')); +is(X->a1, 'a1'); +is(X->a3, 'a3'); + +ok(X2->can('a1')); +ok(not X2->can('a2')); +ok(X2->can('a3')); +ok(not X2->can('A1')); +is(X2->a1, 'a1'); +is(X2->a3, 'a3'); + +ok(X3->can('a1')); +ok(X3->can('a2')); +ok(X3->can('a3')); +ok(not X3->can('A1')); +ok(X3->can('A2')); +ok(not X3->can('A3')); + +ok(not X4->can('a1')); +ok(X4->can('a2')); +ok(X4->can('a3')); +ok(not X4->can('A1')); +ok(X4->can('A2')); +ok(X4->can('A3')); +ok(X4->can('foo')); + +ok(not X5->can('a1')); +ok(not X5->can('a2')); +ok(not X5->can('a3')); +ok(not X5->can('A1')); +ok(not X5->can('A2')); +ok(not X5->can('A3')); +ok(X5->can('foo')); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin3.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin3.t new file mode 100644 index 0000000..19a2321 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/mixin3.t @@ -0,0 +1,15 @@ +use lib 't', 'lib'; +package A; +use Spiffy -Base; + +package B; +use Spiffy -Base; +field foo => 42; + + +package main; +use Test::More tests => 1; + +my $a = A->new; +$a->mixin('B'); +is($a->foo, 42); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/new.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/new.t new file mode 100644 index 0000000..67ca640 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/new.t @@ -0,0 +1,20 @@ +use lib 't'; +use strict; +use warnings; +package A; +use Spiffy -base; +field 'x'; +field 'y'; + +package main; +use Test::More tests => 6; + +my $a1 = A->new; +ok(not defined $a1->x); +ok(not defined $a1->y); +my $a2 = A->new(x => 5); +is($a2->x, 5); +ok(not defined $a2->y); +my $a3 = A->new(x => 15, y => 10); +is($a3->x, 15); +is($a3->y, 10); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/package.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/package.t new file mode 100644 index 0000000..747c2dc --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/package.t @@ -0,0 +1,11 @@ +use lib 'lib'; +use strict; +use warnings; +use Test::More tests => 2; + +package Foo; +use Spiffy -base => -package => 'Bar'; + +package main; +ok(not defined &Foo::field); +ok(defined &Bar::field); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/parse.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/parse.t new file mode 100644 index 0000000..4170f34 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/parse.t @@ -0,0 +1,9 @@ +use lib 'lib'; +use strict; +use warnings; +use Test::More tests => 1; +use Spiffy; + +my $args = Spiffy->parse_arguments(); + +ok(ref $args && ref($args) eq 'HASH'); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/stub.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/stub.t new file mode 100644 index 0000000..29a01b6 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/stub.t @@ -0,0 +1,17 @@ +use lib 't', 'lib'; +use strict; +use warnings; + +package XXX; +use Spiffy -base; +stub 'foo'; + +package YYY; +use base 'XXX'; + +package main; +use Test::More tests => 1; + +my $y = YYY->new; +eval {$y->foo}; +like($@, qr/subclassed/); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super.t new file mode 100644 index 0000000..b81314b --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super.t @@ -0,0 +1,55 @@ +use lib 'lib'; + +package Foo; +use strict; +use Spiffy -base; +field 'xxx'; +field 'dog'; +field 'bog'; + +sub new { + my $self = super; + $self->xxx('XXX'); + return $self; +} + +sub poodle { + my $self = shift; + my $count = shift; + $self->dog("$count poodle"); +} + +sub doodle { + my $self = shift; + my $count = shift; + $self->bog("$count doodle"); +} + +package Bar; +use strict; +BEGIN { Foo->base } + +sub poodle { + my $self = shift; + super; + $self->dog($self->dog . ' dogs'); +} + +sub doodle { + my $self = shift; + eval 'eval "super"'; + $self->bog($self->bog . ' bogs'); +} + +package main; +use strict; +use Test::More tests => 3; + +my $f = Bar->new; +is($f->{xxx}, 'XXX'); + +$f->poodle(3); +is($f->{dog}, '3 poodle dogs'); + +$f->doodle(4); +is($f->{bog}, '4 doodle bogs'); diff --git a/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super2.t b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super2.t new file mode 100644 index 0000000..8b05cd2 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl-0.30/t/super2.t @@ -0,0 +1,60 @@ +use lib 'lib'; +use strict; +use warnings; + +package Alpha; +use Spiffy -Base; + +sub three { + print "ok 6\n"; +} + +package Foo; +use base 'Alpha'; + +sub one { + super; + print "ok 2\n"; +} + +sub two { + print "ok 4\n"; +} + +package Bar; +use base 'Foo'; + +sub one { + super; + print "ok 3\n"; +} + +sub two { + super; + print "ok 5\n"; +} + +package Baz; +use base 'Bar'; + +sub one { + print "ok 1\n"; + super; +} + +sub two { + super; + print "not ok 6\n"; +} + +sub three { + super; + print "ok 7\n"; +} + +package main; +use strict; +print "1..7\n"; +Baz->new->one; +Bar->new->two; +Baz->new->three; diff --git a/deb-src/libspiffy-perl/libspiffy-perl_0.30-1.diff.gz b/deb-src/libspiffy-perl/libspiffy-perl_0.30-1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..445cce022f3d56bdd8ed38c68ec472c9dd7c2b57 GIT binary patch literal 2922 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 +Uploaders: Florian Ragwitz , gregor herrmann +Homepage: http://search.cpan.org/dist/Spiffy/ +Standards-Version: 3.8.0 +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libspiffy-perl/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libspiffy-perl/ +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl (>= 5.8.0-7) +Checksums-Sha1: + 1d8fe20f2fcf1e8efc0a1259217a36f77527b9d6 27631 libspiffy-perl_0.30.orig.tar.gz + 6d29464fd453d828b730ce0709396685bb66487a 2922 libspiffy-perl_0.30-1.diff.gz +Checksums-Sha256: + ce9374b6ba271efdc65d199298b04bd3a0c7e6e6504965ed86222dc5c80845b9 27631 libspiffy-perl_0.30.orig.tar.gz + 1ccd204cc8c076c6518c09eccdfab0c635cbb3816a4330197c4cb689d662684f 2922 libspiffy-perl_0.30-1.diff.gz +Files: + 49860ccf2127c6d2af3d98560ffae644 27631 libspiffy-perl_0.30.orig.tar.gz + 7498a64fc2927cd80579357ca8c6ad22 2922 libspiffy-perl_0.30-1.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEARECAAYFAkhX4vsACgkQOzKYnQDzz+SeYACeIQQIu695yi3BDqN2+oc/HHDf +9kQAnjaN+RF5Xz1aX8qfT60csFjOhSbb +=WZPi +-----END PGP SIGNATURE----- diff --git a/deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1.diff.gz b/deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..6374c3246f84d2604bc9482b8c9b041fe2be57b3 GIT binary patch literal 2999 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 +Architecture: all +Standards-Version: 3.8.0 +Build-Depends: debhelper (>= 5) +Build-Depends-Indep: perl (>= 5.8.0-7) +Uploaders: Florian Ragwitz , gregor herrmann +Files: + 49860ccf2127c6d2af3d98560ffae644 27631 libspiffy-perl_0.30.orig.tar.gz + a3a3a00d05a84b8d1d3100726311c3e0 2999 libspiffy-perl_0.30-1maemo1.diff.gz diff --git a/deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1_armel.changes b/deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1_armel.changes new file mode 100644 index 0000000..dacbf82 --- /dev/null +++ b/deb-src/libspiffy-perl/libspiffy-perl_0.30-1maemo1_armel.changes @@ -0,0 +1,20 @@ +Format: 1.7 +Date: Wed, 14 Apr 2010 07:08:42 +0100 +Source: libspiffy-perl +Binary: libspiffy-perl +Architecture: source all +Version: 0.30-1maemo1 +Distribution: fremantle +Urgency: low +Maintainer: Debian Perl Group +Changed-By: Nito Martinez +Description: + libspiffy-perl - Spiffy Perl Interface Framework For You +Changes: + libspiffy-perl (0.30-1maemo1) fremantle; urgency=low + . + * New Maemo packaging +Files: + 6c7183422d3c4d9d10dd7be14fa8b3e8 508 perl optional libspiffy-perl_0.30-1maemo1.dsc + a3a3a00d05a84b8d1d3100726311c3e0 2999 perl optional libspiffy-perl_0.30-1maemo1.diff.gz + 3953138558b8d17d3d381afb76757871 26018 perl optional libspiffy-perl_0.30-1maemo1_all.deb diff --git a/deb-src/libspiffy-perl/libspiffy-perl_0.30.orig.tar.gz b/deb-src/libspiffy-perl/libspiffy-perl_0.30.orig.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ab189cd39ac18f3a1c52d45dd6e52018993ed6a2 GIT binary patch literal 27631 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 literal 0 HcmV?d00001 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/Changes b/deb-src/libtest-base-perl/libtest-base-perl-0.54/Changes new file mode 100644 index 0000000..5974310 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/Changes @@ -0,0 +1,285 @@ +--- +version: 0.54 +date: Wed Nov 29 15:21:02 PST 2006 +changes: +- Make dependency on Filter::Util::Call explicit in Makefile.PL + Thanks to Adriano Ferreira +--- +version: 0.53 +date: Wed Nov 29 15:21:02 PST 2006 +changes: +- Changes from miyagawa and crew +--- +version: 0.52 +date: Mon Jun 19 10:44:53 PDT 2006 +changes: +- Add use_ok to exports +--- +version: 0.51 +date: Fri Jun 16 13:05:22 PDT 2006 +changes: +- Remove build-requires dep of Spiffy for Module::Install::TestBase +- Add in a patch from the good folk at Socialtext. +--- +version: 0.50 +date: Mon Jan 30 10:52:52 PST 2006 +changes: +- No change. 0.49 got borked on the way to CPAN +--- +version: 0.49 +date: Mon Jan 30 10:52:48 PST 2006 +changes: +- Added Module::Install::TestBase +--- +version: 0.48 +date: Sun Jan 29 10:19:46 PST 2006 +changes: +- Fixed test failures on windows +--- +version: 0.47 +date: Thu Jan 19 10:59:37 PST 2006 +changes: +- Depend on newer Spiffy 0.29 +--- +version: 0.46 +date: Sat Jan 14 05:46:31 PST 2006 +changes: +- Don't sign the distribution tarball +- Don't require the diffing stuff +--- +version: 0.45 +date: Mon Jan 9 20:58:04 PST 2006 +changes: +- Let multilevel inheritance work! +- no_diff function turns off diffing. +--- +version: 0.44 +date: Fri Jul 22 23:38:04 PDT 2005 +changes: +- Bug fix in is_diff from rking +- Allow Test::Base to be required without trying to run tests +- allow ONLY|LAST|SKIP with run_* implicit names. +--- +version: 0.43 +date: Sun Jun 19 03:14:40 PDT 2005 +changes: +- change Test::Base::Filter::block to current_block. +- change Test::Base::Filter::arguments to current_arguments. +- add split and Split filters +- add join and Join filters +- add reverse and Reverse filters +- add hash filter +- allow (parens) around a data section name for readability. +- allow regexps on split +- allow for compact, one-line data sections +- allow for repeated filters +- detect sections names automatically +- import XXX stuff into Filter class +- add run_compare +- automatically set no_plan sometimes +- automatically run run_compare if no plan set at END +- massive refactoring of all tests +--- +version: 0.42 +date: Tue Jun 14 09:31:25 PDT 2005 +changes: +- Make any block method callable with a dummy AUTOLOAD +--- +version: 0.41 +date: Sun Jun 12 15:49:15 PDT 2005 +changes: +- Add first_block() function +- Split Test::Base::Filter into a separate module +--- +version: 0.40 +date: Sat Jun 11 20:55:42 PDT 2005 +changes: +- Change name from Test::Chunks to more lofty Test::Base +- Change concept of "chunks" to "blocks" +--- +version: 0.38 +date: Wed Jun 8 00:33:00 PDT 2005 +changes: +- Allow simple substitutions on $_ in filters defined in `main::` +- Add a filter_arguments() function +- Fixed a undef warning in `is()` +--- +version: 0.37 +date: Tue Jun 7 11:04:07 PDT 2005 +changes: +- Implement rking style diff_is +- Add filters: exec_perl_stdout +--- +version: 0.36 +date: Sun Jun 5 11:49:54 PDT 2005 +changes: +- add tie_output support +- suppress warning in accessor +- support backslash escapes in filter arguments +- New filters: unchomp chop append eval_stdout eval_stderr eval_all +- Add join string to join filter +- Add a Test-Less index +--- +version: 0.35 +date: Thu Jun 2 17:46:30 PDT 2005 +changes: +- Subtle filter bug fixed +--- +version: 0.34 +date: Sat May 28 23:55:49 PDT 2005 +changes: +- Allow "late" call of `filters`. +- Allow for appending filters that are predefined. +--- +version: 0.33 +date: Sat May 28 23:55:41 PDT 2005 +changes: +- Support `next_chunk` iterator. +--- +version: 0.32 +date: Tue May 24 08:03:57 PDT 2005 +changes: +- Add a method to access filter arguments +- Curry `use` args to Test::More +- Change base64 filter to base64_decode base64_encode +- Apply filter just before dispatch in run() +- Apply filters in order +- Default to Test::Chunks inline classes for subclassing modules (for + Filter and Chunks) +--- +version: 0.31 +date: Mon May 23 20:48:28 PDT 2005 +changes: +- Guess names for chunk_class and filter_class. Easier subclassing. +--- +version: 0.30 +date: Mon May 23 16:39:23 PDT 2005 +changes: +- Further delay filtering by no running filters when chunks is called in + scalar context. +--- +version: 0.29 +date: Sun May 22 21:30:02 PDT 2005 +changes: +- add filters_delay function +- add run_filters method to Test::Chunks::Chunk +- Refactor many methods into Test::Chunks::Chunk +- Expose internals to the filter methods by providing a `chunk` method to the + Filter object. +--- +version: 0.28 +date: Wed May 11 17:13:19 PDT 2005 +changes: +- Make running of the filters be lazy to avoid undesired side effects when not + running all tests. May want to be even lazier in the future... +--- +version: 0.27 +date: Tue May 10 17:01:18 PDT 2005 +changes: +- Added run_unlike +--- +version: 0.26 +date: Mon May 9 07:57:58 PDT 2005 +changes: +- Embed perl code in a test specification. This is still experimental and + undocumented. +--- +version: 0.25 +date: +changes: +- Add `LAST` special section name to stop at a certain test. +- Add test for strict/warnings filter. +- Change 'description' method to 'name'. +- Add a description method for the multiline description. +--- +version: 0.24 +date: Thu May 5 01:54:29 PDT 2005 +changes: +- Refactored delimiter default handling +--- +version: 0.23 +date: Thu May 5 00:33:32 PDT 2005 +changes: +- Make Test::Chunks more subclassable +- Add join filter +- General Refactorings +--- +version: 0.22 +date: Tue May 3 12:32:39 PDT 2005 +changes: +- Support a grepping feature for `chunks()` +- Ignore chunks that don't contain a specified data section for `run_*` + functions. +--- +version: 0.21 +date: Mon May 2 12:29:48 PDT 2005 +changes: +- Deprecate filters_map and just use filters with a map. +--- +version: 0.20 +date: Mon May 2 00:08:17 PDT 2005 +changes: +- Added list context to filters. Very powerful stuff. +--- +version: 0.19 +date: Sat Apr 30 17:27:09 PDT 2005 +changes: +- Add regexp flag tests +- Change -XXX to :XXX and use better Spiffy 0.24 +--- +version: 0.18 +date: Sat Apr 30 17:27:09 PDT 2005 +changes: +- Support run_is_deeply +--- +version: 0.17 +date: Sat Apr 30 12:16:03 PDT 2005 +changes: +- Allow user filters to be plain functions +- Add run_like +- Add regexp and get_url filters +- Allow run* functions to work as methods +- Remove diff_is() until implemented +--- +version: 0.16 +date: Fri Apr 29 20:04:24 PDT 2005 +changes: +- added run_is for common equality tests +- strict and dumper filters +- Can't use `Spiffy -XXX` until Spiffy exporting is fixed. +--- +version: 0.15 +date: Wed Apr 27 23:50:50 PDT 2005 +changes: +- export everything Test::More does. +- croak if things get called in the wrong order. +--- +version: 0.14 +date: Wed Apr 27 12:22:45 PDT 2005 +changes: +- Move filters into the Test::Chunks::Filter class +--- +version: 0.13 +date: Mon Apr 25 11:14:27 PDT 2005 +changes: +- add eval, yaml, list and lines filters +- support a filter_map for more flexibility +--- +version: 0.12 +date: Fri Apr 22 00:12:21 PDT 2005 +changes: +- finished the tests +- automagically add strict and warnings to every test script +--- +version: 0.11 +date: Thu Apr 21 11:26:32 PDT 2005 +changes: +- added delimiters() spec_file() spec_string() filters() functions +- implemented nice filters system +- lots more tests +- finished the doc +--- +version: 0.10 +date: Wed Apr 20 18:05:42 PDT 2005 +changes: +- Initial version of Test::Chunks diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/MANIFEST b/deb-src/libtest-base-perl/libtest-base-perl-0.54/MANIFEST new file mode 100644 index 0000000..ae9d7f9 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/MANIFEST @@ -0,0 +1,126 @@ +Changes +inc/Module/Install.pm +inc/Module/Install/Base.pm +inc/Module/Install/Can.pm +inc/Module/Install/Fetch.pm +inc/Module/Install/Makefile.pm +inc/Module/Install/Metadata.pm +inc/Module/Install/Win32.pm +inc/Module/Install/WriteAll.pm +lib/Module/Install/TestBase.pm +lib/Test/Base.pm +lib/Test/Base/Filter.pm +Makefile.PL +MANIFEST This list of files +META.yml +README +t/append.t +t/arguments.t +t/array.t +t/autoload.t +t/base64.t +t/BaseTest.pm +t/blocks-scalar.t +t/blocks_grep.t +t/chomp.t +t/chop.t +t/compact.t +t/compile.t +t/delimiters.t +t/description.t +t/diff_is.t +t/dos_spec +t/dumper.t +t/embed_perl.t +t/escape.t +t/eval.t +t/eval_all.t +t/eval_stderr.t +t/eval_stdout.t +t/export.t +t/filter_arguments.t +t/filter_delay.t +t/filter_functions.t +t/filters-append.t +t/filters.t +t/filters_map.t +t/first_block.t +t/flatten.t +t/get_url.t +t/hash.t +t/head.t +t/internals.t +t/is.t +t/jit-run.t +t/join-deep.t +t/join.t +t/last.t +t/late.t +t/lazy-filters.t +t/lines.t +t/list.t +t/main_filters.t +t/multi-level-inherit.t +t/name.t +t/next.t +t/no_diff.t +t/no_plan.t +t/normalize.t +t/only-with-implicit.t +t/only.t +t/oo.t +t/oo_run.t +t/parentheses.t +t/prepend.t +t/preserve-order.t +t/prototypes.t +t/quick-plan.t +t/quick_test.t +t/read_file.t +t/regexp.t +t/repeated-filters.t +t/require.t +t/reserved_names.t +t/reverse-deep.t +t/reverse.t +t/run-args.t +t/run_compare.t +t/run_is.t +t/run_is_deeply.t +t/run_like.t +t/run_unlike.t +t/sample-file.txt +t/simple.t +t/skip.t +t/slice.t +t/sort-deep.t +t/sort.t +t/spec1 +t/spec2 +t/spec_file.t +t/spec_string.t +t/split-deep.t +t/split-regexp.t +t/split.t +t/strict-warnings.t +t/strict-warnings.test +t/strict.t +t/subclass-autoclass.t +t/subclass-import.t +t/Subclass.pm +t/subclass.t +t/subclass_late.t +t/tail.t +t/Test-Less/index.txt +t/TestA.pm +t/TestB.pm +t/TestBass.pm +t/TestC.pm +t/tie_output.t +t/trim.t +t/unchomp.t +t/use-test-more.t +t/write_file.t +t/xxx.t +t/yaml.t +t/zero-blocks.t diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/META.yml b/deb-src/libtest-base-perl/libtest-base-perl-0.54/META.yml new file mode 100644 index 0000000..76350ec --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/META.yml @@ -0,0 +1,16 @@ +abstract: A Data Driven Testing Framework +author: "Ingy d\xC3\xB6t Net " +distribution_type: module +generated_by: Module::Install version 0.64 +license: perl +name: Test-Base +no_index: + directory: + - inc + - t +requires: + Filter::Util::Call: 0 + Spiffy: 0.30 + Test::More: 0.62 + perl: 5.6.1 +version: 0.54 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/Makefile.PL b/deb-src/libtest-base-perl/libtest-base-perl-0.54/Makefile.PL new file mode 100644 index 0000000..ac876b8 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/Makefile.PL @@ -0,0 +1,13 @@ +use inc::Module::Install; + +name 'Test-Base'; +all_from 'lib/Test/Base.pm'; + +requires perl => '5.6.1'; +requires Spiffy => '0.30'; +requires Test::More => '0.62'; +requires Filter::Util::Call => '0'; + +clean_files 't/output'; + +WriteAll; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/README b/deb-src/libtest-base-perl/libtest-base-perl-0.54/README new file mode 100644 index 0000000..e87d1a4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/README @@ -0,0 +1,630 @@ +NAME + Test::Base - A Data Driven Testing Framework + +SYNOPSIS + A new test module: + + # lib/MyProject/Test.pm + package MyProject::Test; + use Test::Base -Base; + + use MyProject; + + package MyProject::Test::Filter; + use Test::Base::Filter -base; + + sub my_filter { + return MyProject->do_something(shift); + } + + A sample test: + + # t/sample.t + use MyProject::Test; + + plan tests => 1 * blocks; + + run_is input => 'expected'; + + sub local_filter { + s/my/your/; + } + + __END__ + + === Test one (the name of the test) + --- input my_filter local_filter + my + input + lines + --- expected + expected + output + + === Test two + This is an optional description + of this particular test. + --- input my_filter + other + input + lines + --- expected + other expected + output + +DESCRIPTION + Testing is usually the ugly part of Perl module authoring. Perl gives + you a standard way to run tests with Test::Harness, and basic testing + primitives with Test::More. After that you are pretty much on your own + to develop a testing framework and philosophy. Test::More encourages you + to make your own framework by subclassing Test::Builder, but that is not + trivial. + + Test::Base gives you a way to write your own test framework base class + that *is* trivial. In fact it is as simple as two lines: + + package MyTestFramework; + use Test::Base -Base; + + A module called "MyTestFramework.pm" containing those two lines, will + give all the power of Test::More and all the power of Test::Base to + every test file that uses it. As you build up the capabilities of + "MyTestFramework", your tests will have all of that power as well. + + "MyTestFramework" becomes a place for you to put all of your reusable + testing bits. As you write tests, you will see patterns and duplication, + and you can "upstream" them into "MyTestFramework". Of course, you don't + have to subclass Test::Base at all. You can use it directly in many + applications, including everywhere you would use Test::More. + + Test::Base concentrates on offering reusable data driven patterns, so + that you can write tests with a minimum of code. At the heart of all + testing you have inputs, processes and expected outputs. Test::Base + provides some clean ways for you to express your input and expected + output data, so you can spend your time focusing on that rather than + your code scaffolding. + +EXPORTED FUNCTIONS + Test::Base extends Test::More and exports all of its functions. So you + can basically write your tests the same as Test::More. Test::Base also + exports many functions of its own: + + is(actual, expected, [test-name]) + This is the equivalent of Test::More's "is" function with one + interesting twist. If your actual and expected results differ and the + output is multi-line, this function will show you a unified diff format + of output. Consider the benefit when looking for the one character that + is different in hundreds of lines of output! + + Diff output requires the optional "Text::Diff" CPAN module. If you don't + have this module, the "is()" function will simply give you normal + Test::More output. To disable diffing altogether, set the + "TEST_SHOW_NO_DIFFS" environment variable (or $ENV{TEST_SHOW_NO_DIFFS}) + to a true value. You can also call the "no_diff" function as a shortcut. + + blocks( [data-section-name] ) + The most important function is "blocks". In list context it returns a + list of "Test::Base::Block" objects that are generated from the test + specification in the "DATA" section of your test file. In scalar context + it returns the number of objects. This is useful to calculate your + Test::More plan. + + Each Test::Base::Block object has methods that correspond to the names + of that object's data sections. There is also a "name" and a + "description" method for accessing those parts of the block if they were + specified. + + The "blocks" function can take an optional single argument, that + indicates to only return the blocks that contain a particular named data + section. Otherwise "blocks" returns all blocks. + + my @all_of_my_blocks = blocks; + + my @just_the_foo_blocks = blocks('foo'); + + next_block() + You can use the next_block function to iterate over all the blocks. + + while (my $block = next_block) { + ... + } + + It returns undef after all blocks have been iterated over. It can then + be called again to reiterate. + + first_block() + Returns the first block or undef if there are none. It resets the + iterator to the "next_block" function. + + run(&subroutine) + There are many ways to write your tests. You can reference each block + individually or you can loop over all the blocks and perform a common + operation. The "run" function does the looping for you, so all you need + to do is pass it a code block to execute for each block. + + The "run" function takes a subroutine as an argument, and calls the sub + one time for each block in the specification. It passes the current + block object to the subroutine. + + run { + my $block = shift; + is(process($block->foo), $block->bar, $block->name); + }; + + run_is([data_name1, data_name2]) + Many times you simply want to see if two data sections are equivalent in + every block, probably after having been run through one or more filters. + With the "run_is" function, you can just pass the names of any two data + sections that exist in every block, and it will loop over every block + comparing the two sections. + + run_is 'foo', 'bar'; + + If no data sections are given "run_is" will try to detect them + automatically. + + NOTE: Test::Base will silently ignore any blocks that don't contain both + sections. + + run_is_deeply([data_name1, data_name2]) + Like "run_is" but uses "is_deeply" for complex data structure + comparison. + + run_like([data_name, regexp | data_name]); + The "run_like" function is similar to "run_is" except the second + argument is a regular expression. The regexp can either be a "qr{}" + object or a data section that has been filtered into a regular + expression. + + run_like 'foo', qr{ [qw(chomp lines)], + yyy => ['yaml'], + zzz => 'eval', + }; + + If a filters list has only one element, the array ref is optional. + + filters_delay( [1 | 0] ); + By default Test::Base::Block objects are have all their filters run + ahead of time. There are testing situations in which it is advantageous + to delay the filtering. Calling this function with no arguments or a + true value, causes the filtering to be delayed. + + use Test::Base; + filters_delay; + plan tests => 1 * blocks; + for my $block (blocks) { + ... + $block->run_filters; + ok($block->is_filtered); + ... + } + + In the code above, the filters are called manually, using the + "run_filters" method of Test::Base::Block. In functions like "run_is", + where the tests are run automatically, filtering is delayed until right + before the test. + + filter_arguments() + Return the arguments after the equals sign on a filter. + + sub my_filter { + my $args = filter_arguments; + # is($args, 'whazzup'); + ... + } + + __DATA__ + === A test + --- data my_filter=whazzup + + tie_output() + You can capture STDOUT and STDERR for operations with this function: + + my $out = ''; + tie_output(*STDOUT, $buffer); + print "Hey!\n"; + print "Che!\n"; + untie *STDOUT; + is($out, "Hey!\nChe!\n"); + + no_diff() + Turn off diff support for is() in a test file. + + default_object() + Returns the default Test::Base object. This is useful if you feel the + need to do an OO operation in otherwise functional test code. See OO + below. + + WWW() XXX() YYY() ZZZ() + These debugging functions are exported from the Spiffy.pm module. See + Spiffy for more info. + + croak() carp() cluck() confess() + You can use the functions from the Carp module without needing to import + them. Test::Base does it for you by default. + +TEST SPECIFICATION + Test::Base allows you to specify your test data in an external file, the + DATA section of your program or from a scalar variable containing all + the text input. + + A *test specification* is a series of text lines. Each test (or block) + is separated by a line containing the block delimiter and an optional + test "name". Each block is further subdivided into named sections with a + line containing the data delimiter and the data section name. A + "description" of the test can go on lines after the block delimiter but + before the first data section. + + Here is the basic layout of a specification: + + === + + --- + + --- + + --- + + + === + + --- + + --- + + --- + + + Here is a code example: + + use Test::Base; + + delimiters qw(### :::); + + # test code here + + __END__ + + ### Test One + We want to see if foo and bar + are really the same... + ::: foo + a foo line + another foo line + + ::: bar + a bar line + another bar line + + ### Test Two + + ::: foo + some foo line + some other foo line + + ::: bar + some bar line + some other bar line + + ::: baz + some baz line + some other baz line + + This example specifies two blocks. They both have foo and bar data + sections. The second block has a baz component. The block delimiter is + "###" and the data delimiter is ":::". + + The default block delimiter is "===" and the default data delimiter is + "---". + + There are some special data section names used for control purposes: + + --- SKIP + --- ONLY + --- LAST + + A block with a SKIP section causes that test to be ignored. This is + useful to disable a test temporarily. + + A block with an ONLY section causes only that block to be used. This is + useful when you are concentrating on getting a single test to pass. If + there is more than one block with ONLY, the first one will be chosen. + + Because ONLY is very useful for debugging and sometimes you forgot to + remove the ONLY flag before commiting to the VCS or uploading to CPAN, + Test::Base by default gives you a diag message saying *I found ONLY ... + maybe you're debugging?*. If you don't like it, use "no_diag_on_only". + + A block with a LAST section makes that block the last one in the + specification. All following blocks will be ignored. + +FILTERS + The real power in writing tests with Test::Base comes from its filtering + capabilities. Test::Base comes with an ever growing set of useful + generic filters than you can sequence and apply to various test blocks. + That means you can specify the block serialization in the most readable + format you can find, and let the filters translate it into what you + really need for a test. It is easy to write your own filters as well. + + Test::Base allows you to specify a list of filters to each data section + of each block. The default filters are "norm" and "trim". These filters + will be applied (in order) to the data after it has been parsed from the + specification and before it is set into its Test::Base::Block object. + + You can add to the default filter list with the "filters" function. You + can specify additional filters to a specific block by listing them after + the section name on a data section delimiter line. + + Example: + + use Test::Base; + + filters qw(foo bar); + filters { perl => 'strict' }; + + sub upper { uc(shift) } + + __END__ + + === Test one + --- foo trim chomp upper + ... + + --- bar -norm + ... + + --- perl eval dumper + my @foo = map { + - $_; + } 1..10; + \ @foo; + + Putting a "-" before a filter on a delimiter line, disables that filter. + + Scalar vs List + Each filter can take either a scalar or a list as input, and will return + either a scalar or a list. Since filters are chained together, it is + important to learn which filters expect which kind of input and return + which kind of output. + + For example, consider the following filter list: + + norm trim lines chomp array dumper eval + + The data always starts out as a single scalar string. "norm" takes a + scalar and returns a scalar. "trim" takes a list and returns a list, but + a scalar is a valid list. "lines" takes a scalar and returns a list. + "chomp" takes a list and returns a list. "array" takes a list and + returns a scalar (an anonymous array reference containing the list + elements). "dumper" takes a list and returns a scalar. "eval" takes a + scalar and creates a list. + + A list of exactly one element works fine as input to a filter requiring + a scalar, but any other list will cause an exception. A scalar in list + context is considered a list of one element. + + Data accessor methods for blocks will return a list of values when used + in list context, and the first element of the list in scalar context. + This is usually "the right thing", but be aware. + + The Stock Filters + Test::Base comes with large set of stock filters. They are in the + "Test::Base::Filter" module. See Test::Base::Filter for a listing and + description of these filters. + + Rolling Your Own Filters + Creating filter extensions is very simple. You can either write a + *function* in the "main" namespace, or a *method* in the + "Test::Base::Filter" namespace or a subclass of it. In either case the + text and any extra arguments are passed in and you return whatever you + want the new value to be. + + Here is a self explanatory example: + + use Test::Base; + + filters 'foo', 'bar=xyz'; + + sub foo { + transform(shift); + } + + sub Test::Base::Filter::bar { + my $self = shift; # The Test::Base::Filter object + my $data = shift; + my $args = $self->current_arguments; + my $current_block_object = $self->block; + # transform $data in a barish manner + return $data; + } + + If you use the method interface for a filter, you can access the block + internals by calling the "block" method on the filter object. + + Normally you'll probably just use the functional interface, although all + the builtin filters are methods. + + Note that filters defined in the "main" namespace can look like: + + sub filter9 { + s/foo/bar/; + } + + since Test::Base automatically munges the input string into $_ variable + and checks the return value of the function to see if it looks like a + number. If you must define a filter that returns just a single number, + do it in a different namespace as a method. These filters don't allow + the simplistic $_ munging. + +OO + Test::Base has a nice functional interface for simple usage. Under the + hood everything is object oriented. A default Test::Base object is + created and all the functions are really just method calls on it. + + This means if you need to get fancy, you can use all the object oriented + stuff too. Just create new Test::Base objects and use the functions as + methods. + + use Test::Base; + my $blocks1 = Test::Base->new; + my $blocks2 = Test::Base->new; + + $blocks1->delimiters(qw(!!! @@@))->spec_file('test1.txt'); + $blocks2->delimiters(qw(### $$$))->spec_string($test_data); + + plan tests => $blocks1->blocks + $blocks2->blocks; + + # ... etc + +THE "Test::Base::Block" CLASS + In Test::Base, blocks are exposed as Test::Base::Block objects. This + section lists the methods that can be called on a Test::Base::Block + object. Of course, each data section name is also available as a method. + + name() + This is the optional short description of a block, that is specified on + the block separator line. + + description() + This is an optional long description of the block. It is the text taken + from between the block separator and the first data section. + + seq_num() + Returns a sequence number for this block. Sequence numbers begin with 1. + + blocks_object() + Returns the Test::Base object that owns this block. + + run_filters() + Run the filters on the data sections of the blocks. You don't need to + use this method unless you also used the "filters_delay" function. + + is_filtered() + Returns true if filters have already been run for this block. + + original_values() + Returns a hash of the original, unfiltered values of each data section. + +SUBCLASSING + One of the nicest things about Test::Base is that it is easy to + subclass. This is very important, because in your personal project, you + will likely want to extend Test::Base with your own filters and other + reusable pieces of your test framework. + + Here is an example of a subclass: + + package MyTestStuff; + use Test::Base -Base; + + our @EXPORT = qw(some_func); + + sub some_func { + (my ($self), @_) = find_my_self(@_); + ... + } + + package MyTestStuff::Block; + use base 'Test::Base::Block'; + + sub desc { + $self->description(@_); + } + + package MyTestStuff::Filter; + use base 'Test::Base::Filter'; + + sub upper { + $self->assert_scalar(@_); + uc(shift); + } + + Note that you don't have to re-Export all the functions from Test::Base. + That happens automatically, due to the powers of Spiffy. + + The first line in "some_func" allows it to be called as either a + function or a method in the test code. + +DISTRIBUTION SUPPORT + You might be thinking that you do not want to use Test::Base in you + modules, because it adds an installation dependency. Fear not. + Module::Install takes care of that. + + Just write a Makefile.PL that looks something like this: + + use inc::Module::Install; + + name 'Foo'; + all_from 'lib/Foo.pm'; + + use_test_base; + + WriteAll; + + The line with "use_test_base" will automatically bundle all the code the + user needs to run Test::Base based tests. + +OTHER COOL FEATURES + Test::Base automatically adds: + + use strict; + use warnings; + + to all of your test scripts and Test::Base subclasses. A Spiffy feature + indeed. + +HISTORY + This module started its life with the horrible and ridicule inducing + name "Test::Chunks". It was renamed to "Test::Base" with the hope that + it would be seen for the very useful module that it has become. If you + are switching from "Test::Chunks" to "Test::Base", simply substitute the + concept and usage of "chunks" to "blocks". + +AUTHOR + Ingy döt Net + +COPYRIGHT + Copyright (c) 2006. Ingy döt Net. All rights reserved. Copyright (c) + 2005. Brian Ingerson. All rights reserved. + + This program is free software; you can redistribute it and/or modify it + under the same terms as Perl itself. + + See http://www.perl.com/perl/misc/Artistic.html + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/changelog b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/changelog new file mode 100644 index 0000000..5366e9a --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/changelog @@ -0,0 +1,45 @@ +libtest-base-perl (0.54-1maemo1) fremantle; urgency=low + + * New Maemo packaging + + -- Nito Martinez Wed, 14 Apr 2010 07:07:08 +0100 + + +llibtest-base-perl (0.54-1) unstable; urgency=low + + [ gregor herrmann ] + * Take over for the Debian Perl Group with maintainer's permission + (http://lists.debian.org/debian-perl/2008/06/msg00039.html) + * debian/control: Added: Vcs-Svn field (source stanza); Vcs-Browser + field (source stanza); Homepage field (source stanza). Changed: + Maintainer set to Debian Perl Group (was: Florian Ragwitz + ); Florian Ragwitz moved to + Uploaders. + * Add debian/watch. + + [ Damyan Ivanov ] + * New upstream release + Make the (build-)dependency on libspiffy-perl versioned + * add libyaml-perl to B-D-I enabling additional tests + * trim debian/rules using debhelper 7 + * add myself to Uploaders + * Standards-Version: 3.8.0 (no changes needed) + + -- Damyan Ivanov Tue, 01 Jul 2008 13:30:24 +0300 + +libtest-base-perl (0.47-1.1) unstable; urgency=low + + * Non-maintainer upload. + * Empty dir is gone (closes: #467774) + * Fix failing test to skip for now: Maintainer: please look + * utf-8-ize debian/changelog + * Update Standards-Version (no changes) + + -- Stephen Gran Sun, 06 Apr 2008 01:56:24 +0100 + +libtest-base-perl (0.47-1) unstable; urgency=low + + * Initial release. + + -- Florian Ragwitz Tue, 24 Jan 2006 02:13:08 +0100 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/compat b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/compat @@ -0,0 +1 @@ +7 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/control b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/control new file mode 100644 index 0000000..350dc05 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/control @@ -0,0 +1,45 @@ +Source: libtest-base-perl +Section: perl +Priority: optional +Build-Depends: debhelper7 +Build-Depends-Indep: perl (>= 5.6), libspiffy-perl (>= 0.30), + libtest-simple-perl (>= 0.62), libalgorithm-diff-perl, libtext-diff-perl, + libyaml-perl +Maintainer: Debian Perl Group +Uploaders: Florian Ragwitz , Damyan Ivanov +Standards-Version: 3.8.0 +Homepage: http://search.cpan.org/dist/Test-Base/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libtest-base-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libtest-base-perl/ + +Package: libtest-base-perl +Architecture: all +Depends: ${perl:Depends}, libspiffy-perl (>= 0.30), libalgorithm-diff-perl, libtext-diff-perl, libtest-simple-perl (>= 0.6.2) +Description: A data driven testing framework for Perl + Testing is usually the ugly part of Perl module authoring. Perl gives you a + standard way to run tests with Test::Harness, and basic testing primitives + with Test::More. After that you are pretty much on your own to develop a + testing framework and philosophy. Test::More encourages you to make your own + framework by subclassing Test::Builder, but that is not trivial. + . + Test::Base gives you a way to write your own test framework base class that is + trivial. In fact it is as simple as two lines: + package MyTestFramework; + use Test::Base -Base; + . + A module called MyTestFramework.pm containing those two lines, will give all + the power of Test::More and all the power of Test::Base to every test file + that uses it. As you build up the capabilities of MyTestFramework, your tests + will have all of that power as well. + . + MyTestFramework becomes a place for you to put all of your reusable testing + bits. As you write tests, you will see patterns and duplication, and you can + "upstream" them into MyTestFramework. Of course, you don't have to subclass + Test::Base at all. You can use it directly in many applications, including + everywhere you would use Test::More. + . + Test::Base concentrates on offering reusable data driven patterns, so that you + can write tests with a minimum of code. At the heart of all testing you have + inputs, processes and expected outputs. Test::Base provides some clean ways + for you to express your input and expected output data, so you can spend your + time focusing on that rather than your code scaffolding. diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/copyright b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/copyright new file mode 100644 index 0000000..6e95eb6 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/copyright @@ -0,0 +1,15 @@ +This is the debian package for the Test::Base Perl module. + +Florian Ragwitz created this Debian package using +original Test::Base sources, as found on the Comprehensive Perl Archive +Network (CPAN) . + +The upstream author is Ingy döt Net . + +Copyright (c) 2006. Ingy döt Net. All rights reserved. +Copyright (c) 2005. Brian Ingerson. All rights reserved. + +libtest-base-perl may be redistributed under the terms of either the GNU +General Public License or the Artistic License. On a Debian GNU/Linux +systems, the complete text of these licenses may be found in the files +/usr/share/common-licenses/{GPL,Artistic}. diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/rules b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/rules new file mode 100755 index 0000000..0d045f4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/rules @@ -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/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/watch b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/watch new file mode 100644 index 0000000..06139b8 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Test-Base/ .+/Test-Base-v?(\d[\d_.-]+)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip)$ diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install.pm new file mode 100644 index 0000000..0330b0e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install.pm @@ -0,0 +1,281 @@ +#line 1 +package Module::Install; + +# For any maintainers: +# The load order for Module::Install is a bit magic. +# It goes something like this... +# +# IF ( host has Module::Install installed, creating author mode ) { +# 1. Makefile.PL calls "use inc::Module::Install" +# 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install +# 3. The installed version of inc::Module::Install loads +# 4. inc::Module::Install calls "require Module::Install" +# 5. The ./inc/ version of Module::Install loads +# } ELSE { +# 1. Makefile.PL calls "use inc::Module::Install" +# 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install +# 3. The ./inc/ version of Module::Install loads +# } + +use 5.004; +use strict 'vars'; + +use vars qw{$VERSION}; +BEGIN { + # All Module::Install core packages now require synchronised versions. + # This will be used to ensure we don't accidentally load old or + # different versions of modules. + # This is not enforced yet, but will be some time in the next few + # releases once we can make sure it won't clash with custom + # Module::Install extensions. + $VERSION = '0.64'; +} + +# Whether or not inc::Module::Install is actually loaded, the +# $INC{inc/Module/Install.pm} is what will still get set as long as +# the caller loaded module this in the documented manner. +# If not set, the caller may NOT have loaded the bundled version, and thus +# they may not have a MI version that works with the Makefile.PL. This would +# result in false errors or unexpected behaviour. And we don't want that. +my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; +unless ( $INC{$file} ) { + die <<"END_DIE"; +Please invoke ${\__PACKAGE__} with: + + use inc::${\__PACKAGE__}; + +not: + + use ${\__PACKAGE__}; + +END_DIE +} + +# If the script that is loading Module::Install is from the future, +# then make will detect this and cause it to re-run over and over +# again. This is bad. Rather than taking action to touch it (which +# is unreliable on some platforms and requires write permissions) +# for now we should catch this and refuse to run. +if ( -f $0 and (stat($0))[9] > time ) { + die << "END_DIE"; +Your installer $0 has a modification time in the future. + +This is known to create infinite loops in make. + +Please correct this, then run $0 again. + +END_DIE +} + +use Cwd (); +use File::Find (); +use File::Path (); +use FindBin; + +*inc::Module::Install::VERSION = *VERSION; +@inc::Module::Install::ISA = __PACKAGE__; + +sub autoload { + my $self = shift; + my $who = $self->_caller; + my $cwd = Cwd::cwd(); + my $sym = "${who}::AUTOLOAD"; + $sym->{$cwd} = sub { + my $pwd = Cwd::cwd(); + if ( my $code = $sym->{$pwd} ) { + # delegate back to parent dirs + goto &$code unless $cwd eq $pwd; + } + $$sym =~ /([^:]+)$/ or die "Cannot autoload $who - $sym"; + unshift @_, ($self, $1); + goto &{$self->can('call')} unless uc($1) eq $1; + }; +} + +sub import { + my $class = shift; + my $self = $class->new(@_); + my $who = $self->_caller; + + unless ( -f $self->{file} ) { + require "$self->{path}/$self->{dispatch}.pm"; + File::Path::mkpath("$self->{prefix}/$self->{author}"); + $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); + $self->{admin}->init; + @_ = ($class, _self => $self); + goto &{"$self->{name}::import"}; + } + + *{"${who}::AUTOLOAD"} = $self->autoload; + $self->preload; + + # Unregister loader and worker packages so subdirs can use them again + delete $INC{"$self->{file}"}; + delete $INC{"$self->{path}.pm"}; +} + +sub preload { + my ($self) = @_; + + unless ( $self->{extensions} ) { + $self->load_extensions( + "$self->{prefix}/$self->{path}", $self + ); + } + + my @exts = @{$self->{extensions}}; + unless ( @exts ) { + my $admin = $self->{admin}; + @exts = $admin->load_all_extensions; + } + + my %seen; + foreach my $obj ( @exts ) { + while (my ($method, $glob) = each %{ref($obj) . '::'}) { + next unless $obj->can($method); + next if $method =~ /^_/; + next if $method eq uc($method); + $seen{$method}++; + } + } + + my $who = $self->_caller; + foreach my $name ( sort keys %seen ) { + *{"${who}::$name"} = sub { + ${"${who}::AUTOLOAD"} = "${who}::$name"; + goto &{"${who}::AUTOLOAD"}; + }; + } +} + +sub new { + my ($class, %args) = @_; + + # ignore the prefix on extension modules built from top level. + my $base_path = Cwd::abs_path($FindBin::Bin); + unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) { + delete $args{prefix}; + } + + return $args{_self} if $args{_self}; + + $args{dispatch} ||= 'Admin'; + $args{prefix} ||= 'inc'; + $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); + $args{bundle} ||= 'inc/BUNDLES'; + $args{base} ||= $base_path; + $class =~ s/^\Q$args{prefix}\E:://; + $args{name} ||= $class; + $args{version} ||= $class->VERSION; + unless ( $args{path} ) { + $args{path} = $args{name}; + $args{path} =~ s!::!/!g; + } + $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; + + bless( \%args, $class ); +} + +sub call { + my ($self, $method) = @_; + my $obj = $self->load($method) or return; + splice(@_, 0, 2, $obj); + goto &{$obj->can($method)}; +} + +sub load { + my ($self, $method) = @_; + + $self->load_extensions( + "$self->{prefix}/$self->{path}", $self + ) unless $self->{extensions}; + + foreach my $obj (@{$self->{extensions}}) { + return $obj if $obj->can($method); + } + + my $admin = $self->{admin} or die <<"END_DIE"; +The '$method' method does not exist in the '$self->{prefix}' path! +Please remove the '$self->{prefix}' directory and run $0 again to load it. +END_DIE + + my $obj = $admin->load($method, 1); + push @{$self->{extensions}}, $obj; + + $obj; +} + +sub load_extensions { + my ($self, $path, $top) = @_; + + unless ( grep { lc $_ eq lc $self->{prefix} } @INC ) { + unshift @INC, $self->{prefix}; + } + + foreach my $rv ( $self->find_extensions($path) ) { + my ($file, $pkg) = @{$rv}; + next if $self->{pathnames}{$pkg}; + + local $@; + my $new = eval { require $file; $pkg->can('new') }; + unless ( $new ) { + warn $@ if $@; + next; + } + $self->{pathnames}{$pkg} = delete $INC{$file}; + push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); + } + + $self->{extensions} ||= []; +} + +sub find_extensions { + my ($self, $path) = @_; + + my @found; + File::Find::find( sub { + my $file = $File::Find::name; + return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; + my $subpath = $1; + return if lc($subpath) eq lc($self->{dispatch}); + + $file = "$self->{path}/$subpath.pm"; + my $pkg = "$self->{name}::$subpath"; + $pkg =~ s!/!::!g; + + # If we have a mixed-case package name, assume case has been preserved + # correctly. Otherwise, root through the file to locate the case-preserved + # version of the package name. + if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { + open PKGFILE, "<$subpath.pm" or die "find_extensions: Can't open $subpath.pm: $!"; + my $in_pod = 0; + while ( ) { + $in_pod = 1 if /^=\w/; + $in_pod = 0 if /^=cut/; + next if ($in_pod || /^=cut/); # skip pod text + next if /^\s*#/; # and comments + if ( m/^\s*package\s+($pkg)\s*;/i ) { + $pkg = $1; + last; + } + } + close PKGFILE; + } + + push @found, [ $file, $pkg ]; + }, $path ) if -d $path; + + @found; +} + +sub _caller { + my $depth = 0; + my $call = caller($depth); + while ( $call eq __PACKAGE__ ) { + $depth++; + $call = caller($depth); + } + return $call; +} + +1; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Base.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Base.pm new file mode 100644 index 0000000..30a24ca --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Base.pm @@ -0,0 +1,70 @@ +#line 1 +package Module::Install::Base; + +$VERSION = '0.64'; + +# Suspend handler for "redefined" warnings +BEGIN { + my $w = $SIG{__WARN__}; + $SIG{__WARN__} = sub { $w }; +} + +### This is the ONLY module that shouldn't have strict on +# use strict; + +#line 41 + +sub new { + my ($class, %args) = @_; + + foreach my $method ( qw(call load) ) { + *{"$class\::$method"} = sub { + shift()->_top->$method(@_); + } unless defined &{"$class\::$method"}; + } + + bless( \%args, $class ); +} + +#line 61 + +sub AUTOLOAD { + my $self = shift; + local $@; + my $autoload = eval { $self->_top->autoload } or return; + goto &$autoload; +} + +#line 76 + +sub _top { $_[0]->{_top} } + +#line 89 + +sub admin { + $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; +} + +sub is_admin { + $_[0]->admin->VERSION; +} + +sub DESTROY {} + +package Module::Install::Base::FakeAdmin; + +my $Fake; +sub new { $Fake ||= bless(\@_, $_[0]) } + +sub AUTOLOAD {} + +sub DESTROY {} + +# Restore warning handler +BEGIN { + $SIG{__WARN__} = $SIG{__WARN__}->(); +} + +1; + +#line 138 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Can.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Can.pm new file mode 100644 index 0000000..1c01e22 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Can.pm @@ -0,0 +1,82 @@ +#line 1 +package Module::Install::Can; + +use strict; +use Module::Install::Base; +use Config (); +### This adds a 5.005 Perl version dependency. +### This is a bug and will be fixed. +use File::Spec (); +use ExtUtils::MakeMaker (); + +use vars qw{$VERSION $ISCORE @ISA}; +BEGIN { + $VERSION = '0.64'; + $ISCORE = 1; + @ISA = qw{Module::Install::Base}; +} + +# check if we can load some module +### Upgrade this to not have to load the module if possible +sub can_use { + my ($self, $mod, $ver) = @_; + $mod =~ s{::|\\}{/}g; + $mod .= '.pm' unless $mod =~ /\.pm$/i; + + my $pkg = $mod; + $pkg =~ s{/}{::}g; + $pkg =~ s{\.pm$}{}i; + + local $@; + eval { require $mod; $pkg->VERSION($ver || 0); 1 }; +} + +# check if we can run some command +sub can_run { + my ($self, $cmd) = @_; + + my $_cmd = $cmd; + return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); + + for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { + my $abs = File::Spec->catfile($dir, $_[1]); + return $abs if (-x $abs or $abs = MM->maybe_command($abs)); + } + + return; +} + +# can we locate a (the) C compiler +sub can_cc { + my $self = shift; + my @chunks = split(/ /, $Config::Config{cc}) or return; + + # $Config{cc} may contain args; try to find out the program part + while (@chunks) { + return $self->can_run("@chunks") || (pop(@chunks), next); + } + + return; +} + +# Fix Cygwin bug on maybe_command(); +if ( $^O eq 'cygwin' ) { + require ExtUtils::MM_Cygwin; + require ExtUtils::MM_Win32; + if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { + *ExtUtils::MM_Cygwin::maybe_command = sub { + my ($self, $file) = @_; + if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { + ExtUtils::MM_Win32->maybe_command($file); + } else { + ExtUtils::MM_Unix->maybe_command($file); + } + } + } +} + +1; + +__END__ + +#line 157 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Fetch.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Fetch.pm new file mode 100644 index 0000000..24c0c02 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Fetch.pm @@ -0,0 +1,93 @@ +#line 1 +package Module::Install::Fetch; + +use strict; +use Module::Install::Base; + +use vars qw{$VERSION $ISCORE @ISA}; +BEGIN { + $VERSION = '0.64'; + $ISCORE = 1; + @ISA = qw{Module::Install::Base}; +} + +sub get_file { + my ($self, %args) = @_; + my ($scheme, $host, $path, $file) = + $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; + + if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { + $args{url} = $args{ftp_url} + or (warn("LWP support unavailable!\n"), return); + ($scheme, $host, $path, $file) = + $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; + } + + $|++; + print "Fetching '$file' from $host... "; + + unless (eval { require Socket; Socket::inet_aton($host) }) { + warn "'$host' resolve failed!\n"; + return; + } + + return unless $scheme eq 'ftp' or $scheme eq 'http'; + + require Cwd; + my $dir = Cwd::getcwd(); + chdir $args{local_dir} or return if exists $args{local_dir}; + + if (eval { require LWP::Simple; 1 }) { + LWP::Simple::mirror($args{url}, $file); + } + elsif (eval { require Net::FTP; 1 }) { eval { + # use Net::FTP to get past firewall + my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); + $ftp->login("anonymous", 'anonymous@example.com'); + $ftp->cwd($path); + $ftp->binary; + $ftp->get($file) or (warn("$!\n"), return); + $ftp->quit; + } } + elsif (my $ftp = $self->can_run('ftp')) { eval { + # no Net::FTP, fallback to ftp.exe + require FileHandle; + my $fh = FileHandle->new; + + local $SIG{CHLD} = 'IGNORE'; + unless ($fh->open("|$ftp -n")) { + warn "Couldn't open ftp: $!\n"; + chdir $dir; return; + } + + my @dialog = split(/\n/, <<"END_FTP"); +open $host +user anonymous anonymous\@example.com +cd $path +binary +get $file $file +quit +END_FTP + foreach (@dialog) { $fh->print("$_\n") } + $fh->close; + } } + else { + warn "No working 'ftp' program available!\n"; + chdir $dir; return; + } + + unless (-f $file) { + warn "Fetching failed: $@\n"; + chdir $dir; return; + } + + return if exists $args{size} and -s $file != $args{size}; + system($args{run}) if exists $args{run}; + unlink($file) if $args{remove}; + + print(((!exists $args{check_for} or -e $args{check_for}) + ? "done!" : "failed! ($!)"), "\n"); + chdir $dir; return !$?; +} + +1; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Makefile.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Makefile.pm new file mode 100644 index 0000000..96c7e17 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Makefile.pm @@ -0,0 +1,208 @@ +#line 1 +package Module::Install::Makefile; + +use strict 'vars'; +use Module::Install::Base; +use ExtUtils::MakeMaker (); + +use vars qw{$VERSION $ISCORE @ISA}; +BEGIN { + $VERSION = '0.64'; + $ISCORE = 1; + @ISA = qw{Module::Install::Base}; +} + +sub Makefile { $_[0] } + +my %seen = (); + +sub prompt { + shift; + + # Infinite loop protection + my @c = caller(); + if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { + die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; + } + + # In automated testing, always use defaults + if ( $ENV{AUTOMATED_TESTING} and ! $ENV{PERL_MM_USE_DEFAULT} ) { + local $ENV{PERL_MM_USE_DEFAULT} = 1; + goto &ExtUtils::MakeMaker::prompt; + } else { + goto &ExtUtils::MakeMaker::prompt; + } +} + +sub makemaker_args { + my $self = shift; + my $args = ($self->{makemaker_args} ||= {}); + %$args = ( %$args, @_ ) if @_; + $args; +} + +# For mm args that take multiple space-seperated args, +# append an argument to the current list. +sub makemaker_append { + my $self = shift; + my $name = shift; + my $args = $self->makemaker_args; + $args->{name} = defined $args->{$name} + ? join( ' ', $args->{name}, @_ ) + : join( ' ', @_ ); +} + +sub build_subdirs { + my $self = shift; + my $subdirs = $self->makemaker_args->{DIR} ||= []; + for my $subdir (@_) { + push @$subdirs, $subdir; + } +} + +sub clean_files { + my $self = shift; + my $clean = $self->makemaker_args->{clean} ||= {}; + %$clean = ( + %$clean, + FILES => join(' ', grep length, $clean->{FILES}, @_), + ); +} + +sub realclean_files { + my $self = shift; + my $realclean = $self->makemaker_args->{realclean} ||= {}; + %$realclean = ( + %$realclean, + FILES => join(' ', grep length, $realclean->{FILES}, @_), + ); +} + +sub libs { + my $self = shift; + my $libs = ref $_[0] ? shift : [ shift ]; + $self->makemaker_args( LIBS => $libs ); +} + +sub inc { + my $self = shift; + $self->makemaker_args( INC => shift ); +} + +sub write { + my $self = shift; + die "&Makefile->write() takes no arguments\n" if @_; + + my $args = $self->makemaker_args; + $args->{DISTNAME} = $self->name; + $args->{NAME} = $self->module_name || $self->name || $self->determine_NAME($args); + $args->{VERSION} = $self->version || $self->determine_VERSION($args); + $args->{NAME} =~ s/-/::/g; + if ( $self->tests ) { + $args->{test} = { TESTS => $self->tests }; + } + if ($] >= 5.005) { + $args->{ABSTRACT} = $self->abstract; + $args->{AUTHOR} = $self->author; + } + if ( eval($ExtUtils::MakeMaker::VERSION) >= 6.10 ) { + $args->{NO_META} = 1; + } + if ( eval($ExtUtils::MakeMaker::VERSION) > 6.17 and $self->sign ) { + $args->{SIGN} = 1; + } + unless ( $self->is_admin ) { + delete $args->{SIGN}; + } + + # merge both kinds of requires into prereq_pm + my $prereq = ($args->{PREREQ_PM} ||= {}); + %$prereq = ( %$prereq, map { @$_ } map { @$_ } grep $_, + ($self->build_requires, $self->requires) ); + + # merge both kinds of requires into prereq_pm + my $subdirs = ($args->{DIR} ||= []); + if ($self->bundles) { + foreach my $bundle (@{ $self->bundles }) { + my ($file, $dir) = @$bundle; + push @$subdirs, $dir if -d $dir; + delete $prereq->{$file}; + } + } + + if ( my $perl_version = $self->perl_version ) { + eval "use $perl_version; 1" + or die "ERROR: perl: Version $] is installed, " + . "but we need version >= $perl_version"; + } + + my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_})} keys %$args; + if ($self->admin->preop) { + $args{dist} = $self->admin->preop; + } + + my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); + $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); +} + +sub fix_up_makefile { + my $self = shift; + my $makefile_name = shift; + my $top_class = ref($self->_top) || ''; + my $top_version = $self->_top->VERSION || ''; + + my $preamble = $self->preamble + ? "# Preamble by $top_class $top_version\n" + . $self->preamble + : ''; + my $postamble = "# Postamble by $top_class $top_version\n" + . ($self->postamble || ''); + + local *MAKEFILE; + open MAKEFILE, "< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; + my $makefile = do { local $/; }; + close MAKEFILE or die $!; + + $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; + $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; + $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; + $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; + $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; + + # Module::Install will never be used to build the Core Perl + # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks + # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist + $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; + #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; + + # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. + $makefile =~ s/("?)-I\$\(PERL_LIB\)\1//g; + + # XXX - This is currently unused; not sure if it breaks other MM-users + # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; + + open MAKEFILE, "> $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; + print MAKEFILE "$preamble$makefile$postamble" or die $!; + close MAKEFILE or die $!; + + 1; +} + +sub preamble { + my ($self, $text) = @_; + $self->{preamble} = $text . $self->{preamble} if defined $text; + $self->{preamble}; +} + +sub postamble { + my ($self, $text) = @_; + $self->{postamble} ||= $self->admin->postamble; + $self->{postamble} .= $text if defined $text; + $self->{postamble} +} + +1; + +__END__ + +#line 334 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Metadata.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Metadata.pm new file mode 100644 index 0000000..6c80832 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Metadata.pm @@ -0,0 +1,315 @@ +#line 1 +package Module::Install::Metadata; + +use strict 'vars'; +use Module::Install::Base; + +use vars qw{$VERSION $ISCORE @ISA}; +BEGIN { + $VERSION = '0.64'; + $ISCORE = 1; + @ISA = qw{Module::Install::Base}; +} + +my @scalar_keys = qw{ + name module_name abstract author version license + distribution_type perl_version tests +}; + +my @tuple_keys = qw{ + build_requires requires recommends bundles +}; + +sub Meta { shift } +sub Meta_ScalarKeys { @scalar_keys } +sub Meta_TupleKeys { @tuple_keys } + +foreach my $key (@scalar_keys) { + *$key = sub { + my $self = shift; + return $self->{values}{$key} if defined wantarray and !@_; + $self->{values}{$key} = shift; + return $self; + }; +} + +foreach my $key (@tuple_keys) { + *$key = sub { + my $self = shift; + return $self->{values}{$key} unless @_; + + my @rv; + while (@_) { + my $module = shift or last; + my $version = shift || 0; + if ( $module eq 'perl' ) { + $version =~ s{^(\d+)\.(\d+)\.(\d+)} + {$1 + $2/1_000 + $3/1_000_000}e; + $self->perl_version($version); + next; + } + my $rv = [ $module, $version ]; + push @rv, $rv; + } + push @{ $self->{values}{$key} }, @rv; + @rv; + }; +} + +sub sign { + my $self = shift; + return $self->{'values'}{'sign'} if defined wantarray and !@_; + $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 ); + return $self; +} + +sub dynamic_config { + my $self = shift; + unless ( @_ ) { + warn "You MUST provide an explicit true/false value to dynamic_config, skipping\n"; + return $self; + } + $self->{'values'}{'dynamic_config'} = $_[0] ? 1 : 0; + return $self; +} + +sub all_from { + my ( $self, $file ) = @_; + + unless ( defined($file) ) { + my $name = $self->name + or die "all_from called with no args without setting name() first"; + $file = join('/', 'lib', split(/-/, $name)) . '.pm'; + $file =~ s{.*/}{} unless -e $file; + die "all_from: cannot find $file from $name" unless -e $file; + } + + $self->version_from($file) unless $self->version; + $self->perl_version_from($file) unless $self->perl_version; + + # The remaining probes read from POD sections; if the file + # has an accompanying .pod, use that instead + my $pod = $file; + if ( $pod =~ s/\.pm$/.pod/i and -e $pod ) { + $file = $pod; + } + + $self->author_from($file) unless $self->author; + $self->license_from($file) unless $self->license; + $self->abstract_from($file) unless $self->abstract; +} + +sub provides { + my $self = shift; + my $provides = ( $self->{values}{provides} ||= {} ); + %$provides = (%$provides, @_) if @_; + return $provides; +} + +sub auto_provides { + my $self = shift; + return $self unless $self->is_admin; + + unless (-e 'MANIFEST') { + warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; + return $self; + } + + # Avoid spurious warnings as we are not checking manifest here. + + local $SIG{__WARN__} = sub {1}; + require ExtUtils::Manifest; + local *ExtUtils::Manifest::manicheck = sub { return }; + + require Module::Build; + my $build = Module::Build->new( + dist_name => $self->name, + dist_version => $self->version, + license => $self->license, + ); + $self->provides(%{ $build->find_dist_packages || {} }); +} + +sub feature { + my $self = shift; + my $name = shift; + my $features = ( $self->{values}{features} ||= [] ); + + my $mods; + + if ( @_ == 1 and ref( $_[0] ) ) { + # The user used ->feature like ->features by passing in the second + # argument as a reference. Accomodate for that. + $mods = $_[0]; + } else { + $mods = \@_; + } + + my $count = 0; + push @$features, ( + $name => [ + map { + ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ + : @$_ + : $_ + } @$mods + ] + ); + + return @$features; +} + +sub features { + my $self = shift; + while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { + $self->feature( $name, @$mods ); + } + return $self->{values}->{features} + ? @{ $self->{values}->{features} } + : (); +} + +sub no_index { + my $self = shift; + my $type = shift; + push @{ $self->{values}{no_index}{$type} }, @_ if $type; + return $self->{values}{no_index}; +} + +sub read { + my $self = shift; + $self->include_deps( 'YAML', 0 ); + + require YAML; + my $data = YAML::LoadFile('META.yml'); + + # Call methods explicitly in case user has already set some values. + while ( my ( $key, $value ) = each %$data ) { + next unless $self->can($key); + if ( ref $value eq 'HASH' ) { + while ( my ( $module, $version ) = each %$value ) { + $self->can($key)->($self, $module => $version ); + } + } + else { + $self->can($key)->($self, $value); + } + } + return $self; +} + +sub write { + my $self = shift; + return $self unless $self->is_admin; + $self->admin->write_meta; + return $self; +} + +sub version_from { + my ( $self, $file ) = @_; + require ExtUtils::MM_Unix; + $self->version( ExtUtils::MM_Unix->parse_version($file) ); +} + +sub abstract_from { + my ( $self, $file ) = @_; + require ExtUtils::MM_Unix; + $self->abstract( + bless( + { DISTNAME => $self->name }, + 'ExtUtils::MM_Unix' + )->parse_abstract($file) + ); +} + +sub _slurp { + my ( $self, $file ) = @_; + + local *FH; + open FH, "< $file" or die "Cannot open $file.pod: $!"; + do { local $/; }; +} + +sub perl_version_from { + my ( $self, $file ) = @_; + + if ( + $self->_slurp($file) =~ m/ + ^ + use \s* + v? + ([\d_\.]+) + \s* ; + /ixms + ) + { + my $v = $1; + $v =~ s{_}{}g; + $self->perl_version($1); + } + else { + warn "Cannot determine perl version info from $file\n"; + return; + } +} + +sub author_from { + my ( $self, $file ) = @_; + my $content = $self->_slurp($file); + if ($content =~ m/ + =head \d \s+ (?:authors?)\b \s* + ([^\n]*) + | + =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* + .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* + ([^\n]*) + /ixms) { + my $author = $1 || $2; + $author =~ s{E}{<}g; + $author =~ s{E}{>}g; + $self->author($author); + } + else { + warn "Cannot determine author info from $file\n"; + } +} + +sub license_from { + my ( $self, $file ) = @_; + + if ( + $self->_slurp($file) =~ m/ + =head \d \s+ + (?:licen[cs]e|licensing|copyright|legal)\b + (.*?) + (=head\\d.*|=cut.*|) + \z + /ixms + ) + { + my $license_text = $1; + my @phrases = ( + 'under the same (?:terms|license) as perl itself' => 'perl', + 'GNU public license' => 'gpl', + 'GNU lesser public license' => 'gpl', + 'BSD license' => 'bsd', + 'Artistic license' => 'artistic', + 'GPL' => 'gpl', + 'LGPL' => 'lgpl', + 'BSD' => 'bsd', + 'Artistic' => 'artistic', + ); + while ( my ( $pattern, $license ) = splice( @phrases, 0, 2 ) ) { + $pattern =~ s{\s+}{\\s+}g; + if ( $license_text =~ /\b$pattern\b/i ) { + $self->license($license); + return 1; + } + } + } + + warn "Cannot determine license info from $file\n"; + return 'unknown'; +} + +1; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Win32.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Win32.pm new file mode 100644 index 0000000..2ec7d66 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/Win32.pm @@ -0,0 +1,65 @@ +#line 1 +package Module::Install::Win32; + +use strict; +use Module::Install::Base; + +use vars qw{$VERSION $ISCORE @ISA}; +BEGIN { + $VERSION = '0.64'; + $ISCORE = 1; + @ISA = qw{Module::Install::Base}; +} + +# determine if the user needs nmake, and download it if needed +sub check_nmake { + my $self = shift; + $self->load('can_run'); + $self->load('get_file'); + + require Config; + return unless ( + $^O eq 'MSWin32' and + $Config::Config{make} and + $Config::Config{make} =~ /^nmake\b/i and + ! $self->can_run('nmake') + ); + + print "The required 'nmake' executable not found, fetching it...\n"; + + require File::Basename; + my $rv = $self->get_file( + url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', + ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', + local_dir => File::Basename::dirname($^X), + size => 51928, + run => 'Nmake15.exe /o > nul', + check_for => 'Nmake.exe', + remove => 1, + ); + + if (!$rv) { + die <<'END_MESSAGE'; + +------------------------------------------------------------------------------- + +Since you are using Microsoft Windows, you will need the 'nmake' utility +before installation. It's available at: + + http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe + or + ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe + +Please download the file manually, save it to a directory in %PATH% (e.g. +C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to +that directory, and run "Nmake15.exe" from there; that will create the +'nmake.exe' file needed by this module. + +You may then resume the installation process described in README. + +------------------------------------------------------------------------------- +END_MESSAGE + } +} + +1; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/WriteAll.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/WriteAll.pm new file mode 100644 index 0000000..3546e61 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/inc/Module/Install/WriteAll.pm @@ -0,0 +1,43 @@ +#line 1 +package Module::Install::WriteAll; + +use strict; +use Module::Install::Base; + +use vars qw{$VERSION $ISCORE @ISA}; +BEGIN { + $VERSION = '0.64'; + $ISCORE = 1; + @ISA = qw{Module::Install::Base}; +} + +sub WriteAll { + my $self = shift; + my %args = ( + meta => 1, + sign => 0, + inline => 0, + check_nmake => 1, + @_ + ); + + $self->sign(1) if $args{sign}; + $self->Meta->write if $args{meta}; + $self->admin->WriteAll(%args) if $self->is_admin; + + if ( $0 =~ /Build.PL$/i ) { + $self->Build->write; + } else { + $self->check_nmake if $args{check_nmake}; + unless ( $self->makemaker_args->{'PL_FILES'} ) { + $self->makemaker_args( PL_FILES => {} ); + } + if ($args{inline}) { + $self->Inline->write; + } else { + $self->Makefile->write; + } + } +} + +1; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Module/Install/TestBase.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Module/Install/TestBase.pm new file mode 100644 index 0000000..8ada09b --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Module/Install/TestBase.pm @@ -0,0 +1,67 @@ +package Module::Install::TestBase; +use strict; +use warnings; + +use Module::Install::Base; + +use vars qw($VERSION @ISA); +BEGIN { + $VERSION = '0.11'; + @ISA = 'Module::Install::Base'; +} + +sub use_test_base { + my $self = shift; + $self->include('Test::Base'); + $self->include('Test::Base::Filter'); + $self->include('Spiffy'); + $self->include('Test::More'); + $self->include('Test::Builder'); + $self->include('Test::Builder::Module'); +} + +1; + +=head1 NAME + +Module::Install::TestBase - Module::Install Support for Test::Base + +=head1 SYNOPSIS + + use inc::Module::Install; + + name 'Foo'; + all_from 'lib/Foo.pm'; + + use_test_base; + + WriteAll; + +=head1 DESCRIPTION + +This module adds the C directive to Module::Install. + +Now you can get full Test-Base support for you module with no external +dependency on Test::Base. + +Just add this line to your Makefile.PL: + + use_test_base; + +That's it. Really. Now Test::Base is bundled into your module, so that +it is no longer any burden on the person installing your module. + +=head1 AUTHOR + +Ingy döt Net + +=head1 COPYRIGHT + +Copyright (c) 2006. Ingy döt Net. All rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +See L + +=cut diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base.pm new file mode 100644 index 0000000..199cb41 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base.pm @@ -0,0 +1,1328 @@ +# TODO: +# +package Test::Base; +use 5.006001; +use Spiffy 0.30 -Base; +use Spiffy ':XXX'; +our $VERSION = '0.54'; + +my @test_more_exports; +BEGIN { + @test_more_exports = qw( + ok isnt like unlike is_deeply cmp_ok + skip todo_skip pass fail + eq_array eq_hash eq_set + plan can_ok isa_ok diag + use_ok + $TODO + ); +} + +use Test::More import => \@test_more_exports; +use Carp; + +our @EXPORT = (@test_more_exports, qw( + is no_diff + + blocks next_block first_block + delimiters spec_file spec_string + filters filters_delay filter_arguments + run run_compare run_is run_is_deeply run_like run_unlike + WWW XXX YYY ZZZ + tie_output no_diag_on_only + + find_my_self default_object + + croak carp cluck confess +)); + +field '_spec_file'; +field '_spec_string'; +field _filters => [qw(norm trim)]; +field _filters_map => {}; +field spec => + -init => '$self->_spec_init'; +field block_list => + -init => '$self->_block_list_init'; +field _next_list => []; +field block_delim => + -init => '$self->block_delim_default'; +field data_delim => + -init => '$self->data_delim_default'; +field _filters_delay => 0; +field _no_diag_on_only => 0; + +field block_delim_default => '==='; +field data_delim_default => '---'; + +my $default_class; +my $default_object; +my $reserved_section_names = {}; + +sub default_object { + $default_object ||= $default_class->new; + return $default_object; +} + +my $import_called = 0; +sub import() { + $import_called = 1; + my $class = (grep /^-base$/i, @_) + ? scalar(caller) + : $_[0]; + if (not defined $default_class) { + $default_class = $class; + } +# else { +# croak "Can't use $class after using $default_class" +# unless $default_class->isa($class); +# } + + unless (grep /^-base$/i, @_) { + my @args; + for (my $ii = 1; $ii <= $#_; ++$ii) { + if ($_[$ii] eq '-package') { + ++$ii; + } else { + push @args, $_[$ii]; + } + } + Test::More->import(import => \@test_more_exports, @args) + if @args; + } + + _strict_warnings(); + goto &Spiffy::import; +} + +# Wrap Test::Builder::plan +my $plan_code = \&Test::Builder::plan; +my $Have_Plan = 0; +{ + no warnings 'redefine'; + *Test::Builder::plan = sub { + $Have_Plan = 1; + goto &$plan_code; + }; +} + +my $DIED = 0; +$SIG{__DIE__} = sub { $DIED = 1; die @_ }; + +sub block_class { $self->find_class('Block') } +sub filter_class { $self->find_class('Filter') } + +sub find_class { + my $suffix = shift; + my $class = ref($self) . "::$suffix"; + return $class if $class->can('new'); + $class = __PACKAGE__ . "::$suffix"; + return $class if $class->can('new'); + eval "require $class"; + return $class if $class->can('new'); + die "Can't find a class for $suffix"; +} + +sub check_late { + if ($self->{block_list}) { + my $caller = (caller(1))[3]; + $caller =~ s/.*:://; + croak "Too late to call $caller()" + } +} + +sub find_my_self() { + my $self = ref($_[0]) eq $default_class + ? splice(@_, 0, 1) + : default_object(); + return $self, @_; +} + +sub blocks() { + (my ($self), @_) = find_my_self(@_); + + croak "Invalid arguments passed to 'blocks'" + if @_ > 1; + croak sprintf("'%s' is invalid argument to blocks()", shift(@_)) + if @_ && $_[0] !~ /^[a-zA-Z]\w*$/; + + my $blocks = $self->block_list; + + my $section_name = shift || ''; + my @blocks = $section_name + ? (grep { exists $_->{$section_name} } @$blocks) + : (@$blocks); + + return scalar(@blocks) unless wantarray; + + return (@blocks) if $self->_filters_delay; + + for my $block (@blocks) { + $block->run_filters + unless $block->is_filtered; + } + + return (@blocks); +} + +sub next_block() { + (my ($self), @_) = find_my_self(@_); + my $list = $self->_next_list; + if (@$list == 0) { + $list = [@{$self->block_list}, undef]; + $self->_next_list($list); + } + my $block = shift @$list; + if (defined $block and not $block->is_filtered) { + $block->run_filters; + } + return $block; +} + +sub first_block() { + (my ($self), @_) = find_my_self(@_); + $self->_next_list([]); + $self->next_block; +} + +sub filters_delay() { + (my ($self), @_) = find_my_self(@_); + $self->_filters_delay(defined $_[0] ? shift : 1); +} + +sub no_diag_on_only() { + (my ($self), @_) = find_my_self(@_); + $self->_no_diag_on_only(defined $_[0] ? shift : 1); +} + +sub delimiters() { + (my ($self), @_) = find_my_self(@_); + $self->check_late; + my ($block_delimiter, $data_delimiter) = @_; + $block_delimiter ||= $self->block_delim_default; + $data_delimiter ||= $self->data_delim_default; + $self->block_delim($block_delimiter); + $self->data_delim($data_delimiter); + return $self; +} + +sub spec_file() { + (my ($self), @_) = find_my_self(@_); + $self->check_late; + $self->_spec_file(shift); + return $self; +} + +sub spec_string() { + (my ($self), @_) = find_my_self(@_); + $self->check_late; + $self->_spec_string(shift); + return $self; +} + +sub filters() { + (my ($self), @_) = find_my_self(@_); + if (ref($_[0]) eq 'HASH') { + $self->_filters_map(shift); + } + else { + my $filters = $self->_filters; + push @$filters, @_; + } + return $self; +} + +sub filter_arguments() { + $Test::Base::Filter::arguments; +} + +sub have_text_diff { + eval { require Text::Diff; 1 } && + $Text::Diff::VERSION >= 0.35 && + $Algorithm::Diff::VERSION >= 1.15; +} + +sub is($$;$) { + (my ($self), @_) = find_my_self(@_); + my ($actual, $expected, $name) = @_; + local $Test::Builder::Level = $Test::Builder::Level + 1; + if ($ENV{TEST_SHOW_NO_DIFFS} or + not defined $actual or + not defined $expected or + $actual eq $expected or + not($self->have_text_diff) or + $expected !~ /\n./s + ) { + Test::More::is($actual, $expected, $name); + } + else { + $name = '' unless defined $name; + ok $actual eq $expected, + $name . "\n" . Text::Diff::diff(\$expected, \$actual); + } +} + +sub run(&;$) { + (my ($self), @_) = find_my_self(@_); + my $callback = shift; + for my $block (@{$self->block_list}) { + $block->run_filters unless $block->is_filtered; + &{$callback}($block); + } +} + +my $name_error = "Can't determine section names"; +sub _section_names { + return @_ if @_ == 2; + my $block = $self->first_block + or croak $name_error; + my @names = grep { + $_ !~ /^(ONLY|LAST|SKIP)$/; + } @{$block->{_section_order}[0] || []}; + croak "$name_error. Need two sections in first block" + unless @names == 2; + return @names; +} + +sub _assert_plan { + plan('no_plan') unless $Have_Plan; +} + +sub END { + run_compare() unless $Have_Plan or $DIED or not $import_called; +} + +sub run_compare() { + (my ($self), @_) = find_my_self(@_); + $self->_assert_plan; + my ($x, $y) = $self->_section_names(@_); + local $Test::Builder::Level = $Test::Builder::Level + 1; + for my $block (@{$self->block_list}) { + next unless exists($block->{$x}) and exists($block->{$y}); + $block->run_filters unless $block->is_filtered; + if (ref $block->$x) { + is_deeply($block->$x, $block->$y, + $block->name ? $block->name : ()); + } + elsif (ref $block->$y eq 'Regexp') { + my $regexp = ref $y ? $y : $block->$y; + like($block->$x, $regexp, $block->name ? $block->name : ()); + } + else { + is($block->$x, $block->$y, $block->name ? $block->name : ()); + } + } +} + +sub run_is() { + (my ($self), @_) = find_my_self(@_); + $self->_assert_plan; + my ($x, $y) = $self->_section_names(@_); + local $Test::Builder::Level = $Test::Builder::Level + 1; + for my $block (@{$self->block_list}) { + next unless exists($block->{$x}) and exists($block->{$y}); + $block->run_filters unless $block->is_filtered; + is($block->$x, $block->$y, + $block->name ? $block->name : () + ); + } +} + +sub run_is_deeply() { + (my ($self), @_) = find_my_self(@_); + $self->_assert_plan; + my ($x, $y) = $self->_section_names(@_); + for my $block (@{$self->block_list}) { + next unless exists($block->{$x}) and exists($block->{$y}); + $block->run_filters unless $block->is_filtered; + is_deeply($block->$x, $block->$y, + $block->name ? $block->name : () + ); + } +} + +sub run_like() { + (my ($self), @_) = find_my_self(@_); + $self->_assert_plan; + my ($x, $y) = $self->_section_names(@_); + for my $block (@{$self->block_list}) { + next unless exists($block->{$x}) and defined($y); + $block->run_filters unless $block->is_filtered; + my $regexp = ref $y ? $y : $block->$y; + like($block->$x, $regexp, + $block->name ? $block->name : () + ); + } +} + +sub run_unlike() { + (my ($self), @_) = find_my_self(@_); + $self->_assert_plan; + my ($x, $y) = $self->_section_names(@_); + for my $block (@{$self->block_list}) { + next unless exists($block->{$x}) and defined($y); + $block->run_filters unless $block->is_filtered; + my $regexp = ref $y ? $y : $block->$y; + unlike($block->$x, $regexp, + $block->name ? $block->name : () + ); + } +} + +sub _pre_eval { + my $spec = shift; + return $spec unless $spec =~ + s/\A\s*<<<(.*?)>>>\s*$//sm; + my $eval_code = $1; + eval "package main; $eval_code"; + croak $@ if $@; + return $spec; +} + +sub _block_list_init { + my $spec = $self->spec; + $spec = $self->_pre_eval($spec); + my $cd = $self->block_delim; + my @hunks = ($spec =~ /^(\Q${cd}\E.*?(?=^\Q${cd}\E|\z))/msg); + my $blocks = $self->_choose_blocks(@hunks); + $self->block_list($blocks); # Need to set early for possible filter use + my $seq = 1; + for my $block (@$blocks) { + $block->blocks_object($self); + $block->seq_num($seq++); + } + return $blocks; +} + +sub _choose_blocks { + my $blocks = []; + for my $hunk (@_) { + my $block = $self->_make_block($hunk); + if (exists $block->{ONLY}) { + diag "I found ONLY: maybe you're debugging?" + unless $self->_no_diag_on_only; + return [$block]; + } + next if exists $block->{SKIP}; + push @$blocks, $block; + if (exists $block->{LAST}) { + return $blocks; + } + } + return $blocks; +} + +sub _check_reserved { + my $id = shift; + croak "'$id' is a reserved name. Use something else.\n" + if $reserved_section_names->{$id} or + $id =~ /^_/; +} + +sub _make_block { + my $hunk = shift; + my $cd = $self->block_delim; + my $dd = $self->data_delim; + my $block = $self->block_class->new; + $hunk =~ s/\A\Q${cd}\E[ \t]*(.*)\s+// or die; + my $name = $1; + my @parts = split /^\Q${dd}\E +\(?(\w+)\)? *(.*)?\n/m, $hunk; + my $description = shift @parts; + $description ||= ''; + unless ($description =~ /\S/) { + $description = $name; + } + $description =~ s/\s*\z//; + $block->set_value(description => $description); + + my $section_map = {}; + my $section_order = []; + while (@parts) { + my ($type, $filters, $value) = splice(@parts, 0, 3); + $self->_check_reserved($type); + $value = '' unless defined $value; + $filters = '' unless defined $filters; + if ($filters =~ /:(\s|\z)/) { + croak "Extra lines not allowed in '$type' section" + if $value =~ /\S/; + ($filters, $value) = split /\s*:(?:\s+|\z)/, $filters, 2; + $value = '' unless defined $value; + $value =~ s/^\s*(.*?)\s*$/$1/; + } + $section_map->{$type} = { + filters => $filters, + }; + push @$section_order, $type; + $block->set_value($type, $value); + } + $block->set_value(name => $name); + $block->set_value(_section_map => $section_map); + $block->set_value(_section_order => $section_order); + return $block; +} + +sub _spec_init { + return $self->_spec_string + if $self->_spec_string; + local $/; + my $spec; + if (my $spec_file = $self->_spec_file) { + open FILE, $spec_file or die $!; + $spec = ; + close FILE; + } + else { + $spec = do { + package main; + no warnings 'once'; + ; + }; + } + return $spec; +} + +sub _strict_warnings() { + require Filter::Util::Call; + my $done = 0; + Filter::Util::Call::filter_add( + sub { + return 0 if $done; + my ($data, $end) = ('', ''); + while (my $status = Filter::Util::Call::filter_read()) { + return $status if $status < 0; + if (/^__(?:END|DATA)__\r?$/) { + $end = $_; + last; + } + $data .= $_; + $_ = ''; + } + $_ = "use strict;use warnings;$data$end"; + $done = 1; + } + ); +} + +sub tie_output() { + my $handle = shift; + die "No buffer to tie" unless @_; + tie $handle, 'Test::Base::Handle', $_[0]; +} + +sub no_diff { + $ENV{TEST_SHOW_NO_DIFFS} = 1; +} + +package Test::Base::Handle; + +sub TIEHANDLE() { + my $class = shift; + bless \ $_[0], $class; +} + +sub PRINT { + $$self .= $_ for @_; +} + +#=============================================================================== +# Test::Base::Block +# +# This is the default class for accessing a Test::Base block object. +#=============================================================================== +package Test::Base::Block; +our @ISA = qw(Spiffy); + +our @EXPORT = qw(block_accessor); + +sub AUTOLOAD { + return; +} + +sub block_accessor() { + my $accessor = shift; + no strict 'refs'; + return if defined &$accessor; + *$accessor = sub { + my $self = shift; + if (@_) { + Carp::croak "Not allowed to set values for '$accessor'"; + } + my @list = @{$self->{$accessor} || []}; + return wantarray + ? (@list) + : $list[0]; + }; +} + +block_accessor 'name'; +block_accessor 'description'; +Spiffy::field 'seq_num'; +Spiffy::field 'is_filtered'; +Spiffy::field 'blocks_object'; +Spiffy::field 'original_values' => {}; + +sub set_value { + no strict 'refs'; + my $accessor = shift; + block_accessor $accessor + unless defined &$accessor; + $self->{$accessor} = [@_]; +} + +sub run_filters { + my $map = $self->_section_map; + my $order = $self->_section_order; + Carp::croak "Attempt to filter a block twice" + if $self->is_filtered; + for my $type (@$order) { + my $filters = $map->{$type}{filters}; + my @value = $self->$type; + $self->original_values->{$type} = $value[0]; + for my $filter ($self->_get_filters($type, $filters)) { + $Test::Base::Filter::arguments = + $filter =~ s/=(.*)$// ? $1 : undef; + my $function = "main::$filter"; + no strict 'refs'; + if (defined &$function) { + local $_ = join '', @value; + my $old = $_; + @value = &$function(@value); + if (not(@value) or + @value == 1 and $value[0] =~ /\A(\d+|)\z/ + ) { + if ($value[0] && $_ eq $old) { + Test::Base::diag("Filters returning numbers are supposed to do munging \$_: your filter '$function' apparently doesn't."); + } + @value = ($_); + } + } + else { + my $filter_object = $self->blocks_object->filter_class->new; + die "Can't find a function or method for '$filter' filter\n" + unless $filter_object->can($filter); + $filter_object->current_block($self); + @value = $filter_object->$filter(@value); + } + # Set the value after each filter since other filters may be + # introspecting. + $self->set_value($type, @value); + } + } + $self->is_filtered(1); +} + +sub _get_filters { + my $type = shift; + my $string = shift || ''; + $string =~ s/\s*(.*?)\s*/$1/; + my @filters = (); + my $map_filters = $self->blocks_object->_filters_map->{$type} || []; + $map_filters = [ $map_filters ] unless ref $map_filters; + my @append = (); + for ( + @{$self->blocks_object->_filters}, + @$map_filters, + split(/\s+/, $string), + ) { + my $filter = $_; + last unless length $filter; + if ($filter =~ s/^-//) { + @filters = grep { $_ ne $filter } @filters; + } + elsif ($filter =~ s/^\+//) { + push @append, $filter; + } + else { + push @filters, $filter; + } + } + return @filters, @append; +} + +{ + %$reserved_section_names = map { + ($_, 1); + } keys(%Test::Base::Block::), qw( new DESTROY ); +} + +__DATA__ + +=head1 NAME + +Test::Base - A Data Driven Testing Framework + +=head1 SYNOPSIS + +A new test module: + + # lib/MyProject/Test.pm + package MyProject::Test; + use Test::Base -Base; + + use MyProject; + + package MyProject::Test::Filter; + use Test::Base::Filter -base; + + sub my_filter { + return MyProject->do_something(shift); + } + +A sample test: + + # t/sample.t + use MyProject::Test; + + plan tests => 1 * blocks; + + run_is input => 'expected'; + + sub local_filter { + s/my/your/; + } + + __END__ + + === Test one (the name of the test) + --- input my_filter local_filter + my + input + lines + --- expected + expected + output + + === Test two + This is an optional description + of this particular test. + --- input my_filter + other + input + lines + --- expected + other expected + output + +=head1 DESCRIPTION + +Testing is usually the ugly part of Perl module authoring. Perl gives +you a standard way to run tests with Test::Harness, and basic testing +primitives with Test::More. After that you are pretty much on your own +to develop a testing framework and philosophy. Test::More encourages +you to make your own framework by subclassing Test::Builder, but that is +not trivial. + +Test::Base gives you a way to write your own test framework base +class that I trivial. In fact it is as simple as two lines: + + package MyTestFramework; + use Test::Base -Base; + +A module called C containing those two lines, will +give all the power of Test::More and all the power of Test::Base to +every test file that uses it. As you build up the capabilities of +C, your tests will have all of that power as well. + +C becomes a place for you to put all of your reusable +testing bits. As you write tests, you will see patterns and duplication, +and you can "upstream" them into C. Of course, you +don't have to subclass Test::Base at all. You can use it directly in +many applications, including everywhere you would use Test::More. + +Test::Base concentrates on offering reusable data driven patterns, so +that you can write tests with a minimum of code. At the heart of all +testing you have inputs, processes and expected outputs. Test::Base +provides some clean ways for you to express your input and expected +output data, so you can spend your time focusing on that rather than +your code scaffolding. + +=head1 EXPORTED FUNCTIONS + +Test::Base extends Test::More and exports all of its functions. So you +can basically write your tests the same as Test::More. Test::Base +also exports many functions of its own: + +=head2 is(actual, expected, [test-name]) + +This is the equivalent of Test::More's C function with one +interesting twist. If your actual and expected results differ and the +output is multi-line, this function will show you a unified diff format +of output. Consider the benefit when looking for the one character that +is different in hundreds of lines of output! + +Diff output requires the optional C CPAN module. If you +don't have this module, the C function will simply give you normal +Test::More output. To disable diffing altogether, set the +C environment variable (or C<$ENV{TEST_SHOW_NO_DIFFS}>) +to a true value. You can also call the C function as a shortcut. + +=head2 blocks( [data-section-name] ) + +The most important function is C. In list context it returns a +list of C objects that are generated from the test +specification in the C section of your test file. In scalar +context it returns the number of objects. This is useful to calculate +your Test::More plan. + +Each Test::Base::Block object has methods that correspond to the names +of that object's data sections. There is also a C and a +C method for accessing those parts of the block if they +were specified. + +The C function can take an optional single argument, that +indicates to only return the blocks that contain a particular named data +section. Otherwise C returns all blocks. + + my @all_of_my_blocks = blocks; + + my @just_the_foo_blocks = blocks('foo'); + +=head2 next_block() + +You can use the next_block function to iterate over all the blocks. + + while (my $block = next_block) { + ... + } + +It returns undef after all blocks have been iterated over. It can then +be called again to reiterate. + +=head2 first_block() + +Returns the first block or undef if there are none. It resets the iterator to +the C function. + +=head2 run(&subroutine) + +There are many ways to write your tests. You can reference each block +individually or you can loop over all the blocks and perform a common +operation. The C function does the looping for you, so all you need +to do is pass it a code block to execute for each block. + +The C function takes a subroutine as an argument, and calls the sub +one time for each block in the specification. It passes the current +block object to the subroutine. + + run { + my $block = shift; + is(process($block->foo), $block->bar, $block->name); + }; + +=head2 run_is([data_name1, data_name2]) + +Many times you simply want to see if two data sections are equivalent in +every block, probably after having been run through one or more filters. +With the C function, you can just pass the names of any two data +sections that exist in every block, and it will loop over every block +comparing the two sections. + + run_is 'foo', 'bar'; + +If no data sections are given C will try to detect them +automatically. + +NOTE: Test::Base will silently ignore any blocks that don't contain +both sections. + +=head2 run_is_deeply([data_name1, data_name2]) + +Like C but uses C for complex data structure comparison. + +=head2 run_like([data_name, regexp | data_name]); + +The C function is similar to C except the second +argument is a regular expression. The regexp can either be a C +object or a data section that has been filtered into a regular +expression. + + run_like 'foo', qr{ function is similar to C, except the opposite. + + run_unlike 'foo', qr{ function is like the C, C and +the C functions all rolled into one. It loops over each +relevant block and determines what type of comparison to do. + +NOTE: If you do not specify either a plan, or run any tests, the +C function will automatically be run. + +=head2 delimiters($block_delimiter, $data_delimiter) + +Override the default delimiters of C<===> and C<--->. + +=head2 spec_file($file_name) + +By default, Test::Base reads its input from the DATA section. This +function tells it to get the spec from a file instead. + +=head2 spec_string($test_data) + +By default, Test::Base reads its input from the DATA section. This +function tells it to get the spec from a string that has been +prepared somehow. + +=head2 filters( @filters_list or $filters_hashref ) + +Specify a list of additional filters to be applied to all blocks. See +L below. + +You can also specify a hash ref that maps data section names to an array +ref of filters for that data type. + + filters { + xxx => [qw(chomp lines)], + yyy => ['yaml'], + zzz => 'eval', + }; + +If a filters list has only one element, the array ref is optional. + +=head2 filters_delay( [1 | 0] ); + +By default Test::Base::Block objects are have all their filters run +ahead of time. There are testing situations in which it is advantageous +to delay the filtering. Calling this function with no arguments or a +true value, causes the filtering to be delayed. + + use Test::Base; + filters_delay; + plan tests => 1 * blocks; + for my $block (blocks) { + ... + $block->run_filters; + ok($block->is_filtered); + ... + } + +In the code above, the filters are called manually, using the +C method of Test::Base::Block. In functions like +C, where the tests are run automatically, filtering is delayed +until right before the test. + +=head2 filter_arguments() + +Return the arguments after the equals sign on a filter. + + sub my_filter { + my $args = filter_arguments; + # is($args, 'whazzup'); + ... + } + + __DATA__ + === A test + --- data my_filter=whazzup + +=head2 tie_output() + +You can capture STDOUT and STDERR for operations with this function: + + my $out = ''; + tie_output(*STDOUT, $buffer); + print "Hey!\n"; + print "Che!\n"; + untie *STDOUT; + is($out, "Hey!\nChe!\n"); + +=head2 no_diff() + +Turn off diff support for is() in a test file. + +=head2 default_object() + +Returns the default Test::Base object. This is useful if you feel +the need to do an OO operation in otherwise functional test code. See +L below. + +=head2 WWW() XXX() YYY() ZZZ() + +These debugging functions are exported from the Spiffy.pm module. See +L for more info. + +=head2 croak() carp() cluck() confess() + +You can use the functions from the Carp module without needing to import +them. Test::Base does it for you by default. + +=head1 TEST SPECIFICATION + +Test::Base allows you to specify your test data in an external file, +the DATA section of your program or from a scalar variable containing +all the text input. + +A I is a series of text lines. Each test (or block) +is separated by a line containing the block delimiter and an optional +test C. Each block is further subdivided into named sections with +a line containing the data delimiter and the data section name. A +C of the test can go on lines after the block delimiter but +before the first data section. + +Here is the basic layout of a specification: + + === + + --- + + --- + + --- + + + === + + --- + + --- + + --- + + +Here is a code example: + + use Test::Base; + + delimiters qw(### :::); + + # test code here + + __END__ + + ### Test One + We want to see if foo and bar + are really the same... + ::: foo + a foo line + another foo line + + ::: bar + a bar line + another bar line + + ### Test Two + + ::: foo + some foo line + some other foo line + + ::: bar + some bar line + some other bar line + + ::: baz + some baz line + some other baz line + +This example specifies two blocks. They both have foo and bar data +sections. The second block has a baz component. The block delimiter is +C<###> and the data delimiter is C<:::>. + +The default block delimiter is C<===> and the default data delimiter +is C<--->. + +There are some special data section names used for control purposes: + + --- SKIP + --- ONLY + --- LAST + +A block with a SKIP section causes that test to be ignored. This is +useful to disable a test temporarily. + +A block with an ONLY section causes only that block to be used. This is +useful when you are concentrating on getting a single test to pass. If +there is more than one block with ONLY, the first one will be chosen. + +Because ONLY is very useful for debugging and sometimes you forgot to +remove the ONLY flag before commiting to the VCS or uploading to CPAN, +Test::Base by default gives you a diag message saying I. If you don't like it, use +C. + +A block with a LAST section makes that block the last one in the +specification. All following blocks will be ignored. + +=head1 FILTERS + +The real power in writing tests with Test::Base comes from its +filtering capabilities. Test::Base comes with an ever growing set +of useful generic filters than you can sequence and apply to various +test blocks. That means you can specify the block serialization in +the most readable format you can find, and let the filters translate +it into what you really need for a test. It is easy to write your own +filters as well. + +Test::Base allows you to specify a list of filters to each data +section of each block. The default filters are C and C. +These filters will be applied (in order) to the data after it has been +parsed from the specification and before it is set into its +Test::Base::Block object. + +You can add to the default filter list with the C function. You +can specify additional filters to a specific block by listing them after +the section name on a data section delimiter line. + +Example: + + use Test::Base; + + filters qw(foo bar); + filters { perl => 'strict' }; + + sub upper { uc(shift) } + + __END__ + + === Test one + --- foo trim chomp upper + ... + + --- bar -norm + ... + + --- perl eval dumper + my @foo = map { + - $_; + } 1..10; + \ @foo; + +Putting a C<-> before a filter on a delimiter line, disables that +filter. + +=head2 Scalar vs List + +Each filter can take either a scalar or a list as input, and will return +either a scalar or a list. Since filters are chained together, it is +important to learn which filters expect which kind of input and return +which kind of output. + +For example, consider the following filter list: + + norm trim lines chomp array dumper eval + +The data always starts out as a single scalar string. C takes a +scalar and returns a scalar. C takes a list and returns a list, +but a scalar is a valid list. C takes a scalar and returns a +list. C takes a list and returns a list. C takes a list +and returns a scalar (an anonymous array reference containing the list +elements). C takes a list and returns a scalar. C takes a +scalar and creates a list. + +A list of exactly one element works fine as input to a filter requiring +a scalar, but any other list will cause an exception. A scalar in list +context is considered a list of one element. + +Data accessor methods for blocks will return a list of values when used +in list context, and the first element of the list in scalar context. +This is usually "the right thing", but be aware. + +=head2 The Stock Filters + +Test::Base comes with large set of stock filters. They are in the +C module. See L for a listing and +description of these filters. + +=head2 Rolling Your Own Filters + +Creating filter extensions is very simple. You can either write a +I in the C
namespace, or a I in the +C namespace or a subclass of it. In either case the +text and any extra arguments are passed in and you return whatever you +want the new value to be. + +Here is a self explanatory example: + + use Test::Base; + + filters 'foo', 'bar=xyz'; + + sub foo { + transform(shift); + } + + sub Test::Base::Filter::bar { + my $self = shift; # The Test::Base::Filter object + my $data = shift; + my $args = $self->current_arguments; + my $current_block_object = $self->block; + # transform $data in a barish manner + return $data; + } + +If you use the method interface for a filter, you can access the block +internals by calling the C method on the filter object. + +Normally you'll probably just use the functional interface, although all +the builtin filters are methods. + +Note that filters defined in the C
namespace can look like: + + sub filter9 { + s/foo/bar/; + } + +since Test::Base automatically munges the input string into $_ +variable and checks the return value of the function to see if it +looks like a number. If you must define a filter that returns just a +single number, do it in a different namespace as a method. These +filters don't allow the simplistic $_ munging. + +=head1 OO + +Test::Base has a nice functional interface for simple usage. Under the +hood everything is object oriented. A default Test::Base object is +created and all the functions are really just method calls on it. + +This means if you need to get fancy, you can use all the object +oriented stuff too. Just create new Test::Base objects and use the +functions as methods. + + use Test::Base; + my $blocks1 = Test::Base->new; + my $blocks2 = Test::Base->new; + + $blocks1->delimiters(qw(!!! @@@))->spec_file('test1.txt'); + $blocks2->delimiters(qw(### $$$))->spec_string($test_data); + + plan tests => $blocks1->blocks + $blocks2->blocks; + + # ... etc + +=head1 THE C CLASS + +In Test::Base, blocks are exposed as Test::Base::Block objects. This +section lists the methods that can be called on a Test::Base::Block +object. Of course, each data section name is also available as a method. + +=head2 name() + +This is the optional short description of a block, that is specified on the +block separator line. + +=head2 description() + +This is an optional long description of the block. It is the text taken from +between the block separator and the first data section. + +=head2 seq_num() + +Returns a sequence number for this block. Sequence numbers begin with 1. + +=head2 blocks_object() + +Returns the Test::Base object that owns this block. + +=head2 run_filters() + +Run the filters on the data sections of the blocks. You don't need to +use this method unless you also used the C function. + +=head2 is_filtered() + +Returns true if filters have already been run for this block. + +=head2 original_values() + +Returns a hash of the original, unfiltered values of each data section. + +=head1 SUBCLASSING + +One of the nicest things about Test::Base is that it is easy to +subclass. This is very important, because in your personal project, you +will likely want to extend Test::Base with your own filters and other +reusable pieces of your test framework. + +Here is an example of a subclass: + + package MyTestStuff; + use Test::Base -Base; + + our @EXPORT = qw(some_func); + + sub some_func { + (my ($self), @_) = find_my_self(@_); + ... + } + + package MyTestStuff::Block; + use base 'Test::Base::Block'; + + sub desc { + $self->description(@_); + } + + package MyTestStuff::Filter; + use base 'Test::Base::Filter'; + + sub upper { + $self->assert_scalar(@_); + uc(shift); + } + +Note that you don't have to re-Export all the functions from +Test::Base. That happens automatically, due to the powers of Spiffy. + +The first line in C allows it to be called as either a +function or a method in the test code. + +=head1 DISTRIBUTION SUPPORT + +You might be thinking that you do not want to use Test::Base in you +modules, because it adds an installation dependency. Fear not. +Module::Install takes care of that. + +Just write a Makefile.PL that looks something like this: + + use inc::Module::Install; + + name 'Foo'; + all_from 'lib/Foo.pm'; + + use_test_base; + + WriteAll; + +The line with C will automatically bundle all the code +the user needs to run Test::Base based tests. + +=head1 OTHER COOL FEATURES + +Test::Base automatically adds: + + use strict; + use warnings; + +to all of your test scripts and Test::Base subclasses. A Spiffy +feature indeed. + +=head1 HISTORY + +This module started its life with the horrible and ridicule inducing +name C. It was renamed to C with the hope +that it would be seen for the very useful module that it has become. If +you are switching from C to C, simply +substitute the concept and usage of C to C. + +=head1 AUTHOR + +Ingy döt Net + +=head1 COPYRIGHT + +Copyright (c) 2006. Ingy döt Net. All rights reserved. +Copyright (c) 2005. Brian Ingerson. All rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +See http://www.perl.com/perl/misc/Artistic.html + +=cut diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base/Filter.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base/Filter.pm new file mode 100644 index 0000000..418084b --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/lib/Test/Base/Filter.pm @@ -0,0 +1,639 @@ +#. TODO: +#. + +#=============================================================================== +# This is the default class for handling Test::Base data filtering. +#=============================================================================== +package Test::Base::Filter; +use Spiffy -Base; +use Spiffy ':XXX'; + +field 'current_block'; + +our $arguments; +sub current_arguments { + return undef unless defined $arguments; + my $args = $arguments; + $args =~ s/(\\s)/ /g; + $args =~ s/(\\[a-z])/'"' . $1 . '"'/gee; + return $args; +} + +sub assert_scalar { + return if @_ == 1; + require Carp; + my $filter = (caller(1))[3]; + $filter =~ s/.*:://; + Carp::croak "Input to the '$filter' filter must be a scalar, not a list"; +} + +sub _apply_deepest { + my $method = shift; + return () unless @_; + if (ref $_[0] eq 'ARRAY') { + for my $aref (@_) { + @$aref = $self->_apply_deepest($method, @$aref); + } + return @_; + } + $self->$method(@_); +} + +sub _split_array { + map { + [$self->split($_)]; + } @_; +} + +sub _peel_deepest { + return () unless @_; + if (ref $_[0] eq 'ARRAY') { + if (ref $_[0]->[0] eq 'ARRAY') { + for my $aref (@_) { + @$aref = $self->_peel_deepest(@$aref); + } + return @_; + } + return map { $_->[0] } @_; + } + return @_; +} + +#=============================================================================== +# these filters work on the leaves of nested arrays +#=============================================================================== +sub Join { $self->_peel_deepest($self->_apply_deepest(join => @_)) } +sub Reverse { $self->_apply_deepest(reverse => @_) } +sub Split { $self->_apply_deepest(_split_array => @_) } +sub Sort { $self->_apply_deepest(sort => @_) } + + +sub append { + my $suffix = $self->current_arguments; + map { $_ . $suffix } @_; +} + +sub array { + return [@_]; +} + +sub base64_decode { + $self->assert_scalar(@_); + require MIME::Base64; + MIME::Base64::decode_base64(shift); +} + +sub base64_encode { + $self->assert_scalar(@_); + require MIME::Base64; + MIME::Base64::encode_base64(shift); +} + +sub chomp { + map { CORE::chomp; $_ } @_; +} + +sub chop { + map { CORE::chop; $_ } @_; +} + +sub dumper { + no warnings 'once'; + require Data::Dumper; + local $Data::Dumper::Sortkeys = 1; + local $Data::Dumper::Indent = 1; + local $Data::Dumper::Terse = 1; + Data::Dumper::Dumper(@_); +} + +sub escape { + $self->assert_scalar(@_); + my $text = shift; + $text =~ s/(\\.)/eval "qq{$1}"/ge; + return $text; +} + +sub eval { + $self->assert_scalar(@_); + my @return = CORE::eval(shift); + return $@ if $@; + return @return; +} + +sub eval_all { + $self->assert_scalar(@_); + my $out = ''; + my $err = ''; + Test::Base::tie_output(*STDOUT, $out); + Test::Base::tie_output(*STDERR, $err); + my $return = CORE::eval(shift); + no warnings; + untie *STDOUT; + untie *STDERR; + return $return, $@, $out, $err; +} + +sub eval_stderr { + $self->assert_scalar(@_); + my $output = ''; + Test::Base::tie_output(*STDERR, $output); + CORE::eval(shift); + no warnings; + untie *STDERR; + return $output; +} + +sub eval_stdout { + $self->assert_scalar(@_); + my $output = ''; + Test::Base::tie_output(*STDOUT, $output); + CORE::eval(shift); + no warnings; + untie *STDOUT; + return $output; +} + +sub exec_perl_stdout { + my $tmpfile = "/tmp/test-blocks-$$"; + $self->_write_to($tmpfile, @_); + open my $execution, "$^X $tmpfile 2>&1 |" + or die "Couldn't open subprocess: $!\n"; + local $/; + my $output = <$execution>; + close $execution; + unlink($tmpfile) + or die "Couldn't unlink $tmpfile: $!\n"; + return $output; +} + +sub flatten { + $self->assert_scalar(@_); + my $ref = shift; + if (ref($ref) eq 'HASH') { + return map { + ($_, $ref->{$_}); + } sort keys %$ref; + } + if (ref($ref) eq 'ARRAY') { + return @$ref; + } + die "Can only flatten a hash or array ref"; +} + +sub get_url { + $self->assert_scalar(@_); + my $url = shift; + CORE::chomp($url); + require LWP::Simple; + LWP::Simple::get($url); +} + +sub hash { + return +{ @_ }; +} + +sub head { + my $size = $self->current_arguments || 1; + return splice(@_, 0, $size); +} + +sub join { + my $string = $self->current_arguments; + $string = '' unless defined $string; + CORE::join $string, @_; +} + +sub lines { + $self->assert_scalar(@_); + my $text = shift; + return () unless length $text; + my @lines = ($text =~ /^(.*\n?)/gm); + return @lines; +} + +sub norm { + $self->assert_scalar(@_); + my $text = shift; + $text = '' unless defined $text; + $text =~ s/\015\012/\n/g; + $text =~ s/\r/\n/g; + return $text; +} + +sub prepend { + my $prefix = $self->current_arguments; + map { $prefix . $_ } @_; +} + +sub read_file { + $self->assert_scalar(@_); + my $file = shift; + CORE::chomp $file; + open my $fh, $file + or die "Can't open '$file' for input:\n$!"; + CORE::join '', <$fh>; +} + +sub regexp { + $self->assert_scalar(@_); + my $text = shift; + my $flags = $self->current_arguments; + if ($text =~ /\n.*?\n/s) { + $flags = 'xism' + unless defined $flags; + } + else { + CORE::chomp($text); + } + $flags ||= ''; + my $regexp = eval "qr{$text}$flags"; + die $@ if $@; + return $regexp; +} + +sub reverse { + CORE::reverse(@_); +} + +sub slice { + die "Invalid args for slice" + unless $self->current_arguments =~ /^(\d+)(?:,(\d))?$/; + my ($x, $y) = ($1, $2); + $y = $x if not defined $y; + die "Invalid args for slice" + if $x > $y; + return splice(@_, $x, 1 + $y - $x); +} + +sub sort { + CORE::sort(@_); +} + +sub split { + $self->assert_scalar(@_); + my $separator = $self->current_arguments; + if (defined $separator and $separator =~ s{^/(.*)/$}{$1}) { + my $regexp = $1; + $separator = qr{$regexp}; + } + $separator = qr/\s+/ unless $separator; + CORE::split $separator, shift; +} + +sub strict { + $self->assert_scalar(@_); + <<'...' . shift; +use strict; +use warnings; +... +} + +sub tail { + my $size = $self->current_arguments || 1; + return splice(@_, @_ - $size, $size); +} + +sub trim { + map { + s/\A([ \t]*\n)+//; + s/(?<=\n)\s*\z//g; + $_; + } @_; +} + +sub unchomp { + map { $_ . "\n" } @_; +} + +sub write_file { + my $file = $self->current_arguments + or die "No file specified for write_file filter"; + if ($file =~ /(.*)[\\\/]/) { + my $dir = $1; + if (not -e $dir) { + require File::Path; + File::Path::mkpath($dir) + or die "Can't create $dir"; + } + } + open my $fh, ">$file" + or die "Can't open '$file' for output\n:$!"; + print $fh @_; + close $fh; + return $file; +} + +sub yaml { + $self->assert_scalar(@_); + require YAML; + return YAML::Load(shift); +} + +sub _write_to { + my $filename = shift; + open my $script, ">$filename" + or die "Couldn't open $filename: $!\n"; + print $script @_; + close $script + or die "Couldn't close $filename: $!\n"; +} + +__DATA__ + +=head1 NAME + +Test::Base::Filter - Default Filter Class for Test::Base + +=head1 SYNOPSIS + + package MyTestSuite; + use Test::Base -Base; + + ... reusable testing code ... + + package MyTestSuite::Filter; + use Test::Base::Filter -Base; + + sub my_filter1 { + ... + } + +=head1 DESCRIPTION + +Filters are the key to writing effective data driven tests with Test::Base. +Test::Base::Filter is a class containing a large default set of generic +filters. You can easily subclass it to add/override functionality. + +=head1 FILTERS + +This is a list of the default stock filters (in alphabetic order): + +=head2 append + +list => list + +Append a string to each element of a list. + + --- numbers lines chomp append=-#\n join + one + two + three + +=head2 array + +list => scalar + +Turn a list of values into an anonymous array reference. + +=head2 base64_decode + +scalar => scalar + +Decode base64 data. Useful for binary tests. + +=head2 base64_encode + +scalar => scalar + +Encode base64 data. Useful for binary tests. + +=head2 chomp + +list => list + +Remove the final newline from each string value in a list. + +=head2 chop + +list => list + +Remove the final char from each string value in a list. + +=head2 dumper + +scalar => list + +Take a data structure (presumably from another filter like eval) and use +Data::Dumper to dump it in a canonical fashion. + +=head2 escape + +scalar => scalar + +Unescape all backslash escaped chars. + +=head2 eval + +scalar => list + +Run Perl's C command against the data and use the returned value +as the data. + +=head2 eval_all + +scalar => list + +Run Perl's C command against the data and return a list of 4 +values: + + 1) The return value + 2) The error in $@ + 3) Captured STDOUT + 4) Captured STDERR + +=head2 eval_stderr + +scalar => scalar + +Run Perl's C command against the data and return the +captured STDERR. + +=head2 eval_stdout + +scalar => scalar + +Run Perl's C command against the data and return the +captured STDOUT. + +=head2 exec_perl_stdout + +list => scalar + +Input Perl code is written to a temp file and run. STDOUT is captured and +returned. + +=head2 flatten + +scalar => list + +Takes a hash or array ref and flattens it to a list. + +=head2 get_url + +scalar => scalar + +The text is chomped and considered to be a url. Then LWP::Simple::get is +used to fetch the contents of the url. + +=head2 hash + +list => scalar + +Turn a list of key/value pairs into an anonymous hash reference. + +=head2 head[=number] + +list => list + +Takes a list and returns a number of the elements from the front of it. The +default number is one. + +=head2 join + +list => scalar + +Join a list of strings into a scalar. + +=head2 Join + +Join the list of strings inside a list of array refs and return the +strings in place of the array refs. + +=head2 lines + +scalar => list + +Break the data into an anonymous array of lines. Each line (except +possibly the last one if the C filter came first) will have a +newline at the end. + +=head2 norm + +scalar => scalar + +Normalize the data. Change non-Unix line endings to Unix line endings. + +=head2 prepend=string + +list => list + +Prepend a string onto each of a list of strings. + +=head2 read_file + +scalar => scalar + +Read the file named by the current content and return the file's content. + +=head2 regexp[=xism] + +scalar => scalar + +The C filter will turn your data section into a regular +expression object. You can pass in extra flags after an equals sign. + +If the text contains more than one line and no flags are specified, then +the 'xism' flags are assumed. + +=head2 reverse + +list => list + +Reverse the elements of a list. + +=head2 Reverse + +list => list + +Reverse the list of strings inside a list of array refs. + +=head2 slice=x[,y] + +list => list + +Returns the element number x through element number y of a list. + +=head2 sort + +list => list + +Sorts the elements of a list in character sort order. + +=head2 Sort + +list => list + +Sort the list of strings inside a list of array refs. + +=head2 split[=string|pattern] + +scalar => list + +Split a string in into a list. Takes a optional string or regexp as a +parameter. Defaults to /\s+/. Same as Perl C. + +=head2 Split[=string|pattern] + +list => list + +Split each of a list of strings and turn them into array refs. + +=head2 strict + +scalar => scalar + +Prepend the string: + + use strict; + use warnings; + +to the block's text. + +=head2 tail[=number] + +list => list + +Return a number of elements from the end of a list. The default +number is one. + +=head2 trim + +list => list + +Remove extra blank lines from the beginning and end of the data. This +allows you to visually separate your test data with blank lines. + +=head2 unchomp + +list => list + +Add a newline to each string value in a list. + +=head2 write_file[=filename] + +scalar => scalar + +Write the content of the section to the named file. Return the filename. + +=head2 yaml + +scalar => list + +Apply the YAML::Load function to the data block and use the resultant +structure. Requires YAML.pm. + +=head1 AUTHOR + +Ingy döt Net + +=head1 COPYRIGHT + +Copyright (c) 2006. Ingy döt Net. All rights reserved. +Copyright (c) 2005. Brian Ingerson. All rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +See http://www.perl.com/perl/misc/Artistic.html + +=cut diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/BaseTest.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/BaseTest.pm new file mode 100644 index 0000000..6af0752 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/BaseTest.pm @@ -0,0 +1,6 @@ +package t::BaseTest; +use Test::Base -Base; + +use File::Path qw(rmtree); +rmtree('t/output'); + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Subclass.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Subclass.pm new file mode 100644 index 0000000..c6c09d0 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Subclass.pm @@ -0,0 +1,2 @@ +package t::Subclass; +use Test::Base -Base; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Test-Less/index.txt b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Test-Less/index.txt new file mode 100644 index 0000000..0a6848e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/Test-Less/index.txt @@ -0,0 +1,15 @@ +# This file is an index for the `test-less` facility. +# +# More information can be found at: +# http://search.cpan.org/search?query=Test-Less;mode=dist +# +filter t/append.t Jun 6 00:32:41 2005 GMT -- ingy +filter t/array.t Jun 6 00:32:41 2005 GMT -- ingy +filter t/base64.t Jun 6 00:32:41 2005 GMT -- ingy +filter t/chomp.t Jun 6 00:32:42 2005 GMT -- ingy +filter t/chop.t Jun 6 00:35:08 2005 GMT -- ingy +filter t/dumper.t Jun 6 00:35:08 2005 GMT -- ingy +filter t/eval.t Jun 6 00:35:08 2005 GMT -- ingy +filter t/eval_all.t Jun 6 00:35:08 2005 GMT -- ingy +filter t/eval_stderr.t Jun 6 00:35:08 2005 GMT -- ingy +filter t/eval_stdout.t Jun 6 00:35:08 2005 GMT -- ingy diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestA.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestA.pm new file mode 100644 index 0000000..fe6ddf6 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestA.pm @@ -0,0 +1,2 @@ +package t::TestA; +use Test::Base -Base; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestB.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestB.pm new file mode 100644 index 0000000..9ba21f3 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestB.pm @@ -0,0 +1,2 @@ +package t::TestB; +use t::TestA -Base; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestBass.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestBass.pm new file mode 100644 index 0000000..3aa5c78 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestBass.pm @@ -0,0 +1,30 @@ +package TestBass; +use Test::Base -Base; + +# const block_class => 'TestBass::Block'; +# const filter_class => 'TestBass::Filter'; + +our @EXPORT = qw(run_like_hell); + +sub run_like_hell() { + (my ($self), @_) = find_my_self(@_); + $self->run_like(@_); +} + + +package TestBass::Block; +use base 'Test::Base::Block'; + +sub el_nombre { $self->name(@_) } + +block_accessor 'feedle'; + + +package TestBass::Filter; +use base 'Test::Base::Filter'; + +sub foo_it { + map { + "foo - $_"; + } @_; +} diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestC.pm b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestC.pm new file mode 100644 index 0000000..179f52d --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/TestC.pm @@ -0,0 +1,2 @@ +package t::TestC; +use t::TestB -Base; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/append.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/append.t new file mode 100644 index 0000000..3117b26 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/append.t @@ -0,0 +1,36 @@ +use Test::Base; + +__DATA__ +=== +--- in) lines append=---\n join +one +two +three +--- out) +one +--- +two +--- +three +--- + +=== +--- in) lines chomp append=---\n join +one +two +three +--- out +one--- +two--- +three--- + +=== +--- in) chomp append=---\n +one +two +three +--- out +one +two +three--- + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/arguments.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/arguments.t new file mode 100644 index 0000000..75f8ea2 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/arguments.t @@ -0,0 +1,23 @@ +use Test::Base tests => 3; + +run {}; + +sub Test::Base::Filter::something { + my $self = shift; + my $value = shift; + my $arguments = $self->current_arguments; + is $value, + "candle\n", + 'value is ok'; + is $arguments, + "wicked", + 'arguments is ok'; + is $Test::Base::Filter::arguments, + "wicked", + '$arguments global variable is ok'; +} + +__END__ +=== One +--- foo something=wicked +candle diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/array.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/array.t new file mode 100644 index 0000000..0b9759f --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/array.t @@ -0,0 +1,12 @@ +use Test::Base tests => 1; + +is_deeply first_block->foo, [qw(one two three)]; + +__DATA__ + + +=== Create an array reference +--- foo lines chomp array +one +two +three diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/autoload.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/autoload.t new file mode 100644 index 0000000..8d0a3f1 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/autoload.t @@ -0,0 +1,17 @@ +use Test::Base tests => 4; + +my $block = first_block; +ok((not defined &Test::Base::Block::bogus_method), + "Method doesn't exist"); +ok((not exists $block->{bogus_method}), + "Slot really doesn't exist"); +ok((not defined $block->bogus_method), + "Method is callable"); +my @list_context = $block->bogus_method; +ok @list_context == 0, + "Returns nothing in list context"; + +__DATA__ +=== One +--- xyz +Flavor diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/base64.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/base64.t new file mode 100644 index 0000000..7eaa987 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/base64.t @@ -0,0 +1,34 @@ +use Test::Base; + +plan tests => ~~blocks; + +run_is; + +__END__ +=== Test One +--- encoded base64_decode +SSBMb3ZlIEx1Y3kK + +--- decoded +I Love Lucy + + + +=== Test Two + +--- encoded +c3ViIHJ1bigmKSB7CiAgICBteSAkc2VsZiA9ICRkZWZhdWx0X29iamVjdDsKICAgIG15ICRjYWxs +YmFjayA9IHNoaWZ0OwogICAgZm9yIG15ICRibG9jayAoJHNlbGYtPmJsb2NrcykgewogICAgICAg +ICZ7JGNhbGxiYWNrfSgkYmxvY2spOwogICAgfQp9Cg== + +--- decoded base64_encode + +sub run(&) { + my $self = $default_object; + my $callback = shift; + for my $block ($self->blocks) { + &{$callback}($block); + } +} + + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks-scalar.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks-scalar.t new file mode 100644 index 0000000..3ec701b --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks-scalar.t @@ -0,0 +1,24 @@ +use Test::Base; + +plan tests => 1 * blocks() + 1; + +for (1..blocks) { + ok 1, 'Jusk checking my blocking'; +} + +is scalar(blocks), 2, + 'correct number of blocks'; + +sub this_filter_fails { + confess "Should never get here"; +} + +__DATA__ +this +=== +--- foo this_filter_fails +xxxx + +=== +--- foo this_filter_fails +yyyy diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks_grep.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks_grep.t new file mode 100644 index 0000000..7cd226d --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/blocks_grep.t @@ -0,0 +1,34 @@ +use Test::Base; + +my $plan = 1 * blocks('foo') + 3; + +plan tests => $plan; + +is $plan, 5, 'Make sure plan adds up'; + +for my $block (blocks('foo')) { + is $block->foo, + exists($block->{bar}) ? $block->bar : 'no bar'; +} + +eval { blocks(foo => 'bar') }; +like "$@", + qr{^Invalid arguments passed to 'blocks'}; + +run_is foo => 'bar'; + +__DATA__ + +=== +--- bar +excluded + +=== +--- foo +included +--- bar +included + +=== +--- foo chomp +no bar diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chomp.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chomp.t new file mode 100644 index 0000000..cd60b66 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chomp.t @@ -0,0 +1,29 @@ +use Test::Base; + +filters qw(norm trim chomp); + +plan tests => 1 * blocks; + +my @blocks = blocks; + +is $blocks[0]->input, "I am the foo"; +is $blocks[1]->input, "One\n\nTwo\n\nThree"; +is $blocks[2]->input, "Che!\n"; + +__END__ +=== +--- input +I am the foo +=== +--- input + +One + +Two + +Three + +=== +--- input chomp -chomp +Che! + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chop.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chop.t new file mode 100644 index 0000000..32aad3c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/chop.t @@ -0,0 +1,30 @@ +use Test::Base; + +filters qw(norm trim chomp); + +plan tests => 1 * blocks; + +my $c = next_block; +is_deeply $c->input, $c->output; + +$c = next_block; +is $c->input, $c->output; + +__END__ +=== +--- input lines chomp chop array +one +two +three +--- output eval +[qw(on tw thre)] + + +=== +--- input chomp chop +one +two +three +--- output eval +"one\ntwo\nthre" + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compact.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compact.t new file mode 100644 index 0000000..65bd6b4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compact.t @@ -0,0 +1,56 @@ +use Test::Base; + +plan tests => 1 + 1 * blocks; + +filters { that => 'chomp' }; + +run_is this => 'that'; + +run sub { + my $block = shift; + my $value = $block->value or return; + is $value, 'this', $block->name; +}; + +my $bad_spec = <<'...'; +=== +--- bad: real content +bogus +stuff +--- xxx +yyy +... +my $tb = Test::Base->new->spec_string($bad_spec); +eval { $tb->blocks }; +like "$@", + qr"Extra lines not allowed in 'bad' section", + 'Bad spec fails'; + + +sub upper { uc($_) } + +__DATA__ + +=== Basic compact form +--- (this): there is foo +--- (that) +there is foo + +=== Filters work +--- (this) upper: too high to die +--- (that) +TOO HIGH TO DIE + +=== Can have no value +--- (this): +--- (that) + +=== Can have ': ' in value +--- (this) : foo: bar +--- (that) chop +foo: bart + +=== Test trailing blank lines are ok +--- (value): this + + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compile.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compile.t new file mode 100644 index 0000000..e6af6b7 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/compile.t @@ -0,0 +1,3 @@ +use Test::Base tests => 1; + +pass 'Test::Base compiles'; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/delimiters.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/delimiters.t new file mode 100644 index 0000000..03700c5 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/delimiters.t @@ -0,0 +1,22 @@ +use Test::Base tests => 2; + +delimiters qw($$$ ***); + +run { + ok(shift); +}; + +__END__ + +$$$ +*** foo +this +*** bar +that + +$$$ + +*** foo +hola +*** bar +latre diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/description.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/description.t new file mode 100644 index 0000000..8912466 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/description.t @@ -0,0 +1,30 @@ +use Test::Base tests => 6; + +my @blocks = blocks; + +is $blocks[0]->description, 'One Time'; +is $blocks[1]->description, "This is the real description\nof the test."; +is $blocks[2]->description, ''; +is $blocks[3]->description, ''; +is $blocks[4]->description, 'Three Tips'; +is $blocks[5]->description, 'Description goes here.'; + +__END__ +=== One Time +=== Two Toes +This is the real description +of the test. +--- foo +bar +=== + +=== +=== Three Tips + +--- beezle +blob + +=== +Description goes here. +--- data +Some data diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/diff_is.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/diff_is.t new file mode 100644 index 0000000..b4c9069 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/diff_is.t @@ -0,0 +1,112 @@ +use Test::Base tests => 3; + +SKIP: { + if ($^O eq 'MSWin32') { + skip 'Win32 doesn\'t have /tmp', 3; + } + + unless (Test::Base->have_text_diff) { + skip 'The autodiffing feature of Test::Base (which rocketh) requires Text-Diff-0.35 and Algorithm-Diff-1.15 (or greater).', 3; + } + + filters { + test => [qw(exec_perl_stdout smooth_output)], + expected => 'smooth_output', + }; + run_is; + + sub smooth_output { + s/test-blocks-\d+/test-blocks-321/; + s/at line \d+\)/at line 000)/; + s/in (.*) at line (\d+)/at $1 line $2/; # for Test::Simple 0.65 + s/^\n//gm; + } +} + +__DATA__ +=== little diff +--- test +use lib 'lib'; +use Test::Base tests => 1; +is('a b c', 'a b x', 'little diff'); +--- expected +1..1 +not ok 1 - little diff +# Failed test 'little diff' +# in /tmp/test-blocks-321 at line 3. +# got: 'a b c' +# expected: 'a b x' +# Looks like you failed 1 test of 1. + + +=== big diff +--- test +use lib 'lib'; +use Test::Base tests => 1; +is(< 1; +is(< 3 * blocks; + +run_is perl => 'dumper'; +run_is dumper => 'perl'; +run_is dumper => 'dumper'; + +__DATA__ +=== Dumper Test +--- perl eval dumper +[ 1..5, { 'a' .. 'p' }] +--- dumper +[ + 1, + 2, + 3, + 4, + 5, + { + 'a' => 'b', + 'c' => 'd', + 'e' => 'f', + 'g' => 'h', + 'i' => 'j', + 'k' => 'l', + 'm' => 'n', + 'o' => 'p' + } +] +=== Another Dumper Test +--- perl eval dumper +"i like ike" +--- dumper +'i like ike' diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/embed_perl.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/embed_perl.t new file mode 100644 index 0000000..295b15a --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/embed_perl.t @@ -0,0 +1,28 @@ +# This feature allows you to put a Perl section at the top of your +# specification, between <<< and >>>. Not making this an official +# feature yet, until I decide whether I like it. + +use Test::Base tests => 2; + +run_is; + +sub reverse { join '', reverse split '', shift } + +__DATA__ + +<<< delimiters '+++', '***'; +filters 'chomp'; +>>> + + ++++ One +*** x reverse +123* +*** y +*321 + ++++ Two +*** x reverse +abc +*** y +cba diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/escape.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/escape.t new file mode 100644 index 0000000..d34a615 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/escape.t @@ -0,0 +1,17 @@ +use Test::Base tests => 2; + +is next_block->escaped, + "line1\nline2"; +is next_block->escaped, + " foo\n bar\n"; + +__END__ + +=== +--- escaped escape chomp +line1\nline2 +=== +--- escaped escape +\tfoo +\t\tbar + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval.t new file mode 100644 index 0000000..a21d155 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval.t @@ -0,0 +1,25 @@ +use Test::Base tests => 4; + +filters 'eval'; + +my $block = first_block; + +is ref($block->hash), 'HASH'; +is ref($block->array), 'ARRAY'; +is scalar(@{$block->array}), 11; +is $block->factorial, '362880'; + +__END__ + +=== Test +--- hash +{ + foo => 'bar', + bar => 'hihi', +} +--- array +[ 10 .. 20 ] +--- factorial +my $x = 1; +$x *= $_ for (1 .. 9); +$x; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_all.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_all.t new file mode 100644 index 0000000..99fc629 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_all.t @@ -0,0 +1,25 @@ +use Test::Base tests => 2; + +filters { + in => [qw(eval_all array)], + out => 'eval', +}; + +run_is_deeply in => 'out'; + +__DATA__ +=== +--- (in) +print "hi"; +warn "hello\n"; +print "bye"; +print STDERR "baby"; +die "darn\n"; +--- (out) +[undef, "darn\n", "hibye", "hello\nbaby"] + +=== +--- (in) +[1..3]; +--- (out) +[[1,2,3], '', '', ''] diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stderr.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stderr.t new file mode 100644 index 0000000..d72fbc5 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stderr.t @@ -0,0 +1,14 @@ +use Test::Base tests => 1; + +is next_block->perl, <<'...'; +You are a foo! +You are 1 2. +... + +__DATA__ +=== +--- perl eval_stderr +warn "You are a foo!\n"; +my $foo = 2; +print STDERR "You are 1 $foo.\n"; +return 42; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stdout.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stdout.t new file mode 100644 index 0000000..231a35e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/eval_stdout.t @@ -0,0 +1,14 @@ +use Test::Base tests => 1; + +is next_block->perl, <<'...'; +You are a foo! +You are 1 2. +... + +__DATA__ +=== +--- perl eval_stdout +print "You are a foo!\n"; +my $foo = 2; +print "You are 1 $foo.\n"; +return 42; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/export.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/export.t new file mode 100644 index 0000000..46e9d55 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/export.t @@ -0,0 +1,49 @@ +use Test::Base; + +plan tests => 41; + +ok(defined &plan); +ok(defined &ok); +ok(defined &is); +ok(defined &isnt); +ok(defined &like); +ok(defined &unlike); +ok(defined &is_deeply); +ok(defined &cmp_ok); +ok(defined &skip); +ok(defined &todo_skip); +ok(defined &pass); +ok(defined &fail); +ok(defined &eq_array); +ok(defined &eq_hash); +ok(defined &eq_set); +ok(defined &can_ok); +ok(defined &isa_ok); +ok(defined &diag); +ok(defined &use_ok); + +ok(defined &blocks); +ok(defined &next_block); +ok(defined &delimiters); +ok(defined &spec_file); +ok(defined &spec_string); +ok(defined &filters); +ok(not defined &filters_map); +ok(defined &filters_delay); +ok(defined &run); +ok(defined &run_is); +ok(defined &run_like); +ok(defined &run_unlike); +ok(defined &run_compare); +ok(not defined &diff_is); +ok(defined &default_object); + +ok(defined &WWW); +ok(defined &XXX); +ok(defined &YYY); +ok(defined &ZZZ); + +ok(defined &croak); +ok(defined &carp); +# ok(defined &cluck); +ok(defined &confess); diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_arguments.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_arguments.t new file mode 100644 index 0000000..75db4d5 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_arguments.t @@ -0,0 +1,23 @@ +use Test::Base tests => 3; + +run {}; + +sub foo { + is filter_arguments, '123,456'; + return; +} + +sub bar { + is filter_arguments, '---holy-crow+++'; + is $_, "one\n two\n"; + return; +} + +__DATA__ +=== +--- xxx foo=123,456 + +=== +--- xxx bar=---holy-crow+++ +one + two diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_delay.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_delay.t new file mode 100644 index 0000000..2e1345a --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_delay.t @@ -0,0 +1,30 @@ +# Each filter should have access to blocks/block internals. +use Test::Base; + +filters qw(chomp lower); +filters_delay; + +plan tests => 8 * blocks; + +for my $block (blocks) { + ok not($block->is_filtered); + unlike $block->section, qr/[a-z]/; + like $block->section, qr/^I L/; + like $block->section, qr/\n/; + $block->run_filters; + ok $block->is_filtered; + like $block->section, qr/[a-z]/; + like $block->section, qr/^i l/; + unlike $block->section, qr/\n/; +} + +sub lower { lc } + +__DATA__ +=== One +--- section +I LIKE IKE + +=== One +--- section +I LOVE LUCY diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_functions.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_functions.t new file mode 100644 index 0000000..fd68391 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filter_functions.t @@ -0,0 +1,23 @@ +use Test::Base tests => 2; + +filters { + foo => 'upper', + bar => 'lower', +}; + +run_is 'foo', 'upper'; +run_is 'bar', 'lower'; + +sub upper { uc(shift) } +sub Test::Base::Filter::lower { shift; lc(shift) } + +__END__ +=== +--- foo +So long, and thanks for all the fish! +--- bar +So long, and thanks for all the fish! +--- upper +SO LONG, AND THANKS FOR ALL THE FISH! +--- lower +so long, and thanks for all the fish! diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters-append.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters-append.t new file mode 100644 index 0000000..dfbdce7 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters-append.t @@ -0,0 +1,19 @@ +use Test::Base tests => 2; + +filters qw(chomp +bar foo); + +is next_block->text, "this,foo,that,bar"; +# 2nd test is needed +is next_block->text, "this,foo,that,bar"; + +sub foo { $_[0] . ",foo" } +sub bar { $_[0] . ",bar" } +sub that { $_[0] . ",that" } + +__DATA__ +=== +--- text that +this +=== +--- text that +this diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters.t new file mode 100644 index 0000000..00e7cf4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters.t @@ -0,0 +1,25 @@ +use Test::Base; + +filters 'upper'; +plan tests => 2; + +run { + my $block = shift; + is($block->one, $block->two); +}; + +my ($block) = blocks; +is($block->one, "HEY NOW HEY NOW\n"); + +sub Test::Base::Filter::upper { + my $self = shift; + return uc(shift); +} + +__END__ +=== +--- one +Hey now Hey Now + +--- two +hEY NoW hEY NoW diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters_map.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters_map.t new file mode 100644 index 0000000..68976ee --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/filters_map.t @@ -0,0 +1,42 @@ +use Test::Base tests => 7; + +eval { + filters_map { + perl => ['eval'], + text => ['chomp', 'lines', 'array'], + }; +}; +like $@, qr{Can't locate object method "filters_map"}; + +filters { + perl => ['eval'], + text => ['chomp', 'lines', 'array'], +}; + +run { + my $block = shift; + is ref($block->perl), 'ARRAY'; + is ref($block->text), 'ARRAY'; + is_deeply $block->perl, $block->text; +}; + +__DATA__ +=== One +--- perl +[ + "One\n", + "2nd line\n", + "\n", + "Third time's a charm", +] +--- text +One +2nd line + +Third time's a charm +=== Two +--- text +tic tac toe +--- perl +[ 'tic tac toe' ] + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/first_block.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/first_block.t new file mode 100644 index 0000000..d06d8db --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/first_block.t @@ -0,0 +1,24 @@ +use Test::Base tests => 7; + +filters 'chomp'; + +is next_block->test, '1'; +is next_block->test, '2'; +is first_block->test, '1'; +is first_block->test, '1'; +is next_block->test, '2'; +is next_block->test, '3'; +ok not defined next_block; + +__DATA__ +=== +--- test +1 + +=== +--- test +2 + +=== +--- test +3 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/flatten.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/flatten.t new file mode 100644 index 0000000..830d5ac --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/flatten.t @@ -0,0 +1,46 @@ +use Test::Base tests => 4; + +run_is_deeply in => 'out'; + +filters_delay; + +my ($b3, $b4) = blocks('bad'); + +eval { $b3->run_filters }; +like "$@", qr"Input to the 'flatten' filter must be a scalar"; + +eval { $b4->run_filters }; +like "$@", qr"Can only flatten a hash or array ref"; + +__END__ +=== +--- in eval flatten array +{ + one => 'won', + two => 'too', + three => 'thrice', +} +--- out lines chomp array +one +won +three +thrice +two +too + +=== +--- in eval flatten array +[qw(one two three four)] +--- out lines chomp array +one +two +three +four + +=== +--- bad lines flatten +one +two + +=== +--- bad flatten: foo bar baz diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/get_url.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/get_url.t new file mode 100644 index 0000000..5bf541c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/get_url.t @@ -0,0 +1,12 @@ +use Test::Base; + +plan skip_all => "Need to figure out network testing"; +# plan tests => 1; + +run_like html => 'match'; + +__DATA__ +=== Test kwiki.org +--- (html) get_url: http://www.kwiki.org +--- (match) regexp +The Official Kwiki Web Site diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/hash.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/hash.t new file mode 100644 index 0000000..18be70c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/hash.t @@ -0,0 +1,17 @@ +use Test::Base; + +__DATA__ +=== +--- words lines chomp hash +foo +42 +bar +44 +baz +because +--- hash eval ++{ + foo => 42, + bar => 44, + baz => 'because', +} diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/head.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/head.t new file mode 100644 index 0000000..d59252a --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/head.t @@ -0,0 +1,19 @@ +use Test::Base; + +__DATA__ +=== +--- in lines head +one +two +three +--- out +one + +=== +--- in lines head=2 join +one +two +three +--- out +one +two diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/internals.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/internals.t new file mode 100644 index 0000000..03bbddd --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/internals.t @@ -0,0 +1,137 @@ +# Each filter should have access to blocks/block internals. +use Test::Base tests => 20 * 2; + +run {}; + +package Test::Base::Filter; +use Test::More; + +sub foo { + my $self = shift; + my $value = shift; + +# Test access to Test::Base::Filter object. + ok ref($self), + '$self is an object'; + is ref($self), + 'Test::Base::Filter', + '$self is a Test:Base::Filter object'; + like $value, + qr/^This is some .*text.\z/, + 'Filter value is correct'; + +# Test access to Test::Base::Block object. + my $block = $self->current_block; + is ref($block), + 'Test::Base::Block', + 'Have a reference to our block object'; + + ok not($block->is_filtered), + 'Block is not completely filtered yet'; + + my $name = shift || 'One'; + is $block->name, + $name, + 'name is correct'; + + my $description = shift || 'One'; + is $block->description, + $description, + 'description is correct'; + + my $original = shift || "This is some text."; + is $block->original_values->{xxx}, + $original, + 'Access to the original value'; + + my $seq_num = shift || 1; + cmp_ok $block->seq_num, + '==', + $seq_num, + 'Sequence number (seq_num) is correct'; + + my $array_xxx = shift || ["This is some text."]; + is_deeply $block->{xxx}, + $array_xxx, + 'Test raw content of $block->{xxx}'; + + my $method_xxx = shift || "This is some text."; + is $block->xxx, + $method_xxx, + 'Test method content of $block->xxx'; + +# Test access to Test::Base object. + my $blocks = $block->blocks_object; + my $block_list = $blocks->block_list; + is ref($block_list), + 'ARRAY', + 'Have an array of all blocks'; + + is scalar(@$block_list), + '2', + 'Is there 2 blocks?'; + + is $blocks->block_class, + "Test::Base::Block", + 'block class'; + + is $blocks->filter_class, + "Test::Base::Filter", + 'filter class'; + + is_deeply + $blocks->{_filters}, + [qw(norm trim)], + 'default filters are ok'; + + is $blocks->block_delim, + '===', + 'block delimiter'; + + is $blocks->data_delim, + '---', + 'data delimiter'; + + my $spec = <spec, + $spec, + 'spec is ok'; + + is $block_list->[$seq_num - 1], + $block, + 'test block ref in list'; +} + +sub bar { + my $self = shift; + my $value = shift; + $self->foo($value, + 'Two', + "This is the 2nd description.\nRight here.", + "This is some more text.\n\n", + 2, + ["This is some more text."], + "This is some more text.", + ); +} + +__END__ +=== One +--- xxx foo: This is some text. +=== Two +This is the 2nd description. +Right here. + +--- xxx chomp bar +This is some more text. + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/is.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/is.t new file mode 100644 index 0000000..7eb0327 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/is.t @@ -0,0 +1,13 @@ +use Test::Base tests => 1; + +is(<<_ , <<_); +1 +2 +3 +_ +1 +2 +3 +_ + + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/jit-run.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/jit-run.t new file mode 100644 index 0000000..0f179d4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/jit-run.t @@ -0,0 +1,29 @@ +# Don't filter until just before dispatch in run() + +use Test::Base tests => 4; + +eval { + run { pass }; +}; + +like "$@", + qr/Can't find a function or method for/, + 'expect an error'; + +__END__ +=== One +--- foo +xxx + +=== Two +--- foo +xxx + +=== Three +--- foo +xxx + +=== Bad +--- foo filter_doesnt_exist_vsdyufbkhdkbjagyewkjbc +xxx + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join-deep.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join-deep.t new file mode 100644 index 0000000..e4f7ed8 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join-deep.t @@ -0,0 +1,31 @@ +use Test::Base; + +__DATA__ +=== +--- (xxx) eval Join +[ + [qw(a b c)], + [qw(d e f)], +] + +--- (yyy) eval +[ qw(abc def) ] + +=== +--- (xxx) eval Join=x +[ + [ + [qw(a b c)], + [qw(d e f)], + ], + [ + [qw(a b c)], + [qw(d e f)], + ] +] + +--- (yyy) eval +[ + [ qw(axbxc dxexf) ], + [ qw(axbxc dxexf) ], +] diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join.t new file mode 100644 index 0000000..29d4759 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/join.t @@ -0,0 +1,24 @@ +use Test::Base tests => 3; + +is next_block->input, 'onetwothree'; +is next_block->input, 'one=two=three'; +is next_block->input, "one\n\ntwo\n\nthree"; + +__DATA__ +=== +--- input lines chomp join +one +two +three + +=== +--- input lines chomp join== +one +two +three + +=== +--- input lines chomp join=\n\n +one +two +three diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/last.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/last.t new file mode 100644 index 0000000..0c7ad4d --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/last.t @@ -0,0 +1,33 @@ +use Test::Base tests => 4; + +is scalar(blocks), 3, + 'Does LAST limit tests to 3?'; + +run { + is(shift()->test, 'all work and no play'); +} + +__DATA__ +=== +--- test: all work and no play + +=== +--- test: all work and no play + +=== +--- LAST +--- test: all work and no play + +=== +--- test: all work and no play + +=== +--- test: all work and no play + +=== +--- test: all work and no play + +=== +--- test: all work and no play + + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/late.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/late.t new file mode 100644 index 0000000..b8a5433 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/late.t @@ -0,0 +1,34 @@ +use Test::Base tests => 5; + +run {}; + +eval { + filters 'blah', 'blam'; +}; +is "$@", ""; + +eval { + filters {foo => 'grate'}; +}; +is "$@", ""; + +eval { + delimiters '***', '&&&'; +}; +like "$@", qr{^Too late to call delimiters\(\)}; + +eval { + spec_file 'foo.txt'; +}; +like "$@", qr{^Too late to call spec_file\(\)}; + +eval { + spec_string "my spec\n"; +}; +like "$@", qr{^Too late to call spec_string\(\)}; + +__DATA__ + +=== Dummy +--- foo +--- bar diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lazy-filters.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lazy-filters.t new file mode 100644 index 0000000..cf6fa10 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lazy-filters.t @@ -0,0 +1,24 @@ +use Test::Base tests => 2; +no_diag_on_only; +sub shouldnt_be_run { + fail "shouldnt_be_run was run"; +} + +run_is foo => 'bar'; + +my ($block) = blocks; +is($block->foo, "1234"); + +__DATA__ +=== +--- foo shouldnt_be_run +--- bar + + + +=== +--- ONLY +--- foo chomp +1234 +--- bar chomp +1234 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lines.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lines.t new file mode 100644 index 0000000..03097e1 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/lines.t @@ -0,0 +1,36 @@ +use Test::Base tests => 6; + +my @lines1 = [blocks]->[0]->text1; +ok @lines1 == 3; +is_deeply +\@lines1, +[ + "One\n", + "Two\n", + "Three \n", +]; + +my @lines2 = [blocks]->[0]->text2; +ok @lines2 == 3; +is_deeply +\@lines2, +[ + "Three", + "Two", + "One", +]; + +is ref([blocks]->[0]->text3), 'ARRAY'; +is scalar(@{[blocks]->[0]->text3}), 0; + +__END__ +=== One +--- text1 lines +One +Two +Three +--- text2 lines chomp +Three +Two +One +--- text3 lines array diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/list.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/list.t new file mode 100644 index 0000000..1d75541 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/list.t @@ -0,0 +1,44 @@ +use Test::Base tests => 5; + +my $block1 = [blocks]->[0]; +my @values = $block1->grocery; +is scalar(@values), 3, + 'check list context'; +is_deeply \@values, ['apples', 'oranges', 'beef jerky'], + 'list context content'; + +my $block2 = [blocks]->[1]; +is_deeply $block2->todo, +[ + 'Fix YAML', + 'Fix Inline', + 'Fix Test::Base', +], 'deep block from index'; + +my $block3 = [blocks]->[2]; +is $block3->perl, 'xxx', + 'scalar context'; +is_deeply [$block3->perl], ['xxx', 'yyy', 'zzz'], + 'deep list compare'; + +__END__ + +=== One +--- grocery lines chomp +apples +oranges +beef jerky + +=== Two +--- todo lines chomp array +Fix YAML +Fix Inline +Fix Test::Base + +=== Three +--- perl eval +return qw( + xxx + yyy + zzz +) diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/main_filters.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/main_filters.t new file mode 100644 index 0000000..3dab881 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/main_filters.t @@ -0,0 +1,63 @@ +use Test::Base tests => 6; + +is next_block->xxx, "I lmike mike\n"; +is next_block->xxx, "I like mikey"; +is next_block->xxx, "123\n"; +is next_block->xxx, "I like MIKEY"; +is next_block->xxx, "I like ike\n"; + +run_is xxx => 'yyy'; + +sub mike1 { + s/ike/mike/g; +}; + +sub mike2 { + $_ = 'I like mikey'; + return 123; +}; + +sub mike3 { + s/ike/heck/; + return "123\n"; +} + +sub mike4 { + $_ = 'I like MIKEY'; + return; +} + +sub mike5 { + return 200; +} + +sub yyy { s/x/y/g } + +__DATA__ +=== +--- xxx mike1 +I like ike + +=== +--- xxx mike2 +I like ike + +=== +--- xxx mike3 +I like ike + +=== +--- xxx mike4 +I like ike + +=== +--- xxx mike5 +I like ike + +=== +--- xxx lines yyy +xxx xxx + xxx xxx +--- yyy +yyy yyy + yyy yyy diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/multi-level-inherit.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/multi-level-inherit.t new file mode 100644 index 0000000..b729795 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/multi-level-inherit.t @@ -0,0 +1,15 @@ +use t::TestC tests => 2; + +no_diff; +pass 'It works'; + +run_is(); + +sub upper { uc } + +__DATA__ +=== First +--- x upper +foo +--- y +FOO diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/name.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/name.t new file mode 100644 index 0000000..6252ec6 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/name.t @@ -0,0 +1,20 @@ +use Test::Base; + +plan tests => 1 * blocks; + +my @blocks = blocks; + +is $blocks[0]->name, 'One Time'; +is $blocks[1]->name, 'Two Toes'; +is $blocks[2]->name, ''; +is $blocks[3]->name, 'Three Tips'; + +__END__ +=== One Time +=== Two Toes +--- foo +=== + + + +=== Three Tips diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/next.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/next.t new file mode 100644 index 0000000..4ffb560 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/next.t @@ -0,0 +1,21 @@ +use Test::Base tests => 10; + +for (1..2) { + is next_block->foo, 'This is foo'; + is next_block->bar, 'This is bar'; + + while (my $block = next_block) { + pass; + } +} + +__DATA__ +=== One +--- foo chomp +This is foo +=== Two +--- bar chomp +This is bar +=== Three +=== Four +=== Five diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_diff.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_diff.t new file mode 100644 index 0000000..c61438e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_diff.t @@ -0,0 +1,6 @@ +use Test::Base tests => 1; + +no_diff; + +is "xxx\nyyy\n", "xxx\nyyy\n", + 'This test is really weak.'; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_plan.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_plan.t new file mode 100644 index 0000000..b535038 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/no_plan.t @@ -0,0 +1,5 @@ +use Test::Base; + +plan 'no_plan'; + +pass; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/normalize.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/normalize.t new file mode 100644 index 0000000..52f8a63 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/normalize.t @@ -0,0 +1,10 @@ +use Test::Base tests => 4; + +spec_file 't/dos_spec'; + +my @blocks = blocks; + +is $blocks[0]->Foo, "Line 1\n\nLine 2\n"; +is $blocks[0]->Bar, "Line 3\nLine 4"; +is $blocks[1]->Foo, "Line 5\n\nLine 6\n"; +is $blocks[1]->Bar, "Line 7\nLine 8"; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only-with-implicit.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only-with-implicit.t new file mode 100644 index 0000000..6636618 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only-with-implicit.t @@ -0,0 +1,14 @@ +use Test::Base tests => 1; +no_diag_on_only; +run_is; + +__END__ + +=== +--- ONLY +--- foo: xxx +--- bar: xxx + +=== +--- foo: xxx +--- bar: yyy diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only.t new file mode 100644 index 0000000..ed8091c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/only.t @@ -0,0 +1,19 @@ +use Test::Base tests => 3; +no_diag_on_only; +run { pass }; + +is scalar(blocks), 1; + +is first_block->foo, "2"; + +__DATA__ +=== One +--- foo: 1 +=== Two +--- ONLY +--- foo: 2 +=== Three +--- foo: 3 +--- ONLY +=== Four +--- foo: 4 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo.t new file mode 100644 index 0000000..5532768 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo.t @@ -0,0 +1,33 @@ +use Test::Base tests => 8; + +my $test = Test::Base->new; + +my @blocks = $test->filters('chomp')->spec_file('t/spec1')->blocks; + +is $blocks[0]->foo, '42'; +is $blocks[0]->bar, '44'; +is $blocks[1]->xxx, '123'; +is $blocks[1]->yyy, '321'; + +@blocks = Test::Base->new->delimiters('^^^', '###')->blocks; + +is $blocks[0]->foo, "42\n"; +is $blocks[0]->bar, "44\n"; +is $blocks[1]->xxx, "123\n"; +is $blocks[1]->yyy, "321\n"; + +__END__ +^^^ Test one + +### foo +42 + +### bar +44 + +^^^ Test two + +### xxx +123 +### yyy +321 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo_run.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo_run.t new file mode 100644 index 0000000..9102c8a --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/oo_run.t @@ -0,0 +1,23 @@ +use Test::Base; + +my $blocks = Test::Base->new; +$blocks->delimiters(qw(%%% ***))->filters('lower'); + +plan tests => 3 * $blocks->blocks; + +$blocks->run(sub { + my $block = shift; + is $block->foo, $block->bar, $block->name; +}); + +$blocks->run_is('foo', 'bar'); +$blocks->run_like('foo', qr{x}); + +sub lower { lc } + +__DATA__ +%%% Test +*** foo +xyz +*** bar +XYZ diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/parentheses.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/parentheses.t new file mode 100644 index 0000000..b62e968 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/parentheses.t @@ -0,0 +1,34 @@ +use Test::Base tests => 17; + +sub some_text { 'This is some text' }; + +my $b = first_block; +is $b->foo, $b->bar, $b->name; +is $b->foo, some_text(); + +run { + my $b = shift; + ok defined $b->foo; + is @{[$b->foo]}, 1; + ok length $b->foo; +}; + +__DATA__ + +=== Parens clarify section +--- (foo) some_text +--- (bar) some_text + +=== +--- (foo: some text + +=== +--- foo) +some text + +=== +--- (foo): some text + +=== +--- (foo) split join: some text + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prepend.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prepend.t new file mode 100644 index 0000000..60e2341 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prepend.t @@ -0,0 +1,38 @@ +use Test::Base; + +__DATA__ +=== Prepend lines before lines +--- (in) lines prepend=---\n join +one +two +three +--- (out) +--- +one +--- +two +--- +three + + +=== Prepend chars before lines +--- (in) lines chomp prepend=--- join=\n +one +two +three +--- (out) chomp +---one +---two +---three + + +=== Prepend to a multline string +--- (in) prepend=--- +one +two +three +--- (out) +---one +two +three + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/preserve-order.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/preserve-order.t new file mode 100644 index 0000000..adf6364 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/preserve-order.t @@ -0,0 +1,34 @@ +use Test::Base tests => 10; + +run {}; + +my $count = 0; +sub test { + my $num = shift; + chomp $num; + is $num, ++$count; + return; +} + +__END__ +=== One +--- grape test +1 +--- iceberg_lettuce test +2 +--- fig test +3 +--- eggplant test +4 +--- jalepeno test +5 +--- banana test +6 +--- apple test +7 +--- carrot test +8 +--- hot_pepper test +9 +--- date test +10 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prototypes.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prototypes.t new file mode 100644 index 0000000..6ac2124 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/prototypes.t @@ -0,0 +1,7 @@ +use Test::Base tests => 1; + +is foo(), 'scalar_context', 'testing force scalar context'; + +sub foo { + wantarray ? 'list_context' : 'scalar_context'; +} diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick-plan.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick-plan.t new file mode 100644 index 0000000..09a217f --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick-plan.t @@ -0,0 +1,16 @@ +use Test::Base; + +run_is; + +__DATA__ +=== Foo +--- a: foo +--- b: foo + +=== Bar +--- a: bar +--- b: bar + +=== Baz +--- a: baz +--- b: baz diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick_test.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick_test.t new file mode 100644 index 0000000..68d8982 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/quick_test.t @@ -0,0 +1,15 @@ +use Test::Base; + +__DATA__ +=== Compare strings +--- in split sort join=\s: ccc bbb aaa +--- out: aaa bbb ccc + +=== Compare deeply +--- in eval: [1, 2, 3] +--- out eval Reverse: [3, 2, 1] + +=== Compare like +--- in: You are here +--- out regexp: ere$ + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/read_file.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/read_file.t new file mode 100644 index 0000000..1b36c3c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/read_file.t @@ -0,0 +1,15 @@ +use Test::Base; + +__END__ +=== Filename is chomped automatically +--- file read_file +t/sample-file.txt +--- content +A sample of some text +in a sample file! + +=== Filename is inline +--- file read_file: t/sample-file.txt +--- content +A sample of some text +in a sample file! diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/regexp.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/regexp.t new file mode 100644 index 0000000..ae3453f --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/regexp.t @@ -0,0 +1,39 @@ +use Test::Base; + +__DATA__ +=== +--- text +one fish +two fish +red fish +blue fish +--- re regexp= +one fish +two fish +red fish +blue fish + +=== +--- text +One Fish +Two Fish +Red Fish +Blue Fish +--- re regexp=im +^one fish +^two fish +^red fish +^blue fish + +=== +--- text +One Fish +Two Fish +Red Fish +Blue Fish +--- re regexp +\A^one\ fish\n +^two\ fish. +^red\ fish. +^blue\ fish\n\z + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/repeated-filters.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/repeated-filters.t new file mode 100644 index 0000000..64884c1 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/repeated-filters.t @@ -0,0 +1,14 @@ +use Test::Base; + +__DATA__ +=== +--- (foo) lines reverse reverse join +one +two +three + +--- (bar) +one +two +three + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/require.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/require.t new file mode 100644 index 0000000..90b871c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/require.t @@ -0,0 +1,7 @@ +# This should not fail (used by Module::Install to check for dependency +# presence, etc). +require Test::Base; + +print "1..1\n"; +print "ok 1 - Print ran. Code didn't blow up\n"; + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reserved_names.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reserved_names.t new file mode 100644 index 0000000..9f79ee9 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reserved_names.t @@ -0,0 +1,56 @@ +use Test::Base tests => 18; + +for my $word (qw( + BEGIN + DESTROY + EXPORT + ISA + block_accessor + blocks_object + description + is_filtered + name + new + run_filters + seq_num + set_value + )) { + my $blocks = my_blocks($word); + eval {$blocks->blocks}; + like $@, qr{'$word' is a reserved name}, + "$word is a bad name"; +} + +for my $word (qw( + field + const + stub + super + )) { + my $blocks = my_blocks($word); + my @blocks = $blocks->blocks; + eval {$blocks->blocks}; + is "$@", '', + "$word is a good name"; +} + +sub my_blocks { + my $word = shift; + Test::Base->new->spec_string(<<"..."); +=== Fail test +--- $word +This is a test +--- foo +This is a test +... +} + +my $blocks = Test::Base->new->spec_string(<<'...'); +=== Fail test +--- bar +This is a test +--- foo +This is a test +... +eval {$blocks->blocks}; +is "$@", ''; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse-deep.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse-deep.t new file mode 100644 index 0000000..e22a84c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse-deep.t @@ -0,0 +1,42 @@ +use Test::Base; + +__DATA__ +=== +--- xxx) eval Reverse array +[qw(a b c)], +[qw(d e f)], +[qw(g h i j)] +--- yyy) eval +[ +[qw(c b a)], +[qw(f e d)], +[qw(j i h g)] +] + +=== +--- xxx) eval Reverse array +[ + [qw(a b c)], + [qw(d e f)], + [qw(g h i j)] +], +[ + [qw(a b c)], + [qw(d e f)], + [qw(g h i j)] +], + +--- yyy) eval +[ + [ + [qw(c b a)], + [qw(f e d)], + [qw(j i h g)] + ], + [ + [qw(c b a)], + [qw(f e d)], + [qw(j i h g)] + ] +] + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse.t new file mode 100644 index 0000000..5159e25 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/reverse.t @@ -0,0 +1,16 @@ +use Test::Base; + +__DATA__ +=== +--- (a) split reverse join=\s: this and that +--- (b) : that and this + +=== +--- (a) lines reverse join +This +And +That +--- (b) +That +And +This diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run-args.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run-args.t new file mode 100644 index 0000000..6f62e5c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run-args.t @@ -0,0 +1,9 @@ +use Test::Base tests => 2; + +run_is; +run_is_deeply; + +__END__ +=== +--- foo: Coolness +--- bar append=ness: Cool diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_compare.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_compare.t new file mode 100644 index 0000000..3047e8b --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_compare.t @@ -0,0 +1,17 @@ +use Test::Base tests => 3; + +run_compare in => 'out'; + +__DATA__ +=== Compare strings +--- in split sort join=\s: ccc bbb aaa +--- out: aaa bbb ccc + +=== Compare deeply +--- in eval: [1, 2, 3] +--- out eval Reverse: [3, 2, 1] + +=== Compare like +--- in: You are here +--- out regexp: ere$ + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is.t new file mode 100644 index 0000000..5500f9e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is.t @@ -0,0 +1,38 @@ +use Test::Base; + +plan tests => 7 * blocks; + +run_is 'foo', 'bar'; +run_is 'bar', 'baz'; +run_is 'baz', 'foo'; + +for my $block (blocks) { + is $block->foo, $block->bar, $block->name; + is $block->bar, $block->baz, $block->name; + is $block->baz, $block->foo, $block->name; +} + +my @blocks = blocks; + +is $blocks[0]->foo, "Hey Now\n"; +is $blocks[1]->foo, "Holy Cow\n"; + +__END__ + + +=== One +--- foo +Hey Now +--- bar +Hey Now +--- baz +Hey Now + + +=== Two +--- baz +Holy Cow +--- bar +Holy Cow +--- foo +Holy Cow diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is_deeply.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is_deeply.t new file mode 100644 index 0000000..dc8c6f1 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_is_deeply.t @@ -0,0 +1,18 @@ +use Test::Base tests => 3; + +filters 'eval'; + +run_is_deeply qw(foo bar); + +run { + my $block = shift; + ok ref $block->foo; + ok ref $block->bar; +}; + +__DATA__ +=== Test is_deeply +--- foo +{ foo => 22, bar => 33 } +--- bar +{ bar => 33, foo => 22 } diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_like.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_like.t new file mode 100644 index 0000000..71b6bb6 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/run_like.t @@ -0,0 +1,24 @@ +use Test::Base tests => 3; + +run_like('html', 're1'); +run_like 'html', 're2'; +run_like html => qr{stylesheet}; + +__END__ + +=== Like Test +--- html + + + + + + +--- re1 regexp=xis + 2; + +run_unlike('html', 're1'); +run_is 're1' => 're2'; + +__END__ + +=== Unlike Test +--- html + + + + + + +--- re1 regexp=i +software error +--- re2 chomp +(?i-xsm:software error) diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sample-file.txt b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sample-file.txt new file mode 100644 index 0000000..f9e4220 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sample-file.txt @@ -0,0 +1,2 @@ +A sample of some text +in a sample file! diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/simple.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/simple.t new file mode 100644 index 0000000..c308644 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/simple.t @@ -0,0 +1,30 @@ +use Test::Base; + +plan tests => 1 * blocks; + +# A silly test instead of pod2html +for my $block (blocks) { + is( + uc($block->pod), + $block->upper, + $block->name, + ); +} + +__END__ +=== Header 1 Test +--- pod +=head1 The Main Event +--- upper +=HEAD1 THE MAIN EVENT +=== List Test +--- pod +=over +=item * one +=item * two +=back +--- upper +=OVER +=ITEM * ONE +=ITEM * TWO +=BACK diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/skip.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/skip.t new file mode 100644 index 0000000..a6ea2be --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/skip.t @@ -0,0 +1,25 @@ +use Test::Base tests => 5; + +run { pass }; + +is scalar(blocks), 2; + +my @block = blocks; +is $block[0]->foo, "2\n"; +is $block[1]->foo, "3\n"; + +__DATA__ +=== One +--- SKIP +--- foo +1 +=== Two +--- foo +2 +=== Three +--- foo +3 +=== Four +--- SKIP +--- foo +4 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/slice.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/slice.t new file mode 100644 index 0000000..1f35b0c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/slice.t @@ -0,0 +1,33 @@ +use Test::Base; + +__DATA__ +=== +--- in lines slice=0,2 join +one +two +three +four +five +--- out +one +two +three + +=== +--- in lines slice=2,3 join +one +two +three +four +five +--- out +three +four + +=== +--- in lines slice=1 join +one +two +three +--- out +two diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort-deep.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort-deep.t new file mode 100644 index 0000000..e0c7edb --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort-deep.t @@ -0,0 +1,16 @@ +use Test::Base; + +__END__ +=== Test deep sorting +--- (a) eval Sort +[ +[ +[qw(c d b a)], [qw(foo bar baz)], +] +] +--- (b) eval Reverse +[ +[ +[qw(d c b a)], [qw(foo baz bar)], +] +] diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort.t new file mode 100644 index 0000000..90df589 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/sort.t @@ -0,0 +1,12 @@ +use Test::Base; + +__DATA__ +=== Can sort a list +--- (in) split sort join=-: foo bar baz +--- out: bar-baz-foo + +=== Can sort backwards +--- (in) split sort reverse join=-: foo bar baz +--- out: foo-baz-bar + + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec1 b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec1 new file mode 100644 index 0000000..65c6799 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec1 @@ -0,0 +1,14 @@ +=== Test one + +--- foo +42 + +--- bar +44 + +=== Test two + +--- xxx +123 +--- yyy +321 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec2 b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec2 new file mode 100644 index 0000000..6880908 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec2 @@ -0,0 +1,10 @@ +=== +--- foo +1 +--- bar +2 +=== +--- foo +3 +--- bar +4 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_file.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_file.t new file mode 100644 index 0000000..d1d5777 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_file.t @@ -0,0 +1,18 @@ +use Test::Base; + +filters 'chomp'; +spec_file 't/spec2'; + +plan tests => 3 * blocks; + +run { + my $block = shift; + is ref($block), 'Test::Base::Block'; +}; + +my @blocks = blocks; + +is($blocks[0]->foo, 1); +is($blocks[0]->bar, 2); +is($blocks[1]->foo, 3); +is($blocks[1]->bar, 4); diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_string.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_string.t new file mode 100644 index 0000000..2931fd0 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/spec_string.t @@ -0,0 +1,29 @@ +use Test::Base; + +filters 'chomp'; +spec_string <<'...'; +=== +--- foo +1 +--- bar +2 +=== +--- foo +3 +--- bar +4 +... + +plan tests => 3 * blocks; + +run { + my $block = shift; + is ref($block), 'Test::Base::Block'; +}; + +my @blocks = blocks; + +is $blocks[0]->foo, 1; +is $blocks[0]->bar, 2; +is $blocks[1]->foo, 3; +is $blocks[1]->bar, 4; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-deep.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-deep.t new file mode 100644 index 0000000..a7bc63f --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-deep.t @@ -0,0 +1,14 @@ +use Test::Base; + +__DATA__ +=== Complex generic manipulation +--- (test) lines chomp Split Reverse Join=\s reverse join=\n +Hey +I Like Ike +Give Peace A Chance +Love Is The Answer +--- (flipper) chomp +Answer The Is Love +Chance A Peace Give +Ike Like I +Hey diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-regexp.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-regexp.t new file mode 100644 index 0000000..c310d92 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split-regexp.t @@ -0,0 +1,18 @@ +use Test::Base; + +__DATA__ +=== +--- (xxx) chomp split=// reverse join +one +two +--- (yyy) chomp +owt +eno + +=== +--- (xxx) split=/[XY]/ join=-: oneXtwoYthree +--- (yyy): one-two-three + +=== +--- (xxx) split join=-: one two three +--- (yyy): one-two-three diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split.t new file mode 100644 index 0000000..5f7781c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/split.t @@ -0,0 +1,37 @@ +use Test::Base tests => 2; + +my $b = next_block; +is $b->ok, "I am ok. Are you ok?"; + +$b = next_block; +is_deeply [$b->words], [qw(foo bar baz)]; + +__DATA__ + +=== Split a string of lines into words +--- ok split join=\s +I am +ok. Are you +ok? + +=== Split on a string +--- words split=x: fooxbarxbaz +--- LAST +The other tests don't work yet. + +=== +--- ok lines split +I am +ok. Are you +ok? + + +=== +--- test lines Split Reverse Join reverse join=\n +I Like Ike +Give Peace A Chance +Love Is The Answer +--- flip +Answer The Is Love +Chance A Peace Give +Ike Like I diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.t new file mode 100644 index 0000000..2bf202a --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.t @@ -0,0 +1,6 @@ +use Test::Base tests => 1; +use lib 't'; + +eval "require 'strict-warnings.test'"; +like "$@", + qr{\QGlobal symbol "\E.\Qglobal_variable" requires explicit package name\E}; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.test b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.test new file mode 100644 index 0000000..c27a63c --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict-warnings.test @@ -0,0 +1,3 @@ +use Test::Base; + +$global_variable = 42; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict.t new file mode 100644 index 0000000..1be94b4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/strict.t @@ -0,0 +1,11 @@ +use Test::Base; + +__DATA__ +=== Strict Test + +--- perl strict +my $x = 5; +--- strict +use strict; +use warnings; +my $x = 5; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-autoclass.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-autoclass.t new file mode 100644 index 0000000..cc06d49 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-autoclass.t @@ -0,0 +1,38 @@ +package Testorama; +use Test::Base -Base; + +BEGIN { + our @EXPORT = qw(run_orama); +} + +sub run_orama { + pass 'Testorama EXPORT ok'; +} + +package Test::Base::Block; + +sub foofoo { + Test::More::pass 'Test::Base::Block ok'; +} + +package Testorama::Filter; +use base 'Test::Base::Filter'; + +sub rama_rama { + Test::More::pass 'Testorama::Filter ok'; +} + +package main; +# use Testorama; +BEGIN { Testorama->import } + +plan tests => 3; + +run_orama; + +[blocks]->[0]->foofoo; + +__DATA__ +=== +--- stuff chomp rama_rama +che! diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-import.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-import.t new file mode 100644 index 0000000..b43285e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass-import.t @@ -0,0 +1,4 @@ +# Make sure a subclass passes along inport args +use t::Subclass tests => 1; + +pass; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass.t new file mode 100644 index 0000000..a61e0a5 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass.t @@ -0,0 +1,35 @@ +use lib 't'; +use TestBass tests => 7; + +eval "use Test::Base"; +is "$@", '', 'ok to import parent class *after* subclass'; + +my @blocks = blocks; + +is ref(default_object), 'TestBass'; + +is $blocks[0]->el_nombre, 'Test One'; + +ok $blocks[0]->can('feedle'), 'Does feedle method exist?'; + +run_is xxx => 'yyy'; + +run_like_hell 'thunk', qr(thunk,.*ile.*unk); + +__DATA__ +=== Test One +--- xxx lines foo_it join +a lion +a tiger +a liger +--- yyy +foo - a lion +foo - a tiger +foo - a liger + +=== +--- thunk +A thunk, a pile of junk +=== +--- thunk +A thunk, a jile of punk diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass_late.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass_late.t new file mode 100644 index 0000000..290fbe9 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/subclass_late.t @@ -0,0 +1,13 @@ +use lib 't'; +use Test::Base tests => 1; + +# I can't remember why I added this but it was preventing multiple +# levels of inheritance which I needed for the YAML and YAML-Syck +# projects. And is also just damn useful in general. + +SKIP: { + skip("yagni For now...", 1); + eval "use TestBass"; + + like "$@", qr{Can't use TestBass after using Test::Base}; +} diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tail.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tail.t new file mode 100644 index 0000000..81c6473 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tail.t @@ -0,0 +1,19 @@ +use Test::Base; + +__DATA__ +=== +--- in lines tail +one +two +three +--- out +three + +=== +--- in lines tail=2 join +one +two +three +--- out +two +three diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tie_output.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tie_output.t new file mode 100644 index 0000000..be7f671 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/tie_output.t @@ -0,0 +1,21 @@ +use Test::Base tests => 3; + +my $out = "Stuff\n"; +my $err = ''; + +tie_output(*STDOUT, $out); +tie_output(*STDERR, $err); + +warn "Keep out!\n"; + +print "The eagle has landed\n"; + +is $out, "Stuff\nThe eagle has landed\n"; + +print "This bird had flown\n"; + +is $out, "Stuff\nThe eagle has landed\nThis bird had flown\n"; + +print STDERR "You 'lil rascal...\n"; + +is $err, "Keep out!\nYou 'lil rascal...\n"; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/trim.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/trim.t new file mode 100644 index 0000000..71bd405 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/trim.t @@ -0,0 +1,38 @@ +use Test::Base tests => 4; + +my ($block1, $block2) = blocks; + +is $block1->foo, "line 1\nline 2\n"; +is $block1->bar, "line1\nline2\n"; +is $block2->foo, "aaa\n\nbbb\n"; +is $block2->bar, "\nxxxx\n\nyyyy\n\n"; + + +__END__ + +=== One + +--- foo +line 1 +line 2 + +--- bar + +line1 +line2 + +=== Two + +--- bar -trim + +xxxx + +yyyy + +--- foo + +aaa + +bbb + + diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/unchomp.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/unchomp.t new file mode 100644 index 0000000..15435b4 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/unchomp.t @@ -0,0 +1,12 @@ +use Test::Base tests => 1; + +filters qw(norm trim chomp); + +is next_block->input, "on\ntw\nthre\n"; + +__END__ +=== +--- input lines chomp chop unchomp join +one +two +three diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/use-test-more.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/use-test-more.t new file mode 100644 index 0000000..887c445 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/use-test-more.t @@ -0,0 +1,3 @@ +use Test::Base tests => 3; + +pass for 1 .. 3; diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/write_file.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/write_file.t new file mode 100644 index 0000000..cb1ed42 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/write_file.t @@ -0,0 +1,24 @@ +use t::BaseTest tests => 4; + +my $file = 't/output/foo.txt'; + +ok not(-e $file), "$file doesn't already exist"; + +first_block; + +ok -e $file, "$file exists"; + +open my $fh, $file + or die "Can't open '$file' for input:\n$!"; +is join('', <$fh>), + "One two\nBuckle my shoe\n", + '$file content is right'; + +is first_block->poem, $file, 'Returns file name'; + +__END__ + +=== +--- poem write_file=t/output/foo.txt +One two +Buckle my shoe diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/xxx.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/xxx.t new file mode 100644 index 0000000..b77569e --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/xxx.t @@ -0,0 +1,24 @@ +use Test::Base; + +plan eval { require YAML; 1 } + ? (tests => 1 * blocks) + : skip_all => 'Requires YAML'; + +my ($block) = blocks; + +eval { XXX($block->text) }; + +my $error = "$@"; +$error =~ s/\\/\//g; + +is $error, $block->xxx, $block->name; + +__DATA__ +=== XXX Test +--- text eval ++{ foo => 'bar' } +--- xxx +--- +foo: bar +... + at t/xxx.t line 9 diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/yaml.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/yaml.t new file mode 100644 index 0000000..e7477f0 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/yaml.t @@ -0,0 +1,50 @@ +use Test::Base; + +plan eval { require YAML; 1 } + ? (tests => 1 * blocks) + : skip_all => 'Requires YAML'; + +filters { + data1 => 'yaml', + data2 => 'eval', +}; + +run_compare; + +__END__ +=== YAML Hashes +--- data1 +foo: xxx +bar: [ 1, 2, 3] +--- data2 ++{ + foo => 'xxx', + bar => [1,2,3], +} + + +=== YAML Arrays +--- data1 +- foo +- bar +- {x: y} +--- data2 +[ + 'foo', + 'bar', + { x => 'y' }, +] + + +=== YAML Scalar +--- data1 +--- | + sub foo { + print "bar\n"; + } +--- data2 +<<'END'; +sub foo { + print "bar\n"; +} +END diff --git a/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/zero-blocks.t b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/zero-blocks.t new file mode 100644 index 0000000..c7dbe61 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl-0.54/t/zero-blocks.t @@ -0,0 +1,9 @@ +use Test::Base; + +plan tests => 1; + +ok(blocks == 0, 'Ok to have zero blocks'); + +__DATA__ + +There really is nothing here to test... diff --git a/deb-src/libtest-base-perl/libtest-base-perl_0.54-1.diff.gz b/deb-src/libtest-base-perl/libtest-base-perl_0.54-1.diff.gz new file mode 100644 index 0000000000000000000000000000000000000000..ea5a5cbd17e74696e6f9ffff49b2b772dfe3c883 GIT binary patch literal 2270 zcmV<42qE_$iwFQ<2Wm(H1C>~9bK5o&{(Slsdu?VaokU80iJeoN#!hlc+{uflaXQm! zIyVpri5Qav2LP?eZU5H&f%{|kEI>-M!O*kGODD> zqe=YmFxEyb#;KesQH~Q`I-~R6a5(&e_+81<7_IiAh ziBr0qQh2;D3dY@PO1k3r0`H#HDo>*qvXW(Lrvz)6%pp$wAD__i;Eq6aUZ%1N`n<%$ z_-HU<)3#Fc`6^m}n8XK@!Kk;{mQ_WS%dWuDepo8<1-q3MQ3@SiVicBrcAZy2*Gd$5 zv%9xKl@9-;nbHf75?!$NS4P(rom5wg0AsP1v!}VT&c-5F+GTNo76DoO*c*PVaxGHG zOzC9~f1vGWu~;g1LnlVe^V5#>h+c?d1&Q-(QR-_tNsIFImbMR0l&LU4>=&r?F*t}H z#gpFfwJu~O76@48Ts0k!trRB7;-m_T$0=MKUovFR5Xo_G_)B7=57*FO@dxtPWykYz zyUnpPb$K=3VnL(enbAwjNVQgPYgyuX7gZpUNUps5_welu8&M9Vs|^H1j#q1DJ@|uV zrp@zTUm?x^!HKW2E8ZWld7Btjg)BIuR5(GYQP;90UZ=_h&5bDJQkyH9YvUONrd>84 zm8II&*vX1qCaGTFMiw^1`&k*#M* zF05t!L5r^>(u`mR@7^Z>g*cm4gOAFk zR|Z7jyafQDO#pVrQ6UseR+WfK%v27pK?oY}cs~lbd+K^7!h=i%XIb1E2<`yVrOekc zy`zX`GC>_g45-RQB7N#Ltg66{MxVE4WNpO^h&F76wwXc^Z#NJK;e8r~7wndm07f`u zMrl1-XgOya5Ke(`aNVjai zO<&=664S52lqU|jmnwrAiAthMU9}`LiV@=ZYVs03Q)JG3yx2sQ?5VGb0?Ec zUG%(cDhoT!7(tyX5m^|ij80JJWC)A=TmcItimn}hkGuPT=(S2AX+ajGwPcUPic#(m z1}Y2`2DW%B_i6T9_FHTMPnJ88U&Xnh3T9za`+^0`JP<%I3$?W=qP%0WiI~rI&LN6> z(XNwT0i1Ul^t|9^&htaw@ve53!X?=bW`bO2n%wtxuEVtQFs4|d&^K}EGY>?+80cXi;m z_5I(+wKe0JD#yNQMROiyeCeBp3K*eB7gh5vJfIW&EzQDb{B)YT>4Q^V>8aR!4{ub7 zHF-Xz=0~gV*5e&pyt?^*M?V}DW)(5=)6TOB)AwdgdV2x%Zx&K_5zE9EuiwA>wUzmz zXsf=-x3K-4SzfL1nC(XNR<;wby>OrnPuRAg)KELjiiOwJv^G3fpzf*#0 z&!xe!ofo$a_zKV)^0t6V-Zf}>-PTmS(ppoJL!DO z>p#CZdpDqyk3YYeHo3JKT z#ymg_lw^n)noQxR3aOf^D(Tg`kG(Pv&}YU$-R6Bv^u9zN zYQhE$<2S0TKlg@qWt}V#9zV)x9_@Vd`s~7R0`I{|uf(>_hA^rSMxK*UW_+!%83t*t z#)U4UcGdWgR~K(atw(?DUj5NP78tu1yX3`Mwv!hJk9=NiW8UYb(cS znAKNLa=qj@5&cFBBXOQWi#7%WM@hf)>wnNC*Fue&zs{=dbF}aJnCX<7I#+fVfL2%>t6$j2~X(~~dn{zLsA~E#z zL-P5v)QuQCrp~E0`0)j~_P~Ar_n4l0ywfoE)8u=Yv0)ayX(?Q4j`XUaP0z>My`naXS?VF2+2=C-_Q+bR;;kUBI0~BFq^h4_! zr2YWU1mog&=MdkF4>ApE1)S*K*)W{Xq8HIQ4wK+2Pg)RB;Vx=@tiVE4kAk{AJyhk+ z_0;jkLb0+kpR?{Y2;t+GE@7x&Y6@wF1E`c>+rYzvWd8ca4$)5q>mSE}+kUh3tPx)*1ak2U35Uxnqhn@5i#bt7rJ zcJcR*6$WX!jcpgyHJTrstk4yaH^B77F7V%NI6u@ljZKc|tTF-4$=>wgQGj#r8*qLD s%<~e&0<9W4$E{D_&a4n*`0x|NxSP^se~LK6z2MdV0Jc+nao!aG0BFs1FaQ7m literal 0 HcmV?d00001 diff --git a/deb-src/libtest-base-perl/libtest-base-perl_0.54-1.dsc b/deb-src/libtest-base-perl/libtest-base-perl_0.54-1.dsc new file mode 100644 index 0000000..d21bf37 --- /dev/null +++ b/deb-src/libtest-base-perl/libtest-base-perl_0.54-1.dsc @@ -0,0 +1,33 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA1 + +Format: 1.0 +Source: libtest-base-perl +Binary: libtest-base-perl +Architecture: all +Version: 0.54-1 +Maintainer: Debian Perl Group +Uploaders: Florian Ragwitz , Damyan Ivanov +Homepage: http://search.cpan.org/dist/Test-Base/ +Standards-Version: 3.8.0 +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libtest-base-perl/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libtest-base-perl/ +Build-Depends: debhelper (>= 7) +Build-Depends-Indep: perl (>= 5.6), libspiffy-perl (>= 0.30), libtest-simple-perl (>= 0.62), libalgorithm-diff-perl, libtext-diff-perl, libyaml-perl +Checksums-Sha1: + 2505fb996b3c490ddb215647fb6a224d6b5cd421 45525 libtest-base-perl_0.54.orig.tar.gz + 16febbdf0c2ae6e7a5f26ab18b8bf8a5ff4660ef 2270 libtest-base-perl_0.54-1.diff.gz +Checksums-Sha256: + f63ef7b36e6c04c836034b496a2cf458f87162e49fcf320490d39d53a0a2cf51 45525 libtest-base-perl_0.54.orig.tar.gz + f5dae90a808c7d0d36d7b1f1189fa27f91e147a88c22a9cd717e85d800ef3ecb 2270 libtest-base-perl_0.54-1.diff.gz +Files: + 502a92cbbaea1d53ada4d8388e5e3b16 45525 libtest-base-perl_0.54.orig.tar.gz + c5f9103d19cc3144b2ed38f8a8ba609b 2270 libtest-base-perl_0.54-1.diff.gz + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEARECAAYFAkhqB4cACgkQHqjlqpcl9jsRUgCcCTmLcA1KTNBgcRqoENxYd1XC +EmIAoIj0PJPJlIOY9CtXy6si84p4YrL6 +=zKdL +-----END PGP SIGNATURE----- diff --git a/deb-src/libtest-base-perl/libtest-base-perl_0.54.orig.tar.gz b/deb-src/libtest-base-perl/libtest-base-perl_0.54.orig.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..31be569febf71f9686b82afcedff20730de37589 GIT binary patch literal 45525 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

evZe!NFH`Kcq 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 y!|). + +0.32 Thu Mar 14 13:37:51 EST 2002 + - Fix escaping of all-whitespace strings. + +0.31 Wed Feb 6 05:36:47 EST 2002 + - Remove stray $SIG{__DIE__} that was confessing on every die. + +0.3 Undocumented (sorry) + +0.11 Mon Dec 10 06:23:00 EST 2001 + - Remove hardcoded date string from t/general.t's test data, because + localtime is used to generate this in Diff.pm and the local machine's + timezone (and locale?) can cause the localtime for a given mtime to be + quite different. Reported by Andreas Marcel Riechert + of cpan-testers. + - Start this Changes file. + - Added hunk_header() and hunk_footer() for symmetry in overloading. + - Added t/ext_format.t + +0.1 + - Initial public release. + - Added filename, filehandle, and string I/O options + - API resembles Algorithm::Diff's a bit more + - Reimplement output formats as classes so that external (user-supplied) + can be specified as class names (My::Diff::Format) and so that they may + be inherited from. Should probably break out hunk_header() from hunk(). + - Add footer() to all formats diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST new file mode 100644 index 0000000..3a93222 --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST @@ -0,0 +1,12 @@ +Changes +MANIFEST +MANIFEST.SKIP +Makefile.PL +lib/Text/Diff.pm +lib/Text/Diff/Table.pm +t/ext_format.t +t/general.t +t/inputs.t +t/keygen.t +t/outputs.t +t/table.t diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST.SKIP b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST.SKIP new file mode 100644 index 0000000..46f8173 --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/MANIFEST.SKIP @@ -0,0 +1,10 @@ +\.bak$ +\.sw[a-z]$ +\.tar\.gz$ +^tmp/ +^blib/ +^Makefile$ +\.old$ +^A$ +^B$ +^pm_to_blib$ diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/Makefile.PL b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/Makefile.PL new file mode 100644 index 0000000..9226b5a --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/Makefile.PL @@ -0,0 +1,20 @@ +use ExtUtils::MakeMaker; + +use strict ; + +WriteMakefile( + 'NAME' => 'Text::Diff', + 'VERSION_FROM' => 'lib/Text/Diff.pm', + 'PREREQ_PM' => { + 'Algorithm::Diff' => 0, + }, +); + +sub MY::libscan { + package MY ; + my $self = shift ; + my ( $path ) = @_ ; + return '' if /\.sw[a-z]$/ ; + return '' unless length $self->SUPER::libscan( $path ) ; + return $path ; +} diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/changelog b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/changelog new file mode 100644 index 0000000..444057c --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/changelog @@ -0,0 +1,41 @@ +libtext-diff-perl (0.35-3maemo1) fremantle; urgency=low + + * New Maemo packaging + + -- Nito Martinez Wed, 14 Apr 2010 07:11:11 +0100 + + +llibtext-diff-perl (0.35-3) unstable; urgency=low + + [ gregor herrmann ] + * 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/rules: delete /usr/lib/perl5 only if it exists. + + [ Gunnar Wolf ] + * Bumped up standards-version to 3.7.3 (no changes needed) + * Upgraded debhelper compat level to 6 + * Moved debhelper to b-d + * Clarified the copyright information + * Remove the versioned dependency on Perl >= 5.6.0 + * Make clean no longer ignores results + * Removed debian/substvars, which is auto-generated and should be + auto-cleaned + * Modified debian/watch to be more in line with our general style + * Added myself as an uploader + + -- Gunnar Wolf Wed, 20 Feb 2008 16:50:08 -0600 + +libtext-diff-perl (0.35-2) unstable; urgency=low + + * Adds debian/watch file so uscan will work + + -- Jay Bonci Mon, 11 Oct 2004 02:40:26 -0400 + +libtext-diff-perl (0.35-1) unstable; urgency=low + + * Initial Release (closes: #178078) + + -- Jay Bonci Sun, 21 Sep 2003 02:50:48 -0400 diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/compat b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/compat new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/compat @@ -0,0 +1 @@ +6 diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/control b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/control new file mode 100644 index 0000000..feb895a --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/control @@ -0,0 +1,19 @@ +Source: libtext-diff-perl +Section: perl +Priority: optional +Maintainer: Debian Perl Group +Uploaders: Jay Bonci , Gunnar Wolf +Build-Depends: debhelper7 +Build-Depends-Indep: perl (>= 5.8), libalgorithm-diff-perl +Standards-Version: 3.7.3 +Homepage: http://search.cpan.org/dist/Text-Diff/ +Vcs-Svn: svn://svn.debian.org/pkg-perl/trunk/libtext-diff-perl/ +Vcs-Browser: http://svn.debian.org/wsvn/pkg-perl/trunk/libtext-diff-perl/ + +Package: libtext-diff-perl +Architecture: all +Depends: ${perl:Depends}, libalgorithm-diff-perl +Description: Perform diffs on files and record sets in perl + CPAN's Text::Diff provides a basic set of services akin to the GNU diff + utility. It is not anywhere near as feature complete as GNU diff, but + it is better integrated with Perl and available on all platforms diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/copyright b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/copyright new file mode 100644 index 0000000..40ea5f7 --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/copyright @@ -0,0 +1,18 @@ +This package was debianized by Jay Bonci on +Thu, 23 Jan 2003 10:08:30 -0500. + +It was downloaded from http://search.cpan.org/dist/Text-Diff + +Upstream Author: Barrie Slaymaker + +Copyright 2001, Barrie Slaymaker. All Rights Reserved. + +You may use this under the terms of either the Artistic License or +GNU Public License v 2.0 or greater. + +See: +/usr/share/common-licenses/Artistic + - or - +/usr/share/common-licenses/GPL + +For more information regarding these licensing options. diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/rules b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/rules new file mode 100755 index 0000000..f5b977c --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/rules @@ -0,0 +1,53 @@ +#!/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=`pwd | sed -e "s/.*\/\\(.*\\)-.*/\\1/"` + + +build: + dh_testdir + # Add here commands to compile the package. + perl Makefile.PL verbose INSTALLDIRS=vendor +clean: + dh_testdir + dh_testroot + + [ ! -f Makefile ] || $(MAKE) distclean + rm -f Makefile.old + dh_clean + +install: + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + $(MAKE) PREFIX=$(CURDIR)/debian/$(PACKAGE)/usr OPTIMIZE="-O2 -g -Wall" test install + [ ! -d $(CURDIR)/debian/$(shell dh_listpackages)/usr/lib/perl5 ] || rmdir --ignore-fail-on-non-empty --parents --verbose $(CURDIR)/debian/$(shell dh_listpackages)/usr/lib/perl5 + +binary-arch:; +binary-indep: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installman + dh_installchangelogs Changes + dh_link + dh_strip + 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/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/watch b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/watch new file mode 100644 index 0000000..2362d8e --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://search.cpan.org/dist/Text-Diff/ .*/Text-Diff-(\d[\d\.]*)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip) diff --git a/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/lib/Text/Diff.pm b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/lib/Text/Diff.pm new file mode 100644 index 0000000..8f9ddf9 --- /dev/null +++ b/deb-src/libtext-diff-perl/libtext-diff-perl-0.35/lib/Text/Diff.pm @@ -0,0 +1,725 @@ +package Text::Diff; + +$VERSION = 0.35; + +=head1 NAME + +Text::Diff - Perform diffs on files and record sets + +=head1 SYNOPSIS + + use Text::Diff; + + ## Mix and match filenames, strings, file handles, producer subs, + ## or arrays of records; returns diff in a string. + ## WARNING: can return B diffs for large files. + my $diff = diff "file1.txt", "file2.txt", { STYLE => "Context" }; + my $diff = diff \$string1, \$string2, \%options; + my $diff = diff \*FH1, \*FH2; + my $diff = diff \&reader1, \&reader2; + my $diff = diff \@records1, \@records2; + + ## May also mix input types: + my $diff = diff \@records1, "file_B.txt"; + +=head1 DESCRIPTION + +C provides a basic set of services akin to the GNU C utility. It +is not anywhere near as feature complete as GNU C, but it is better +integrated with Perl and available on all platforms. It is often faster than +shelling out to a system's C executable for small files, and generally +slower on larger files. + +Relies on L for, well, the algorithm. This may not produce +the same exact diff as a system's local C executable, but it will be a +valid diff and comprehensible by C. We haven't seen any differences +between Algorithm::Diff's logic and GNU diff's, but we have not examined them +to make sure they are indeed identical. + +B: If you don't want to import the C function, do one of the +following: + + use Text::Diff (); + + require Text::Diff; + +That's a pretty rare occurence, so C is exported by default. + +=cut + +use Exporter; +@ISA = qw( Exporter ); +@EXPORT = qw( diff ); + +use strict; +use Carp; +use Algorithm::Diff qw( traverse_sequences ); + +## Hunks are made of ops. An op is the starting index for each +## sequence and the opcode: +use constant A => 0; # Array index before match/discard +use constant B => 1; +use constant OPCODE => 2; # "-", " ", "+" +use constant FLAG => 3; # What to display if not OPCODE "!" + + +=head1 OPTIONS + +diff() takes two parameters from which to draw input and a set of +options to control it's output. The options are: + +=over + +=item FILENAME_A, MTIME_A, FILENAME_B, MTIME_B + +The name of the file and the modification time "files" + +These are filled in automatically for each file when diff() is passed a +filename, unless a defined value is passed in. + +If a filename is not passed in and FILENAME_A and FILENAME_B are not provided +or C, the header will not be printed. + +Unused on C diffs. + +=item OFFSET_A, OFFSET_B + +The index of the first line / element. These default to 1 for all +parameter types except ARRAY references, for which the default is 0. This +is because ARRAY references are presumed to be data structures, while the +others are line oriented text. + +=item STYLE + +"Unified", "Context", "OldStyle", or an object or class reference for a class +providing C, C, C, C and +C methods. The two footer() methods are provided for +overloading only; none of the formats provide them. + +Defaults to "Unified" (unlike standard C, but Unified is what's most +often used in submitting patches and is the most human readable of the three. + +If the package indicated by the STYLE has no hunk() method, c will +load it automatically (lazy loading). Since all such packages should inherit +from Text::Diff::Base, this should be marvy. + +Styles may be specified as class names (C