From a3c30894fec547fa24ebb27d44f80da84f18bba7 Mon Sep 17 00:00:00 2001 From: zide05 <845465009@qq.com> Date: Thu, 24 Dec 2020 18:37:08 +0800 Subject: [PATCH 01/23] update ROUGE resource, change /remote-home/yrachen related code --- fastSum/PointerGen/data_util/config.py | 46 - fastSum/PointerGen/data_util/utils.py | 9 +- fastSum/PointerGen/decode.py | 28 +- fastSum/PointerGen/train.py | 21 +- fastSum/PointerGen/training_ptr_gen/main.py | 126 - fastSum/resources/ROUGE/DB_File-1.835.tar.gz | Bin 0 -> 134874 bytes fastSum/resources/ROUGE/DB_File-1.835/Changes | 644 + .../resources/ROUGE/DB_File-1.835/DB_File.bs | 0 .../resources/ROUGE/DB_File-1.835/DB_File.c | 3152 ++++ .../resources/ROUGE/DB_File-1.835/DB_File.o | Bin 0 -> 370584 bytes .../resources/ROUGE/DB_File-1.835/DB_File.pm | 2310 +++ .../ROUGE/DB_File-1.835/DB_File.pm.bak | 2310 +++ .../resources/ROUGE/DB_File-1.835/DB_File.xs | 2054 +++ .../resources/ROUGE/DB_File-1.835/DB_File_BS | 6 + .../resources/ROUGE/DB_File-1.835/MANIFEST | 33 + .../resources/ROUGE/DB_File-1.835/META.json | 39 + .../resources/ROUGE/DB_File-1.835/META.yml | 21 + .../resources/ROUGE/DB_File-1.835/MYMETA.json | 39 + .../resources/ROUGE/DB_File-1.835/MYMETA.yml | 21 + .../resources/ROUGE/DB_File-1.835/Makefile | 1082 ++ .../resources/ROUGE/DB_File-1.835/Makefile.PL | 361 + fastSum/resources/ROUGE/DB_File-1.835/README | 642 + .../ROUGE/DB_File-1.835/blib/arch/.exists | 0 .../blib/arch/auto/DB_File/.exists | 0 .../blib/arch/auto/DB_File/DB_File.so | Bin 0 -> 257120 bytes .../ROUGE/DB_File-1.835/blib/bin/.exists | 0 .../ROUGE/DB_File-1.835/blib/lib/.exists | 0 .../ROUGE/DB_File-1.835/blib/lib/DB_File.pm | 2310 +++ .../blib/lib/auto/DB_File/.exists | 0 .../ROUGE/DB_File-1.835/blib/man1/.exists | 0 .../ROUGE/DB_File-1.835/blib/man3/.exists | 0 .../ROUGE/DB_File-1.835/blib/man3/DB_File.3pm | 1783 ++ .../ROUGE/DB_File-1.835/blib/script/.exists | 0 .../resources/ROUGE/DB_File-1.835/config.in | 97 + .../resources/ROUGE/DB_File-1.835/constants.h | 455 + .../ROUGE/DB_File-1.835/constants.xs | 90 + fastSum/resources/ROUGE/DB_File-1.835/dbinfo | 133 + .../resources/ROUGE/DB_File-1.835/fallback.h | 455 + .../resources/ROUGE/DB_File-1.835/fallback.xs | 88 + .../ROUGE/DB_File-1.835/hints/dynixptx.pl | 3 + .../ROUGE/DB_File-1.835/hints/sco.pl | 2 + .../ROUGE/DB_File-1.835/patches/5.004 | 93 + .../ROUGE/DB_File-1.835/patches/5.004_01 | 217 + .../ROUGE/DB_File-1.835/patches/5.004_02 | 217 + .../ROUGE/DB_File-1.835/patches/5.004_03 | 223 + .../ROUGE/DB_File-1.835/patches/5.004_04 | 209 + .../ROUGE/DB_File-1.835/patches/5.004_05 | 209 + .../ROUGE/DB_File-1.835/patches/5.005 | 209 + .../ROUGE/DB_File-1.835/patches/5.005_01 | 209 + .../ROUGE/DB_File-1.835/patches/5.005_02 | 264 + .../ROUGE/DB_File-1.835/patches/5.005_03 | 250 + .../ROUGE/DB_File-1.835/patches/5.6.0 | 294 + .../resources/ROUGE/DB_File-1.835/pm_to_blib | 0 .../resources/ROUGE/DB_File-1.835/ppport.h | 7667 ++++++++ .../ROUGE/DB_File-1.835/t/db-btree.t | 1657 ++ .../ROUGE/DB_File-1.835/t/db-btree.t.bak | 1657 ++ .../resources/ROUGE/DB_File-1.835/t/db-hash.t | 1225 ++ .../ROUGE/DB_File-1.835/t/db-hash.t.bak | 1225 ++ .../ROUGE/DB_File-1.835/t/db-recno.t | 1595 ++ .../ROUGE/DB_File-1.835/t/db-recno.t.bak | 1595 ++ fastSum/resources/ROUGE/DB_File-1.835/t/pod.t | 18 + .../resources/ROUGE/DB_File-1.835/t/pod.t.bak | 18 + fastSum/resources/ROUGE/DB_File-1.835/typemap | 57 + .../resources/ROUGE/DB_File-1.835/version.c | 83 + .../resources/ROUGE/DB_File-1.835/version.o | Bin 0 -> 73776 bytes .../resources/ROUGE/RELEASE-1.5.5/README.txt | 295 + .../ROUGE/RELEASE-1.5.5/RELEASE-NOTE.txt | 232 + .../ROUGE/RELEASE-1.5.5/ROUGE-1.5.5.pl | 3294 ++++ .../WordNet-1.6-Exceptions/WordNet-1.6.exc.db | Bin 0 -> 638976 bytes .../data/WordNet-1.6-Exceptions/adj.exc | 1322 ++ .../data/WordNet-1.6-Exceptions/adv.exc | 7 + .../WordNet-1.6-Exceptions/buildExeptionDB.pl | 21 + .../data/WordNet-1.6-Exceptions/noun.exc | 5969 +++++++ .../data/WordNet-1.6-Exceptions/verb.exc | 5281 ++++++ .../RELEASE-1.5.5/data/WordNet-1.6.exc.db | Bin 0 -> 638976 bytes .../WordNet-2.0-Exceptions/WordNet-2.0.exc.db | Bin 0 -> 294912 bytes .../data/WordNet-2.0-Exceptions/adj.exc | 1490 ++ .../data/WordNet-2.0-Exceptions/adv.exc | 7 + .../WordNet-2.0-Exceptions/buildExeptionDB.pl | 21 + .../data/WordNet-2.0-Exceptions/noun.exc | 2041 +++ .../data/WordNet-2.0-Exceptions/verb.exc | 2401 +++ .../RELEASE-1.5.5/data/WordNet-2.0.exc.db | Bin 0 -> 294912 bytes .../RELEASE-1.5.5/data/smart_common_words.txt | 598 + .../ROUGE/RELEASE-1.5.5/docs/ACL2004.pdf | Bin 0 -> 351272 bytes .../ROUGE/RELEASE-1.5.5/docs/COLING2004.pdf | Bin 0 -> 403143 bytes .../ROUGE/RELEASE-1.5.5/docs/NAACL2003.pdf | 14383 ++++++++++++++++ .../ROUGE/RELEASE-1.5.5/docs/NTCIR4.pdf | Bin 0 -> 666097 bytes .../RELEASE-1.5.5/docs/ROUGE-Note-v1.4.2.pdf | Bin 0 -> 389873 bytes .../ROUGE/RELEASE-1.5.5/docs/WAS2004.pdf | Bin 0 -> 389873 bytes .../ROUGE/RELEASE-1.5.5/runROUGE-test.pl | 51 + .../sample-output/DUC2002-BE-F.in.26.lst.out | 0 .../DUC2002-BE-F.in.26.simple.out | 0 .../sample-output/DUC2002-BE-L.in.26.lst.out | 0 .../DUC2002-BE-L.in.26.simple.out | 0 .../DUC2002-ROUGE.in.26.spl.lst.out | 0 .../sample-output/DUC2002-ROUGE.in.26.spl.out | 0 ...UGE-test-c95-2-1-U-r1000-n4-w1.2-a-m-s.out | 0 ...ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m.out | 0 .../ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a.out | 0 ...test-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out | 0 ...E-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m.out | 0 ...UGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a.out | 0 ...test-c95-2-1-U-r1000-n4-w1.2-l10-a-m-s.out | 0 ...E-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m.out | 0 ...UGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a.out | 0 ...rify-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out | 160 + ...-spl-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out | 160 + .../sample-test/DUC2002-BE-F.in.26.lst | 59 + .../sample-test/DUC2002-BE-F.in.26.simple.xml | 946 + .../sample-test/DUC2002-BE-L.in.26.lst | 59 + .../sample-test/DUC2002-BE-L.in.26.simple.xml | 946 + .../sample-test/DUC2002-ROUGE.in.26.spl.lst | 59 + .../sample-test/DUC2002-ROUGE.in.26.spl.xml | 946 + .../DUC2002/BE-F/D061.M.100.J.26.mini.be | 64 + .../DUC2002/BE-F/D061.M.100.J.I.mini.be | 57 + .../DUC2002/BE-F/D062.M.100.J.26.mini.be | 56 + .../DUC2002/BE-F/D062.M.100.J.A.mini.be | 48 + .../DUC2002/BE-F/D063.M.100.J.26.mini.be | 60 + .../DUC2002/BE-F/D063.M.100.J.E.mini.be | 55 + .../DUC2002/BE-F/D064.M.100.J.26.mini.be | 67 + .../DUC2002/BE-F/D064.M.100.J.B.mini.be | 49 + .../DUC2002/BE-F/D065.M.100.J.26.mini.be | 66 + .../DUC2002/BE-F/D065.M.100.J.F.mini.be | 49 + .../DUC2002/BE-F/D066.M.100.J.26.mini.be | 59 + .../DUC2002/BE-F/D066.M.100.J.I.mini.be | 63 + .../DUC2002/BE-F/D067.M.100.F.26.mini.be | 73 + .../DUC2002/BE-F/D067.M.100.F.I.mini.be | 63 + .../DUC2002/BE-F/D068.M.100.F.26.mini.be | 53 + .../DUC2002/BE-F/D068.M.100.F.A.mini.be | 49 + .../DUC2002/BE-F/D069.M.100.F.26.mini.be | 64 + .../DUC2002/BE-F/D069.M.100.F.C.mini.be | 42 + .../DUC2002/BE-F/D070.M.100.F.26.mini.be | 64 + .../DUC2002/BE-F/D070.M.100.F.D.mini.be | 51 + .../DUC2002/BE-F/D071.M.100.F.26.mini.be | 58 + .../DUC2002/BE-F/D071.M.100.F.D.mini.be | 39 + .../DUC2002/BE-F/D072.M.100.F.26.mini.be | 63 + .../DUC2002/BE-F/D072.M.100.F.J.mini.be | 47 + .../DUC2002/BE-F/D073.M.100.B.26.mini.be | 63 + .../DUC2002/BE-F/D073.M.100.B.J.mini.be | 47 + .../DUC2002/BE-F/D074.M.100.B.26.mini.be | 67 + .../DUC2002/BE-F/D074.M.100.B.A.mini.be | 55 + .../DUC2002/BE-F/D075.M.100.B.26.mini.be | 70 + .../DUC2002/BE-F/D075.M.100.B.E.mini.be | 56 + .../DUC2002/BE-F/D076.M.100.B.26.mini.be | 69 + .../DUC2002/BE-F/D076.M.100.B.E.mini.be | 63 + .../DUC2002/BE-F/D077.M.100.B.26.mini.be | 59 + .../DUC2002/BE-F/D077.M.100.B.H.mini.be | 62 + .../DUC2002/BE-F/D078.M.100.B.26.mini.be | 61 + .../DUC2002/BE-F/D078.M.100.B.J.mini.be | 59 + .../DUC2002/BE-F/D079.M.100.A.26.mini.be | 65 + .../DUC2002/BE-F/D079.M.100.A.I.mini.be | 59 + .../DUC2002/BE-F/D080.M.100.A.26.mini.be | 54 + .../DUC2002/BE-F/D080.M.100.A.E.mini.be | 52 + .../DUC2002/BE-F/D081.M.100.A.26.mini.be | 75 + .../DUC2002/BE-F/D081.M.100.A.D.mini.be | 47 + .../DUC2002/BE-F/D082.M.100.A.26.mini.be | 59 + .../DUC2002/BE-F/D082.M.100.A.C.mini.be | 49 + .../DUC2002/BE-F/D083.M.100.A.26.mini.be | 62 + .../DUC2002/BE-F/D083.M.100.A.G.mini.be | 59 + .../DUC2002/BE-F/D084.M.100.A.26.mini.be | 63 + .../DUC2002/BE-F/D084.M.100.A.H.mini.be | 54 + .../DUC2002/BE-F/D085.M.100.D.26.mini.be | 69 + .../DUC2002/BE-F/D085.M.100.D.H.mini.be | 66 + .../DUC2002/BE-F/D086.M.100.D.26.mini.be | 76 + .../DUC2002/BE-F/D086.M.100.D.B.mini.be | 66 + .../DUC2002/BE-F/D087.M.100.D.26.mini.be | 72 + .../DUC2002/BE-F/D087.M.100.D.B.mini.be | 49 + .../DUC2002/BE-F/D089.M.100.D.26.mini.be | 76 + .../DUC2002/BE-F/D089.M.100.D.G.mini.be | 58 + .../DUC2002/BE-F/D090.M.100.D.26.mini.be | 54 + .../DUC2002/BE-F/D090.M.100.D.J.mini.be | 52 + .../DUC2002/BE-F/D091.M.100.C.26.mini.be | 62 + .../DUC2002/BE-F/D091.M.100.C.F.mini.be | 59 + .../DUC2002/BE-F/D092.M.100.C.26.mini.be | 58 + .../DUC2002/BE-F/D092.M.100.C.A.mini.be | 57 + .../DUC2002/BE-F/D093.M.100.C.26.mini.be | 69 + .../DUC2002/BE-F/D093.M.100.C.H.mini.be | 55 + .../DUC2002/BE-F/D094.M.100.C.26.mini.be | 64 + .../DUC2002/BE-F/D094.M.100.C.D.mini.be | 45 + .../DUC2002/BE-F/D095.M.100.C.26.mini.be | 64 + .../DUC2002/BE-F/D095.M.100.C.H.mini.be | 51 + .../DUC2002/BE-F/D096.M.100.C.26.mini.be | 50 + .../DUC2002/BE-F/D096.M.100.C.G.mini.be | 42 + .../DUC2002/BE-F/D097.M.100.E.26.mini.be | 65 + .../DUC2002/BE-F/D097.M.100.E.J.mini.be | 61 + .../DUC2002/BE-F/D098.M.100.E.26.mini.be | 61 + .../DUC2002/BE-F/D098.M.100.E.A.mini.be | 44 + .../DUC2002/BE-F/D099.M.100.E.26.mini.be | 58 + .../DUC2002/BE-F/D099.M.100.E.D.mini.be | 56 + .../DUC2002/BE-F/D100.M.100.E.26.mini.be | 69 + .../DUC2002/BE-F/D100.M.100.E.F.mini.be | 62 + .../DUC2002/BE-F/D101.M.100.E.26.mini.be | 60 + .../DUC2002/BE-F/D101.M.100.E.G.mini.be | 51 + .../DUC2002/BE-F/D102.M.100.E.26.mini.be | 82 + .../DUC2002/BE-F/D102.M.100.E.D.mini.be | 48 + .../DUC2002/BE-F/D103.M.100.G.26.mini.be | 53 + .../DUC2002/BE-F/D103.M.100.G.A.mini.be | 62 + .../DUC2002/BE-F/D104.M.100.G.26.mini.be | 76 + .../DUC2002/BE-F/D104.M.100.G.C.mini.be | 53 + .../DUC2002/BE-F/D105.M.100.G.26.mini.be | 71 + .../DUC2002/BE-F/D105.M.100.G.C.mini.be | 54 + .../DUC2002/BE-F/D106.M.100.G.26.mini.be | 66 + .../DUC2002/BE-F/D106.M.100.G.F.mini.be | 53 + .../DUC2002/BE-F/D107.M.100.G.26.mini.be | 55 + .../DUC2002/BE-F/D107.M.100.G.H.mini.be | 74 + .../DUC2002/BE-F/D108.M.100.G.26.mini.be | 70 + .../DUC2002/BE-F/D108.M.100.G.I.mini.be | 50 + .../DUC2002/BE-F/D109.M.100.H.26.mini.be | 52 + .../DUC2002/BE-F/D109.M.100.H.B.mini.be | 64 + .../DUC2002/BE-F/D110.M.100.H.26.mini.be | 74 + .../DUC2002/BE-F/D110.M.100.H.C.mini.be | 58 + .../DUC2002/BE-F/D111.M.100.H.26.mini.be | 61 + .../DUC2002/BE-F/D111.M.100.H.C.mini.be | 51 + .../DUC2002/BE-F/D112.M.100.H.26.mini.be | 57 + .../DUC2002/BE-F/D112.M.100.H.E.mini.be | 56 + .../DUC2002/BE-F/D113.M.100.H.26.mini.be | 51 + .../DUC2002/BE-F/D113.M.100.H.I.mini.be | 54 + .../DUC2002/BE-F/D114.M.100.H.26.mini.be | 56 + .../DUC2002/BE-F/D114.M.100.H.F.mini.be | 50 + .../DUC2002/BE-F/D115.M.100.I.26.mini.be | 79 + .../DUC2002/BE-F/D115.M.100.I.B.mini.be | 65 + .../DUC2002/BE-F/D116.M.100.I.26.mini.be | 69 + .../DUC2002/BE-F/D116.M.100.I.B.mini.be | 63 + .../DUC2002/BE-F/D117.M.100.I.26.mini.be | 53 + .../DUC2002/BE-F/D117.M.100.I.G.mini.be | 55 + .../DUC2002/BE-F/D118.M.100.I.26.mini.be | 68 + .../DUC2002/BE-F/D118.M.100.I.E.mini.be | 50 + .../DUC2002/BE-F/D119.M.100.I.26.mini.be | 53 + .../DUC2002/BE-F/D119.M.100.I.F.mini.be | 48 + .../DUC2002/BE-F/D120.M.100.I.26.mini.be | 67 + .../DUC2002/BE-F/D120.M.100.I.J.mini.be | 52 + .../DUC2002/BE-L/D061.M.100.J.26.be | 128 + .../DUC2002/BE-L/D061.M.100.J.I.be | 131 + .../DUC2002/BE-L/D062.M.100.J.26.be | 135 + .../DUC2002/BE-L/D062.M.100.J.A.be | 128 + .../DUC2002/BE-L/D063.M.100.J.26.be | 138 + .../DUC2002/BE-L/D063.M.100.J.E.be | 140 + .../DUC2002/BE-L/D064.M.100.J.26.be | 134 + .../DUC2002/BE-L/D064.M.100.J.B.be | 135 + .../DUC2002/BE-L/D065.M.100.J.26.be | 136 + .../DUC2002/BE-L/D065.M.100.J.F.be | 128 + .../DUC2002/BE-L/D066.M.100.J.26.be | 153 + .../DUC2002/BE-L/D066.M.100.J.I.be | 139 + .../DUC2002/BE-L/D067.M.100.F.26.be | 138 + .../DUC2002/BE-L/D067.M.100.F.I.be | 139 + .../DUC2002/BE-L/D068.M.100.F.26.be | 131 + .../DUC2002/BE-L/D068.M.100.F.A.be | 123 + .../DUC2002/BE-L/D069.M.100.F.26.be | 126 + .../DUC2002/BE-L/D069.M.100.F.C.be | 116 + .../DUC2002/BE-L/D070.M.100.F.26.be | 147 + .../DUC2002/BE-L/D070.M.100.F.D.be | 128 + .../DUC2002/BE-L/D071.M.100.F.26.be | 139 + .../DUC2002/BE-L/D071.M.100.F.D.be | 109 + .../DUC2002/BE-L/D072.M.100.F.26.be | 130 + .../DUC2002/BE-L/D072.M.100.F.J.be | 130 + .../DUC2002/BE-L/D073.M.100.B.26.be | 139 + .../DUC2002/BE-L/D073.M.100.B.J.be | 124 + .../DUC2002/BE-L/D074.M.100.B.26.be | 135 + .../DUC2002/BE-L/D074.M.100.B.A.be | 130 + .../DUC2002/BE-L/D075.M.100.B.26.be | 139 + .../DUC2002/BE-L/D075.M.100.B.E.be | 137 + .../DUC2002/BE-L/D076.M.100.B.26.be | 167 + .../DUC2002/BE-L/D076.M.100.B.E.be | 140 + .../DUC2002/BE-L/D077.M.100.B.26.be | 138 + .../DUC2002/BE-L/D077.M.100.B.H.be | 163 + .../DUC2002/BE-L/D078.M.100.B.26.be | 124 + .../DUC2002/BE-L/D078.M.100.B.J.be | 117 + .../DUC2002/BE-L/D079.M.100.A.26.be | 128 + .../DUC2002/BE-L/D079.M.100.A.I.be | 127 + .../DUC2002/BE-L/D080.M.100.A.26.be | 130 + .../DUC2002/BE-L/D080.M.100.A.E.be | 123 + .../DUC2002/BE-L/D081.M.100.A.26.be | 132 + .../DUC2002/BE-L/D081.M.100.A.D.be | 106 + .../DUC2002/BE-L/D082.M.100.A.26.be | 123 + .../DUC2002/BE-L/D082.M.100.A.C.be | 130 + .../DUC2002/BE-L/D083.M.100.A.26.be | 141 + .../DUC2002/BE-L/D083.M.100.A.G.be | 133 + .../DUC2002/BE-L/D084.M.100.A.26.be | 119 + .../DUC2002/BE-L/D084.M.100.A.H.be | 139 + .../DUC2002/BE-L/D085.M.100.D.26.be | 133 + .../DUC2002/BE-L/D085.M.100.D.H.be | 148 + .../DUC2002/BE-L/D086.M.100.D.26.be | 148 + .../DUC2002/BE-L/D086.M.100.D.B.be | 139 + .../DUC2002/BE-L/D087.M.100.D.26.be | 120 + .../DUC2002/BE-L/D087.M.100.D.B.be | 131 + .../DUC2002/BE-L/D089.M.100.D.26.be | 152 + .../DUC2002/BE-L/D089.M.100.D.G.be | 140 + .../DUC2002/BE-L/D090.M.100.D.26.be | 121 + .../DUC2002/BE-L/D090.M.100.D.J.be | 122 + .../DUC2002/BE-L/D091.M.100.C.26.be | 151 + .../DUC2002/BE-L/D091.M.100.C.F.be | 125 + .../DUC2002/BE-L/D092.M.100.C.26.be | 133 + .../DUC2002/BE-L/D092.M.100.C.A.be | 131 + .../DUC2002/BE-L/D093.M.100.C.26.be | 125 + .../DUC2002/BE-L/D093.M.100.C.H.be | 138 + .../DUC2002/BE-L/D094.M.100.C.26.be | 142 + .../DUC2002/BE-L/D094.M.100.C.D.be | 122 + .../DUC2002/BE-L/D095.M.100.C.26.be | 147 + .../DUC2002/BE-L/D095.M.100.C.H.be | 156 + .../DUC2002/BE-L/D096.M.100.C.26.be | 139 + .../DUC2002/BE-L/D096.M.100.C.G.be | 131 + .../DUC2002/BE-L/D097.M.100.E.26.be | 128 + .../DUC2002/BE-L/D097.M.100.E.J.be | 136 + .../DUC2002/BE-L/D098.M.100.E.26.be | 129 + .../DUC2002/BE-L/D098.M.100.E.A.be | 109 + .../DUC2002/BE-L/D099.M.100.E.26.be | 137 + .../DUC2002/BE-L/D099.M.100.E.D.be | 134 + .../DUC2002/BE-L/D100.M.100.E.26.be | 143 + .../DUC2002/BE-L/D100.M.100.E.F.be | 130 + .../DUC2002/BE-L/D101.M.100.E.26.be | 125 + .../DUC2002/BE-L/D101.M.100.E.G.be | 118 + .../DUC2002/BE-L/D102.M.100.E.26.be | 148 + .../DUC2002/BE-L/D102.M.100.E.D.be | 122 + .../DUC2002/BE-L/D103.M.100.G.26.be | 122 + .../DUC2002/BE-L/D103.M.100.G.A.be | 134 + .../DUC2002/BE-L/D104.M.100.G.26.be | 140 + .../DUC2002/BE-L/D104.M.100.G.C.be | 113 + .../DUC2002/BE-L/D105.M.100.G.26.be | 126 + .../DUC2002/BE-L/D105.M.100.G.C.be | 136 + .../DUC2002/BE-L/D106.M.100.G.26.be | 148 + .../DUC2002/BE-L/D106.M.100.G.F.be | 133 + .../DUC2002/BE-L/D107.M.100.G.26.be | 123 + .../DUC2002/BE-L/D107.M.100.G.H.be | 150 + .../DUC2002/BE-L/D108.M.100.G.26.be | 151 + .../DUC2002/BE-L/D108.M.100.G.I.be | 133 + .../DUC2002/BE-L/D109.M.100.H.26.be | 107 + .../DUC2002/BE-L/D109.M.100.H.B.be | 136 + .../DUC2002/BE-L/D110.M.100.H.26.be | 137 + .../DUC2002/BE-L/D110.M.100.H.C.be | 138 + .../DUC2002/BE-L/D111.M.100.H.26.be | 120 + .../DUC2002/BE-L/D111.M.100.H.C.be | 116 + .../DUC2002/BE-L/D112.M.100.H.26.be | 135 + .../DUC2002/BE-L/D112.M.100.H.E.be | 125 + .../DUC2002/BE-L/D113.M.100.H.26.be | 121 + .../DUC2002/BE-L/D113.M.100.H.I.be | 135 + .../DUC2002/BE-L/D114.M.100.H.26.be | 129 + .../DUC2002/BE-L/D114.M.100.H.F.be | 119 + .../DUC2002/BE-L/D115.M.100.I.26.be | 140 + .../DUC2002/BE-L/D115.M.100.I.B.be | 142 + .../DUC2002/BE-L/D116.M.100.I.26.be | 154 + .../DUC2002/BE-L/D116.M.100.I.B.be | 144 + .../DUC2002/BE-L/D117.M.100.I.26.be | 113 + .../DUC2002/BE-L/D117.M.100.I.G.be | 122 + .../DUC2002/BE-L/D118.M.100.I.26.be | 152 + .../DUC2002/BE-L/D118.M.100.I.E.be | 121 + .../DUC2002/BE-L/D119.M.100.I.26.be | 138 + .../DUC2002/BE-L/D119.M.100.I.F.be | 124 + .../DUC2002/BE-L/D120.M.100.I.26.be | 126 + .../DUC2002/BE-L/D120.M.100.I.J.be | 129 + .../DUC2002/docs-spl/D061.M.100.J.26.spl | 5 + .../DUC2002/docs-spl/D061.M.100.J.I.spl | 7 + .../DUC2002/docs-spl/D062.M.100.J.26.spl | 4 + .../DUC2002/docs-spl/D062.M.100.J.A.spl | 5 + .../DUC2002/docs-spl/D063.M.100.J.26.spl | 4 + .../DUC2002/docs-spl/D063.M.100.J.E.spl | 5 + .../DUC2002/docs-spl/D064.M.100.J.26.spl | 4 + .../DUC2002/docs-spl/D064.M.100.J.B.spl | 7 + .../DUC2002/docs-spl/D065.M.100.J.26.spl | 3 + .../DUC2002/docs-spl/D065.M.100.J.F.spl | 6 + .../DUC2002/docs-spl/D066.M.100.J.26.spl | 5 + .../DUC2002/docs-spl/D066.M.100.J.I.spl | 6 + .../DUC2002/docs-spl/D067.M.100.F.26.spl | 4 + .../DUC2002/docs-spl/D067.M.100.F.I.spl | 8 + .../DUC2002/docs-spl/D068.M.100.F.26.spl | 5 + .../DUC2002/docs-spl/D068.M.100.F.A.spl | 3 + .../DUC2002/docs-spl/D069.M.100.F.26.spl | 4 + .../DUC2002/docs-spl/D069.M.100.F.C.spl | 8 + .../DUC2002/docs-spl/D070.M.100.F.26.spl | 4 + .../DUC2002/docs-spl/D070.M.100.F.D.spl | 6 + .../DUC2002/docs-spl/D071.M.100.F.26.spl | 6 + .../DUC2002/docs-spl/D071.M.100.F.D.spl | 5 + .../DUC2002/docs-spl/D072.M.100.F.26.spl | 3 + .../DUC2002/docs-spl/D072.M.100.F.J.spl | 6 + .../DUC2002/docs-spl/D073.M.100.B.26.spl | 3 + .../DUC2002/docs-spl/D073.M.100.B.J.spl | 7 + .../DUC2002/docs-spl/D074.M.100.B.26.spl | 3 + .../DUC2002/docs-spl/D074.M.100.B.A.spl | 6 + .../DUC2002/docs-spl/D075.M.100.B.26.spl | 3 + .../DUC2002/docs-spl/D075.M.100.B.E.spl | 5 + .../DUC2002/docs-spl/D076.M.100.B.26.spl | 5 + .../DUC2002/docs-spl/D076.M.100.B.E.spl | 6 + .../DUC2002/docs-spl/D077.M.100.B.26.spl | 4 + .../DUC2002/docs-spl/D077.M.100.B.H.spl | 11 + .../DUC2002/docs-spl/D078.M.100.B.26.spl | 4 + .../DUC2002/docs-spl/D078.M.100.B.J.spl | 6 + .../DUC2002/docs-spl/D079.M.100.A.26.spl | 5 + .../DUC2002/docs-spl/D079.M.100.A.I.spl | 6 + .../DUC2002/docs-spl/D080.M.100.A.26.spl | 3 + .../DUC2002/docs-spl/D080.M.100.A.E.spl | 5 + .../DUC2002/docs-spl/D081.M.100.A.26.spl | 4 + .../DUC2002/docs-spl/D081.M.100.A.D.spl | 4 + .../DUC2002/docs-spl/D082.M.100.A.26.spl | 3 + .../DUC2002/docs-spl/D082.M.100.A.C.spl | 9 + .../DUC2002/docs-spl/D083.M.100.A.26.spl | 5 + .../DUC2002/docs-spl/D083.M.100.A.G.spl | 6 + .../DUC2002/docs-spl/D084.M.100.A.26.spl | 3 + .../DUC2002/docs-spl/D084.M.100.A.H.spl | 6 + .../DUC2002/docs-spl/D085.M.100.D.26.spl | 5 + .../DUC2002/docs-spl/D085.M.100.D.H.spl | 7 + .../DUC2002/docs-spl/D086.M.100.D.26.spl | 3 + .../DUC2002/docs-spl/D086.M.100.D.B.spl | 6 + .../DUC2002/docs-spl/D087.M.100.D.26.spl | 4 + .../DUC2002/docs-spl/D087.M.100.D.B.spl | 5 + .../DUC2002/docs-spl/D089.M.100.D.26.spl | 5 + .../DUC2002/docs-spl/D089.M.100.D.G.spl | 5 + .../DUC2002/docs-spl/D090.M.100.D.26.spl | 4 + .../DUC2002/docs-spl/D090.M.100.D.J.spl | 6 + .../DUC2002/docs-spl/D091.M.100.C.26.spl | 4 + .../DUC2002/docs-spl/D091.M.100.C.F.spl | 6 + .../DUC2002/docs-spl/D092.M.100.C.26.spl | 5 + .../DUC2002/docs-spl/D092.M.100.C.A.spl | 4 + .../DUC2002/docs-spl/D093.M.100.C.26.spl | 4 + .../DUC2002/docs-spl/D093.M.100.C.H.spl | 4 + .../DUC2002/docs-spl/D094.M.100.C.26.spl | 4 + .../DUC2002/docs-spl/D094.M.100.C.D.spl | 6 + .../DUC2002/docs-spl/D095.M.100.C.26.spl | 4 + .../DUC2002/docs-spl/D095.M.100.C.H.spl | 8 + .../DUC2002/docs-spl/D096.M.100.C.26.spl | 4 + .../DUC2002/docs-spl/D096.M.100.C.G.spl | 5 + .../DUC2002/docs-spl/D097.M.100.E.26.spl | 4 + .../DUC2002/docs-spl/D097.M.100.E.J.spl | 5 + .../DUC2002/docs-spl/D098.M.100.E.26.spl | 4 + .../DUC2002/docs-spl/D098.M.100.E.A.spl | 4 + .../DUC2002/docs-spl/D099.M.100.E.26.spl | 5 + .../DUC2002/docs-spl/D099.M.100.E.D.spl | 6 + .../DUC2002/docs-spl/D100.M.100.E.26.spl | 5 + .../DUC2002/docs-spl/D100.M.100.E.F.spl | 6 + .../DUC2002/docs-spl/D101.M.100.E.26.spl | 3 + .../DUC2002/docs-spl/D101.M.100.E.G.spl | 4 + .../DUC2002/docs-spl/D102.M.100.E.26.spl | 4 + .../DUC2002/docs-spl/D102.M.100.E.D.spl | 6 + .../DUC2002/docs-spl/D103.M.100.G.26.spl | 5 + .../DUC2002/docs-spl/D103.M.100.G.A.spl | 5 + .../DUC2002/docs-spl/D104.M.100.G.26.spl | 4 + .../DUC2002/docs-spl/D104.M.100.G.C.spl | 6 + .../DUC2002/docs-spl/D105.M.100.G.26.spl | 3 + .../DUC2002/docs-spl/D105.M.100.G.C.spl | 7 + .../DUC2002/docs-spl/D106.M.100.G.26.spl | 6 + .../DUC2002/docs-spl/D106.M.100.G.F.spl | 6 + .../DUC2002/docs-spl/D107.M.100.G.26.spl | 3 + .../DUC2002/docs-spl/D107.M.100.G.H.spl | 15 + .../DUC2002/docs-spl/D108.M.100.G.26.spl | 5 + .../DUC2002/docs-spl/D108.M.100.G.I.spl | 7 + .../DUC2002/docs-spl/D109.M.100.H.26.spl | 5 + .../DUC2002/docs-spl/D109.M.100.H.B.spl | 5 + .../DUC2002/docs-spl/D110.M.100.H.26.spl | 4 + .../DUC2002/docs-spl/D110.M.100.H.C.spl | 9 + .../DUC2002/docs-spl/D111.M.100.H.26.spl | 3 + .../DUC2002/docs-spl/D111.M.100.H.C.spl | 9 + .../DUC2002/docs-spl/D112.M.100.H.26.spl | 2 + .../DUC2002/docs-spl/D112.M.100.H.E.spl | 4 + .../DUC2002/docs-spl/D113.M.100.H.26.spl | 3 + .../DUC2002/docs-spl/D113.M.100.H.I.spl | 6 + .../DUC2002/docs-spl/D114.M.100.H.26.spl | 5 + .../DUC2002/docs-spl/D114.M.100.H.F.spl | 6 + .../DUC2002/docs-spl/D115.M.100.I.26.spl | 5 + .../DUC2002/docs-spl/D115.M.100.I.B.spl | 6 + .../DUC2002/docs-spl/D116.M.100.I.26.spl | 4 + .../DUC2002/docs-spl/D116.M.100.I.B.spl | 5 + .../DUC2002/docs-spl/D117.M.100.I.26.spl | 3 + .../DUC2002/docs-spl/D117.M.100.I.G.spl | 6 + .../DUC2002/docs-spl/D118.M.100.I.26.spl | 3 + .../DUC2002/docs-spl/D118.M.100.I.E.spl | 5 + .../DUC2002/docs-spl/D119.M.100.I.26.spl | 5 + .../DUC2002/docs-spl/D119.M.100.I.F.spl | 5 + .../DUC2002/docs-spl/D120.M.100.I.26.spl | 4 + .../DUC2002/docs-spl/D120.M.100.I.J.spl | 5 + .../RELEASE-1.5.5/sample-test/ROUGE-test.xml | 652 + .../models/SL.P.10.R.A.SL062003-01.html | 8 + .../models/SL.P.10.R.A.SL062003-02.html | 8 + .../models/SL.P.10.R.A.SL062003-03.html | 8 + .../models/SL.P.10.R.A.SL062003-04.html | 8 + .../models/SL.P.10.R.A.SL062003-05.html | 8 + .../models/SL.P.10.R.A.SL062003-06.html | 8 + .../models/SL.P.10.R.A.SL062003-07.html | 8 + .../models/SL.P.10.R.A.SL062003-08.html | 8 + .../models/SL.P.10.R.A.SL062003-09.html | 8 + .../models/SL.P.10.R.A.SL062003-10.html | 8 + .../models/SL.P.10.R.A.SL062003-11.html | 8 + .../models/SL.P.10.R.A.SL062003-12.html | 8 + .../models/SL.P.10.R.A.SL062003-13.html | 8 + .../models/SL.P.10.R.A.SL062003-14.html | 8 + .../models/SL.P.10.R.A.SL062003-15.html | 8 + .../models/SL.P.10.R.A.SL062003-16.html | 8 + .../models/SL.P.10.R.A.SL062003-17.html | 8 + .../models/SL.P.10.R.A.SL062003-18.html | 8 + .../models/SL.P.10.R.A.SL062003-19.html | 8 + .../models/SL.P.10.R.A.SL062003-20.html | 8 + .../models/SL.P.10.R.A.SL062003-21.html | 8 + .../models/SL.P.10.R.A.SL062003-22.html | 8 + .../models/SL.P.10.R.A.SL062003-23.html | 8 + .../models/SL.P.10.R.A.SL062003-24.html | 8 + .../models/SL.P.10.R.A.SL062003-25.html | 8 + .../models/SL.P.10.R.B.SL062003-01.html | 8 + .../models/SL.P.10.R.B.SL062003-02.html | 8 + .../models/SL.P.10.R.B.SL062003-03.html | 8 + .../models/SL.P.10.R.B.SL062003-04.html | 8 + .../models/SL.P.10.R.B.SL062003-05.html | 8 + .../models/SL.P.10.R.B.SL062003-06.html | 8 + .../models/SL.P.10.R.B.SL062003-07.html | 8 + .../models/SL.P.10.R.B.SL062003-08.html | 8 + .../models/SL.P.10.R.B.SL062003-09.html | 8 + .../models/SL.P.10.R.B.SL062003-10.html | 8 + .../models/SL.P.10.R.B.SL062003-11.html | 8 + .../models/SL.P.10.R.B.SL062003-12.html | 8 + .../models/SL.P.10.R.B.SL062003-13.html | 8 + .../models/SL.P.10.R.B.SL062003-14.html | 8 + .../models/SL.P.10.R.B.SL062003-15.html | 8 + .../models/SL.P.10.R.B.SL062003-16.html | 8 + .../models/SL.P.10.R.B.SL062003-17.html | 8 + .../models/SL.P.10.R.B.SL062003-18.html | 8 + .../models/SL.P.10.R.B.SL062003-19.html | 8 + .../models/SL.P.10.R.B.SL062003-20.html | 8 + .../models/SL.P.10.R.B.SL062003-21.html | 8 + .../models/SL.P.10.R.B.SL062003-22.html | 8 + .../models/SL.P.10.R.B.SL062003-23.html | 8 + .../models/SL.P.10.R.B.SL062003-24.html | 8 + .../models/SL.P.10.R.B.SL062003-25.html | 8 + .../models/SL.P.10.R.C.SL062003-01.html | 8 + .../models/SL.P.10.R.C.SL062003-02.html | 8 + .../models/SL.P.10.R.C.SL062003-03.html | 8 + .../models/SL.P.10.R.C.SL062003-04.html | 8 + .../models/SL.P.10.R.C.SL062003-05.html | 8 + .../models/SL.P.10.R.C.SL062003-06.html | 8 + .../models/SL.P.10.R.C.SL062003-07.html | 8 + .../models/SL.P.10.R.C.SL062003-08.html | 8 + .../models/SL.P.10.R.C.SL062003-09.html | 8 + .../models/SL.P.10.R.C.SL062003-10.html | 8 + .../models/SL.P.10.R.C.SL062003-11.html | 8 + .../models/SL.P.10.R.C.SL062003-12.html | 8 + .../models/SL.P.10.R.C.SL062003-13.html | 8 + .../models/SL.P.10.R.C.SL062003-14.html | 8 + .../models/SL.P.10.R.C.SL062003-15.html | 8 + .../models/SL.P.10.R.C.SL062003-16.html | 8 + .../models/SL.P.10.R.C.SL062003-17.html | 8 + .../models/SL.P.10.R.C.SL062003-18.html | 8 + .../models/SL.P.10.R.C.SL062003-19.html | 8 + .../models/SL.P.10.R.C.SL062003-20.html | 8 + .../models/SL.P.10.R.C.SL062003-21.html | 8 + .../models/SL.P.10.R.C.SL062003-22.html | 8 + .../models/SL.P.10.R.C.SL062003-23.html | 8 + .../models/SL.P.10.R.C.SL062003-24.html | 8 + .../models/SL.P.10.R.C.SL062003-25.html | 8 + .../models/SL.P.10.R.D.SL062003-01.html | 8 + .../models/SL.P.10.R.D.SL062003-02.html | 8 + .../models/SL.P.10.R.D.SL062003-03.html | 8 + .../models/SL.P.10.R.D.SL062003-04.html | 8 + .../models/SL.P.10.R.D.SL062003-05.html | 8 + .../models/SL.P.10.R.D.SL062003-06.html | 8 + .../models/SL.P.10.R.D.SL062003-07.html | 8 + .../models/SL.P.10.R.D.SL062003-08.html | 8 + .../models/SL.P.10.R.D.SL062003-09.html | 8 + .../models/SL.P.10.R.D.SL062003-10.html | 8 + .../models/SL.P.10.R.D.SL062003-11.html | 8 + .../models/SL.P.10.R.D.SL062003-12.html | 8 + .../models/SL.P.10.R.D.SL062003-13.html | 8 + .../models/SL.P.10.R.D.SL062003-14.html | 8 + .../models/SL.P.10.R.D.SL062003-15.html | 8 + .../models/SL.P.10.R.D.SL062003-16.html | 8 + .../models/SL.P.10.R.D.SL062003-17.html | 8 + .../models/SL.P.10.R.D.SL062003-18.html | 8 + .../models/SL.P.10.R.D.SL062003-19.html | 8 + .../models/SL.P.10.R.D.SL062003-20.html | 8 + .../models/SL.P.10.R.D.SL062003-21.html | 8 + .../models/SL.P.10.R.D.SL062003-22.html | 8 + .../models/SL.P.10.R.D.SL062003-23.html | 8 + .../models/SL.P.10.R.D.SL062003-24.html | 8 + .../models/SL.P.10.R.D.SL062003-25.html | 8 + .../systems/SL.P.10.R.11.SL062003-01.html | 9 + .../systems/SL.P.10.R.11.SL062003-02.html | 9 + .../systems/SL.P.10.R.11.SL062003-03.html | 9 + .../systems/SL.P.10.R.11.SL062003-04.html | 9 + .../systems/SL.P.10.R.11.SL062003-05.html | 9 + .../systems/SL.P.10.R.11.SL062003-06.html | 9 + .../systems/SL.P.10.R.11.SL062003-07.html | 9 + .../systems/SL.P.10.R.11.SL062003-08.html | 9 + .../systems/SL.P.10.R.11.SL062003-09.html | 9 + .../systems/SL.P.10.R.11.SL062003-10.html | 9 + .../systems/SL.P.10.R.11.SL062003-11.html | 9 + .../systems/SL.P.10.R.11.SL062003-12.html | 9 + .../systems/SL.P.10.R.11.SL062003-13.html | 9 + .../systems/SL.P.10.R.11.SL062003-14.html | 9 + .../systems/SL.P.10.R.11.SL062003-15.html | 9 + .../systems/SL.P.10.R.11.SL062003-16.html | 9 + .../systems/SL.P.10.R.11.SL062003-17.html | 9 + .../systems/SL.P.10.R.11.SL062003-18.html | 9 + .../systems/SL.P.10.R.11.SL062003-19.html | 9 + .../systems/SL.P.10.R.11.SL062003-20.html | 9 + .../systems/SL.P.10.R.11.SL062003-21.html | 9 + .../systems/SL.P.10.R.11.SL062003-22.html | 9 + .../systems/SL.P.10.R.11.SL062003-23.html | 9 + .../systems/SL.P.10.R.11.SL062003-24.html | 9 + .../systems/SL.P.10.R.11.SL062003-25.html | 9 + .../systems/SL.P.10.R.12.SL062003-01.html | 9 + .../systems/SL.P.10.R.12.SL062003-02.html | 9 + .../systems/SL.P.10.R.12.SL062003-03.html | 9 + .../systems/SL.P.10.R.12.SL062003-04.html | 9 + .../systems/SL.P.10.R.12.SL062003-05.html | 9 + .../systems/SL.P.10.R.12.SL062003-06.html | 9 + .../systems/SL.P.10.R.12.SL062003-07.html | 9 + .../systems/SL.P.10.R.12.SL062003-08.html | 9 + .../systems/SL.P.10.R.12.SL062003-09.html | 9 + .../systems/SL.P.10.R.12.SL062003-10.html | 9 + .../systems/SL.P.10.R.12.SL062003-11.html | 9 + .../systems/SL.P.10.R.12.SL062003-12.html | 9 + .../systems/SL.P.10.R.12.SL062003-13.html | 9 + .../systems/SL.P.10.R.12.SL062003-14.html | 9 + .../systems/SL.P.10.R.12.SL062003-15.html | 9 + .../systems/SL.P.10.R.12.SL062003-16.html | 9 + .../systems/SL.P.10.R.12.SL062003-17.html | 9 + .../systems/SL.P.10.R.12.SL062003-18.html | 9 + .../systems/SL.P.10.R.12.SL062003-19.html | 9 + .../systems/SL.P.10.R.12.SL062003-20.html | 9 + .../systems/SL.P.10.R.12.SL062003-21.html | 9 + .../systems/SL.P.10.R.12.SL062003-22.html | 9 + .../systems/SL.P.10.R.12.SL062003-23.html | 9 + .../systems/SL.P.10.R.12.SL062003-24.html | 9 + .../systems/SL.P.10.R.12.SL062003-25.html | 9 + .../systems/SL.P.10.R.13.SL062003-01.html | 9 + .../systems/SL.P.10.R.13.SL062003-02.html | 9 + .../systems/SL.P.10.R.13.SL062003-03.html | 9 + .../systems/SL.P.10.R.13.SL062003-04.html | 9 + .../systems/SL.P.10.R.13.SL062003-05.html | 9 + .../systems/SL.P.10.R.13.SL062003-06.html | 9 + .../systems/SL.P.10.R.13.SL062003-07.html | 9 + .../systems/SL.P.10.R.13.SL062003-08.html | 9 + .../systems/SL.P.10.R.13.SL062003-09.html | 9 + .../systems/SL.P.10.R.13.SL062003-10.html | 9 + .../systems/SL.P.10.R.13.SL062003-11.html | 9 + .../systems/SL.P.10.R.13.SL062003-12.html | 9 + .../systems/SL.P.10.R.13.SL062003-13.html | 9 + .../systems/SL.P.10.R.13.SL062003-14.html | 9 + .../systems/SL.P.10.R.13.SL062003-15.html | 9 + .../systems/SL.P.10.R.13.SL062003-16.html | 9 + .../systems/SL.P.10.R.13.SL062003-17.html | 9 + .../systems/SL.P.10.R.13.SL062003-18.html | 9 + .../systems/SL.P.10.R.13.SL062003-19.html | 9 + .../systems/SL.P.10.R.13.SL062003-20.html | 9 + .../systems/SL.P.10.R.13.SL062003-21.html | 9 + .../systems/SL.P.10.R.13.SL062003-22.html | 9 + .../systems/SL.P.10.R.13.SL062003-23.html | 9 + .../systems/SL.P.10.R.13.SL062003-24.html | 9 + .../systems/SL.P.10.R.13.SL062003-25.html | 9 + .../systems/SL.P.10.R.14.SL062003-01.html | 9 + .../systems/SL.P.10.R.14.SL062003-02.html | 9 + .../systems/SL.P.10.R.14.SL062003-03.html | 9 + .../systems/SL.P.10.R.14.SL062003-04.html | 9 + .../systems/SL.P.10.R.14.SL062003-05.html | 9 + .../systems/SL.P.10.R.14.SL062003-06.html | 9 + .../systems/SL.P.10.R.14.SL062003-07.html | 9 + .../systems/SL.P.10.R.14.SL062003-08.html | 9 + .../systems/SL.P.10.R.14.SL062003-09.html | 9 + .../systems/SL.P.10.R.14.SL062003-10.html | 9 + .../systems/SL.P.10.R.14.SL062003-11.html | 9 + .../systems/SL.P.10.R.14.SL062003-12.html | 9 + .../systems/SL.P.10.R.14.SL062003-13.html | 9 + .../systems/SL.P.10.R.14.SL062003-14.html | 9 + .../systems/SL.P.10.R.14.SL062003-15.html | 9 + .../systems/SL.P.10.R.14.SL062003-16.html | 9 + .../systems/SL.P.10.R.14.SL062003-17.html | 9 + .../systems/SL.P.10.R.14.SL062003-18.html | 9 + .../systems/SL.P.10.R.14.SL062003-19.html | 9 + .../systems/SL.P.10.R.14.SL062003-20.html | 9 + .../systems/SL.P.10.R.14.SL062003-21.html | 9 + .../systems/SL.P.10.R.14.SL062003-22.html | 9 + .../systems/SL.P.10.R.14.SL062003-23.html | 9 + .../systems/SL.P.10.R.14.SL062003-24.html | 9 + .../systems/SL.P.10.R.14.SL062003-25.html | 9 + .../systems/SL.P.10.R.21.SL062003-01.html | 9 + .../systems/SL.P.10.R.21.SL062003-02.html | 9 + .../systems/SL.P.10.R.21.SL062003-03.html | 9 + .../systems/SL.P.10.R.21.SL062003-04.html | 9 + .../systems/SL.P.10.R.21.SL062003-05.html | 9 + .../systems/SL.P.10.R.21.SL062003-06.html | 9 + .../systems/SL.P.10.R.21.SL062003-07.html | 9 + .../systems/SL.P.10.R.21.SL062003-08.html | 9 + .../systems/SL.P.10.R.21.SL062003-09.html | 9 + .../systems/SL.P.10.R.21.SL062003-10.html | 9 + .../systems/SL.P.10.R.21.SL062003-11.html | 9 + .../systems/SL.P.10.R.21.SL062003-12.html | 9 + .../systems/SL.P.10.R.21.SL062003-13.html | 9 + .../systems/SL.P.10.R.21.SL062003-14.html | 9 + .../systems/SL.P.10.R.21.SL062003-15.html | 9 + .../systems/SL.P.10.R.21.SL062003-16.html | 9 + .../systems/SL.P.10.R.21.SL062003-17.html | 9 + .../systems/SL.P.10.R.21.SL062003-18.html | 9 + .../systems/SL.P.10.R.21.SL062003-19.html | 9 + .../systems/SL.P.10.R.21.SL062003-20.html | 9 + .../systems/SL.P.10.R.21.SL062003-21.html | 9 + .../systems/SL.P.10.R.21.SL062003-22.html | 9 + .../systems/SL.P.10.R.21.SL062003-23.html | 9 + .../systems/SL.P.10.R.21.SL062003-24.html | 9 + .../systems/SL.P.10.R.21.SL062003-25.html | 9 + .../systems/SL.P.10.R.22.SL062003-01.html | 9 + .../systems/SL.P.10.R.22.SL062003-02.html | 9 + .../systems/SL.P.10.R.22.SL062003-03.html | 9 + .../systems/SL.P.10.R.22.SL062003-04.html | 9 + .../systems/SL.P.10.R.22.SL062003-05.html | 9 + .../systems/SL.P.10.R.22.SL062003-06.html | 9 + .../systems/SL.P.10.R.22.SL062003-07.html | 9 + .../systems/SL.P.10.R.22.SL062003-08.html | 9 + .../systems/SL.P.10.R.22.SL062003-09.html | 9 + .../systems/SL.P.10.R.22.SL062003-10.html | 9 + .../systems/SL.P.10.R.22.SL062003-11.html | 9 + .../systems/SL.P.10.R.22.SL062003-12.html | 9 + .../systems/SL.P.10.R.22.SL062003-13.html | 9 + .../systems/SL.P.10.R.22.SL062003-14.html | 9 + .../systems/SL.P.10.R.22.SL062003-15.html | 9 + .../systems/SL.P.10.R.22.SL062003-16.html | 9 + .../systems/SL.P.10.R.22.SL062003-17.html | 9 + .../systems/SL.P.10.R.22.SL062003-18.html | 9 + .../systems/SL.P.10.R.22.SL062003-19.html | 9 + .../systems/SL.P.10.R.22.SL062003-20.html | 9 + .../systems/SL.P.10.R.22.SL062003-21.html | 9 + .../systems/SL.P.10.R.22.SL062003-22.html | 9 + .../systems/SL.P.10.R.22.SL062003-23.html | 9 + .../systems/SL.P.10.R.22.SL062003-24.html | 9 + .../systems/SL.P.10.R.22.SL062003-25.html | 9 + .../systems/SL.P.10.R.23.SL062003-01.html | 9 + .../systems/SL.P.10.R.23.SL062003-02.html | 9 + .../systems/SL.P.10.R.23.SL062003-03.html | 9 + .../systems/SL.P.10.R.23.SL062003-04.html | 9 + .../systems/SL.P.10.R.23.SL062003-05.html | 9 + .../systems/SL.P.10.R.23.SL062003-06.html | 9 + .../systems/SL.P.10.R.23.SL062003-07.html | 9 + .../systems/SL.P.10.R.23.SL062003-08.html | 9 + .../systems/SL.P.10.R.23.SL062003-09.html | 9 + .../systems/SL.P.10.R.23.SL062003-10.html | 9 + .../systems/SL.P.10.R.23.SL062003-11.html | 9 + .../systems/SL.P.10.R.23.SL062003-12.html | 9 + .../systems/SL.P.10.R.23.SL062003-13.html | 9 + .../systems/SL.P.10.R.23.SL062003-14.html | 9 + .../systems/SL.P.10.R.23.SL062003-15.html | 9 + .../systems/SL.P.10.R.23.SL062003-16.html | 9 + .../systems/SL.P.10.R.23.SL062003-17.html | 9 + .../systems/SL.P.10.R.23.SL062003-18.html | 9 + .../systems/SL.P.10.R.23.SL062003-19.html | 9 + .../systems/SL.P.10.R.23.SL062003-20.html | 9 + .../systems/SL.P.10.R.23.SL062003-21.html | 9 + .../systems/SL.P.10.R.23.SL062003-22.html | 9 + .../systems/SL.P.10.R.23.SL062003-23.html | 9 + .../systems/SL.P.10.R.23.SL062003-24.html | 9 + .../systems/SL.P.10.R.23.SL062003-25.html | 9 + .../systems/SL.P.10.R.24.SL062003-01.html | 9 + .../systems/SL.P.10.R.24.SL062003-02.html | 9 + .../systems/SL.P.10.R.24.SL062003-03.html | 9 + .../systems/SL.P.10.R.24.SL062003-04.html | 9 + .../systems/SL.P.10.R.24.SL062003-05.html | 9 + .../systems/SL.P.10.R.24.SL062003-06.html | 9 + .../systems/SL.P.10.R.24.SL062003-07.html | 9 + .../systems/SL.P.10.R.24.SL062003-08.html | 9 + .../systems/SL.P.10.R.24.SL062003-09.html | 9 + .../systems/SL.P.10.R.24.SL062003-10.html | 9 + .../systems/SL.P.10.R.24.SL062003-11.html | 9 + .../systems/SL.P.10.R.24.SL062003-12.html | 9 + .../systems/SL.P.10.R.24.SL062003-13.html | 9 + .../systems/SL.P.10.R.24.SL062003-14.html | 9 + .../systems/SL.P.10.R.24.SL062003-15.html | 9 + .../systems/SL.P.10.R.24.SL062003-16.html | 9 + .../systems/SL.P.10.R.24.SL062003-17.html | 9 + .../systems/SL.P.10.R.24.SL062003-18.html | 9 + .../systems/SL.P.10.R.24.SL062003-19.html | 9 + .../systems/SL.P.10.R.24.SL062003-20.html | 9 + .../systems/SL.P.10.R.24.SL062003-21.html | 9 + .../systems/SL.P.10.R.24.SL062003-22.html | 9 + .../systems/SL.P.10.R.24.SL062003-23.html | 9 + .../systems/SL.P.10.R.24.SL062003-24.html | 9 + .../systems/SL.P.10.R.24.SL062003-25.html | 9 + .../Verify-SPL/D00000.M.100.A.C.spl | 11 + .../Verify-SPL/D00000.M.100.A.D.spl | 11 + .../Verify-SPL/D00000.M.100.A.E.spl | 11 + .../Verify-SPL/D00000.M.100.A.F.spl | 11 + .../Verify-SPL/D00000.M.100.A.G.spl | 11 + .../D00000.P.10.A.C.ISI08012003.0001.spl | 11 + .../D00000.P.10.A.C.ISI08012003.0002.spl | 11 + .../D00000.P.10.A.C.ISI08012003.0003.spl | 11 + .../D00000.P.10.A.C.ISI08012003.0004.spl | 11 + .../D00000.P.10.A.D.ISI08012003.0001.spl | 11 + .../D00000.P.10.A.D.ISI08012003.0002.spl | 11 + .../D00000.P.10.A.D.ISI08012003.0003.spl | 11 + .../D00000.P.10.A.D.ISI08012003.0004.spl | 11 + .../D00000.P.10.A.E.ISI08012003.0001.spl | 11 + .../D00000.P.10.A.E.ISI08012003.0002.spl | 11 + .../D00000.P.10.A.E.ISI08012003.0003.spl | 11 + .../D00000.P.10.A.E.ISI08012003.0004.spl | 11 + .../D00000.P.10.A.F.ISI08012003.0001.spl | 11 + .../D00000.P.10.A.F.ISI08012003.0002.spl | 11 + .../D00000.P.10.A.F.ISI08012003.0003.spl | 11 + .../D00000.P.10.A.F.ISI08012003.0004.spl | 11 + .../D00000.P.10.A.G.ISI08012003.0001.spl | 11 + .../D00000.P.10.A.G.ISI08012003.0002.spl | 11 + .../D00000.P.10.A.G.ISI08012003.0003.spl | 11 + .../D00000.P.10.A.G.ISI08012003.0004.spl | 11 + .../Verify-SPL/D00001.M.100.A.C.spl | 11 + .../Verify-SPL/D00001.M.100.A.D.spl | 11 + .../Verify-SPL/D00001.M.100.A.E.spl | 11 + .../Verify-SPL/D00001.M.100.A.F.spl | 11 + .../Verify-SPL/D00001.M.100.A.G.spl | 11 + .../Verify-SPL/D00002.M.100.A.C.spl | 11 + .../Verify-SPL/D00002.M.100.A.D.spl | 11 + .../Verify-SPL/D00002.M.100.A.E.spl | 11 + .../Verify-SPL/D00002.M.100.A.F.spl | 11 + .../Verify-SPL/D00002.M.100.A.G.spl | 11 + .../Verify-SPL/D00003.M.100.A.C.spl | 11 + .../Verify-SPL/D00003.M.100.A.D.spl | 11 + .../Verify-SPL/D00003.M.100.A.E.spl | 11 + .../Verify-SPL/D00003.M.100.A.F.spl | 11 + .../Verify-SPL/D00003.M.100.A.G.spl | 11 + .../sample-test/Verify-SPL/mkSPL.pl | 19 + .../sample-test/Verify/D00000.M.100.A.C.html | 20 + .../sample-test/Verify/D00000.M.100.A.D.html | 20 + .../sample-test/Verify/D00000.M.100.A.E.html | 20 + .../sample-test/Verify/D00000.M.100.A.F.html | 20 + .../sample-test/Verify/D00000.M.100.A.G.html | 20 + .../D00000.P.10.A.C.ISI08012003.0001.html | 20 + .../D00000.P.10.A.C.ISI08012003.0002.html | 20 + .../D00000.P.10.A.C.ISI08012003.0003.html | 20 + .../D00000.P.10.A.C.ISI08012003.0004.html | 20 + .../D00000.P.10.A.D.ISI08012003.0001.html | 20 + .../D00000.P.10.A.D.ISI08012003.0002.html | 20 + .../D00000.P.10.A.D.ISI08012003.0003.html | 20 + .../D00000.P.10.A.D.ISI08012003.0004.html | 20 + .../D00000.P.10.A.E.ISI08012003.0001.html | 20 + .../D00000.P.10.A.E.ISI08012003.0002.html | 20 + .../D00000.P.10.A.E.ISI08012003.0003.html | 20 + .../D00000.P.10.A.E.ISI08012003.0004.html | 20 + .../D00000.P.10.A.F.ISI08012003.0001.html | 20 + .../D00000.P.10.A.F.ISI08012003.0002.html | 20 + .../D00000.P.10.A.F.ISI08012003.0003.html | 20 + .../D00000.P.10.A.F.ISI08012003.0004.html | 20 + .../D00000.P.10.A.G.ISI08012003.0001.html | 20 + .../D00000.P.10.A.G.ISI08012003.0002.html | 20 + .../D00000.P.10.A.G.ISI08012003.0003.html | 20 + .../D00000.P.10.A.G.ISI08012003.0004.html | 20 + .../sample-test/Verify/D00001.M.100.A.C.html | 20 + .../sample-test/Verify/D00001.M.100.A.D.html | 20 + .../sample-test/Verify/D00001.M.100.A.E.html | 20 + .../sample-test/Verify/D00001.M.100.A.F.html | 20 + .../sample-test/Verify/D00001.M.100.A.G.html | 20 + .../sample-test/Verify/D00002.M.100.A.C.html | 20 + .../sample-test/Verify/D00002.M.100.A.D.html | 20 + .../sample-test/Verify/D00002.M.100.A.E.html | 20 + .../sample-test/Verify/D00002.M.100.A.F.html | 20 + .../sample-test/Verify/D00002.M.100.A.G.html | 20 + .../sample-test/Verify/D00003.M.100.A.C.html | 20 + .../sample-test/Verify/D00003.M.100.A.D.html | 20 + .../sample-test/Verify/D00003.M.100.A.E.html | 20 + .../sample-test/Verify/D00003.M.100.A.F.html | 20 + .../sample-test/Verify/D00003.M.100.A.G.html | 20 + .../RELEASE-1.5.5/sample-test/verify-spl.xml | 94 + .../RELEASE-1.5.5/sample-test/verify.xml | 94 + fastSum/resources/ROUGE/ROUGE-1.5.5.tgz | Bin 0 -> 3046914 bytes fastSum/resources/ROUGE/XML-DOM-1.46.tar.gz | Bin 0 -> 117291 bytes fastSum/resources/ROUGE/XML-DOM-1.46/BUGS | 10 + fastSum/resources/ROUGE/XML-DOM-1.46/Changes | 483 + .../ROUGE/XML-DOM-1.46/CheckAncestors.pm | 133 + .../resources/ROUGE/XML-DOM-1.46/CmpDOM.pm | 292 + fastSum/resources/ROUGE/XML-DOM-1.46/FAQ.xml | 140 + fastSum/resources/ROUGE/XML-DOM-1.46/MANIFEST | 64 + .../resources/ROUGE/XML-DOM-1.46/META.json | 44 + fastSum/resources/ROUGE/XML-DOM-1.46/META.yml | 25 + .../resources/ROUGE/XML-DOM-1.46/MYMETA.json | 44 + .../resources/ROUGE/XML-DOM-1.46/MYMETA.yml | 25 + fastSum/resources/ROUGE/XML-DOM-1.46/Makefile | 1037 ++ .../resources/ROUGE/XML-DOM-1.46/Makefile.PL | 38 + fastSum/resources/ROUGE/XML-DOM-1.46/README | 76 + .../ROUGE/XML-DOM-1.46/XML-Parser-2.31.patch | 25 + .../ROUGE/XML-DOM-1.46/blib/arch/.exists | 0 .../blib/arch/auto/XML/DOM/.exists | 0 .../ROUGE/XML-DOM-1.46/blib/bin/.exists | 0 .../ROUGE/XML-DOM-1.46/blib/lib/XML/.exists | 0 .../ROUGE/XML-DOM-1.46/blib/lib/XML/DOM.pm | 5129 ++++++ .../XML-DOM-1.46/blib/lib/XML/DOM/AttDef.pod | 36 + .../blib/lib/XML/DOM/AttlistDecl.pod | 45 + .../XML-DOM-1.46/blib/lib/XML/DOM/Attr.pod | 67 + .../blib/lib/XML/DOM/CDATASection.pod | 31 + .../blib/lib/XML/DOM/CharacterData.pod | 87 + .../XML-DOM-1.46/blib/lib/XML/DOM/Comment.pod | 14 + .../blib/lib/XML/DOM/DOMException.pm | 88 + .../blib/lib/XML/DOM/DOMImplementation.pod | 24 + .../blib/lib/XML/DOM/Document.pod | 220 + .../blib/lib/XML/DOM/DocumentFragment.pod | 40 + .../blib/lib/XML/DOM/DocumentType.pod | 186 + .../XML-DOM-1.46/blib/lib/XML/DOM/Element.pod | 191 + .../blib/lib/XML/DOM/ElementDecl.pod | 27 + .../XML-DOM-1.46/blib/lib/XML/DOM/Entity.pod | 56 + .../blib/lib/XML/DOM/EntityReference.pod | 27 + .../blib/lib/XML/DOM/NamedNodeMap.pm | 271 + .../blib/lib/XML/DOM/NamedNodeMap.pod | 130 + .../XML-DOM-1.46/blib/lib/XML/DOM/Node.pod | 451 + .../XML-DOM-1.46/blib/lib/XML/DOM/NodeList.pm | 46 + .../blib/lib/XML/DOM/NodeList.pod | 46 + .../blib/lib/XML/DOM/Notation.pod | 47 + .../XML-DOM-1.46/blib/lib/XML/DOM/Parser.pod | 67 + .../XML-DOM-1.46/blib/lib/XML/DOM/PerlSAX.pm | 47 + .../lib/XML/DOM/ProcessingInstruction.pod | 32 + .../XML-DOM-1.46/blib/lib/XML/DOM/Text.pod | 60 + .../XML-DOM-1.46/blib/lib/XML/DOM/XMLDecl.pod | 33 + .../blib/lib/XML/Handler/BuildDOM.pm | 338 + .../blib/lib/auto/XML/DOM/.exists | 0 .../ROUGE/XML-DOM-1.46/blib/man1/.exists | 0 .../ROUGE/XML-DOM-1.46/blib/man3/.exists | 0 .../ROUGE/XML-DOM-1.46/blib/man3/XML__DOM.3pm | 468 + .../blib/man3/XML__DOM__AttDef.3pm | 103 + .../blib/man3/XML__DOM__AttlistDecl.3pm | 116 + .../XML-DOM-1.46/blib/man3/XML__DOM__Attr.3pm | 136 + .../blib/man3/XML__DOM__CDATASection.3pm | 105 + .../blib/man3/XML__DOM__CharacterData.3pm | 152 + .../blib/man3/XML__DOM__Comment.3pm | 89 + .../blib/man3/XML__DOM__DOMImplementation.3pm | 95 + .../blib/man3/XML__DOM__Document.3pm | 263 + .../blib/man3/XML__DOM__DocumentFragment.3pm | 116 + .../blib/man3/XML__DOM__DocumentType.3pm | 243 + .../blib/man3/XML__DOM__Element.3pm | 253 + .../blib/man3/XML__DOM__ElementDecl.3pm | 99 + .../blib/man3/XML__DOM__Entity.3pm | 120 + .../blib/man3/XML__DOM__EntityReference.3pm | 103 + .../blib/man3/XML__DOM__NamedNodeMap.3pm | 192 + .../XML-DOM-1.46/blib/man3/XML__DOM__Node.3pm | 500 + .../blib/man3/XML__DOM__NodeList.3pm | 111 + .../blib/man3/XML__DOM__Notation.3pm | 116 + .../blib/man3/XML__DOM__Parser.3pm | 149 + .../blib/man3/XML__DOM__PerlSAX.3pm | 102 + .../man3/XML__DOM__ProcessingInstruction.3pm | 104 + .../XML-DOM-1.46/blib/man3/XML__DOM__Text.3pm | 131 + .../blib/man3/XML__DOM__XMLDecl.3pm | 104 + .../blib/man3/XML__Handler__BuildDOM.3pm | 119 + .../ROUGE/XML-DOM-1.46/blib/script/.exists | 0 .../ROUGE/XML-DOM-1.46/lib/XML/DOM.pm | 5129 ++++++ .../ROUGE/XML-DOM-1.46/lib/XML/DOM/AttDef.pod | 36 + .../XML-DOM-1.46/lib/XML/DOM/AttlistDecl.pod | 45 + .../ROUGE/XML-DOM-1.46/lib/XML/DOM/Attr.pod | 67 + .../XML-DOM-1.46/lib/XML/DOM/CDATASection.pod | 31 + .../lib/XML/DOM/CharacterData.pod | 87 + .../XML-DOM-1.46/lib/XML/DOM/Comment.pod | 14 + .../XML-DOM-1.46/lib/XML/DOM/DOMException.pm | 88 + .../lib/XML/DOM/DOMImplementation.pod | 24 + .../XML-DOM-1.46/lib/XML/DOM/Document.pod | 220 + .../lib/XML/DOM/DocumentFragment.pod | 40 + .../XML-DOM-1.46/lib/XML/DOM/DocumentType.pod | 186 + .../XML-DOM-1.46/lib/XML/DOM/Element.pod | 191 + .../XML-DOM-1.46/lib/XML/DOM/ElementDecl.pod | 27 + .../ROUGE/XML-DOM-1.46/lib/XML/DOM/Entity.pod | 56 + .../lib/XML/DOM/EntityReference.pod | 27 + .../XML-DOM-1.46/lib/XML/DOM/NamedNodeMap.pm | 271 + .../XML-DOM-1.46/lib/XML/DOM/NamedNodeMap.pod | 130 + .../ROUGE/XML-DOM-1.46/lib/XML/DOM/Node.pod | 451 + .../XML-DOM-1.46/lib/XML/DOM/NodeList.pm | 46 + .../XML-DOM-1.46/lib/XML/DOM/NodeList.pod | 46 + .../XML-DOM-1.46/lib/XML/DOM/Notation.pod | 47 + .../ROUGE/XML-DOM-1.46/lib/XML/DOM/Parser.pod | 67 + .../ROUGE/XML-DOM-1.46/lib/XML/DOM/PerlSAX.pm | 47 + .../lib/XML/DOM/ProcessingInstruction.pod | 32 + .../ROUGE/XML-DOM-1.46/lib/XML/DOM/Text.pod | 60 + .../XML-DOM-1.46/lib/XML/DOM/XMLDecl.pod | 33 + .../XML-DOM-1.46/lib/XML/Handler/BuildDOM.pm | 338 + .../resources/ROUGE/XML-DOM-1.46/pm_to_blib | 0 .../XML-DOM-1.46/samples/REC-xml-19980210.xml | 4197 +++++ .../ROUGE/XML-DOM-1.46/samples/minutes.xml | 110 + .../ROUGE/XML-DOM-1.46/t/build_dom.t | 70 + .../ROUGE/XML-DOM-1.46/t/dom_astress.t | 77 + .../resources/ROUGE/XML-DOM-1.46/t/dom_attr.t | 117 + .../ROUGE/XML-DOM-1.46/t/dom_cdata.t | 49 + .../ROUGE/XML-DOM-1.46/t/dom_documenttype.t | 8 + .../ROUGE/XML-DOM-1.46/t/dom_encode.t | 36 + .../ROUGE/XML-DOM-1.46/t/dom_example.t | 61 + .../ROUGE/XML-DOM-1.46/t/dom_extent.dtd | 1 + .../ROUGE/XML-DOM-1.46/t/dom_extent.ent | 2 + .../ROUGE/XML-DOM-1.46/t/dom_extent.t | 50 + .../ROUGE/XML-DOM-1.46/t/dom_jp_astress.t | 61 + .../ROUGE/XML-DOM-1.46/t/dom_jp_attr.t | 166 + .../ROUGE/XML-DOM-1.46/t/dom_jp_cdata.t | 50 + .../ROUGE/XML-DOM-1.46/t/dom_jp_example.t | 62 + .../ROUGE/XML-DOM-1.46/t/dom_jp_minus.t | 51 + .../ROUGE/XML-DOM-1.46/t/dom_jp_modify.t | 183 + .../ROUGE/XML-DOM-1.46/t/dom_jp_print.t | 104 + .../ROUGE/XML-DOM-1.46/t/dom_minus.t | 48 + .../ROUGE/XML-DOM-1.46/t/dom_modify.t | 131 + .../ROUGE/XML-DOM-1.46/t/dom_noexpand.t | 74 + .../ROUGE/XML-DOM-1.46/t/dom_print.t | 51 + .../ROUGE/XML-DOM-1.46/t/dom_template.t | 19 + .../resources/ROUGE/XML-DOM-1.46/t/dom_text.t | 24 + .../resources/ROUGE/XML-Parser-2.44.tar.gz | Bin 0 -> 237377 bytes .../resources/ROUGE/XML-Parser-2.44/Changes | 534 + .../ROUGE/XML-Parser-2.44/Expat/Expat.bs | 0 .../ROUGE/XML-Parser-2.44/Expat/Expat.c | 3023 ++++ .../ROUGE/XML-Parser-2.44/Expat/Expat.o | Bin 0 -> 500736 bytes .../ROUGE/XML-Parser-2.44/Expat/Expat.pm | 1238 ++ .../ROUGE/XML-Parser-2.44/Expat/Expat.xs | 2216 +++ .../ROUGE/XML-Parser-2.44/Expat/MYMETA.json | 39 + .../ROUGE/XML-Parser-2.44/Expat/MYMETA.yml | 21 + .../ROUGE/XML-Parser-2.44/Expat/Makefile | 832 + .../ROUGE/XML-Parser-2.44/Expat/Makefile.PL | 29 + .../ROUGE/XML-Parser-2.44/Expat/encoding.h | 91 + .../ROUGE/XML-Parser-2.44/Expat/pm_to_blib | 0 .../ROUGE/XML-Parser-2.44/Expat/typemap | 24 + .../resources/ROUGE/XML-Parser-2.44/MANIFEST | 67 + .../resources/ROUGE/XML-Parser-2.44/META.json | 47 + .../resources/ROUGE/XML-Parser-2.44/META.yml | 25 + .../ROUGE/XML-Parser-2.44/MYMETA.json | 47 + .../ROUGE/XML-Parser-2.44/MYMETA.yml | 25 + .../resources/ROUGE/XML-Parser-2.44/Makefile | 1058 ++ .../ROUGE/XML-Parser-2.44/Makefile.PL | 201 + .../resources/ROUGE/XML-Parser-2.44/Parser.pm | 840 + .../Parser/Encodings/Japanese_Encodings.msg | 117 + .../XML-Parser-2.44/Parser/Encodings/README | 51 + .../XML-Parser-2.44/Parser/Encodings/big5.enc | Bin 0 -> 40706 bytes .../Parser/Encodings/euc-kr.enc | Bin 0 -> 45802 bytes .../Parser/Encodings/ibm866.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-2.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-3.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-4.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-5.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-7.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-8.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/iso-8859-9.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/koi8-r.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/windows-1250.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/windows-1251.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/windows-1252.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/windows-1255.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/x-euc-jp-jisx0221.enc | Bin 0 -> 37890 bytes .../Parser/Encodings/x-euc-jp-unicode.enc | Bin 0 -> 37890 bytes .../Parser/Encodings/x-sjis-cp932.enc | Bin 0 -> 20368 bytes .../Parser/Encodings/x-sjis-jdk117.enc | Bin 0 -> 18202 bytes .../Parser/Encodings/x-sjis-jisx0221.enc | Bin 0 -> 18202 bytes .../Parser/Encodings/x-sjis-unicode.enc | Bin 0 -> 18202 bytes .../XML-Parser-2.44/Parser/LWPExternEnt.pl | 71 + .../XML-Parser-2.44/Parser/Style/Debug.pm | 52 + .../XML-Parser-2.44/Parser/Style/Objects.pm | 78 + .../XML-Parser-2.44/Parser/Style/Stream.pm | 184 + .../XML-Parser-2.44/Parser/Style/Subs.pm | 58 + .../XML-Parser-2.44/Parser/Style/Tree.pm | 90 + .../resources/ROUGE/XML-Parser-2.44/README | 102 + .../ROUGE/XML-Parser-2.44/blib/arch/.exists | 0 .../blib/arch/auto/XML/Parser/.exists | 0 .../blib/arch/auto/XML/Parser/Expat/.exists | 0 .../blib/arch/auto/XML/Parser/Expat/Expat.so | Bin 0 -> 302752 bytes .../ROUGE/XML-Parser-2.44/blib/bin/.exists | 0 .../XML-Parser-2.44/blib/lib/XML/.exists | 0 .../XML-Parser-2.44/blib/lib/XML/Parser.pm | 840 + .../blib/lib/XML/Parser/.exists | 0 .../Parser/Encodings/Japanese_Encodings.msg | 117 + .../blib/lib/XML/Parser/Encodings/README | 51 + .../blib/lib/XML/Parser/Encodings/big5.enc | Bin 0 -> 40706 bytes .../blib/lib/XML/Parser/Encodings/euc-kr.enc | Bin 0 -> 45802 bytes .../blib/lib/XML/Parser/Encodings/ibm866.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-2.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-3.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-4.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-5.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-7.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-8.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/iso-8859-9.enc | Bin 0 -> 1072 bytes .../blib/lib/XML/Parser/Encodings/koi8-r.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/windows-1250.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/windows-1251.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/windows-1252.enc | Bin 0 -> 1072 bytes .../lib/XML/Parser/Encodings/windows-1255.enc | Bin 0 -> 1072 bytes .../Parser/Encodings/x-euc-jp-jisx0221.enc | Bin 0 -> 37890 bytes .../XML/Parser/Encodings/x-euc-jp-unicode.enc | Bin 0 -> 37890 bytes .../lib/XML/Parser/Encodings/x-sjis-cp932.enc | Bin 0 -> 20368 bytes .../XML/Parser/Encodings/x-sjis-jdk117.enc | Bin 0 -> 18202 bytes .../XML/Parser/Encodings/x-sjis-jisx0221.enc | Bin 0 -> 18202 bytes .../XML/Parser/Encodings/x-sjis-unicode.enc | Bin 0 -> 18202 bytes .../blib/lib/XML/Parser/Expat.pm | 1238 ++ .../blib/lib/XML/Parser/LWPExternEnt.pl | 71 + .../blib/lib/XML/Parser/Style/Debug.pm | 52 + .../blib/lib/XML/Parser/Style/Objects.pm | 78 + .../blib/lib/XML/Parser/Style/Stream.pm | 184 + .../blib/lib/XML/Parser/Style/Subs.pm | 58 + .../blib/lib/XML/Parser/Style/Tree.pm | 90 + .../blib/lib/auto/XML/Parser/.exists | 0 .../blib/lib/auto/XML/Parser/Expat/.exists | 0 .../ROUGE/XML-Parser-2.44/blib/man1/.exists | 0 .../ROUGE/XML-Parser-2.44/blib/man3/.exists | 0 .../XML-Parser-2.44/blib/man3/XML__Parser.3pm | 541 + .../blib/man3/XML__Parser__Expat.3pm | 579 + .../blib/man3/XML__Parser__Style__Debug.3pm | 91 + .../blib/man3/XML__Parser__Style__Objects.3pm | 100 + .../blib/man3/XML__Parser__Style__Stream.3pm | 146 + .../blib/man3/XML__Parser__Style__Subs.3pm | 110 + .../blib/man3/XML__Parser__Style__Tree.3pm | 118 + .../ROUGE/XML-Parser-2.44/blib/script/.exists | 0 .../XML-Parser-2.44/inc/Devel/CheckLib.pm | 490 + .../ROUGE/XML-Parser-2.44/pm_to_blib | 0 .../samples/REC-xml-19980210.xml | 4197 +++++ .../ROUGE/XML-Parser-2.44/samples/canonical | 124 + .../XML-Parser-2.44/samples/canontst.xml | 20 + .../ROUGE/XML-Parser-2.44/samples/ctest.dtd | 2 + .../ROUGE/XML-Parser-2.44/samples/xmlcomments | 44 + .../ROUGE/XML-Parser-2.44/samples/xmlfilter | 329 + .../ROUGE/XML-Parser-2.44/samples/xmlstats | 186 + .../ROUGE/XML-Parser-2.44/t/astress.t | 265 + .../resources/ROUGE/XML-Parser-2.44/t/cdata.t | 40 + .../resources/ROUGE/XML-Parser-2.44/t/decl.t | 180 + .../ROUGE/XML-Parser-2.44/t/defaulted.t | 50 + .../ROUGE/XML-Parser-2.44/t/encoding.t | 110 + .../resources/ROUGE/XML-Parser-2.44/t/ext.ent | 1 + .../ROUGE/XML-Parser-2.44/t/ext2.ent | 1 + .../ROUGE/XML-Parser-2.44/t/external_ent.t | 70 + .../resources/ROUGE/XML-Parser-2.44/t/file.t | 12 + .../XML-Parser-2.44/t/file_open_scalar.t | 25 + .../ROUGE/XML-Parser-2.44/t/finish.t | 32 + .../resources/ROUGE/XML-Parser-2.44/t/foo.dtd | 20 + .../ROUGE/XML-Parser-2.44/t/namespaces.t | 133 + .../ROUGE/XML-Parser-2.44/t/parament.t | 102 + .../ROUGE/XML-Parser-2.44/t/partial.t | 40 + .../resources/ROUGE/XML-Parser-2.44/t/skip.t | 53 + .../ROUGE/XML-Parser-2.44/t/stream.t | 50 + .../ROUGE/XML-Parser-2.44/t/styles.t | 62 + .../resources/ROUGE/XML-RegExp-0.04.tar.gz | Bin 0 -> 3601 bytes .../resources/ROUGE/XML-RegExp-0.04/Changes | 15 + .../resources/ROUGE/XML-RegExp-0.04/MANIFEST | 7 + .../resources/ROUGE/XML-RegExp-0.04/META.yml | 20 + .../ROUGE/XML-RegExp-0.04/MYMETA.json | 39 + .../ROUGE/XML-RegExp-0.04/MYMETA.yml | 21 + .../resources/ROUGE/XML-RegExp-0.04/Makefile | 843 + .../ROUGE/XML-RegExp-0.04/Makefile.PL | 7 + .../resources/ROUGE/XML-RegExp-0.04/README | 21 + .../ROUGE/XML-RegExp-0.04/blib/arch/.exists | 0 .../blib/arch/auto/XML/RegExp/.exists | 0 .../ROUGE/XML-RegExp-0.04/blib/bin/.exists | 0 .../XML-RegExp-0.04/blib/lib/XML/.exists | 0 .../XML-RegExp-0.04/blib/lib/XML/RegExp.pm | 82 + .../blib/lib/auto/XML/RegExp/.exists | 0 .../ROUGE/XML-RegExp-0.04/blib/man1/.exists | 0 .../ROUGE/XML-RegExp-0.04/blib/man3/.exists | 0 .../XML-RegExp-0.04/blib/man3/XML__RegExp.3pm | 107 + .../ROUGE/XML-RegExp-0.04/blib/script/.exists | 0 .../ROUGE/XML-RegExp-0.04/lib/XML/RegExp.pm | 82 + .../ROUGE/XML-RegExp-0.04/pm_to_blib | 0 .../resources/ROUGE/XML-RegExp-0.04/test.pl | 20 + 1133 files changed, 157516 insertions(+), 217 deletions(-) delete mode 100644 fastSum/PointerGen/data_util/config.py delete mode 100644 fastSum/PointerGen/training_ptr_gen/main.py create mode 100644 fastSum/resources/ROUGE/DB_File-1.835.tar.gz create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/Changes create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File.bs create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File.c create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File.o create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm.bak create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File.xs create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/DB_File_BS create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/MANIFEST create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/META.json create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/META.yml create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/MYMETA.json create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/MYMETA.yml create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/Makefile create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/Makefile.PL create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/README create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/arch/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/arch/auto/DB_File/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/arch/auto/DB_File/DB_File.so create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/bin/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/lib/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/lib/DB_File.pm create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/lib/auto/DB_File/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/man1/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/man3/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/man3/DB_File.3pm create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/blib/script/.exists create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/config.in create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/constants.h create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/constants.xs create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/dbinfo create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/fallback.h create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/fallback.xs create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/hints/dynixptx.pl create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/hints/sco.pl create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.004 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_01 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_02 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_03 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_04 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_05 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.005 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_01 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_02 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_03 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/patches/5.6.0 create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/pm_to_blib create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/ppport.h create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t.bak create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t.bak create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t.bak create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/pod.t create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/t/pod.t.bak create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/typemap create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/version.c create mode 100644 fastSum/resources/ROUGE/DB_File-1.835/version.o create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/README.txt create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/RELEASE-NOTE.txt create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/ROUGE-1.5.5.pl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/WordNet-1.6.exc.db create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adj.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adv.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/buildExeptionDB.pl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/noun.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/verb.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6.exc.db create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/WordNet-2.0.exc.db create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adj.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adv.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/buildExeptionDB.pl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/noun.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/verb.exc create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0.exc.db create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/data/smart_common_words.txt create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/docs/ACL2004.pdf create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/docs/COLING2004.pdf create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/docs/NAACL2003.pdf create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/docs/NTCIR4.pdf create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/docs/ROUGE-Note-v1.4.2.pdf create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/docs/WAS2004.pdf create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/runROUGE-test.pl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/DUC2002-BE-F.in.26.lst.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/DUC2002-BE-F.in.26.simple.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/DUC2002-BE-L.in.26.lst.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/DUC2002-BE-L.in.26.simple.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/DUC2002-ROUGE.in.26.spl.lst.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/DUC2002-ROUGE.in.26.spl.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m-s.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m-s.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/verify-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-output/verify-spl-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002-BE-F.in.26.lst create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002-BE-F.in.26.simple.xml create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002-BE-L.in.26.lst create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002-BE-L.in.26.simple.xml create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002-ROUGE.in.26.spl.lst create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002-ROUGE.in.26.spl.xml create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D061.M.100.J.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D061.M.100.J.I.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D062.M.100.J.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D062.M.100.J.A.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D063.M.100.J.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D063.M.100.J.E.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D064.M.100.J.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D064.M.100.J.B.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D065.M.100.J.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D065.M.100.J.F.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D066.M.100.J.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D066.M.100.J.I.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D067.M.100.F.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D067.M.100.F.I.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D068.M.100.F.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D068.M.100.F.A.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D069.M.100.F.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D069.M.100.F.C.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D070.M.100.F.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D070.M.100.F.D.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D071.M.100.F.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D071.M.100.F.D.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D072.M.100.F.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D072.M.100.F.J.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D073.M.100.B.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D073.M.100.B.J.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D074.M.100.B.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D074.M.100.B.A.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D075.M.100.B.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D075.M.100.B.E.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D076.M.100.B.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D076.M.100.B.E.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D077.M.100.B.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D077.M.100.B.H.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D078.M.100.B.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D078.M.100.B.J.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D079.M.100.A.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D079.M.100.A.I.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D080.M.100.A.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D080.M.100.A.E.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D081.M.100.A.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D081.M.100.A.D.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D082.M.100.A.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D082.M.100.A.C.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D083.M.100.A.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D083.M.100.A.G.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D084.M.100.A.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D084.M.100.A.H.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D085.M.100.D.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D085.M.100.D.H.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D086.M.100.D.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D086.M.100.D.B.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D087.M.100.D.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D087.M.100.D.B.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D089.M.100.D.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D089.M.100.D.G.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D090.M.100.D.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D090.M.100.D.J.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D091.M.100.C.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D091.M.100.C.F.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D092.M.100.C.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D092.M.100.C.A.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D093.M.100.C.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D093.M.100.C.H.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D094.M.100.C.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D094.M.100.C.D.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D095.M.100.C.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D095.M.100.C.H.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D096.M.100.C.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D096.M.100.C.G.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D097.M.100.E.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D097.M.100.E.J.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D098.M.100.E.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D098.M.100.E.A.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D099.M.100.E.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D099.M.100.E.D.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D100.M.100.E.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D100.M.100.E.F.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D101.M.100.E.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D101.M.100.E.G.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D102.M.100.E.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D102.M.100.E.D.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D103.M.100.G.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D103.M.100.G.A.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D104.M.100.G.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D104.M.100.G.C.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D105.M.100.G.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D105.M.100.G.C.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D106.M.100.G.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D106.M.100.G.F.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D107.M.100.G.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D107.M.100.G.H.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D108.M.100.G.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D108.M.100.G.I.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D109.M.100.H.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D109.M.100.H.B.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D110.M.100.H.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D110.M.100.H.C.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D111.M.100.H.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D111.M.100.H.C.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D112.M.100.H.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D112.M.100.H.E.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D113.M.100.H.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D113.M.100.H.I.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D114.M.100.H.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D114.M.100.H.F.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D115.M.100.I.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D115.M.100.I.B.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D116.M.100.I.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D116.M.100.I.B.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D117.M.100.I.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D117.M.100.I.G.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D118.M.100.I.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D118.M.100.I.E.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D119.M.100.I.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D119.M.100.I.F.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D120.M.100.I.26.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-F/D120.M.100.I.J.mini.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D061.M.100.J.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D061.M.100.J.I.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D062.M.100.J.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D062.M.100.J.A.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D063.M.100.J.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D063.M.100.J.E.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D064.M.100.J.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D064.M.100.J.B.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D065.M.100.J.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D065.M.100.J.F.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D066.M.100.J.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D066.M.100.J.I.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D067.M.100.F.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D067.M.100.F.I.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D068.M.100.F.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D068.M.100.F.A.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D069.M.100.F.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D069.M.100.F.C.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D070.M.100.F.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D070.M.100.F.D.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D071.M.100.F.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D071.M.100.F.D.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D072.M.100.F.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D072.M.100.F.J.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D073.M.100.B.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D073.M.100.B.J.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D074.M.100.B.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D074.M.100.B.A.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D075.M.100.B.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D075.M.100.B.E.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D076.M.100.B.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D076.M.100.B.E.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D077.M.100.B.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D077.M.100.B.H.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D078.M.100.B.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D078.M.100.B.J.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D079.M.100.A.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D079.M.100.A.I.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D080.M.100.A.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D080.M.100.A.E.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D081.M.100.A.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D081.M.100.A.D.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D082.M.100.A.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D082.M.100.A.C.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D083.M.100.A.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D083.M.100.A.G.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D084.M.100.A.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D084.M.100.A.H.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D085.M.100.D.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D085.M.100.D.H.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D086.M.100.D.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D086.M.100.D.B.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D087.M.100.D.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D087.M.100.D.B.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D089.M.100.D.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D089.M.100.D.G.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D090.M.100.D.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D090.M.100.D.J.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D091.M.100.C.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D091.M.100.C.F.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D092.M.100.C.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D092.M.100.C.A.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D093.M.100.C.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D093.M.100.C.H.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D094.M.100.C.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D094.M.100.C.D.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D095.M.100.C.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D095.M.100.C.H.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D096.M.100.C.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D096.M.100.C.G.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D097.M.100.E.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D097.M.100.E.J.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D098.M.100.E.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D098.M.100.E.A.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D099.M.100.E.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D099.M.100.E.D.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D100.M.100.E.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D100.M.100.E.F.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D101.M.100.E.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D101.M.100.E.G.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D102.M.100.E.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D102.M.100.E.D.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D103.M.100.G.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D103.M.100.G.A.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D104.M.100.G.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D104.M.100.G.C.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D105.M.100.G.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D105.M.100.G.C.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D106.M.100.G.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D106.M.100.G.F.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D107.M.100.G.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D107.M.100.G.H.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D108.M.100.G.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D108.M.100.G.I.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D109.M.100.H.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D109.M.100.H.B.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D110.M.100.H.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D110.M.100.H.C.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D111.M.100.H.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D111.M.100.H.C.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D112.M.100.H.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D112.M.100.H.E.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D113.M.100.H.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D113.M.100.H.I.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D114.M.100.H.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D114.M.100.H.F.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D115.M.100.I.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D115.M.100.I.B.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D116.M.100.I.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D116.M.100.I.B.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D117.M.100.I.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D117.M.100.I.G.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D118.M.100.I.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D118.M.100.I.E.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D119.M.100.I.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D119.M.100.I.F.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D120.M.100.I.26.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/BE-L/D120.M.100.I.J.be create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D061.M.100.J.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D061.M.100.J.I.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D062.M.100.J.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D062.M.100.J.A.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D063.M.100.J.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D063.M.100.J.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D064.M.100.J.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D064.M.100.J.B.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D065.M.100.J.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D065.M.100.J.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D066.M.100.J.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D066.M.100.J.I.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D067.M.100.F.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D067.M.100.F.I.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D068.M.100.F.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D068.M.100.F.A.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D069.M.100.F.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D069.M.100.F.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D070.M.100.F.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D070.M.100.F.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D071.M.100.F.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D071.M.100.F.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D072.M.100.F.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D072.M.100.F.J.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D073.M.100.B.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D073.M.100.B.J.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D074.M.100.B.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D074.M.100.B.A.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D075.M.100.B.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D075.M.100.B.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D076.M.100.B.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D076.M.100.B.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D077.M.100.B.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D077.M.100.B.H.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D078.M.100.B.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D078.M.100.B.J.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D079.M.100.A.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D079.M.100.A.I.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D080.M.100.A.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D080.M.100.A.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D081.M.100.A.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D081.M.100.A.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D082.M.100.A.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D082.M.100.A.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D083.M.100.A.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D083.M.100.A.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D084.M.100.A.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D084.M.100.A.H.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D085.M.100.D.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D085.M.100.D.H.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D086.M.100.D.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D086.M.100.D.B.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D087.M.100.D.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D087.M.100.D.B.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D089.M.100.D.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D089.M.100.D.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D090.M.100.D.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D090.M.100.D.J.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D091.M.100.C.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D091.M.100.C.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D092.M.100.C.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D092.M.100.C.A.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D093.M.100.C.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D093.M.100.C.H.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D094.M.100.C.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D094.M.100.C.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D095.M.100.C.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D095.M.100.C.H.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D096.M.100.C.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D096.M.100.C.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D097.M.100.E.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D097.M.100.E.J.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D098.M.100.E.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D098.M.100.E.A.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D099.M.100.E.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D099.M.100.E.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D100.M.100.E.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D100.M.100.E.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D101.M.100.E.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D101.M.100.E.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D102.M.100.E.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D102.M.100.E.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D103.M.100.G.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D103.M.100.G.A.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D104.M.100.G.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D104.M.100.G.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D105.M.100.G.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D105.M.100.G.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D106.M.100.G.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D106.M.100.G.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D107.M.100.G.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D107.M.100.G.H.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D108.M.100.G.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D108.M.100.G.I.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D109.M.100.H.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D109.M.100.H.B.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D110.M.100.H.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D110.M.100.H.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D111.M.100.H.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D111.M.100.H.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D112.M.100.H.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D112.M.100.H.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D113.M.100.H.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D113.M.100.H.I.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D114.M.100.H.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D114.M.100.H.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D115.M.100.I.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D115.M.100.I.B.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D116.M.100.I.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D116.M.100.I.B.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D117.M.100.I.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D117.M.100.I.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D118.M.100.I.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D118.M.100.I.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D119.M.100.I.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D119.M.100.I.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D120.M.100.I.26.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/DUC2002/docs-spl/D120.M.100.I.J.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/ROUGE-test.xml create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.A.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.B.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.C.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/models/SL.P.10.R.D.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.11.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.12.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.13.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.14.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.21.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.22.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.23.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-01.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-02.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-03.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-04.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-05.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-06.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-07.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-08.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-09.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-10.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-11.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-12.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-13.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-14.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-15.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-16.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-17.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-18.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-19.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-20.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-21.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-22.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-23.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-24.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/SL2003/systems/SL.P.10.R.24.SL062003-25.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.M.100.A.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.M.100.A.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.M.100.A.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.M.100.A.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.M.100.A.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.C.ISI08012003.0001.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.C.ISI08012003.0002.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.C.ISI08012003.0003.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.C.ISI08012003.0004.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.D.ISI08012003.0001.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.D.ISI08012003.0002.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.D.ISI08012003.0003.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.D.ISI08012003.0004.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.E.ISI08012003.0001.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.E.ISI08012003.0002.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.E.ISI08012003.0003.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.E.ISI08012003.0004.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.F.ISI08012003.0001.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.F.ISI08012003.0002.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.F.ISI08012003.0003.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.F.ISI08012003.0004.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.G.ISI08012003.0001.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.G.ISI08012003.0002.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.G.ISI08012003.0003.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00000.P.10.A.G.ISI08012003.0004.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00001.M.100.A.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00001.M.100.A.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00001.M.100.A.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00001.M.100.A.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00001.M.100.A.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00002.M.100.A.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00002.M.100.A.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00002.M.100.A.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00002.M.100.A.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00002.M.100.A.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00003.M.100.A.C.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00003.M.100.A.D.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00003.M.100.A.E.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00003.M.100.A.F.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/D00003.M.100.A.G.spl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify-SPL/mkSPL.pl create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.M.100.A.C.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.M.100.A.D.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.M.100.A.E.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.M.100.A.F.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.M.100.A.G.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.C.ISI08012003.0001.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.C.ISI08012003.0002.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.C.ISI08012003.0003.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.C.ISI08012003.0004.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.D.ISI08012003.0001.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.D.ISI08012003.0002.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.D.ISI08012003.0003.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.D.ISI08012003.0004.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.E.ISI08012003.0001.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.E.ISI08012003.0002.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.E.ISI08012003.0003.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.E.ISI08012003.0004.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.F.ISI08012003.0001.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.F.ISI08012003.0002.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.F.ISI08012003.0003.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.F.ISI08012003.0004.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.G.ISI08012003.0001.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.G.ISI08012003.0002.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.G.ISI08012003.0003.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00000.P.10.A.G.ISI08012003.0004.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00001.M.100.A.C.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00001.M.100.A.D.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00001.M.100.A.E.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00001.M.100.A.F.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00001.M.100.A.G.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00002.M.100.A.C.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00002.M.100.A.D.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00002.M.100.A.E.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00002.M.100.A.F.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00002.M.100.A.G.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00003.M.100.A.C.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00003.M.100.A.D.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00003.M.100.A.E.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00003.M.100.A.F.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/Verify/D00003.M.100.A.G.html create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/verify-spl.xml create mode 100644 fastSum/resources/ROUGE/RELEASE-1.5.5/sample-test/verify.xml create mode 100644 fastSum/resources/ROUGE/ROUGE-1.5.5.tgz create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46.tar.gz create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/BUGS create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/Changes create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/CheckAncestors.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/CmpDOM.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/FAQ.xml create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/MANIFEST create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/META.json create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/META.yml create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/MYMETA.json create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/MYMETA.yml create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/Makefile create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/Makefile.PL create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/README create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/XML-Parser-2.31.patch create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/arch/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/arch/auto/XML/DOM/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/bin/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/AttDef.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/AttlistDecl.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Attr.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/CDATASection.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/CharacterData.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Comment.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/DOMException.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/DOMImplementation.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Document.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/DocumentFragment.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/DocumentType.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Element.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/ElementDecl.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Entity.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/EntityReference.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/NamedNodeMap.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/NamedNodeMap.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Node.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/NodeList.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/NodeList.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Notation.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Parser.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/PerlSAX.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/ProcessingInstruction.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/Text.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/DOM/XMLDecl.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/XML/Handler/BuildDOM.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/lib/auto/XML/DOM/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man1/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__AttDef.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__AttlistDecl.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Attr.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__CDATASection.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__CharacterData.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Comment.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__DOMImplementation.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Document.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__DocumentFragment.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__DocumentType.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Element.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__ElementDecl.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Entity.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__EntityReference.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__NamedNodeMap.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Node.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__NodeList.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Notation.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Parser.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__PerlSAX.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__ProcessingInstruction.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__Text.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__DOM__XMLDecl.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/man3/XML__Handler__BuildDOM.3pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/blib/script/.exists create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/AttDef.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/AttlistDecl.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Attr.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/CDATASection.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/CharacterData.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Comment.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/DOMException.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/DOMImplementation.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Document.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/DocumentFragment.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/DocumentType.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Element.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/ElementDecl.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Entity.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/EntityReference.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/NamedNodeMap.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/NamedNodeMap.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Node.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/NodeList.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/NodeList.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Notation.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Parser.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/PerlSAX.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/ProcessingInstruction.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/Text.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/DOM/XMLDecl.pod create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/lib/XML/Handler/BuildDOM.pm create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/pm_to_blib create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/samples/REC-xml-19980210.xml create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/samples/minutes.xml create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/build_dom.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_astress.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_attr.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_cdata.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_documenttype.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_encode.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_example.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_extent.dtd create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_extent.ent create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_extent.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_astress.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_attr.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_cdata.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_example.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_minus.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_modify.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_jp_print.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_minus.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_modify.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_noexpand.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_print.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_template.t create mode 100644 fastSum/resources/ROUGE/XML-DOM-1.46/t/dom_text.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44.tar.gz create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Changes create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Expat.bs create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Expat.c create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Expat.o create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Expat.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Expat.xs create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/MYMETA.json create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/MYMETA.yml create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Makefile create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/Makefile.PL create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/encoding.h create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/pm_to_blib create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Expat/typemap create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/MANIFEST create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/META.json create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/META.yml create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/MYMETA.json create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/MYMETA.yml create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Makefile create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Makefile.PL create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/Japanese_Encodings.msg create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/README create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/big5.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/euc-kr.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/ibm866.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-2.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-3.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-4.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-5.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-7.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-8.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/iso-8859-9.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/koi8-r.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/windows-1250.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/windows-1251.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/windows-1252.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/windows-1255.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/x-euc-jp-jisx0221.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/x-euc-jp-unicode.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/x-sjis-cp932.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/x-sjis-jdk117.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/x-sjis-jisx0221.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Encodings/x-sjis-unicode.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/LWPExternEnt.pl create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Style/Debug.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Style/Objects.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Style/Stream.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Style/Subs.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/Parser/Style/Tree.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/README create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/arch/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/arch/auto/XML/Parser/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/arch/auto/XML/Parser/Expat/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/arch/auto/XML/Parser/Expat/Expat.so create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/bin/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/Japanese_Encodings.msg create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/README create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/big5.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/euc-kr.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/ibm866.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-2.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-3.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-4.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-5.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-7.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-8.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/iso-8859-9.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/koi8-r.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/windows-1250.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/windows-1251.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/windows-1252.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/windows-1255.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/x-euc-jp-jisx0221.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/x-euc-jp-unicode.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/x-sjis-cp932.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/x-sjis-jdk117.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/x-sjis-jisx0221.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Encodings/x-sjis-unicode.enc create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Expat.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/LWPExternEnt.pl create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Style/Debug.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Style/Objects.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Style/Stream.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Style/Subs.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/XML/Parser/Style/Tree.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/auto/XML/Parser/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/lib/auto/XML/Parser/Expat/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man1/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser__Expat.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser__Style__Debug.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser__Style__Objects.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser__Style__Stream.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser__Style__Subs.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/man3/XML__Parser__Style__Tree.3pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/blib/script/.exists create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/inc/Devel/CheckLib.pm create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/pm_to_blib create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/REC-xml-19980210.xml create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/canonical create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/canontst.xml create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/ctest.dtd create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/xmlcomments create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/xmlfilter create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/samples/xmlstats create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/astress.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/cdata.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/decl.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/defaulted.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/encoding.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/ext.ent create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/ext2.ent create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/external_ent.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/file.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/file_open_scalar.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/finish.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/foo.dtd create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/namespaces.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/parament.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/partial.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/skip.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/stream.t create mode 100644 fastSum/resources/ROUGE/XML-Parser-2.44/t/styles.t create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04.tar.gz create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/Changes create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/MANIFEST create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/META.yml create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/MYMETA.json create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/MYMETA.yml create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/Makefile create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/Makefile.PL create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/README create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/arch/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/arch/auto/XML/RegExp/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/bin/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/lib/XML/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/lib/XML/RegExp.pm create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/lib/auto/XML/RegExp/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/man1/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/man3/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/man3/XML__RegExp.3pm create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/blib/script/.exists create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/lib/XML/RegExp.pm create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/pm_to_blib create mode 100644 fastSum/resources/ROUGE/XML-RegExp-0.04/test.pl diff --git a/fastSum/PointerGen/data_util/config.py b/fastSum/PointerGen/data_util/config.py deleted file mode 100644 index 7d99474..0000000 --- a/fastSum/PointerGen/data_util/config.py +++ /dev/null @@ -1,46 +0,0 @@ -import os - - -class Config(): - def __init__(self): - super(Config, self).__init__() - self.root_dir = "/remote-home/yrchen" - #"tasks/fastnlp-relevant/summarization/cnn-dailymail/finished_files/chunked/train_*" - self.train_data_path = "/remote-home/yrchen/Datasets/CNNDM/finished_files_new/CNNDM.train.json" - #"tasks/fastnlp-relevant/summarization/cnn-dailymail/finished_files/val.bin" - self.eval_data_path = "/remote-home/yrchen/Datasets/CNNDM/finished_files_new/CNNDM.val.json" - #"tasks/fastnlp-relevant/summarization/cnn-dailymail/finished_files/test.bin" - self.decode_data_path ="/remote-home/yrchen/Datasets/CNNDM/finished_files_new/CNNDM.test.json" - self.vocab_path = os.path.join(self.root_dir, - "tasks/fastnlp-relevant/summarization/cnn-dailymail/finished_files/vocab") - self.log_root = os.path.join(self.root_dir, "tasks/fastnlp-relevant/summarization/my-pnt-sum/log/CNNDM") - self.train_path = None - self.model_path = None - - # Hyperparameters - self.hidden_dim = 256 - self.emb_dim = 128 - self.batch_size = 32 - self.max_enc_steps = 400 - self.max_dec_steps = 100 - self.beam_size = 4 - self.min_dec_steps = 35 - #这个要随着不同数据集的变化而变化 - self.vocab_size = 50000 - - self.lr = 0.15 - self.adagrad_init_acc = 0.1 - self.rand_unif_init_mag = 0.02 - self.trunc_norm_init_std = 1e-4 - self.max_grad_norm = 2.0 #2.0 - - self.pointer_gen = True - self.is_coverage = True - self.cov_loss_wt = 1.0 - - self.eps = 1e-12 - self.n_epochs = 100 - - self.use_gpu = True - - self.lr_coverage = 0.010#0.15 diff --git a/fastSum/PointerGen/data_util/utils.py b/fastSum/PointerGen/data_util/utils.py index 2aa61fa..885326d 100644 --- a/fastSum/PointerGen/data_util/utils.py +++ b/fastSum/PointerGen/data_util/utils.py @@ -70,7 +70,8 @@ def clean(x): def pyrouge_score_all(hyps_list, refer_list, config, remap=True): nowTime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') - PYROUGE_ROOT = os.path.join('/remote-home/yrchen/', nowTime) + PYROUGE_ROOT = os.path.join('~/tmp', nowTime) + SYSTEM_PATH = os.path.join(PYROUGE_ROOT, 'gold') MODEL_PATH = os.path.join(PYROUGE_ROOT, 'system') if os.path.exists(SYSTEM_PATH): @@ -103,8 +104,6 @@ def pyrouge_score_all(hyps_list, refer_list, config, remap=True): f.write(hyps.replace("\n", " ")) f.write("\n") - # r = Rouge155('/remote-home/dqwang/ROUGE/RELEASE-1.5.5') - # r = pyrouge.Rouge155() r = pyrouge.Rouge155('/remote-home/yrchen/ROUGE/ROUGE/RELEASE-1.5.5') r.system_dir = SYSTEM_PATH @@ -136,7 +135,7 @@ def pyrouge_score_all(hyps_list, refer_list, config, remap=True): def pyrouge_score_all_multi(hyps_list, refer_list, config, remap=True): nowTime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') - PYROUGE_ROOT = os.path.join('/remote-home/yrchen/', nowTime) + PYROUGE_ROOT = os.path.join('~/tmp', nowTime) SYSTEM_PATH = os.path.join(PYROUGE_ROOT, 'system') MODEL_PATH = os.path.join(PYROUGE_ROOT, 'gold') if os.path.exists(SYSTEM_PATH): @@ -176,7 +175,6 @@ def pyrouge_score_all_multi(hyps_list, refer_list, config, remap=True): f.write(hyps) f.write("\n") - # r = Rouge155('/remote-home/dqwang/ROUGE/RELEASE-1.5.5') r = pyrouge.Rouge155() r.system_dir = SYSTEM_PATH @@ -184,7 +182,6 @@ def pyrouge_score_all_multi(hyps_list, refer_list, config, remap=True): r.system_filename_pattern = 'Model.(\d+).txt' r.model_filename_pattern = 'Reference.[A-Z].#ID#.txt' - # output = r.convert_and_evaluate(rouge_args="-e /remote-home/dqwang/ROUGE/RELEASE-1.5.5/data -a -m -n 2 -d") output = r.convert_and_evaluate() output_dict = r.output_to_dict(output) diff --git a/fastSum/PointerGen/decode.py b/fastSum/PointerGen/decode.py index 2066064..5bc8866 100644 --- a/fastSum/PointerGen/decode.py +++ b/fastSum/PointerGen/decode.py @@ -51,10 +51,10 @@ def initial_dir(mode, config, model_file_path=None): if not os.path.exists(decode_path): os.mkdir(decode_path) else: - if os.path.exists(decode_path+"/"+"gold.txt"): - os.remove(decode_path+"/"+"gold.txt") - if os.path.exists(decode_path+"/"+"pred.txt"): - os.remove(decode_path+"/"+"pred.txt") + if os.path.exists(decode_path + "/" + "gold.txt"): + os.remove(decode_path + "/" + "gold.txt") + if os.path.exists(decode_path + "/" + "pred.txt"): + os.remove(decode_path + "/" + "pred.txt") return decode_path @@ -119,21 +119,14 @@ if __name__ == '__main__': help="Model file for retraining (default: None).") parser.add_argument('-visible_gpu', default=-1, type=int, required=True) - parser.add_argument('-dataset_path', default="/remote-home/yrchen/Datasets") parser.add_argument('-train_data_path', - default="CNNDM/finished_files_new1/CNNDM.train.json", required=True) - # parser.add_argument('-eval_data_path', - # default="CNNDM/finished_files_new1/CNNDM.val.json", required=True) + default="", required=True, help="path of train data") parser.add_argument('-decode_data_path', - default="CNNDM/finished_files_new1/CNNDM.test.json", required=True) - # parser.add_argument('-vocab_path', default='CNNDM/finished_files_new1/vocab.pkl') - parser.add_argument('-root', - default='/remote-home/yrchen/tasks/fastnlp-relevant/summarization/my-pnt-sum/log') - parser.add_argument('-log_root', default='CNNDM', required=True) + default="", required=True, help="path of test data") + parser.add_argument('-log_root', default='', required=True, help="root to save result") parser.add_argument('-hidden_dim', default=256, type=int) parser.add_argument('-emb_dim', default=128, type=int) - # parser.add_argument('-batch_size', default=8, type=int) parser.add_argument('-batch_size', default=32, type=int) parser.add_argument('-max_enc_steps', default=400, type=int) parser.add_argument('-max_dec_steps', default=100, type=int) @@ -161,13 +154,6 @@ if __name__ == '__main__': parser.add_argument('-test_model', default='', type=str) args = parser.parse_args() - args.train_data_path = os.path.join(args.dataset_path, args.train_data_path) - # args.eval_data_path = os.path.join(args.dataset_path, args.eval_data_path) - args.decode_data_path = os.path.join(args.dataset_path, args.decode_data_path) - # args.vocab_path = os.path.join(args.dataset_path, args.vocab_path) - - args.log_root = os.path.join(args.root, args.log_root) - if args.visible_gpu != -1: args.use_gpu = True torch.cuda.set_device(args.visible_gpu) diff --git a/fastSum/PointerGen/train.py b/fastSum/PointerGen/train.py index 1198aba..472fdeb 100644 --- a/fastSum/PointerGen/train.py +++ b/fastSum/PointerGen/train.py @@ -112,21 +112,14 @@ if __name__ == '__main__': parser.add_argument("-m", dest="model_file_path", required=False, default=None, help="Model file for retraining (default: None).") parser.add_argument('-visible_gpu', default=-1, type=int, required=True) - parser.add_argument('-dataset_path', default="/remote-home/yrchen/Datasets") parser.add_argument('-train_data_path', - default="CNNDM/finished_files_new1/CNNDM.train.json", required=True) + default="", required=True, help="the path of training data") parser.add_argument('-eval_data_path', - default="CNNDM/finished_files_new1/CNNDM.val.json", required=True) - # parser.add_argument('-decode_data_path', - # default="CNNDM/finished_files_new1/CNNDM.test.json", required=True) - # parser.add_argument('-vocab_path', default='CNNDM/finished_files_new1/vocab.pkl') - parser.add_argument('-root', - default='/remote-home/yrchen/tasks/fastnlp-relevant/summarization/my-pnt-sum/log') - parser.add_argument('-log_root', default='CNNDM', required=True) + default="", required=True, help="the path of development data") + parser.add_argument('-log_root', default='', required=True, help="root to save result") parser.add_argument('-hidden_dim', default=256, type=int) parser.add_argument('-emb_dim', default=128, type=int) - # parser.add_argument('-batch_size', default=8, type=int) parser.add_argument('-batch_size', default=16, type=int) parser.add_argument('-max_enc_steps', default=400, type=int) parser.add_argument('-max_dec_steps', default=100, type=int) @@ -146,19 +139,11 @@ if __name__ == '__main__': parser.add_argument('-cov_loss_wt', default=1.0, type=float) parser.add_argument('-eps', default=1e-12, type=float) - # parser.add_argument('-max_iterations', default=500000, required=True, type=int) parser.add_argument("-n_epochs", default=33, type=int, required=True) parser.add_argument('-lr_coverage', default=0.15, type=float) args = parser.parse_args() - args.train_data_path = os.path.join(args.dataset_path, args.train_data_path) - args.eval_data_path = os.path.join(args.dataset_path, args.eval_data_path) - # args.decode_data_path = os.path.join(args.dataset_path, args.decode_data_path) - # args.vocab_path = os.path.join(args.dataset_path, args.vocab_path) - - args.log_root = os.path.join(args.root, args.log_root) - if args.visible_gpu != -1: args.use_gpu = True torch.cuda.set_device(args.visible_gpu) diff --git a/fastSum/PointerGen/training_ptr_gen/main.py b/fastSum/PointerGen/training_ptr_gen/main.py deleted file mode 100644 index 9b35eca..0000000 --- a/fastSum/PointerGen/training_ptr_gen/main.py +++ /dev/null @@ -1,126 +0,0 @@ -from data_util.config import Config -from data_util.data import prepare_dataInfo, PAD_TOKEN -from data_util.logging import logger -from model.loss import MyLoss -from model.model import Model -from fastNLP import BucketSampler -from fastNLP import Trainer -from fastNLP import Tester -from torch.optim import Adagrad -from model.metric import PyRougeMetric, FastRougeMetric -import os -import time -from data_util.utils import print_config, write_eval_results -from training_ptr_gen.callback import TrainCallback -import torch -import sys -import tensorflow as tf - -config = Config() - - -def initial_dir(mode, model_file_path=None): - if mode == 'train': - train_dir = os.path.join(config.log_root, 'train_%d' % (int(time.time()))) - if not os.path.exists(train_dir): - os.mkdir(train_dir) - - model_dir = os.path.join(train_dir, 'model') - if not os.path.exists(model_dir): - os.mkdir(model_dir) - return train_dir, model_dir - - else: - if model_file_path is None: - logger.error("error!, no model to load") - raise Exception("empty model file path!", model_file_path) - parent_path = os.path.dirname(model_file_path) - train_path = os.path.dirname(parent_path) - model_name = os.path.basename(model_file_path) - decode_path = os.path.join(train_path, 'decode_%s' % (model_name)) - - if not os.path.exists(decode_path): - os.mkdir(decode_path) - - return decode_path - - -def set_up_data(mode): - datainfo = prepare_dataInfo(mode, config.train_data_path, config.eval_data_path, config.decode_data_path, - config.vocab_path, config.vocab_size, config) - logger.info('-' * 10 + "set up data done!" + '-' * 10) - return datainfo - - -def run_train(): - train_dir, model_dir = initial_dir('train') - config.train_path = train_dir - config.model_path = model_dir - print_config(config, train_dir) - datainfo = set_up_data('train') - train_sampler = BucketSampler(batch_size=config.batch_size, seq_len_field_name='enc_len') - criterion = MyLoss(config=config, padding_idx=datainfo.vocabs["train"].to_index(PAD_TOKEN)) - - model = Model(vocab=datainfo.vocabs["train"]) - params = list(model.encoder.parameters()) + list(model.decoder.parameters()) + \ - list(model.reduce_state.parameters()) - initial_lr = config.lr_coverage if config.is_coverage else config.lr - optimizer = Adagrad(params, lr=initial_lr, initial_accumulator_value=config.adagrad_init_acc) - - train_loader = datainfo.datasets["train"] - valid_loader = datainfo.datasets["dev"] - summary_writer = tf.compat.v1.summary.FileWriter(train_dir) - trainer = Trainer(model=model, train_data=train_loader, optimizer=optimizer, loss=criterion, - batch_size=config.batch_size, check_code_level=-1, - n_epochs=config.n_epochs, print_every=100, dev_data=valid_loader, - metrics=FastRougeMetric(pred='prediction', art_oovs='article_oovs', - abstract_sentences='abstract_sentences', config=config, - vocab=datainfo.vocabs["train"]), - metric_key="rouge-l-f", validate_every=-1, save_path=model_dir, - callbacks=[TrainCallback(config, summary_writer, patience=5)], use_tqdm=False) - - logger.info("-" * 5 + "start training" + "-" * 5) - - traininfo = trainer.train(load_best_model=True) - logger.info(' | end of Train | time: {:5.2f}s | '.format(traininfo["seconds"])) - logger.info('[INFO] best eval model in epoch %d and iter %d', traininfo["best_epoch"], traininfo["best_step"]) - logger.info(traininfo["best_eval"]) - - bestmodel_save_path = os.path.join(config.model_path, - 'bestmodel.pkl') # this is where checkpoints of best models are saved - state = { - 'encoder_state_dict': model.encoder.state_dict(), - 'decoder_state_dict': model.decoder.state_dict(), - 'reduce_state_dict': model.reduce_state.state_dict() - } - torch.save(state, bestmodel_save_path) - # 不是作为形参传入到Trainer里面的么,怎么里面的model变化会影响到外面的? - logger.info('[INFO] Saving eval best model to %s', bestmodel_save_path) - - -def run_test(model_file_path): - decode_path = initial_dir('test', model_file_path) - datainfo = set_up_data('test') - model = Model(vocab=datainfo.vocabs["train"]) - tester = Tester(datainfo.datasets['test'], model=model, metrics=PyRougeMetric(pred='prediction', - art_oovs='article_oovs', - abstract_sentences='abstract_sentences', - config=config, - vocab=datainfo.vocabs["train"]), batch_size=1) - eval_results = tester.test() - write_eval_results(decode_path, eval_results) - - -if __name__ == '__main__': - torch.cuda.set_device(4) - mode = sys.argv[1] - if mode == 'train': - logger.info("------start mode train------") - run_train() - elif mode == 'test': - logger.info("------start mode test-------") - model_filename = sys.argv[2] - run_test(model_filename) - else: - logger.error("error: none of the mode is in train or test!") - raise Exception("wrong mode! neither train nor test!", mode) diff --git a/fastSum/resources/ROUGE/DB_File-1.835.tar.gz b/fastSum/resources/ROUGE/DB_File-1.835.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..36177e3a15cfd1c17f01d3ec981cccd6521a2cd0 GIT binary patch literal 134874 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 H01ycPt*OtZ literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/Changes b/fastSum/resources/ROUGE/DB_File-1.835/Changes new file mode 100644 index 0000000..e653816 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/Changes @@ -0,0 +1,644 @@ + +1.835 23 Dec 2014 + + * Silence more compiler warnings + +1.834 11 Dec 2014 + + * Makefile.PL: version check is missing a zero + RT #100844 + +1.833 9 Dec 2014 + + * More Silence compiler warnings + + * 1.832 breaks bleadperl C89 build + RT #100812 + +1.832 8 Dec 2014 + + * Silence compiler warnings + + * C++ change from blead + +1.831 15 November 2013 + + * C99 comment is a nogo + RT #90383 + +1.830 2 November 2013 + + * Memory leaks when failed to open db + RT #89589 + + * DB_File uses AutoLoader for no reason + RT #88258 + +1.829 7 July 2013 + + * make realclean: removing all files + RT #68214 + + * Documented the issue where the error below + + BDB0588 At least one secondary cursor must be specified to DB->join + + * DB_File installs to wrong place for CPAN version + RT #70420 + Makefile.PL prevents INSTALLDIRS on command line. + RT #68287: Makefile.PL prevents INSTALLDIRS on command line. + + * typo fix + RT #85335 + +1.828 7 May 2013 + + * Minor change to build with Berkeley DB 6.x + +1.827 25 Jan 2012 + + * DB_File.pm - Don't use "@_" construct + [RT #79287] + +1.826 25 Jan 2012 + + * t/db-btree.t - fix use of "length @array" + [RT #74336] + +1.825 24 Jan 2012 + + * t/db-btree.t - fix use of "length @array" + [RT #74336] + +1.824 6 Aug 2011 + + * Amendments to tests to work in blead + [RT #70108] + +1.823 6 Aug 2011 + + * croak if attempt to freeze/thaw DB_File object + [RT #69985] + +1.822 12 March 2011 + + * Link rot + [rt.cpan.org #68739] + +1.822 12 March 2011 + + * Keep DB_File's warnings in sync with perl's + [rt.cpan.org #66339] + +1.821 10 January 2011 + + * Fixed typos & spelling errors. + [perl #81792] + +1.820 28 March 2009 + + * remove MAN3PODS from Makefile.PL to match core. + +1.819 18 February 2009 + + * t/db-recno.t fails if run in a path that contains spaces + [rt.cpan.org #43288] + +1.818 21 January 2009 + + * Updated Makefile.PL for Strawberry Perl. + Patch suggested by David Golden. + + * Remove IRIX notes from README. The page referenced doesn't exist + anymore. + +1.817 27 March 2008 + + * Updated dbinfo + + * Applied core patch 32299 - Re-apply change #30562 + + * Applied core patch 32208 + + * Applied core patch 32884 - use MM->parse_version() in Makefile.PL + + * Applied core patch 32883 - Silence new warning grep in void context warning + + * Applied core patch 32704 to remove use of PL_na in typemap + + * Applied core patch 30562 to fix a build issue on OSF + +1.816 28 October 2007 + + * Clarified the warning about building with a different version of + Berkeley DB that is used at runtime. + + * Also made the boot version check less strict. + [rt.cpan.org #30013] + +1.815 4 February 2007 + + * A few casting cleanups for building with C++ from Steve Peters. + + * Fixed problem with recno which happened if you changed directory after + opening the database. Problem reported by Andrew Pam. + + +1.814 11 November 2005 + + * Fix from Dominic Dunlop to tidy up an OS-X specific warning in + db-btree.t. + + * Silenced a warning about $DB_File::Error only being used once. + Issue spotted by Dominic Dunlop. + +1.813 31st October 2005 + + * Updates for Berkeley DB 4.4 + +1.812 9th October 2005 + + * Added libscan to Makefile.PL + + * Fixed test failing under windows + +1.811 12th March 2005 + + * Fixed DBM filter bug in seq + +1.810 7th August 2004 + + * Fixed db-hash.t for Cygwin + + * Added substr tests to db-hast.t + + * Documented AIX build problem in README. + +1.809 20th June 2004 + + * Merged core patch 22258 + + * Merged core patch 22741 + + * Fixed core bug 30237. + Using substr to pass parameters to the low-level Berkeley DB interface + causes problems with Perl 5.8.1 or better. + typemap fix supplied by Marcus Holland-Moritz. + +1.808 22nd December 2003 + + * Added extra DBM Filter tests. + + * Fixed a memory leak in ParseOpenInfo, which whould occur if the + opening of the database failed. Leak spotted by Adrian Enache. + +1.807 1st November 2003 + + * Fixed minor typos on pod documentation - reported by Jeremy Mates & + Mark Jason Dominus. + + * dbinfo updated to report when a database is encrypted. + +1.806 22nd October 2002 + + * Fixed problem when trying to build with a multi-threaded perl. + + * Tidied up the recursion detection code. + + * merged core patch 17844 - missing dTHX declarations. + + * merged core patch 17838 + +1.805 1st September 2002 + + * Added support to allow DB_File to build with Berkeley DB 4.1.X + + * Tightened up the test harness to test that calls to untie don't generate + the "untie attempted while %d inner references still exist" warning. + + * added code to guard against calling the callbacks (compare,hash & prefix) + recursively. + + * passing undef for the flags and/or mode when opening a database could cause + a "Use of uninitialized value in subroutine entry" warning. Now silenced. + + * DBM filter code beefed up to cope with read-only $_. + +1.804 2nd June 2002 + + * Perl core patch 14939 added a new warning to "splice". This broke the + db-recno test harness. Fixed. + + * merged core patches 16502 & 16540. + +1.803 1st March 2002 + + * Fixed a problem with db-btree.t where it complained about an "our" + variable redeclaration. + + * FETCH, STORE & DELETE don't map the flags parameter into the + equivalent Berkeley DB function anymore. + +1.802 6th January 2002 + + * The message about some test failing in db-recno.t had the wrong test + numbers. Fixed. + + * merged core patch 13942. + +1.801 26th November 2001 + + * Fixed typo in Makefile.PL + + * Added "clean" attribute to Makefile.PL + +1.800 23rd November 2001 + + * use pport.h for perl backward compatibility code. + + * use new ExtUtils::Constant module to generate XS constants. + + * upgrade Makefile.PL upgrade/downgrade code to toggle "our" with + "use vars" + +1.79 22nd October 2001 + + * Added a "local $SIG{__DIE__}" inside the eval that checks for + the presence of XSLoader s suggested by Andrew Hryckowin. + + * merged core patch 12277. + + * Changed NEXTKEY to not initialise the input key. It isn't used anyway. + +1.79 22nd October 2001 + + * Fixed test harness for cygwin + +1.78 30th July 2001 + + * the test in Makefile.PL for AIX used -plthreads. Should have been + -lpthreads + + * merged Core patches + 10372, 10335, 10372, 10534, 10549, 10643, 11051, 11194, 11432 + + * added documentation patch regarding duplicate keys from Andrew Johnson + + +1.77 26th April 2001 + + * AIX is reported to need -lpthreads, so Makefile.PL now checks for + AIX and adds it to the link options. + + * Minor documentation updates. + + * Merged Core patch 9176 + + * Added a patch from Edward Avis that adds support for splice with + recno databases. + + * Modified Makefile.PL to only enable the warnings pragma if using perl + 5.6.1 or better. + +1.76 15th January 2001 + + * Added instructions for using LD_PRELOAD to get Berkeley DB 2.x to work + with DB_File on Linux. Thanks to Norbert Bollow for sending details of + this approach. + + +1.75 17th December 2000 + + * Fixed perl core patch 7703 + + * Added support to allow DB_File to be built with Berkeley DB 3.2 -- + btree_compare, btree_prefix and hash_cb needed to be changed. + + * Updated dbinfo to support Berkeley DB 3.2 file format changes. + + +1.74 10th December 2000 + + * A "close" call in DB_File.xs needed parenthesised to stop win32 from + thinking it was one of its macros. + + * Updated dbinfo to support Berkeley DB 3.1 file format changes. + + * DB_File.pm & the test hasness now use the warnings pragma (when + available). + + * Included Perl core patch 7703 -- size argument for hash_cb is different + for Berkeley DB 3.x + + * Included Perl core patch 7801 -- Give __getBerkeleyDBInfo the ANSI C + treatment. + + * @a = () produced the warning 'Argument "" isn't numeric in entersub' + This has been fixed. Thanks to Edward Avis for spotting this bug. + + * Added note about building under Linux. Included patches. + + * Included Perl core patch 8068 -- fix for bug 20001013.009 + When run with warnings enabled "$hash{XX} = undef " produced an + "Uninitialized value" warning. This has been fixed. + +1.73 31st May 2000 + + * Added support in version.c for building with threaded Perl. + + * Berkeley DB 3.1 has reenabled support for null keys. The test + harness has been updated to reflect this. + +1.72 16th January 2000 + + * Added hints/sco.pl + + * The module will now use XSLoader when it is available. When it + isn't it will use DynaLoader. + + * The locking section in DB_File.pm has been discredited. Many thanks + to David Harris for spotting the underlying problem, contributing + the updates to the documentation and writing DB_File::Lock (available + on CPAN). + +1.71 7th September 1999 + + * Fixed a bug that prevented 1.70 from compiling under win32 + + * Updated to support Berkeley DB 3.x + + * Updated dbinfo for Berkeley DB 3.x file formats. + +1.70 4th August 1999 + + * Initialise $DB_File::db_ver and $DB_File::db_version with + GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons. + + * Added a BOOT check to test for equivalent versions of db.h & + libdb.a/so. + +1.69 3rd August 1999 + + * fixed a bug in push -- DB_APPEND wasn't working properly. + + * Fixed the R_SETCURSOR bug introduced in 1.68 + + * Added a new Perl variable $DB_File::db_ver + +1.68 22nd July 1999 + + * Merged changes from 5.005_58 + + * Fixed a bug in R_IBEFORE & R_IAFTER processing in Berkeley DB + 2 databases. + + * Added some of the examples in the POD into the test harness. + +1.67 6th June 1999 + + * Added DBM Filter documentation to DB_File.pm + + * Fixed DBM Filter code to work with 5.004 + + * A few instances of newSVpvn were used in 1.66. This isn't available in + Perl 5.004_04 or earlier. Replaced with newSVpv. + +1.66 15th March 1999 + + * Added DBM Filter code + +1.65 6th March 1999 + + * Fixed a bug in the recno PUSH logic. + * The BOOT version check now needs 2.3.4 when using Berkeley DB version 2 + +1.64 21st February 1999 + + * Tidied the 1.x to 2.x flag mapping code. + * Added a patch from Mark Kettenis to fix a flag + mapping problem with O_RDONLY on the Hurd + * Updated the message that db-recno.t prints when tests 51, 53 or 55 fail. + +1.63 19th December 1998 + + * Fix to allow DB 2.6.x to build with DB_File + * Documentation updated to use push,pop etc in the RECNO example & + to include the find_dup & del_dup methods. + +1.62 30th November 1998 + + Added hints/dynixptx.pl. + Fixed typemap -- 1.61 used PL_na instead of na + +1.61 19th November 1998 + + Added a note to README about how to build Berkeley DB 2.x when + using HP-UX. + Minor modifications to get the module to build with DB 2.5.x + Fixed a typo in the definition of O_RDONLY, courtesy of Mark Kettenis. + +1.60 + Changed the test to check for full tied array support + +1.59 + Updated the license section. + + Berkeley DB 2.4.10 disallows zero length keys. Tests 32 & 42 in + db-btree.t and test 27 in db-hash.t failed because of this change. + Those tests have been zapped. + + Added dbinfo to the distribution. + +1.58 + Tied Array support was enhanced in Perl 5.004_57. DB_File now + supports PUSH,POP,SHIFT,UNSHIFT & STORESIZE. + + Fixed a problem with the use of sv_setpvn. When the size is + specified as 0, it does a strlen on the data. This was ok for DB + 1.x, but isn't for DB 2.x. + +1.57 + If Perl has been compiled with Threads support,the symbol op will be + defined. This clashes with a field name in db.h, so it needs to be + #undef'ed before db.h is included. + +1.56 + Documented the Solaris 2.5 mutex bug + +1.55 + Merged 1.16 changes. + +1.54 + + Fixed a small bug in the test harness when run under win32 + The emulation of fd when useing DB 2.x was busted. + +1.53 + + Added DB_RENUMBER to flags for recno. + +1.52 + + Patch from Nick Ing-Simmons now allows DB_File to build on NT. + Merged 1.15 patch. + +1.51 + + Fixed the test harness so that it doesn't expect DB_File to have + been installed by the main Perl build. + + + Fixed a bug in mapping 1.x O_RDONLY flag to 2.x DB_RDONLY equivalent + +1.50 + + DB_File can now build with either DB 1.x or 2.x, but not both at + the same time. + +1.16 + + A harmless looking tab was causing Makefile.PL to fail on AIX 3.2.5 + + Small fix for the AIX strict C compiler XLC which doesn't like + __attribute__ being defined via proto.h and redefined via db.h. Fix + courtesy of Jarkko Hietaniemi. + +1.15 + + Patch from Gisle Aas to suppress "use of undefined + value" warning with db_get and db_seq. + + Patch from Gisle Aas to make DB_File export only the + O_* constants from Fcntl. + + Removed the DESTROY method from the DB_File::HASHINFO module. + + Previously DB_File hard-wired the class name of any object that it + created to "DB_File". This makes sub-classing difficult. Now + DB_File creats objects in the namespace of the package it has been + inherited into. + + +1.14 + + Made it illegal to tie an associative array to a RECNO database and + an ordinary array to a HASH or BTREE database. + +1.13 + + Minor changes to DB_FIle.xs and DB_File.pm + +1.12 + + Documented the incompatibility with version 2 of Berkeley DB. + +1.11 + + Documented the untie gotcha. + +1.10 + + Fixed fd method so that it still returns -1 for in-memory files + when db 1.86 is used. + +1.09 + + Minor bug fix in DB_File::HASHINFO, DB_File::RECNOINFO and + DB_File::BTREEINFO. + + Changed default mode to 0666. + +1.08 + + Documented operation of bval. + +1.07 + + Fixed bug with RECNO, where bval wasn't defaulting to "\n". + +1.06 + + Minor namespace cleanup: Localized PrintBtree. + +1.05 + + Made all scripts in the documentation strict and -w clean. + + Added logic to DB_File.xs to allow the module to be built after + Perl is installed. + +1.04 + + Minor documentation changes. + + Fixed a bug in hash_cb. Patches supplied by Dave Hammen, + . + + Fixed a bug with the constructors for DB_File::HASHINFO, + DB_File::BTREEINFO and DB_File::RECNOINFO. Also tidied up the + constructors to make them -w clean. + + Reworked part of the test harness to be more locale friendly. + +1.03 + + Documentation update. + + DB_File now imports the constants (O_RDWR, O_CREAT etc.) from Fcntl + automatically. + + The standard hash function exists is now supported. + + Modified the behavior of get_dup. When it returns an associative + array, the value is the count of the number of matching BTREE + values. + +1.02 + + Merged OS/2 specific code into DB_File.xs + + Removed some redundant code in DB_File.xs. + + Documentation update. + + Allow negative subscripts with RECNO interface. + + Changed the default flags from O_RDWR to O_CREAT|O_RDWR. + + The example code which showed how to lock a database needed a call + to sync added. Without it the resultant database file was empty. + + Added get_dup method. + +1.01 + + Fixed a core dump problem with SunOS. + + The return value from TIEHASH wasn't set to NULL when dbopen + returned an error. + +1.0 + + DB_File has been in use for over a year. To reflect that, the + version number has been incremented to 1.0. + + Added complete support for multiple concurrent callbacks. + + Using the push method on an empty list didn't work properly. This + has been fixed. + +0.3 + + Added prototype support for multiple btree compare callbacks. + +0.2 + + When DB_File is opening a database file it no longer terminates the + process if dbopen returned an error. This allows file protection + errors to be caught at run time. Thanks to Judith Grass + for spotting the bug. + +0.1 + + First Release. + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File.bs b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.bs new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File.c b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.c new file mode 100644 index 0000000..45cec90 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.c @@ -0,0 +1,3152 @@ +/* + * This file was generated automatically by ExtUtils::ParseXS version 3.28 from the + * contents of DB_File.xs. Do not edit this file, edit DB_File.xs instead. + * + * ANY CHANGES MADE HERE WILL BE LOST! + * + */ + +#line 1 "DB_File.xs" +/* + + DB_File.xs -- Perl 5 interface to Berkeley DB + + Written by Paul Marquess + + All comments/suggestions/problems are welcome + + Copyright (c) 1995-2014 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. + + Changes: + 0.1 - Initial Release + 0.2 - No longer bombs out if dbopen returns an error. + 0.3 - Added some support for multiple btree compares + 1.0 - Complete support for multiple callbacks added. + Fixed a problem with pushing a value onto an empty list. + 1.01 - Fixed a SunOS core dump problem. + The return value from TIEHASH wasn't set to NULL when + dbopen returned an error. + 1.02 - Use ALIAS to define TIEARRAY. + Removed some redundant commented code. + Merged OS2 code into the main distribution. + Allow negative subscripts with RECNO interface. + Changed the default flags to O_CREAT|O_RDWR + 1.03 - Added EXISTS + 1.04 - fixed a couple of bugs in hash_cb. Patches supplied by + Dave Hammen, hammen@gothamcity.jsc.nasa.gov + 1.05 - Added logic to allow prefix & hash types to be specified via + Makefile.PL + 1.06 - Minor namespace cleanup: Localized PrintBtree. + 1.07 - Fixed bug with RECNO, where bval wasn't defaulting to "\n". + 1.08 - No change to DB_File.xs + 1.09 - Default mode for dbopen changed to 0666 + 1.10 - Fixed fd method so that it still returns -1 for + in-memory files when db 1.86 is used. + 1.11 - No change to DB_File.xs + 1.12 - No change to DB_File.xs + 1.13 - Tidied up a few casts. + 1.14 - Made it illegal to tie an associative array to a RECNO + database and an ordinary array to a HASH or BTREE database. + 1.50 - Make work with both DB 1.x or DB 2.x + 1.51 - Fixed a bug in mapping 1.x O_RDONLY flag to 2.x DB_RDONLY equivalent + 1.52 - Patch from Gisle Aas to suppress "use of + undefined value" warning with db_get and db_seq. + 1.53 - Added DB_RENUMBER to flags for recno. + 1.54 - Fixed bug in the fd method + 1.55 - Fix for AIX from Jarkko Hietaniemi + 1.56 - No change to DB_File.xs + 1.57 - added the #undef op to allow building with Threads support. + 1.58 - Fixed a problem with the use of sv_setpvn. When the + size is specified as 0, it does a strlen on the data. + This was ok for DB 1.x, but isn't for DB 2.x. + 1.59 - No change to DB_File.xs + 1.60 - Some code tidy up + 1.61 - added flagSet macro for DB 2.5.x + fixed typo in O_RDONLY test. + 1.62 - No change to DB_File.xs + 1.63 - Fix to alllow DB 2.6.x to build. + 1.64 - Tidied up the 1.x to 2.x flags mapping code. + Added a patch from Mark Kettenis + to fix a flag mapping problem with O_RDONLY on the Hurd + 1.65 - Fixed a bug in the PUSH logic. + Added BOOT check that using 2.3.4 or greater + 1.66 - Added DBM filter code + 1.67 - Backed off the use of newSVpvn. + Fixed DBM Filter code for Perl 5.004. + Fixed a small memory leak in the filter code. + 1.68 - fixed backward compatibility bug with R_IAFTER & R_IBEFORE + merged in the 5.005_58 changes + 1.69 - fixed a bug in push -- DB_APPEND wasn't working properly. + Fixed the R_SETCURSOR bug introduced in 1.68 + Added a new Perl variable $DB_File::db_ver + 1.70 - Initialise $DB_File::db_ver and $DB_File::db_version with + GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons. + Added a BOOT check to test for equivalent versions of db.h & + libdb.a/so. + 1.71 - Support for Berkeley DB version 3. + Support for Berkeley DB 2/3's backward compatibility mode. + Rewrote push + 1.72 - No change to DB_File.xs + 1.73 - No change to DB_File.xs + 1.74 - A call to open needed parenthesised to stop it clashing + with a win32 macro. + Added Perl core patches 7703 & 7801. + 1.75 - Fixed Perl core patch 7703. + Added support to allow DB_File to be built with + Berkeley DB 3.2 -- btree_compare, btree_prefix and hash_cb + needed to be changed. + 1.76 - No change to DB_File.xs + 1.77 - Tidied up a few types used in calling newSVpvn. + 1.78 - Core patch 10335, 10372, 10534, 10549, 11051 included. + 1.79 - NEXTKEY ignores the input key. + Added lots of casts + 1.800 - Moved backward compatibility code into ppport.h. + Use the new constants code. + 1.801 - No change to DB_File.xs + 1.802 - No change to DB_File.xs + 1.803 - FETCH, STORE & DELETE don't map the flags parameter + into the equivalent Berkeley DB function anymore. + 1.804 - no change. + 1.805 - recursion detection added to the callbacks + Support for 4.1.X added. + Filter code can now cope with read-only $_ + 1.806 - recursion detection beefed up. + 1.807 - no change + 1.808 - leak fixed in ParseOpenInfo + 1.809 - no change + 1.810 - no change + 1.811 - no change + 1.812 - no change + 1.813 - no change + 1.814 - no change + 1.814 - C++ casting fixes + +*/ + +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#ifdef _NOT_CORE +# include "ppport.h" +#endif + +int DB_File___unused() { return 0; } + +/* Mention DB_VERSION_MAJOR_CFG, DB_VERSION_MINOR_CFG, and + DB_VERSION_PATCH_CFG here so that Configure pulls them all in. */ + +/* Being the Berkeley DB we prefer the (which will be + * shortly #included by the ) __attribute__ to the possibly + * already defined __attribute__, for example by GNUC or by Perl. */ + +/* #if DB_VERSION_MAJOR_CFG < 2 */ +#ifndef DB_VERSION_MAJOR +# undef __attribute__ +#endif + +#ifdef COMPAT185 +# include +#else + +/* Uncomment one of the lines below */ +/* See the section "At least one secondary cursor must be specified to DB->join" + in the README file for the circumstances where you need to uncomment one + of the two lines below. +*/ + +/* #define time_t __time64_t */ +/* #define time_t __time32_t */ + +# include +#endif + +#ifndef PERL_UNUSED_ARG +# define PERL_UNUSED_ARG(x) ((void)x) +#endif + +/* Wall starts with 5.7.x */ + +#if PERL_REVISION > 5 || (PERL_REVISION == 5 && PERL_VERSION >= 7) + +/* Since we dropped the gccish definition of __attribute__ we will want + * to redefine dNOOP, however (so that dTHX continues to work). Yes, + * all this means that we can't do attribute checking on the DB_File, + * boo, hiss. */ +# ifndef DB_VERSION_MAJOR + +# undef dNOOP +# ifdef __cplusplus +# define dNOOP (void)0 +# else +# define dNOOP extern int DB_File___notused() +# endif + + /* Ditto for dXSARGS. */ +# undef dXSARGS +# define dXSARGS \ + dSP; dMARK; \ + I32 ax = mark - PL_stack_base + 1; \ + I32 items = sp - mark + +# endif + +/* avoid -Wall; DB_File xsubs never make use of `ix' setup for ALIASes */ +# undef dXSI32 +# define dXSI32 dNOOP + +#endif /* Perl >= 5.7 */ + +#include + +/* #define TRACE */ + +#ifdef TRACE +# define Trace(x) printf x +#else +# define Trace(x) +#endif + + +#define DBT_clear(x) Zero(&x, 1, DBT) ; + +#ifdef DB_VERSION_MAJOR + +#if DB_VERSION_MAJOR == 2 +# define BERKELEY_DB_1_OR_2 +#endif + +#if DB_VERSION_MAJOR > 3 || (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR >= 2) +# define AT_LEAST_DB_3_2 +#endif + +#if DB_VERSION_MAJOR > 3 || (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR >= 3) +# define AT_LEAST_DB_3_3 +#endif + +#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1) +# define AT_LEAST_DB_4_1 +#endif + +#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 3) +# define AT_LEAST_DB_4_3 +#endif + +#if DB_VERSION_MAJOR >= 6 +# define AT_LEAST_DB_6_0 +#endif + +#ifdef AT_LEAST_DB_3_3 +# define WANT_ERROR +#endif + +/* map version 2 features & constants onto their version 1 equivalent */ + +#ifdef DB_Prefix_t +# undef DB_Prefix_t +#endif +#define DB_Prefix_t size_t + +#ifdef DB_Hash_t +# undef DB_Hash_t +#endif +#define DB_Hash_t u_int32_t + +/* DBTYPE stays the same */ +/* HASHINFO, RECNOINFO and BTREEINFO map to DB_INFO */ +#if DB_VERSION_MAJOR == 2 + typedef DB_INFO INFO ; +#else /* DB_VERSION_MAJOR > 2 */ +# define DB_FIXEDLEN (0x8000) +#endif /* DB_VERSION_MAJOR == 2 */ + +/* version 2 has db_recno_t in place of recno_t */ +typedef db_recno_t recno_t; + + +#define R_CURSOR DB_SET_RANGE +#define R_FIRST DB_FIRST +#define R_IAFTER DB_AFTER +#define R_IBEFORE DB_BEFORE +#define R_LAST DB_LAST +#define R_NEXT DB_NEXT +#define R_NOOVERWRITE DB_NOOVERWRITE +#define R_PREV DB_PREV + +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5 +# define R_SETCURSOR 0x800000 +#else +# define R_SETCURSOR (-100) +#endif + +#define R_RECNOSYNC 0 +#define R_FIXEDLEN DB_FIXEDLEN +#define R_DUP DB_DUP + + +#define db_HA_hash h_hash +#define db_HA_ffactor h_ffactor +#define db_HA_nelem h_nelem +#define db_HA_bsize db_pagesize +#define db_HA_cachesize db_cachesize +#define db_HA_lorder db_lorder + +#define db_BT_compare bt_compare +#define db_BT_prefix bt_prefix +#define db_BT_flags flags +#define db_BT_psize db_pagesize +#define db_BT_cachesize db_cachesize +#define db_BT_lorder db_lorder +#define db_BT_maxkeypage +#define db_BT_minkeypage + + +#define db_RE_reclen re_len +#define db_RE_flags flags +#define db_RE_bval re_pad +#define db_RE_bfname re_source +#define db_RE_psize db_pagesize +#define db_RE_cachesize db_cachesize +#define db_RE_lorder db_lorder + +#define TXN NULL, + +#define do_SEQ(db, key, value, flag) (db->cursor->c_get)(db->cursor, &key, &value, flag) + + +#define DBT_flags(x) x.flags = 0 +#define DB_flags(x, v) x |= v + +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5 +# define flagSet(flags, bitmask) ((flags) & (bitmask)) +#else +# define flagSet(flags, bitmask) (((flags) & DB_OPFLAGS_MASK) == (u_int)(bitmask)) +#endif + +#else /* db version 1.x */ + +#define BERKELEY_DB_1 +#define BERKELEY_DB_1_OR_2 + +typedef union INFO { + HASHINFO hash ; + RECNOINFO recno ; + BTREEINFO btree ; + } INFO ; + + +#ifdef mDB_Prefix_t +# ifdef DB_Prefix_t +# undef DB_Prefix_t +# endif +# define DB_Prefix_t mDB_Prefix_t +#endif + +#ifdef mDB_Hash_t +# ifdef DB_Hash_t +# undef DB_Hash_t +# endif +# define DB_Hash_t mDB_Hash_t +#endif + +#define db_HA_hash hash.hash +#define db_HA_ffactor hash.ffactor +#define db_HA_nelem hash.nelem +#define db_HA_bsize hash.bsize +#define db_HA_cachesize hash.cachesize +#define db_HA_lorder hash.lorder + +#define db_BT_compare btree.compare +#define db_BT_prefix btree.prefix +#define db_BT_flags btree.flags +#define db_BT_psize btree.psize +#define db_BT_cachesize btree.cachesize +#define db_BT_lorder btree.lorder +#define db_BT_maxkeypage btree.maxkeypage +#define db_BT_minkeypage btree.minkeypage + +#define db_RE_reclen recno.reclen +#define db_RE_flags recno.flags +#define db_RE_bval recno.bval +#define db_RE_bfname recno.bfname +#define db_RE_psize recno.psize +#define db_RE_cachesize recno.cachesize +#define db_RE_lorder recno.lorder + +#define TXN + +#define do_SEQ(db, key, value, flag) (db->dbp->seq)(db->dbp, &key, &value, flag) +#define DBT_flags(x) +#define DB_flags(x, v) +#define flagSet(flags, bitmask) ((flags) & (bitmask)) + +#endif /* db version 1 */ + + + +#define db_DELETE(db, key, flags) ((db->dbp)->del)(db->dbp, TXN &key, 0) +#define db_STORE(db, key, value, flags) ((db->dbp)->put)(db->dbp, TXN &key, &value, 0) +#define db_FETCH(db, key, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, 0) + +#define db_sync(db, flags) ((db->dbp)->sync)(db->dbp, flags) +#define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) + +#ifdef DB_VERSION_MAJOR +#define db_DESTROY(db) (!db->aborted && ( db->cursor->c_close(db->cursor),\ + (db->dbp->close)(db->dbp, 0) )) +#define db_close(db) ((db->dbp)->close)(db->dbp, 0) +#define db_del(db, key, flags) (flagSet(flags, R_CURSOR) \ + ? ((db->cursor)->c_del)(db->cursor, 0) \ + : ((db->dbp)->del)(db->dbp, NULL, &key, flags) ) + +#else /* ! DB_VERSION_MAJOR */ + +#define db_DESTROY(db) (!db->aborted && ((db->dbp)->close)(db->dbp)) +#define db_close(db) ((db->dbp)->close)(db->dbp) +#define db_del(db, key, flags) ((db->dbp)->del)(db->dbp, &key, flags) +#define db_put(db, key, value, flags) ((db->dbp)->put)(db->dbp, &key, &value, flags) + +#endif /* ! DB_VERSION_MAJOR */ + + +#define db_seq(db, key, value, flags) do_SEQ(db, key, value, flags) + +typedef struct { + DBTYPE type ; + DB * dbp ; + SV * compare ; + bool in_compare ; + SV * prefix ; + bool in_prefix ; + SV * hash ; + bool in_hash ; + bool aborted ; + int in_memory ; +#ifdef BERKELEY_DB_1_OR_2 + INFO info ; +#endif +#ifdef DB_VERSION_MAJOR + DBC * cursor ; +#endif + SV * filter_fetch_key ; + SV * filter_store_key ; + SV * filter_fetch_value ; + SV * filter_store_value ; + int filtering ; + + } DB_File_type; + +typedef DB_File_type * DB_File ; +typedef DBT DBTKEY ; + +#define my_sv_setpvn(sv, d, s) sv_setpvn(sv, (s ? d : (const char *)""), s) + +#define OutputValue(arg, name) \ + { if (RETVAL == 0) { \ + SvGETMAGIC(arg) ; \ + my_sv_setpvn(arg, (const char *)name.data, name.size) ; \ + TAINT; \ + SvTAINTED_on(arg); \ + SvUTF8_off(arg); \ + DBM_ckFilter(arg, filter_fetch_value,"filter_fetch_value") ; \ + } \ + } + +#define OutputKey(arg, name) \ + { if (RETVAL == 0) \ + { \ + SvGETMAGIC(arg) ; \ + if (db->type != DB_RECNO) { \ + my_sv_setpvn(arg, (const char *)name.data, name.size); \ + } \ + else \ + sv_setiv(arg, (I32)*(I32*)name.data - 1); \ + TAINT; \ + SvTAINTED_on(arg); \ + SvUTF8_off(arg); \ + DBM_ckFilter(arg, filter_fetch_key,"filter_fetch_key") ; \ + } \ + } + +#define my_SvUV32(sv) ((u_int32_t)SvUV(sv)) + +#ifdef CAN_PROTOTYPE +extern void __getBerkeleyDBInfo(void); +#endif + +/* Internal Global Data */ + +#define MY_CXT_KEY "DB_File::_guts" XS_VERSION + +typedef struct { + recno_t x_Value; + recno_t x_zero; + DB_File x_CurrentDB; + DBTKEY x_empty; +} my_cxt_t; + +START_MY_CXT + +#define Value (MY_CXT.x_Value) +#define zero (MY_CXT.x_zero) +#define CurrentDB (MY_CXT.x_CurrentDB) +#define empty (MY_CXT.x_empty) + +#define ERR_BUFF "DB_File::Error" + +#ifdef DB_VERSION_MAJOR + +static int +#ifdef CAN_PROTOTYPE +db_put(DB_File db, DBTKEY key, DBT value, u_int flags) +#else +db_put(db, key, value, flags) +DB_File db ; +DBTKEY key ; +DBT value ; +u_int flags ; +#endif +{ + int status ; + + if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) { + DBC * temp_cursor ; + DBT l_key, l_value; + +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 + if (((db->dbp)->cursor)(db->dbp, NULL, &temp_cursor) != 0) +#else + if (((db->dbp)->cursor)(db->dbp, NULL, &temp_cursor, 0) != 0) +#endif + return (-1) ; + + memset(&l_key, 0, sizeof(l_key)); + l_key.data = key.data; + l_key.size = key.size; + memset(&l_value, 0, sizeof(l_value)); + l_value.data = value.data; + l_value.size = value.size; + + if ( temp_cursor->c_get(temp_cursor, &l_key, &l_value, DB_SET) != 0) { + (void)temp_cursor->c_close(temp_cursor); + return (-1); + } + + status = temp_cursor->c_put(temp_cursor, &key, &value, flags); + (void)temp_cursor->c_close(temp_cursor); + + return (status) ; + } + + + if (flagSet(flags, R_CURSOR)) { + return ((db->cursor)->c_put)(db->cursor, &key, &value, DB_CURRENT); + } + + if (flagSet(flags, R_SETCURSOR)) { + if ((db->dbp)->put(db->dbp, NULL, &key, &value, 0) != 0) + return -1 ; + return ((db->cursor)->c_get)(db->cursor, &key, &value, DB_SET_RANGE); + + } + + return ((db->dbp)->put)(db->dbp, NULL, &key, &value, flags) ; + +} + +#endif /* DB_VERSION_MAJOR */ + +static void +tidyUp(DB_File db) +{ + db->aborted = TRUE ; +} + + +static int + +#ifdef AT_LEAST_DB_6_0 +#ifdef CAN_PROTOTYPE +btree_compare(DB * db, const DBT *key1, const DBT *key2, size_t* locp) +#else +btree_compare(db, key1, key2, locp) +DB * db ; +const DBT * key1 ; +const DBT * key2 ; +size_t* locp; +#endif /* CAN_PROTOTYPE */ + +#else /* Berkeley DB < 6.0 */ +#ifdef AT_LEAST_DB_3_2 + +#ifdef CAN_PROTOTYPE +btree_compare(DB * db, const DBT *key1, const DBT *key2) +#else +btree_compare(db, key1, key2) +DB * db ; +const DBT * key1 ; +const DBT * key2 ; +#endif /* CAN_PROTOTYPE */ + +#else /* Berkeley DB < 3.2 */ + +#ifdef CAN_PROTOTYPE +btree_compare(const DBT *key1, const DBT *key2) +#else +btree_compare(key1, key2) +const DBT * key1 ; +const DBT * key2 ; +#endif + +#endif +#endif + +{ +#ifdef dTHX + dTHX; +#endif + dSP ; + dMY_CXT ; + void * data1, * data2 ; + int retval ; + int count ; + +#ifdef AT_LEAST_DB_3_2 + PERL_UNUSED_ARG(db); +#endif + + if (CurrentDB->in_compare) { + tidyUp(CurrentDB); + croak ("DB_File btree_compare: recursion detected\n") ; + } + + data1 = (char *) key1->data ; + data2 = (char *) key2->data ; + +#ifndef newSVpvn + /* As newSVpv will assume that the data pointer is a null terminated C + string if the size parameter is 0, make sure that data points to an + empty string if the length is 0 + */ + if (key1->size == 0) + data1 = "" ; + if (key2->size == 0) + data2 = "" ; +#endif + + ENTER ; + SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_compare = FALSE; + SAVEINT(CurrentDB->in_compare); + CurrentDB->in_compare = TRUE; + + PUSHMARK(SP) ; + EXTEND(SP,2) ; + PUSHs(sv_2mortal(newSVpvn((const char*)data1,key1->size))); + PUSHs(sv_2mortal(newSVpvn((const char*)data2,key2->size))); + PUTBACK ; + + count = perl_call_sv(CurrentDB->compare, G_SCALAR); + + SPAGAIN ; + + if (count != 1){ + tidyUp(CurrentDB); + croak ("DB_File btree_compare: expected 1 return value from compare sub, got %d\n", count) ; + } + + retval = POPi ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + + return (retval) ; + +} + +static DB_Prefix_t +#ifdef AT_LEAST_DB_3_2 + +#ifdef CAN_PROTOTYPE +btree_prefix(DB * db, const DBT *key1, const DBT *key2) +#else +btree_prefix(db, key1, key2) +Db * db ; +const DBT * key1 ; +const DBT * key2 ; +#endif + +#else /* Berkeley DB < 3.2 */ + +#ifdef CAN_PROTOTYPE +btree_prefix(const DBT *key1, const DBT *key2) +#else +btree_prefix(key1, key2) +const DBT * key1 ; +const DBT * key2 ; +#endif + +#endif +{ +#ifdef dTHX + dTHX; +#endif + dSP ; + dMY_CXT ; + char * data1, * data2 ; + int retval ; + int count ; + +#ifdef AT_LEAST_DB_3_2 + PERL_UNUSED_ARG(db); +#endif + + if (CurrentDB->in_prefix){ + tidyUp(CurrentDB); + croak ("DB_File btree_prefix: recursion detected\n") ; + } + + data1 = (char *) key1->data ; + data2 = (char *) key2->data ; + +#ifndef newSVpvn + /* As newSVpv will assume that the data pointer is a null terminated C + string if the size parameter is 0, make sure that data points to an + empty string if the length is 0 + */ + if (key1->size == 0) + data1 = "" ; + if (key2->size == 0) + data2 = "" ; +#endif + + ENTER ; + SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_prefix = FALSE; + SAVEINT(CurrentDB->in_prefix); + CurrentDB->in_prefix = TRUE; + + PUSHMARK(SP) ; + EXTEND(SP,2) ; + PUSHs(sv_2mortal(newSVpvn(data1,key1->size))); + PUSHs(sv_2mortal(newSVpvn(data2,key2->size))); + PUTBACK ; + + count = perl_call_sv(CurrentDB->prefix, G_SCALAR); + + SPAGAIN ; + + if (count != 1){ + tidyUp(CurrentDB); + croak ("DB_File btree_prefix: expected 1 return value from prefix sub, got %d\n", count) ; + } + + retval = POPi ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + + return (retval) ; +} + + +#ifdef BERKELEY_DB_1 +# define HASH_CB_SIZE_TYPE size_t +#else +# define HASH_CB_SIZE_TYPE u_int32_t +#endif + +static DB_Hash_t +#ifdef AT_LEAST_DB_3_2 + +#ifdef CAN_PROTOTYPE +hash_cb(DB * db, const void *data, u_int32_t size) +#else +hash_cb(db, data, size) +DB * db ; +const void * data ; +HASH_CB_SIZE_TYPE size ; +#endif + +#else /* Berkeley DB < 3.2 */ + +#ifdef CAN_PROTOTYPE +hash_cb(const void *data, HASH_CB_SIZE_TYPE size) +#else +hash_cb(data, size) +const void * data ; +HASH_CB_SIZE_TYPE size ; +#endif + +#endif +{ +#ifdef dTHX + dTHX; +#endif + dSP ; + dMY_CXT; + int retval = 0; + int count ; + +#ifdef AT_LEAST_DB_3_2 + PERL_UNUSED_ARG(db); +#endif + + if (CurrentDB->in_hash){ + tidyUp(CurrentDB); + croak ("DB_File hash callback: recursion detected\n") ; + } + +#ifndef newSVpvn + if (size == 0) + data = "" ; +#endif + + /* DGH - Next two lines added to fix corrupted stack problem */ + ENTER ; + SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_hash = FALSE; + SAVEINT(CurrentDB->in_hash); + CurrentDB->in_hash = TRUE; + + PUSHMARK(SP) ; + + + XPUSHs(sv_2mortal(newSVpvn((char*)data,size))); + PUTBACK ; + + count = perl_call_sv(CurrentDB->hash, G_SCALAR); + + SPAGAIN ; + + if (count != 1){ + tidyUp(CurrentDB); + croak ("DB_File hash_cb: expected 1 return value from hash sub, got %d\n", count) ; + } + + retval = POPi ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + + return (retval) ; +} + +#ifdef WANT_ERROR + +static void +#ifdef AT_LEAST_DB_4_3 +db_errcall_cb(const DB_ENV* dbenv, const char * db_errpfx, const char * buffer) +#else +db_errcall_cb(const char * db_errpfx, char * buffer) +#endif +{ +#ifdef dTHX + dTHX; +#endif + SV * sv = perl_get_sv(ERR_BUFF, FALSE) ; +#ifdef AT_LEAST_DB_4_3 + PERL_UNUSED_ARG(dbenv); +#endif + if (sv) { + if (db_errpfx) + sv_setpvf(sv, "%s: %s", db_errpfx, buffer) ; + else + sv_setpv(sv, buffer) ; + } +} +#endif + +#if defined(TRACE) && defined(BERKELEY_DB_1_OR_2) + +static void +#ifdef CAN_PROTOTYPE +PrintHash(INFO *hash) +#else +PrintHash(hash) +INFO * hash ; +#endif +{ + printf ("HASH Info\n") ; + printf (" hash = %s\n", + (hash->db_HA_hash != NULL ? "redefined" : "default")) ; + printf (" bsize = %d\n", hash->db_HA_bsize) ; + printf (" ffactor = %d\n", hash->db_HA_ffactor) ; + printf (" nelem = %d\n", hash->db_HA_nelem) ; + printf (" cachesize = %d\n", hash->db_HA_cachesize) ; + printf (" lorder = %d\n", hash->db_HA_lorder) ; + +} + +static void +#ifdef CAN_PROTOTYPE +PrintRecno(INFO *recno) +#else +PrintRecno(recno) +INFO * recno ; +#endif +{ + printf ("RECNO Info\n") ; + printf (" flags = %d\n", recno->db_RE_flags) ; + printf (" cachesize = %d\n", recno->db_RE_cachesize) ; + printf (" psize = %d\n", recno->db_RE_psize) ; + printf (" lorder = %d\n", recno->db_RE_lorder) ; + printf (" reclen = %lu\n", (unsigned long)recno->db_RE_reclen) ; + printf (" bval = %d 0x%x\n", recno->db_RE_bval, recno->db_RE_bval) ; + printf (" bfname = %d [%s]\n", recno->db_RE_bfname, recno->db_RE_bfname) ; +} + +static void +#ifdef CAN_PROTOTYPE +PrintBtree(INFO *btree) +#else +PrintBtree(btree) +INFO * btree ; +#endif +{ + printf ("BTREE Info\n") ; + printf (" compare = %s\n", + (btree->db_BT_compare ? "redefined" : "default")) ; + printf (" prefix = %s\n", + (btree->db_BT_prefix ? "redefined" : "default")) ; + printf (" flags = %d\n", btree->db_BT_flags) ; + printf (" cachesize = %d\n", btree->db_BT_cachesize) ; + printf (" psize = %d\n", btree->db_BT_psize) ; +#ifndef DB_VERSION_MAJOR + printf (" maxkeypage = %d\n", btree->db_BT_maxkeypage) ; + printf (" minkeypage = %d\n", btree->db_BT_minkeypage) ; +#endif + printf (" lorder = %d\n", btree->db_BT_lorder) ; +} + +#else + +#define PrintRecno(recno) +#define PrintHash(hash) +#define PrintBtree(btree) + +#endif /* TRACE */ + + +static I32 +#ifdef CAN_PROTOTYPE +GetArrayLength(pTHX_ DB_File db) +#else +GetArrayLength(db) +DB_File db ; +#endif +{ + DBT key ; + DBT value ; + int RETVAL ; + + DBT_clear(key) ; + DBT_clear(value) ; + RETVAL = do_SEQ(db, key, value, R_LAST) ; + if (RETVAL == 0) + RETVAL = *(I32 *)key.data ; + else /* No key means empty file */ + RETVAL = 0 ; + + return ((I32)RETVAL) ; +} + +static recno_t +#ifdef CAN_PROTOTYPE +GetRecnoKey(pTHX_ DB_File db, I32 value) +#else +GetRecnoKey(db, value) +DB_File db ; +I32 value ; +#endif +{ + if (value < 0) { + /* Get the length of the array */ + I32 length = GetArrayLength(aTHX_ db) ; + + /* check for attempt to write before start of array */ + if (length + value + 1 <= 0) { + tidyUp(db); + croak("Modification of non-creatable array value attempted, subscript %ld", (long)value) ; + } + + value = length + value + 1 ; + } + else + ++ value ; + + return value ; +} + + +static DB_File +#ifdef CAN_PROTOTYPE +ParseOpenInfo(pTHX_ int isHASH, char *name, int flags, int mode, SV *sv) +#else +ParseOpenInfo(isHASH, name, flags, mode, sv) +int isHASH ; +char * name ; +int flags ; +int mode ; +SV * sv ; +#endif +{ + +#ifdef BERKELEY_DB_1_OR_2 /* Berkeley DB Version 1 or 2 */ + + SV ** svp; + HV * action ; + DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ; + void * openinfo = NULL ; + INFO * info = &RETVAL->info ; + STRLEN n_a; + dMY_CXT; + +#ifdef TRACE + printf("In ParseOpenInfo name=[%s] flags=[%d] mode=[%d] SV NULL=[%d]\n", + name, flags, mode, sv == NULL) ; +#endif + Zero(RETVAL, 1, DB_File_type) ; + + /* Default to HASH */ + RETVAL->filtering = 0 ; + RETVAL->filter_fetch_key = RETVAL->filter_store_key = + RETVAL->filter_fetch_value = RETVAL->filter_store_value = + RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; + RETVAL->type = DB_HASH ; + + /* DGH - Next line added to avoid SEGV on existing hash DB */ + CurrentDB = RETVAL; + + /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */ + RETVAL->in_memory = (name == NULL) ; + + if (sv) + { + if (! SvROK(sv) ) + croak ("type parameter is not a reference") ; + + svp = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ; + if (svp && SvOK(*svp)) + action = (HV*) SvRV(*svp) ; + else + croak("internal error") ; + + if (sv_isa(sv, "DB_File::HASHINFO")) + { + + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_HASH database") ; + + RETVAL->type = DB_HASH ; + openinfo = (void*)info ; + + svp = hv_fetch(action, "hash", 4, FALSE); + + if (svp && SvOK(*svp)) + { + info->db_HA_hash = hash_cb ; + RETVAL->hash = newSVsv(*svp) ; + } + else + info->db_HA_hash = NULL ; + + svp = hv_fetch(action, "ffactor", 7, FALSE); + info->db_HA_ffactor = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "nelem", 5, FALSE); + info->db_HA_nelem = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "bsize", 5, FALSE); + info->db_HA_bsize = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "cachesize", 9, FALSE); + info->db_HA_cachesize = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "lorder", 6, FALSE); + info->db_HA_lorder = svp ? SvIV(*svp) : 0; + + PrintHash(info) ; + } + else if (sv_isa(sv, "DB_File::BTREEINFO")) + { + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_BTREE database"); + + RETVAL->type = DB_BTREE ; + openinfo = (void*)info ; + + svp = hv_fetch(action, "compare", 7, FALSE); + if (svp && SvOK(*svp)) + { + info->db_BT_compare = btree_compare ; + RETVAL->compare = newSVsv(*svp) ; + } + else + info->db_BT_compare = NULL ; + + svp = hv_fetch(action, "prefix", 6, FALSE); + if (svp && SvOK(*svp)) + { + info->db_BT_prefix = btree_prefix ; + RETVAL->prefix = newSVsv(*svp) ; + } + else + info->db_BT_prefix = NULL ; + + svp = hv_fetch(action, "flags", 5, FALSE); + info->db_BT_flags = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "cachesize", 9, FALSE); + info->db_BT_cachesize = svp ? SvIV(*svp) : 0; + +#ifndef DB_VERSION_MAJOR + svp = hv_fetch(action, "minkeypage", 10, FALSE); + info->btree.minkeypage = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "maxkeypage", 10, FALSE); + info->btree.maxkeypage = svp ? SvIV(*svp) : 0; +#endif + + svp = hv_fetch(action, "psize", 5, FALSE); + info->db_BT_psize = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "lorder", 6, FALSE); + info->db_BT_lorder = svp ? SvIV(*svp) : 0; + + PrintBtree(info) ; + + } + else if (sv_isa(sv, "DB_File::RECNOINFO")) + { + if (isHASH) + croak("DB_File can only tie an array to a DB_RECNO database"); + + RETVAL->type = DB_RECNO ; + openinfo = (void *)info ; + + info->db_RE_flags = 0 ; + + svp = hv_fetch(action, "flags", 5, FALSE); + info->db_RE_flags = (u_long) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "reclen", 6, FALSE); + info->db_RE_reclen = (size_t) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "cachesize", 9, FALSE); + info->db_RE_cachesize = (u_int) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "psize", 5, FALSE); + info->db_RE_psize = (u_int) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "lorder", 6, FALSE); + info->db_RE_lorder = (int) (svp ? SvIV(*svp) : 0); + +#ifdef DB_VERSION_MAJOR + info->re_source = name ; + name = NULL ; +#endif + svp = hv_fetch(action, "bfname", 6, FALSE); + if (svp && SvOK(*svp)) { + char * ptr = SvPV(*svp,n_a) ; +#ifdef DB_VERSION_MAJOR + name = (char*) n_a ? ptr : NULL ; +#else + info->db_RE_bfname = (char*) (n_a ? ptr : NULL) ; +#endif + } + else +#ifdef DB_VERSION_MAJOR + name = NULL ; +#else + info->db_RE_bfname = NULL ; +#endif + + svp = hv_fetch(action, "bval", 4, FALSE); +#ifdef DB_VERSION_MAJOR + if (svp && SvOK(*svp)) + { + int value ; + if (SvPOK(*svp)) + value = (int)*SvPV(*svp, n_a) ; + else + value = SvIV(*svp) ; + + if (info->flags & DB_FIXEDLEN) { + info->re_pad = value ; + info->flags |= DB_PAD ; + } + else { + info->re_delim = value ; + info->flags |= DB_DELIMITER ; + } + + } +#else + if (svp && SvOK(*svp)) + { + if (SvPOK(*svp)) + info->db_RE_bval = (u_char)*SvPV(*svp, n_a) ; + else + info->db_RE_bval = (u_char)(unsigned long) SvIV(*svp) ; + DB_flags(info->flags, DB_DELIMITER) ; + + } + else + { + if (info->db_RE_flags & R_FIXEDLEN) + info->db_RE_bval = (u_char) ' ' ; + else + info->db_RE_bval = (u_char) '\n' ; + DB_flags(info->flags, DB_DELIMITER) ; + } +#endif + +#ifdef DB_RENUMBER + info->flags |= DB_RENUMBER ; +#endif + + PrintRecno(info) ; + } + else + croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); + } + + + /* OS2 Specific Code */ +#ifdef OS2 +#ifdef __EMX__ + flags |= O_BINARY; +#endif /* __EMX__ */ +#endif /* OS2 */ + +#ifdef DB_VERSION_MAJOR + + { + int Flags = 0 ; + int status ; + + /* Map 1.x flags to 2.x flags */ + if ((flags & O_CREAT) == O_CREAT) + Flags |= DB_CREATE ; + +#if O_RDONLY == 0 + if (flags == O_RDONLY) +#else + if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR) +#endif + Flags |= DB_RDONLY ; + +#ifdef O_TRUNC + if ((flags & O_TRUNC) == O_TRUNC) + Flags |= DB_TRUNCATE ; +#endif + + status = db_open(name, RETVAL->type, Flags, mode, NULL, (DB_INFO*)openinfo, &RETVAL->dbp) ; + if (status == 0) +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor) ; +#else + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, + 0) ; +#endif + + if (status) + RETVAL->dbp = NULL ; + + } +#else + +#if defined(DB_LIBRARY_COMPATIBILITY_API) && DB_VERSION_MAJOR > 2 + RETVAL->dbp = __db185_open(name, flags, mode, RETVAL->type, openinfo) ; +#else + RETVAL->dbp = dbopen(name, flags, mode, RETVAL->type, openinfo) ; +#endif /* DB_LIBRARY_COMPATIBILITY_API */ + +#endif + + return (RETVAL) ; + +#else /* Berkeley DB Version > 2 */ + + SV ** svp; + HV * action ; + DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ; + DB * dbp ; + STRLEN n_a; + int status ; + dMY_CXT; + +/* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ; */ + Zero(RETVAL, 1, DB_File_type) ; + + /* Default to HASH */ + RETVAL->filtering = 0 ; + RETVAL->filter_fetch_key = RETVAL->filter_store_key = + RETVAL->filter_fetch_value = RETVAL->filter_store_value = + RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; + RETVAL->type = DB_HASH ; + + /* DGH - Next line added to avoid SEGV on existing hash DB */ + CurrentDB = RETVAL; + + /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */ + RETVAL->in_memory = (name == NULL) ; + + status = db_create(&RETVAL->dbp, NULL,0) ; + /* printf("db_create returned %d %s\n", status, db_strerror(status)) ; */ + if (status) { + RETVAL->dbp = NULL ; + return (RETVAL) ; + } + dbp = RETVAL->dbp ; + +#ifdef WANT_ERROR + RETVAL->dbp->set_errcall(RETVAL->dbp, db_errcall_cb) ; +#endif + if (sv) + { + if (! SvROK(sv) ) + croak ("type parameter is not a reference") ; + + svp = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ; + if (svp && SvOK(*svp)) + action = (HV*) SvRV(*svp) ; + else + croak("internal error") ; + + if (sv_isa(sv, "DB_File::HASHINFO")) + { + + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_HASH database") ; + + RETVAL->type = DB_HASH ; + + svp = hv_fetch(action, "hash", 4, FALSE); + + if (svp && SvOK(*svp)) + { + (void)dbp->set_h_hash(dbp, hash_cb) ; + RETVAL->hash = newSVsv(*svp) ; + } + + svp = hv_fetch(action, "ffactor", 7, FALSE); + if (svp) + (void)dbp->set_h_ffactor(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "nelem", 5, FALSE); + if (svp) + (void)dbp->set_h_nelem(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "bsize", 5, FALSE); + if (svp) + (void)dbp->set_pagesize(dbp, my_SvUV32(*svp)); + + svp = hv_fetch(action, "cachesize", 9, FALSE); + if (svp) + (void)dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; + + svp = hv_fetch(action, "lorder", 6, FALSE); + if (svp) + (void)dbp->set_lorder(dbp, (int)SvIV(*svp)) ; + + PrintHash(info) ; + } + else if (sv_isa(sv, "DB_File::BTREEINFO")) + { + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_BTREE database"); + + RETVAL->type = DB_BTREE ; + + svp = hv_fetch(action, "compare", 7, FALSE); + if (svp && SvOK(*svp)) + { + (void)dbp->set_bt_compare(dbp, btree_compare) ; + RETVAL->compare = newSVsv(*svp) ; + } + + svp = hv_fetch(action, "prefix", 6, FALSE); + if (svp && SvOK(*svp)) + { + (void)dbp->set_bt_prefix(dbp, btree_prefix) ; + RETVAL->prefix = newSVsv(*svp) ; + } + + svp = hv_fetch(action, "flags", 5, FALSE); + if (svp) + (void)dbp->set_flags(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "cachesize", 9, FALSE); + if (svp) + (void)dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; + + svp = hv_fetch(action, "psize", 5, FALSE); + if (svp) + (void)dbp->set_pagesize(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "lorder", 6, FALSE); + if (svp) + (void)dbp->set_lorder(dbp, (int)SvIV(*svp)) ; + + PrintBtree(info) ; + + } + else if (sv_isa(sv, "DB_File::RECNOINFO")) + { + int fixed = FALSE ; + + if (isHASH) + croak("DB_File can only tie an array to a DB_RECNO database"); + + RETVAL->type = DB_RECNO ; + + svp = hv_fetch(action, "flags", 5, FALSE); + if (svp) { + int flags = SvIV(*svp) ; + /* remove FIXDLEN, if present */ + if (flags & DB_FIXEDLEN) { + fixed = TRUE ; + flags &= ~DB_FIXEDLEN ; + } + } + + svp = hv_fetch(action, "cachesize", 9, FALSE); + if (svp) { + status = dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; + } + + svp = hv_fetch(action, "psize", 5, FALSE); + if (svp) { + status = dbp->set_pagesize(dbp, my_SvUV32(*svp)) ; + } + + svp = hv_fetch(action, "lorder", 6, FALSE); + if (svp) { + status = dbp->set_lorder(dbp, (int)SvIV(*svp)) ; + } + + svp = hv_fetch(action, "bval", 4, FALSE); + if (svp && SvOK(*svp)) + { + int value ; + if (SvPOK(*svp)) + value = (int)*SvPV(*svp, n_a) ; + else + value = (int)SvIV(*svp) ; + + if (fixed) { + status = dbp->set_re_pad(dbp, value) ; + } + else { + status = dbp->set_re_delim(dbp, value) ; + } + + } + + if (fixed) { + svp = hv_fetch(action, "reclen", 6, FALSE); + if (svp) { + u_int32_t len = my_SvUV32(*svp) ; + status = dbp->set_re_len(dbp, len) ; + } + } + + if (name != NULL) { + status = dbp->set_re_source(dbp, name) ; + name = NULL ; + } + + svp = hv_fetch(action, "bfname", 6, FALSE); + if (svp && SvOK(*svp)) { + char * ptr = SvPV(*svp,n_a) ; + name = (char*) n_a ? ptr : NULL ; + } + else + name = NULL ; + + + status = dbp->set_flags(dbp, (u_int32_t)DB_RENUMBER) ; + + if (flags){ + (void)dbp->set_flags(dbp, (u_int32_t)flags) ; + } + PrintRecno(info) ; + } + else + croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); + } + + { + u_int32_t Flags = 0 ; + int status ; + + /* Map 1.x flags to 3.x flags */ + if ((flags & O_CREAT) == O_CREAT) + Flags |= DB_CREATE ; + +#if O_RDONLY == 0 + if (flags == O_RDONLY) +#else + if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR) +#endif + Flags |= DB_RDONLY ; + +#ifdef O_TRUNC + if ((flags & O_TRUNC) == O_TRUNC) + Flags |= DB_TRUNCATE ; +#endif + +#ifdef AT_LEAST_DB_4_4 + /* need this for recno */ + if ((flags & O_TRUNC) == O_TRUNC) + Flags |= DB_CREATE ; +#endif + +#ifdef AT_LEAST_DB_4_1 + status = (RETVAL->dbp->open)(RETVAL->dbp, NULL, name, NULL, RETVAL->type, + Flags, mode) ; +#else + status = (RETVAL->dbp->open)(RETVAL->dbp, name, NULL, RETVAL->type, + Flags, mode) ; +#endif + /* printf("open returned %d %s\n", status, db_strerror(status)) ; */ + + if (status == 0) { + + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, + 0) ; + /* printf("cursor returned %d %s\n", status, db_strerror(status)) ; */ + } + + if (status) + { + db_close(RETVAL); /* close **dbp handle to prevent mem.leak */ + RETVAL->dbp = NULL ; + } + + } + + return (RETVAL) ; + +#endif /* Berkeley DB Version > 2 */ + +} /* ParseOpenInfo */ + + +#include "constants.h" + +#line 1550 "DB_File.c" +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(var) if (0) var = var +#endif + +#ifndef dVAR +# define dVAR dNOOP +#endif + + +/* This stuff is not part of the API! You have been warned. */ +#ifndef PERL_VERSION_DECIMAL +# define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s) +#endif +#ifndef PERL_DECIMAL_VERSION +# define PERL_DECIMAL_VERSION \ + PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION) +#endif +#ifndef PERL_VERSION_GE +# define PERL_VERSION_GE(r,v,s) \ + (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s)) +#endif +#ifndef PERL_VERSION_LE +# define PERL_VERSION_LE(r,v,s) \ + (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s)) +#endif + +/* XS_INTERNAL is the explicit static-linkage variant of the default + * XS macro. + * + * XS_EXTERNAL is the same as XS_INTERNAL except it does not include + * "STATIC", ie. it exports XSUB symbols. You probably don't want that + * for anything but the BOOT XSUB. + * + * See XSUB.h in core! + */ + + +/* TODO: This might be compatible further back than 5.10.0. */ +#if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1) +# undef XS_EXTERNAL +# undef XS_INTERNAL +# if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING) +# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name) +# define XS_INTERNAL(name) STATIC XSPROTO(name) +# endif +# if defined(__SYMBIAN32__) +# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name) +# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name) +# endif +# ifndef XS_EXTERNAL +# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus) +# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__) +# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__) +# else +# ifdef __cplusplus +# define XS_EXTERNAL(name) extern "C" XSPROTO(name) +# define XS_INTERNAL(name) static XSPROTO(name) +# else +# define XS_EXTERNAL(name) XSPROTO(name) +# define XS_INTERNAL(name) STATIC XSPROTO(name) +# endif +# endif +# endif +#endif + +/* perl >= 5.10.0 && perl <= 5.15.1 */ + + +/* The XS_EXTERNAL macro is used for functions that must not be static + * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL + * macro defined, the best we can do is assume XS is the same. + * Dito for XS_INTERNAL. + */ +#ifndef XS_EXTERNAL +# define XS_EXTERNAL(name) XS(name) +#endif +#ifndef XS_INTERNAL +# define XS_INTERNAL(name) XS(name) +#endif + +/* Now, finally, after all this mess, we want an ExtUtils::ParseXS + * internal macro that we're free to redefine for varying linkage due + * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use + * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to! + */ + +#undef XS_EUPXS +#if defined(PERL_EUPXS_ALWAYS_EXPORT) +# define XS_EUPXS(name) XS_EXTERNAL(name) +#else + /* default to internal */ +# define XS_EUPXS(name) XS_INTERNAL(name) +#endif + +#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE +#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) + +/* prototype to pass -Wmissing-prototypes */ +STATIC void +S_croak_xs_usage(const CV *const cv, const char *const params); + +STATIC void +S_croak_xs_usage(const CV *const cv, const char *const params) +{ + const GV *const gv = CvGV(cv); + + PERL_ARGS_ASSERT_CROAK_XS_USAGE; + + if (gv) { + const char *const gvname = GvNAME(gv); + const HV *const stash = GvSTASH(gv); + const char *const hvname = stash ? HvNAME(stash) : NULL; + + if (hvname) + Perl_croak_nocontext("Usage: %s::%s(%s)", hvname, gvname, params); + else + Perl_croak_nocontext("Usage: %s(%s)", gvname, params); + } else { + /* Pants. I don't think that it should be possible to get here. */ + Perl_croak_nocontext("Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params); + } +} +#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE + +#define croak_xs_usage S_croak_xs_usage + +#endif + +/* NOTE: the prototype of newXSproto() is different in versions of perls, + * so we define a portable version of newXSproto() + */ +#ifdef newXS_flags +#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0) +#else +#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv) +#endif /* !defined(newXS_flags) */ + +#if PERL_VERSION_LE(5, 21, 5) +# define newXS_deffile(a,b) Perl_newXS(aTHX_ a,b,file) +#else +# define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b) +#endif + +#line 1694 "DB_File.c" + +/* INCLUDE: Including 'constants.xs' from 'DB_File.xs' */ + + +XS_EUPXS(XS_DB_File_constant); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_constant) +{ + dVAR; dXSARGS; + if (items != 1) + croak_xs_usage(cv, "sv"); + PERL_UNUSED_VAR(ax); /* -Wall */ + SP -= items; + { +#line 4 "./constants.xs" +#ifdef dXSTARG + dXSTARG; /* Faster if we have it. */ +#else + dTARGET; +#endif + STRLEN len; + int type; + IV iv; + /* NV nv; Uncomment this if you need to return NVs */ + /* const char *pv; Uncomment this if you need to return PVs */ +#line 1719 "DB_File.c" + SV * sv = ST(0) +; + const char * s = SvPV(sv, len); +#line 18 "./constants.xs" + /* Change this to constant(aTHX_ s, len, &iv, &nv); + if you need to return both NVs and IVs */ + type = constant(aTHX_ s, len, &iv); + /* Return 1 or 2 items. First is error message, or undef if no error. + Second, if present, is found value */ + switch (type) { + case PERL_constant_NOTFOUND: + sv = + sv_2mortal(newSVpvf("%s is not a valid DB_File macro", s)); + PUSHs(sv); + break; + case PERL_constant_NOTDEF: + sv = sv_2mortal(newSVpvf( + "Your vendor has not defined DB_File macro %s, used", + s)); + PUSHs(sv); + break; + case PERL_constant_ISIV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHi(iv); + break; + /* Uncomment this if you need to return NOs + case PERL_constant_ISNO: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_no); + break; */ + /* Uncomment this if you need to return NVs + case PERL_constant_ISNV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHn(nv); + break; */ + /* Uncomment this if you need to return PVs + case PERL_constant_ISPV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, strlen(pv)); + break; */ + /* Uncomment this if you need to return PVNs + case PERL_constant_ISPVN: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, iv); + break; */ + /* Uncomment this if you need to return SVs + case PERL_constant_ISSV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(sv); + break; */ + /* Uncomment this if you need to return UNDEFs + case PERL_constant_ISUNDEF: + break; */ + /* Uncomment this if you need to return UVs + case PERL_constant_ISUV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHu((UV)iv); + break; */ + /* Uncomment this if you need to return YESs + case PERL_constant_ISYES: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_yes); + break; */ + default: + sv = sv_2mortal(newSVpvf( + "Unexpected return type %d while processing DB_File macro %s, used", + type, s)); + PUSHs(sv); + } +#line 1797 "DB_File.c" + PUTBACK; + return; + } +} + + +/* INCLUDE: Returning to 'DB_File.xs' from 'constants.xs' */ + + +XS_EUPXS(XS_DB_File_DoTie_); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_DoTie_) +{ + dVAR; dXSARGS; + if (items < 2 || items > 6) + croak_xs_usage(cv, "isHASH, dbtype, name=undef, flags=O_CREAT|O_RDWR, mode=0666, type=DB_HASH"); + { + int isHASH = (int)SvIV(ST(0)) +; + char * dbtype = (char *)SvPV_nolen(ST(1)) +; + int flags; + int mode; + DB_File RETVAL; + + if (items < 4) + flags = O_CREAT|O_RDWR; + else { + flags = (int)SvIV(ST(3)) +; + } + + if (items < 5) + mode = 0666; + else { + mode = (int)SvIV(ST(4)) +; + } +#line 1572 "DB_File.xs" + { + char * name = (char *) NULL ; + SV * sv = (SV *) NULL ; + STRLEN n_a; + + if (items >= 3 && SvOK(ST(2))) + name = (char*) SvPV(ST(2), n_a) ; + + if (items == 6) + sv = ST(5) ; + + RETVAL = ParseOpenInfo(aTHX_ isHASH, name, flags, mode, sv) ; + Trace(("db_DoTie_ %p\n", RETVAL)); + if (RETVAL->dbp == NULL) { + Safefree(RETVAL); + RETVAL = NULL ; + } + } +#line 1854 "DB_File.c" + { + SV * RETVALSV; + RETVALSV = sv_newmortal(); + sv_setref_pv(RETVALSV, dbtype, (void*)RETVAL); + ST(0) = RETVALSV; + } + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_DESTROY); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_DESTROY) +{ + dVAR; dXSARGS; + if (items != 1) + croak_xs_usage(cv, "db"); + { + DB_File db; +#line 1597 "DB_File.xs" + dMY_CXT; +#line 1876 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0))) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not a reference", + "DB_File::DESTROY", + "db") +; +#line 1599 "DB_File.xs" + CurrentDB = db ; + Trace(("DESTROY %p\n", db)); +#line 1892 "DB_File.c" + + RETVAL = db_DESTROY(db); + XSprePUSH; PUSHi((IV)RETVAL); +#line 1602 "DB_File.xs" + Trace(("DESTROY %p done\n", db)); + if (db->hash) + SvREFCNT_dec(db->hash) ; + if (db->compare) + SvREFCNT_dec(db->compare) ; + if (db->prefix) + SvREFCNT_dec(db->prefix) ; + if (db->filter_fetch_key) + SvREFCNT_dec(db->filter_fetch_key) ; + if (db->filter_store_key) + SvREFCNT_dec(db->filter_store_key) ; + if (db->filter_fetch_value) + SvREFCNT_dec(db->filter_fetch_value) ; + if (db->filter_store_value) + SvREFCNT_dec(db->filter_store_value) ; + safefree(db) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; +#endif +#line 1917 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_DELETE); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_DELETE) +{ + dVAR; dXSARGS; + if (items < 2 || items > 3) + croak_xs_usage(cv, "db, key, flags=0"); + { + DB_File db; + DBTKEY key; + u_int flags; +#line 1630 "DB_File.xs" + dMY_CXT; +#line 1935 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::DELETE", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; + + if (items < 3) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(2)) +; + } +#line 1632 "DB_File.xs" + (void)flags; + CurrentDB = db ; +#line 1979 "DB_File.c" + + RETVAL = db_DELETE(db, key, flags); + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_EXISTS); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_EXISTS) +{ + dVAR; dXSARGS; + if (items != 2) + croak_xs_usage(cv, "db, key"); + { + DB_File db; + DBTKEY key; +#line 1641 "DB_File.xs" + dMY_CXT; +#line 1999 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::EXISTS", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; +#line 1643 "DB_File.xs" + { + DBT value ; + + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = (((db->dbp)->get)(db->dbp, TXN &key, &value, 0) == 0) ; + } +#line 2041 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_FETCH); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_FETCH) +{ + dVAR; dXSARGS; + if (items < 2 || items > 3) + croak_xs_usage(cv, "db, key, flags=0"); + { + DB_File db; + DBTKEY key; + u_int flags; +#line 1659 "DB_File.xs" + dMY_CXT ; + int RETVAL ; +#line 2061 "DB_File.c" + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::FETCH", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; + + if (items < 3) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(2)) +; + } +#line 1662 "DB_File.xs" + { + DBT value ; + + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = db_get(db, key, value, flags) ; + ST(0) = sv_newmortal(); + OutputValue(ST(0), value) + } +#line 2110 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_STORE); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_STORE) +{ + dVAR; dXSARGS; + if (items < 3 || items > 4) + croak_xs_usage(cv, "db, key, value, flags=0"); + { + DB_File db; + DBTKEY key; + DBT value; + u_int flags; +#line 1679 "DB_File.xs" + dMY_CXT; +#line 2129 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::STORE", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; + + { + SV * my_sv = ST(2); + DBM_ckFilter(my_sv, filter_store_value, "filter_store_value"); + DBT_clear(value) ; + SvGETMAGIC(my_sv) ; + if (SvOK(my_sv)) { + STRLEN len; + value.data = SvPVbyte(my_sv, len); + value.size = (int)len; + } + } +; + + if (items < 4) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(3)) +; + } +#line 1681 "DB_File.xs" + (void)flags; + CurrentDB = db ; +#line 2186 "DB_File.c" + + RETVAL = db_STORE(db, key, value, flags); + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_FIRSTKEY); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_FIRSTKEY) +{ + dVAR; dXSARGS; + if (items != 1) + croak_xs_usage(cv, "db"); + { + DB_File db; +#line 1689 "DB_File.xs" + dMY_CXT ; + int RETVAL ; +#line 2206 "DB_File.c" + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::FIRSTKEY", + "db", "DB_File") +; +#line 1692 "DB_File.xs" + { + DBTKEY key ; + DBT value ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = do_SEQ(db, key, value, R_FIRST) ; + ST(0) = sv_newmortal(); + OutputKey(ST(0), key) ; + } +#line 2229 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_NEXTKEY); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_NEXTKEY) +{ + dVAR; dXSARGS; + if (items != 2) + croak_xs_usage(cv, "db, key"); + { + DB_File db; + DBTKEY key; +#line 1709 "DB_File.xs" + dMY_CXT ; + int RETVAL ; +#line 2247 "DB_File.c" + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::NEXTKEY", + "db", "DB_File") +; +#line 1712 "DB_File.xs" + { + DBT value ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = do_SEQ(db, key, value, R_NEXT) ; + ST(0) = sv_newmortal(); + OutputKey(ST(0), key) ; + } +#line 2269 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_unshift); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_unshift) +{ + dVAR; dXSARGS; + dXSI32; + if (items < 1) + croak_xs_usage(cv, "db, ..."); + { + DB_File db; +#line 1732 "DB_File.xs" + dMY_CXT; +#line 2286 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + GvNAME(CvGV(cv)), + "db", "DB_File") +; +#line 1734 "DB_File.xs" + { + DBTKEY key ; + DBT value ; + int i ; + int One ; + STRLEN n_a; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; +#ifdef DB_VERSION_MAJOR + /* get the first value */ + RETVAL = do_SEQ(db, key, value, DB_FIRST) ; + RETVAL = 0 ; +#else + RETVAL = -1 ; +#endif + for (i = items-1 ; i > 0 ; --i) + { + DBM_ckFilter(ST(i), filter_store_value, "filter_store_value"); + value.data = SvPVbyte(ST(i), n_a) ; + value.size = n_a ; + One = 1 ; + key.data = &One ; + key.size = sizeof(int) ; +#ifdef DB_VERSION_MAJOR + RETVAL = (db->cursor->c_put)(db->cursor, &key, &value, DB_BEFORE) ; +#else + RETVAL = (db->dbp->put)(db->dbp, &key, &value, R_IBEFORE) ; +#endif + if (RETVAL != 0) + break; + } + } +#line 2334 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_pop); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_pop) +{ + dVAR; dXSARGS; + dXSI32; + if (items != 1) + croak_xs_usage(cv, "db"); + { + DB_File db; +#line 1775 "DB_File.xs" + dMY_CXT; +#line 2352 "DB_File.c" +#line 1778 "DB_File.xs" + I32 RETVAL; +#line 2355 "DB_File.c" + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + GvNAME(CvGV(cv)), + "db", "DB_File") +; +#line 1780 "DB_File.xs" + { + DBTKEY key ; + DBT value ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + + /* First get the final value */ + RETVAL = do_SEQ(db, key, value, R_LAST) ; + ST(0) = sv_newmortal(); + /* Now delete it */ + if (RETVAL == 0) + { + /* the call to del will trash value, so take a copy now */ + OutputValue(ST(0), value) ; + RETVAL = db_del(db, key, R_CURSOR) ; + if (RETVAL != 0) + sv_setsv(ST(0), &PL_sv_undef); + } + } +#line 2388 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_shift); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_shift) +{ + dVAR; dXSARGS; + dXSI32; + if (items != 1) + croak_xs_usage(cv, "db"); + { + DB_File db; +#line 1806 "DB_File.xs" + dMY_CXT; +#line 2405 "DB_File.c" +#line 1809 "DB_File.xs" + I32 RETVAL; +#line 2408 "DB_File.c" + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + GvNAME(CvGV(cv)), + "db", "DB_File") +; +#line 1811 "DB_File.xs" + { + DBT value ; + DBTKEY key ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + /* get the first value */ + RETVAL = do_SEQ(db, key, value, R_FIRST) ; + ST(0) = sv_newmortal(); + /* Now delete it */ + if (RETVAL == 0) + { + /* the call to del will trash value, so take a copy now */ + OutputValue(ST(0), value) ; + RETVAL = db_del(db, key, R_CURSOR) ; + if (RETVAL != 0) + sv_setsv (ST(0), &PL_sv_undef) ; + } + } +#line 2440 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_push); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_push) +{ + dVAR; dXSARGS; + dXSI32; + if (items < 1) + croak_xs_usage(cv, "db, ..."); + { + DB_File db; +#line 1837 "DB_File.xs" + dMY_CXT; +#line 2457 "DB_File.c" + I32 RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + GvNAME(CvGV(cv)), + "db", "DB_File") +; +#line 1840 "DB_File.xs" + { + DBTKEY key ; + DBT value ; + DB * Db = db->dbp ; + int i ; + STRLEN n_a; + int keyval ; + + DBT_flags(key) ; + DBT_flags(value) ; + CurrentDB = db ; + /* Set the Cursor to the Last element */ + RETVAL = do_SEQ(db, key, value, R_LAST) ; +#ifndef DB_VERSION_MAJOR + if (RETVAL >= 0) +#endif + { + if (RETVAL == 0) + keyval = *(int*)key.data ; + else + keyval = 0 ; + for (i = 1 ; i < items ; ++i) + { + DBM_ckFilter(ST(i), filter_store_value, "filter_store_value"); + value.data = SvPVbyte(ST(i), n_a) ; + value.size = n_a ; + ++ keyval ; + key.data = &keyval ; + key.size = sizeof(int) ; + RETVAL = (Db->put)(Db, TXN &key, &value, 0) ; + if (RETVAL != 0) + break; + } + } + } +#line 2506 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_length); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_length) +{ + dVAR; dXSARGS; + dXSI32; + if (items != 1) + croak_xs_usage(cv, "db"); + { + DB_File db; +#line 1882 "DB_File.xs" + dMY_CXT; +#line 2524 "DB_File.c" + I32 RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + GvNAME(CvGV(cv)), + "db", "DB_File") +; +#line 1885 "DB_File.xs" + CurrentDB = db ; + RETVAL = GetArrayLength(aTHX_ db) ; +#line 2540 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_del); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_del) +{ + dVAR; dXSARGS; + if (items < 2 || items > 3) + croak_xs_usage(cv, "db, key, flags=0"); + { + DB_File db; + DBTKEY key; + u_int flags; +#line 1901 "DB_File.xs" + dMY_CXT; +#line 2559 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::del", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; + + if (items < 3) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(2)) +; + } +#line 1903 "DB_File.xs" + CurrentDB = db ; + RETVAL = db_del(db, key, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_NOTFOUND) + RETVAL = 1 ; +#endif +#line 2609 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_get); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_get) +{ + dVAR; dXSARGS; + if (items < 3 || items > 4) + croak_xs_usage(cv, "db, key, value, flags=0"); + { + DB_File db; + DBTKEY key; + DBT value; + u_int flags; +#line 1922 "DB_File.xs" + dMY_CXT; +#line 2629 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::get", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; + + if (items < 4) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(3)) +; + } +#line 1924 "DB_File.xs" + CurrentDB = db ; + DBT_clear(value) ; + RETVAL = db_get(db, key, value, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_NOTFOUND) + RETVAL = 1 ; +#endif +#line 2680 "DB_File.c" + OutputValue(ST(2), value) + SvSETMAGIC(ST(2)); + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_put); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_put) +{ + dVAR; dXSARGS; + if (items < 3 || items > 4) + croak_xs_usage(cv, "db, key, value, flags=0"); + { + DB_File db; + DBTKEY key; + DBT value; + u_int flags; +#line 1944 "DB_File.xs" + dMY_CXT; +#line 2702 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::put", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; + + { + SV * my_sv = ST(2); + DBM_ckFilter(my_sv, filter_store_value, "filter_store_value"); + DBT_clear(value) ; + SvGETMAGIC(my_sv) ; + if (SvOK(my_sv)) { + STRLEN len; + value.data = SvPVbyte(my_sv, len); + value.size = (int)len; + } + } +; + + if (items < 4) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(3)) +; + } +#line 1946 "DB_File.xs" + CurrentDB = db ; + RETVAL = db_put(db, key, value, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_KEYEXIST) + RETVAL = 1 ; +#endif +#line 2765 "DB_File.c" + if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) OutputKey(ST(1), key); + SvSETMAGIC(ST(1)); + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_fd); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_fd) +{ + dVAR; dXSARGS; + if (items != 1) + croak_xs_usage(cv, "db"); + { + DB_File db; +#line 1962 "DB_File.xs" + dMY_CXT ; +#line 2784 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::fd", + "db", "DB_File") +; +#line 1964 "DB_File.xs" + CurrentDB = db ; +#ifdef DB_VERSION_MAJOR + RETVAL = -1 ; + { + int status = 0 ; + status = (db->in_memory + ? -1 + : ((db->dbp)->fd)(db->dbp, &RETVAL) ) ; + if (status != 0) + RETVAL = -1 ; + } +#else + RETVAL = (db->in_memory + ? -1 + : ((db->dbp)->fd)(db->dbp) ) ; +#endif +#line 2814 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_sync); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_sync) +{ + dVAR; dXSARGS; + if (items < 1 || items > 2) + croak_xs_usage(cv, "db, flags=0"); + { + DB_File db; + u_int flags; +#line 1988 "DB_File.xs" + dMY_CXT; +#line 2832 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::sync", + "db", "DB_File") +; + + if (items < 2) + flags = 0; + else { + flags = (unsigned int)SvUV(ST(1)) +; + } +#line 1990 "DB_File.xs" + CurrentDB = db ; + RETVAL = db_sync(db, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; +#endif +#line 2859 "DB_File.c" + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_seq); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_seq) +{ + dVAR; dXSARGS; + if (items != 4) + croak_xs_usage(cv, "db, key, value, flags"); + { + DB_File db; + DBTKEY key; + DBT value; + u_int flags = (unsigned int)SvUV(ST(3)) +; +#line 2007 "DB_File.xs" + dMY_CXT; +#line 2880 "DB_File.c" + int RETVAL; + dXSTARG; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::seq", + "db", "DB_File") +; + + { + SV * my_sv = ST(1); + DBM_ckFilter(my_sv, filter_store_key, "filter_store_key"); + DBT_clear(key) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + key.data = & Value; + key.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + key.data = SvPVbyte(my_sv, len); + key.size = (int)len; + } + } +; +#line 2009 "DB_File.xs" + CurrentDB = db ; + DBT_clear(value) ; + RETVAL = db_seq(db, key, value, flags); +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_NOTFOUND) + RETVAL = 1 ; +#endif +#line 2924 "DB_File.c" + OutputKey(ST(1), key) + SvSETMAGIC(ST(1)); + OutputValue(ST(2), value) + SvSETMAGIC(ST(2)); + XSprePUSH; PUSHi((IV)RETVAL); + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_filter_fetch_key); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_filter_fetch_key) +{ + dVAR; dXSARGS; + if (items != 2) + croak_xs_usage(cv, "db, code"); + { + DB_File db; + SV * code = ST(1) +; + SV * RETVAL = &PL_sv_undef ; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::filter_fetch_key", + "db", "DB_File") +; +#line 2029 "DB_File.xs" + DBM_setFilter(db->filter_fetch_key, code) ; +#line 2958 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_filter_store_key); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_filter_store_key) +{ + dVAR; dXSARGS; + if (items != 2) + croak_xs_usage(cv, "db, code"); + { + DB_File db; + SV * code = ST(1) +; + SV * RETVAL = &PL_sv_undef ; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::filter_store_key", + "db", "DB_File") +; +#line 2037 "DB_File.xs" + DBM_setFilter(db->filter_store_key, code) ; +#line 2987 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_filter_fetch_value); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_filter_fetch_value) +{ + dVAR; dXSARGS; + if (items != 2) + croak_xs_usage(cv, "db, code"); + { + DB_File db; + SV * code = ST(1) +; + SV * RETVAL = &PL_sv_undef ; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::filter_fetch_value", + "db", "DB_File") +; +#line 2045 "DB_File.xs" + DBM_setFilter(db->filter_fetch_value, code) ; +#line 3016 "DB_File.c" + } + XSRETURN(1); +} + + +XS_EUPXS(XS_DB_File_filter_store_value); /* prototype to pass -Wmissing-prototypes */ +XS_EUPXS(XS_DB_File_filter_store_value) +{ + dVAR; dXSARGS; + if (items != 2) + croak_xs_usage(cv, "db, code"); + { + DB_File db; + SV * code = ST(1) +; + SV * RETVAL = &PL_sv_undef ; + + if (SvROK(ST(0)) && sv_derived_from(ST(0), "DB_File")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + db = INT2PTR(DB_File,tmp); + } + else + Perl_croak_nocontext("%s: %s is not of type %s", + "DB_File::filter_store_value", + "db", "DB_File") +; +#line 2053 "DB_File.xs" + DBM_setFilter(db->filter_store_value, code) ; +#line 3045 "DB_File.c" + } + XSRETURN(1); +} + +#ifdef __cplusplus +extern "C" +#endif +XS_EXTERNAL(boot_DB_File); /* prototype to pass -Wmissing-prototypes */ +XS_EXTERNAL(boot_DB_File) +{ +#if PERL_VERSION_LE(5, 21, 5) + dVAR; dXSARGS; +#else + dVAR; dXSBOOTARGSXSAPIVERCHK; +#endif +#if (PERL_REVISION == 5 && PERL_VERSION < 9) + char* file = __FILE__; +#else + const char* file = __FILE__; +#endif + + PERL_UNUSED_VAR(file); + + PERL_UNUSED_VAR(cv); /* -W */ + PERL_UNUSED_VAR(items); /* -W */ +#if PERL_VERSION_LE(5, 21, 5) + XS_VERSION_BOOTCHECK; +# ifdef XS_APIVERSION_BOOTCHECK + XS_APIVERSION_BOOTCHECK; +# endif +#endif + + newXS_deffile("DB_File::constant", XS_DB_File_constant); + newXS_deffile("DB_File::DoTie_", XS_DB_File_DoTie_); + newXS_deffile("DB_File::DESTROY", XS_DB_File_DESTROY); + newXS_deffile("DB_File::DELETE", XS_DB_File_DELETE); + newXS_deffile("DB_File::EXISTS", XS_DB_File_EXISTS); + newXS_deffile("DB_File::FETCH", XS_DB_File_FETCH); + newXS_deffile("DB_File::STORE", XS_DB_File_STORE); + newXS_deffile("DB_File::FIRSTKEY", XS_DB_File_FIRSTKEY); + newXS_deffile("DB_File::NEXTKEY", XS_DB_File_NEXTKEY); + cv = newXS_deffile("DB_File::UNSHIFT", XS_DB_File_unshift); + XSANY.any_i32 = 1; + cv = newXS_deffile("DB_File::unshift", XS_DB_File_unshift); + XSANY.any_i32 = 0; + cv = newXS_deffile("DB_File::POP", XS_DB_File_pop); + XSANY.any_i32 = 1; + cv = newXS_deffile("DB_File::pop", XS_DB_File_pop); + XSANY.any_i32 = 0; + cv = newXS_deffile("DB_File::SHIFT", XS_DB_File_shift); + XSANY.any_i32 = 1; + cv = newXS_deffile("DB_File::shift", XS_DB_File_shift); + XSANY.any_i32 = 0; + cv = newXS_deffile("DB_File::PUSH", XS_DB_File_push); + XSANY.any_i32 = 1; + cv = newXS_deffile("DB_File::push", XS_DB_File_push); + XSANY.any_i32 = 0; + cv = newXS_deffile("DB_File::FETCHSIZE", XS_DB_File_length); + XSANY.any_i32 = 1; + cv = newXS_deffile("DB_File::length", XS_DB_File_length); + XSANY.any_i32 = 0; + newXS_deffile("DB_File::del", XS_DB_File_del); + newXS_deffile("DB_File::get", XS_DB_File_get); + newXS_deffile("DB_File::put", XS_DB_File_put); + newXS_deffile("DB_File::fd", XS_DB_File_fd); + newXS_deffile("DB_File::sync", XS_DB_File_sync); + newXS_deffile("DB_File::seq", XS_DB_File_seq); + newXS_deffile("DB_File::filter_fetch_key", XS_DB_File_filter_fetch_key); + newXS_deffile("DB_File::filter_store_key", XS_DB_File_filter_store_key); + newXS_deffile("DB_File::filter_fetch_value", XS_DB_File_filter_fetch_value); + newXS_deffile("DB_File::filter_store_value", XS_DB_File_filter_store_value); + + /* Initialisation Section */ + +#line 1545 "DB_File.xs" + { +#ifdef dTHX + dTHX; +#endif +#ifdef WANT_ERROR + SV * sv_err = perl_get_sv(ERR_BUFF, GV_ADD|GV_ADDMULTI) ; +#endif + MY_CXT_INIT; +#ifdef WANT_ERROR + PERL_UNUSED_VAR(sv_err); /* huh? we just retrieved it... */ +#endif + __getBerkeleyDBInfo() ; + + DBT_clear(empty) ; + empty.data = &zero ; + empty.size = sizeof(recno_t) ; + } + +#line 3139 "DB_File.c" + + /* End of Initialisation Section */ + +#if PERL_VERSION_LE(5, 21, 5) +# if PERL_VERSION_GE(5, 9, 0) + if (PL_unitcheckav) + call_list(PL_scopestack_ix, PL_unitcheckav); +# endif + XSRETURN_YES; +#else + Perl_xs_boot_epilog(aTHX_ ax); +#endif +} + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File.o b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.o new file mode 100644 index 0000000000000000000000000000000000000000..2e309dab415e7e47c2774e2dc91840e89c4db906 GIT binary patch literal 370584 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 E0FP%@dH?_b literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm new file mode 100644 index 0000000..9b1f957 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm @@ -0,0 +1,2310 @@ +# DB_File.pm -- Perl 5 interface to Berkeley DB +# +# Written by Paul Marquess (pmqs@cpan.org) +# +# Copyright (c) 1995-2014 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 DB_File::HASHINFO ; + +require 5.008003; + +use warnings; +use strict; +use Carp; +require Tie::Hash; +@DB_File::HASHINFO::ISA = qw(Tie::Hash); + +sub new +{ + my $pkg = shift ; + my %x ; + tie %x, $pkg ; + bless \%x, $pkg ; +} + + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { + bsize => 1, + ffactor => 1, + nelem => 1, + cachesize => 1, + hash => 2, + lorder => 1, + }, + GOT => {} + }, $pkg ; +} + + +sub FETCH +{ + my $self = shift ; + my $key = shift ; + + return $self->{GOT}{$key} if exists $self->{VALID}{$key} ; + + my $pkg = ref $self ; + croak "${pkg}::FETCH - Unknown element '$key'" ; +} + + +sub STORE +{ + my $self = shift ; + my $key = shift ; + my $value = shift ; + + my $type = $self->{VALID}{$key}; + + if ( $type ) + { + croak "Key '$key' not associated with a code reference" + if $type == 2 && !ref $value && ref $value ne 'CODE'; + $self->{GOT}{$key} = $value ; + return ; + } + + my $pkg = ref $self ; + croak "${pkg}::STORE - Unknown element '$key'" ; +} + +sub DELETE +{ + my $self = shift ; + my $key = shift ; + + if ( exists $self->{VALID}{$key} ) + { + delete $self->{GOT}{$key} ; + return ; + } + + my $pkg = ref $self ; + croak "DB_File::HASHINFO::DELETE - Unknown element '$key'" ; +} + +sub EXISTS +{ + my $self = shift ; + my $key = shift ; + + exists $self->{VALID}{$key} ; +} + +sub NotHere +{ + my $self = shift ; + my $method = shift ; + + croak ref($self) . " does not define the method ${method}" ; +} + +sub FIRSTKEY { my $self = shift ; $self->NotHere("FIRSTKEY") } +sub NEXTKEY { my $self = shift ; $self->NotHere("NEXTKEY") } +sub CLEAR { my $self = shift ; $self->NotHere("CLEAR") } + +package DB_File::RECNOINFO ; + +use warnings; +use strict ; + +@DB_File::RECNOINFO::ISA = qw(DB_File::HASHINFO) ; + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { map {$_, 1} + qw( bval cachesize psize flags lorder reclen bfname ) + }, + GOT => {}, + }, $pkg ; +} + +package DB_File::BTREEINFO ; + +use warnings; +use strict ; + +@DB_File::BTREEINFO::ISA = qw(DB_File::HASHINFO) ; + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { + flags => 1, + cachesize => 1, + maxkeypage => 1, + minkeypage => 1, + psize => 1, + compare => 2, + prefix => 2, + lorder => 1, + }, + GOT => {}, + }, $pkg ; +} + + +package DB_File ; + +use warnings; +use strict; +our ($VERSION, @ISA, @EXPORT, $AUTOLOAD, $DB_BTREE, $DB_HASH, $DB_RECNO); +our ($db_version, $use_XSLoader, $splice_end_array_no_length, $splice_end_array, $Error); +use Carp; + + +$VERSION = "1.835" ; +$VERSION = eval $VERSION; # needed for dev releases + +{ + local $SIG{__WARN__} = sub {$splice_end_array_no_length = join(" ",@_);}; + my @a =(1); splice(@a, 3); + $splice_end_array_no_length = + ($splice_end_array_no_length =~ /^splice\(\) offset past end of array at /); +} +{ + local $SIG{__WARN__} = sub {$splice_end_array = join(" ", @_);}; + my @a =(1); splice(@a, 3, 1); + $splice_end_array = + ($splice_end_array =~ /^splice\(\) offset past end of array at /); +} + +#typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; +$DB_BTREE = new DB_File::BTREEINFO ; +$DB_HASH = new DB_File::HASHINFO ; +$DB_RECNO = new DB_File::RECNOINFO ; + +require Tie::Hash; +require Exporter; +BEGIN { + $use_XSLoader = 1 ; + { local $SIG{__DIE__} ; eval { require XSLoader } ; } + + if ($@) { + $use_XSLoader = 0 ; + require DynaLoader; + @ISA = qw(DynaLoader); + } +} + +push @ISA, qw(Tie::Hash Exporter); +@EXPORT = qw( + $DB_BTREE $DB_HASH $DB_RECNO + + BTREEMAGIC + BTREEVERSION + DB_LOCK + DB_SHMEM + DB_TXN + HASHMAGIC + HASHVERSION + MAX_PAGE_NUMBER + MAX_PAGE_OFFSET + MAX_REC_NUMBER + RET_ERROR + RET_SPECIAL + RET_SUCCESS + R_CURSOR + R_DUP + R_FIRST + R_FIXEDLEN + R_IAFTER + R_IBEFORE + R_LAST + R_NEXT + R_NOKEY + R_NOOVERWRITE + R_PREV + R_RECNOSYNC + R_SETCURSOR + R_SNAPSHOT + __R_UNUSED + +); + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + my ($error, $val) = constant($constname); + Carp::croak $error if $error; + no strict 'refs'; + *{$AUTOLOAD} = sub { $val }; + goto &{$AUTOLOAD}; +} + + +eval { + # Make all Fcntl O_XXX constants available for importing + require Fcntl; + my @O = grep /^O_/, @Fcntl::EXPORT; + Fcntl->import(@O); # first we import what we want to export + push(@EXPORT, @O); +}; + +if ($use_XSLoader) + { XSLoader::load("DB_File", $VERSION)} +else + { bootstrap DB_File $VERSION } + +sub tie_hash_or_array +{ + my (@arg) = @_ ; + my $tieHASH = ( (caller(1))[3] =~ /TIEHASH/ ) ; + + use File::Spec; + $arg[1] = File::Spec->rel2abs($arg[1]) + if defined $arg[1] ; + + $arg[4] = tied %{ $arg[4] } + if @arg >= 5 && ref $arg[4] && $arg[4] =~ /=HASH/ && tied %{ $arg[4] } ; + + $arg[2] = O_CREAT()|O_RDWR() if @arg >=3 && ! defined $arg[2]; + $arg[3] = 0666 if @arg >=4 && ! defined $arg[3]; + + # make recno in Berkeley DB version 2 (or better) work like + # recno in version 1. + if ($db_version >= 4 and ! $tieHASH) { + $arg[2] |= O_CREAT(); + } + + if ($db_version > 1 and defined $arg[4] and $arg[4] =~ /RECNO/ and + $arg[1] and ! -e $arg[1]) { + open(FH, ">$arg[1]") or return undef ; + close FH ; + chmod $arg[3] ? $arg[3] : 0666 , $arg[1] ; + } + + DoTie_($tieHASH, @arg) ; +} + +sub TIEHASH +{ + tie_hash_or_array(@_) ; +} + +sub TIEARRAY +{ + tie_hash_or_array(@_) ; +} + +sub CLEAR +{ + my $self = shift; + my $key = 0 ; + my $value = "" ; + my $status = $self->seq($key, $value, R_FIRST()); + my @keys; + + while ($status == 0) { + push @keys, $key; + $status = $self->seq($key, $value, R_NEXT()); + } + foreach $key (reverse @keys) { + my $s = $self->del($key); + } +} + +sub EXTEND { } + +sub STORESIZE +{ + my $self = shift; + my $length = shift ; + my $current_length = $self->length() ; + + if ($length < $current_length) { + my $key ; + for ($key = $current_length - 1 ; $key >= $length ; -- $key) + { $self->del($key) } + } + elsif ($length > $current_length) { + $self->put($length-1, "") ; + } +} + + +sub SPLICE +{ + my $self = shift; + my $offset = shift; + if (not defined $offset) { + warnings::warnif('uninitialized', 'Use of uninitialized value in splice'); + $offset = 0; + } + + my $has_length = @_; + my $length = @_ ? shift : 0; + # Carping about definedness comes _after_ the OFFSET sanity check. + # This is so we get the same error messages as Perl's splice(). + # + + my @list = @_; + + my $size = $self->FETCHSIZE(); + + # 'If OFFSET is negative then it start that far from the end of + # the array.' + # + if ($offset < 0) { + my $new_offset = $size + $offset; + if ($new_offset < 0) { + die "Modification of non-creatable array value attempted, " + . "subscript $offset"; + } + $offset = $new_offset; + } + + if (not defined $length) { + warnings::warnif('uninitialized', 'Use of uninitialized value in splice'); + $length = 0; + } + + if ($offset > $size) { + $offset = $size; + warnings::warnif('misc', 'splice() offset past end of array') + if $has_length ? $splice_end_array : $splice_end_array_no_length; + } + + # 'If LENGTH is omitted, removes everything from OFFSET onward.' + if (not defined $length) { + $length = $size - $offset; + } + + # 'If LENGTH is negative, leave that many elements off the end of + # the array.' + # + if ($length < 0) { + $length = $size - $offset + $length; + + if ($length < 0) { + # The user must have specified a length bigger than the + # length of the array passed in. But perl's splice() + # doesn't catch this, it just behaves as for length=0. + # + $length = 0; + } + } + + if ($length > $size - $offset) { + $length = $size - $offset; + } + + # $num_elems holds the current number of elements in the database. + my $num_elems = $size; + + # 'Removes the elements designated by OFFSET and LENGTH from an + # array,'... + # + my @removed = (); + foreach (0 .. $length - 1) { + my $old; + my $status = $self->get($offset, $old); + if ($status != 0) { + my $msg = "error from Berkeley DB on get($offset, \$old)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ": error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + push @removed, $old; + + $status = $self->del($offset); + if ($status != 0) { + my $msg = "error from Berkeley DB on del($offset)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ": error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + + -- $num_elems; + } + + # ...'and replaces them with the elements of LIST, if any.' + my $pos = $offset; + while (defined (my $elem = shift @list)) { + my $old_pos = $pos; + my $status; + if ($pos >= $num_elems) { + $status = $self->put($pos, $elem); + } + else { + $status = $self->put($pos, $elem, $self->R_IBEFORE); + } + + if ($status != 0) { + my $msg = "error from Berkeley DB on put($pos, $elem, ...)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ", error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + + die "pos unexpectedly changed from $old_pos to $pos with R_IBEFORE" + if $old_pos != $pos; + + ++ $pos; + ++ $num_elems; + } + + if (wantarray) { + # 'In list context, returns the elements removed from the + # array.' + # + return @removed; + } + elsif (defined wantarray and not wantarray) { + # 'In scalar context, returns the last element removed, or + # undef if no elements are removed.' + # + if (@removed) { + my $last = pop @removed; + return "$last"; + } + else { + return undef; + } + } + elsif (not defined wantarray) { + # Void context + } + else { die } +} +sub ::DB_File::splice { &SPLICE } + +sub find_dup +{ + croak "Usage: \$db->find_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($origkey, $value_wanted) = @_ ; + my ($key, $value) = ($origkey, 0); + my ($status) = 0 ; + + for ($status = $db->seq($key, $value, R_CURSOR() ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT() ) ) { + + return 0 if $key eq $origkey and $value eq $value_wanted ; + } + + return $status ; +} + +sub del_dup +{ + croak "Usage: \$db->del_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($key, $value) = @_ ; + my ($status) = $db->find_dup($key, $value) ; + return $status if $status != 0 ; + + $status = $db->del($key, R_CURSOR() ) ; + return $status ; +} + +sub get_dup +{ + croak "Usage: \$db->get_dup(key [,flag])\n" + unless @_ == 2 or @_ == 3 ; + + my $db = shift ; + my $key = shift ; + my $flag = shift ; + my $value = 0 ; + my $origkey = $key ; + my $wantarray = wantarray ; + my %values = () ; + my @values = () ; + my $counter = 0 ; + my $status = 0 ; + + # iterate through the database until either EOF ($status == 0) + # or a different key is encountered ($key ne $origkey). + for ($status = $db->seq($key, $value, R_CURSOR()) ; + $status == 0 and $key eq $origkey ; + $status = $db->seq($key, $value, R_NEXT()) ) { + + # save the value or count number of matches + if ($wantarray) { + if ($flag) + { ++ $values{$value} } + else + { push (@values, $value) } + } + else + { ++ $counter } + + } + + return ($wantarray ? ($flag ? %values : @values) : $counter) ; +} + + +sub STORABLE_freeze +{ + my $type = ref shift; + croak "Cannot freeze $type object\n"; +} + +sub STORABLE_thaw +{ + my $type = ref shift; + croak "Cannot thaw $type object\n"; +} + + + +1; +__END__ + +=head1 NAME + +DB_File - Perl5 access to Berkeley DB version 1.x + +=head1 SYNOPSIS + + use DB_File; + + [$X =] tie %hash, 'DB_File', [$filename, $flags, $mode, $DB_HASH] ; + [$X =] tie %hash, 'DB_File', $filename, $flags, $mode, $DB_BTREE ; + [$X =] tie @array, 'DB_File', $filename, $flags, $mode, $DB_RECNO ; + + $status = $X->del($key [, $flags]) ; + $status = $X->put($key, $value [, $flags]) ; + $status = $X->get($key, $value [, $flags]) ; + $status = $X->seq($key, $value, $flags) ; + $status = $X->sync([$flags]) ; + $status = $X->fd ; + + # BTREE only + $count = $X->get_dup($key) ; + @list = $X->get_dup($key) ; + %list = $X->get_dup($key, 1) ; + $status = $X->find_dup($key, $value) ; + $status = $X->del_dup($key, $value) ; + + # RECNO only + $a = $X->length; + $a = $X->pop ; + $X->push(list); + $a = $X->shift; + $X->unshift(list); + @r = $X->splice(offset, length, elements); + + # DBM Filters + $old_filter = $db->filter_store_key ( sub { ... } ) ; + $old_filter = $db->filter_store_value( sub { ... } ) ; + $old_filter = $db->filter_fetch_key ( sub { ... } ) ; + $old_filter = $db->filter_fetch_value( sub { ... } ) ; + + untie %hash ; + untie @array ; + +=head1 DESCRIPTION + +B is a module which allows Perl programs to make use of the +facilities provided by Berkeley DB version 1.x (if you have a newer +version of DB, see L). +It is assumed that you have a copy of the Berkeley DB manual pages at +hand when reading this documentation. The interface defined here +mirrors the Berkeley DB interface closely. + +Berkeley DB is a C library which provides a consistent interface to a +number of database formats. B provides an interface to all +three of the database types currently supported by Berkeley DB. + +The file types are: + +=over 5 + +=item B + +This database type allows arbitrary key/value pairs to be stored in data +files. This is equivalent to the functionality provided by other +hashing packages like DBM, NDBM, ODBM, GDBM, and SDBM. Remember though, +the files created using DB_HASH are not compatible with any of the +other packages mentioned. + +A default hashing algorithm, which will be adequate for most +applications, is built into Berkeley DB. If you do need to use your own +hashing algorithm it is possible to write your own in Perl and have +B use it instead. + +=item B + +The btree format allows arbitrary key/value pairs to be stored in a +sorted, balanced binary tree. + +As with the DB_HASH format, it is possible to provide a user defined +Perl routine to perform the comparison of keys. By default, though, the +keys are stored in lexical order. + +=item B + +DB_RECNO allows both fixed-length and variable-length flat text files +to be manipulated using the same key/value pair interface as in DB_HASH +and DB_BTREE. In this case the key will consist of a record (line) +number. + +=back + +=head2 Using DB_File with Berkeley DB version 2 or greater + +Although B is intended to be used with Berkeley DB version 1, +it can also be used with version 2, 3 or 4. In this case the interface is +limited to the functionality provided by Berkeley DB 1.x. Anywhere the +version 2 or greater interface differs, B arranges for it to work +like version 1. This feature allows B scripts that were built +with version 1 to be migrated to version 2 or greater without any changes. + +If you want to make use of the new features available in Berkeley DB +2.x or greater, use the Perl module B instead. + +B The database file format has changed multiple times in Berkeley +DB version 2, 3 and 4. If you cannot recreate your databases, you +must dump any existing databases with either the C or the +C utility that comes with Berkeley DB. +Once you have rebuilt DB_File to use Berkeley DB version 2 or greater, +your databases can be recreated using C. Refer to the Berkeley DB +documentation for further details. + +Please read L<"COPYRIGHT"> before using version 2.x or greater of Berkeley +DB with DB_File. + +=head2 Interface to Berkeley DB + +B allows access to Berkeley DB files using the tie() mechanism +in Perl 5 (for full details, see L). This facility +allows B to access Berkeley DB files using either an +associative array (for DB_HASH & DB_BTREE file types) or an ordinary +array (for the DB_RECNO file type). + +In addition to the tie() interface, it is also possible to access most +of the functions provided in the Berkeley DB API directly. +See L. + +=head2 Opening a Berkeley DB Database File + +Berkeley DB uses the function dbopen() to open or create a database. +Here is the C prototype for dbopen(): + + DB* + dbopen (const char * file, int flags, int mode, + DBTYPE type, const void * openinfo) + +The parameter C is an enumeration which specifies which of the 3 +interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used. +Depending on which of these is actually chosen, the final parameter, +I points to a data structure which allows tailoring of the +specific interface method. + +This interface is handled slightly differently in B. Here is +an equivalent call using B: + + tie %array, 'DB_File', $filename, $flags, $mode, $DB_HASH ; + +The C, C and C parameters are the direct +equivalent of their dbopen() counterparts. The final parameter $DB_HASH +performs the function of both the C and C parameters in +dbopen(). + +In the example above $DB_HASH is actually a pre-defined reference to a +hash object. B has three of these pre-defined references. +Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO. + +The keys allowed in each of these pre-defined references is limited to +the names used in the equivalent C structure. So, for example, the +$DB_HASH reference will only allow keys called C, C, +C, C, C and C. + +To change one of these elements, just assign to it like this: + + $DB_HASH->{'cachesize'} = 10000 ; + +The three predefined variables $DB_HASH, $DB_BTREE and $DB_RECNO are +usually adequate for most applications. If you do need to create extra +instances of these objects, constructors are available for each file +type. + +Here are examples of the constructors and the valid options available +for DB_HASH, DB_BTREE and DB_RECNO respectively. + + $a = new DB_File::HASHINFO ; + $a->{'bsize'} ; + $a->{'cachesize'} ; + $a->{'ffactor'}; + $a->{'hash'} ; + $a->{'lorder'} ; + $a->{'nelem'} ; + + $b = new DB_File::BTREEINFO ; + $b->{'flags'} ; + $b->{'cachesize'} ; + $b->{'maxkeypage'} ; + $b->{'minkeypage'} ; + $b->{'psize'} ; + $b->{'compare'} ; + $b->{'prefix'} ; + $b->{'lorder'} ; + + $c = new DB_File::RECNOINFO ; + $c->{'bval'} ; + $c->{'cachesize'} ; + $c->{'psize'} ; + $c->{'flags'} ; + $c->{'lorder'} ; + $c->{'reclen'} ; + $c->{'bfname'} ; + +The values stored in the hashes above are mostly the direct equivalent +of their C counterpart. Like their C counterparts, all are set to a +default values - that means you don't have to set I of the +values when you only want to change one. Here is an example: + + $a = new DB_File::HASHINFO ; + $a->{'cachesize'} = 12345 ; + tie %y, 'DB_File', "filename", $flags, 0777, $a ; + +A few of the options need extra discussion here. When used, the C +equivalent of the keys C, C and C store pointers +to C functions. In B these keys are used to store references +to Perl subs. Below are templates for each of the subs: + + sub hash + { + my ($data) = @_ ; + ... + # return the hash value for $data + return $hash ; + } + + sub compare + { + my ($key, $key2) = @_ ; + ... + # return 0 if $key1 eq $key2 + # -1 if $key1 lt $key2 + # 1 if $key1 gt $key2 + return (-1 , 0 or 1) ; + } + + sub prefix + { + my ($key, $key2) = @_ ; + ... + # return number of bytes of $key2 which are + # necessary to determine that it is greater than $key1 + return $bytes ; + } + +See L for an example of using the +C template. + +If you are using the DB_RECNO interface and you intend making use of +C, you should check out L. + +=head2 Default Parameters + +It is possible to omit some or all of the final 4 parameters in the +call to C and let them take default values. As DB_HASH is the most +common file format used, the call: + + tie %A, "DB_File", "filename" ; + +is equivalent to: + + tie %A, "DB_File", "filename", O_CREAT|O_RDWR, 0666, $DB_HASH ; + +It is also possible to omit the filename parameter as well, so the +call: + + tie %A, "DB_File" ; + +is equivalent to: + + tie %A, "DB_File", undef, O_CREAT|O_RDWR, 0666, $DB_HASH ; + +See L for a discussion on the use of C +in place of a filename. + +=head2 In Memory Databases + +Berkeley DB allows the creation of in-memory databases by using NULL +(that is, a C<(char *)0> in C) in place of the filename. B +uses C instead of NULL to provide this functionality. + +=head1 DB_HASH + +The DB_HASH file format is probably the most commonly used of the three +file formats that B supports. It is also very straightforward +to use. + +=head2 A Simple Example + +This example shows how to create a database, add key/value pairs to the +database, delete keys/value pairs and finally how to enumerate the +contents of the database. + + use warnings ; + use strict ; + use DB_File ; + our (%h, $k, $v) ; + + unlink "fruit" ; + tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH + or die "Cannot open file 'fruit': $!\n"; + + # Add a few key/value pairs to the file + $h{"apple"} = "red" ; + $h{"orange"} = "orange" ; + $h{"banana"} = "yellow" ; + $h{"tomato"} = "red" ; + + # Check for existence of a key + print "Banana Exists\n\n" if $h{"banana"} ; + + # Delete a key/value pair. + delete $h{"apple"} ; + + # print the contents of the file + while (($k, $v) = each %h) + { print "$k -> $v\n" } + + untie %h ; + +here is the output: + + Banana Exists + + orange -> orange + tomato -> red + banana -> yellow + +Note that the like ordinary associative arrays, the order of the keys +retrieved is in an apparently random order. + +=head1 DB_BTREE + +The DB_BTREE format is useful when you want to store data in a given +order. By default the keys will be stored in lexical order, but as you +will see from the example shown in the next section, it is very easy to +define your own sorting function. + +=head2 Changing the BTREE sort order + +This script shows how to override the default sorting algorithm that +BTREE uses. Instead of using the normal lexical ordering, a case +insensitive compare function will be used. + + use warnings ; + use strict ; + use DB_File ; + + my %h ; + + sub Compare + { + my ($key1, $key2) = @_ ; + "\L$key1" cmp "\L$key2" ; + } + + # specify the Perl sub that will do the comparison + $DB_BTREE->{'compare'} = \&Compare ; + + unlink "tree" ; + tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open file 'tree': $!\n" ; + + # Add a key/value pair to the file + $h{'Wall'} = 'Larry' ; + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + $h{'duck'} = 'donald' ; + + # Delete + delete $h{"duck"} ; + + # Cycle through the keys printing them in order. + # Note it is not necessary to sort the keys as + # the btree will have kept them in order automatically. + foreach (keys %h) + { print "$_\n" } + + untie %h ; + +Here is the output from the code above. + + mouse + Smith + Wall + +There are a few point to bear in mind if you want to change the +ordering in a BTREE database: + +=over 5 + +=item 1. + +The new compare function must be specified when you create the database. + +=item 2. + +You cannot change the ordering once the database has been created. Thus +you must use the same compare function every time you access the +database. + +=item 3 + +Duplicate keys are entirely defined by the comparison function. +In the case-insensitive example above, the keys: 'KEY' and 'key' +would be considered duplicates, and assigning to the second one +would overwrite the first. If duplicates are allowed for (with the +R_DUP flag discussed below), only a single copy of duplicate keys +is stored in the database --- so (again with example above) assigning +three values to the keys: 'KEY', 'Key', and 'key' would leave just +the first key: 'KEY' in the database with three values. For some +situations this results in information loss, so care should be taken +to provide fully qualified comparison functions when necessary. +For example, the above comparison routine could be modified to +additionally compare case-sensitively if two keys are equal in the +case insensitive comparison: + + sub compare { + my($key1, $key2) = @_; + lc $key1 cmp lc $key2 || + $key1 cmp $key2; + } + +And now you will only have duplicates when the keys themselves +are truly the same. (note: in versions of the db library prior to +about November 1996, such duplicate keys were retained so it was +possible to recover the original keys in sets of keys that +compared as equal). + + +=back + +=head2 Handling Duplicate Keys + +The BTREE file type optionally allows a single key to be associated +with an arbitrary number of values. This option is enabled by setting +the flags element of C<$DB_BTREE> to R_DUP when creating the database. + +There are some difficulties in using the tied hash interface if you +want to manipulate a BTREE database with duplicate keys. Consider this +code: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, %h) ; + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the associative array + # and print each key/value pair. + foreach (sort keys %h) + { print "$_ -> $h{$_}\n" } + + untie %h ; + +Here is the output: + + Smith -> John + Wall -> Larry + Wall -> Larry + Wall -> Larry + mouse -> mickey + +As you can see 3 records have been successfully created with key C +- the only thing is, when they are retrieved from the database they +I to have the same value, namely C. The problem is caused +by the way that the associative array interface works. Basically, when +the associative array interface is used to fetch the value associated +with a given key, it will only ever retrieve the first value. + +Although it may not be immediately obvious from the code above, the +associative array interface can be used to write values with duplicate +keys, but it cannot be used to read them back from the database. + +The way to get around this problem is to use the Berkeley DB API method +called C. This method allows sequential access to key/value +pairs. See L for details of both the C method +and the API in general. + +Here is the script above rewritten using the C API method. + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $status, $key, $value) ; + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the btree using seq + # and print each key/value pair. + $key = $value = 0 ; + for ($status = $x->seq($key, $value, R_FIRST) ; + $status == 0 ; + $status = $x->seq($key, $value, R_NEXT) ) + { print "$key -> $value\n" } + + undef $x ; + untie %h ; + +that prints: + + Smith -> John + Wall -> Brick + Wall -> Brick + Wall -> Larry + mouse -> mickey + +This time we have got all the key/value pairs, including the multiple +values associated with the key C. + +To make life easier when dealing with duplicate keys, B comes with +a few utility methods. + +=head2 The get_dup() Method + +The C method assists in +reading duplicate values from BTREE databases. The method can take the +following forms: + + $count = $x->get_dup($key) ; + @list = $x->get_dup($key) ; + %list = $x->get_dup($key, 1) ; + +In a scalar context the method returns the number of values associated +with the key, C<$key>. + +In list context, it returns all the values which match C<$key>. Note +that the values will be returned in an apparently random order. + +In list context, if the second parameter is present and evaluates +TRUE, the method returns an associative array. The keys of the +associative array correspond to the values that matched in the BTREE +and the values of the array are a count of the number of times that +particular value occurred in the BTREE. + +So assuming the database created above, we can use C like +this: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + my $cnt = $x->get_dup("Wall") ; + print "Wall occurred $cnt times\n" ; + + my %hash = $x->get_dup("Wall", 1) ; + print "Larry is there\n" if $hash{'Larry'} ; + print "There are $hash{'Brick'} Brick Walls\n" ; + + my @list = sort $x->get_dup("Wall") ; + print "Wall => [@list]\n" ; + + @list = $x->get_dup("Smith") ; + print "Smith => [@list]\n" ; + + @list = $x->get_dup("Dog") ; + print "Dog => [@list]\n" ; + + +and it will print: + + Wall occurred 3 times + Larry is there + There are 2 Brick Walls + Wall => [Brick Brick Larry] + Smith => [John] + Dog => [] + +=head2 The find_dup() Method + + $status = $X->find_dup($key, $value) ; + +This method checks for the existence of a specific key/value pair. If the +pair exists, the cursor is left pointing to the pair and the method +returns 0. Otherwise the method returns a non-zero value. + +Assuming the database from the previous example: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; + print "Harry Wall is $found there\n" ; + + undef $x ; + untie %h ; + +prints this + + Larry Wall is there + Harry Wall is not there + + +=head2 The del_dup() Method + + $status = $X->del_dup($key, $value) ; + +This method deletes a specific key/value pair. It returns +0 if they exist and have been deleted successfully. +Otherwise the method returns a non-zero value. + +Again assuming the existence of the C database + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $x->del_dup("Wall", "Larry") ; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + undef $x ; + untie %h ; + +prints this + + Larry Wall is not there + +=head2 Matching Partial Keys + +The BTREE interface has a feature which allows partial keys to be +matched. This functionality is I available when the C method +is used along with the R_CURSOR flag. + + $x->seq($key, $value, R_CURSOR) ; + +Here is the relevant quote from the dbopen man page where it defines +the use of the R_CURSOR flag with seq: + + Note, for the DB_BTREE access method, the returned key is not + necessarily an exact match for the specified key. The returned key + is the smallest key greater than or equal to the specified key, + permitting partial key matches and range searches. + +In the example script below, the C sub uses this feature to find +and print the first matching key/value pair given a partial key. + + use warnings ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($filename, $x, %h, $st, $key, $value) ; + + sub match + { + my $key = shift ; + my $value = 0; + my $orig_key = $key ; + $x->seq($key, $value, R_CURSOR) ; + print "$orig_key\t-> $key\t-> $value\n" ; + } + + $filename = "tree" ; + unlink $filename ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'mouse'} = 'mickey' ; + $h{'Wall'} = 'Larry' ; + $h{'Walls'} = 'Brick' ; + $h{'Smith'} = 'John' ; + + + $key = $value = 0 ; + print "IN ORDER\n" ; + for ($st = $x->seq($key, $value, R_FIRST) ; + $st == 0 ; + $st = $x->seq($key, $value, R_NEXT) ) + + { print "$key -> $value\n" } + + print "\nPARTIAL MATCH\n" ; + + match "Wa" ; + match "A" ; + match "a" ; + + undef $x ; + untie %h ; + +Here is the output: + + IN ORDER + Smith -> John + Wall -> Larry + Walls -> Brick + mouse -> mickey + + PARTIAL MATCH + Wa -> Wall -> Larry + A -> Smith -> John + a -> mouse -> mickey + +=head1 DB_RECNO + +DB_RECNO provides an interface to flat text files. Both variable and +fixed length records are supported. + +In order to make RECNO more compatible with Perl, the array offset for +all RECNO arrays begins at 0 rather than 1 as in Berkeley DB. + +As with normal Perl arrays, a RECNO array can be accessed using +negative indexes. The index -1 refers to the last element of the array, +-2 the second last, and so on. Attempting to access an element before +the start of the array will raise a fatal run-time error. + +=head2 The 'bval' Option + +The operation of the bval option warrants some discussion. Here is the +definition of bval from the Berkeley DB 1.85 recno manual page: + + The delimiting byte to be used to mark the end of a + record for variable-length records, and the pad charac- + ter for fixed-length records. If no value is speci- + fied, newlines (``\n'') are used to mark the end of + variable-length records and fixed-length records are + padded with spaces. + +The second sentence is wrong. In actual fact bval will only default to +C<"\n"> when the openinfo parameter in dbopen is NULL. If a non-NULL +openinfo parameter is used at all, the value that happens to be in bval +will be used. That means you always have to specify bval when making +use of any of the options in the openinfo parameter. This documentation +error will be fixed in the next release of Berkeley DB. + +That clarifies the situation with regards Berkeley DB itself. What +about B? Well, the behavior defined in the quote above is +quite useful, so B conforms to it. + +That means that you can specify other options (e.g. cachesize) and +still have bval default to C<"\n"> for variable length records, and +space for fixed length records. + +Also note that the bval option only allows you to specify a single byte +as a delimiter. + +=head2 A Simple Example + +Here is a simple example that uses RECNO (if you are using a version +of Perl earlier than 5.004_57 this example won't work -- see +L for a workaround). + + use warnings ; + use strict ; + use DB_File ; + + my $filename = "text" ; + unlink $filename ; + + my @h ; + tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_RECNO + or die "Cannot open file 'text': $!\n" ; + + # Add a few key/value pairs to the file + $h[0] = "orange" ; + $h[1] = "blue" ; + $h[2] = "yellow" ; + + push @h, "green", "black" ; + + my $elements = scalar @h ; + print "The array contains $elements entries\n" ; + + my $last = pop @h ; + print "popped $last\n" ; + + unshift @h, "white" ; + my $first = shift @h ; + print "shifted $first\n" ; + + # Check for existence of a key + print "Element 1 Exists with value $h[1]\n" if $h[1] ; + + # use a negative index + print "The last element is $h[-1]\n" ; + print "The 2nd last element is $h[-2]\n" ; + + untie @h ; + +Here is the output from the script: + + The array contains 5 entries + popped black + shifted white + Element 1 Exists with value blue + The last element is green + The 2nd last element is yellow + +=head2 Extra RECNO Methods + +If you are using a version of Perl earlier than 5.004_57, the tied +array interface is quite limited. In the example script above +C, C, C, C +or determining the array length will not work with a tied array. + +To make the interface more useful for older versions of Perl, a number +of methods are supplied with B to simulate the missing array +operations. All these methods are accessed via the object returned from +the tie call. + +Here are the methods: + +=over 5 + +=item B<$X-Epush(list) ;> + +Pushes the elements of C to the end of the array. + +=item B<$value = $X-Epop ;> + +Removes and returns the last element of the array. + +=item B<$X-Eshift> + +Removes and returns the first element of the array. + +=item B<$X-Eunshift(list) ;> + +Pushes the elements of C to the start of the array. + +=item B<$X-Elength> + +Returns the number of elements in the array. + +=item B<$X-Esplice(offset, length, elements);> + +Returns a splice of the array. + +=back + +=head2 Another Example + +Here is a more complete example that makes use of some of the methods +described above. It also makes use of the API interface directly (see +L). + + use warnings ; + use strict ; + my (@h, $H, $file, $i) ; + use DB_File ; + use Fcntl ; + + $file = "text" ; + + unlink $file ; + + $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0666, $DB_RECNO + or die "Cannot open file $file: $!\n" ; + + # first create a text file to play with + $h[0] = "zero" ; + $h[1] = "one" ; + $h[2] = "two" ; + $h[3] = "three" ; + $h[4] = "four" ; + + + # Print the records in order. + # + # The length method is needed here because evaluating a tied + # array in a scalar context does not return the number of + # elements in the array. + + print "\nORIGINAL\n" ; + foreach $i (0 .. $H->length - 1) { + print "$i: $h[$i]\n" ; + } + + # use the push & pop methods + $a = $H->pop ; + $H->push("last") ; + print "\nThe last record was [$a]\n" ; + + # and the shift & unshift methods + $a = $H->shift ; + $H->unshift("first") ; + print "The first record was [$a]\n" ; + + # Use the API to add a new record after record 2. + $i = 2 ; + $H->put($i, "Newbie", R_IAFTER) ; + + # and a new record before record 1. + $i = 1 ; + $H->put($i, "New One", R_IBEFORE) ; + + # delete record 3 + $H->del(3) ; + + # now print the records in reverse order + print "\nREVERSE\n" ; + for ($i = $H->length - 1 ; $i >= 0 ; -- $i) + { print "$i: $h[$i]\n" } + + # same again, but use the API functions instead + print "\nREVERSE again\n" ; + my ($s, $k, $v) = (0, 0, 0) ; + for ($s = $H->seq($k, $v, R_LAST) ; + $s == 0 ; + $s = $H->seq($k, $v, R_PREV)) + { print "$k: $v\n" } + + undef $H ; + untie @h ; + +and this is what it outputs: + + ORIGINAL + 0: zero + 1: one + 2: two + 3: three + 4: four + + The last record was [four] + The first record was [zero] + + REVERSE + 5: last + 4: three + 3: Newbie + 2: one + 1: New One + 0: first + + REVERSE again + 5: last + 4: three + 3: Newbie + 2: one + 1: New One + 0: first + +Notes: + +=over 5 + +=item 1. + +Rather than iterating through the array, C<@h> like this: + + foreach $i (@h) + +it is necessary to use either this: + + foreach $i (0 .. $H->length - 1) + +or this: + + for ($a = $H->get($k, $v, R_FIRST) ; + $a == 0 ; + $a = $H->get($k, $v, R_NEXT) ) + +=item 2. + +Notice that both times the C method was used the record index was +specified using a variable, C<$i>, rather than the literal value +itself. This is because C will return the record number of the +inserted line via that parameter. + +=back + +=head1 THE API INTERFACE + +As well as accessing Berkeley DB using a tied hash or array, it is also +possible to make direct use of most of the API functions defined in the +Berkeley DB documentation. + +To do this you need to store a copy of the object returned from the tie. + + $db = tie %hash, "DB_File", "filename" ; + +Once you have done that, you can access the Berkeley DB API functions +as B methods directly like this: + + $db->put($key, $value, R_NOOVERWRITE) ; + +B If you have saved a copy of the object returned from +C, the underlying database file will I be closed until both +the tied variable is untied and all copies of the saved object are +destroyed. + + use DB_File ; + $db = tie %hash, "DB_File", "filename" + or die "Cannot tie filename: $!" ; + ... + undef $db ; + untie %hash ; + +See L for more details. + +All the functions defined in L are available except for +close() and dbopen() itself. The B method interface to the +supported functions have been implemented to mirror the way Berkeley DB +works whenever possible. In particular note that: + +=over 5 + +=item * + +The methods return a status value. All return 0 on success. +All return -1 to signify an error and set C<$!> to the exact +error code. The return code 1 generally (but not always) means that the +key specified did not exist in the database. + +Other return codes are defined. See below and in the Berkeley DB +documentation for details. The Berkeley DB documentation should be used +as the definitive source. + +=item * + +Whenever a Berkeley DB function returns data via one of its parameters, +the equivalent B method does exactly the same. + +=item * + +If you are careful, it is possible to mix API calls with the tied +hash/array interface in the same piece of code. Although only a few of +the methods used to implement the tied interface currently make use of +the cursor, you should always assume that the cursor has been changed +any time the tied hash/array interface is used. As an example, this +code will probably not do what you expect: + + $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE + or die "Cannot tie $filename: $!" ; + + # Get the first key/value pair and set the cursor + $X->seq($key, $value, R_FIRST) ; + + # this line will modify the cursor + $count = scalar keys %x ; + + # Get the second key/value pair. + # oops, it didn't, it got the last key/value pair! + $X->seq($key, $value, R_NEXT) ; + +The code above can be rearranged to get around the problem, like this: + + $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE + or die "Cannot tie $filename: $!" ; + + # this line will modify the cursor + $count = scalar keys %x ; + + # Get the first key/value pair and set the cursor + $X->seq($key, $value, R_FIRST) ; + + # Get the second key/value pair. + # worked this time. + $X->seq($key, $value, R_NEXT) ; + +=back + +All the constants defined in L for use in the flags parameters +in the methods defined below are also available. Refer to the Berkeley +DB documentation for the precise meaning of the flags values. + +Below is a list of the methods available. + +=over 5 + +=item B<$status = $X-Eget($key, $value [, $flags]) ;> + +Given a key (C<$key>) this method reads the value associated with it +from the database. The value read from the database is returned in the +C<$value> parameter. + +If the key does not exist the method returns 1. + +No flags are currently defined for this method. + +=item B<$status = $X-Eput($key, $value [, $flags]) ;> + +Stores the key/value pair in the database. + +If you use either the R_IAFTER or R_IBEFORE flags, the C<$key> parameter +will have the record number of the inserted key/value pair set. + +Valid flags are R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE and +R_SETCURSOR. + +=item B<$status = $X-Edel($key [, $flags]) ;> + +Removes all key/value pairs with key C<$key> from the database. + +A return code of 1 means that the requested key was not in the +database. + +R_CURSOR is the only valid flag at present. + +=item B<$status = $X-Efd ;> + +Returns the file descriptor for the underlying database. + +See L for an explanation for why you should +not use C to lock your database. + +=item B<$status = $X-Eseq($key, $value, $flags) ;> + +This interface allows sequential retrieval from the database. See +L for full details. + +Both the C<$key> and C<$value> parameters will be set to the key/value +pair read from the database. + +The flags parameter is mandatory. The valid flag values are R_CURSOR, +R_FIRST, R_LAST, R_NEXT and R_PREV. + +=item B<$status = $X-Esync([$flags]) ;> + +Flushes any cached buffers to disk. + +R_RECNOSYNC is the only valid flag at present. + +=back + +=head1 DBM FILTERS + +A DBM Filter is a piece of code that is be used when you I +want to make the same transformation to all keys and/or values in a +DBM database. + +There are four methods associated with DBM Filters. All work identically, +and each is used to install (or uninstall) a single DBM Filter. Each +expects a single parameter, namely a reference to a sub. The only +difference between them is the place that the filter is installed. + +To summarise: + +=over 5 + +=item B + +If a filter has been installed with this method, it will be invoked +every time you write a key to a DBM database. + +=item B + +If a filter has been installed with this method, it will be invoked +every time you write a value to a DBM database. + + +=item B + +If a filter has been installed with this method, it will be invoked +every time you read a key from a DBM database. + +=item B + +If a filter has been installed with this method, it will be invoked +every time you read a value from a DBM database. + +=back + +You can use any combination of the methods, from none, to all four. + +All filter methods return the existing filter, if present, or C +in not. + +To delete a filter pass C to it. + +=head2 The Filter + +When each filter is called by Perl, a local copy of C<$_> will contain +the key or value to be filtered. Filtering is achieved by modifying +the contents of C<$_>. The return code from the filter is ignored. + +=head2 An Example -- the NULL termination problem. + +Consider the following scenario. You have a DBM database +that you need to share with a third-party C application. The C application +assumes that I keys and values are NULL terminated. Unfortunately +when Perl writes to DBM databases it doesn't use NULL termination, so +your Perl application will have to manage NULL termination itself. When +you write to the database you will have to use something like this: + + $hash{"$key\0"} = "$value\0" ; + +Similarly the NULL needs to be taken into account when you are considering +the length of existing keys/values. + +It would be much better if you could ignore the NULL terminations issue +in the main application code and have a mechanism that automatically +added the terminating NULL to all keys and values whenever you write to +the database and have them removed when you read from the database. As I'm +sure you have already guessed, this is a problem that DBM Filters can +fix very easily. + + use warnings ; + use strict ; + use DB_File ; + + my %hash ; + my $filename = "filt" ; + unlink $filename ; + + my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH + or die "Cannot open $filename: $!\n" ; + + # Install DBM Filters + $db->filter_fetch_key ( sub { s/\0$// } ) ; + $db->filter_store_key ( sub { $_ .= "\0" } ) ; + $db->filter_fetch_value( sub { s/\0$// } ) ; + $db->filter_store_value( sub { $_ .= "\0" } ) ; + + $hash{"abc"} = "def" ; + my $a = $hash{"ABC"} ; + # ... + undef $db ; + untie %hash ; + +Hopefully the contents of each of the filters should be +self-explanatory. Both "fetch" filters remove the terminating NULL, +and both "store" filters add a terminating NULL. + + +=head2 Another Example -- Key is a C int. + +Here is another real-life example. By default, whenever Perl writes to +a DBM database it always writes the key and value as strings. So when +you use this: + + $hash{12345} = "something" ; + +the key 12345 will get stored in the DBM database as the 5 byte string +"12345". If you actually want the key to be stored in the DBM database +as a C int, you will have to use C when writing, and C +when reading. + +Here is a DBM Filter that does it: + + use warnings ; + use strict ; + use DB_File ; + my %hash ; + my $filename = "filt" ; + unlink $filename ; + + + my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH + or die "Cannot open $filename: $!\n" ; + + $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ; + $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ; + $hash{123} = "def" ; + # ... + undef $db ; + untie %hash ; + +This time only two filters have been used -- we only need to manipulate +the contents of the key, so it wasn't necessary to install any value +filters. + +=head1 HINTS AND TIPS + + +=head2 Locking: The Trouble with fd + +Until version 1.72 of this module, the recommended technique for locking +B databases was to flock the filehandle returned from the "fd" +function. Unfortunately this technique has been shown to be fundamentally +flawed (Kudos to David Harris for tracking this down). Use it at your own +peril! + +The locking technique went like this. + + $db = tie(%db, 'DB_File', 'foo.db', O_CREAT|O_RDWR, 0644) + || die "dbcreat foo.db $!"; + $fd = $db->fd; + open(DB_FH, "+<&=$fd") || die "dup $!"; + flock (DB_FH, LOCK_EX) || die "flock: $!"; + ... + $db{"Tom"} = "Jerry" ; + ... + flock(DB_FH, LOCK_UN); + undef $db; + untie %db; + close(DB_FH); + +In simple terms, this is what happens: + +=over 5 + +=item 1. + +Use "tie" to open the database. + +=item 2. + +Lock the database with fd & flock. + +=item 3. + +Read & Write to the database. + +=item 4. + +Unlock and close the database. + +=back + +Here is the crux of the problem. A side-effect of opening the B +database in step 2 is that an initial block from the database will get +read from disk and cached in memory. + +To see why this is a problem, consider what can happen when two processes, +say "A" and "B", both want to update the same B database +using the locking steps outlined above. Assume process "A" has already +opened the database and has a write lock, but it hasn't actually updated +the database yet (it has finished step 2, but not started step 3 yet). Now +process "B" tries to open the same database - step 1 will succeed, +but it will block on step 2 until process "A" releases the lock. The +important thing to notice here is that at this point in time both +processes will have cached identical initial blocks from the database. + +Now process "A" updates the database and happens to change some of the +data held in the initial buffer. Process "A" terminates, flushing +all cached data to disk and releasing the database lock. At this point +the database on disk will correctly reflect the changes made by process +"A". + +With the lock released, process "B" can now continue. It also updates the +database and unfortunately it too modifies the data that was in its +initial buffer. Once that data gets flushed to disk it will overwrite +some/all of the changes process "A" made to the database. + +The result of this scenario is at best a database that doesn't contain +what you expect. At worst the database will corrupt. + +The above won't happen every time competing process update the same +B database, but it does illustrate why the technique should +not be used. + +=head2 Safe ways to lock a database + +Starting with version 2.x, Berkeley DB has internal support for locking. +The companion module to this one, B, provides an interface +to this locking functionality. If you are serious about locking +Berkeley DB databases, I strongly recommend using B. + +If using B isn't an option, there are a number of modules +available on CPAN that can be used to implement locking. Each one +implements locking differently and has different goals in mind. It is +therefore worth knowing the difference, so that you can pick the right +one for your application. Here are the three locking wrappers: + +=over 5 + +=item B + +A B wrapper which creates copies of the database file for +read access, so that you have a kind of a multiversioning concurrent read +system. However, updates are still serial. Use for databases where reads +may be lengthy and consistency problems may occur. + +=item B + +A B wrapper that has the ability to lock and unlock the database +while it is being used. Avoids the tie-before-flock problem by simply +re-tie-ing the database when you get or drop a lock. Because of the +flexibility in dropping and re-acquiring the lock in the middle of a +session, this can be massaged into a system that will work with long +updates and/or reads if the application follows the hints in the POD +documentation. + +=item B + +An extremely lightweight B wrapper that simply flocks a lockfile +before tie-ing the database and drops the lock after the untie. Allows +one to use the same lockfile for multiple databases to avoid deadlock +problems, if desired. Use for databases where updates are reads are +quick and simple flock locking semantics are enough. + +=back + +=head2 Sharing Databases With C Applications + +There is no technical reason why a Berkeley DB database cannot be +shared by both a Perl and a C application. + +The vast majority of problems that are reported in this area boil down +to the fact that C strings are NULL terminated, whilst Perl strings are +not. See L for a generic way to work around this problem. + +Here is a real example. Netscape 2.0 keeps a record of the locations you +visit along with the time you last visited them in a DB_HASH database. +This is usually stored in the file F<~/.netscape/history.db>. The key +field in the database is the location string and the value field is the +time the location was last visited stored as a 4 byte binary value. + +If you haven't already guessed, the location string is stored with a +terminating NULL. This means you need to be careful when accessing the +database. + +Here is a snippet of code that is loosely based on Tom Christiansen's +I script (available from your nearest CPAN archive in +F). + + use warnings ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($dotdir, $HISTORY, %hist_db, $href, $binary_time, $date) ; + $dotdir = $ENV{HOME} || $ENV{LOGNAME}; + + $HISTORY = "$dotdir/.netscape/history.db"; + + tie %hist_db, 'DB_File', $HISTORY + or die "Cannot open $HISTORY: $!\n" ;; + + # Dump the complete database + while ( ($href, $binary_time) = each %hist_db ) { + + # remove the terminating NULL + $href =~ s/\x00$// ; + + # convert the binary time into a user friendly string + $date = localtime unpack("V", $binary_time); + print "$date $href\n" ; + } + + # check for the existence of a specific key + # remember to add the NULL + if ( $binary_time = $hist_db{"http://mox.perl.com/\x00"} ) { + $date = localtime unpack("V", $binary_time) ; + print "Last visited mox.perl.com on $date\n" ; + } + else { + print "Never visited mox.perl.com\n" + } + + untie %hist_db ; + +=head2 The untie() Gotcha + +If you make use of the Berkeley DB API, it is I strongly +recommended that you read L. + +Even if you don't currently make use of the API interface, it is still +worth reading it. + +Here is an example which illustrates the problem from a B +perspective: + + use DB_File ; + use Fcntl ; + + my %x ; + my $X ; + + $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_TRUNC + or die "Cannot tie first time: $!" ; + + $x{123} = 456 ; + + untie %x ; + + tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT + or die "Cannot tie second time: $!" ; + + untie %x ; + +When run, the script will produce this error message: + + Cannot tie second time: Invalid argument at bad.file line 14. + +Although the error message above refers to the second tie() statement +in the script, the source of the problem is really with the untie() +statement that precedes it. + +Having read L you will probably have already guessed that the +error is caused by the extra copy of the tied object stored in C<$X>. +If you haven't, then the problem boils down to the fact that the +B destructor, DESTROY, will not be called until I +references to the tied object are destroyed. Both the tied variable, +C<%x>, and C<$X> above hold a reference to the object. The call to +untie() will destroy the first, but C<$X> still holds a valid +reference, so the destructor will not get called and the database file +F will remain open. The fact that Berkeley DB then reports the +attempt to open a database that is already open via the catch-all +"Invalid argument" doesn't help. + +If you run the script with the C<-w> flag the error message becomes: + + untie attempted while 1 inner references still exist at bad.file line 12. + Cannot tie second time: Invalid argument at bad.file line 14. + +which pinpoints the real problem. Finally the script can now be +modified to fix the original problem by destroying the API object +before the untie: + + ... + $x{123} = 456 ; + + undef $X ; + untie %x ; + + $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT + ... + + +=head1 COMMON QUESTIONS + +=head2 Why is there Perl source in my database? + +If you look at the contents of a database file created by DB_File, +there can sometimes be part of a Perl script included in it. + +This happens because Berkeley DB uses dynamic memory to allocate +buffers which will subsequently be written to the database file. Being +dynamic, the memory could have been used for anything before DB +malloced it. As Berkeley DB doesn't clear the memory once it has been +allocated, the unused portions will contain random junk. In the case +where a Perl script gets written to the database, the random junk will +correspond to an area of dynamic memory that happened to be used during +the compilation of the script. + +Unless you don't like the possibility of there being part of your Perl +scripts embedded in a database file, this is nothing to worry about. + +=head2 How do I store complex data structures with DB_File? + +Although B cannot do this directly, there is a module which +can layer transparently over B to accomplish this feat. + +Check out the MLDBM module, available on CPAN in the directory +F. + +=head2 What does "Invalid Argument" mean? + +You will get this error message when one of the parameters in the +C call is wrong. Unfortunately there are quite a few parameters to +get wrong, so it can be difficult to figure out which one it is. + +Here are a couple of possibilities: + +=over 5 + +=item 1. + +Attempting to reopen a database without closing it. + +=item 2. + +Using the O_WRONLY flag. + +=back + +=head2 What does "Bareword 'DB_File' not allowed" mean? + +You will encounter this particular error message when you have the +C pragma (or the full strict pragma) in your script. +Consider this script: + + use warnings ; + use strict ; + use DB_File ; + my %x ; + tie %x, DB_File, "filename" ; + +Running it produces the error in question: + + Bareword "DB_File" not allowed while "strict subs" in use + +To get around the error, place the word C in either single or +double quotes, like this: + + tie %x, "DB_File", "filename" ; + +Although it might seem like a real pain, it is really worth the effort +of having a C in all your scripts. + +=head1 REFERENCES + +Articles that are either about B or make use of it. + +=over 5 + +=item 1. + +I, Tim Kientzle (tkientzle@ddj.com), +Dr. Dobb's Journal, Issue 295, January 1999, pp 34-41 + +=back + +=head1 HISTORY + +Moved to the Changes file. + +=head1 BUGS + +Some older versions of Berkeley DB had problems with fixed length +records using the RECNO file format. This problem has been fixed since +version 1.85 of Berkeley DB. + +I am sure there are bugs in the code. If you do find any, or can +suggest any enhancements, I would welcome your comments. + +=head1 AVAILABILITY + +B comes with the standard Perl source distribution. Look in +the directory F. Given the amount of time between releases +of Perl the version that ships with Perl is quite likely to be out of +date, so the most recent version can always be found on CPAN (see +L for details), in the directory +F. + +This version of B will work with either version 1.x, 2.x or +3.x of Berkeley DB, but is limited to the functionality provided by +version 1. + +The official web site for Berkeley DB is F. +All versions of Berkeley DB are available there. + +Alternatively, Berkeley DB version 1 is available at your nearest CPAN +archive in F. + +=head1 COPYRIGHT + +Copyright (c) 1995-2012 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. + +Although B is covered by the Perl license, the library it +makes use of, namely Berkeley DB, is not. Berkeley DB has its own +copyright and its own license. Please take the time to read it. + +Here are a few words taken from the Berkeley DB FAQ (at +F) regarding the license: + + Do I have to license DB to use it in Perl scripts? + + No. The Berkeley DB license requires that software that uses + Berkeley DB be freely redistributable. In the case of Perl, that + software is Perl, and not your scripts. Any Perl scripts that you + write are your property, including scripts that make use of + Berkeley DB. Neither the Perl license nor the Berkeley DB license + place any restriction on what you may do with them. + +If you are in any doubt about the license situation, contact either the +Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details. + + +=head1 SEE ALSO + +L, L, L, L, L, +L + +=head1 AUTHOR + +The DB_File interface was written by Paul Marquess +Epmqs@cpan.orgE. + +=cut diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm.bak b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm.bak new file mode 100644 index 0000000..9b1f957 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.pm.bak @@ -0,0 +1,2310 @@ +# DB_File.pm -- Perl 5 interface to Berkeley DB +# +# Written by Paul Marquess (pmqs@cpan.org) +# +# Copyright (c) 1995-2014 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 DB_File::HASHINFO ; + +require 5.008003; + +use warnings; +use strict; +use Carp; +require Tie::Hash; +@DB_File::HASHINFO::ISA = qw(Tie::Hash); + +sub new +{ + my $pkg = shift ; + my %x ; + tie %x, $pkg ; + bless \%x, $pkg ; +} + + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { + bsize => 1, + ffactor => 1, + nelem => 1, + cachesize => 1, + hash => 2, + lorder => 1, + }, + GOT => {} + }, $pkg ; +} + + +sub FETCH +{ + my $self = shift ; + my $key = shift ; + + return $self->{GOT}{$key} if exists $self->{VALID}{$key} ; + + my $pkg = ref $self ; + croak "${pkg}::FETCH - Unknown element '$key'" ; +} + + +sub STORE +{ + my $self = shift ; + my $key = shift ; + my $value = shift ; + + my $type = $self->{VALID}{$key}; + + if ( $type ) + { + croak "Key '$key' not associated with a code reference" + if $type == 2 && !ref $value && ref $value ne 'CODE'; + $self->{GOT}{$key} = $value ; + return ; + } + + my $pkg = ref $self ; + croak "${pkg}::STORE - Unknown element '$key'" ; +} + +sub DELETE +{ + my $self = shift ; + my $key = shift ; + + if ( exists $self->{VALID}{$key} ) + { + delete $self->{GOT}{$key} ; + return ; + } + + my $pkg = ref $self ; + croak "DB_File::HASHINFO::DELETE - Unknown element '$key'" ; +} + +sub EXISTS +{ + my $self = shift ; + my $key = shift ; + + exists $self->{VALID}{$key} ; +} + +sub NotHere +{ + my $self = shift ; + my $method = shift ; + + croak ref($self) . " does not define the method ${method}" ; +} + +sub FIRSTKEY { my $self = shift ; $self->NotHere("FIRSTKEY") } +sub NEXTKEY { my $self = shift ; $self->NotHere("NEXTKEY") } +sub CLEAR { my $self = shift ; $self->NotHere("CLEAR") } + +package DB_File::RECNOINFO ; + +use warnings; +use strict ; + +@DB_File::RECNOINFO::ISA = qw(DB_File::HASHINFO) ; + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { map {$_, 1} + qw( bval cachesize psize flags lorder reclen bfname ) + }, + GOT => {}, + }, $pkg ; +} + +package DB_File::BTREEINFO ; + +use warnings; +use strict ; + +@DB_File::BTREEINFO::ISA = qw(DB_File::HASHINFO) ; + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { + flags => 1, + cachesize => 1, + maxkeypage => 1, + minkeypage => 1, + psize => 1, + compare => 2, + prefix => 2, + lorder => 1, + }, + GOT => {}, + }, $pkg ; +} + + +package DB_File ; + +use warnings; +use strict; +our ($VERSION, @ISA, @EXPORT, $AUTOLOAD, $DB_BTREE, $DB_HASH, $DB_RECNO); +our ($db_version, $use_XSLoader, $splice_end_array_no_length, $splice_end_array, $Error); +use Carp; + + +$VERSION = "1.835" ; +$VERSION = eval $VERSION; # needed for dev releases + +{ + local $SIG{__WARN__} = sub {$splice_end_array_no_length = join(" ",@_);}; + my @a =(1); splice(@a, 3); + $splice_end_array_no_length = + ($splice_end_array_no_length =~ /^splice\(\) offset past end of array at /); +} +{ + local $SIG{__WARN__} = sub {$splice_end_array = join(" ", @_);}; + my @a =(1); splice(@a, 3, 1); + $splice_end_array = + ($splice_end_array =~ /^splice\(\) offset past end of array at /); +} + +#typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; +$DB_BTREE = new DB_File::BTREEINFO ; +$DB_HASH = new DB_File::HASHINFO ; +$DB_RECNO = new DB_File::RECNOINFO ; + +require Tie::Hash; +require Exporter; +BEGIN { + $use_XSLoader = 1 ; + { local $SIG{__DIE__} ; eval { require XSLoader } ; } + + if ($@) { + $use_XSLoader = 0 ; + require DynaLoader; + @ISA = qw(DynaLoader); + } +} + +push @ISA, qw(Tie::Hash Exporter); +@EXPORT = qw( + $DB_BTREE $DB_HASH $DB_RECNO + + BTREEMAGIC + BTREEVERSION + DB_LOCK + DB_SHMEM + DB_TXN + HASHMAGIC + HASHVERSION + MAX_PAGE_NUMBER + MAX_PAGE_OFFSET + MAX_REC_NUMBER + RET_ERROR + RET_SPECIAL + RET_SUCCESS + R_CURSOR + R_DUP + R_FIRST + R_FIXEDLEN + R_IAFTER + R_IBEFORE + R_LAST + R_NEXT + R_NOKEY + R_NOOVERWRITE + R_PREV + R_RECNOSYNC + R_SETCURSOR + R_SNAPSHOT + __R_UNUSED + +); + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + my ($error, $val) = constant($constname); + Carp::croak $error if $error; + no strict 'refs'; + *{$AUTOLOAD} = sub { $val }; + goto &{$AUTOLOAD}; +} + + +eval { + # Make all Fcntl O_XXX constants available for importing + require Fcntl; + my @O = grep /^O_/, @Fcntl::EXPORT; + Fcntl->import(@O); # first we import what we want to export + push(@EXPORT, @O); +}; + +if ($use_XSLoader) + { XSLoader::load("DB_File", $VERSION)} +else + { bootstrap DB_File $VERSION } + +sub tie_hash_or_array +{ + my (@arg) = @_ ; + my $tieHASH = ( (caller(1))[3] =~ /TIEHASH/ ) ; + + use File::Spec; + $arg[1] = File::Spec->rel2abs($arg[1]) + if defined $arg[1] ; + + $arg[4] = tied %{ $arg[4] } + if @arg >= 5 && ref $arg[4] && $arg[4] =~ /=HASH/ && tied %{ $arg[4] } ; + + $arg[2] = O_CREAT()|O_RDWR() if @arg >=3 && ! defined $arg[2]; + $arg[3] = 0666 if @arg >=4 && ! defined $arg[3]; + + # make recno in Berkeley DB version 2 (or better) work like + # recno in version 1. + if ($db_version >= 4 and ! $tieHASH) { + $arg[2] |= O_CREAT(); + } + + if ($db_version > 1 and defined $arg[4] and $arg[4] =~ /RECNO/ and + $arg[1] and ! -e $arg[1]) { + open(FH, ">$arg[1]") or return undef ; + close FH ; + chmod $arg[3] ? $arg[3] : 0666 , $arg[1] ; + } + + DoTie_($tieHASH, @arg) ; +} + +sub TIEHASH +{ + tie_hash_or_array(@_) ; +} + +sub TIEARRAY +{ + tie_hash_or_array(@_) ; +} + +sub CLEAR +{ + my $self = shift; + my $key = 0 ; + my $value = "" ; + my $status = $self->seq($key, $value, R_FIRST()); + my @keys; + + while ($status == 0) { + push @keys, $key; + $status = $self->seq($key, $value, R_NEXT()); + } + foreach $key (reverse @keys) { + my $s = $self->del($key); + } +} + +sub EXTEND { } + +sub STORESIZE +{ + my $self = shift; + my $length = shift ; + my $current_length = $self->length() ; + + if ($length < $current_length) { + my $key ; + for ($key = $current_length - 1 ; $key >= $length ; -- $key) + { $self->del($key) } + } + elsif ($length > $current_length) { + $self->put($length-1, "") ; + } +} + + +sub SPLICE +{ + my $self = shift; + my $offset = shift; + if (not defined $offset) { + warnings::warnif('uninitialized', 'Use of uninitialized value in splice'); + $offset = 0; + } + + my $has_length = @_; + my $length = @_ ? shift : 0; + # Carping about definedness comes _after_ the OFFSET sanity check. + # This is so we get the same error messages as Perl's splice(). + # + + my @list = @_; + + my $size = $self->FETCHSIZE(); + + # 'If OFFSET is negative then it start that far from the end of + # the array.' + # + if ($offset < 0) { + my $new_offset = $size + $offset; + if ($new_offset < 0) { + die "Modification of non-creatable array value attempted, " + . "subscript $offset"; + } + $offset = $new_offset; + } + + if (not defined $length) { + warnings::warnif('uninitialized', 'Use of uninitialized value in splice'); + $length = 0; + } + + if ($offset > $size) { + $offset = $size; + warnings::warnif('misc', 'splice() offset past end of array') + if $has_length ? $splice_end_array : $splice_end_array_no_length; + } + + # 'If LENGTH is omitted, removes everything from OFFSET onward.' + if (not defined $length) { + $length = $size - $offset; + } + + # 'If LENGTH is negative, leave that many elements off the end of + # the array.' + # + if ($length < 0) { + $length = $size - $offset + $length; + + if ($length < 0) { + # The user must have specified a length bigger than the + # length of the array passed in. But perl's splice() + # doesn't catch this, it just behaves as for length=0. + # + $length = 0; + } + } + + if ($length > $size - $offset) { + $length = $size - $offset; + } + + # $num_elems holds the current number of elements in the database. + my $num_elems = $size; + + # 'Removes the elements designated by OFFSET and LENGTH from an + # array,'... + # + my @removed = (); + foreach (0 .. $length - 1) { + my $old; + my $status = $self->get($offset, $old); + if ($status != 0) { + my $msg = "error from Berkeley DB on get($offset, \$old)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ": error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + push @removed, $old; + + $status = $self->del($offset); + if ($status != 0) { + my $msg = "error from Berkeley DB on del($offset)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ": error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + + -- $num_elems; + } + + # ...'and replaces them with the elements of LIST, if any.' + my $pos = $offset; + while (defined (my $elem = shift @list)) { + my $old_pos = $pos; + my $status; + if ($pos >= $num_elems) { + $status = $self->put($pos, $elem); + } + else { + $status = $self->put($pos, $elem, $self->R_IBEFORE); + } + + if ($status != 0) { + my $msg = "error from Berkeley DB on put($pos, $elem, ...)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ", error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + + die "pos unexpectedly changed from $old_pos to $pos with R_IBEFORE" + if $old_pos != $pos; + + ++ $pos; + ++ $num_elems; + } + + if (wantarray) { + # 'In list context, returns the elements removed from the + # array.' + # + return @removed; + } + elsif (defined wantarray and not wantarray) { + # 'In scalar context, returns the last element removed, or + # undef if no elements are removed.' + # + if (@removed) { + my $last = pop @removed; + return "$last"; + } + else { + return undef; + } + } + elsif (not defined wantarray) { + # Void context + } + else { die } +} +sub ::DB_File::splice { &SPLICE } + +sub find_dup +{ + croak "Usage: \$db->find_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($origkey, $value_wanted) = @_ ; + my ($key, $value) = ($origkey, 0); + my ($status) = 0 ; + + for ($status = $db->seq($key, $value, R_CURSOR() ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT() ) ) { + + return 0 if $key eq $origkey and $value eq $value_wanted ; + } + + return $status ; +} + +sub del_dup +{ + croak "Usage: \$db->del_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($key, $value) = @_ ; + my ($status) = $db->find_dup($key, $value) ; + return $status if $status != 0 ; + + $status = $db->del($key, R_CURSOR() ) ; + return $status ; +} + +sub get_dup +{ + croak "Usage: \$db->get_dup(key [,flag])\n" + unless @_ == 2 or @_ == 3 ; + + my $db = shift ; + my $key = shift ; + my $flag = shift ; + my $value = 0 ; + my $origkey = $key ; + my $wantarray = wantarray ; + my %values = () ; + my @values = () ; + my $counter = 0 ; + my $status = 0 ; + + # iterate through the database until either EOF ($status == 0) + # or a different key is encountered ($key ne $origkey). + for ($status = $db->seq($key, $value, R_CURSOR()) ; + $status == 0 and $key eq $origkey ; + $status = $db->seq($key, $value, R_NEXT()) ) { + + # save the value or count number of matches + if ($wantarray) { + if ($flag) + { ++ $values{$value} } + else + { push (@values, $value) } + } + else + { ++ $counter } + + } + + return ($wantarray ? ($flag ? %values : @values) : $counter) ; +} + + +sub STORABLE_freeze +{ + my $type = ref shift; + croak "Cannot freeze $type object\n"; +} + +sub STORABLE_thaw +{ + my $type = ref shift; + croak "Cannot thaw $type object\n"; +} + + + +1; +__END__ + +=head1 NAME + +DB_File - Perl5 access to Berkeley DB version 1.x + +=head1 SYNOPSIS + + use DB_File; + + [$X =] tie %hash, 'DB_File', [$filename, $flags, $mode, $DB_HASH] ; + [$X =] tie %hash, 'DB_File', $filename, $flags, $mode, $DB_BTREE ; + [$X =] tie @array, 'DB_File', $filename, $flags, $mode, $DB_RECNO ; + + $status = $X->del($key [, $flags]) ; + $status = $X->put($key, $value [, $flags]) ; + $status = $X->get($key, $value [, $flags]) ; + $status = $X->seq($key, $value, $flags) ; + $status = $X->sync([$flags]) ; + $status = $X->fd ; + + # BTREE only + $count = $X->get_dup($key) ; + @list = $X->get_dup($key) ; + %list = $X->get_dup($key, 1) ; + $status = $X->find_dup($key, $value) ; + $status = $X->del_dup($key, $value) ; + + # RECNO only + $a = $X->length; + $a = $X->pop ; + $X->push(list); + $a = $X->shift; + $X->unshift(list); + @r = $X->splice(offset, length, elements); + + # DBM Filters + $old_filter = $db->filter_store_key ( sub { ... } ) ; + $old_filter = $db->filter_store_value( sub { ... } ) ; + $old_filter = $db->filter_fetch_key ( sub { ... } ) ; + $old_filter = $db->filter_fetch_value( sub { ... } ) ; + + untie %hash ; + untie @array ; + +=head1 DESCRIPTION + +B is a module which allows Perl programs to make use of the +facilities provided by Berkeley DB version 1.x (if you have a newer +version of DB, see L). +It is assumed that you have a copy of the Berkeley DB manual pages at +hand when reading this documentation. The interface defined here +mirrors the Berkeley DB interface closely. + +Berkeley DB is a C library which provides a consistent interface to a +number of database formats. B provides an interface to all +three of the database types currently supported by Berkeley DB. + +The file types are: + +=over 5 + +=item B + +This database type allows arbitrary key/value pairs to be stored in data +files. This is equivalent to the functionality provided by other +hashing packages like DBM, NDBM, ODBM, GDBM, and SDBM. Remember though, +the files created using DB_HASH are not compatible with any of the +other packages mentioned. + +A default hashing algorithm, which will be adequate for most +applications, is built into Berkeley DB. If you do need to use your own +hashing algorithm it is possible to write your own in Perl and have +B use it instead. + +=item B + +The btree format allows arbitrary key/value pairs to be stored in a +sorted, balanced binary tree. + +As with the DB_HASH format, it is possible to provide a user defined +Perl routine to perform the comparison of keys. By default, though, the +keys are stored in lexical order. + +=item B + +DB_RECNO allows both fixed-length and variable-length flat text files +to be manipulated using the same key/value pair interface as in DB_HASH +and DB_BTREE. In this case the key will consist of a record (line) +number. + +=back + +=head2 Using DB_File with Berkeley DB version 2 or greater + +Although B is intended to be used with Berkeley DB version 1, +it can also be used with version 2, 3 or 4. In this case the interface is +limited to the functionality provided by Berkeley DB 1.x. Anywhere the +version 2 or greater interface differs, B arranges for it to work +like version 1. This feature allows B scripts that were built +with version 1 to be migrated to version 2 or greater without any changes. + +If you want to make use of the new features available in Berkeley DB +2.x or greater, use the Perl module B instead. + +B The database file format has changed multiple times in Berkeley +DB version 2, 3 and 4. If you cannot recreate your databases, you +must dump any existing databases with either the C or the +C utility that comes with Berkeley DB. +Once you have rebuilt DB_File to use Berkeley DB version 2 or greater, +your databases can be recreated using C. Refer to the Berkeley DB +documentation for further details. + +Please read L<"COPYRIGHT"> before using version 2.x or greater of Berkeley +DB with DB_File. + +=head2 Interface to Berkeley DB + +B allows access to Berkeley DB files using the tie() mechanism +in Perl 5 (for full details, see L). This facility +allows B to access Berkeley DB files using either an +associative array (for DB_HASH & DB_BTREE file types) or an ordinary +array (for the DB_RECNO file type). + +In addition to the tie() interface, it is also possible to access most +of the functions provided in the Berkeley DB API directly. +See L. + +=head2 Opening a Berkeley DB Database File + +Berkeley DB uses the function dbopen() to open or create a database. +Here is the C prototype for dbopen(): + + DB* + dbopen (const char * file, int flags, int mode, + DBTYPE type, const void * openinfo) + +The parameter C is an enumeration which specifies which of the 3 +interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used. +Depending on which of these is actually chosen, the final parameter, +I points to a data structure which allows tailoring of the +specific interface method. + +This interface is handled slightly differently in B. Here is +an equivalent call using B: + + tie %array, 'DB_File', $filename, $flags, $mode, $DB_HASH ; + +The C, C and C parameters are the direct +equivalent of their dbopen() counterparts. The final parameter $DB_HASH +performs the function of both the C and C parameters in +dbopen(). + +In the example above $DB_HASH is actually a pre-defined reference to a +hash object. B has three of these pre-defined references. +Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO. + +The keys allowed in each of these pre-defined references is limited to +the names used in the equivalent C structure. So, for example, the +$DB_HASH reference will only allow keys called C, C, +C, C, C and C. + +To change one of these elements, just assign to it like this: + + $DB_HASH->{'cachesize'} = 10000 ; + +The three predefined variables $DB_HASH, $DB_BTREE and $DB_RECNO are +usually adequate for most applications. If you do need to create extra +instances of these objects, constructors are available for each file +type. + +Here are examples of the constructors and the valid options available +for DB_HASH, DB_BTREE and DB_RECNO respectively. + + $a = new DB_File::HASHINFO ; + $a->{'bsize'} ; + $a->{'cachesize'} ; + $a->{'ffactor'}; + $a->{'hash'} ; + $a->{'lorder'} ; + $a->{'nelem'} ; + + $b = new DB_File::BTREEINFO ; + $b->{'flags'} ; + $b->{'cachesize'} ; + $b->{'maxkeypage'} ; + $b->{'minkeypage'} ; + $b->{'psize'} ; + $b->{'compare'} ; + $b->{'prefix'} ; + $b->{'lorder'} ; + + $c = new DB_File::RECNOINFO ; + $c->{'bval'} ; + $c->{'cachesize'} ; + $c->{'psize'} ; + $c->{'flags'} ; + $c->{'lorder'} ; + $c->{'reclen'} ; + $c->{'bfname'} ; + +The values stored in the hashes above are mostly the direct equivalent +of their C counterpart. Like their C counterparts, all are set to a +default values - that means you don't have to set I of the +values when you only want to change one. Here is an example: + + $a = new DB_File::HASHINFO ; + $a->{'cachesize'} = 12345 ; + tie %y, 'DB_File', "filename", $flags, 0777, $a ; + +A few of the options need extra discussion here. When used, the C +equivalent of the keys C, C and C store pointers +to C functions. In B these keys are used to store references +to Perl subs. Below are templates for each of the subs: + + sub hash + { + my ($data) = @_ ; + ... + # return the hash value for $data + return $hash ; + } + + sub compare + { + my ($key, $key2) = @_ ; + ... + # return 0 if $key1 eq $key2 + # -1 if $key1 lt $key2 + # 1 if $key1 gt $key2 + return (-1 , 0 or 1) ; + } + + sub prefix + { + my ($key, $key2) = @_ ; + ... + # return number of bytes of $key2 which are + # necessary to determine that it is greater than $key1 + return $bytes ; + } + +See L for an example of using the +C template. + +If you are using the DB_RECNO interface and you intend making use of +C, you should check out L. + +=head2 Default Parameters + +It is possible to omit some or all of the final 4 parameters in the +call to C and let them take default values. As DB_HASH is the most +common file format used, the call: + + tie %A, "DB_File", "filename" ; + +is equivalent to: + + tie %A, "DB_File", "filename", O_CREAT|O_RDWR, 0666, $DB_HASH ; + +It is also possible to omit the filename parameter as well, so the +call: + + tie %A, "DB_File" ; + +is equivalent to: + + tie %A, "DB_File", undef, O_CREAT|O_RDWR, 0666, $DB_HASH ; + +See L for a discussion on the use of C +in place of a filename. + +=head2 In Memory Databases + +Berkeley DB allows the creation of in-memory databases by using NULL +(that is, a C<(char *)0> in C) in place of the filename. B +uses C instead of NULL to provide this functionality. + +=head1 DB_HASH + +The DB_HASH file format is probably the most commonly used of the three +file formats that B supports. It is also very straightforward +to use. + +=head2 A Simple Example + +This example shows how to create a database, add key/value pairs to the +database, delete keys/value pairs and finally how to enumerate the +contents of the database. + + use warnings ; + use strict ; + use DB_File ; + our (%h, $k, $v) ; + + unlink "fruit" ; + tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH + or die "Cannot open file 'fruit': $!\n"; + + # Add a few key/value pairs to the file + $h{"apple"} = "red" ; + $h{"orange"} = "orange" ; + $h{"banana"} = "yellow" ; + $h{"tomato"} = "red" ; + + # Check for existence of a key + print "Banana Exists\n\n" if $h{"banana"} ; + + # Delete a key/value pair. + delete $h{"apple"} ; + + # print the contents of the file + while (($k, $v) = each %h) + { print "$k -> $v\n" } + + untie %h ; + +here is the output: + + Banana Exists + + orange -> orange + tomato -> red + banana -> yellow + +Note that the like ordinary associative arrays, the order of the keys +retrieved is in an apparently random order. + +=head1 DB_BTREE + +The DB_BTREE format is useful when you want to store data in a given +order. By default the keys will be stored in lexical order, but as you +will see from the example shown in the next section, it is very easy to +define your own sorting function. + +=head2 Changing the BTREE sort order + +This script shows how to override the default sorting algorithm that +BTREE uses. Instead of using the normal lexical ordering, a case +insensitive compare function will be used. + + use warnings ; + use strict ; + use DB_File ; + + my %h ; + + sub Compare + { + my ($key1, $key2) = @_ ; + "\L$key1" cmp "\L$key2" ; + } + + # specify the Perl sub that will do the comparison + $DB_BTREE->{'compare'} = \&Compare ; + + unlink "tree" ; + tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open file 'tree': $!\n" ; + + # Add a key/value pair to the file + $h{'Wall'} = 'Larry' ; + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + $h{'duck'} = 'donald' ; + + # Delete + delete $h{"duck"} ; + + # Cycle through the keys printing them in order. + # Note it is not necessary to sort the keys as + # the btree will have kept them in order automatically. + foreach (keys %h) + { print "$_\n" } + + untie %h ; + +Here is the output from the code above. + + mouse + Smith + Wall + +There are a few point to bear in mind if you want to change the +ordering in a BTREE database: + +=over 5 + +=item 1. + +The new compare function must be specified when you create the database. + +=item 2. + +You cannot change the ordering once the database has been created. Thus +you must use the same compare function every time you access the +database. + +=item 3 + +Duplicate keys are entirely defined by the comparison function. +In the case-insensitive example above, the keys: 'KEY' and 'key' +would be considered duplicates, and assigning to the second one +would overwrite the first. If duplicates are allowed for (with the +R_DUP flag discussed below), only a single copy of duplicate keys +is stored in the database --- so (again with example above) assigning +three values to the keys: 'KEY', 'Key', and 'key' would leave just +the first key: 'KEY' in the database with three values. For some +situations this results in information loss, so care should be taken +to provide fully qualified comparison functions when necessary. +For example, the above comparison routine could be modified to +additionally compare case-sensitively if two keys are equal in the +case insensitive comparison: + + sub compare { + my($key1, $key2) = @_; + lc $key1 cmp lc $key2 || + $key1 cmp $key2; + } + +And now you will only have duplicates when the keys themselves +are truly the same. (note: in versions of the db library prior to +about November 1996, such duplicate keys were retained so it was +possible to recover the original keys in sets of keys that +compared as equal). + + +=back + +=head2 Handling Duplicate Keys + +The BTREE file type optionally allows a single key to be associated +with an arbitrary number of values. This option is enabled by setting +the flags element of C<$DB_BTREE> to R_DUP when creating the database. + +There are some difficulties in using the tied hash interface if you +want to manipulate a BTREE database with duplicate keys. Consider this +code: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, %h) ; + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the associative array + # and print each key/value pair. + foreach (sort keys %h) + { print "$_ -> $h{$_}\n" } + + untie %h ; + +Here is the output: + + Smith -> John + Wall -> Larry + Wall -> Larry + Wall -> Larry + mouse -> mickey + +As you can see 3 records have been successfully created with key C +- the only thing is, when they are retrieved from the database they +I to have the same value, namely C. The problem is caused +by the way that the associative array interface works. Basically, when +the associative array interface is used to fetch the value associated +with a given key, it will only ever retrieve the first value. + +Although it may not be immediately obvious from the code above, the +associative array interface can be used to write values with duplicate +keys, but it cannot be used to read them back from the database. + +The way to get around this problem is to use the Berkeley DB API method +called C. This method allows sequential access to key/value +pairs. See L for details of both the C method +and the API in general. + +Here is the script above rewritten using the C API method. + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $status, $key, $value) ; + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the btree using seq + # and print each key/value pair. + $key = $value = 0 ; + for ($status = $x->seq($key, $value, R_FIRST) ; + $status == 0 ; + $status = $x->seq($key, $value, R_NEXT) ) + { print "$key -> $value\n" } + + undef $x ; + untie %h ; + +that prints: + + Smith -> John + Wall -> Brick + Wall -> Brick + Wall -> Larry + mouse -> mickey + +This time we have got all the key/value pairs, including the multiple +values associated with the key C. + +To make life easier when dealing with duplicate keys, B comes with +a few utility methods. + +=head2 The get_dup() Method + +The C method assists in +reading duplicate values from BTREE databases. The method can take the +following forms: + + $count = $x->get_dup($key) ; + @list = $x->get_dup($key) ; + %list = $x->get_dup($key, 1) ; + +In a scalar context the method returns the number of values associated +with the key, C<$key>. + +In list context, it returns all the values which match C<$key>. Note +that the values will be returned in an apparently random order. + +In list context, if the second parameter is present and evaluates +TRUE, the method returns an associative array. The keys of the +associative array correspond to the values that matched in the BTREE +and the values of the array are a count of the number of times that +particular value occurred in the BTREE. + +So assuming the database created above, we can use C like +this: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + my $cnt = $x->get_dup("Wall") ; + print "Wall occurred $cnt times\n" ; + + my %hash = $x->get_dup("Wall", 1) ; + print "Larry is there\n" if $hash{'Larry'} ; + print "There are $hash{'Brick'} Brick Walls\n" ; + + my @list = sort $x->get_dup("Wall") ; + print "Wall => [@list]\n" ; + + @list = $x->get_dup("Smith") ; + print "Smith => [@list]\n" ; + + @list = $x->get_dup("Dog") ; + print "Dog => [@list]\n" ; + + +and it will print: + + Wall occurred 3 times + Larry is there + There are 2 Brick Walls + Wall => [Brick Brick Larry] + Smith => [John] + Dog => [] + +=head2 The find_dup() Method + + $status = $X->find_dup($key, $value) ; + +This method checks for the existence of a specific key/value pair. If the +pair exists, the cursor is left pointing to the pair and the method +returns 0. Otherwise the method returns a non-zero value. + +Assuming the database from the previous example: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; + print "Harry Wall is $found there\n" ; + + undef $x ; + untie %h ; + +prints this + + Larry Wall is there + Harry Wall is not there + + +=head2 The del_dup() Method + + $status = $X->del_dup($key, $value) ; + +This method deletes a specific key/value pair. It returns +0 if they exist and have been deleted successfully. +Otherwise the method returns a non-zero value. + +Again assuming the existence of the C database + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $x->del_dup("Wall", "Larry") ; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + undef $x ; + untie %h ; + +prints this + + Larry Wall is not there + +=head2 Matching Partial Keys + +The BTREE interface has a feature which allows partial keys to be +matched. This functionality is I available when the C method +is used along with the R_CURSOR flag. + + $x->seq($key, $value, R_CURSOR) ; + +Here is the relevant quote from the dbopen man page where it defines +the use of the R_CURSOR flag with seq: + + Note, for the DB_BTREE access method, the returned key is not + necessarily an exact match for the specified key. The returned key + is the smallest key greater than or equal to the specified key, + permitting partial key matches and range searches. + +In the example script below, the C sub uses this feature to find +and print the first matching key/value pair given a partial key. + + use warnings ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($filename, $x, %h, $st, $key, $value) ; + + sub match + { + my $key = shift ; + my $value = 0; + my $orig_key = $key ; + $x->seq($key, $value, R_CURSOR) ; + print "$orig_key\t-> $key\t-> $value\n" ; + } + + $filename = "tree" ; + unlink $filename ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'mouse'} = 'mickey' ; + $h{'Wall'} = 'Larry' ; + $h{'Walls'} = 'Brick' ; + $h{'Smith'} = 'John' ; + + + $key = $value = 0 ; + print "IN ORDER\n" ; + for ($st = $x->seq($key, $value, R_FIRST) ; + $st == 0 ; + $st = $x->seq($key, $value, R_NEXT) ) + + { print "$key -> $value\n" } + + print "\nPARTIAL MATCH\n" ; + + match "Wa" ; + match "A" ; + match "a" ; + + undef $x ; + untie %h ; + +Here is the output: + + IN ORDER + Smith -> John + Wall -> Larry + Walls -> Brick + mouse -> mickey + + PARTIAL MATCH + Wa -> Wall -> Larry + A -> Smith -> John + a -> mouse -> mickey + +=head1 DB_RECNO + +DB_RECNO provides an interface to flat text files. Both variable and +fixed length records are supported. + +In order to make RECNO more compatible with Perl, the array offset for +all RECNO arrays begins at 0 rather than 1 as in Berkeley DB. + +As with normal Perl arrays, a RECNO array can be accessed using +negative indexes. The index -1 refers to the last element of the array, +-2 the second last, and so on. Attempting to access an element before +the start of the array will raise a fatal run-time error. + +=head2 The 'bval' Option + +The operation of the bval option warrants some discussion. Here is the +definition of bval from the Berkeley DB 1.85 recno manual page: + + The delimiting byte to be used to mark the end of a + record for variable-length records, and the pad charac- + ter for fixed-length records. If no value is speci- + fied, newlines (``\n'') are used to mark the end of + variable-length records and fixed-length records are + padded with spaces. + +The second sentence is wrong. In actual fact bval will only default to +C<"\n"> when the openinfo parameter in dbopen is NULL. If a non-NULL +openinfo parameter is used at all, the value that happens to be in bval +will be used. That means you always have to specify bval when making +use of any of the options in the openinfo parameter. This documentation +error will be fixed in the next release of Berkeley DB. + +That clarifies the situation with regards Berkeley DB itself. What +about B? Well, the behavior defined in the quote above is +quite useful, so B conforms to it. + +That means that you can specify other options (e.g. cachesize) and +still have bval default to C<"\n"> for variable length records, and +space for fixed length records. + +Also note that the bval option only allows you to specify a single byte +as a delimiter. + +=head2 A Simple Example + +Here is a simple example that uses RECNO (if you are using a version +of Perl earlier than 5.004_57 this example won't work -- see +L for a workaround). + + use warnings ; + use strict ; + use DB_File ; + + my $filename = "text" ; + unlink $filename ; + + my @h ; + tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_RECNO + or die "Cannot open file 'text': $!\n" ; + + # Add a few key/value pairs to the file + $h[0] = "orange" ; + $h[1] = "blue" ; + $h[2] = "yellow" ; + + push @h, "green", "black" ; + + my $elements = scalar @h ; + print "The array contains $elements entries\n" ; + + my $last = pop @h ; + print "popped $last\n" ; + + unshift @h, "white" ; + my $first = shift @h ; + print "shifted $first\n" ; + + # Check for existence of a key + print "Element 1 Exists with value $h[1]\n" if $h[1] ; + + # use a negative index + print "The last element is $h[-1]\n" ; + print "The 2nd last element is $h[-2]\n" ; + + untie @h ; + +Here is the output from the script: + + The array contains 5 entries + popped black + shifted white + Element 1 Exists with value blue + The last element is green + The 2nd last element is yellow + +=head2 Extra RECNO Methods + +If you are using a version of Perl earlier than 5.004_57, the tied +array interface is quite limited. In the example script above +C, C, C, C +or determining the array length will not work with a tied array. + +To make the interface more useful for older versions of Perl, a number +of methods are supplied with B to simulate the missing array +operations. All these methods are accessed via the object returned from +the tie call. + +Here are the methods: + +=over 5 + +=item B<$X-Epush(list) ;> + +Pushes the elements of C to the end of the array. + +=item B<$value = $X-Epop ;> + +Removes and returns the last element of the array. + +=item B<$X-Eshift> + +Removes and returns the first element of the array. + +=item B<$X-Eunshift(list) ;> + +Pushes the elements of C to the start of the array. + +=item B<$X-Elength> + +Returns the number of elements in the array. + +=item B<$X-Esplice(offset, length, elements);> + +Returns a splice of the array. + +=back + +=head2 Another Example + +Here is a more complete example that makes use of some of the methods +described above. It also makes use of the API interface directly (see +L). + + use warnings ; + use strict ; + my (@h, $H, $file, $i) ; + use DB_File ; + use Fcntl ; + + $file = "text" ; + + unlink $file ; + + $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0666, $DB_RECNO + or die "Cannot open file $file: $!\n" ; + + # first create a text file to play with + $h[0] = "zero" ; + $h[1] = "one" ; + $h[2] = "two" ; + $h[3] = "three" ; + $h[4] = "four" ; + + + # Print the records in order. + # + # The length method is needed here because evaluating a tied + # array in a scalar context does not return the number of + # elements in the array. + + print "\nORIGINAL\n" ; + foreach $i (0 .. $H->length - 1) { + print "$i: $h[$i]\n" ; + } + + # use the push & pop methods + $a = $H->pop ; + $H->push("last") ; + print "\nThe last record was [$a]\n" ; + + # and the shift & unshift methods + $a = $H->shift ; + $H->unshift("first") ; + print "The first record was [$a]\n" ; + + # Use the API to add a new record after record 2. + $i = 2 ; + $H->put($i, "Newbie", R_IAFTER) ; + + # and a new record before record 1. + $i = 1 ; + $H->put($i, "New One", R_IBEFORE) ; + + # delete record 3 + $H->del(3) ; + + # now print the records in reverse order + print "\nREVERSE\n" ; + for ($i = $H->length - 1 ; $i >= 0 ; -- $i) + { print "$i: $h[$i]\n" } + + # same again, but use the API functions instead + print "\nREVERSE again\n" ; + my ($s, $k, $v) = (0, 0, 0) ; + for ($s = $H->seq($k, $v, R_LAST) ; + $s == 0 ; + $s = $H->seq($k, $v, R_PREV)) + { print "$k: $v\n" } + + undef $H ; + untie @h ; + +and this is what it outputs: + + ORIGINAL + 0: zero + 1: one + 2: two + 3: three + 4: four + + The last record was [four] + The first record was [zero] + + REVERSE + 5: last + 4: three + 3: Newbie + 2: one + 1: New One + 0: first + + REVERSE again + 5: last + 4: three + 3: Newbie + 2: one + 1: New One + 0: first + +Notes: + +=over 5 + +=item 1. + +Rather than iterating through the array, C<@h> like this: + + foreach $i (@h) + +it is necessary to use either this: + + foreach $i (0 .. $H->length - 1) + +or this: + + for ($a = $H->get($k, $v, R_FIRST) ; + $a == 0 ; + $a = $H->get($k, $v, R_NEXT) ) + +=item 2. + +Notice that both times the C method was used the record index was +specified using a variable, C<$i>, rather than the literal value +itself. This is because C will return the record number of the +inserted line via that parameter. + +=back + +=head1 THE API INTERFACE + +As well as accessing Berkeley DB using a tied hash or array, it is also +possible to make direct use of most of the API functions defined in the +Berkeley DB documentation. + +To do this you need to store a copy of the object returned from the tie. + + $db = tie %hash, "DB_File", "filename" ; + +Once you have done that, you can access the Berkeley DB API functions +as B methods directly like this: + + $db->put($key, $value, R_NOOVERWRITE) ; + +B If you have saved a copy of the object returned from +C, the underlying database file will I be closed until both +the tied variable is untied and all copies of the saved object are +destroyed. + + use DB_File ; + $db = tie %hash, "DB_File", "filename" + or die "Cannot tie filename: $!" ; + ... + undef $db ; + untie %hash ; + +See L for more details. + +All the functions defined in L are available except for +close() and dbopen() itself. The B method interface to the +supported functions have been implemented to mirror the way Berkeley DB +works whenever possible. In particular note that: + +=over 5 + +=item * + +The methods return a status value. All return 0 on success. +All return -1 to signify an error and set C<$!> to the exact +error code. The return code 1 generally (but not always) means that the +key specified did not exist in the database. + +Other return codes are defined. See below and in the Berkeley DB +documentation for details. The Berkeley DB documentation should be used +as the definitive source. + +=item * + +Whenever a Berkeley DB function returns data via one of its parameters, +the equivalent B method does exactly the same. + +=item * + +If you are careful, it is possible to mix API calls with the tied +hash/array interface in the same piece of code. Although only a few of +the methods used to implement the tied interface currently make use of +the cursor, you should always assume that the cursor has been changed +any time the tied hash/array interface is used. As an example, this +code will probably not do what you expect: + + $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE + or die "Cannot tie $filename: $!" ; + + # Get the first key/value pair and set the cursor + $X->seq($key, $value, R_FIRST) ; + + # this line will modify the cursor + $count = scalar keys %x ; + + # Get the second key/value pair. + # oops, it didn't, it got the last key/value pair! + $X->seq($key, $value, R_NEXT) ; + +The code above can be rearranged to get around the problem, like this: + + $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE + or die "Cannot tie $filename: $!" ; + + # this line will modify the cursor + $count = scalar keys %x ; + + # Get the first key/value pair and set the cursor + $X->seq($key, $value, R_FIRST) ; + + # Get the second key/value pair. + # worked this time. + $X->seq($key, $value, R_NEXT) ; + +=back + +All the constants defined in L for use in the flags parameters +in the methods defined below are also available. Refer to the Berkeley +DB documentation for the precise meaning of the flags values. + +Below is a list of the methods available. + +=over 5 + +=item B<$status = $X-Eget($key, $value [, $flags]) ;> + +Given a key (C<$key>) this method reads the value associated with it +from the database. The value read from the database is returned in the +C<$value> parameter. + +If the key does not exist the method returns 1. + +No flags are currently defined for this method. + +=item B<$status = $X-Eput($key, $value [, $flags]) ;> + +Stores the key/value pair in the database. + +If you use either the R_IAFTER or R_IBEFORE flags, the C<$key> parameter +will have the record number of the inserted key/value pair set. + +Valid flags are R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE and +R_SETCURSOR. + +=item B<$status = $X-Edel($key [, $flags]) ;> + +Removes all key/value pairs with key C<$key> from the database. + +A return code of 1 means that the requested key was not in the +database. + +R_CURSOR is the only valid flag at present. + +=item B<$status = $X-Efd ;> + +Returns the file descriptor for the underlying database. + +See L for an explanation for why you should +not use C to lock your database. + +=item B<$status = $X-Eseq($key, $value, $flags) ;> + +This interface allows sequential retrieval from the database. See +L for full details. + +Both the C<$key> and C<$value> parameters will be set to the key/value +pair read from the database. + +The flags parameter is mandatory. The valid flag values are R_CURSOR, +R_FIRST, R_LAST, R_NEXT and R_PREV. + +=item B<$status = $X-Esync([$flags]) ;> + +Flushes any cached buffers to disk. + +R_RECNOSYNC is the only valid flag at present. + +=back + +=head1 DBM FILTERS + +A DBM Filter is a piece of code that is be used when you I +want to make the same transformation to all keys and/or values in a +DBM database. + +There are four methods associated with DBM Filters. All work identically, +and each is used to install (or uninstall) a single DBM Filter. Each +expects a single parameter, namely a reference to a sub. The only +difference between them is the place that the filter is installed. + +To summarise: + +=over 5 + +=item B + +If a filter has been installed with this method, it will be invoked +every time you write a key to a DBM database. + +=item B + +If a filter has been installed with this method, it will be invoked +every time you write a value to a DBM database. + + +=item B + +If a filter has been installed with this method, it will be invoked +every time you read a key from a DBM database. + +=item B + +If a filter has been installed with this method, it will be invoked +every time you read a value from a DBM database. + +=back + +You can use any combination of the methods, from none, to all four. + +All filter methods return the existing filter, if present, or C +in not. + +To delete a filter pass C to it. + +=head2 The Filter + +When each filter is called by Perl, a local copy of C<$_> will contain +the key or value to be filtered. Filtering is achieved by modifying +the contents of C<$_>. The return code from the filter is ignored. + +=head2 An Example -- the NULL termination problem. + +Consider the following scenario. You have a DBM database +that you need to share with a third-party C application. The C application +assumes that I keys and values are NULL terminated. Unfortunately +when Perl writes to DBM databases it doesn't use NULL termination, so +your Perl application will have to manage NULL termination itself. When +you write to the database you will have to use something like this: + + $hash{"$key\0"} = "$value\0" ; + +Similarly the NULL needs to be taken into account when you are considering +the length of existing keys/values. + +It would be much better if you could ignore the NULL terminations issue +in the main application code and have a mechanism that automatically +added the terminating NULL to all keys and values whenever you write to +the database and have them removed when you read from the database. As I'm +sure you have already guessed, this is a problem that DBM Filters can +fix very easily. + + use warnings ; + use strict ; + use DB_File ; + + my %hash ; + my $filename = "filt" ; + unlink $filename ; + + my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH + or die "Cannot open $filename: $!\n" ; + + # Install DBM Filters + $db->filter_fetch_key ( sub { s/\0$// } ) ; + $db->filter_store_key ( sub { $_ .= "\0" } ) ; + $db->filter_fetch_value( sub { s/\0$// } ) ; + $db->filter_store_value( sub { $_ .= "\0" } ) ; + + $hash{"abc"} = "def" ; + my $a = $hash{"ABC"} ; + # ... + undef $db ; + untie %hash ; + +Hopefully the contents of each of the filters should be +self-explanatory. Both "fetch" filters remove the terminating NULL, +and both "store" filters add a terminating NULL. + + +=head2 Another Example -- Key is a C int. + +Here is another real-life example. By default, whenever Perl writes to +a DBM database it always writes the key and value as strings. So when +you use this: + + $hash{12345} = "something" ; + +the key 12345 will get stored in the DBM database as the 5 byte string +"12345". If you actually want the key to be stored in the DBM database +as a C int, you will have to use C when writing, and C +when reading. + +Here is a DBM Filter that does it: + + use warnings ; + use strict ; + use DB_File ; + my %hash ; + my $filename = "filt" ; + unlink $filename ; + + + my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH + or die "Cannot open $filename: $!\n" ; + + $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ; + $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ; + $hash{123} = "def" ; + # ... + undef $db ; + untie %hash ; + +This time only two filters have been used -- we only need to manipulate +the contents of the key, so it wasn't necessary to install any value +filters. + +=head1 HINTS AND TIPS + + +=head2 Locking: The Trouble with fd + +Until version 1.72 of this module, the recommended technique for locking +B databases was to flock the filehandle returned from the "fd" +function. Unfortunately this technique has been shown to be fundamentally +flawed (Kudos to David Harris for tracking this down). Use it at your own +peril! + +The locking technique went like this. + + $db = tie(%db, 'DB_File', 'foo.db', O_CREAT|O_RDWR, 0644) + || die "dbcreat foo.db $!"; + $fd = $db->fd; + open(DB_FH, "+<&=$fd") || die "dup $!"; + flock (DB_FH, LOCK_EX) || die "flock: $!"; + ... + $db{"Tom"} = "Jerry" ; + ... + flock(DB_FH, LOCK_UN); + undef $db; + untie %db; + close(DB_FH); + +In simple terms, this is what happens: + +=over 5 + +=item 1. + +Use "tie" to open the database. + +=item 2. + +Lock the database with fd & flock. + +=item 3. + +Read & Write to the database. + +=item 4. + +Unlock and close the database. + +=back + +Here is the crux of the problem. A side-effect of opening the B +database in step 2 is that an initial block from the database will get +read from disk and cached in memory. + +To see why this is a problem, consider what can happen when two processes, +say "A" and "B", both want to update the same B database +using the locking steps outlined above. Assume process "A" has already +opened the database and has a write lock, but it hasn't actually updated +the database yet (it has finished step 2, but not started step 3 yet). Now +process "B" tries to open the same database - step 1 will succeed, +but it will block on step 2 until process "A" releases the lock. The +important thing to notice here is that at this point in time both +processes will have cached identical initial blocks from the database. + +Now process "A" updates the database and happens to change some of the +data held in the initial buffer. Process "A" terminates, flushing +all cached data to disk and releasing the database lock. At this point +the database on disk will correctly reflect the changes made by process +"A". + +With the lock released, process "B" can now continue. It also updates the +database and unfortunately it too modifies the data that was in its +initial buffer. Once that data gets flushed to disk it will overwrite +some/all of the changes process "A" made to the database. + +The result of this scenario is at best a database that doesn't contain +what you expect. At worst the database will corrupt. + +The above won't happen every time competing process update the same +B database, but it does illustrate why the technique should +not be used. + +=head2 Safe ways to lock a database + +Starting with version 2.x, Berkeley DB has internal support for locking. +The companion module to this one, B, provides an interface +to this locking functionality. If you are serious about locking +Berkeley DB databases, I strongly recommend using B. + +If using B isn't an option, there are a number of modules +available on CPAN that can be used to implement locking. Each one +implements locking differently and has different goals in mind. It is +therefore worth knowing the difference, so that you can pick the right +one for your application. Here are the three locking wrappers: + +=over 5 + +=item B + +A B wrapper which creates copies of the database file for +read access, so that you have a kind of a multiversioning concurrent read +system. However, updates are still serial. Use for databases where reads +may be lengthy and consistency problems may occur. + +=item B + +A B wrapper that has the ability to lock and unlock the database +while it is being used. Avoids the tie-before-flock problem by simply +re-tie-ing the database when you get or drop a lock. Because of the +flexibility in dropping and re-acquiring the lock in the middle of a +session, this can be massaged into a system that will work with long +updates and/or reads if the application follows the hints in the POD +documentation. + +=item B + +An extremely lightweight B wrapper that simply flocks a lockfile +before tie-ing the database and drops the lock after the untie. Allows +one to use the same lockfile for multiple databases to avoid deadlock +problems, if desired. Use for databases where updates are reads are +quick and simple flock locking semantics are enough. + +=back + +=head2 Sharing Databases With C Applications + +There is no technical reason why a Berkeley DB database cannot be +shared by both a Perl and a C application. + +The vast majority of problems that are reported in this area boil down +to the fact that C strings are NULL terminated, whilst Perl strings are +not. See L for a generic way to work around this problem. + +Here is a real example. Netscape 2.0 keeps a record of the locations you +visit along with the time you last visited them in a DB_HASH database. +This is usually stored in the file F<~/.netscape/history.db>. The key +field in the database is the location string and the value field is the +time the location was last visited stored as a 4 byte binary value. + +If you haven't already guessed, the location string is stored with a +terminating NULL. This means you need to be careful when accessing the +database. + +Here is a snippet of code that is loosely based on Tom Christiansen's +I script (available from your nearest CPAN archive in +F). + + use warnings ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($dotdir, $HISTORY, %hist_db, $href, $binary_time, $date) ; + $dotdir = $ENV{HOME} || $ENV{LOGNAME}; + + $HISTORY = "$dotdir/.netscape/history.db"; + + tie %hist_db, 'DB_File', $HISTORY + or die "Cannot open $HISTORY: $!\n" ;; + + # Dump the complete database + while ( ($href, $binary_time) = each %hist_db ) { + + # remove the terminating NULL + $href =~ s/\x00$// ; + + # convert the binary time into a user friendly string + $date = localtime unpack("V", $binary_time); + print "$date $href\n" ; + } + + # check for the existence of a specific key + # remember to add the NULL + if ( $binary_time = $hist_db{"http://mox.perl.com/\x00"} ) { + $date = localtime unpack("V", $binary_time) ; + print "Last visited mox.perl.com on $date\n" ; + } + else { + print "Never visited mox.perl.com\n" + } + + untie %hist_db ; + +=head2 The untie() Gotcha + +If you make use of the Berkeley DB API, it is I strongly +recommended that you read L. + +Even if you don't currently make use of the API interface, it is still +worth reading it. + +Here is an example which illustrates the problem from a B +perspective: + + use DB_File ; + use Fcntl ; + + my %x ; + my $X ; + + $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_TRUNC + or die "Cannot tie first time: $!" ; + + $x{123} = 456 ; + + untie %x ; + + tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT + or die "Cannot tie second time: $!" ; + + untie %x ; + +When run, the script will produce this error message: + + Cannot tie second time: Invalid argument at bad.file line 14. + +Although the error message above refers to the second tie() statement +in the script, the source of the problem is really with the untie() +statement that precedes it. + +Having read L you will probably have already guessed that the +error is caused by the extra copy of the tied object stored in C<$X>. +If you haven't, then the problem boils down to the fact that the +B destructor, DESTROY, will not be called until I +references to the tied object are destroyed. Both the tied variable, +C<%x>, and C<$X> above hold a reference to the object. The call to +untie() will destroy the first, but C<$X> still holds a valid +reference, so the destructor will not get called and the database file +F will remain open. The fact that Berkeley DB then reports the +attempt to open a database that is already open via the catch-all +"Invalid argument" doesn't help. + +If you run the script with the C<-w> flag the error message becomes: + + untie attempted while 1 inner references still exist at bad.file line 12. + Cannot tie second time: Invalid argument at bad.file line 14. + +which pinpoints the real problem. Finally the script can now be +modified to fix the original problem by destroying the API object +before the untie: + + ... + $x{123} = 456 ; + + undef $X ; + untie %x ; + + $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT + ... + + +=head1 COMMON QUESTIONS + +=head2 Why is there Perl source in my database? + +If you look at the contents of a database file created by DB_File, +there can sometimes be part of a Perl script included in it. + +This happens because Berkeley DB uses dynamic memory to allocate +buffers which will subsequently be written to the database file. Being +dynamic, the memory could have been used for anything before DB +malloced it. As Berkeley DB doesn't clear the memory once it has been +allocated, the unused portions will contain random junk. In the case +where a Perl script gets written to the database, the random junk will +correspond to an area of dynamic memory that happened to be used during +the compilation of the script. + +Unless you don't like the possibility of there being part of your Perl +scripts embedded in a database file, this is nothing to worry about. + +=head2 How do I store complex data structures with DB_File? + +Although B cannot do this directly, there is a module which +can layer transparently over B to accomplish this feat. + +Check out the MLDBM module, available on CPAN in the directory +F. + +=head2 What does "Invalid Argument" mean? + +You will get this error message when one of the parameters in the +C call is wrong. Unfortunately there are quite a few parameters to +get wrong, so it can be difficult to figure out which one it is. + +Here are a couple of possibilities: + +=over 5 + +=item 1. + +Attempting to reopen a database without closing it. + +=item 2. + +Using the O_WRONLY flag. + +=back + +=head2 What does "Bareword 'DB_File' not allowed" mean? + +You will encounter this particular error message when you have the +C pragma (or the full strict pragma) in your script. +Consider this script: + + use warnings ; + use strict ; + use DB_File ; + my %x ; + tie %x, DB_File, "filename" ; + +Running it produces the error in question: + + Bareword "DB_File" not allowed while "strict subs" in use + +To get around the error, place the word C in either single or +double quotes, like this: + + tie %x, "DB_File", "filename" ; + +Although it might seem like a real pain, it is really worth the effort +of having a C in all your scripts. + +=head1 REFERENCES + +Articles that are either about B or make use of it. + +=over 5 + +=item 1. + +I, Tim Kientzle (tkientzle@ddj.com), +Dr. Dobb's Journal, Issue 295, January 1999, pp 34-41 + +=back + +=head1 HISTORY + +Moved to the Changes file. + +=head1 BUGS + +Some older versions of Berkeley DB had problems with fixed length +records using the RECNO file format. This problem has been fixed since +version 1.85 of Berkeley DB. + +I am sure there are bugs in the code. If you do find any, or can +suggest any enhancements, I would welcome your comments. + +=head1 AVAILABILITY + +B comes with the standard Perl source distribution. Look in +the directory F. Given the amount of time between releases +of Perl the version that ships with Perl is quite likely to be out of +date, so the most recent version can always be found on CPAN (see +L for details), in the directory +F. + +This version of B will work with either version 1.x, 2.x or +3.x of Berkeley DB, but is limited to the functionality provided by +version 1. + +The official web site for Berkeley DB is F. +All versions of Berkeley DB are available there. + +Alternatively, Berkeley DB version 1 is available at your nearest CPAN +archive in F. + +=head1 COPYRIGHT + +Copyright (c) 1995-2012 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. + +Although B is covered by the Perl license, the library it +makes use of, namely Berkeley DB, is not. Berkeley DB has its own +copyright and its own license. Please take the time to read it. + +Here are a few words taken from the Berkeley DB FAQ (at +F) regarding the license: + + Do I have to license DB to use it in Perl scripts? + + No. The Berkeley DB license requires that software that uses + Berkeley DB be freely redistributable. In the case of Perl, that + software is Perl, and not your scripts. Any Perl scripts that you + write are your property, including scripts that make use of + Berkeley DB. Neither the Perl license nor the Berkeley DB license + place any restriction on what you may do with them. + +If you are in any doubt about the license situation, contact either the +Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details. + + +=head1 SEE ALSO + +L, L, L, L, L, +L + +=head1 AUTHOR + +The DB_File interface was written by Paul Marquess +Epmqs@cpan.orgE. + +=cut diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File.xs b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.xs new file mode 100644 index 0000000..151ec31 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/DB_File.xs @@ -0,0 +1,2054 @@ +/* + + DB_File.xs -- Perl 5 interface to Berkeley DB + + Written by Paul Marquess + + All comments/suggestions/problems are welcome + + Copyright (c) 1995-2014 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. + + Changes: + 0.1 - Initial Release + 0.2 - No longer bombs out if dbopen returns an error. + 0.3 - Added some support for multiple btree compares + 1.0 - Complete support for multiple callbacks added. + Fixed a problem with pushing a value onto an empty list. + 1.01 - Fixed a SunOS core dump problem. + The return value from TIEHASH wasn't set to NULL when + dbopen returned an error. + 1.02 - Use ALIAS to define TIEARRAY. + Removed some redundant commented code. + Merged OS2 code into the main distribution. + Allow negative subscripts with RECNO interface. + Changed the default flags to O_CREAT|O_RDWR + 1.03 - Added EXISTS + 1.04 - fixed a couple of bugs in hash_cb. Patches supplied by + Dave Hammen, hammen@gothamcity.jsc.nasa.gov + 1.05 - Added logic to allow prefix & hash types to be specified via + Makefile.PL + 1.06 - Minor namespace cleanup: Localized PrintBtree. + 1.07 - Fixed bug with RECNO, where bval wasn't defaulting to "\n". + 1.08 - No change to DB_File.xs + 1.09 - Default mode for dbopen changed to 0666 + 1.10 - Fixed fd method so that it still returns -1 for + in-memory files when db 1.86 is used. + 1.11 - No change to DB_File.xs + 1.12 - No change to DB_File.xs + 1.13 - Tidied up a few casts. + 1.14 - Made it illegal to tie an associative array to a RECNO + database and an ordinary array to a HASH or BTREE database. + 1.50 - Make work with both DB 1.x or DB 2.x + 1.51 - Fixed a bug in mapping 1.x O_RDONLY flag to 2.x DB_RDONLY equivalent + 1.52 - Patch from Gisle Aas to suppress "use of + undefined value" warning with db_get and db_seq. + 1.53 - Added DB_RENUMBER to flags for recno. + 1.54 - Fixed bug in the fd method + 1.55 - Fix for AIX from Jarkko Hietaniemi + 1.56 - No change to DB_File.xs + 1.57 - added the #undef op to allow building with Threads support. + 1.58 - Fixed a problem with the use of sv_setpvn. When the + size is specified as 0, it does a strlen on the data. + This was ok for DB 1.x, but isn't for DB 2.x. + 1.59 - No change to DB_File.xs + 1.60 - Some code tidy up + 1.61 - added flagSet macro for DB 2.5.x + fixed typo in O_RDONLY test. + 1.62 - No change to DB_File.xs + 1.63 - Fix to alllow DB 2.6.x to build. + 1.64 - Tidied up the 1.x to 2.x flags mapping code. + Added a patch from Mark Kettenis + to fix a flag mapping problem with O_RDONLY on the Hurd + 1.65 - Fixed a bug in the PUSH logic. + Added BOOT check that using 2.3.4 or greater + 1.66 - Added DBM filter code + 1.67 - Backed off the use of newSVpvn. + Fixed DBM Filter code for Perl 5.004. + Fixed a small memory leak in the filter code. + 1.68 - fixed backward compatibility bug with R_IAFTER & R_IBEFORE + merged in the 5.005_58 changes + 1.69 - fixed a bug in push -- DB_APPEND wasn't working properly. + Fixed the R_SETCURSOR bug introduced in 1.68 + Added a new Perl variable $DB_File::db_ver + 1.70 - Initialise $DB_File::db_ver and $DB_File::db_version with + GV_ADD|GV_ADDMULT -- bug spotted by Nick Ing-Simmons. + Added a BOOT check to test for equivalent versions of db.h & + libdb.a/so. + 1.71 - Support for Berkeley DB version 3. + Support for Berkeley DB 2/3's backward compatibility mode. + Rewrote push + 1.72 - No change to DB_File.xs + 1.73 - No change to DB_File.xs + 1.74 - A call to open needed parenthesised to stop it clashing + with a win32 macro. + Added Perl core patches 7703 & 7801. + 1.75 - Fixed Perl core patch 7703. + Added support to allow DB_File to be built with + Berkeley DB 3.2 -- btree_compare, btree_prefix and hash_cb + needed to be changed. + 1.76 - No change to DB_File.xs + 1.77 - Tidied up a few types used in calling newSVpvn. + 1.78 - Core patch 10335, 10372, 10534, 10549, 11051 included. + 1.79 - NEXTKEY ignores the input key. + Added lots of casts + 1.800 - Moved backward compatibility code into ppport.h. + Use the new constants code. + 1.801 - No change to DB_File.xs + 1.802 - No change to DB_File.xs + 1.803 - FETCH, STORE & DELETE don't map the flags parameter + into the equivalent Berkeley DB function anymore. + 1.804 - no change. + 1.805 - recursion detection added to the callbacks + Support for 4.1.X added. + Filter code can now cope with read-only $_ + 1.806 - recursion detection beefed up. + 1.807 - no change + 1.808 - leak fixed in ParseOpenInfo + 1.809 - no change + 1.810 - no change + 1.811 - no change + 1.812 - no change + 1.813 - no change + 1.814 - no change + 1.814 - C++ casting fixes + +*/ + +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#ifdef _NOT_CORE +# include "ppport.h" +#endif + +int DB_File___unused() { return 0; } + +/* Mention DB_VERSION_MAJOR_CFG, DB_VERSION_MINOR_CFG, and + DB_VERSION_PATCH_CFG here so that Configure pulls them all in. */ + +/* Being the Berkeley DB we prefer the (which will be + * shortly #included by the ) __attribute__ to the possibly + * already defined __attribute__, for example by GNUC or by Perl. */ + +/* #if DB_VERSION_MAJOR_CFG < 2 */ +#ifndef DB_VERSION_MAJOR +# undef __attribute__ +#endif + +#ifdef COMPAT185 +# include +#else + +/* Uncomment one of the lines below */ +/* See the section "At least one secondary cursor must be specified to DB->join" + in the README file for the circumstances where you need to uncomment one + of the two lines below. +*/ + +/* #define time_t __time64_t */ +/* #define time_t __time32_t */ + +# include +#endif + +#ifndef PERL_UNUSED_ARG +# define PERL_UNUSED_ARG(x) ((void)x) +#endif + +/* Wall starts with 5.7.x */ + +#if PERL_REVISION > 5 || (PERL_REVISION == 5 && PERL_VERSION >= 7) + +/* Since we dropped the gccish definition of __attribute__ we will want + * to redefine dNOOP, however (so that dTHX continues to work). Yes, + * all this means that we can't do attribute checking on the DB_File, + * boo, hiss. */ +# ifndef DB_VERSION_MAJOR + +# undef dNOOP +# ifdef __cplusplus +# define dNOOP (void)0 +# else +# define dNOOP extern int DB_File___notused() +# endif + + /* Ditto for dXSARGS. */ +# undef dXSARGS +# define dXSARGS \ + dSP; dMARK; \ + I32 ax = mark - PL_stack_base + 1; \ + I32 items = sp - mark + +# endif + +/* avoid -Wall; DB_File xsubs never make use of `ix' setup for ALIASes */ +# undef dXSI32 +# define dXSI32 dNOOP + +#endif /* Perl >= 5.7 */ + +#include + +/* #define TRACE */ + +#ifdef TRACE +# define Trace(x) printf x +#else +# define Trace(x) +#endif + + +#define DBT_clear(x) Zero(&x, 1, DBT) ; + +#ifdef DB_VERSION_MAJOR + +#if DB_VERSION_MAJOR == 2 +# define BERKELEY_DB_1_OR_2 +#endif + +#if DB_VERSION_MAJOR > 3 || (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR >= 2) +# define AT_LEAST_DB_3_2 +#endif + +#if DB_VERSION_MAJOR > 3 || (DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR >= 3) +# define AT_LEAST_DB_3_3 +#endif + +#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1) +# define AT_LEAST_DB_4_1 +#endif + +#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 3) +# define AT_LEAST_DB_4_3 +#endif + +#if DB_VERSION_MAJOR >= 6 +# define AT_LEAST_DB_6_0 +#endif + +#ifdef AT_LEAST_DB_3_3 +# define WANT_ERROR +#endif + +/* map version 2 features & constants onto their version 1 equivalent */ + +#ifdef DB_Prefix_t +# undef DB_Prefix_t +#endif +#define DB_Prefix_t size_t + +#ifdef DB_Hash_t +# undef DB_Hash_t +#endif +#define DB_Hash_t u_int32_t + +/* DBTYPE stays the same */ +/* HASHINFO, RECNOINFO and BTREEINFO map to DB_INFO */ +#if DB_VERSION_MAJOR == 2 + typedef DB_INFO INFO ; +#else /* DB_VERSION_MAJOR > 2 */ +# define DB_FIXEDLEN (0x8000) +#endif /* DB_VERSION_MAJOR == 2 */ + +/* version 2 has db_recno_t in place of recno_t */ +typedef db_recno_t recno_t; + + +#define R_CURSOR DB_SET_RANGE +#define R_FIRST DB_FIRST +#define R_IAFTER DB_AFTER +#define R_IBEFORE DB_BEFORE +#define R_LAST DB_LAST +#define R_NEXT DB_NEXT +#define R_NOOVERWRITE DB_NOOVERWRITE +#define R_PREV DB_PREV + +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5 +# define R_SETCURSOR 0x800000 +#else +# define R_SETCURSOR (-100) +#endif + +#define R_RECNOSYNC 0 +#define R_FIXEDLEN DB_FIXEDLEN +#define R_DUP DB_DUP + + +#define db_HA_hash h_hash +#define db_HA_ffactor h_ffactor +#define db_HA_nelem h_nelem +#define db_HA_bsize db_pagesize +#define db_HA_cachesize db_cachesize +#define db_HA_lorder db_lorder + +#define db_BT_compare bt_compare +#define db_BT_prefix bt_prefix +#define db_BT_flags flags +#define db_BT_psize db_pagesize +#define db_BT_cachesize db_cachesize +#define db_BT_lorder db_lorder +#define db_BT_maxkeypage +#define db_BT_minkeypage + + +#define db_RE_reclen re_len +#define db_RE_flags flags +#define db_RE_bval re_pad +#define db_RE_bfname re_source +#define db_RE_psize db_pagesize +#define db_RE_cachesize db_cachesize +#define db_RE_lorder db_lorder + +#define TXN NULL, + +#define do_SEQ(db, key, value, flag) (db->cursor->c_get)(db->cursor, &key, &value, flag) + + +#define DBT_flags(x) x.flags = 0 +#define DB_flags(x, v) x |= v + +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 5 +# define flagSet(flags, bitmask) ((flags) & (bitmask)) +#else +# define flagSet(flags, bitmask) (((flags) & DB_OPFLAGS_MASK) == (u_int)(bitmask)) +#endif + +#else /* db version 1.x */ + +#define BERKELEY_DB_1 +#define BERKELEY_DB_1_OR_2 + +typedef union INFO { + HASHINFO hash ; + RECNOINFO recno ; + BTREEINFO btree ; + } INFO ; + + +#ifdef mDB_Prefix_t +# ifdef DB_Prefix_t +# undef DB_Prefix_t +# endif +# define DB_Prefix_t mDB_Prefix_t +#endif + +#ifdef mDB_Hash_t +# ifdef DB_Hash_t +# undef DB_Hash_t +# endif +# define DB_Hash_t mDB_Hash_t +#endif + +#define db_HA_hash hash.hash +#define db_HA_ffactor hash.ffactor +#define db_HA_nelem hash.nelem +#define db_HA_bsize hash.bsize +#define db_HA_cachesize hash.cachesize +#define db_HA_lorder hash.lorder + +#define db_BT_compare btree.compare +#define db_BT_prefix btree.prefix +#define db_BT_flags btree.flags +#define db_BT_psize btree.psize +#define db_BT_cachesize btree.cachesize +#define db_BT_lorder btree.lorder +#define db_BT_maxkeypage btree.maxkeypage +#define db_BT_minkeypage btree.minkeypage + +#define db_RE_reclen recno.reclen +#define db_RE_flags recno.flags +#define db_RE_bval recno.bval +#define db_RE_bfname recno.bfname +#define db_RE_psize recno.psize +#define db_RE_cachesize recno.cachesize +#define db_RE_lorder recno.lorder + +#define TXN + +#define do_SEQ(db, key, value, flag) (db->dbp->seq)(db->dbp, &key, &value, flag) +#define DBT_flags(x) +#define DB_flags(x, v) +#define flagSet(flags, bitmask) ((flags) & (bitmask)) + +#endif /* db version 1 */ + + + +#define db_DELETE(db, key, flags) ((db->dbp)->del)(db->dbp, TXN &key, 0) +#define db_STORE(db, key, value, flags) ((db->dbp)->put)(db->dbp, TXN &key, &value, 0) +#define db_FETCH(db, key, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, 0) + +#define db_sync(db, flags) ((db->dbp)->sync)(db->dbp, flags) +#define db_get(db, key, value, flags) ((db->dbp)->get)(db->dbp, TXN &key, &value, flags) + +#ifdef DB_VERSION_MAJOR +#define db_DESTROY(db) (!db->aborted && ( db->cursor->c_close(db->cursor),\ + (db->dbp->close)(db->dbp, 0) )) +#define db_close(db) ((db->dbp)->close)(db->dbp, 0) +#define db_del(db, key, flags) (flagSet(flags, R_CURSOR) \ + ? ((db->cursor)->c_del)(db->cursor, 0) \ + : ((db->dbp)->del)(db->dbp, NULL, &key, flags) ) + +#else /* ! DB_VERSION_MAJOR */ + +#define db_DESTROY(db) (!db->aborted && ((db->dbp)->close)(db->dbp)) +#define db_close(db) ((db->dbp)->close)(db->dbp) +#define db_del(db, key, flags) ((db->dbp)->del)(db->dbp, &key, flags) +#define db_put(db, key, value, flags) ((db->dbp)->put)(db->dbp, &key, &value, flags) + +#endif /* ! DB_VERSION_MAJOR */ + + +#define db_seq(db, key, value, flags) do_SEQ(db, key, value, flags) + +typedef struct { + DBTYPE type ; + DB * dbp ; + SV * compare ; + bool in_compare ; + SV * prefix ; + bool in_prefix ; + SV * hash ; + bool in_hash ; + bool aborted ; + int in_memory ; +#ifdef BERKELEY_DB_1_OR_2 + INFO info ; +#endif +#ifdef DB_VERSION_MAJOR + DBC * cursor ; +#endif + SV * filter_fetch_key ; + SV * filter_store_key ; + SV * filter_fetch_value ; + SV * filter_store_value ; + int filtering ; + + } DB_File_type; + +typedef DB_File_type * DB_File ; +typedef DBT DBTKEY ; + +#define my_sv_setpvn(sv, d, s) sv_setpvn(sv, (s ? d : (const char *)""), s) + +#define OutputValue(arg, name) \ + { if (RETVAL == 0) { \ + SvGETMAGIC(arg) ; \ + my_sv_setpvn(arg, (const char *)name.data, name.size) ; \ + TAINT; \ + SvTAINTED_on(arg); \ + SvUTF8_off(arg); \ + DBM_ckFilter(arg, filter_fetch_value,"filter_fetch_value") ; \ + } \ + } + +#define OutputKey(arg, name) \ + { if (RETVAL == 0) \ + { \ + SvGETMAGIC(arg) ; \ + if (db->type != DB_RECNO) { \ + my_sv_setpvn(arg, (const char *)name.data, name.size); \ + } \ + else \ + sv_setiv(arg, (I32)*(I32*)name.data - 1); \ + TAINT; \ + SvTAINTED_on(arg); \ + SvUTF8_off(arg); \ + DBM_ckFilter(arg, filter_fetch_key,"filter_fetch_key") ; \ + } \ + } + +#define my_SvUV32(sv) ((u_int32_t)SvUV(sv)) + +#ifdef CAN_PROTOTYPE +extern void __getBerkeleyDBInfo(void); +#endif + +/* Internal Global Data */ + +#define MY_CXT_KEY "DB_File::_guts" XS_VERSION + +typedef struct { + recno_t x_Value; + recno_t x_zero; + DB_File x_CurrentDB; + DBTKEY x_empty; +} my_cxt_t; + +START_MY_CXT + +#define Value (MY_CXT.x_Value) +#define zero (MY_CXT.x_zero) +#define CurrentDB (MY_CXT.x_CurrentDB) +#define empty (MY_CXT.x_empty) + +#define ERR_BUFF "DB_File::Error" + +#ifdef DB_VERSION_MAJOR + +static int +#ifdef CAN_PROTOTYPE +db_put(DB_File db, DBTKEY key, DBT value, u_int flags) +#else +db_put(db, key, value, flags) +DB_File db ; +DBTKEY key ; +DBT value ; +u_int flags ; +#endif +{ + int status ; + + if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) { + DBC * temp_cursor ; + DBT l_key, l_value; + +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 + if (((db->dbp)->cursor)(db->dbp, NULL, &temp_cursor) != 0) +#else + if (((db->dbp)->cursor)(db->dbp, NULL, &temp_cursor, 0) != 0) +#endif + return (-1) ; + + memset(&l_key, 0, sizeof(l_key)); + l_key.data = key.data; + l_key.size = key.size; + memset(&l_value, 0, sizeof(l_value)); + l_value.data = value.data; + l_value.size = value.size; + + if ( temp_cursor->c_get(temp_cursor, &l_key, &l_value, DB_SET) != 0) { + (void)temp_cursor->c_close(temp_cursor); + return (-1); + } + + status = temp_cursor->c_put(temp_cursor, &key, &value, flags); + (void)temp_cursor->c_close(temp_cursor); + + return (status) ; + } + + + if (flagSet(flags, R_CURSOR)) { + return ((db->cursor)->c_put)(db->cursor, &key, &value, DB_CURRENT); + } + + if (flagSet(flags, R_SETCURSOR)) { + if ((db->dbp)->put(db->dbp, NULL, &key, &value, 0) != 0) + return -1 ; + return ((db->cursor)->c_get)(db->cursor, &key, &value, DB_SET_RANGE); + + } + + return ((db->dbp)->put)(db->dbp, NULL, &key, &value, flags) ; + +} + +#endif /* DB_VERSION_MAJOR */ + +static void +tidyUp(DB_File db) +{ + db->aborted = TRUE ; +} + + +static int + +#ifdef AT_LEAST_DB_6_0 +#ifdef CAN_PROTOTYPE +btree_compare(DB * db, const DBT *key1, const DBT *key2, size_t* locp) +#else +btree_compare(db, key1, key2, locp) +DB * db ; +const DBT * key1 ; +const DBT * key2 ; +size_t* locp; +#endif /* CAN_PROTOTYPE */ + +#else /* Berkeley DB < 6.0 */ +#ifdef AT_LEAST_DB_3_2 + +#ifdef CAN_PROTOTYPE +btree_compare(DB * db, const DBT *key1, const DBT *key2) +#else +btree_compare(db, key1, key2) +DB * db ; +const DBT * key1 ; +const DBT * key2 ; +#endif /* CAN_PROTOTYPE */ + +#else /* Berkeley DB < 3.2 */ + +#ifdef CAN_PROTOTYPE +btree_compare(const DBT *key1, const DBT *key2) +#else +btree_compare(key1, key2) +const DBT * key1 ; +const DBT * key2 ; +#endif + +#endif +#endif + +{ +#ifdef dTHX + dTHX; +#endif + dSP ; + dMY_CXT ; + void * data1, * data2 ; + int retval ; + int count ; + +#ifdef AT_LEAST_DB_3_2 + PERL_UNUSED_ARG(db); +#endif + + if (CurrentDB->in_compare) { + tidyUp(CurrentDB); + croak ("DB_File btree_compare: recursion detected\n") ; + } + + data1 = (char *) key1->data ; + data2 = (char *) key2->data ; + +#ifndef newSVpvn + /* As newSVpv will assume that the data pointer is a null terminated C + string if the size parameter is 0, make sure that data points to an + empty string if the length is 0 + */ + if (key1->size == 0) + data1 = "" ; + if (key2->size == 0) + data2 = "" ; +#endif + + ENTER ; + SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_compare = FALSE; + SAVEINT(CurrentDB->in_compare); + CurrentDB->in_compare = TRUE; + + PUSHMARK(SP) ; + EXTEND(SP,2) ; + PUSHs(sv_2mortal(newSVpvn((const char*)data1,key1->size))); + PUSHs(sv_2mortal(newSVpvn((const char*)data2,key2->size))); + PUTBACK ; + + count = perl_call_sv(CurrentDB->compare, G_SCALAR); + + SPAGAIN ; + + if (count != 1){ + tidyUp(CurrentDB); + croak ("DB_File btree_compare: expected 1 return value from compare sub, got %d\n", count) ; + } + + retval = POPi ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + + return (retval) ; + +} + +static DB_Prefix_t +#ifdef AT_LEAST_DB_3_2 + +#ifdef CAN_PROTOTYPE +btree_prefix(DB * db, const DBT *key1, const DBT *key2) +#else +btree_prefix(db, key1, key2) +Db * db ; +const DBT * key1 ; +const DBT * key2 ; +#endif + +#else /* Berkeley DB < 3.2 */ + +#ifdef CAN_PROTOTYPE +btree_prefix(const DBT *key1, const DBT *key2) +#else +btree_prefix(key1, key2) +const DBT * key1 ; +const DBT * key2 ; +#endif + +#endif +{ +#ifdef dTHX + dTHX; +#endif + dSP ; + dMY_CXT ; + char * data1, * data2 ; + int retval ; + int count ; + +#ifdef AT_LEAST_DB_3_2 + PERL_UNUSED_ARG(db); +#endif + + if (CurrentDB->in_prefix){ + tidyUp(CurrentDB); + croak ("DB_File btree_prefix: recursion detected\n") ; + } + + data1 = (char *) key1->data ; + data2 = (char *) key2->data ; + +#ifndef newSVpvn + /* As newSVpv will assume that the data pointer is a null terminated C + string if the size parameter is 0, make sure that data points to an + empty string if the length is 0 + */ + if (key1->size == 0) + data1 = "" ; + if (key2->size == 0) + data2 = "" ; +#endif + + ENTER ; + SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_prefix = FALSE; + SAVEINT(CurrentDB->in_prefix); + CurrentDB->in_prefix = TRUE; + + PUSHMARK(SP) ; + EXTEND(SP,2) ; + PUSHs(sv_2mortal(newSVpvn(data1,key1->size))); + PUSHs(sv_2mortal(newSVpvn(data2,key2->size))); + PUTBACK ; + + count = perl_call_sv(CurrentDB->prefix, G_SCALAR); + + SPAGAIN ; + + if (count != 1){ + tidyUp(CurrentDB); + croak ("DB_File btree_prefix: expected 1 return value from prefix sub, got %d\n", count) ; + } + + retval = POPi ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + + return (retval) ; +} + + +#ifdef BERKELEY_DB_1 +# define HASH_CB_SIZE_TYPE size_t +#else +# define HASH_CB_SIZE_TYPE u_int32_t +#endif + +static DB_Hash_t +#ifdef AT_LEAST_DB_3_2 + +#ifdef CAN_PROTOTYPE +hash_cb(DB * db, const void *data, u_int32_t size) +#else +hash_cb(db, data, size) +DB * db ; +const void * data ; +HASH_CB_SIZE_TYPE size ; +#endif + +#else /* Berkeley DB < 3.2 */ + +#ifdef CAN_PROTOTYPE +hash_cb(const void *data, HASH_CB_SIZE_TYPE size) +#else +hash_cb(data, size) +const void * data ; +HASH_CB_SIZE_TYPE size ; +#endif + +#endif +{ +#ifdef dTHX + dTHX; +#endif + dSP ; + dMY_CXT; + int retval = 0; + int count ; + +#ifdef AT_LEAST_DB_3_2 + PERL_UNUSED_ARG(db); +#endif + + if (CurrentDB->in_hash){ + tidyUp(CurrentDB); + croak ("DB_File hash callback: recursion detected\n") ; + } + +#ifndef newSVpvn + if (size == 0) + data = "" ; +#endif + + /* DGH - Next two lines added to fix corrupted stack problem */ + ENTER ; + SAVETMPS; + SAVESPTR(CurrentDB); + CurrentDB->in_hash = FALSE; + SAVEINT(CurrentDB->in_hash); + CurrentDB->in_hash = TRUE; + + PUSHMARK(SP) ; + + + XPUSHs(sv_2mortal(newSVpvn((char*)data,size))); + PUTBACK ; + + count = perl_call_sv(CurrentDB->hash, G_SCALAR); + + SPAGAIN ; + + if (count != 1){ + tidyUp(CurrentDB); + croak ("DB_File hash_cb: expected 1 return value from hash sub, got %d\n", count) ; + } + + retval = POPi ; + + PUTBACK ; + FREETMPS ; + LEAVE ; + + return (retval) ; +} + +#ifdef WANT_ERROR + +static void +#ifdef AT_LEAST_DB_4_3 +db_errcall_cb(const DB_ENV* dbenv, const char * db_errpfx, const char * buffer) +#else +db_errcall_cb(const char * db_errpfx, char * buffer) +#endif +{ +#ifdef dTHX + dTHX; +#endif + SV * sv = perl_get_sv(ERR_BUFF, FALSE) ; +#ifdef AT_LEAST_DB_4_3 + PERL_UNUSED_ARG(dbenv); +#endif + if (sv) { + if (db_errpfx) + sv_setpvf(sv, "%s: %s", db_errpfx, buffer) ; + else + sv_setpv(sv, buffer) ; + } +} +#endif + +#if defined(TRACE) && defined(BERKELEY_DB_1_OR_2) + +static void +#ifdef CAN_PROTOTYPE +PrintHash(INFO *hash) +#else +PrintHash(hash) +INFO * hash ; +#endif +{ + printf ("HASH Info\n") ; + printf (" hash = %s\n", + (hash->db_HA_hash != NULL ? "redefined" : "default")) ; + printf (" bsize = %d\n", hash->db_HA_bsize) ; + printf (" ffactor = %d\n", hash->db_HA_ffactor) ; + printf (" nelem = %d\n", hash->db_HA_nelem) ; + printf (" cachesize = %d\n", hash->db_HA_cachesize) ; + printf (" lorder = %d\n", hash->db_HA_lorder) ; + +} + +static void +#ifdef CAN_PROTOTYPE +PrintRecno(INFO *recno) +#else +PrintRecno(recno) +INFO * recno ; +#endif +{ + printf ("RECNO Info\n") ; + printf (" flags = %d\n", recno->db_RE_flags) ; + printf (" cachesize = %d\n", recno->db_RE_cachesize) ; + printf (" psize = %d\n", recno->db_RE_psize) ; + printf (" lorder = %d\n", recno->db_RE_lorder) ; + printf (" reclen = %lu\n", (unsigned long)recno->db_RE_reclen) ; + printf (" bval = %d 0x%x\n", recno->db_RE_bval, recno->db_RE_bval) ; + printf (" bfname = %d [%s]\n", recno->db_RE_bfname, recno->db_RE_bfname) ; +} + +static void +#ifdef CAN_PROTOTYPE +PrintBtree(INFO *btree) +#else +PrintBtree(btree) +INFO * btree ; +#endif +{ + printf ("BTREE Info\n") ; + printf (" compare = %s\n", + (btree->db_BT_compare ? "redefined" : "default")) ; + printf (" prefix = %s\n", + (btree->db_BT_prefix ? "redefined" : "default")) ; + printf (" flags = %d\n", btree->db_BT_flags) ; + printf (" cachesize = %d\n", btree->db_BT_cachesize) ; + printf (" psize = %d\n", btree->db_BT_psize) ; +#ifndef DB_VERSION_MAJOR + printf (" maxkeypage = %d\n", btree->db_BT_maxkeypage) ; + printf (" minkeypage = %d\n", btree->db_BT_minkeypage) ; +#endif + printf (" lorder = %d\n", btree->db_BT_lorder) ; +} + +#else + +#define PrintRecno(recno) +#define PrintHash(hash) +#define PrintBtree(btree) + +#endif /* TRACE */ + + +static I32 +#ifdef CAN_PROTOTYPE +GetArrayLength(pTHX_ DB_File db) +#else +GetArrayLength(db) +DB_File db ; +#endif +{ + DBT key ; + DBT value ; + int RETVAL ; + + DBT_clear(key) ; + DBT_clear(value) ; + RETVAL = do_SEQ(db, key, value, R_LAST) ; + if (RETVAL == 0) + RETVAL = *(I32 *)key.data ; + else /* No key means empty file */ + RETVAL = 0 ; + + return ((I32)RETVAL) ; +} + +static recno_t +#ifdef CAN_PROTOTYPE +GetRecnoKey(pTHX_ DB_File db, I32 value) +#else +GetRecnoKey(db, value) +DB_File db ; +I32 value ; +#endif +{ + if (value < 0) { + /* Get the length of the array */ + I32 length = GetArrayLength(aTHX_ db) ; + + /* check for attempt to write before start of array */ + if (length + value + 1 <= 0) { + tidyUp(db); + croak("Modification of non-creatable array value attempted, subscript %ld", (long)value) ; + } + + value = length + value + 1 ; + } + else + ++ value ; + + return value ; +} + + +static DB_File +#ifdef CAN_PROTOTYPE +ParseOpenInfo(pTHX_ int isHASH, char *name, int flags, int mode, SV *sv) +#else +ParseOpenInfo(isHASH, name, flags, mode, sv) +int isHASH ; +char * name ; +int flags ; +int mode ; +SV * sv ; +#endif +{ + +#ifdef BERKELEY_DB_1_OR_2 /* Berkeley DB Version 1 or 2 */ + + SV ** svp; + HV * action ; + DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ; + void * openinfo = NULL ; + INFO * info = &RETVAL->info ; + STRLEN n_a; + dMY_CXT; + +#ifdef TRACE + printf("In ParseOpenInfo name=[%s] flags=[%d] mode=[%d] SV NULL=[%d]\n", + name, flags, mode, sv == NULL) ; +#endif + Zero(RETVAL, 1, DB_File_type) ; + + /* Default to HASH */ + RETVAL->filtering = 0 ; + RETVAL->filter_fetch_key = RETVAL->filter_store_key = + RETVAL->filter_fetch_value = RETVAL->filter_store_value = + RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; + RETVAL->type = DB_HASH ; + + /* DGH - Next line added to avoid SEGV on existing hash DB */ + CurrentDB = RETVAL; + + /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */ + RETVAL->in_memory = (name == NULL) ; + + if (sv) + { + if (! SvROK(sv) ) + croak ("type parameter is not a reference") ; + + svp = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ; + if (svp && SvOK(*svp)) + action = (HV*) SvRV(*svp) ; + else + croak("internal error") ; + + if (sv_isa(sv, "DB_File::HASHINFO")) + { + + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_HASH database") ; + + RETVAL->type = DB_HASH ; + openinfo = (void*)info ; + + svp = hv_fetch(action, "hash", 4, FALSE); + + if (svp && SvOK(*svp)) + { + info->db_HA_hash = hash_cb ; + RETVAL->hash = newSVsv(*svp) ; + } + else + info->db_HA_hash = NULL ; + + svp = hv_fetch(action, "ffactor", 7, FALSE); + info->db_HA_ffactor = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "nelem", 5, FALSE); + info->db_HA_nelem = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "bsize", 5, FALSE); + info->db_HA_bsize = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "cachesize", 9, FALSE); + info->db_HA_cachesize = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "lorder", 6, FALSE); + info->db_HA_lorder = svp ? SvIV(*svp) : 0; + + PrintHash(info) ; + } + else if (sv_isa(sv, "DB_File::BTREEINFO")) + { + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_BTREE database"); + + RETVAL->type = DB_BTREE ; + openinfo = (void*)info ; + + svp = hv_fetch(action, "compare", 7, FALSE); + if (svp && SvOK(*svp)) + { + info->db_BT_compare = btree_compare ; + RETVAL->compare = newSVsv(*svp) ; + } + else + info->db_BT_compare = NULL ; + + svp = hv_fetch(action, "prefix", 6, FALSE); + if (svp && SvOK(*svp)) + { + info->db_BT_prefix = btree_prefix ; + RETVAL->prefix = newSVsv(*svp) ; + } + else + info->db_BT_prefix = NULL ; + + svp = hv_fetch(action, "flags", 5, FALSE); + info->db_BT_flags = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "cachesize", 9, FALSE); + info->db_BT_cachesize = svp ? SvIV(*svp) : 0; + +#ifndef DB_VERSION_MAJOR + svp = hv_fetch(action, "minkeypage", 10, FALSE); + info->btree.minkeypage = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "maxkeypage", 10, FALSE); + info->btree.maxkeypage = svp ? SvIV(*svp) : 0; +#endif + + svp = hv_fetch(action, "psize", 5, FALSE); + info->db_BT_psize = svp ? SvIV(*svp) : 0; + + svp = hv_fetch(action, "lorder", 6, FALSE); + info->db_BT_lorder = svp ? SvIV(*svp) : 0; + + PrintBtree(info) ; + + } + else if (sv_isa(sv, "DB_File::RECNOINFO")) + { + if (isHASH) + croak("DB_File can only tie an array to a DB_RECNO database"); + + RETVAL->type = DB_RECNO ; + openinfo = (void *)info ; + + info->db_RE_flags = 0 ; + + svp = hv_fetch(action, "flags", 5, FALSE); + info->db_RE_flags = (u_long) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "reclen", 6, FALSE); + info->db_RE_reclen = (size_t) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "cachesize", 9, FALSE); + info->db_RE_cachesize = (u_int) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "psize", 5, FALSE); + info->db_RE_psize = (u_int) (svp ? SvIV(*svp) : 0); + + svp = hv_fetch(action, "lorder", 6, FALSE); + info->db_RE_lorder = (int) (svp ? SvIV(*svp) : 0); + +#ifdef DB_VERSION_MAJOR + info->re_source = name ; + name = NULL ; +#endif + svp = hv_fetch(action, "bfname", 6, FALSE); + if (svp && SvOK(*svp)) { + char * ptr = SvPV(*svp,n_a) ; +#ifdef DB_VERSION_MAJOR + name = (char*) n_a ? ptr : NULL ; +#else + info->db_RE_bfname = (char*) (n_a ? ptr : NULL) ; +#endif + } + else +#ifdef DB_VERSION_MAJOR + name = NULL ; +#else + info->db_RE_bfname = NULL ; +#endif + + svp = hv_fetch(action, "bval", 4, FALSE); +#ifdef DB_VERSION_MAJOR + if (svp && SvOK(*svp)) + { + int value ; + if (SvPOK(*svp)) + value = (int)*SvPV(*svp, n_a) ; + else + value = SvIV(*svp) ; + + if (info->flags & DB_FIXEDLEN) { + info->re_pad = value ; + info->flags |= DB_PAD ; + } + else { + info->re_delim = value ; + info->flags |= DB_DELIMITER ; + } + + } +#else + if (svp && SvOK(*svp)) + { + if (SvPOK(*svp)) + info->db_RE_bval = (u_char)*SvPV(*svp, n_a) ; + else + info->db_RE_bval = (u_char)(unsigned long) SvIV(*svp) ; + DB_flags(info->flags, DB_DELIMITER) ; + + } + else + { + if (info->db_RE_flags & R_FIXEDLEN) + info->db_RE_bval = (u_char) ' ' ; + else + info->db_RE_bval = (u_char) '\n' ; + DB_flags(info->flags, DB_DELIMITER) ; + } +#endif + +#ifdef DB_RENUMBER + info->flags |= DB_RENUMBER ; +#endif + + PrintRecno(info) ; + } + else + croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); + } + + + /* OS2 Specific Code */ +#ifdef OS2 +#ifdef __EMX__ + flags |= O_BINARY; +#endif /* __EMX__ */ +#endif /* OS2 */ + +#ifdef DB_VERSION_MAJOR + + { + int Flags = 0 ; + int status ; + + /* Map 1.x flags to 2.x flags */ + if ((flags & O_CREAT) == O_CREAT) + Flags |= DB_CREATE ; + +#if O_RDONLY == 0 + if (flags == O_RDONLY) +#else + if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR) +#endif + Flags |= DB_RDONLY ; + +#ifdef O_TRUNC + if ((flags & O_TRUNC) == O_TRUNC) + Flags |= DB_TRUNCATE ; +#endif + + status = db_open(name, RETVAL->type, Flags, mode, NULL, (DB_INFO*)openinfo, &RETVAL->dbp) ; + if (status == 0) +#if DB_VERSION_MAJOR == 2 && DB_VERSION_MINOR < 6 + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor) ; +#else + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, + 0) ; +#endif + + if (status) + RETVAL->dbp = NULL ; + + } +#else + +#if defined(DB_LIBRARY_COMPATIBILITY_API) && DB_VERSION_MAJOR > 2 + RETVAL->dbp = __db185_open(name, flags, mode, RETVAL->type, openinfo) ; +#else + RETVAL->dbp = dbopen(name, flags, mode, RETVAL->type, openinfo) ; +#endif /* DB_LIBRARY_COMPATIBILITY_API */ + +#endif + + return (RETVAL) ; + +#else /* Berkeley DB Version > 2 */ + + SV ** svp; + HV * action ; + DB_File RETVAL = (DB_File)safemalloc(sizeof(DB_File_type)) ; + DB * dbp ; + STRLEN n_a; + int status ; + dMY_CXT; + +/* printf("In ParseOpenInfo name=[%s] flags=[%d] mode = [%d]\n", name, flags, mode) ; */ + Zero(RETVAL, 1, DB_File_type) ; + + /* Default to HASH */ + RETVAL->filtering = 0 ; + RETVAL->filter_fetch_key = RETVAL->filter_store_key = + RETVAL->filter_fetch_value = RETVAL->filter_store_value = + RETVAL->hash = RETVAL->compare = RETVAL->prefix = NULL ; + RETVAL->type = DB_HASH ; + + /* DGH - Next line added to avoid SEGV on existing hash DB */ + CurrentDB = RETVAL; + + /* fd for 1.86 hash in memory files doesn't return -1 like 1.85 */ + RETVAL->in_memory = (name == NULL) ; + + status = db_create(&RETVAL->dbp, NULL,0) ; + /* printf("db_create returned %d %s\n", status, db_strerror(status)) ; */ + if (status) { + RETVAL->dbp = NULL ; + return (RETVAL) ; + } + dbp = RETVAL->dbp ; + +#ifdef WANT_ERROR + RETVAL->dbp->set_errcall(RETVAL->dbp, db_errcall_cb) ; +#endif + if (sv) + { + if (! SvROK(sv) ) + croak ("type parameter is not a reference") ; + + svp = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ; + if (svp && SvOK(*svp)) + action = (HV*) SvRV(*svp) ; + else + croak("internal error") ; + + if (sv_isa(sv, "DB_File::HASHINFO")) + { + + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_HASH database") ; + + RETVAL->type = DB_HASH ; + + svp = hv_fetch(action, "hash", 4, FALSE); + + if (svp && SvOK(*svp)) + { + (void)dbp->set_h_hash(dbp, hash_cb) ; + RETVAL->hash = newSVsv(*svp) ; + } + + svp = hv_fetch(action, "ffactor", 7, FALSE); + if (svp) + (void)dbp->set_h_ffactor(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "nelem", 5, FALSE); + if (svp) + (void)dbp->set_h_nelem(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "bsize", 5, FALSE); + if (svp) + (void)dbp->set_pagesize(dbp, my_SvUV32(*svp)); + + svp = hv_fetch(action, "cachesize", 9, FALSE); + if (svp) + (void)dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; + + svp = hv_fetch(action, "lorder", 6, FALSE); + if (svp) + (void)dbp->set_lorder(dbp, (int)SvIV(*svp)) ; + + PrintHash(info) ; + } + else if (sv_isa(sv, "DB_File::BTREEINFO")) + { + if (!isHASH) + croak("DB_File can only tie an associative array to a DB_BTREE database"); + + RETVAL->type = DB_BTREE ; + + svp = hv_fetch(action, "compare", 7, FALSE); + if (svp && SvOK(*svp)) + { + (void)dbp->set_bt_compare(dbp, btree_compare) ; + RETVAL->compare = newSVsv(*svp) ; + } + + svp = hv_fetch(action, "prefix", 6, FALSE); + if (svp && SvOK(*svp)) + { + (void)dbp->set_bt_prefix(dbp, btree_prefix) ; + RETVAL->prefix = newSVsv(*svp) ; + } + + svp = hv_fetch(action, "flags", 5, FALSE); + if (svp) + (void)dbp->set_flags(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "cachesize", 9, FALSE); + if (svp) + (void)dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; + + svp = hv_fetch(action, "psize", 5, FALSE); + if (svp) + (void)dbp->set_pagesize(dbp, my_SvUV32(*svp)) ; + + svp = hv_fetch(action, "lorder", 6, FALSE); + if (svp) + (void)dbp->set_lorder(dbp, (int)SvIV(*svp)) ; + + PrintBtree(info) ; + + } + else if (sv_isa(sv, "DB_File::RECNOINFO")) + { + int fixed = FALSE ; + + if (isHASH) + croak("DB_File can only tie an array to a DB_RECNO database"); + + RETVAL->type = DB_RECNO ; + + svp = hv_fetch(action, "flags", 5, FALSE); + if (svp) { + int flags = SvIV(*svp) ; + /* remove FIXDLEN, if present */ + if (flags & DB_FIXEDLEN) { + fixed = TRUE ; + flags &= ~DB_FIXEDLEN ; + } + } + + svp = hv_fetch(action, "cachesize", 9, FALSE); + if (svp) { + status = dbp->set_cachesize(dbp, 0, my_SvUV32(*svp), 0) ; + } + + svp = hv_fetch(action, "psize", 5, FALSE); + if (svp) { + status = dbp->set_pagesize(dbp, my_SvUV32(*svp)) ; + } + + svp = hv_fetch(action, "lorder", 6, FALSE); + if (svp) { + status = dbp->set_lorder(dbp, (int)SvIV(*svp)) ; + } + + svp = hv_fetch(action, "bval", 4, FALSE); + if (svp && SvOK(*svp)) + { + int value ; + if (SvPOK(*svp)) + value = (int)*SvPV(*svp, n_a) ; + else + value = (int)SvIV(*svp) ; + + if (fixed) { + status = dbp->set_re_pad(dbp, value) ; + } + else { + status = dbp->set_re_delim(dbp, value) ; + } + + } + + if (fixed) { + svp = hv_fetch(action, "reclen", 6, FALSE); + if (svp) { + u_int32_t len = my_SvUV32(*svp) ; + status = dbp->set_re_len(dbp, len) ; + } + } + + if (name != NULL) { + status = dbp->set_re_source(dbp, name) ; + name = NULL ; + } + + svp = hv_fetch(action, "bfname", 6, FALSE); + if (svp && SvOK(*svp)) { + char * ptr = SvPV(*svp,n_a) ; + name = (char*) n_a ? ptr : NULL ; + } + else + name = NULL ; + + + status = dbp->set_flags(dbp, (u_int32_t)DB_RENUMBER) ; + + if (flags){ + (void)dbp->set_flags(dbp, (u_int32_t)flags) ; + } + PrintRecno(info) ; + } + else + croak("type is not of type DB_File::HASHINFO, DB_File::BTREEINFO or DB_File::RECNOINFO"); + } + + { + u_int32_t Flags = 0 ; + int status ; + + /* Map 1.x flags to 3.x flags */ + if ((flags & O_CREAT) == O_CREAT) + Flags |= DB_CREATE ; + +#if O_RDONLY == 0 + if (flags == O_RDONLY) +#else + if ((flags & O_RDONLY) == O_RDONLY && (flags & O_RDWR) != O_RDWR) +#endif + Flags |= DB_RDONLY ; + +#ifdef O_TRUNC + if ((flags & O_TRUNC) == O_TRUNC) + Flags |= DB_TRUNCATE ; +#endif + +#ifdef AT_LEAST_DB_4_4 + /* need this for recno */ + if ((flags & O_TRUNC) == O_TRUNC) + Flags |= DB_CREATE ; +#endif + +#ifdef AT_LEAST_DB_4_1 + status = (RETVAL->dbp->open)(RETVAL->dbp, NULL, name, NULL, RETVAL->type, + Flags, mode) ; +#else + status = (RETVAL->dbp->open)(RETVAL->dbp, name, NULL, RETVAL->type, + Flags, mode) ; +#endif + /* printf("open returned %d %s\n", status, db_strerror(status)) ; */ + + if (status == 0) { + + status = (RETVAL->dbp->cursor)(RETVAL->dbp, NULL, &RETVAL->cursor, + 0) ; + /* printf("cursor returned %d %s\n", status, db_strerror(status)) ; */ + } + + if (status) + { + db_close(RETVAL); /* close **dbp handle to prevent mem.leak */ + RETVAL->dbp = NULL ; + } + + } + + return (RETVAL) ; + +#endif /* Berkeley DB Version > 2 */ + +} /* ParseOpenInfo */ + + +#include "constants.h" + +MODULE = DB_File PACKAGE = DB_File PREFIX = db_ + +INCLUDE: constants.xs + +BOOT: + { +#ifdef dTHX + dTHX; +#endif +#ifdef WANT_ERROR + SV * sv_err = perl_get_sv(ERR_BUFF, GV_ADD|GV_ADDMULTI) ; +#endif + MY_CXT_INIT; +#ifdef WANT_ERROR + PERL_UNUSED_VAR(sv_err); /* huh? we just retrieved it... */ +#endif + __getBerkeleyDBInfo() ; + + DBT_clear(empty) ; + empty.data = &zero ; + empty.size = sizeof(recno_t) ; + } + + + +DB_File +db_DoTie_(isHASH, dbtype, name=undef, flags=O_CREAT|O_RDWR, mode=0666, type=DB_HASH) + int isHASH + char * dbtype + int flags + int mode + CODE: + { + char * name = (char *) NULL ; + SV * sv = (SV *) NULL ; + STRLEN n_a; + + if (items >= 3 && SvOK(ST(2))) + name = (char*) SvPV(ST(2), n_a) ; + + if (items == 6) + sv = ST(5) ; + + RETVAL = ParseOpenInfo(aTHX_ isHASH, name, flags, mode, sv) ; + Trace(("db_DoTie_ %p\n", RETVAL)); + if (RETVAL->dbp == NULL) { + Safefree(RETVAL); + RETVAL = NULL ; + } + } + OUTPUT: + RETVAL + +int +db_DESTROY(db) + DB_File db + PREINIT: + dMY_CXT; + INIT: + CurrentDB = db ; + Trace(("DESTROY %p\n", db)); + CLEANUP: + Trace(("DESTROY %p done\n", db)); + if (db->hash) + SvREFCNT_dec(db->hash) ; + if (db->compare) + SvREFCNT_dec(db->compare) ; + if (db->prefix) + SvREFCNT_dec(db->prefix) ; + if (db->filter_fetch_key) + SvREFCNT_dec(db->filter_fetch_key) ; + if (db->filter_store_key) + SvREFCNT_dec(db->filter_store_key) ; + if (db->filter_fetch_value) + SvREFCNT_dec(db->filter_fetch_value) ; + if (db->filter_store_value) + SvREFCNT_dec(db->filter_store_value) ; + safefree(db) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; +#endif + + +int +db_DELETE(db, key, flags=0) + DB_File db + DBTKEY key + u_int flags + PREINIT: + dMY_CXT; + INIT: + (void)flags; + CurrentDB = db ; + + +int +db_EXISTS(db, key) + DB_File db + DBTKEY key + PREINIT: + dMY_CXT; + CODE: + { + DBT value ; + + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = (((db->dbp)->get)(db->dbp, TXN &key, &value, 0) == 0) ; + } + OUTPUT: + RETVAL + +void +db_FETCH(db, key, flags=0) + DB_File db + DBTKEY key + u_int flags + PREINIT: + dMY_CXT ; + int RETVAL ; + CODE: + { + DBT value ; + + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = db_get(db, key, value, flags) ; + ST(0) = sv_newmortal(); + OutputValue(ST(0), value) + } + +int +db_STORE(db, key, value, flags=0) + DB_File db + DBTKEY key + DBT value + u_int flags + PREINIT: + dMY_CXT; + INIT: + (void)flags; + CurrentDB = db ; + + +void +db_FIRSTKEY(db) + DB_File db + PREINIT: + dMY_CXT ; + int RETVAL ; + CODE: + { + DBTKEY key ; + DBT value ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = do_SEQ(db, key, value, R_FIRST) ; + ST(0) = sv_newmortal(); + OutputKey(ST(0), key) ; + } + +void +db_NEXTKEY(db, key) + DB_File db + DBTKEY key = NO_INIT + PREINIT: + dMY_CXT ; + int RETVAL ; + CODE: + { + DBT value ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + RETVAL = do_SEQ(db, key, value, R_NEXT) ; + ST(0) = sv_newmortal(); + OutputKey(ST(0), key) ; + } + +# +# These would be nice for RECNO +# + +int +unshift(db, ...) + DB_File db + ALIAS: UNSHIFT = 1 + PREINIT: + dMY_CXT; + CODE: + { + DBTKEY key ; + DBT value ; + int i ; + int One ; + STRLEN n_a; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; +#ifdef DB_VERSION_MAJOR + /* get the first value */ + RETVAL = do_SEQ(db, key, value, DB_FIRST) ; + RETVAL = 0 ; +#else + RETVAL = -1 ; +#endif + for (i = items-1 ; i > 0 ; --i) + { + DBM_ckFilter(ST(i), filter_store_value, "filter_store_value"); + value.data = SvPVbyte(ST(i), n_a) ; + value.size = n_a ; + One = 1 ; + key.data = &One ; + key.size = sizeof(int) ; +#ifdef DB_VERSION_MAJOR + RETVAL = (db->cursor->c_put)(db->cursor, &key, &value, DB_BEFORE) ; +#else + RETVAL = (db->dbp->put)(db->dbp, &key, &value, R_IBEFORE) ; +#endif + if (RETVAL != 0) + break; + } + } + OUTPUT: + RETVAL + +void +pop(db) + DB_File db + PREINIT: + dMY_CXT; + ALIAS: POP = 1 + PREINIT: + I32 RETVAL; + CODE: + { + DBTKEY key ; + DBT value ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + + /* First get the final value */ + RETVAL = do_SEQ(db, key, value, R_LAST) ; + ST(0) = sv_newmortal(); + /* Now delete it */ + if (RETVAL == 0) + { + /* the call to del will trash value, so take a copy now */ + OutputValue(ST(0), value) ; + RETVAL = db_del(db, key, R_CURSOR) ; + if (RETVAL != 0) + sv_setsv(ST(0), &PL_sv_undef); + } + } + +void +shift(db) + DB_File db + PREINIT: + dMY_CXT; + ALIAS: SHIFT = 1 + PREINIT: + I32 RETVAL; + CODE: + { + DBT value ; + DBTKEY key ; + + DBT_clear(key) ; + DBT_clear(value) ; + CurrentDB = db ; + /* get the first value */ + RETVAL = do_SEQ(db, key, value, R_FIRST) ; + ST(0) = sv_newmortal(); + /* Now delete it */ + if (RETVAL == 0) + { + /* the call to del will trash value, so take a copy now */ + OutputValue(ST(0), value) ; + RETVAL = db_del(db, key, R_CURSOR) ; + if (RETVAL != 0) + sv_setsv (ST(0), &PL_sv_undef) ; + } + } + + +I32 +push(db, ...) + DB_File db + PREINIT: + dMY_CXT; + ALIAS: PUSH = 1 + CODE: + { + DBTKEY key ; + DBT value ; + DB * Db = db->dbp ; + int i ; + STRLEN n_a; + int keyval ; + + DBT_flags(key) ; + DBT_flags(value) ; + CurrentDB = db ; + /* Set the Cursor to the Last element */ + RETVAL = do_SEQ(db, key, value, R_LAST) ; +#ifndef DB_VERSION_MAJOR + if (RETVAL >= 0) +#endif + { + if (RETVAL == 0) + keyval = *(int*)key.data ; + else + keyval = 0 ; + for (i = 1 ; i < items ; ++i) + { + DBM_ckFilter(ST(i), filter_store_value, "filter_store_value"); + value.data = SvPVbyte(ST(i), n_a) ; + value.size = n_a ; + ++ keyval ; + key.data = &keyval ; + key.size = sizeof(int) ; + RETVAL = (Db->put)(Db, TXN &key, &value, 0) ; + if (RETVAL != 0) + break; + } + } + } + OUTPUT: + RETVAL + +I32 +length(db) + DB_File db + PREINIT: + dMY_CXT; + ALIAS: FETCHSIZE = 1 + CODE: + CurrentDB = db ; + RETVAL = GetArrayLength(aTHX_ db) ; + OUTPUT: + RETVAL + + +# +# Now provide an interface to the rest of the DB functionality +# + +int +db_del(db, key, flags=0) + DB_File db + DBTKEY key + u_int flags + PREINIT: + dMY_CXT; + CODE: + CurrentDB = db ; + RETVAL = db_del(db, key, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_NOTFOUND) + RETVAL = 1 ; +#endif + OUTPUT: + RETVAL + + +int +db_get(db, key, value, flags=0) + DB_File db + DBTKEY key + DBT value = NO_INIT + u_int flags + PREINIT: + dMY_CXT; + CODE: + CurrentDB = db ; + DBT_clear(value) ; + RETVAL = db_get(db, key, value, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_NOTFOUND) + RETVAL = 1 ; +#endif + OUTPUT: + RETVAL + value + +int +db_put(db, key, value, flags=0) + DB_File db + DBTKEY key + DBT value + u_int flags + PREINIT: + dMY_CXT; + CODE: + CurrentDB = db ; + RETVAL = db_put(db, key, value, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_KEYEXIST) + RETVAL = 1 ; +#endif + OUTPUT: + RETVAL + key if (flagSet(flags, R_IAFTER) || flagSet(flags, R_IBEFORE)) OutputKey(ST(1), key); + +int +db_fd(db) + DB_File db + PREINIT: + dMY_CXT ; + CODE: + CurrentDB = db ; +#ifdef DB_VERSION_MAJOR + RETVAL = -1 ; + { + int status = 0 ; + status = (db->in_memory + ? -1 + : ((db->dbp)->fd)(db->dbp, &RETVAL) ) ; + if (status != 0) + RETVAL = -1 ; + } +#else + RETVAL = (db->in_memory + ? -1 + : ((db->dbp)->fd)(db->dbp) ) ; +#endif + OUTPUT: + RETVAL + +int +db_sync(db, flags=0) + DB_File db + u_int flags + PREINIT: + dMY_CXT; + CODE: + CurrentDB = db ; + RETVAL = db_sync(db, flags) ; +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; +#endif + OUTPUT: + RETVAL + + +int +db_seq(db, key, value, flags) + DB_File db + DBTKEY key + DBT value = NO_INIT + u_int flags + PREINIT: + dMY_CXT; + CODE: + CurrentDB = db ; + DBT_clear(value) ; + RETVAL = db_seq(db, key, value, flags); +#ifdef DB_VERSION_MAJOR + if (RETVAL > 0) + RETVAL = -1 ; + else if (RETVAL == DB_NOTFOUND) + RETVAL = 1 ; +#endif + OUTPUT: + RETVAL + key + value + +SV * +filter_fetch_key(db, code) + DB_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_fetch_key, code) ; + +SV * +filter_store_key(db, code) + DB_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_store_key, code) ; + +SV * +filter_fetch_value(db, code) + DB_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_fetch_value, code) ; + +SV * +filter_store_value(db, code) + DB_File db + SV * code + SV * RETVAL = &PL_sv_undef ; + CODE: + DBM_setFilter(db->filter_store_value, code) ; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/DB_File_BS b/fastSum/resources/ROUGE/DB_File-1.835/DB_File_BS new file mode 100644 index 0000000..9282c49 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/DB_File_BS @@ -0,0 +1,6 @@ +# NeXT needs /usr/lib/libposix.a to load along with DB_File.so +if ( $dlsrc eq "dl_next.xs" ) { + @DynaLoader::dl_resolve_using = ( '/usr/lib/libposix.a' ); +} + +1; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/MANIFEST b/fastSum/resources/ROUGE/DB_File-1.835/MANIFEST new file mode 100644 index 0000000..e460e81 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/MANIFEST @@ -0,0 +1,33 @@ +Changes +DB_File.pm +DB_File.xs +DB_File_BS +MANIFEST +Makefile.PL +README +config.in +dbinfo +fallback.h +fallback.xs +hints/dynixptx.pl +hints/sco.pl +patches/5.004 +patches/5.004_01 +patches/5.004_02 +patches/5.004_03 +patches/5.004_04 +patches/5.004_05 +patches/5.005 +patches/5.005_01 +patches/5.005_02 +patches/5.005_03 +patches/5.6.0 +ppport.h +t/db-btree.t +t/db-hash.t +t/db-recno.t +t/pod.t +typemap +version.c +META.yml Module meta-data (added by MakeMaker) +META.json Module JSON meta-data (added by MakeMaker) diff --git a/fastSum/resources/ROUGE/DB_File-1.835/META.json b/fastSum/resources/ROUGE/DB_File-1.835/META.json new file mode 100644 index 0000000..7f97561 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/META.json @@ -0,0 +1,39 @@ +{ + "abstract" : "Perl5 access to Berkeley DB version 1.x", + "author" : [ + "Paul Marquess " + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DB_File", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.835" +} diff --git a/fastSum/resources/ROUGE/DB_File-1.835/META.yml b/fastSum/resources/ROUGE/DB_File-1.835/META.yml new file mode 100644 index 0000000..9e50fef --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/META.yml @@ -0,0 +1,21 @@ +--- +abstract: 'Perl5 access to Berkeley DB version 1.x' +author: + - 'Paul Marquess ' +build_requires: + ExtUtils::MakeMaker: 0 +configure_requires: + ExtUtils::MakeMaker: 0 +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: 1.4 +name: DB_File +no_index: + directory: + - t + - inc +requires: {} +version: 1.835 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/MYMETA.json b/fastSum/resources/ROUGE/DB_File-1.835/MYMETA.json new file mode 100644 index 0000000..b678a28 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/MYMETA.json @@ -0,0 +1,39 @@ +{ + "abstract" : "Perl5 access to Berkeley DB version 1.x", + "author" : [ + "Paul Marquess " + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150, CPAN::Meta::Converter version 2.150001", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DB_File", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.835" +} diff --git a/fastSum/resources/ROUGE/DB_File-1.835/MYMETA.yml b/fastSum/resources/ROUGE/DB_File-1.835/MYMETA.yml new file mode 100644 index 0000000..7931fef --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/MYMETA.yml @@ -0,0 +1,21 @@ +--- +abstract: 'Perl5 access to Berkeley DB version 1.x' +author: + - 'Paul Marquess ' +build_requires: + ExtUtils::MakeMaker: '0' +configure_requires: + ExtUtils::MakeMaker: '0' +dynamic_config: 0 +generated_by: 'ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150, CPAN::Meta::Converter version 2.150001' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: DB_File +no_index: + directory: + - t + - inc +requires: {} +version: '1.835' diff --git a/fastSum/resources/ROUGE/DB_File-1.835/Makefile b/fastSum/resources/ROUGE/DB_File-1.835/Makefile new file mode 100644 index 0000000..2c33b52 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/Makefile @@ -0,0 +1,1082 @@ +# This Makefile is for the DB_File extension to perl. +# +# It was generated automatically by MakeMaker version +# 7.0401 (Revision: 70401) from the contents of +# Makefile.PL. Don't edit this file, edit Makefile.PL instead. +# +# ANY CHANGES MADE HERE WILL BE LOST! +# +# MakeMaker ARGV: () +# + +# MakeMaker Parameters: + +# ABSTRACT_FROM => q[DB_File.pm] +# AUTHOR => [q[Paul Marquess ]] +# BUILD_REQUIRES => { } +# CONFIGURE_REQUIRES => { } +# DEFINE => q[-D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t ] +# INC => q[-I/usr/local/BerkeleyDB/include] +# INSTALLDIRS => q[site] +# LIBS => [q[-L/usr/local/BerkeleyDB/lib -ldb]] +# LICENSE => q[perl] +# NAME => q[DB_File] +# OBJECT => q[version$(OBJ_EXT) DB_File$(OBJ_EXT)] +# PREREQ_PM => { } +# TEST_REQUIRES => { } +# VERSION_FROM => q[DB_File.pm] +# XSPROTOARG => q[-noprototypes] +# XS_VERSION => q[1.835] +# clean => { FILES=>q[constants.h constants.xs DB_File.pm.bak t/db-btree.t.bak t/db-hash.t.bak t/db-recno.t.bak t/pod.t.bak] } +# depend => { Makefile=>q[config.in], version$(OBJ_EXT)=>q[version.c] } +# dist => { COMPRESS=>q[gzip], DIST_DEFAULT=>q[MyDoubleCheck tardist], SUFFIX=>q[gz] } +# macro => { my_files=>q[DB_File.pm t/db-btree.t t/db-hash.t t/db-recno.t t/pod.t] } + +# --- MakeMaker post_initialize section: + + +# --- MakeMaker const_config section: + +# These definitions are from config.sh (via /usr/lib/x86_64-linux-gnu/perl/5.22/Config.pm). +# They may have been overridden via Makefile.PL or on the command line. +AR = ar +CC = x86_64-linux-gnu-gcc +CCCDLFLAGS = -fPIC +CCDLFLAGS = -Wl,-E +DLEXT = so +DLSRC = dl_dlopen.xs +EXE_EXT = +FULL_AR = /usr/bin/ar +LD = x86_64-linux-gnu-gcc +LDDLFLAGS = -shared -L/usr/local/lib -fstack-protector-strong +LDFLAGS = -fstack-protector-strong -L/usr/local/lib +LIBC = libc-2.23.so +LIB_EXT = .a +OBJ_EXT = .o +OSNAME = linux +OSVERS = 3.16.0 +RANLIB = : +SITELIBEXP = /usr/local/share/perl/5.22.1 +SITEARCHEXP = /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 +SO = so +VENDORARCHEXP = /usr/lib/x86_64-linux-gnu/perl5/5.22 +VENDORLIBEXP = /usr/share/perl5 + + +# --- MakeMaker constants section: +AR_STATIC_ARGS = cr +DIRFILESEP = / +DFSEP = $(DIRFILESEP) +NAME = DB_File +NAME_SYM = DB_File +VERSION = 1.835 +VERSION_MACRO = VERSION +VERSION_SYM = 1_835 +DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\" +XS_VERSION = 1.835 +XS_VERSION_MACRO = XS_VERSION +XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\" +INST_ARCHLIB = blib/arch +INST_SCRIPT = blib/script +INST_BIN = blib/bin +INST_LIB = blib/lib +INST_MAN1DIR = blib/man1 +INST_MAN3DIR = blib/man3 +MAN1EXT = 1p +MAN3EXT = 3pm +INSTALLDIRS = site +DESTDIR = +PREFIX = $(SITEPREFIX) +PERLPREFIX = /usr +SITEPREFIX = /usr/local +VENDORPREFIX = /usr +INSTALLPRIVLIB = /usr/share/perl/5.22 +DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB) +INSTALLSITELIB = /usr/local/share/perl/5.22.1 +DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB) +INSTALLVENDORLIB = /usr/share/perl5 +DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB) +INSTALLARCHLIB = /usr/lib/x86_64-linux-gnu/perl/5.22 +DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB) +INSTALLSITEARCH = /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 +DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH) +INSTALLVENDORARCH = /usr/lib/x86_64-linux-gnu/perl5/5.22 +DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH) +INSTALLBIN = /usr/bin +DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN) +INSTALLSITEBIN = /usr/local/bin +DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN) +INSTALLVENDORBIN = /usr/bin +DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN) +INSTALLSCRIPT = /usr/bin +DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT) +INSTALLSITESCRIPT = /usr/local/bin +DESTINSTALLSITESCRIPT = $(DESTDIR)$(INSTALLSITESCRIPT) +INSTALLVENDORSCRIPT = /usr/bin +DESTINSTALLVENDORSCRIPT = $(DESTDIR)$(INSTALLVENDORSCRIPT) +INSTALLMAN1DIR = /usr/share/man/man1 +DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR) +INSTALLSITEMAN1DIR = /usr/local/man/man1 +DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR) +INSTALLVENDORMAN1DIR = /usr/share/man/man1 +DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR) +INSTALLMAN3DIR = /usr/share/man/man3 +DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR) +INSTALLSITEMAN3DIR = /usr/local/man/man3 +DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR) +INSTALLVENDORMAN3DIR = /usr/share/man/man3 +DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR) +PERL_LIB = /usr/share/perl/5.22 +PERL_ARCHLIB = /usr/lib/x86_64-linux-gnu/perl/5.22 +PERL_ARCHLIBDEP = /usr/lib/x86_64-linux-gnu/perl/5.22 +LIBPERL_A = libperl.a +FIRST_MAKEFILE = Makefile +MAKEFILE_OLD = Makefile.old +MAKE_APERL_FILE = Makefile.aperl +PERLMAINCC = $(CC) +PERL_INC = /usr/lib/x86_64-linux-gnu/perl/5.22/CORE +PERL_INCDEP = /usr/lib/x86_64-linux-gnu/perl/5.22/CORE +PERL = "/usr/bin/perl" +FULLPERL = "/usr/bin/perl" +ABSPERL = $(PERL) +PERLRUN = $(PERL) +FULLPERLRUN = $(FULLPERL) +ABSPERLRUN = $(ABSPERL) +PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" +FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" +ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" +PERL_CORE = 0 +PERM_DIR = 755 +PERM_RW = 644 +PERM_RWX = 755 + +MAKEMAKER = /usr/share/perl/5.22/ExtUtils/MakeMaker.pm +MM_VERSION = 7.0401 +MM_REVISION = 70401 + +# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). +# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) +# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) +# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. +MAKE = make +FULLEXT = DB_File +BASEEXT = DB_File +PARENT_NAME = +DLBASE = $(BASEEXT) +VERSION_FROM = DB_File.pm +INC = -I/usr/local/BerkeleyDB/include +DEFINE = -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t +OBJECT = version$(OBJ_EXT) DB_File$(OBJ_EXT) +LDFROM = $(OBJECT) +LINKTYPE = dynamic +BOOTDEP = DB_File_BS + +# Handy lists of source code files: +XS_FILES = DB_File.xs \ + constants.xs \ + fallback.xs +C_FILES = DB_File.c \ + constants.c \ + fallback.c \ + version.c +O_FILES = DB_File.o \ + constants.o \ + fallback.o \ + version.o +H_FILES = constants.h \ + fallback.h \ + ppport.h +MAN1PODS = +MAN3PODS = DB_File.pm + +# Where is the Config information that we are using/depend on +CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_INCDEP)$(DFSEP)config.h + +# Where to build things +INST_LIBDIR = $(INST_LIB) +INST_ARCHLIBDIR = $(INST_ARCHLIB) + +INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT) +INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT) + +INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT) +INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT) +INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs + +# Extra linker info +EXPORT_LIST = +PERL_ARCHIVE = +PERL_ARCHIVEDEP = +PERL_ARCHIVE_AFTER = + + +TO_INST_PM = DB_File.pm + +PM_TO_BLIB = DB_File.pm \ + $(INST_LIB)/DB_File.pm + + +# --- MakeMaker platform_constants section: +MM_Unix_VERSION = 7.0401 +PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc + + +# --- MakeMaker tool_autosplit section: +# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto +AUTOSPLITFILE = $(ABSPERLRUN) -e 'use AutoSplit; autosplit($$$$ARGV[0], $$$$ARGV[1], 0, 1, 1)' -- + + + +# --- MakeMaker tool_xsubpp section: + +XSUBPPDIR = /usr/share/perl/5.22/ExtUtils +XSUBPP = "$(XSUBPPDIR)$(DFSEP)xsubpp" +XSUBPPRUN = $(PERLRUN) $(XSUBPP) +XSPROTOARG = -noprototypes +XSUBPPDEPS = /usr/share/perl/5.22/ExtUtils/typemap typemap /usr/share/perl/5.22/ExtUtils$(DFSEP)xsubpp +XSUBPPARGS = -typemap "/usr/share/perl/5.22/ExtUtils/typemap" -typemap "typemap" +XSUBPP_EXTRA_ARGS = + + +# --- MakeMaker tools_other section: +SHELL = /bin/sh +CHMOD = chmod +CP = cp +MV = mv +NOOP = $(TRUE) +NOECHO = @ +RM_F = rm -f +RM_RF = rm -rf +TEST_F = test -f +TOUCH = touch +UMASK_NULL = umask 0 +DEV_NULL = > /dev/null 2>&1 +MKPATH = $(ABSPERLRUN) -MExtUtils::Command -e 'mkpath' -- +EQUALIZE_TIMESTAMP = $(ABSPERLRUN) -MExtUtils::Command -e 'eqtime' -- +FALSE = false +TRUE = true +ECHO = echo +ECHO_N = echo -n +UNINST = 0 +VERBINST = 0 +MOD_INSTALL = $(ABSPERLRUN) -MExtUtils::Install -e 'install([ from_to => {@ARGV}, verbose => '\''$(VERBINST)'\'', uninstall_shadows => '\''$(UNINST)'\'', dir_mode => '\''$(PERM_DIR)'\'' ]);' -- +DOC_INSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'perllocal_install' -- +UNINSTALL = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'uninstall' -- +WARN_IF_OLD_PACKLIST = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'warn_if_old_packlist' -- +MACROSTART = +MACROEND = +USEMAKEFILE = -f +FIXIN = $(ABSPERLRUN) -MExtUtils::MY -e 'MY->fixin(shift)' -- +CP_NONEMPTY = $(ABSPERLRUN) -MExtUtils::Command::MM -e 'cp_nonempty' -- + + +# --- MakeMaker makemakerdflt section: +makemakerdflt : all + $(NOECHO) $(NOOP) + + +# --- MakeMaker dist section: +TAR = tar +TARFLAGS = cvf +ZIP = zip +ZIPFLAGS = -r +COMPRESS = gzip +SUFFIX = .gz +SHAR = shar +PREOP = $(NOECHO) $(NOOP) +POSTOP = $(NOECHO) $(NOOP) +TO_UNIX = $(NOECHO) $(NOOP) +CI = ci -u +RCS_LABEL = rcs -Nv$(VERSION_SYM): -q +DIST_CP = best +DIST_DEFAULT = MyDoubleCheck tardist +DISTNAME = DB_File +DISTVNAME = DB_File-1.835 + + +# --- MakeMaker macro section: +my_files = DB_File.pm t/db-btree.t t/db-hash.t t/db-recno.t t/pod.t + + +# --- MakeMaker depend section: +Makefile : config.in +version$(OBJ_EXT) : version.c + + +# --- MakeMaker cflags section: + +CCFLAGS = -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +OPTIMIZE = -O2 -g +PERLTYPE = +MPOLLUTE = + + +# --- MakeMaker const_loadlibs section: + +# DB_File might depend on some other libraries: +# See ExtUtils::Liblist for details +# +EXTRALIBS = -ldb +LDLOADLIBS = -ldb +BSLOADLIBS = + + +# --- MakeMaker const_cccmd section: +CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \ + $(CCFLAGS) $(OPTIMIZE) \ + $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \ + $(XS_DEFINE_VERSION) + +# --- MakeMaker post_constants section: + + +# --- MakeMaker pasthru section: + +PASTHRU = LIBPERL_A="$(LIBPERL_A)"\ + LINKTYPE="$(LINKTYPE)"\ + OPTIMIZE="$(OPTIMIZE)"\ + LD="$(LD)"\ + PREFIX="$(PREFIX)"\ + PASTHRU_DEFINE="$(PASTHRU_DEFINE)"\ + PASTHRU_INC="$(PASTHRU_INC)" + + +# --- MakeMaker special_targets section: +.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT) + +.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir + + + +# --- MakeMaker c_o section: + +.c.i: + x86_64-linux-gnu-gcc -E -c $(PASTHRU_INC) $(INC) \ + $(CCFLAGS) $(OPTIMIZE) \ + $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \ + $(XS_DEFINE_VERSION) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i + +.c.s: + $(CCCMD) -S $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c + +.c$(OBJ_EXT): + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c + +.cpp$(OBJ_EXT): + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cpp + +.cxx$(OBJ_EXT): + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cxx + +.cc$(OBJ_EXT): + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cc + +.C$(OBJ_EXT): + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.C + + +# --- MakeMaker xs_c section: + +.xs.c: + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c + + +# --- MakeMaker xs_o section: + +.xs$(OBJ_EXT): + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c + + +# --- MakeMaker top_targets section: +all :: pure_all manifypods + $(NOECHO) $(NOOP) + + +pure_all :: config pm_to_blib subdirs linkext + $(NOECHO) $(NOOP) + +subdirs :: $(MYEXTLIB) + $(NOECHO) $(NOOP) + +config :: $(FIRST_MAKEFILE) blibdirs + $(NOECHO) $(NOOP) + +$(O_FILES): $(H_FILES) + +help : + perldoc ExtUtils::MakeMaker + + +# --- MakeMaker blibdirs section: +blibdirs : $(INST_LIBDIR)$(DFSEP).exists $(INST_ARCHLIB)$(DFSEP).exists $(INST_AUTODIR)$(DFSEP).exists $(INST_ARCHAUTODIR)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists $(INST_SCRIPT)$(DFSEP).exists $(INST_MAN1DIR)$(DFSEP).exists $(INST_MAN3DIR)$(DFSEP).exists + $(NOECHO) $(NOOP) + +# Backwards compat with 6.18 through 6.25 +blibdirs.ts : blibdirs + $(NOECHO) $(NOOP) + +$(INST_LIBDIR)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_LIBDIR) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_LIBDIR) + $(NOECHO) $(TOUCH) $(INST_LIBDIR)$(DFSEP).exists + +$(INST_ARCHLIB)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_ARCHLIB) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHLIB) + $(NOECHO) $(TOUCH) $(INST_ARCHLIB)$(DFSEP).exists + +$(INST_AUTODIR)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_AUTODIR) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_AUTODIR) + $(NOECHO) $(TOUCH) $(INST_AUTODIR)$(DFSEP).exists + +$(INST_ARCHAUTODIR)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_ARCHAUTODIR) + $(NOECHO) $(TOUCH) $(INST_ARCHAUTODIR)$(DFSEP).exists + +$(INST_BIN)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_BIN) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_BIN) + $(NOECHO) $(TOUCH) $(INST_BIN)$(DFSEP).exists + +$(INST_SCRIPT)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_SCRIPT) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_SCRIPT) + $(NOECHO) $(TOUCH) $(INST_SCRIPT)$(DFSEP).exists + +$(INST_MAN1DIR)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_MAN1DIR) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN1DIR) + $(NOECHO) $(TOUCH) $(INST_MAN1DIR)$(DFSEP).exists + +$(INST_MAN3DIR)$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) $(INST_MAN3DIR) + $(NOECHO) $(CHMOD) $(PERM_DIR) $(INST_MAN3DIR) + $(NOECHO) $(TOUCH) $(INST_MAN3DIR)$(DFSEP).exists + + + +# --- MakeMaker linkext section: + +linkext :: $(LINKTYPE) + $(NOECHO) $(NOOP) + + +# --- MakeMaker dlsyms section: + + +# --- MakeMaker dynamic_bs section: +BOOTSTRAP = $(BASEEXT).bs + +# As Mkbootstrap might not write a file (if none is required) +# we use touch to prevent make continually trying to remake it. +# The DynaLoader only reads a non-empty file. +$(BOOTSTRAP) : $(FIRST_MAKEFILE) $(BOOTDEP) $(INST_ARCHAUTODIR)$(DFSEP).exists + $(NOECHO) $(ECHO) "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))" + $(NOECHO) $(PERLRUN) \ + "-MExtUtils::Mkbootstrap" \ + -e "Mkbootstrap('$(BASEEXT)','$(BSLOADLIBS)');" + $(NOECHO) $(TOUCH) "$@" + $(CHMOD) $(PERM_RW) "$@" + + +# --- MakeMaker dynamic section: + +dynamic :: $(FIRST_MAKEFILE) $(BOOTSTRAP) $(INST_DYNAMIC) + $(NOECHO) $(NOOP) + + +# --- MakeMaker dynamic_lib section: + +# This section creates the dynamically loadable $(INST_DYNAMIC) +# from $(OBJECT) and possibly $(MYEXTLIB). +ARMAYBE = : +OTHERLDFLAGS = +INST_DYNAMIC_DEP = +INST_DYNAMIC_FIX = + +$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVEDEP) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP) + $(RM_F) $@ + $(LD) $(LDDLFLAGS) $(LDFROM) $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) \ + $(PERL_ARCHIVE) $(LDLOADLIBS) $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST) \ + $(INST_DYNAMIC_FIX) + $(CHMOD) $(PERM_RWX) $@ + $(NOECHO) $(RM_RF) $(BOOTSTRAP) + - $(CP_NONEMPTY) $(BOOTSTRAP) $(INST_BOOT) $(PERM_RW) + + +# --- MakeMaker static section: + +## $(INST_PM) has been moved to the all: target. +## It remains here for awhile to allow for old usage: "make static" +static :: $(FIRST_MAKEFILE) $(INST_STATIC) + $(NOECHO) $(NOOP) + + +# --- MakeMaker static_lib section: + +$(INST_STATIC) : $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists + $(RM_RF) $@ + $(FULL_AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@ + $(CHMOD) $(PERM_RWX) $@ + $(NOECHO) $(ECHO) "$(EXTRALIBS)" > "$(INST_ARCHAUTODIR)/extralibs.ld" + + +# --- MakeMaker manifypods section: + +POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--" +POD2MAN = $(POD2MAN_EXE) + + +manifypods : pure_all \ + DB_File.pm + $(NOECHO) $(POD2MAN) --section=$(MAN3EXT) --perm_rw=$(PERM_RW) -u \ + DB_File.pm $(INST_MAN3DIR)/DB_File.$(MAN3EXT) + + + + +# --- MakeMaker processPL section: + + +# --- MakeMaker installbin section: + + +# --- MakeMaker subdirs section: + +# none + +# --- MakeMaker clean_subdirs section: +clean_subdirs : + $(NOECHO) $(NOOP) + + +# --- MakeMaker clean section: + +# Delete temporary files but do not touch installed files. We don't delete +# the Makefile here so a later make realclean still has a makefile to use. + +clean :: clean_subdirs + - $(RM_F) \ + $(BASEEXT).bso $(BASEEXT).def \ + $(BASEEXT).exp $(BASEEXT).x \ + $(BOOTSTRAP) $(INST_ARCHAUTODIR)/extralibs.all \ + $(INST_ARCHAUTODIR)/extralibs.ld $(MAKE_APERL_FILE) \ + *$(LIB_EXT) *$(OBJ_EXT) \ + *perl.core DB_File.c \ + MYMETA.json MYMETA.yml \ + blibdirs.ts constants.c \ + core core.*perl.*.? \ + core.[0-9] core.[0-9][0-9] \ + core.[0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9] \ + core.[0-9][0-9][0-9][0-9][0-9] fallback.c \ + lib$(BASEEXT).def mon.out \ + perl perl$(EXE_EXT) \ + perl.exe perlmain.c \ + pm_to_blib pm_to_blib.ts \ + so_locations tmon.out + - $(RM_RF) \ + DB_File.pm.bak blib \ + constants.h constants.xs \ + t/db-btree.t.bak t/db-hash.t.bak \ + t/db-recno.t.bak t/pod.t.bak + $(NOECHO) $(RM_F) $(MAKEFILE_OLD) + - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL) + + +# --- MakeMaker realclean_subdirs section: +realclean_subdirs : + $(NOECHO) $(NOOP) + + +# --- MakeMaker realclean section: +# Delete temporary files (via clean) and also delete dist files +realclean purge :: clean realclean_subdirs + - $(RM_F) \ + $(OBJECT) $(FIRST_MAKEFILE) \ + $(MAKEFILE_OLD) + - $(RM_RF) \ + $(DISTVNAME) + + +# --- MakeMaker metafile section: +metafile : create_distdir + $(NOECHO) $(ECHO) Generating META.yml + $(NOECHO) $(ECHO) '---' > META_new.yml + $(NOECHO) $(ECHO) 'abstract: '\''Perl5 access to Berkeley DB version 1.x'\''' >> META_new.yml + $(NOECHO) $(ECHO) 'author:' >> META_new.yml + $(NOECHO) $(ECHO) ' - '\''Paul Marquess '\''' >> META_new.yml + $(NOECHO) $(ECHO) 'build_requires:' >> META_new.yml + $(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: '\''0'\''' >> META_new.yml + $(NOECHO) $(ECHO) 'configure_requires:' >> META_new.yml + $(NOECHO) $(ECHO) ' ExtUtils::MakeMaker: '\''0'\''' >> META_new.yml + $(NOECHO) $(ECHO) 'dynamic_config: 1' >> META_new.yml + $(NOECHO) $(ECHO) 'generated_by: '\''ExtUtils::MakeMaker version 7.0401, CPAN::Meta::Converter version 2.150001'\''' >> META_new.yml + $(NOECHO) $(ECHO) 'license: perl' >> META_new.yml + $(NOECHO) $(ECHO) 'meta-spec:' >> META_new.yml + $(NOECHO) $(ECHO) ' url: http://module-build.sourceforge.net/META-spec-v1.4.html' >> META_new.yml + $(NOECHO) $(ECHO) ' version: '\''1.4'\''' >> META_new.yml + $(NOECHO) $(ECHO) 'name: DB_File' >> META_new.yml + $(NOECHO) $(ECHO) 'no_index:' >> META_new.yml + $(NOECHO) $(ECHO) ' directory:' >> META_new.yml + $(NOECHO) $(ECHO) ' - t' >> META_new.yml + $(NOECHO) $(ECHO) ' - inc' >> META_new.yml + $(NOECHO) $(ECHO) 'requires: {}' >> META_new.yml + $(NOECHO) $(ECHO) 'version: '\''1.835'\''' >> META_new.yml + -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml + $(NOECHO) $(ECHO) Generating META.json + $(NOECHO) $(ECHO) '{' > META_new.json + $(NOECHO) $(ECHO) ' "abstract" : "Perl5 access to Berkeley DB version 1.x",' >> META_new.json + $(NOECHO) $(ECHO) ' "author" : [' >> META_new.json + $(NOECHO) $(ECHO) ' "Paul Marquess "' >> META_new.json + $(NOECHO) $(ECHO) ' ],' >> META_new.json + $(NOECHO) $(ECHO) ' "dynamic_config" : 1,' >> META_new.json + $(NOECHO) $(ECHO) ' "generated_by" : "ExtUtils::MakeMaker version 7.0401, CPAN::Meta::Converter version 2.150001",' >> META_new.json + $(NOECHO) $(ECHO) ' "license" : [' >> META_new.json + $(NOECHO) $(ECHO) ' "perl_5"' >> META_new.json + $(NOECHO) $(ECHO) ' ],' >> META_new.json + $(NOECHO) $(ECHO) ' "meta-spec" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",' >> META_new.json + $(NOECHO) $(ECHO) ' "version" : "2"' >> META_new.json + $(NOECHO) $(ECHO) ' },' >> META_new.json + $(NOECHO) $(ECHO) ' "name" : "DB_File",' >> META_new.json + $(NOECHO) $(ECHO) ' "no_index" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "directory" : [' >> META_new.json + $(NOECHO) $(ECHO) ' "t",' >> META_new.json + $(NOECHO) $(ECHO) ' "inc"' >> META_new.json + $(NOECHO) $(ECHO) ' ]' >> META_new.json + $(NOECHO) $(ECHO) ' },' >> META_new.json + $(NOECHO) $(ECHO) ' "prereqs" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "build" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "requires" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "ExtUtils::MakeMaker" : "0"' >> META_new.json + $(NOECHO) $(ECHO) ' }' >> META_new.json + $(NOECHO) $(ECHO) ' },' >> META_new.json + $(NOECHO) $(ECHO) ' "configure" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "requires" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "ExtUtils::MakeMaker" : "0"' >> META_new.json + $(NOECHO) $(ECHO) ' }' >> META_new.json + $(NOECHO) $(ECHO) ' },' >> META_new.json + $(NOECHO) $(ECHO) ' "runtime" : {' >> META_new.json + $(NOECHO) $(ECHO) ' "requires" : {}' >> META_new.json + $(NOECHO) $(ECHO) ' }' >> META_new.json + $(NOECHO) $(ECHO) ' },' >> META_new.json + $(NOECHO) $(ECHO) ' "release_status" : "stable",' >> META_new.json + $(NOECHO) $(ECHO) ' "version" : "1.835"' >> META_new.json + $(NOECHO) $(ECHO) '}' >> META_new.json + -$(NOECHO) $(MV) META_new.json $(DISTVNAME)/META.json + + +# --- MakeMaker signature section: +signature : + cpansign -s + + +# --- MakeMaker dist_basics section: +distclean :: realclean distcheck + $(NOECHO) $(NOOP) + +distcheck : + $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck + +skipcheck : + $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck + +manifest : + $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest + +veryclean : realclean + $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old + + + +# --- MakeMaker dist_core section: + +dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE) + $(NOECHO) $(ABSPERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \ + -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';' -- + +tardist : $(DISTVNAME).tar$(SUFFIX) + $(NOECHO) $(NOOP) + +uutardist : $(DISTVNAME).tar$(SUFFIX) + uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)_uu' + +$(DISTVNAME).tar$(SUFFIX) : distdir + $(PREOP) + $(TO_UNIX) + $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME) + $(RM_RF) $(DISTVNAME) + $(COMPRESS) $(DISTVNAME).tar + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)' + $(POSTOP) + +zipdist : $(DISTVNAME).zip + $(NOECHO) $(NOOP) + +$(DISTVNAME).zip : distdir + $(PREOP) + $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME) + $(RM_RF) $(DISTVNAME) + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).zip' + $(POSTOP) + +shdist : distdir + $(PREOP) + $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar + $(RM_RF) $(DISTVNAME) + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).shar' + $(POSTOP) + + +# --- MakeMaker distdir section: +create_distdir : + $(RM_RF) $(DISTVNAME) + $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \ + -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" + +distdir : create_distdir distmeta + $(NOECHO) $(NOOP) + + + +# --- MakeMaker dist_test section: +disttest : distdir + cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL + cd $(DISTVNAME) && $(MAKE) $(PASTHRU) + cd $(DISTVNAME) && $(MAKE) test $(PASTHRU) + + + +# --- MakeMaker dist_ci section: + +ci : + $(PERLRUN) "-MExtUtils::Manifest=maniread" \ + -e "@all = keys %{ maniread() };" \ + -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \ + -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});" + + +# --- MakeMaker distmeta section: +distmeta : create_distdir metafile + $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'exit unless -e q{META.yml};' \ + -e 'eval { maniadd({q{META.yml} => q{Module YAML meta-data (added by MakeMaker)}}) }' \ + -e ' or print "Could not add META.yml to MANIFEST: $$$${'\''@'\''}\n"' -- + $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'exit unless -f q{META.json};' \ + -e 'eval { maniadd({q{META.json} => q{Module JSON meta-data (added by MakeMaker)}}) }' \ + -e ' or print "Could not add META.json to MANIFEST: $$$${'\''@'\''}\n"' -- + + + +# --- MakeMaker distsignature section: +distsignature : create_distdir + $(NOECHO) cd $(DISTVNAME) && $(ABSPERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) }' \ + -e ' or print "Could not add SIGNATURE to MANIFEST: $$$${'\''@'\''}\n"' -- + $(NOECHO) cd $(DISTVNAME) && $(TOUCH) SIGNATURE + cd $(DISTVNAME) && cpansign -s + + + +# --- MakeMaker install section: + +install :: pure_install doc_install + $(NOECHO) $(NOOP) + +install_perl :: pure_perl_install doc_perl_install + $(NOECHO) $(NOOP) + +install_site :: pure_site_install doc_site_install + $(NOECHO) $(NOOP) + +install_vendor :: pure_vendor_install doc_vendor_install + $(NOECHO) $(NOOP) + +pure_install :: pure_$(INSTALLDIRS)_install + $(NOECHO) $(NOOP) + +doc_install :: doc_$(INSTALLDIRS)_install + $(NOECHO) $(NOOP) + +pure__install : pure_site_install + $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +doc__install : doc_site_install + $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +pure_perl_install :: all + $(NOECHO) umask 022; $(MOD_INSTALL) \ + "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \ + "$(INST_ARCHLIB)" "$(DESTINSTALLARCHLIB)" \ + "$(INST_BIN)" "$(DESTINSTALLBIN)" \ + "$(INST_SCRIPT)" "$(DESTINSTALLSCRIPT)" \ + "$(INST_MAN1DIR)" "$(DESTINSTALLMAN1DIR)" \ + "$(INST_MAN3DIR)" "$(DESTINSTALLMAN3DIR)" + $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ + "$(SITEARCHEXP)/auto/$(FULLEXT)" + + +pure_site_install :: all + $(NOECHO) umask 02; $(MOD_INSTALL) \ + read "$(SITEARCHEXP)/auto/$(FULLEXT)/.packlist" \ + write "$(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist" \ + "$(INST_LIB)" "$(DESTINSTALLSITELIB)" \ + "$(INST_ARCHLIB)" "$(DESTINSTALLSITEARCH)" \ + "$(INST_BIN)" "$(DESTINSTALLSITEBIN)" \ + "$(INST_SCRIPT)" "$(DESTINSTALLSITESCRIPT)" \ + "$(INST_MAN1DIR)" "$(DESTINSTALLSITEMAN1DIR)" \ + "$(INST_MAN3DIR)" "$(DESTINSTALLSITEMAN3DIR)" + $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ + "$(PERL_ARCHLIB)/auto/$(FULLEXT)" + +pure_vendor_install :: all + $(NOECHO) umask 022; $(MOD_INSTALL) \ + "$(INST_LIB)" "$(DESTINSTALLVENDORLIB)" \ + "$(INST_ARCHLIB)" "$(DESTINSTALLVENDORARCH)" \ + "$(INST_BIN)" "$(DESTINSTALLVENDORBIN)" \ + "$(INST_SCRIPT)" "$(DESTINSTALLVENDORSCRIPT)" \ + "$(INST_MAN1DIR)" "$(DESTINSTALLVENDORMAN1DIR)" \ + "$(INST_MAN3DIR)" "$(DESTINSTALLVENDORMAN3DIR)" + + +doc_perl_install :: all + +doc_site_install :: all + $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLSITEARCH)/perllocal.pod" + -$(NOECHO) umask 02; $(MKPATH) "$(DESTINSTALLSITEARCH)" + -$(NOECHO) umask 02; $(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" $(INSTALLSITELIB) \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> "$(DESTINSTALLSITEARCH)/perllocal.pod" + +doc_vendor_install :: all + + +uninstall :: uninstall_from_$(INSTALLDIRS)dirs + $(NOECHO) $(NOOP) + +uninstall_from_perldirs :: + +uninstall_from_sitedirs :: + $(NOECHO) $(UNINSTALL) "$(SITEARCHEXP)/auto/$(FULLEXT)/.packlist" + +uninstall_from_vendordirs :: + + +# --- MakeMaker force section: +# Phony target to force checking subdirectories. +FORCE : + $(NOECHO) $(NOOP) + + +# --- MakeMaker perldepend section: +PERL_HDRS = \ + $(PERL_INCDEP)/EXTERN.h \ + $(PERL_INCDEP)/INTERN.h \ + $(PERL_INCDEP)/XSUB.h \ + $(PERL_INCDEP)/av.h \ + $(PERL_INCDEP)/bitcount.h \ + $(PERL_INCDEP)/charclass_invlists.h \ + $(PERL_INCDEP)/config.h \ + $(PERL_INCDEP)/cop.h \ + $(PERL_INCDEP)/cv.h \ + $(PERL_INCDEP)/dosish.h \ + $(PERL_INCDEP)/ebcdic_tables.h \ + $(PERL_INCDEP)/embed.h \ + $(PERL_INCDEP)/embedvar.h \ + $(PERL_INCDEP)/fakesdio.h \ + $(PERL_INCDEP)/feature.h \ + $(PERL_INCDEP)/form.h \ + $(PERL_INCDEP)/git_version.h \ + $(PERL_INCDEP)/gv.h \ + $(PERL_INCDEP)/handy.h \ + $(PERL_INCDEP)/hv.h \ + $(PERL_INCDEP)/hv_func.h \ + $(PERL_INCDEP)/inline.h \ + $(PERL_INCDEP)/intrpvar.h \ + $(PERL_INCDEP)/iperlsys.h \ + $(PERL_INCDEP)/keywords.h \ + $(PERL_INCDEP)/l1_char_class_tab.h \ + $(PERL_INCDEP)/malloc_ctl.h \ + $(PERL_INCDEP)/metaconfig.h \ + $(PERL_INCDEP)/mg.h \ + $(PERL_INCDEP)/mg_data.h \ + $(PERL_INCDEP)/mg_raw.h \ + $(PERL_INCDEP)/mg_vtable.h \ + $(PERL_INCDEP)/mydtrace.h \ + $(PERL_INCDEP)/nostdio.h \ + $(PERL_INCDEP)/op.h \ + $(PERL_INCDEP)/op_reg_common.h \ + $(PERL_INCDEP)/opcode.h \ + $(PERL_INCDEP)/opnames.h \ + $(PERL_INCDEP)/overload.h \ + $(PERL_INCDEP)/pad.h \ + $(PERL_INCDEP)/parser.h \ + $(PERL_INCDEP)/patchlevel-debian.h \ + $(PERL_INCDEP)/patchlevel.h \ + $(PERL_INCDEP)/perl.h \ + $(PERL_INCDEP)/perlapi.h \ + $(PERL_INCDEP)/perlio.h \ + $(PERL_INCDEP)/perliol.h \ + $(PERL_INCDEP)/perlsdio.h \ + $(PERL_INCDEP)/perlvars.h \ + $(PERL_INCDEP)/perly.h \ + $(PERL_INCDEP)/pp.h \ + $(PERL_INCDEP)/pp_proto.h \ + $(PERL_INCDEP)/proto.h \ + $(PERL_INCDEP)/reentr.h \ + $(PERL_INCDEP)/regcharclass.h \ + $(PERL_INCDEP)/regcomp.h \ + $(PERL_INCDEP)/regexp.h \ + $(PERL_INCDEP)/regnodes.h \ + $(PERL_INCDEP)/scope.h \ + $(PERL_INCDEP)/sv.h \ + $(PERL_INCDEP)/thread.h \ + $(PERL_INCDEP)/time64.h \ + $(PERL_INCDEP)/time64_config.h \ + $(PERL_INCDEP)/uconfig.h \ + $(PERL_INCDEP)/unicode_constants.h \ + $(PERL_INCDEP)/unixish.h \ + $(PERL_INCDEP)/utf8.h \ + $(PERL_INCDEP)/utfebcdic.h \ + $(PERL_INCDEP)/util.h \ + $(PERL_INCDEP)/uudmap.h \ + $(PERL_INCDEP)/vutil.h \ + $(PERL_INCDEP)/warnings.h + +$(OBJECT) : $(PERL_HDRS) + +DB_File.c constants.c fallback.c : $(XSUBPPDEPS) + + +# --- MakeMaker makefile section: + +$(OBJECT) : $(FIRST_MAKEFILE) + +# We take a very conservative approach here, but it's worth it. +# We move Makefile to Makefile.old here to avoid gnu make looping. +$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) + $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?" + $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..." + -$(NOECHO) $(RM_F) $(MAKEFILE_OLD) + -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) + - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL) + $(PERLRUN) Makefile.PL + $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <==" + $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <==" + $(FALSE) + + + +# --- MakeMaker staticmake section: + +# --- MakeMaker makeaperl section --- +MAP_TARGET = perl +FULLPERL = "/usr/bin/perl" + +$(MAP_TARGET) :: static $(MAKE_APERL_FILE) + $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@ + +$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib + $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) + $(NOECHO) $(PERLRUNINST) \ + Makefile.PL DIR="" \ + MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ + MAKEAPERL=1 NORECURS=1 CCCDLFLAGS= + + +# --- MakeMaker test section: + +TEST_VERBOSE=0 +TEST_TYPE=test_$(LINKTYPE) +TEST_FILE = test.pl +TEST_FILES = t/*.t +TESTDB_SW = -d + +testdb :: testdb_$(LINKTYPE) + +test :: $(TEST_TYPE) subdirs-test + +subdirs-test :: + $(NOECHO) $(NOOP) + + +test_dynamic :: pure_all + PERL_DL_NONLAZY=1 $(FULLPERLRUN) "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES) + +testdb_dynamic :: pure_all + PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE) + +test_ : test_dynamic + +test_static :: pure_all $(MAP_TARGET) + PERL_DL_NONLAZY=1 ./$(MAP_TARGET) "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES) + +testdb_static :: pure_all $(MAP_TARGET) + PERL_DL_NONLAZY=1 ./$(MAP_TARGET) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE) + + + +# --- MakeMaker ppd section: +# Creates a PPD (Perl Package Description) for a binary distribution. +ppd : + $(NOECHO) $(ECHO) '' > $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' Perl5 access to Berkeley DB version 1.x' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' Paul Marquess <pmqs@cpan.org>' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd + $(NOECHO) $(ECHO) '' >> $(DISTNAME).ppd + + +# --- MakeMaker pm_to_blib section: + +pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM) + $(NOECHO) $(ABSPERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', q[$(PM_FILTER)], '\''$(PERM_DIR)'\'')' -- \ + DB_File.pm $(INST_LIB)/DB_File.pm + $(NOECHO) $(TOUCH) pm_to_blib + + +# --- MakeMaker selfdocument section: + + +# --- MakeMaker postamble section: + +MyDoubleCheck: + @echo Checking config.in is setup for a release + @(grep "^LIB.*/usr/local/BerkeleyDB" config.in && \ + grep "^INCLUDE.*/usr/local/BerkeleyDB" config.in && \ + grep "^#DBNAME.*" config.in) >/dev/null || \ + (echo config.in needs fixing ; exit 1) + @echo config.in is ok + @echo + @echo Checking DB_File.xs is ok for a release. + @(perl -ne ' exit 1 if /^\s*#\s*define\s+TRACE/ ; ' DB_File.xs || \ + (echo DB_File.xs needs fixing ; exit 1)) + @echo DB_File.xs is ok + @echo + @echo Checking for $$^W in files: $(my_files) + @perl -ne ' \ + exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/;' $(my_files) || \ + (echo found unexpected $$^W ; exit 1) + @echo No $$^W found. + @echo + @echo Checking for 'use vars' in files: $(my_files) + @perl -ne ' \ + exit 0 if /^__(DATA|END)__/; \ + exit 1 if /^\s*use\s+vars/;' $(my_files) || \ + (echo found unexpected "use vars"; exit 1) + @echo No 'use vars' found. + @echo + @echo All files are OK for a release. + @echo + + + +# End. diff --git a/fastSum/resources/ROUGE/DB_File-1.835/Makefile.PL b/fastSum/resources/ROUGE/DB_File-1.835/Makefile.PL new file mode 100644 index 0000000..f5ef7c8 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/Makefile.PL @@ -0,0 +1,361 @@ +#! perl -w + +use strict ; +use ExtUtils::MakeMaker 5.16 ; +use Config ; + +die "DB_File needs Perl 5.8.3 or better. This is $]\n" + if $] < 5.008003; + +my $VER_INFO ; +my $LIB_DIR ; +my $INC_DIR ; +my $DB_NAME ; +my $LIBS ; +my $COMPAT185 = "" ; + +ParseCONFIG() ; + +my @files = ('DB_File.pm', glob "t/*.t") ; +UpDowngrade(@files); + +if (defined $DB_NAME) + { $LIBS = $DB_NAME } +else { + if ($^O eq 'MSWin32') + { $LIBS = $Config{cc} =~ /gcc/ ? '-ldb' : '-llibdb' } + else + { $LIBS = '-ldb' } +} + +# Solaris is special. +#$LIBS .= " -lthread" if $^O eq 'solaris' ; + +# AIX is special. +$LIBS .= " -lpthread" if $^O eq 'aix' ; + +# OS2 is a special case, so check for it now. +my $OS2 = "" ; +$OS2 = "-DOS2" if $Config{'osname'} eq 'os2' ; + +my $WALL = '' ; +#$WALL = ' -Wall '; + +WriteMakefile( + NAME => 'DB_File', + LIBS => ["-L${LIB_DIR} $LIBS"], + INC => "-I$INC_DIR", + VERSION_FROM => 'DB_File.pm', + XS_VERSION => eval MM->parse_version('DB_File.pm'), + XSPROTOARG => '-noprototypes', + DEFINE => "-D_NOT_CORE $OS2 $VER_INFO $COMPAT185 $WALL", + OBJECT => 'version$(OBJ_EXT) DB_File$(OBJ_EXT)', + ((ExtUtils::MakeMaker->VERSION() gt '6.30') + ? ('LICENSE' => 'perl') + : () + ), + ( + $] >= 5.005 + ? (ABSTRACT_FROM => 'DB_File.pm', + AUTHOR => 'Paul Marquess ') + : () + ), + + ($] < 5.008 || $] > 5.011) + ? (INSTALLDIRS => 'site') + : (INSTALLDIRS => 'perl'), + + #OPTIMIZE => '-g', + 'depend' => { 'Makefile' => 'config.in', + 'version$(OBJ_EXT)' => 'version.c'}, + 'clean' => { FILES => 'constants.h constants.xs DB_File.pm.bak t/db-btree.t.bak t/db-hash.t.bak t/db-recno.t.bak t/pod.t.bak' }, + 'macro' => { my_files => "@files" }, + 'dist' => { COMPRESS => 'gzip', SUFFIX => 'gz', + DIST_DEFAULT => 'MyDoubleCheck tardist'}, + ); + + +my @names = qw( + BTREEMAGIC + BTREEVERSION + DB_LOCK + DB_SHMEM + DB_TXN + HASHMAGIC + HASHVERSION + MAX_PAGE_NUMBER + MAX_PAGE_OFFSET + MAX_REC_NUMBER + RET_ERROR + RET_SPECIAL + RET_SUCCESS + R_CURSOR + R_DUP + R_FIRST + R_FIXEDLEN + R_IAFTER + R_IBEFORE + R_LAST + R_NEXT + R_NOKEY + R_NOOVERWRITE + R_PREV + R_RECNOSYNC + R_SETCURSOR + R_SNAPSHOT + __R_UNUSED + ); + +if (eval {require ExtUtils::Constant; 1}) { + # Check the constants above all appear in @EXPORT in DB_File.pm + my %names = map { $_, 1} @names; + open F, ") + { + last if /^\s*\@EXPORT\s+=\s+qw\(/ ; + } + + while () + { + last if /^\s*\)/ ; + /(\S+)/ ; + delete $names{$1} if defined $1 ; + } + close F ; + + if ( keys %names ) + { + my $missing = join ("\n\t", sort keys %names) ; + die "The following names are missing from \@EXPORT in DB_File.pm\n" . + "\t$missing\n" ; + } + + + ExtUtils::Constant::WriteConstants( + NAME => 'DB_File', + NAMES => \@names, + C_FILE => 'constants.h', + XS_FILE => 'constants.xs', + + ); +} +else { + use File::Copy; + copy ('fallback.h', 'constants.h') + or die "Can't copy fallback.h to constants.h: $!"; + copy ('fallback.xs', 'constants.xs') + or die "Can't copy fallback.xs to constants.xs: $!"; +} + +exit; + + +sub MY::libscan +{ + my $self = shift ; + my $path = shift ; + + return undef + if $path =~ /(~|\.bak)$/ || + $path =~ /^\..*\.swp$/ ; + + return $path; +} + + +sub MY::postamble { <<'EOM' } ; + +MyDoubleCheck: + @echo Checking config.in is setup for a release + @(grep "^LIB.*/usr/local/BerkeleyDB" config.in && \ + grep "^INCLUDE.*/usr/local/BerkeleyDB" config.in && \ + grep "^#DBNAME.*" config.in) >/dev/null || \ + (echo config.in needs fixing ; exit 1) + @echo config.in is ok + @echo + @echo Checking DB_File.xs is ok for a release. + @(perl -ne ' exit 1 if /^\s*#\s*define\s+TRACE/ ; ' DB_File.xs || \ + (echo DB_File.xs needs fixing ; exit 1)) + @echo DB_File.xs is ok + @echo + @echo Checking for $$^W in files: $(my_files) + @perl -ne ' \ + exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/;' $(my_files) || \ + (echo found unexpected $$^W ; exit 1) + @echo No $$^W found. + @echo + @echo Checking for 'use vars' in files: $(my_files) + @perl -ne ' \ + exit 0 if /^__(DATA|END)__/; \ + exit 1 if /^\s*use\s+vars/;' $(my_files) || \ + (echo found unexpected "use vars"; exit 1) + @echo No 'use vars' found. + @echo + @echo All files are OK for a release. + @echo + +EOM + + + +sub ParseCONFIG +{ + my ($k, $v) ; + my @badkey = () ; + my %Info = () ; + my @Options = qw( INCLUDE LIB PREFIX HASH DBNAME COMPAT185 ) ; + my %ValidOption = map {$_, 1} @Options ; + my %Parsed = %ValidOption ; + my $CONFIG = 'config.in' ; + + print "Parsing $CONFIG...\n" ; + + # DBNAME & COMPAT185 are optional, so pretend they have + # been parsed. + delete $Parsed{'DBNAME'} ; + delete $Parsed{'COMPAT185'} ; + $Info{COMPAT185} = "No" ; + + + open(F, "$CONFIG") or die "Cannot open file $CONFIG: $!\n" ; + while () { + s/^\s*|\s*$//g ; + next if /^\s*$/ or /^\s*#/ ; + s/\s*#\s*$// ; + + ($k, $v) = split(/\s+=\s+/, $_, 2) ; + $k = uc $k ; + if ($ValidOption{$k}) { + delete $Parsed{$k} ; + $Info{$k} = $v ; + } + else { + push(@badkey, $k) ; + } + } + close F ; + + print "Unknown keys in $CONFIG ignored [@badkey]\n" + if @badkey ; + + # check parsed values + my @missing = () ; + die "The following keys are missing from $CONFIG file: [@missing]\n" + if @missing = keys %Parsed ; + + $INC_DIR = $ENV{'DB_FILE_INCLUDE'} || $Info{'INCLUDE'} ; + $LIB_DIR = $ENV{'DB_FILE_LIB'} || $Info{'LIB'} ; + $DB_NAME = $ENV{'DB_FILE_NAME'} || $Info{'DBNAME'} ; + $COMPAT185 = "-DCOMPAT185 -DDB_LIBRARY_COMPATIBILITY_API" + if (defined $ENV{'DB_FILE_COMPAT185'} && + $ENV{'DB_FILE_COMPAT185'} =~ /^\s*(on|true|1)\s*$/i) || + $Info{'COMPAT185'} =~ /^\s*(on|true|1)\s*$/i ; + my $PREFIX = $Info{'PREFIX'} ; + my $HASH = $Info{'HASH'} ; + + $VER_INFO = "-DmDB_Prefix_t=${PREFIX} -DmDB_Hash_t=${HASH}" ; + + print <) + { + print, last if /^__(END|DATA)__/ ; + + &{ $our_sub }(); + &{ $warn_sub }(); + print ; + } + + return if eof ; + + while (<>) + { print } +} + +# end of file Makefile.PL diff --git a/fastSum/resources/ROUGE/DB_File-1.835/README b/fastSum/resources/ROUGE/DB_File-1.835/README new file mode 100644 index 0000000..a28e108 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/README @@ -0,0 +1,642 @@ + DB_File + + Version 1.835 + + 23 December 2014 + + Copyright (c) 1995-2014 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. + + +IMPORTANT NOTICE +================ + +If are using the locking technique described in older versions of +DB_File, please read the section called "Locking: The Trouble with fd" +in DB_File.pm immediately. The locking method has been found to be +unsafe. You risk corrupting your data if you continue to use it. + +DESCRIPTION +----------- + +DB_File is a module which allows Perl programs to make use of the +facilities provided by Berkeley DB version 1. (DB_File can be built +version 2, or greater, of Berkeley DB, but it will only support the 1.x +features). + +If you want to make use of the new features available in Berkeley DB +2.x, or greater, use the Perl module BerkeleyDB instead. + +Berkeley DB is a C library which provides a consistent interface to a +number of database formats. DB_File provides an interface to all three +of the database types (hash, btree and recno) currently supported by +Berkeley DB. + +For further details see the documentation included at the end of the +file DB_File.pm. + +PREREQUISITES +------------- + +Before you can build DB_File you must have the following installed on +your system: + + * Perl 5.8.3 or greater. + + * Berkeley DB. + + The official web site for Berkeley DB is + + http://www.oracle.com/technology/products/berkeley-db/db/index.html + + The latest version of Berkeley DB is always available there. It + is recommended that you use the most recent version available. + + The one exception to this advice is where you want to use DB_File + to access database files created by a third-party application, like + Sendmail or Netscape. In these cases you must build DB_File with a + compatible version of Berkeley DB. + + If you want to use Berkeley DB 2.x, you must have version 2.3.4 + or greater. If you want to use Berkeley DB 3.x or 4.x, any version + will do. For Berkeley DB 1.x, use either version 1.85 or 1.86. + + +BUILDING THE MODULE +------------------- + +Assuming you have met all the prerequisites, building the module should +be relatively straightforward. + +Step 1 : If you are running either Solaris 2.5 or HP-UX 10 and want + to use Berkeley DB version 2, 3 or 4, read either the Solaris Notes + or HP-UX Notes sections below. If you are running Linux please + read the Linux Notes section before proceeding. + +Step 2 : Edit the file config.in to suit you local installation. + Instructions are given in the file. + +Step 3 : Build and test the module using this sequence of commands: + + perl Makefile.PL + make + make test + + + NOTE: + If you have a very old version of Berkeley DB (i.e. pre 1.85), + three of the tests in the recno test harness may fail (tests 51, + 53 and 55). You can safely ignore the errors if you're never + going to use the broken functionality (recno databases with a + modified bval). Otherwise you'll have to upgrade your DB + library. + + +INSTALLATION +------------ + + make install + +UPDATES +======= + +The most recent version of DB_File is always available at + + http://www.cpan.org/modules/by-module/DB_File/ + +TROUBLESHOOTING +=============== + +Here are some of the common problems people encounter when building +DB_File. + +Missing db.h or libdb.a +----------------------- + +If you get an error like this: + + cc -c -I/usr/local/include -Dbool=char -DHAS_BOOL + -O2 -DVERSION=\"1.64\" -DXS_VERSION=\"1.64\" -fpic + -I/usr/local/lib/perl5/i586-linux/5.00404/CORE -DmDB_Prefix_t=size_t + -DmDB_Hash_t=u_int32_t DB_File.c + DB_File.xs:101: db.h: No such file or directory + +or this: + + LD_RUN_PATH="/lib" cc -o blib/arch/auto/DB_File/DB_File.so -shared + -L/usr/local/lib DB_File.o -L/usr/local/lib -ldb + ld: cannot open -ldb: No such file or directory + +This symptom can imply: + + 1. You don't have Berkeley DB installed on your system at all. + Solution: get & install Berkeley DB. + + 2. You do have Berkeley DB installed, but it isn't in a standard place. + Solution: Edit config.in and set the LIB and INCLUDE variables to point + to the directories where libdb.a and db.h are installed. + + + + +Undefined symbol db_version +--------------------------- + +DB_File seems to have built correctly, but you get an error like this +when you run the test harness: + + $ make test + PERL_DL_NONLAZY=1 /usr/bin/perl5.00404 -I./blib/arch -I./blib/lib + -I/usr/local/lib/perl5/i586-linux/5.00404 -I/usr/local/lib/perl5 -e 'use + Test::Harness qw(&runtests $verbose); $verbose=0; runtests @ARGV;' t/*.t + t/db-btree..........Can't load './blib/arch/auto/DB_File/DB_File.so' for + module DB_File: ./blib/arch/auto/DB_File/DB_File.so: undefined symbol: + db_version at /usr/local/lib/perl5/i586-linux/5.00404/DynaLoader.pm + line 166. + + at t/db-btree.t line 21 + BEGIN failed--compilation aborted at t/db-btree.t line 21. + dubious Test returned status 2 (wstat 512, 0x200) + +This error usually happens when you have two version of Berkeley DB +installed on your system -- specifically, if you have both version 1 and +a newer version (i.e. version 2 or better) of Berkeley DB installed. If +DB_File is built using the db.h for the newer Berkeley DB and the version +1 Berkeley DB library you will trigger this error. Unfortunately the two +versions aren't compatible with each other. The undefined symbol error is +caused because Berkeley DB version 1 doesn't have the symbol db_version. + +Solution: Setting the LIB & INCLUDE variables in config.in to point to the + correct directories can sometimes be enough to fix this + problem. If that doesn't work the easiest way to fix the + problem is to either delete or temporarily rename the copies + of db.h and libdb.a that you don't want DB_File to use. + + +Undefined symbol dbopen +----------------------- + +DB_File seems to have built correctly, but you get an error like this +when you run the test harness: + + ... + t/db-btree..........Can't load 'blib/arch/auto/DB_File/DB_File.so' for + module DB_File: blib/arch/auto/DB_File/DB_File.so: undefined symbol: + dbopen at /usr/local/lib/perl5/5.6.1/i586-linux/DynaLoader.pm line 206. + at t/db-btree.t line 23 + Compilation failed in require at t/db-btree.t line 23. + ... + +This error usually happens when you have both version 1 and a more recent +version of Berkeley DB installed on your system and DB_File attempts +to build using the db.h for Berkeley DB version 1 and the newer version +library. Unfortunately the two versions aren't compatible with each +other. The undefined symbol error is actually caused because versions +of Berkeley DB newer than version 1 doesn't have the symbol dbopen. + +Solution: Setting the LIB & INCLUDE variables in config.in to point to the + correct directories can sometimes be enough to fix this + problem. If that doesn't work the easiest way to fix the + problem is to either delete or temporarily rename the copies + of db.h and libdb.a that you don't want DB_File to use. + + +Incompatible versions of db.h and libdb +--------------------------------------- + +DB_File seems to have built correctly, but you get an error like this +when you run the test harness: + + $ make test + PERL_DL_NONLAZY=1 /home/paul/perl/install/bin/perl5.00560 -Iblib/arch + -Iblib/lib -I/home/paul/perl/install/5.005_60/lib/5.00560/i586-linux + -I/home/paul/perl/install/5.005_60/lib/5.00560 -e 'use Test::Harness + qw(&runtests $verbose); $verbose=0; runtests @ARGV;' t/*.t + t/db-btree.......... + DB_File was build with libdb version 2.3.7 + but you are attempting to run it with libdb version 2.7.5 + BEGIN failed--compilation aborted at t/db-btree.t line 21. + ... + +Another variation on the theme of having two versions of Berkeley DB on +your system. + +Solution: Setting the LIB & INCLUDE variables in config.in to point to the + correct directories can sometimes be enough to fix this + problem. If that doesn't work the easiest way to fix the + problem is to either delete or temporarily rename the copies + of db.h and libdb.a that you don't want BerkeleyDB to use. + If you are running Linux, please read the Linux Notes section + below. + +Keep getting "At least one secondary cursor must be specified to DB->join" +-------------------------------------------------------------------------- + +When you either run the DB_File test harness, or attempt to run a script +that uses DB_File you get the error message below. + + BDB0588 At least one secondary cursor must be specified to DB->join. + +To date thus issue has only been reported on Windows. If you encounter this +issue on another platform, please report the issue. See the FEEDBACK +section for details. + +This issue boils down to the size of the C type time_t. + +The typical reason for getting this error is when running a 32-bit Perl +(which will use a 32-bit time_t) along with a 32-bit Berkeley DB library. +The key point is how Berkeley DB has been built. If it has been built with +a newish version of Visual C++, time_t will default to 64-bit, even when +the rest of the library has been built 32-bit. This means that Perl thinks +time_t is 32-bit, but Berkeley DB thinks it is 64-bit. + +More details of how the size of time_t in Windows is shown below (taken +from http://msdn.microsoft.com/en-us/library/w4ddyt9h.aspx) + + In versions of Visual C++ and Microsoft C/C++ before Visual C++ 2005, + time_t was a long int (32 bits) and hence could not be used for dates + past 3:14:07 January 19, 2038, UTC. time_t is now equivalent to + __time64_t by default, but defining _USE_32BIT_TIME_T changes time_t + to __time32_t and forces many time functions to call versions that take + the 32-bit time_t. + + +When DB_File is built, it uses a Berkeley DB header file, called db.h. This +file contains the definition of a number of key data structures used by +Berkeley DB. Unfortunately one of those data structures includes a time_t. +This is the root case for this issue. When you build DB_File, it assumes +time_t is 32-bit, but the Berkeley DB library is expecting it to be 64-bit. + +Solution: + +There are a few options available. + +1. Use a 64-bit Perl along with a 64-bit Berkleley DB. + +2. Use a 32-bit Perl along with a 32-bit Berkeley DB where _USE_32BIT_TIME_T + has been defined. + +3. If you do need to interoperate with a Berkeley DB library that uses a + time_t that is different from Perl you need to edit the file DB_File.xs + and find these lines + + /* #define time_t __time64_t */ + /* #define time_t __time32_t */ + + If your Berkeley DB library uses a 64-bit time_t, uncomment the first line. + If your Berkeley DB library uses a 32-bit time_t, uncomment the second line. + + +Solaris build fails with "language optional software package not installed" +--------------------------------------------------------------------------- + +If you are trying to build this module under Solaris and you get an +error message like this + + /usr/ucb/cc: language optional software package not installed + +it means that Perl cannot find the C compiler on your system. The cryptic +message is just Sun's way of telling you that you haven't bought their +C compiler. + +When you build a Perl module that needs a C compiler, the Perl build +system tries to use the same C compiler that was used to build perl +itself. In this case your Perl binary was built with a C compiler that +lived in /usr/ucb. + +To continue with building this module, you need to get a C compiler, +or tell Perl where your C compiler is, if you already have one. + +Assuming you have now got a C compiler, what you do next will be dependant +on what C compiler you have installed. If you have just installed Sun's +C compiler, you shouldn't have to do anything. Just try rebuilding +this module. + +If you have installed another C compiler, say gcc, you have to tell perl +how to use it instead of /usr/ucb/cc. + +This set of options seems to work if you want to use gcc. Your mileage +may vary. + + perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " + make test + +If that doesn't work for you, it's time to make changes to the Makefile +by hand. Good luck! + + + +Solaris build fails with "gcc: unrecognized option `-KPIC'" +----------------------------------------------------------- + +You are running Solaris and you get an error like this when you try to +build this Perl module + + gcc: unrecognized option `-KPIC' + +This symptom usually means that you are using a Perl binary that has been +built with the Sun C compiler, but you are using gcc to build this module. + +When Perl builds modules that need a C compiler, it will attempt to use +the same C compiler and command line options that was used to build perl +itself. In this case "-KPIC" is a valid option for the Sun C compiler, +but not for gcc. The equivalent option for gcc is "-fPIC". + +The solution is either: + + 1. Build both Perl and this module with the same C compiler, either + by using the Sun C compiler for both or gcc for both. + + 2. Try generating the Makefile for this module like this perl + + perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " LD=gcc + make test + + This second option seems to work when mixing a Perl binary built + with the Sun C compiler and this module built with gcc. Your + mileage may vary. + + + + +Linux Notes +----------- + +Some older versions of Linux (e.g. RedHat 6, SuSe 6) ship with a C library +that has version 2.x of Berkeley DB linked into it. This makes it +difficult to build this module with anything other than the version of +Berkeley DB that shipped with your Linux release. If you do try to use +a different version of Berkeley DB you will most likely get the error +described in the "Incompatible versions of db.h and libdb" section of +this file. + +To make matters worse, prior to Perl 5.6.1, the perl binary itself +*always* included the Berkeley DB library. + +If you want to use a newer version of Berkeley DB with this module, the +easiest solution is to use Perl 5.6.1 (or better) and Berkeley DB 3.x +(or better). + +There are two approaches you can use to get older versions of Perl to +work with specific versions of Berkeley DB. Both have their advantages +and disadvantages. + +The first approach will only work when you want to build a version of +Perl older than 5.6.1 along with Berkeley DB 3.x. If you want to use +Berkeley DB 2.x, you must use the next approach. This approach involves +rebuilding your existing version of Perl after applying an unofficial +patch. The "patches" directory in the this module's source distribution +contains a number of patch files. There is one patch file for every +stable version of Perl since 5.004. Apply the appropriate patch to your +Perl source tree before re-building and installing Perl from scratch. +For example, assuming you are in the top-level source directory for +Perl 5.6.0, the command below will apply the necessary patch. Remember +to replace the path shown below with one that points to this module's +patches directory. + + patch -p1 -N diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/arch/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/arch/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/arch/auto/DB_File/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/arch/auto/DB_File/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/arch/auto/DB_File/DB_File.so b/fastSum/resources/ROUGE/DB_File-1.835/blib/arch/auto/DB_File/DB_File.so new file mode 100644 index 0000000000000000000000000000000000000000..b871f2282c6a09dcb31b172c7947ef9a59741089 GIT binary patch literal 257120 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 H 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 Yopd0o9_@`E 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

|tx5a{u*P`73vmWCR&I*7zaI)!k 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 W-|_b7^S|Za4cZ#toK*a1|NjGIgrt%H literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/bin/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/bin/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/DB_File.pm b/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/DB_File.pm new file mode 100644 index 0000000..9b1f957 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/DB_File.pm @@ -0,0 +1,2310 @@ +# DB_File.pm -- Perl 5 interface to Berkeley DB +# +# Written by Paul Marquess (pmqs@cpan.org) +# +# Copyright (c) 1995-2014 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 DB_File::HASHINFO ; + +require 5.008003; + +use warnings; +use strict; +use Carp; +require Tie::Hash; +@DB_File::HASHINFO::ISA = qw(Tie::Hash); + +sub new +{ + my $pkg = shift ; + my %x ; + tie %x, $pkg ; + bless \%x, $pkg ; +} + + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { + bsize => 1, + ffactor => 1, + nelem => 1, + cachesize => 1, + hash => 2, + lorder => 1, + }, + GOT => {} + }, $pkg ; +} + + +sub FETCH +{ + my $self = shift ; + my $key = shift ; + + return $self->{GOT}{$key} if exists $self->{VALID}{$key} ; + + my $pkg = ref $self ; + croak "${pkg}::FETCH - Unknown element '$key'" ; +} + + +sub STORE +{ + my $self = shift ; + my $key = shift ; + my $value = shift ; + + my $type = $self->{VALID}{$key}; + + if ( $type ) + { + croak "Key '$key' not associated with a code reference" + if $type == 2 && !ref $value && ref $value ne 'CODE'; + $self->{GOT}{$key} = $value ; + return ; + } + + my $pkg = ref $self ; + croak "${pkg}::STORE - Unknown element '$key'" ; +} + +sub DELETE +{ + my $self = shift ; + my $key = shift ; + + if ( exists $self->{VALID}{$key} ) + { + delete $self->{GOT}{$key} ; + return ; + } + + my $pkg = ref $self ; + croak "DB_File::HASHINFO::DELETE - Unknown element '$key'" ; +} + +sub EXISTS +{ + my $self = shift ; + my $key = shift ; + + exists $self->{VALID}{$key} ; +} + +sub NotHere +{ + my $self = shift ; + my $method = shift ; + + croak ref($self) . " does not define the method ${method}" ; +} + +sub FIRSTKEY { my $self = shift ; $self->NotHere("FIRSTKEY") } +sub NEXTKEY { my $self = shift ; $self->NotHere("NEXTKEY") } +sub CLEAR { my $self = shift ; $self->NotHere("CLEAR") } + +package DB_File::RECNOINFO ; + +use warnings; +use strict ; + +@DB_File::RECNOINFO::ISA = qw(DB_File::HASHINFO) ; + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { map {$_, 1} + qw( bval cachesize psize flags lorder reclen bfname ) + }, + GOT => {}, + }, $pkg ; +} + +package DB_File::BTREEINFO ; + +use warnings; +use strict ; + +@DB_File::BTREEINFO::ISA = qw(DB_File::HASHINFO) ; + +sub TIEHASH +{ + my $pkg = shift ; + + bless { VALID => { + flags => 1, + cachesize => 1, + maxkeypage => 1, + minkeypage => 1, + psize => 1, + compare => 2, + prefix => 2, + lorder => 1, + }, + GOT => {}, + }, $pkg ; +} + + +package DB_File ; + +use warnings; +use strict; +our ($VERSION, @ISA, @EXPORT, $AUTOLOAD, $DB_BTREE, $DB_HASH, $DB_RECNO); +our ($db_version, $use_XSLoader, $splice_end_array_no_length, $splice_end_array, $Error); +use Carp; + + +$VERSION = "1.835" ; +$VERSION = eval $VERSION; # needed for dev releases + +{ + local $SIG{__WARN__} = sub {$splice_end_array_no_length = join(" ",@_);}; + my @a =(1); splice(@a, 3); + $splice_end_array_no_length = + ($splice_end_array_no_length =~ /^splice\(\) offset past end of array at /); +} +{ + local $SIG{__WARN__} = sub {$splice_end_array = join(" ", @_);}; + my @a =(1); splice(@a, 3, 1); + $splice_end_array = + ($splice_end_array =~ /^splice\(\) offset past end of array at /); +} + +#typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; +$DB_BTREE = new DB_File::BTREEINFO ; +$DB_HASH = new DB_File::HASHINFO ; +$DB_RECNO = new DB_File::RECNOINFO ; + +require Tie::Hash; +require Exporter; +BEGIN { + $use_XSLoader = 1 ; + { local $SIG{__DIE__} ; eval { require XSLoader } ; } + + if ($@) { + $use_XSLoader = 0 ; + require DynaLoader; + @ISA = qw(DynaLoader); + } +} + +push @ISA, qw(Tie::Hash Exporter); +@EXPORT = qw( + $DB_BTREE $DB_HASH $DB_RECNO + + BTREEMAGIC + BTREEVERSION + DB_LOCK + DB_SHMEM + DB_TXN + HASHMAGIC + HASHVERSION + MAX_PAGE_NUMBER + MAX_PAGE_OFFSET + MAX_REC_NUMBER + RET_ERROR + RET_SPECIAL + RET_SUCCESS + R_CURSOR + R_DUP + R_FIRST + R_FIXEDLEN + R_IAFTER + R_IBEFORE + R_LAST + R_NEXT + R_NOKEY + R_NOOVERWRITE + R_PREV + R_RECNOSYNC + R_SETCURSOR + R_SNAPSHOT + __R_UNUSED + +); + +sub AUTOLOAD { + my($constname); + ($constname = $AUTOLOAD) =~ s/.*:://; + my ($error, $val) = constant($constname); + Carp::croak $error if $error; + no strict 'refs'; + *{$AUTOLOAD} = sub { $val }; + goto &{$AUTOLOAD}; +} + + +eval { + # Make all Fcntl O_XXX constants available for importing + require Fcntl; + my @O = grep /^O_/, @Fcntl::EXPORT; + Fcntl->import(@O); # first we import what we want to export + push(@EXPORT, @O); +}; + +if ($use_XSLoader) + { XSLoader::load("DB_File", $VERSION)} +else + { bootstrap DB_File $VERSION } + +sub tie_hash_or_array +{ + my (@arg) = @_ ; + my $tieHASH = ( (caller(1))[3] =~ /TIEHASH/ ) ; + + use File::Spec; + $arg[1] = File::Spec->rel2abs($arg[1]) + if defined $arg[1] ; + + $arg[4] = tied %{ $arg[4] } + if @arg >= 5 && ref $arg[4] && $arg[4] =~ /=HASH/ && tied %{ $arg[4] } ; + + $arg[2] = O_CREAT()|O_RDWR() if @arg >=3 && ! defined $arg[2]; + $arg[3] = 0666 if @arg >=4 && ! defined $arg[3]; + + # make recno in Berkeley DB version 2 (or better) work like + # recno in version 1. + if ($db_version >= 4 and ! $tieHASH) { + $arg[2] |= O_CREAT(); + } + + if ($db_version > 1 and defined $arg[4] and $arg[4] =~ /RECNO/ and + $arg[1] and ! -e $arg[1]) { + open(FH, ">$arg[1]") or return undef ; + close FH ; + chmod $arg[3] ? $arg[3] : 0666 , $arg[1] ; + } + + DoTie_($tieHASH, @arg) ; +} + +sub TIEHASH +{ + tie_hash_or_array(@_) ; +} + +sub TIEARRAY +{ + tie_hash_or_array(@_) ; +} + +sub CLEAR +{ + my $self = shift; + my $key = 0 ; + my $value = "" ; + my $status = $self->seq($key, $value, R_FIRST()); + my @keys; + + while ($status == 0) { + push @keys, $key; + $status = $self->seq($key, $value, R_NEXT()); + } + foreach $key (reverse @keys) { + my $s = $self->del($key); + } +} + +sub EXTEND { } + +sub STORESIZE +{ + my $self = shift; + my $length = shift ; + my $current_length = $self->length() ; + + if ($length < $current_length) { + my $key ; + for ($key = $current_length - 1 ; $key >= $length ; -- $key) + { $self->del($key) } + } + elsif ($length > $current_length) { + $self->put($length-1, "") ; + } +} + + +sub SPLICE +{ + my $self = shift; + my $offset = shift; + if (not defined $offset) { + warnings::warnif('uninitialized', 'Use of uninitialized value in splice'); + $offset = 0; + } + + my $has_length = @_; + my $length = @_ ? shift : 0; + # Carping about definedness comes _after_ the OFFSET sanity check. + # This is so we get the same error messages as Perl's splice(). + # + + my @list = @_; + + my $size = $self->FETCHSIZE(); + + # 'If OFFSET is negative then it start that far from the end of + # the array.' + # + if ($offset < 0) { + my $new_offset = $size + $offset; + if ($new_offset < 0) { + die "Modification of non-creatable array value attempted, " + . "subscript $offset"; + } + $offset = $new_offset; + } + + if (not defined $length) { + warnings::warnif('uninitialized', 'Use of uninitialized value in splice'); + $length = 0; + } + + if ($offset > $size) { + $offset = $size; + warnings::warnif('misc', 'splice() offset past end of array') + if $has_length ? $splice_end_array : $splice_end_array_no_length; + } + + # 'If LENGTH is omitted, removes everything from OFFSET onward.' + if (not defined $length) { + $length = $size - $offset; + } + + # 'If LENGTH is negative, leave that many elements off the end of + # the array.' + # + if ($length < 0) { + $length = $size - $offset + $length; + + if ($length < 0) { + # The user must have specified a length bigger than the + # length of the array passed in. But perl's splice() + # doesn't catch this, it just behaves as for length=0. + # + $length = 0; + } + } + + if ($length > $size - $offset) { + $length = $size - $offset; + } + + # $num_elems holds the current number of elements in the database. + my $num_elems = $size; + + # 'Removes the elements designated by OFFSET and LENGTH from an + # array,'... + # + my @removed = (); + foreach (0 .. $length - 1) { + my $old; + my $status = $self->get($offset, $old); + if ($status != 0) { + my $msg = "error from Berkeley DB on get($offset, \$old)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ": error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + push @removed, $old; + + $status = $self->del($offset); + if ($status != 0) { + my $msg = "error from Berkeley DB on del($offset)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ": error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + + -- $num_elems; + } + + # ...'and replaces them with the elements of LIST, if any.' + my $pos = $offset; + while (defined (my $elem = shift @list)) { + my $old_pos = $pos; + my $status; + if ($pos >= $num_elems) { + $status = $self->put($pos, $elem); + } + else { + $status = $self->put($pos, $elem, $self->R_IBEFORE); + } + + if ($status != 0) { + my $msg = "error from Berkeley DB on put($pos, $elem, ...)"; + if ($status == 1) { + $msg .= ' (no such element?)'; + } + else { + $msg .= ", error status $status"; + if (defined $! and $! ne '') { + $msg .= ", message $!"; + } + } + die $msg; + } + + die "pos unexpectedly changed from $old_pos to $pos with R_IBEFORE" + if $old_pos != $pos; + + ++ $pos; + ++ $num_elems; + } + + if (wantarray) { + # 'In list context, returns the elements removed from the + # array.' + # + return @removed; + } + elsif (defined wantarray and not wantarray) { + # 'In scalar context, returns the last element removed, or + # undef if no elements are removed.' + # + if (@removed) { + my $last = pop @removed; + return "$last"; + } + else { + return undef; + } + } + elsif (not defined wantarray) { + # Void context + } + else { die } +} +sub ::DB_File::splice { &SPLICE } + +sub find_dup +{ + croak "Usage: \$db->find_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($origkey, $value_wanted) = @_ ; + my ($key, $value) = ($origkey, 0); + my ($status) = 0 ; + + for ($status = $db->seq($key, $value, R_CURSOR() ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT() ) ) { + + return 0 if $key eq $origkey and $value eq $value_wanted ; + } + + return $status ; +} + +sub del_dup +{ + croak "Usage: \$db->del_dup(key,value)\n" + unless @_ == 3 ; + + my $db = shift ; + my ($key, $value) = @_ ; + my ($status) = $db->find_dup($key, $value) ; + return $status if $status != 0 ; + + $status = $db->del($key, R_CURSOR() ) ; + return $status ; +} + +sub get_dup +{ + croak "Usage: \$db->get_dup(key [,flag])\n" + unless @_ == 2 or @_ == 3 ; + + my $db = shift ; + my $key = shift ; + my $flag = shift ; + my $value = 0 ; + my $origkey = $key ; + my $wantarray = wantarray ; + my %values = () ; + my @values = () ; + my $counter = 0 ; + my $status = 0 ; + + # iterate through the database until either EOF ($status == 0) + # or a different key is encountered ($key ne $origkey). + for ($status = $db->seq($key, $value, R_CURSOR()) ; + $status == 0 and $key eq $origkey ; + $status = $db->seq($key, $value, R_NEXT()) ) { + + # save the value or count number of matches + if ($wantarray) { + if ($flag) + { ++ $values{$value} } + else + { push (@values, $value) } + } + else + { ++ $counter } + + } + + return ($wantarray ? ($flag ? %values : @values) : $counter) ; +} + + +sub STORABLE_freeze +{ + my $type = ref shift; + croak "Cannot freeze $type object\n"; +} + +sub STORABLE_thaw +{ + my $type = ref shift; + croak "Cannot thaw $type object\n"; +} + + + +1; +__END__ + +=head1 NAME + +DB_File - Perl5 access to Berkeley DB version 1.x + +=head1 SYNOPSIS + + use DB_File; + + [$X =] tie %hash, 'DB_File', [$filename, $flags, $mode, $DB_HASH] ; + [$X =] tie %hash, 'DB_File', $filename, $flags, $mode, $DB_BTREE ; + [$X =] tie @array, 'DB_File', $filename, $flags, $mode, $DB_RECNO ; + + $status = $X->del($key [, $flags]) ; + $status = $X->put($key, $value [, $flags]) ; + $status = $X->get($key, $value [, $flags]) ; + $status = $X->seq($key, $value, $flags) ; + $status = $X->sync([$flags]) ; + $status = $X->fd ; + + # BTREE only + $count = $X->get_dup($key) ; + @list = $X->get_dup($key) ; + %list = $X->get_dup($key, 1) ; + $status = $X->find_dup($key, $value) ; + $status = $X->del_dup($key, $value) ; + + # RECNO only + $a = $X->length; + $a = $X->pop ; + $X->push(list); + $a = $X->shift; + $X->unshift(list); + @r = $X->splice(offset, length, elements); + + # DBM Filters + $old_filter = $db->filter_store_key ( sub { ... } ) ; + $old_filter = $db->filter_store_value( sub { ... } ) ; + $old_filter = $db->filter_fetch_key ( sub { ... } ) ; + $old_filter = $db->filter_fetch_value( sub { ... } ) ; + + untie %hash ; + untie @array ; + +=head1 DESCRIPTION + +B is a module which allows Perl programs to make use of the +facilities provided by Berkeley DB version 1.x (if you have a newer +version of DB, see L). +It is assumed that you have a copy of the Berkeley DB manual pages at +hand when reading this documentation. The interface defined here +mirrors the Berkeley DB interface closely. + +Berkeley DB is a C library which provides a consistent interface to a +number of database formats. B provides an interface to all +three of the database types currently supported by Berkeley DB. + +The file types are: + +=over 5 + +=item B + +This database type allows arbitrary key/value pairs to be stored in data +files. This is equivalent to the functionality provided by other +hashing packages like DBM, NDBM, ODBM, GDBM, and SDBM. Remember though, +the files created using DB_HASH are not compatible with any of the +other packages mentioned. + +A default hashing algorithm, which will be adequate for most +applications, is built into Berkeley DB. If you do need to use your own +hashing algorithm it is possible to write your own in Perl and have +B use it instead. + +=item B + +The btree format allows arbitrary key/value pairs to be stored in a +sorted, balanced binary tree. + +As with the DB_HASH format, it is possible to provide a user defined +Perl routine to perform the comparison of keys. By default, though, the +keys are stored in lexical order. + +=item B + +DB_RECNO allows both fixed-length and variable-length flat text files +to be manipulated using the same key/value pair interface as in DB_HASH +and DB_BTREE. In this case the key will consist of a record (line) +number. + +=back + +=head2 Using DB_File with Berkeley DB version 2 or greater + +Although B is intended to be used with Berkeley DB version 1, +it can also be used with version 2, 3 or 4. In this case the interface is +limited to the functionality provided by Berkeley DB 1.x. Anywhere the +version 2 or greater interface differs, B arranges for it to work +like version 1. This feature allows B scripts that were built +with version 1 to be migrated to version 2 or greater without any changes. + +If you want to make use of the new features available in Berkeley DB +2.x or greater, use the Perl module B instead. + +B The database file format has changed multiple times in Berkeley +DB version 2, 3 and 4. If you cannot recreate your databases, you +must dump any existing databases with either the C or the +C utility that comes with Berkeley DB. +Once you have rebuilt DB_File to use Berkeley DB version 2 or greater, +your databases can be recreated using C. Refer to the Berkeley DB +documentation for further details. + +Please read L<"COPYRIGHT"> before using version 2.x or greater of Berkeley +DB with DB_File. + +=head2 Interface to Berkeley DB + +B allows access to Berkeley DB files using the tie() mechanism +in Perl 5 (for full details, see L). This facility +allows B to access Berkeley DB files using either an +associative array (for DB_HASH & DB_BTREE file types) or an ordinary +array (for the DB_RECNO file type). + +In addition to the tie() interface, it is also possible to access most +of the functions provided in the Berkeley DB API directly. +See L. + +=head2 Opening a Berkeley DB Database File + +Berkeley DB uses the function dbopen() to open or create a database. +Here is the C prototype for dbopen(): + + DB* + dbopen (const char * file, int flags, int mode, + DBTYPE type, const void * openinfo) + +The parameter C is an enumeration which specifies which of the 3 +interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used. +Depending on which of these is actually chosen, the final parameter, +I points to a data structure which allows tailoring of the +specific interface method. + +This interface is handled slightly differently in B. Here is +an equivalent call using B: + + tie %array, 'DB_File', $filename, $flags, $mode, $DB_HASH ; + +The C, C and C parameters are the direct +equivalent of their dbopen() counterparts. The final parameter $DB_HASH +performs the function of both the C and C parameters in +dbopen(). + +In the example above $DB_HASH is actually a pre-defined reference to a +hash object. B has three of these pre-defined references. +Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO. + +The keys allowed in each of these pre-defined references is limited to +the names used in the equivalent C structure. So, for example, the +$DB_HASH reference will only allow keys called C, C, +C, C, C and C. + +To change one of these elements, just assign to it like this: + + $DB_HASH->{'cachesize'} = 10000 ; + +The three predefined variables $DB_HASH, $DB_BTREE and $DB_RECNO are +usually adequate for most applications. If you do need to create extra +instances of these objects, constructors are available for each file +type. + +Here are examples of the constructors and the valid options available +for DB_HASH, DB_BTREE and DB_RECNO respectively. + + $a = new DB_File::HASHINFO ; + $a->{'bsize'} ; + $a->{'cachesize'} ; + $a->{'ffactor'}; + $a->{'hash'} ; + $a->{'lorder'} ; + $a->{'nelem'} ; + + $b = new DB_File::BTREEINFO ; + $b->{'flags'} ; + $b->{'cachesize'} ; + $b->{'maxkeypage'} ; + $b->{'minkeypage'} ; + $b->{'psize'} ; + $b->{'compare'} ; + $b->{'prefix'} ; + $b->{'lorder'} ; + + $c = new DB_File::RECNOINFO ; + $c->{'bval'} ; + $c->{'cachesize'} ; + $c->{'psize'} ; + $c->{'flags'} ; + $c->{'lorder'} ; + $c->{'reclen'} ; + $c->{'bfname'} ; + +The values stored in the hashes above are mostly the direct equivalent +of their C counterpart. Like their C counterparts, all are set to a +default values - that means you don't have to set I of the +values when you only want to change one. Here is an example: + + $a = new DB_File::HASHINFO ; + $a->{'cachesize'} = 12345 ; + tie %y, 'DB_File', "filename", $flags, 0777, $a ; + +A few of the options need extra discussion here. When used, the C +equivalent of the keys C, C and C store pointers +to C functions. In B these keys are used to store references +to Perl subs. Below are templates for each of the subs: + + sub hash + { + my ($data) = @_ ; + ... + # return the hash value for $data + return $hash ; + } + + sub compare + { + my ($key, $key2) = @_ ; + ... + # return 0 if $key1 eq $key2 + # -1 if $key1 lt $key2 + # 1 if $key1 gt $key2 + return (-1 , 0 or 1) ; + } + + sub prefix + { + my ($key, $key2) = @_ ; + ... + # return number of bytes of $key2 which are + # necessary to determine that it is greater than $key1 + return $bytes ; + } + +See L for an example of using the +C template. + +If you are using the DB_RECNO interface and you intend making use of +C, you should check out L. + +=head2 Default Parameters + +It is possible to omit some or all of the final 4 parameters in the +call to C and let them take default values. As DB_HASH is the most +common file format used, the call: + + tie %A, "DB_File", "filename" ; + +is equivalent to: + + tie %A, "DB_File", "filename", O_CREAT|O_RDWR, 0666, $DB_HASH ; + +It is also possible to omit the filename parameter as well, so the +call: + + tie %A, "DB_File" ; + +is equivalent to: + + tie %A, "DB_File", undef, O_CREAT|O_RDWR, 0666, $DB_HASH ; + +See L for a discussion on the use of C +in place of a filename. + +=head2 In Memory Databases + +Berkeley DB allows the creation of in-memory databases by using NULL +(that is, a C<(char *)0> in C) in place of the filename. B +uses C instead of NULL to provide this functionality. + +=head1 DB_HASH + +The DB_HASH file format is probably the most commonly used of the three +file formats that B supports. It is also very straightforward +to use. + +=head2 A Simple Example + +This example shows how to create a database, add key/value pairs to the +database, delete keys/value pairs and finally how to enumerate the +contents of the database. + + use warnings ; + use strict ; + use DB_File ; + our (%h, $k, $v) ; + + unlink "fruit" ; + tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH + or die "Cannot open file 'fruit': $!\n"; + + # Add a few key/value pairs to the file + $h{"apple"} = "red" ; + $h{"orange"} = "orange" ; + $h{"banana"} = "yellow" ; + $h{"tomato"} = "red" ; + + # Check for existence of a key + print "Banana Exists\n\n" if $h{"banana"} ; + + # Delete a key/value pair. + delete $h{"apple"} ; + + # print the contents of the file + while (($k, $v) = each %h) + { print "$k -> $v\n" } + + untie %h ; + +here is the output: + + Banana Exists + + orange -> orange + tomato -> red + banana -> yellow + +Note that the like ordinary associative arrays, the order of the keys +retrieved is in an apparently random order. + +=head1 DB_BTREE + +The DB_BTREE format is useful when you want to store data in a given +order. By default the keys will be stored in lexical order, but as you +will see from the example shown in the next section, it is very easy to +define your own sorting function. + +=head2 Changing the BTREE sort order + +This script shows how to override the default sorting algorithm that +BTREE uses. Instead of using the normal lexical ordering, a case +insensitive compare function will be used. + + use warnings ; + use strict ; + use DB_File ; + + my %h ; + + sub Compare + { + my ($key1, $key2) = @_ ; + "\L$key1" cmp "\L$key2" ; + } + + # specify the Perl sub that will do the comparison + $DB_BTREE->{'compare'} = \&Compare ; + + unlink "tree" ; + tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open file 'tree': $!\n" ; + + # Add a key/value pair to the file + $h{'Wall'} = 'Larry' ; + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + $h{'duck'} = 'donald' ; + + # Delete + delete $h{"duck"} ; + + # Cycle through the keys printing them in order. + # Note it is not necessary to sort the keys as + # the btree will have kept them in order automatically. + foreach (keys %h) + { print "$_\n" } + + untie %h ; + +Here is the output from the code above. + + mouse + Smith + Wall + +There are a few point to bear in mind if you want to change the +ordering in a BTREE database: + +=over 5 + +=item 1. + +The new compare function must be specified when you create the database. + +=item 2. + +You cannot change the ordering once the database has been created. Thus +you must use the same compare function every time you access the +database. + +=item 3 + +Duplicate keys are entirely defined by the comparison function. +In the case-insensitive example above, the keys: 'KEY' and 'key' +would be considered duplicates, and assigning to the second one +would overwrite the first. If duplicates are allowed for (with the +R_DUP flag discussed below), only a single copy of duplicate keys +is stored in the database --- so (again with example above) assigning +three values to the keys: 'KEY', 'Key', and 'key' would leave just +the first key: 'KEY' in the database with three values. For some +situations this results in information loss, so care should be taken +to provide fully qualified comparison functions when necessary. +For example, the above comparison routine could be modified to +additionally compare case-sensitively if two keys are equal in the +case insensitive comparison: + + sub compare { + my($key1, $key2) = @_; + lc $key1 cmp lc $key2 || + $key1 cmp $key2; + } + +And now you will only have duplicates when the keys themselves +are truly the same. (note: in versions of the db library prior to +about November 1996, such duplicate keys were retained so it was +possible to recover the original keys in sets of keys that +compared as equal). + + +=back + +=head2 Handling Duplicate Keys + +The BTREE file type optionally allows a single key to be associated +with an arbitrary number of values. This option is enabled by setting +the flags element of C<$DB_BTREE> to R_DUP when creating the database. + +There are some difficulties in using the tied hash interface if you +want to manipulate a BTREE database with duplicate keys. Consider this +code: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, %h) ; + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the associative array + # and print each key/value pair. + foreach (sort keys %h) + { print "$_ -> $h{$_}\n" } + + untie %h ; + +Here is the output: + + Smith -> John + Wall -> Larry + Wall -> Larry + Wall -> Larry + mouse -> mickey + +As you can see 3 records have been successfully created with key C +- the only thing is, when they are retrieved from the database they +I to have the same value, namely C. The problem is caused +by the way that the associative array interface works. Basically, when +the associative array interface is used to fetch the value associated +with a given key, it will only ever retrieve the first value. + +Although it may not be immediately obvious from the code above, the +associative array interface can be used to write values with duplicate +keys, but it cannot be used to read them back from the database. + +The way to get around this problem is to use the Berkeley DB API method +called C. This method allows sequential access to key/value +pairs. See L for details of both the C method +and the API in general. + +Here is the script above rewritten using the C API method. + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $status, $key, $value) ; + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the btree using seq + # and print each key/value pair. + $key = $value = 0 ; + for ($status = $x->seq($key, $value, R_FIRST) ; + $status == 0 ; + $status = $x->seq($key, $value, R_NEXT) ) + { print "$key -> $value\n" } + + undef $x ; + untie %h ; + +that prints: + + Smith -> John + Wall -> Brick + Wall -> Brick + Wall -> Larry + mouse -> mickey + +This time we have got all the key/value pairs, including the multiple +values associated with the key C. + +To make life easier when dealing with duplicate keys, B comes with +a few utility methods. + +=head2 The get_dup() Method + +The C method assists in +reading duplicate values from BTREE databases. The method can take the +following forms: + + $count = $x->get_dup($key) ; + @list = $x->get_dup($key) ; + %list = $x->get_dup($key, 1) ; + +In a scalar context the method returns the number of values associated +with the key, C<$key>. + +In list context, it returns all the values which match C<$key>. Note +that the values will be returned in an apparently random order. + +In list context, if the second parameter is present and evaluates +TRUE, the method returns an associative array. The keys of the +associative array correspond to the values that matched in the BTREE +and the values of the array are a count of the number of times that +particular value occurred in the BTREE. + +So assuming the database created above, we can use C like +this: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + my $cnt = $x->get_dup("Wall") ; + print "Wall occurred $cnt times\n" ; + + my %hash = $x->get_dup("Wall", 1) ; + print "Larry is there\n" if $hash{'Larry'} ; + print "There are $hash{'Brick'} Brick Walls\n" ; + + my @list = sort $x->get_dup("Wall") ; + print "Wall => [@list]\n" ; + + @list = $x->get_dup("Smith") ; + print "Smith => [@list]\n" ; + + @list = $x->get_dup("Dog") ; + print "Dog => [@list]\n" ; + + +and it will print: + + Wall occurred 3 times + Larry is there + There are 2 Brick Walls + Wall => [Brick Brick Larry] + Smith => [John] + Dog => [] + +=head2 The find_dup() Method + + $status = $X->find_dup($key, $value) ; + +This method checks for the existence of a specific key/value pair. If the +pair exists, the cursor is left pointing to the pair and the method +returns 0. Otherwise the method returns a non-zero value. + +Assuming the database from the previous example: + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; + print "Harry Wall is $found there\n" ; + + undef $x ; + untie %h ; + +prints this + + Larry Wall is there + Harry Wall is not there + + +=head2 The del_dup() Method + + $status = $X->del_dup($key, $value) ; + +This method deletes a specific key/value pair. It returns +0 if they exist and have been deleted successfully. +Otherwise the method returns a non-zero value. + +Again assuming the existence of the C database + + use warnings ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found) ; + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $x->del_dup("Wall", "Larry") ; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + undef $x ; + untie %h ; + +prints this + + Larry Wall is not there + +=head2 Matching Partial Keys + +The BTREE interface has a feature which allows partial keys to be +matched. This functionality is I available when the C method +is used along with the R_CURSOR flag. + + $x->seq($key, $value, R_CURSOR) ; + +Here is the relevant quote from the dbopen man page where it defines +the use of the R_CURSOR flag with seq: + + Note, for the DB_BTREE access method, the returned key is not + necessarily an exact match for the specified key. The returned key + is the smallest key greater than or equal to the specified key, + permitting partial key matches and range searches. + +In the example script below, the C sub uses this feature to find +and print the first matching key/value pair given a partial key. + + use warnings ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($filename, $x, %h, $st, $key, $value) ; + + sub match + { + my $key = shift ; + my $value = 0; + my $orig_key = $key ; + $x->seq($key, $value, R_CURSOR) ; + print "$orig_key\t-> $key\t-> $value\n" ; + } + + $filename = "tree" ; + unlink $filename ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'mouse'} = 'mickey' ; + $h{'Wall'} = 'Larry' ; + $h{'Walls'} = 'Brick' ; + $h{'Smith'} = 'John' ; + + + $key = $value = 0 ; + print "IN ORDER\n" ; + for ($st = $x->seq($key, $value, R_FIRST) ; + $st == 0 ; + $st = $x->seq($key, $value, R_NEXT) ) + + { print "$key -> $value\n" } + + print "\nPARTIAL MATCH\n" ; + + match "Wa" ; + match "A" ; + match "a" ; + + undef $x ; + untie %h ; + +Here is the output: + + IN ORDER + Smith -> John + Wall -> Larry + Walls -> Brick + mouse -> mickey + + PARTIAL MATCH + Wa -> Wall -> Larry + A -> Smith -> John + a -> mouse -> mickey + +=head1 DB_RECNO + +DB_RECNO provides an interface to flat text files. Both variable and +fixed length records are supported. + +In order to make RECNO more compatible with Perl, the array offset for +all RECNO arrays begins at 0 rather than 1 as in Berkeley DB. + +As with normal Perl arrays, a RECNO array can be accessed using +negative indexes. The index -1 refers to the last element of the array, +-2 the second last, and so on. Attempting to access an element before +the start of the array will raise a fatal run-time error. + +=head2 The 'bval' Option + +The operation of the bval option warrants some discussion. Here is the +definition of bval from the Berkeley DB 1.85 recno manual page: + + The delimiting byte to be used to mark the end of a + record for variable-length records, and the pad charac- + ter for fixed-length records. If no value is speci- + fied, newlines (``\n'') are used to mark the end of + variable-length records and fixed-length records are + padded with spaces. + +The second sentence is wrong. In actual fact bval will only default to +C<"\n"> when the openinfo parameter in dbopen is NULL. If a non-NULL +openinfo parameter is used at all, the value that happens to be in bval +will be used. That means you always have to specify bval when making +use of any of the options in the openinfo parameter. This documentation +error will be fixed in the next release of Berkeley DB. + +That clarifies the situation with regards Berkeley DB itself. What +about B? Well, the behavior defined in the quote above is +quite useful, so B conforms to it. + +That means that you can specify other options (e.g. cachesize) and +still have bval default to C<"\n"> for variable length records, and +space for fixed length records. + +Also note that the bval option only allows you to specify a single byte +as a delimiter. + +=head2 A Simple Example + +Here is a simple example that uses RECNO (if you are using a version +of Perl earlier than 5.004_57 this example won't work -- see +L for a workaround). + + use warnings ; + use strict ; + use DB_File ; + + my $filename = "text" ; + unlink $filename ; + + my @h ; + tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_RECNO + or die "Cannot open file 'text': $!\n" ; + + # Add a few key/value pairs to the file + $h[0] = "orange" ; + $h[1] = "blue" ; + $h[2] = "yellow" ; + + push @h, "green", "black" ; + + my $elements = scalar @h ; + print "The array contains $elements entries\n" ; + + my $last = pop @h ; + print "popped $last\n" ; + + unshift @h, "white" ; + my $first = shift @h ; + print "shifted $first\n" ; + + # Check for existence of a key + print "Element 1 Exists with value $h[1]\n" if $h[1] ; + + # use a negative index + print "The last element is $h[-1]\n" ; + print "The 2nd last element is $h[-2]\n" ; + + untie @h ; + +Here is the output from the script: + + The array contains 5 entries + popped black + shifted white + Element 1 Exists with value blue + The last element is green + The 2nd last element is yellow + +=head2 Extra RECNO Methods + +If you are using a version of Perl earlier than 5.004_57, the tied +array interface is quite limited. In the example script above +C, C, C, C +or determining the array length will not work with a tied array. + +To make the interface more useful for older versions of Perl, a number +of methods are supplied with B to simulate the missing array +operations. All these methods are accessed via the object returned from +the tie call. + +Here are the methods: + +=over 5 + +=item B<$X-Epush(list) ;> + +Pushes the elements of C to the end of the array. + +=item B<$value = $X-Epop ;> + +Removes and returns the last element of the array. + +=item B<$X-Eshift> + +Removes and returns the first element of the array. + +=item B<$X-Eunshift(list) ;> + +Pushes the elements of C to the start of the array. + +=item B<$X-Elength> + +Returns the number of elements in the array. + +=item B<$X-Esplice(offset, length, elements);> + +Returns a splice of the array. + +=back + +=head2 Another Example + +Here is a more complete example that makes use of some of the methods +described above. It also makes use of the API interface directly (see +L). + + use warnings ; + use strict ; + my (@h, $H, $file, $i) ; + use DB_File ; + use Fcntl ; + + $file = "text" ; + + unlink $file ; + + $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0666, $DB_RECNO + or die "Cannot open file $file: $!\n" ; + + # first create a text file to play with + $h[0] = "zero" ; + $h[1] = "one" ; + $h[2] = "two" ; + $h[3] = "three" ; + $h[4] = "four" ; + + + # Print the records in order. + # + # The length method is needed here because evaluating a tied + # array in a scalar context does not return the number of + # elements in the array. + + print "\nORIGINAL\n" ; + foreach $i (0 .. $H->length - 1) { + print "$i: $h[$i]\n" ; + } + + # use the push & pop methods + $a = $H->pop ; + $H->push("last") ; + print "\nThe last record was [$a]\n" ; + + # and the shift & unshift methods + $a = $H->shift ; + $H->unshift("first") ; + print "The first record was [$a]\n" ; + + # Use the API to add a new record after record 2. + $i = 2 ; + $H->put($i, "Newbie", R_IAFTER) ; + + # and a new record before record 1. + $i = 1 ; + $H->put($i, "New One", R_IBEFORE) ; + + # delete record 3 + $H->del(3) ; + + # now print the records in reverse order + print "\nREVERSE\n" ; + for ($i = $H->length - 1 ; $i >= 0 ; -- $i) + { print "$i: $h[$i]\n" } + + # same again, but use the API functions instead + print "\nREVERSE again\n" ; + my ($s, $k, $v) = (0, 0, 0) ; + for ($s = $H->seq($k, $v, R_LAST) ; + $s == 0 ; + $s = $H->seq($k, $v, R_PREV)) + { print "$k: $v\n" } + + undef $H ; + untie @h ; + +and this is what it outputs: + + ORIGINAL + 0: zero + 1: one + 2: two + 3: three + 4: four + + The last record was [four] + The first record was [zero] + + REVERSE + 5: last + 4: three + 3: Newbie + 2: one + 1: New One + 0: first + + REVERSE again + 5: last + 4: three + 3: Newbie + 2: one + 1: New One + 0: first + +Notes: + +=over 5 + +=item 1. + +Rather than iterating through the array, C<@h> like this: + + foreach $i (@h) + +it is necessary to use either this: + + foreach $i (0 .. $H->length - 1) + +or this: + + for ($a = $H->get($k, $v, R_FIRST) ; + $a == 0 ; + $a = $H->get($k, $v, R_NEXT) ) + +=item 2. + +Notice that both times the C method was used the record index was +specified using a variable, C<$i>, rather than the literal value +itself. This is because C will return the record number of the +inserted line via that parameter. + +=back + +=head1 THE API INTERFACE + +As well as accessing Berkeley DB using a tied hash or array, it is also +possible to make direct use of most of the API functions defined in the +Berkeley DB documentation. + +To do this you need to store a copy of the object returned from the tie. + + $db = tie %hash, "DB_File", "filename" ; + +Once you have done that, you can access the Berkeley DB API functions +as B methods directly like this: + + $db->put($key, $value, R_NOOVERWRITE) ; + +B If you have saved a copy of the object returned from +C, the underlying database file will I be closed until both +the tied variable is untied and all copies of the saved object are +destroyed. + + use DB_File ; + $db = tie %hash, "DB_File", "filename" + or die "Cannot tie filename: $!" ; + ... + undef $db ; + untie %hash ; + +See L for more details. + +All the functions defined in L are available except for +close() and dbopen() itself. The B method interface to the +supported functions have been implemented to mirror the way Berkeley DB +works whenever possible. In particular note that: + +=over 5 + +=item * + +The methods return a status value. All return 0 on success. +All return -1 to signify an error and set C<$!> to the exact +error code. The return code 1 generally (but not always) means that the +key specified did not exist in the database. + +Other return codes are defined. See below and in the Berkeley DB +documentation for details. The Berkeley DB documentation should be used +as the definitive source. + +=item * + +Whenever a Berkeley DB function returns data via one of its parameters, +the equivalent B method does exactly the same. + +=item * + +If you are careful, it is possible to mix API calls with the tied +hash/array interface in the same piece of code. Although only a few of +the methods used to implement the tied interface currently make use of +the cursor, you should always assume that the cursor has been changed +any time the tied hash/array interface is used. As an example, this +code will probably not do what you expect: + + $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE + or die "Cannot tie $filename: $!" ; + + # Get the first key/value pair and set the cursor + $X->seq($key, $value, R_FIRST) ; + + # this line will modify the cursor + $count = scalar keys %x ; + + # Get the second key/value pair. + # oops, it didn't, it got the last key/value pair! + $X->seq($key, $value, R_NEXT) ; + +The code above can be rearranged to get around the problem, like this: + + $X = tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE + or die "Cannot tie $filename: $!" ; + + # this line will modify the cursor + $count = scalar keys %x ; + + # Get the first key/value pair and set the cursor + $X->seq($key, $value, R_FIRST) ; + + # Get the second key/value pair. + # worked this time. + $X->seq($key, $value, R_NEXT) ; + +=back + +All the constants defined in L for use in the flags parameters +in the methods defined below are also available. Refer to the Berkeley +DB documentation for the precise meaning of the flags values. + +Below is a list of the methods available. + +=over 5 + +=item B<$status = $X-Eget($key, $value [, $flags]) ;> + +Given a key (C<$key>) this method reads the value associated with it +from the database. The value read from the database is returned in the +C<$value> parameter. + +If the key does not exist the method returns 1. + +No flags are currently defined for this method. + +=item B<$status = $X-Eput($key, $value [, $flags]) ;> + +Stores the key/value pair in the database. + +If you use either the R_IAFTER or R_IBEFORE flags, the C<$key> parameter +will have the record number of the inserted key/value pair set. + +Valid flags are R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE and +R_SETCURSOR. + +=item B<$status = $X-Edel($key [, $flags]) ;> + +Removes all key/value pairs with key C<$key> from the database. + +A return code of 1 means that the requested key was not in the +database. + +R_CURSOR is the only valid flag at present. + +=item B<$status = $X-Efd ;> + +Returns the file descriptor for the underlying database. + +See L for an explanation for why you should +not use C to lock your database. + +=item B<$status = $X-Eseq($key, $value, $flags) ;> + +This interface allows sequential retrieval from the database. See +L for full details. + +Both the C<$key> and C<$value> parameters will be set to the key/value +pair read from the database. + +The flags parameter is mandatory. The valid flag values are R_CURSOR, +R_FIRST, R_LAST, R_NEXT and R_PREV. + +=item B<$status = $X-Esync([$flags]) ;> + +Flushes any cached buffers to disk. + +R_RECNOSYNC is the only valid flag at present. + +=back + +=head1 DBM FILTERS + +A DBM Filter is a piece of code that is be used when you I +want to make the same transformation to all keys and/or values in a +DBM database. + +There are four methods associated with DBM Filters. All work identically, +and each is used to install (or uninstall) a single DBM Filter. Each +expects a single parameter, namely a reference to a sub. The only +difference between them is the place that the filter is installed. + +To summarise: + +=over 5 + +=item B + +If a filter has been installed with this method, it will be invoked +every time you write a key to a DBM database. + +=item B + +If a filter has been installed with this method, it will be invoked +every time you write a value to a DBM database. + + +=item B + +If a filter has been installed with this method, it will be invoked +every time you read a key from a DBM database. + +=item B + +If a filter has been installed with this method, it will be invoked +every time you read a value from a DBM database. + +=back + +You can use any combination of the methods, from none, to all four. + +All filter methods return the existing filter, if present, or C +in not. + +To delete a filter pass C to it. + +=head2 The Filter + +When each filter is called by Perl, a local copy of C<$_> will contain +the key or value to be filtered. Filtering is achieved by modifying +the contents of C<$_>. The return code from the filter is ignored. + +=head2 An Example -- the NULL termination problem. + +Consider the following scenario. You have a DBM database +that you need to share with a third-party C application. The C application +assumes that I keys and values are NULL terminated. Unfortunately +when Perl writes to DBM databases it doesn't use NULL termination, so +your Perl application will have to manage NULL termination itself. When +you write to the database you will have to use something like this: + + $hash{"$key\0"} = "$value\0" ; + +Similarly the NULL needs to be taken into account when you are considering +the length of existing keys/values. + +It would be much better if you could ignore the NULL terminations issue +in the main application code and have a mechanism that automatically +added the terminating NULL to all keys and values whenever you write to +the database and have them removed when you read from the database. As I'm +sure you have already guessed, this is a problem that DBM Filters can +fix very easily. + + use warnings ; + use strict ; + use DB_File ; + + my %hash ; + my $filename = "filt" ; + unlink $filename ; + + my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH + or die "Cannot open $filename: $!\n" ; + + # Install DBM Filters + $db->filter_fetch_key ( sub { s/\0$// } ) ; + $db->filter_store_key ( sub { $_ .= "\0" } ) ; + $db->filter_fetch_value( sub { s/\0$// } ) ; + $db->filter_store_value( sub { $_ .= "\0" } ) ; + + $hash{"abc"} = "def" ; + my $a = $hash{"ABC"} ; + # ... + undef $db ; + untie %hash ; + +Hopefully the contents of each of the filters should be +self-explanatory. Both "fetch" filters remove the terminating NULL, +and both "store" filters add a terminating NULL. + + +=head2 Another Example -- Key is a C int. + +Here is another real-life example. By default, whenever Perl writes to +a DBM database it always writes the key and value as strings. So when +you use this: + + $hash{12345} = "something" ; + +the key 12345 will get stored in the DBM database as the 5 byte string +"12345". If you actually want the key to be stored in the DBM database +as a C int, you will have to use C when writing, and C +when reading. + +Here is a DBM Filter that does it: + + use warnings ; + use strict ; + use DB_File ; + my %hash ; + my $filename = "filt" ; + unlink $filename ; + + + my $db = tie %hash, 'DB_File', $filename, O_CREAT|O_RDWR, 0666, $DB_HASH + or die "Cannot open $filename: $!\n" ; + + $db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ; + $db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ; + $hash{123} = "def" ; + # ... + undef $db ; + untie %hash ; + +This time only two filters have been used -- we only need to manipulate +the contents of the key, so it wasn't necessary to install any value +filters. + +=head1 HINTS AND TIPS + + +=head2 Locking: The Trouble with fd + +Until version 1.72 of this module, the recommended technique for locking +B databases was to flock the filehandle returned from the "fd" +function. Unfortunately this technique has been shown to be fundamentally +flawed (Kudos to David Harris for tracking this down). Use it at your own +peril! + +The locking technique went like this. + + $db = tie(%db, 'DB_File', 'foo.db', O_CREAT|O_RDWR, 0644) + || die "dbcreat foo.db $!"; + $fd = $db->fd; + open(DB_FH, "+<&=$fd") || die "dup $!"; + flock (DB_FH, LOCK_EX) || die "flock: $!"; + ... + $db{"Tom"} = "Jerry" ; + ... + flock(DB_FH, LOCK_UN); + undef $db; + untie %db; + close(DB_FH); + +In simple terms, this is what happens: + +=over 5 + +=item 1. + +Use "tie" to open the database. + +=item 2. + +Lock the database with fd & flock. + +=item 3. + +Read & Write to the database. + +=item 4. + +Unlock and close the database. + +=back + +Here is the crux of the problem. A side-effect of opening the B +database in step 2 is that an initial block from the database will get +read from disk and cached in memory. + +To see why this is a problem, consider what can happen when two processes, +say "A" and "B", both want to update the same B database +using the locking steps outlined above. Assume process "A" has already +opened the database and has a write lock, but it hasn't actually updated +the database yet (it has finished step 2, but not started step 3 yet). Now +process "B" tries to open the same database - step 1 will succeed, +but it will block on step 2 until process "A" releases the lock. The +important thing to notice here is that at this point in time both +processes will have cached identical initial blocks from the database. + +Now process "A" updates the database and happens to change some of the +data held in the initial buffer. Process "A" terminates, flushing +all cached data to disk and releasing the database lock. At this point +the database on disk will correctly reflect the changes made by process +"A". + +With the lock released, process "B" can now continue. It also updates the +database and unfortunately it too modifies the data that was in its +initial buffer. Once that data gets flushed to disk it will overwrite +some/all of the changes process "A" made to the database. + +The result of this scenario is at best a database that doesn't contain +what you expect. At worst the database will corrupt. + +The above won't happen every time competing process update the same +B database, but it does illustrate why the technique should +not be used. + +=head2 Safe ways to lock a database + +Starting with version 2.x, Berkeley DB has internal support for locking. +The companion module to this one, B, provides an interface +to this locking functionality. If you are serious about locking +Berkeley DB databases, I strongly recommend using B. + +If using B isn't an option, there are a number of modules +available on CPAN that can be used to implement locking. Each one +implements locking differently and has different goals in mind. It is +therefore worth knowing the difference, so that you can pick the right +one for your application. Here are the three locking wrappers: + +=over 5 + +=item B + +A B wrapper which creates copies of the database file for +read access, so that you have a kind of a multiversioning concurrent read +system. However, updates are still serial. Use for databases where reads +may be lengthy and consistency problems may occur. + +=item B + +A B wrapper that has the ability to lock and unlock the database +while it is being used. Avoids the tie-before-flock problem by simply +re-tie-ing the database when you get or drop a lock. Because of the +flexibility in dropping and re-acquiring the lock in the middle of a +session, this can be massaged into a system that will work with long +updates and/or reads if the application follows the hints in the POD +documentation. + +=item B + +An extremely lightweight B wrapper that simply flocks a lockfile +before tie-ing the database and drops the lock after the untie. Allows +one to use the same lockfile for multiple databases to avoid deadlock +problems, if desired. Use for databases where updates are reads are +quick and simple flock locking semantics are enough. + +=back + +=head2 Sharing Databases With C Applications + +There is no technical reason why a Berkeley DB database cannot be +shared by both a Perl and a C application. + +The vast majority of problems that are reported in this area boil down +to the fact that C strings are NULL terminated, whilst Perl strings are +not. See L for a generic way to work around this problem. + +Here is a real example. Netscape 2.0 keeps a record of the locations you +visit along with the time you last visited them in a DB_HASH database. +This is usually stored in the file F<~/.netscape/history.db>. The key +field in the database is the location string and the value field is the +time the location was last visited stored as a 4 byte binary value. + +If you haven't already guessed, the location string is stored with a +terminating NULL. This means you need to be careful when accessing the +database. + +Here is a snippet of code that is loosely based on Tom Christiansen's +I script (available from your nearest CPAN archive in +F). + + use warnings ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($dotdir, $HISTORY, %hist_db, $href, $binary_time, $date) ; + $dotdir = $ENV{HOME} || $ENV{LOGNAME}; + + $HISTORY = "$dotdir/.netscape/history.db"; + + tie %hist_db, 'DB_File', $HISTORY + or die "Cannot open $HISTORY: $!\n" ;; + + # Dump the complete database + while ( ($href, $binary_time) = each %hist_db ) { + + # remove the terminating NULL + $href =~ s/\x00$// ; + + # convert the binary time into a user friendly string + $date = localtime unpack("V", $binary_time); + print "$date $href\n" ; + } + + # check for the existence of a specific key + # remember to add the NULL + if ( $binary_time = $hist_db{"http://mox.perl.com/\x00"} ) { + $date = localtime unpack("V", $binary_time) ; + print "Last visited mox.perl.com on $date\n" ; + } + else { + print "Never visited mox.perl.com\n" + } + + untie %hist_db ; + +=head2 The untie() Gotcha + +If you make use of the Berkeley DB API, it is I strongly +recommended that you read L. + +Even if you don't currently make use of the API interface, it is still +worth reading it. + +Here is an example which illustrates the problem from a B +perspective: + + use DB_File ; + use Fcntl ; + + my %x ; + my $X ; + + $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_TRUNC + or die "Cannot tie first time: $!" ; + + $x{123} = 456 ; + + untie %x ; + + tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT + or die "Cannot tie second time: $!" ; + + untie %x ; + +When run, the script will produce this error message: + + Cannot tie second time: Invalid argument at bad.file line 14. + +Although the error message above refers to the second tie() statement +in the script, the source of the problem is really with the untie() +statement that precedes it. + +Having read L you will probably have already guessed that the +error is caused by the extra copy of the tied object stored in C<$X>. +If you haven't, then the problem boils down to the fact that the +B destructor, DESTROY, will not be called until I +references to the tied object are destroyed. Both the tied variable, +C<%x>, and C<$X> above hold a reference to the object. The call to +untie() will destroy the first, but C<$X> still holds a valid +reference, so the destructor will not get called and the database file +F will remain open. The fact that Berkeley DB then reports the +attempt to open a database that is already open via the catch-all +"Invalid argument" doesn't help. + +If you run the script with the C<-w> flag the error message becomes: + + untie attempted while 1 inner references still exist at bad.file line 12. + Cannot tie second time: Invalid argument at bad.file line 14. + +which pinpoints the real problem. Finally the script can now be +modified to fix the original problem by destroying the API object +before the untie: + + ... + $x{123} = 456 ; + + undef $X ; + untie %x ; + + $X = tie %x, 'DB_File', 'tst.fil' , O_RDWR|O_CREAT + ... + + +=head1 COMMON QUESTIONS + +=head2 Why is there Perl source in my database? + +If you look at the contents of a database file created by DB_File, +there can sometimes be part of a Perl script included in it. + +This happens because Berkeley DB uses dynamic memory to allocate +buffers which will subsequently be written to the database file. Being +dynamic, the memory could have been used for anything before DB +malloced it. As Berkeley DB doesn't clear the memory once it has been +allocated, the unused portions will contain random junk. In the case +where a Perl script gets written to the database, the random junk will +correspond to an area of dynamic memory that happened to be used during +the compilation of the script. + +Unless you don't like the possibility of there being part of your Perl +scripts embedded in a database file, this is nothing to worry about. + +=head2 How do I store complex data structures with DB_File? + +Although B cannot do this directly, there is a module which +can layer transparently over B to accomplish this feat. + +Check out the MLDBM module, available on CPAN in the directory +F. + +=head2 What does "Invalid Argument" mean? + +You will get this error message when one of the parameters in the +C call is wrong. Unfortunately there are quite a few parameters to +get wrong, so it can be difficult to figure out which one it is. + +Here are a couple of possibilities: + +=over 5 + +=item 1. + +Attempting to reopen a database without closing it. + +=item 2. + +Using the O_WRONLY flag. + +=back + +=head2 What does "Bareword 'DB_File' not allowed" mean? + +You will encounter this particular error message when you have the +C pragma (or the full strict pragma) in your script. +Consider this script: + + use warnings ; + use strict ; + use DB_File ; + my %x ; + tie %x, DB_File, "filename" ; + +Running it produces the error in question: + + Bareword "DB_File" not allowed while "strict subs" in use + +To get around the error, place the word C in either single or +double quotes, like this: + + tie %x, "DB_File", "filename" ; + +Although it might seem like a real pain, it is really worth the effort +of having a C in all your scripts. + +=head1 REFERENCES + +Articles that are either about B or make use of it. + +=over 5 + +=item 1. + +I, Tim Kientzle (tkientzle@ddj.com), +Dr. Dobb's Journal, Issue 295, January 1999, pp 34-41 + +=back + +=head1 HISTORY + +Moved to the Changes file. + +=head1 BUGS + +Some older versions of Berkeley DB had problems with fixed length +records using the RECNO file format. This problem has been fixed since +version 1.85 of Berkeley DB. + +I am sure there are bugs in the code. If you do find any, or can +suggest any enhancements, I would welcome your comments. + +=head1 AVAILABILITY + +B comes with the standard Perl source distribution. Look in +the directory F. Given the amount of time between releases +of Perl the version that ships with Perl is quite likely to be out of +date, so the most recent version can always be found on CPAN (see +L for details), in the directory +F. + +This version of B will work with either version 1.x, 2.x or +3.x of Berkeley DB, but is limited to the functionality provided by +version 1. + +The official web site for Berkeley DB is F. +All versions of Berkeley DB are available there. + +Alternatively, Berkeley DB version 1 is available at your nearest CPAN +archive in F. + +=head1 COPYRIGHT + +Copyright (c) 1995-2012 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. + +Although B is covered by the Perl license, the library it +makes use of, namely Berkeley DB, is not. Berkeley DB has its own +copyright and its own license. Please take the time to read it. + +Here are a few words taken from the Berkeley DB FAQ (at +F) regarding the license: + + Do I have to license DB to use it in Perl scripts? + + No. The Berkeley DB license requires that software that uses + Berkeley DB be freely redistributable. In the case of Perl, that + software is Perl, and not your scripts. Any Perl scripts that you + write are your property, including scripts that make use of + Berkeley DB. Neither the Perl license nor the Berkeley DB license + place any restriction on what you may do with them. + +If you are in any doubt about the license situation, contact either the +Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details. + + +=head1 SEE ALSO + +L, L, L, L, L, +L + +=head1 AUTHOR + +The DB_File interface was written by Paul Marquess +Epmqs@cpan.orgE. + +=cut diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/auto/DB_File/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/lib/auto/DB_File/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/man1/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/man1/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/man3/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/man3/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/man3/DB_File.3pm b/fastSum/resources/ROUGE/DB_File-1.835/blib/man3/DB_File.3pm new file mode 100644 index 0000000..f100827 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/blib/man3/DB_File.3pm @@ -0,0 +1,1783 @@ +.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is turned on, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{ +. if \nF \{ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "DB_File 3pm" +.TH DB_File 3pm "2019-09-27" "perl v5.22.1" "User Contributed Perl Documentation" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH "NAME" +DB_File \- Perl5 access to Berkeley DB version 1.x +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +.Vb 1 +\& use DB_File; +\& +\& [$X =] tie %hash, \*(AqDB_File\*(Aq, [$filename, $flags, $mode, $DB_HASH] ; +\& [$X =] tie %hash, \*(AqDB_File\*(Aq, $filename, $flags, $mode, $DB_BTREE ; +\& [$X =] tie @array, \*(AqDB_File\*(Aq, $filename, $flags, $mode, $DB_RECNO ; +\& +\& $status = $X\->del($key [, $flags]) ; +\& $status = $X\->put($key, $value [, $flags]) ; +\& $status = $X\->get($key, $value [, $flags]) ; +\& $status = $X\->seq($key, $value, $flags) ; +\& $status = $X\->sync([$flags]) ; +\& $status = $X\->fd ; +\& +\& # BTREE only +\& $count = $X\->get_dup($key) ; +\& @list = $X\->get_dup($key) ; +\& %list = $X\->get_dup($key, 1) ; +\& $status = $X\->find_dup($key, $value) ; +\& $status = $X\->del_dup($key, $value) ; +\& +\& # RECNO only +\& $a = $X\->length; +\& $a = $X\->pop ; +\& $X\->push(list); +\& $a = $X\->shift; +\& $X\->unshift(list); +\& @r = $X\->splice(offset, length, elements); +\& +\& # DBM Filters +\& $old_filter = $db\->filter_store_key ( sub { ... } ) ; +\& $old_filter = $db\->filter_store_value( sub { ... } ) ; +\& $old_filter = $db\->filter_fetch_key ( sub { ... } ) ; +\& $old_filter = $db\->filter_fetch_value( sub { ... } ) ; +\& +\& untie %hash ; +\& untie @array ; +.Ve +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +\&\fBDB_File\fR is a module which allows Perl programs to make use of the +facilities provided by Berkeley \s-1DB\s0 version 1.x (if you have a newer +version of \s-1DB,\s0 see \*(L"Using DB_File with Berkeley \s-1DB\s0 version 2 or greater\*(R"). +It is assumed that you have a copy of the Berkeley \s-1DB\s0 manual pages at +hand when reading this documentation. The interface defined here +mirrors the Berkeley \s-1DB\s0 interface closely. +.PP +Berkeley \s-1DB\s0 is a C library which provides a consistent interface to a +number of database formats. \fBDB_File\fR provides an interface to all +three of the database types currently supported by Berkeley \s-1DB.\s0 +.PP +The file types are: +.IP "\fB\s-1DB_HASH\s0\fR" 5 +.IX Item "DB_HASH" +This database type allows arbitrary key/value pairs to be stored in data +files. This is equivalent to the functionality provided by other +hashing packages like \s-1DBM, NDBM, ODBM, GDBM,\s0 and \s-1SDBM.\s0 Remember though, +the files created using \s-1DB_HASH\s0 are not compatible with any of the +other packages mentioned. +.Sp +A default hashing algorithm, which will be adequate for most +applications, is built into Berkeley \s-1DB.\s0 If you do need to use your own +hashing algorithm it is possible to write your own in Perl and have +\&\fBDB_File\fR use it instead. +.IP "\fB\s-1DB_BTREE\s0\fR" 5 +.IX Item "DB_BTREE" +The btree format allows arbitrary key/value pairs to be stored in a +sorted, balanced binary tree. +.Sp +As with the \s-1DB_HASH\s0 format, it is possible to provide a user defined +Perl routine to perform the comparison of keys. By default, though, the +keys are stored in lexical order. +.IP "\fB\s-1DB_RECNO\s0\fR" 5 +.IX Item "DB_RECNO" +\&\s-1DB_RECNO\s0 allows both fixed-length and variable-length flat text files +to be manipulated using the same key/value pair interface as in \s-1DB_HASH\s0 +and \s-1DB_BTREE. \s0 In this case the key will consist of a record (line) +number. +.SS "Using DB_File with Berkeley \s-1DB\s0 version 2 or greater" +.IX Subsection "Using DB_File with Berkeley DB version 2 or greater" +Although \fBDB_File\fR is intended to be used with Berkeley \s-1DB\s0 version 1, +it can also be used with version 2, 3 or 4. In this case the interface is +limited to the functionality provided by Berkeley \s-1DB 1\s0.x. Anywhere the +version 2 or greater interface differs, \fBDB_File\fR arranges for it to work +like version 1. This feature allows \fBDB_File\fR scripts that were built +with version 1 to be migrated to version 2 or greater without any changes. +.PP +If you want to make use of the new features available in Berkeley \s-1DB +2\s0.x or greater, use the Perl module \fBBerkeleyDB\fR instead. +.PP +\&\fBNote:\fR The database file format has changed multiple times in Berkeley +\&\s-1DB\s0 version 2, 3 and 4. If you cannot recreate your databases, you +must dump any existing databases with either the \f(CW\*(C`db_dump\*(C'\fR or the +\&\f(CW\*(C`db_dump185\*(C'\fR utility that comes with Berkeley \s-1DB.\s0 +Once you have rebuilt DB_File to use Berkeley \s-1DB\s0 version 2 or greater, +your databases can be recreated using \f(CW\*(C`db_load\*(C'\fR. Refer to the Berkeley \s-1DB\s0 +documentation for further details. +.PP +Please read \*(L"\s-1COPYRIGHT\*(R"\s0 before using version 2.x or greater of Berkeley +\&\s-1DB\s0 with DB_File. +.SS "Interface to Berkeley \s-1DB\s0" +.IX Subsection "Interface to Berkeley DB" +\&\fBDB_File\fR allows access to Berkeley \s-1DB\s0 files using the \fItie()\fR mechanism +in Perl 5 (for full details, see \*(L"\fItie()\fR\*(R" in perlfunc). This facility +allows \fBDB_File\fR to access Berkeley \s-1DB\s0 files using either an +associative array (for \s-1DB_HASH & DB_BTREE\s0 file types) or an ordinary +array (for the \s-1DB_RECNO\s0 file type). +.PP +In addition to the \fItie()\fR interface, it is also possible to access most +of the functions provided in the Berkeley \s-1DB API\s0 directly. +See \*(L"\s-1THE API INTERFACE\*(R"\s0. +.SS "Opening a Berkeley \s-1DB\s0 Database File" +.IX Subsection "Opening a Berkeley DB Database File" +Berkeley \s-1DB\s0 uses the function \fIdbopen()\fR to open or create a database. +Here is the C prototype for \fIdbopen()\fR: +.PP +.Vb 3 +\& DB* +\& dbopen (const char * file, int flags, int mode, +\& DBTYPE type, const void * openinfo) +.Ve +.PP +The parameter \f(CW\*(C`type\*(C'\fR is an enumeration which specifies which of the 3 +interface methods (\s-1DB_HASH, DB_BTREE\s0 or \s-1DB_RECNO\s0) is to be used. +Depending on which of these is actually chosen, the final parameter, +\&\fIopeninfo\fR points to a data structure which allows tailoring of the +specific interface method. +.PP +This interface is handled slightly differently in \fBDB_File\fR. Here is +an equivalent call using \fBDB_File\fR: +.PP +.Vb 1 +\& tie %array, \*(AqDB_File\*(Aq, $filename, $flags, $mode, $DB_HASH ; +.Ve +.PP +The \f(CW\*(C`filename\*(C'\fR, \f(CW\*(C`flags\*(C'\fR and \f(CW\*(C`mode\*(C'\fR parameters are the direct +equivalent of their \fIdbopen()\fR counterparts. The final parameter \f(CW$DB_HASH\fR +performs the function of both the \f(CW\*(C`type\*(C'\fR and \f(CW\*(C`openinfo\*(C'\fR parameters in +\&\fIdbopen()\fR. +.PP +In the example above \f(CW$DB_HASH\fR is actually a pre-defined reference to a +hash object. \fBDB_File\fR has three of these pre-defined references. +Apart from \f(CW$DB_HASH\fR, there is also \f(CW$DB_BTREE\fR and \f(CW$DB_RECNO\fR. +.PP +The keys allowed in each of these pre-defined references is limited to +the names used in the equivalent C structure. So, for example, the +\&\f(CW$DB_HASH\fR reference will only allow keys called \f(CW\*(C`bsize\*(C'\fR, \f(CW\*(C`cachesize\*(C'\fR, +\&\f(CW\*(C`ffactor\*(C'\fR, \f(CW\*(C`hash\*(C'\fR, \f(CW\*(C`lorder\*(C'\fR and \f(CW\*(C`nelem\*(C'\fR. +.PP +To change one of these elements, just assign to it like this: +.PP +.Vb 1 +\& $DB_HASH\->{\*(Aqcachesize\*(Aq} = 10000 ; +.Ve +.PP +The three predefined variables \f(CW$DB_HASH\fR, \f(CW$DB_BTREE\fR and \f(CW$DB_RECNO\fR are +usually adequate for most applications. If you do need to create extra +instances of these objects, constructors are available for each file +type. +.PP +Here are examples of the constructors and the valid options available +for \s-1DB_HASH, DB_BTREE\s0 and \s-1DB_RECNO\s0 respectively. +.PP +.Vb 7 +\& $a = new DB_File::HASHINFO ; +\& $a\->{\*(Aqbsize\*(Aq} ; +\& $a\->{\*(Aqcachesize\*(Aq} ; +\& $a\->{\*(Aqffactor\*(Aq}; +\& $a\->{\*(Aqhash\*(Aq} ; +\& $a\->{\*(Aqlorder\*(Aq} ; +\& $a\->{\*(Aqnelem\*(Aq} ; +\& +\& $b = new DB_File::BTREEINFO ; +\& $b\->{\*(Aqflags\*(Aq} ; +\& $b\->{\*(Aqcachesize\*(Aq} ; +\& $b\->{\*(Aqmaxkeypage\*(Aq} ; +\& $b\->{\*(Aqminkeypage\*(Aq} ; +\& $b\->{\*(Aqpsize\*(Aq} ; +\& $b\->{\*(Aqcompare\*(Aq} ; +\& $b\->{\*(Aqprefix\*(Aq} ; +\& $b\->{\*(Aqlorder\*(Aq} ; +\& +\& $c = new DB_File::RECNOINFO ; +\& $c\->{\*(Aqbval\*(Aq} ; +\& $c\->{\*(Aqcachesize\*(Aq} ; +\& $c\->{\*(Aqpsize\*(Aq} ; +\& $c\->{\*(Aqflags\*(Aq} ; +\& $c\->{\*(Aqlorder\*(Aq} ; +\& $c\->{\*(Aqreclen\*(Aq} ; +\& $c\->{\*(Aqbfname\*(Aq} ; +.Ve +.PP +The values stored in the hashes above are mostly the direct equivalent +of their C counterpart. Like their C counterparts, all are set to a +default values \- that means you don't have to set \fIall\fR of the +values when you only want to change one. Here is an example: +.PP +.Vb 3 +\& $a = new DB_File::HASHINFO ; +\& $a\->{\*(Aqcachesize\*(Aq} = 12345 ; +\& tie %y, \*(AqDB_File\*(Aq, "filename", $flags, 0777, $a ; +.Ve +.PP +A few of the options need extra discussion here. When used, the C +equivalent of the keys \f(CW\*(C`hash\*(C'\fR, \f(CW\*(C`compare\*(C'\fR and \f(CW\*(C`prefix\*(C'\fR store pointers +to C functions. In \fBDB_File\fR these keys are used to store references +to Perl subs. Below are templates for each of the subs: +.PP +.Vb 7 +\& sub hash +\& { +\& my ($data) = @_ ; +\& ... +\& # return the hash value for $data +\& return $hash ; +\& } +\& +\& sub compare +\& { +\& my ($key, $key2) = @_ ; +\& ... +\& # return 0 if $key1 eq $key2 +\& # \-1 if $key1 lt $key2 +\& # 1 if $key1 gt $key2 +\& return (\-1 , 0 or 1) ; +\& } +\& +\& sub prefix +\& { +\& my ($key, $key2) = @_ ; +\& ... +\& # return number of bytes of $key2 which are +\& # necessary to determine that it is greater than $key1 +\& return $bytes ; +\& } +.Ve +.PP +See \*(L"Changing the \s-1BTREE\s0 sort order\*(R" for an example of using the +\&\f(CW\*(C`compare\*(C'\fR template. +.PP +If you are using the \s-1DB_RECNO\s0 interface and you intend making use of +\&\f(CW\*(C`bval\*(C'\fR, you should check out \*(L"The 'bval' Option\*(R". +.SS "Default Parameters" +.IX Subsection "Default Parameters" +It is possible to omit some or all of the final 4 parameters in the +call to \f(CW\*(C`tie\*(C'\fR and let them take default values. As \s-1DB_HASH\s0 is the most +common file format used, the call: +.PP +.Vb 1 +\& tie %A, "DB_File", "filename" ; +.Ve +.PP +is equivalent to: +.PP +.Vb 1 +\& tie %A, "DB_File", "filename", O_CREAT|O_RDWR, 0666, $DB_HASH ; +.Ve +.PP +It is also possible to omit the filename parameter as well, so the +call: +.PP +.Vb 1 +\& tie %A, "DB_File" ; +.Ve +.PP +is equivalent to: +.PP +.Vb 1 +\& tie %A, "DB_File", undef, O_CREAT|O_RDWR, 0666, $DB_HASH ; +.Ve +.PP +See \*(L"In Memory Databases\*(R" for a discussion on the use of \f(CW\*(C`undef\*(C'\fR +in place of a filename. +.SS "In Memory Databases" +.IX Subsection "In Memory Databases" +Berkeley \s-1DB\s0 allows the creation of in-memory databases by using \s-1NULL +\&\s0(that is, a \f(CW\*(C`(char *)0\*(C'\fR in C) in place of the filename. \fBDB_File\fR +uses \f(CW\*(C`undef\*(C'\fR instead of \s-1NULL\s0 to provide this functionality. +.SH "DB_HASH" +.IX Header "DB_HASH" +The \s-1DB_HASH\s0 file format is probably the most commonly used of the three +file formats that \fBDB_File\fR supports. It is also very straightforward +to use. +.SS "A Simple Example" +.IX Subsection "A Simple Example" +This example shows how to create a database, add key/value pairs to the +database, delete keys/value pairs and finally how to enumerate the +contents of the database. +.PP +.Vb 4 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& our (%h, $k, $v) ; +\& +\& unlink "fruit" ; +\& tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0666, $DB_HASH +\& or die "Cannot open file \*(Aqfruit\*(Aq: $!\en"; +\& +\& # Add a few key/value pairs to the file +\& $h{"apple"} = "red" ; +\& $h{"orange"} = "orange" ; +\& $h{"banana"} = "yellow" ; +\& $h{"tomato"} = "red" ; +\& +\& # Check for existence of a key +\& print "Banana Exists\en\en" if $h{"banana"} ; +\& +\& # Delete a key/value pair. +\& delete $h{"apple"} ; +\& +\& # print the contents of the file +\& while (($k, $v) = each %h) +\& { print "$k \-> $v\en" } +\& +\& untie %h ; +.Ve +.PP +here is the output: +.PP +.Vb 1 +\& Banana Exists +\& +\& orange \-> orange +\& tomato \-> red +\& banana \-> yellow +.Ve +.PP +Note that the like ordinary associative arrays, the order of the keys +retrieved is in an apparently random order. +.SH "DB_BTREE" +.IX Header "DB_BTREE" +The \s-1DB_BTREE\s0 format is useful when you want to store data in a given +order. By default the keys will be stored in lexical order, but as you +will see from the example shown in the next section, it is very easy to +define your own sorting function. +.SS "Changing the \s-1BTREE\s0 sort order" +.IX Subsection "Changing the BTREE sort order" +This script shows how to override the default sorting algorithm that +\&\s-1BTREE\s0 uses. Instead of using the normal lexical ordering, a case +insensitive compare function will be used. +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my %h ; +\& +\& sub Compare +\& { +\& my ($key1, $key2) = @_ ; +\& "\eL$key1" cmp "\eL$key2" ; +\& } +\& +\& # specify the Perl sub that will do the comparison +\& $DB_BTREE\->{\*(Aqcompare\*(Aq} = \e&Compare ; +\& +\& unlink "tree" ; +\& tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open file \*(Aqtree\*(Aq: $!\en" ; +\& +\& # Add a key/value pair to the file +\& $h{\*(AqWall\*(Aq} = \*(AqLarry\*(Aq ; +\& $h{\*(AqSmith\*(Aq} = \*(AqJohn\*(Aq ; +\& $h{\*(Aqmouse\*(Aq} = \*(Aqmickey\*(Aq ; +\& $h{\*(Aqduck\*(Aq} = \*(Aqdonald\*(Aq ; +\& +\& # Delete +\& delete $h{"duck"} ; +\& +\& # Cycle through the keys printing them in order. +\& # Note it is not necessary to sort the keys as +\& # the btree will have kept them in order automatically. +\& foreach (keys %h) +\& { print "$_\en" } +\& +\& untie %h ; +.Ve +.PP +Here is the output from the code above. +.PP +.Vb 3 +\& mouse +\& Smith +\& Wall +.Ve +.PP +There are a few point to bear in mind if you want to change the +ordering in a \s-1BTREE\s0 database: +.IP "1." 5 +The new compare function must be specified when you create the database. +.IP "2." 5 +You cannot change the ordering once the database has been created. Thus +you must use the same compare function every time you access the +database. +.IP "3." 5 +Duplicate keys are entirely defined by the comparison function. +In the case-insensitive example above, the keys: '\s-1KEY\s0' and 'key' +would be considered duplicates, and assigning to the second one +would overwrite the first. If duplicates are allowed for (with the +R_DUP flag discussed below), only a single copy of duplicate keys +is stored in the database \-\-\- so (again with example above) assigning +three values to the keys: '\s-1KEY\s0', 'Key', and 'key' would leave just +the first key: '\s-1KEY\s0' in the database with three values. For some +situations this results in information loss, so care should be taken +to provide fully qualified comparison functions when necessary. +For example, the above comparison routine could be modified to +additionally compare case-sensitively if two keys are equal in the +case insensitive comparison: +.Sp +.Vb 5 +\& sub compare { +\& my($key1, $key2) = @_; +\& lc $key1 cmp lc $key2 || +\& $key1 cmp $key2; +\& } +.Ve +.Sp +And now you will only have duplicates when the keys themselves +are truly the same. (note: in versions of the db library prior to +about November 1996, such duplicate keys were retained so it was +possible to recover the original keys in sets of keys that +compared as equal). +.SS "Handling Duplicate Keys" +.IX Subsection "Handling Duplicate Keys" +The \s-1BTREE\s0 file type optionally allows a single key to be associated +with an arbitrary number of values. This option is enabled by setting +the flags element of \f(CW$DB_BTREE\fR to R_DUP when creating the database. +.PP +There are some difficulties in using the tied hash interface if you +want to manipulate a \s-1BTREE\s0 database with duplicate keys. Consider this +code: +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my ($filename, %h) ; +\& +\& $filename = "tree" ; +\& unlink $filename ; +\& +\& # Enable duplicate records +\& $DB_BTREE\->{\*(Aqflags\*(Aq} = R_DUP ; +\& +\& tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open $filename: $!\en"; +\& +\& # Add some key/value pairs to the file +\& $h{\*(AqWall\*(Aq} = \*(AqLarry\*(Aq ; +\& $h{\*(AqWall\*(Aq} = \*(AqBrick\*(Aq ; # Note the duplicate key +\& $h{\*(AqWall\*(Aq} = \*(AqBrick\*(Aq ; # Note the duplicate key and value +\& $h{\*(AqSmith\*(Aq} = \*(AqJohn\*(Aq ; +\& $h{\*(Aqmouse\*(Aq} = \*(Aqmickey\*(Aq ; +\& +\& # iterate through the associative array +\& # and print each key/value pair. +\& foreach (sort keys %h) +\& { print "$_ \-> $h{$_}\en" } +\& +\& untie %h ; +.Ve +.PP +Here is the output: +.PP +.Vb 5 +\& Smith \-> John +\& Wall \-> Larry +\& Wall \-> Larry +\& Wall \-> Larry +\& mouse \-> mickey +.Ve +.PP +As you can see 3 records have been successfully created with key \f(CW\*(C`Wall\*(C'\fR +\&\- the only thing is, when they are retrieved from the database they +\&\fIseem\fR to have the same value, namely \f(CW\*(C`Larry\*(C'\fR. The problem is caused +by the way that the associative array interface works. Basically, when +the associative array interface is used to fetch the value associated +with a given key, it will only ever retrieve the first value. +.PP +Although it may not be immediately obvious from the code above, the +associative array interface can be used to write values with duplicate +keys, but it cannot be used to read them back from the database. +.PP +The way to get around this problem is to use the Berkeley \s-1DB API\s0 method +called \f(CW\*(C`seq\*(C'\fR. This method allows sequential access to key/value +pairs. See \*(L"\s-1THE API INTERFACE\*(R"\s0 for details of both the \f(CW\*(C`seq\*(C'\fR method +and the \s-1API\s0 in general. +.PP +Here is the script above rewritten using the \f(CW\*(C`seq\*(C'\fR \s-1API\s0 method. +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my ($filename, $x, %h, $status, $key, $value) ; +\& +\& $filename = "tree" ; +\& unlink $filename ; +\& +\& # Enable duplicate records +\& $DB_BTREE\->{\*(Aqflags\*(Aq} = R_DUP ; +\& +\& $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open $filename: $!\en"; +\& +\& # Add some key/value pairs to the file +\& $h{\*(AqWall\*(Aq} = \*(AqLarry\*(Aq ; +\& $h{\*(AqWall\*(Aq} = \*(AqBrick\*(Aq ; # Note the duplicate key +\& $h{\*(AqWall\*(Aq} = \*(AqBrick\*(Aq ; # Note the duplicate key and value +\& $h{\*(AqSmith\*(Aq} = \*(AqJohn\*(Aq ; +\& $h{\*(Aqmouse\*(Aq} = \*(Aqmickey\*(Aq ; +\& +\& # iterate through the btree using seq +\& # and print each key/value pair. +\& $key = $value = 0 ; +\& for ($status = $x\->seq($key, $value, R_FIRST) ; +\& $status == 0 ; +\& $status = $x\->seq($key, $value, R_NEXT) ) +\& { print "$key \-> $value\en" } +\& +\& undef $x ; +\& untie %h ; +.Ve +.PP +that prints: +.PP +.Vb 5 +\& Smith \-> John +\& Wall \-> Brick +\& Wall \-> Brick +\& Wall \-> Larry +\& mouse \-> mickey +.Ve +.PP +This time we have got all the key/value pairs, including the multiple +values associated with the key \f(CW\*(C`Wall\*(C'\fR. +.PP +To make life easier when dealing with duplicate keys, \fBDB_File\fR comes with +a few utility methods. +.SS "The \fIget_dup()\fP Method" +.IX Subsection "The get_dup() Method" +The \f(CW\*(C`get_dup\*(C'\fR method assists in +reading duplicate values from \s-1BTREE\s0 databases. The method can take the +following forms: +.PP +.Vb 3 +\& $count = $x\->get_dup($key) ; +\& @list = $x\->get_dup($key) ; +\& %list = $x\->get_dup($key, 1) ; +.Ve +.PP +In a scalar context the method returns the number of values associated +with the key, \f(CW$key\fR. +.PP +In list context, it returns all the values which match \f(CW$key\fR. Note +that the values will be returned in an apparently random order. +.PP +In list context, if the second parameter is present and evaluates +\&\s-1TRUE,\s0 the method returns an associative array. The keys of the +associative array correspond to the values that matched in the \s-1BTREE\s0 +and the values of the array are a count of the number of times that +particular value occurred in the \s-1BTREE.\s0 +.PP +So assuming the database created above, we can use \f(CW\*(C`get_dup\*(C'\fR like +this: +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my ($filename, $x, %h) ; +\& +\& $filename = "tree" ; +\& +\& # Enable duplicate records +\& $DB_BTREE\->{\*(Aqflags\*(Aq} = R_DUP ; +\& +\& $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open $filename: $!\en"; +\& +\& my $cnt = $x\->get_dup("Wall") ; +\& print "Wall occurred $cnt times\en" ; +\& +\& my %hash = $x\->get_dup("Wall", 1) ; +\& print "Larry is there\en" if $hash{\*(AqLarry\*(Aq} ; +\& print "There are $hash{\*(AqBrick\*(Aq} Brick Walls\en" ; +\& +\& my @list = sort $x\->get_dup("Wall") ; +\& print "Wall => [@list]\en" ; +\& +\& @list = $x\->get_dup("Smith") ; +\& print "Smith => [@list]\en" ; +\& +\& @list = $x\->get_dup("Dog") ; +\& print "Dog => [@list]\en" ; +.Ve +.PP +and it will print: +.PP +.Vb 6 +\& Wall occurred 3 times +\& Larry is there +\& There are 2 Brick Walls +\& Wall => [Brick Brick Larry] +\& Smith => [John] +\& Dog => [] +.Ve +.SS "The \fIfind_dup()\fP Method" +.IX Subsection "The find_dup() Method" +.Vb 1 +\& $status = $X\->find_dup($key, $value) ; +.Ve +.PP +This method checks for the existence of a specific key/value pair. If the +pair exists, the cursor is left pointing to the pair and the method +returns 0. Otherwise the method returns a non-zero value. +.PP +Assuming the database from the previous example: +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my ($filename, $x, %h, $found) ; +\& +\& $filename = "tree" ; +\& +\& # Enable duplicate records +\& $DB_BTREE\->{\*(Aqflags\*(Aq} = R_DUP ; +\& +\& $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open $filename: $!\en"; +\& +\& $found = ( $x\->find_dup("Wall", "Larry") == 0 ? "" : "not") ; +\& print "Larry Wall is $found there\en" ; +\& +\& $found = ( $x\->find_dup("Wall", "Harry") == 0 ? "" : "not") ; +\& print "Harry Wall is $found there\en" ; +\& +\& undef $x ; +\& untie %h ; +.Ve +.PP +prints this +.PP +.Vb 2 +\& Larry Wall is there +\& Harry Wall is not there +.Ve +.SS "The \fIdel_dup()\fP Method" +.IX Subsection "The del_dup() Method" +.Vb 1 +\& $status = $X\->del_dup($key, $value) ; +.Ve +.PP +This method deletes a specific key/value pair. It returns +0 if they exist and have been deleted successfully. +Otherwise the method returns a non-zero value. +.PP +Again assuming the existence of the \f(CW\*(C`tree\*(C'\fR database +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my ($filename, $x, %h, $found) ; +\& +\& $filename = "tree" ; +\& +\& # Enable duplicate records +\& $DB_BTREE\->{\*(Aqflags\*(Aq} = R_DUP ; +\& +\& $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open $filename: $!\en"; +\& +\& $x\->del_dup("Wall", "Larry") ; +\& +\& $found = ( $x\->find_dup("Wall", "Larry") == 0 ? "" : "not") ; +\& print "Larry Wall is $found there\en" ; +\& +\& undef $x ; +\& untie %h ; +.Ve +.PP +prints this +.PP +.Vb 1 +\& Larry Wall is not there +.Ve +.SS "Matching Partial Keys" +.IX Subsection "Matching Partial Keys" +The \s-1BTREE\s0 interface has a feature which allows partial keys to be +matched. This functionality is \fIonly\fR available when the \f(CW\*(C`seq\*(C'\fR method +is used along with the R_CURSOR flag. +.PP +.Vb 1 +\& $x\->seq($key, $value, R_CURSOR) ; +.Ve +.PP +Here is the relevant quote from the dbopen man page where it defines +the use of the R_CURSOR flag with seq: +.PP +.Vb 4 +\& Note, for the DB_BTREE access method, the returned key is not +\& necessarily an exact match for the specified key. The returned key +\& is the smallest key greater than or equal to the specified key, +\& permitting partial key matches and range searches. +.Ve +.PP +In the example script below, the \f(CW\*(C`match\*(C'\fR sub uses this feature to find +and print the first matching key/value pair given a partial key. +.PP +.Vb 4 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& use Fcntl ; +\& +\& my ($filename, $x, %h, $st, $key, $value) ; +\& +\& sub match +\& { +\& my $key = shift ; +\& my $value = 0; +\& my $orig_key = $key ; +\& $x\->seq($key, $value, R_CURSOR) ; +\& print "$orig_key\et\-> $key\et\-> $value\en" ; +\& } +\& +\& $filename = "tree" ; +\& unlink $filename ; +\& +\& $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_BTREE +\& or die "Cannot open $filename: $!\en"; +\& +\& # Add some key/value pairs to the file +\& $h{\*(Aqmouse\*(Aq} = \*(Aqmickey\*(Aq ; +\& $h{\*(AqWall\*(Aq} = \*(AqLarry\*(Aq ; +\& $h{\*(AqWalls\*(Aq} = \*(AqBrick\*(Aq ; +\& $h{\*(AqSmith\*(Aq} = \*(AqJohn\*(Aq ; +\& +\& +\& $key = $value = 0 ; +\& print "IN ORDER\en" ; +\& for ($st = $x\->seq($key, $value, R_FIRST) ; +\& $st == 0 ; +\& $st = $x\->seq($key, $value, R_NEXT) ) +\& +\& { print "$key \-> $value\en" } +\& +\& print "\enPARTIAL MATCH\en" ; +\& +\& match "Wa" ; +\& match "A" ; +\& match "a" ; +\& +\& undef $x ; +\& untie %h ; +.Ve +.PP +Here is the output: +.PP +.Vb 5 +\& IN ORDER +\& Smith \-> John +\& Wall \-> Larry +\& Walls \-> Brick +\& mouse \-> mickey +\& +\& PARTIAL MATCH +\& Wa \-> Wall \-> Larry +\& A \-> Smith \-> John +\& a \-> mouse \-> mickey +.Ve +.SH "DB_RECNO" +.IX Header "DB_RECNO" +\&\s-1DB_RECNO\s0 provides an interface to flat text files. Both variable and +fixed length records are supported. +.PP +In order to make \s-1RECNO\s0 more compatible with Perl, the array offset for +all \s-1RECNO\s0 arrays begins at 0 rather than 1 as in Berkeley \s-1DB.\s0 +.PP +As with normal Perl arrays, a \s-1RECNO\s0 array can be accessed using +negative indexes. The index \-1 refers to the last element of the array, +\&\-2 the second last, and so on. Attempting to access an element before +the start of the array will raise a fatal run-time error. +.SS "The 'bval' Option" +.IX Subsection "The 'bval' Option" +The operation of the bval option warrants some discussion. Here is the +definition of bval from the Berkeley \s-1DB 1.85\s0 recno manual page: +.PP +.Vb 6 +\& The delimiting byte to be used to mark the end of a +\& record for variable\-length records, and the pad charac\- +\& ter for fixed\-length records. If no value is speci\- +\& fied, newlines (\`\`\en\*(Aq\*(Aq) are used to mark the end of +\& variable\-length records and fixed\-length records are +\& padded with spaces. +.Ve +.PP +The second sentence is wrong. In actual fact bval will only default to +\&\f(CW"\en"\fR when the openinfo parameter in dbopen is \s-1NULL.\s0 If a non-NULL +openinfo parameter is used at all, the value that happens to be in bval +will be used. That means you always have to specify bval when making +use of any of the options in the openinfo parameter. This documentation +error will be fixed in the next release of Berkeley \s-1DB.\s0 +.PP +That clarifies the situation with regards Berkeley \s-1DB\s0 itself. What +about \fBDB_File\fR? Well, the behavior defined in the quote above is +quite useful, so \fBDB_File\fR conforms to it. +.PP +That means that you can specify other options (e.g. cachesize) and +still have bval default to \f(CW"\en"\fR for variable length records, and +space for fixed length records. +.PP +Also note that the bval option only allows you to specify a single byte +as a delimiter. +.SS "A Simple Example" +.IX Subsection "A Simple Example" +Here is a simple example that uses \s-1RECNO \s0(if you are using a version +of Perl earlier than 5.004_57 this example won't work \*(-- see +\&\*(L"Extra \s-1RECNO\s0 Methods\*(R" for a workaround). +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my $filename = "text" ; +\& unlink $filename ; +\& +\& my @h ; +\& tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0666, $DB_RECNO +\& or die "Cannot open file \*(Aqtext\*(Aq: $!\en" ; +\& +\& # Add a few key/value pairs to the file +\& $h[0] = "orange" ; +\& $h[1] = "blue" ; +\& $h[2] = "yellow" ; +\& +\& push @h, "green", "black" ; +\& +\& my $elements = scalar @h ; +\& print "The array contains $elements entries\en" ; +\& +\& my $last = pop @h ; +\& print "popped $last\en" ; +\& +\& unshift @h, "white" ; +\& my $first = shift @h ; +\& print "shifted $first\en" ; +\& +\& # Check for existence of a key +\& print "Element 1 Exists with value $h[1]\en" if $h[1] ; +\& +\& # use a negative index +\& print "The last element is $h[\-1]\en" ; +\& print "The 2nd last element is $h[\-2]\en" ; +\& +\& untie @h ; +.Ve +.PP +Here is the output from the script: +.PP +.Vb 6 +\& The array contains 5 entries +\& popped black +\& shifted white +\& Element 1 Exists with value blue +\& The last element is green +\& The 2nd last element is yellow +.Ve +.SS "Extra \s-1RECNO\s0 Methods" +.IX Subsection "Extra RECNO Methods" +If you are using a version of Perl earlier than 5.004_57, the tied +array interface is quite limited. In the example script above +\&\f(CW\*(C`push\*(C'\fR, \f(CW\*(C`pop\*(C'\fR, \f(CW\*(C`shift\*(C'\fR, \f(CW\*(C`unshift\*(C'\fR +or determining the array length will not work with a tied array. +.PP +To make the interface more useful for older versions of Perl, a number +of methods are supplied with \fBDB_File\fR to simulate the missing array +operations. All these methods are accessed via the object returned from +the tie call. +.PP +Here are the methods: +.ie n .IP "\fB\fB$X\fB\->push(list) ;\fR" 5 +.el .IP "\fB\f(CB$X\fB\->push(list) ;\fR" 5 +.IX Item "$X->push(list) ;" +Pushes the elements of \f(CW\*(C`list\*(C'\fR to the end of the array. +.ie n .IP "\fB\fB$value\fB = \f(BI$X\fB\->pop ;\fR" 5 +.el .IP "\fB\f(CB$value\fB = \f(CB$X\fB\->pop ;\fR" 5 +.IX Item "$value = $X->pop ;" +Removes and returns the last element of the array. +.ie n .IP "\fB\fB$X\fB\->shift\fR" 5 +.el .IP "\fB\f(CB$X\fB\->shift\fR" 5 +.IX Item "$X->shift" +Removes and returns the first element of the array. +.ie n .IP "\fB\fB$X\fB\->unshift(list) ;\fR" 5 +.el .IP "\fB\f(CB$X\fB\->unshift(list) ;\fR" 5 +.IX Item "$X->unshift(list) ;" +Pushes the elements of \f(CW\*(C`list\*(C'\fR to the start of the array. +.ie n .IP "\fB\fB$X\fB\->length\fR" 5 +.el .IP "\fB\f(CB$X\fB\->length\fR" 5 +.IX Item "$X->length" +Returns the number of elements in the array. +.ie n .IP "\fB\fB$X\fB\->splice(offset, length, elements);\fR" 5 +.el .IP "\fB\f(CB$X\fB\->splice(offset, length, elements);\fR" 5 +.IX Item "$X->splice(offset, length, elements);" +Returns a splice of the array. +.SS "Another Example" +.IX Subsection "Another Example" +Here is a more complete example that makes use of some of the methods +described above. It also makes use of the \s-1API\s0 interface directly (see +\&\*(L"\s-1THE API INTERFACE\*(R"\s0). +.PP +.Vb 5 +\& use warnings ; +\& use strict ; +\& my (@h, $H, $file, $i) ; +\& use DB_File ; +\& use Fcntl ; +\& +\& $file = "text" ; +\& +\& unlink $file ; +\& +\& $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0666, $DB_RECNO +\& or die "Cannot open file $file: $!\en" ; +\& +\& # first create a text file to play with +\& $h[0] = "zero" ; +\& $h[1] = "one" ; +\& $h[2] = "two" ; +\& $h[3] = "three" ; +\& $h[4] = "four" ; +\& +\& +\& # Print the records in order. +\& # +\& # The length method is needed here because evaluating a tied +\& # array in a scalar context does not return the number of +\& # elements in the array. +\& +\& print "\enORIGINAL\en" ; +\& foreach $i (0 .. $H\->length \- 1) { +\& print "$i: $h[$i]\en" ; +\& } +\& +\& # use the push & pop methods +\& $a = $H\->pop ; +\& $H\->push("last") ; +\& print "\enThe last record was [$a]\en" ; +\& +\& # and the shift & unshift methods +\& $a = $H\->shift ; +\& $H\->unshift("first") ; +\& print "The first record was [$a]\en" ; +\& +\& # Use the API to add a new record after record 2. +\& $i = 2 ; +\& $H\->put($i, "Newbie", R_IAFTER) ; +\& +\& # and a new record before record 1. +\& $i = 1 ; +\& $H\->put($i, "New One", R_IBEFORE) ; +\& +\& # delete record 3 +\& $H\->del(3) ; +\& +\& # now print the records in reverse order +\& print "\enREVERSE\en" ; +\& for ($i = $H\->length \- 1 ; $i >= 0 ; \-\- $i) +\& { print "$i: $h[$i]\en" } +\& +\& # same again, but use the API functions instead +\& print "\enREVERSE again\en" ; +\& my ($s, $k, $v) = (0, 0, 0) ; +\& for ($s = $H\->seq($k, $v, R_LAST) ; +\& $s == 0 ; +\& $s = $H\->seq($k, $v, R_PREV)) +\& { print "$k: $v\en" } +\& +\& undef $H ; +\& untie @h ; +.Ve +.PP +and this is what it outputs: +.PP +.Vb 6 +\& ORIGINAL +\& 0: zero +\& 1: one +\& 2: two +\& 3: three +\& 4: four +\& +\& The last record was [four] +\& The first record was [zero] +\& +\& REVERSE +\& 5: last +\& 4: three +\& 3: Newbie +\& 2: one +\& 1: New One +\& 0: first +\& +\& REVERSE again +\& 5: last +\& 4: three +\& 3: Newbie +\& 2: one +\& 1: New One +\& 0: first +.Ve +.PP +Notes: +.IP "1." 5 +Rather than iterating through the array, \f(CW@h\fR like this: +.Sp +.Vb 1 +\& foreach $i (@h) +.Ve +.Sp +it is necessary to use either this: +.Sp +.Vb 1 +\& foreach $i (0 .. $H\->length \- 1) +.Ve +.Sp +or this: +.Sp +.Vb 3 +\& for ($a = $H\->get($k, $v, R_FIRST) ; +\& $a == 0 ; +\& $a = $H\->get($k, $v, R_NEXT) ) +.Ve +.IP "2." 5 +Notice that both times the \f(CW\*(C`put\*(C'\fR method was used the record index was +specified using a variable, \f(CW$i\fR, rather than the literal value +itself. This is because \f(CW\*(C`put\*(C'\fR will return the record number of the +inserted line via that parameter. +.SH "THE API INTERFACE" +.IX Header "THE API INTERFACE" +As well as accessing Berkeley \s-1DB\s0 using a tied hash or array, it is also +possible to make direct use of most of the \s-1API\s0 functions defined in the +Berkeley \s-1DB\s0 documentation. +.PP +To do this you need to store a copy of the object returned from the tie. +.PP +.Vb 1 +\& $db = tie %hash, "DB_File", "filename" ; +.Ve +.PP +Once you have done that, you can access the Berkeley \s-1DB API\s0 functions +as \fBDB_File\fR methods directly like this: +.PP +.Vb 1 +\& $db\->put($key, $value, R_NOOVERWRITE) ; +.Ve +.PP +\&\fBImportant:\fR If you have saved a copy of the object returned from +\&\f(CW\*(C`tie\*(C'\fR, the underlying database file will \fInot\fR be closed until both +the tied variable is untied and all copies of the saved object are +destroyed. +.PP +.Vb 6 +\& use DB_File ; +\& $db = tie %hash, "DB_File", "filename" +\& or die "Cannot tie filename: $!" ; +\& ... +\& undef $db ; +\& untie %hash ; +.Ve +.PP +See \*(L"The \fIuntie()\fR Gotcha\*(R" for more details. +.PP +All the functions defined in dbopen are available except for +\&\fIclose()\fR and \fIdbopen()\fR itself. The \fBDB_File\fR method interface to the +supported functions have been implemented to mirror the way Berkeley \s-1DB\s0 +works whenever possible. In particular note that: +.IP "\(bu" 5 +The methods return a status value. All return 0 on success. +All return \-1 to signify an error and set \f(CW$!\fR to the exact +error code. The return code 1 generally (but not always) means that the +key specified did not exist in the database. +.Sp +Other return codes are defined. See below and in the Berkeley \s-1DB\s0 +documentation for details. The Berkeley \s-1DB\s0 documentation should be used +as the definitive source. +.IP "\(bu" 5 +Whenever a Berkeley \s-1DB\s0 function returns data via one of its parameters, +the equivalent \fBDB_File\fR method does exactly the same. +.IP "\(bu" 5 +If you are careful, it is possible to mix \s-1API\s0 calls with the tied +hash/array interface in the same piece of code. Although only a few of +the methods used to implement the tied interface currently make use of +the cursor, you should always assume that the cursor has been changed +any time the tied hash/array interface is used. As an example, this +code will probably not do what you expect: +.Sp +.Vb 2 +\& $X = tie %x, \*(AqDB_File\*(Aq, $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE +\& or die "Cannot tie $filename: $!" ; +\& +\& # Get the first key/value pair and set the cursor +\& $X\->seq($key, $value, R_FIRST) ; +\& +\& # this line will modify the cursor +\& $count = scalar keys %x ; +\& +\& # Get the second key/value pair. +\& # oops, it didn\*(Aqt, it got the last key/value pair! +\& $X\->seq($key, $value, R_NEXT) ; +.Ve +.Sp +The code above can be rearranged to get around the problem, like this: +.Sp +.Vb 2 +\& $X = tie %x, \*(AqDB_File\*(Aq, $filename, O_RDWR|O_CREAT, 0777, $DB_BTREE +\& or die "Cannot tie $filename: $!" ; +\& +\& # this line will modify the cursor +\& $count = scalar keys %x ; +\& +\& # Get the first key/value pair and set the cursor +\& $X\->seq($key, $value, R_FIRST) ; +\& +\& # Get the second key/value pair. +\& # worked this time. +\& $X\->seq($key, $value, R_NEXT) ; +.Ve +.PP +All the constants defined in dbopen for use in the flags parameters +in the methods defined below are also available. Refer to the Berkeley +\&\s-1DB\s0 documentation for the precise meaning of the flags values. +.PP +Below is a list of the methods available. +.ie n .IP "\fB\fB$status\fB = \f(BI$X\fB\->get($key, \f(CB$value\fB [, \f(CB$flags\fB]) ;\fR" 5 +.el .IP "\fB\f(CB$status\fB = \f(CB$X\fB\->get($key, \f(CB$value\fB [, \f(CB$flags\fB]) ;\fR" 5 +.IX Item "$status = $X->get($key, $value [, $flags]) ;" +Given a key (\f(CW$key\fR) this method reads the value associated with it +from the database. The value read from the database is returned in the +\&\f(CW$value\fR parameter. +.Sp +If the key does not exist the method returns 1. +.Sp +No flags are currently defined for this method. +.ie n .IP "\fB\fB$status\fB = \f(BI$X\fB\->put($key, \f(CB$value\fB [, \f(CB$flags\fB]) ;\fR" 5 +.el .IP "\fB\f(CB$status\fB = \f(CB$X\fB\->put($key, \f(CB$value\fB [, \f(CB$flags\fB]) ;\fR" 5 +.IX Item "$status = $X->put($key, $value [, $flags]) ;" +Stores the key/value pair in the database. +.Sp +If you use either the R_IAFTER or R_IBEFORE flags, the \f(CW$key\fR parameter +will have the record number of the inserted key/value pair set. +.Sp +Valid flags are R_CURSOR, R_IAFTER, R_IBEFORE, R_NOOVERWRITE and +R_SETCURSOR. +.ie n .IP "\fB\fB$status\fB = \f(BI$X\fB\->del($key [, \f(CB$flags\fB]) ;\fR" 5 +.el .IP "\fB\f(CB$status\fB = \f(CB$X\fB\->del($key [, \f(CB$flags\fB]) ;\fR" 5 +.IX Item "$status = $X->del($key [, $flags]) ;" +Removes all key/value pairs with key \f(CW$key\fR from the database. +.Sp +A return code of 1 means that the requested key was not in the +database. +.Sp +R_CURSOR is the only valid flag at present. +.ie n .IP "\fB\fB$status\fB = \f(BI$X\fB\->fd ;\fR" 5 +.el .IP "\fB\f(CB$status\fB = \f(CB$X\fB\->fd ;\fR" 5 +.IX Item "$status = $X->fd ;" +Returns the file descriptor for the underlying database. +.Sp +See \*(L"Locking: The Trouble with fd\*(R" for an explanation for why you should +not use \f(CW\*(C`fd\*(C'\fR to lock your database. +.ie n .IP "\fB\fB$status\fB = \f(BI$X\fB\->seq($key, \f(CB$value\fB, \f(CB$flags\fB) ;\fR" 5 +.el .IP "\fB\f(CB$status\fB = \f(CB$X\fB\->seq($key, \f(CB$value\fB, \f(CB$flags\fB) ;\fR" 5 +.IX Item "$status = $X->seq($key, $value, $flags) ;" +This interface allows sequential retrieval from the database. See +dbopen for full details. +.Sp +Both the \f(CW$key\fR and \f(CW$value\fR parameters will be set to the key/value +pair read from the database. +.Sp +The flags parameter is mandatory. The valid flag values are R_CURSOR, +R_FIRST, R_LAST, R_NEXT and R_PREV. +.ie n .IP "\fB\fB$status\fB = \f(BI$X\fB\->sync([$flags]) ;\fR" 5 +.el .IP "\fB\f(CB$status\fB = \f(CB$X\fB\->sync([$flags]) ;\fR" 5 +.IX Item "$status = $X->sync([$flags]) ;" +Flushes any cached buffers to disk. +.Sp +R_RECNOSYNC is the only valid flag at present. +.SH "DBM FILTERS" +.IX Header "DBM FILTERS" +A \s-1DBM\s0 Filter is a piece of code that is be used when you \fIalways\fR +want to make the same transformation to all keys and/or values in a +\&\s-1DBM\s0 database. +.PP +There are four methods associated with \s-1DBM\s0 Filters. All work identically, +and each is used to install (or uninstall) a single \s-1DBM\s0 Filter. Each +expects a single parameter, namely a reference to a sub. The only +difference between them is the place that the filter is installed. +.PP +To summarise: +.IP "\fBfilter_store_key\fR" 5 +.IX Item "filter_store_key" +If a filter has been installed with this method, it will be invoked +every time you write a key to a \s-1DBM\s0 database. +.IP "\fBfilter_store_value\fR" 5 +.IX Item "filter_store_value" +If a filter has been installed with this method, it will be invoked +every time you write a value to a \s-1DBM\s0 database. +.IP "\fBfilter_fetch_key\fR" 5 +.IX Item "filter_fetch_key" +If a filter has been installed with this method, it will be invoked +every time you read a key from a \s-1DBM\s0 database. +.IP "\fBfilter_fetch_value\fR" 5 +.IX Item "filter_fetch_value" +If a filter has been installed with this method, it will be invoked +every time you read a value from a \s-1DBM\s0 database. +.PP +You can use any combination of the methods, from none, to all four. +.PP +All filter methods return the existing filter, if present, or \f(CW\*(C`undef\*(C'\fR +in not. +.PP +To delete a filter pass \f(CW\*(C`undef\*(C'\fR to it. +.SS "The Filter" +.IX Subsection "The Filter" +When each filter is called by Perl, a local copy of \f(CW$_\fR will contain +the key or value to be filtered. Filtering is achieved by modifying +the contents of \f(CW$_\fR. The return code from the filter is ignored. +.SS "An Example \*(-- the \s-1NULL\s0 termination problem." +.IX Subsection "An Example the NULL termination problem." +Consider the following scenario. You have a \s-1DBM\s0 database +that you need to share with a third-party C application. The C application +assumes that \fIall\fR keys and values are \s-1NULL\s0 terminated. Unfortunately +when Perl writes to \s-1DBM\s0 databases it doesn't use \s-1NULL\s0 termination, so +your Perl application will have to manage \s-1NULL\s0 termination itself. When +you write to the database you will have to use something like this: +.PP +.Vb 1 +\& $hash{"$key\e0"} = "$value\e0" ; +.Ve +.PP +Similarly the \s-1NULL\s0 needs to be taken into account when you are considering +the length of existing keys/values. +.PP +It would be much better if you could ignore the \s-1NULL\s0 terminations issue +in the main application code and have a mechanism that automatically +added the terminating \s-1NULL\s0 to all keys and values whenever you write to +the database and have them removed when you read from the database. As I'm +sure you have already guessed, this is a problem that \s-1DBM\s0 Filters can +fix very easily. +.PP +.Vb 3 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& +\& my %hash ; +\& my $filename = "filt" ; +\& unlink $filename ; +\& +\& my $db = tie %hash, \*(AqDB_File\*(Aq, $filename, O_CREAT|O_RDWR, 0666, $DB_HASH +\& or die "Cannot open $filename: $!\en" ; +\& +\& # Install DBM Filters +\& $db\->filter_fetch_key ( sub { s/\e0$// } ) ; +\& $db\->filter_store_key ( sub { $_ .= "\e0" } ) ; +\& $db\->filter_fetch_value( sub { s/\e0$// } ) ; +\& $db\->filter_store_value( sub { $_ .= "\e0" } ) ; +\& +\& $hash{"abc"} = "def" ; +\& my $a = $hash{"ABC"} ; +\& # ... +\& undef $db ; +\& untie %hash ; +.Ve +.PP +Hopefully the contents of each of the filters should be +self-explanatory. Both \*(L"fetch\*(R" filters remove the terminating \s-1NULL,\s0 +and both \*(L"store\*(R" filters add a terminating \s-1NULL.\s0 +.SS "Another Example \*(-- Key is a C int." +.IX Subsection "Another Example Key is a C int." +Here is another real-life example. By default, whenever Perl writes to +a \s-1DBM\s0 database it always writes the key and value as strings. So when +you use this: +.PP +.Vb 1 +\& $hash{12345} = "something" ; +.Ve +.PP +the key 12345 will get stored in the \s-1DBM\s0 database as the 5 byte string +\&\*(L"12345\*(R". If you actually want the key to be stored in the \s-1DBM\s0 database +as a C int, you will have to use \f(CW\*(C`pack\*(C'\fR when writing, and \f(CW\*(C`unpack\*(C'\fR +when reading. +.PP +Here is a \s-1DBM\s0 Filter that does it: +.PP +.Vb 6 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& my %hash ; +\& my $filename = "filt" ; +\& unlink $filename ; +\& +\& +\& my $db = tie %hash, \*(AqDB_File\*(Aq, $filename, O_CREAT|O_RDWR, 0666, $DB_HASH +\& or die "Cannot open $filename: $!\en" ; +\& +\& $db\->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ; +\& $db\->filter_store_key ( sub { $_ = pack ("i", $_) } ) ; +\& $hash{123} = "def" ; +\& # ... +\& undef $db ; +\& untie %hash ; +.Ve +.PP +This time only two filters have been used \*(-- we only need to manipulate +the contents of the key, so it wasn't necessary to install any value +filters. +.SH "HINTS AND TIPS" +.IX Header "HINTS AND TIPS" +.SS "Locking: The Trouble with fd" +.IX Subsection "Locking: The Trouble with fd" +Until version 1.72 of this module, the recommended technique for locking +\&\fBDB_File\fR databases was to flock the filehandle returned from the \*(L"fd\*(R" +function. Unfortunately this technique has been shown to be fundamentally +flawed (Kudos to David Harris for tracking this down). Use it at your own +peril! +.PP +The locking technique went like this. +.PP +.Vb 12 +\& $db = tie(%db, \*(AqDB_File\*(Aq, \*(Aqfoo.db\*(Aq, O_CREAT|O_RDWR, 0644) +\& || die "dbcreat foo.db $!"; +\& $fd = $db\->fd; +\& open(DB_FH, "+<&=$fd") || die "dup $!"; +\& flock (DB_FH, LOCK_EX) || die "flock: $!"; +\& ... +\& $db{"Tom"} = "Jerry" ; +\& ... +\& flock(DB_FH, LOCK_UN); +\& undef $db; +\& untie %db; +\& close(DB_FH); +.Ve +.PP +In simple terms, this is what happens: +.IP "1." 5 +Use \*(L"tie\*(R" to open the database. +.IP "2." 5 +Lock the database with fd & flock. +.IP "3." 5 +Read & Write to the database. +.IP "4." 5 +Unlock and close the database. +.PP +Here is the crux of the problem. A side-effect of opening the \fBDB_File\fR +database in step 2 is that an initial block from the database will get +read from disk and cached in memory. +.PP +To see why this is a problem, consider what can happen when two processes, +say \*(L"A\*(R" and \*(L"B\*(R", both want to update the same \fBDB_File\fR database +using the locking steps outlined above. Assume process \*(L"A\*(R" has already +opened the database and has a write lock, but it hasn't actually updated +the database yet (it has finished step 2, but not started step 3 yet). Now +process \*(L"B\*(R" tries to open the same database \- step 1 will succeed, +but it will block on step 2 until process \*(L"A\*(R" releases the lock. The +important thing to notice here is that at this point in time both +processes will have cached identical initial blocks from the database. +.PP +Now process \*(L"A\*(R" updates the database and happens to change some of the +data held in the initial buffer. Process \*(L"A\*(R" terminates, flushing +all cached data to disk and releasing the database lock. At this point +the database on disk will correctly reflect the changes made by process +\&\*(L"A\*(R". +.PP +With the lock released, process \*(L"B\*(R" can now continue. It also updates the +database and unfortunately it too modifies the data that was in its +initial buffer. Once that data gets flushed to disk it will overwrite +some/all of the changes process \*(L"A\*(R" made to the database. +.PP +The result of this scenario is at best a database that doesn't contain +what you expect. At worst the database will corrupt. +.PP +The above won't happen every time competing process update the same +\&\fBDB_File\fR database, but it does illustrate why the technique should +not be used. +.SS "Safe ways to lock a database" +.IX Subsection "Safe ways to lock a database" +Starting with version 2.x, Berkeley \s-1DB \s0 has internal support for locking. +The companion module to this one, \fBBerkeleyDB\fR, provides an interface +to this locking functionality. If you are serious about locking +Berkeley \s-1DB\s0 databases, I strongly recommend using \fBBerkeleyDB\fR. +.PP +If using \fBBerkeleyDB\fR isn't an option, there are a number of modules +available on \s-1CPAN\s0 that can be used to implement locking. Each one +implements locking differently and has different goals in mind. It is +therefore worth knowing the difference, so that you can pick the right +one for your application. Here are the three locking wrappers: +.IP "\fBTie::DB_Lock\fR" 5 +.IX Item "Tie::DB_Lock" +A \fBDB_File\fR wrapper which creates copies of the database file for +read access, so that you have a kind of a multiversioning concurrent read +system. However, updates are still serial. Use for databases where reads +may be lengthy and consistency problems may occur. +.IP "\fBTie::DB_LockFile\fR" 5 +.IX Item "Tie::DB_LockFile" +A \fBDB_File\fR wrapper that has the ability to lock and unlock the database +while it is being used. Avoids the tie-before-flock problem by simply +re-tie-ing the database when you get or drop a lock. Because of the +flexibility in dropping and re-acquiring the lock in the middle of a +session, this can be massaged into a system that will work with long +updates and/or reads if the application follows the hints in the \s-1POD\s0 +documentation. +.IP "\fBDB_File::Lock\fR" 5 +.IX Item "DB_File::Lock" +An extremely lightweight \fBDB_File\fR wrapper that simply flocks a lockfile +before tie-ing the database and drops the lock after the untie. Allows +one to use the same lockfile for multiple databases to avoid deadlock +problems, if desired. Use for databases where updates are reads are +quick and simple flock locking semantics are enough. +.SS "Sharing Databases With C Applications" +.IX Subsection "Sharing Databases With C Applications" +There is no technical reason why a Berkeley \s-1DB\s0 database cannot be +shared by both a Perl and a C application. +.PP +The vast majority of problems that are reported in this area boil down +to the fact that C strings are \s-1NULL\s0 terminated, whilst Perl strings are +not. See \*(L"\s-1DBM FILTERS\*(R"\s0 for a generic way to work around this problem. +.PP +Here is a real example. Netscape 2.0 keeps a record of the locations you +visit along with the time you last visited them in a \s-1DB_HASH\s0 database. +This is usually stored in the file \fI~/.netscape/history.db\fR. The key +field in the database is the location string and the value field is the +time the location was last visited stored as a 4 byte binary value. +.PP +If you haven't already guessed, the location string is stored with a +terminating \s-1NULL.\s0 This means you need to be careful when accessing the +database. +.PP +Here is a snippet of code that is loosely based on Tom Christiansen's +\&\fIggh\fR script (available from your nearest \s-1CPAN\s0 archive in +\&\fIauthors/id/TOMC/scripts/nshist.gz\fR). +.PP +.Vb 4 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& use Fcntl ; +\& +\& my ($dotdir, $HISTORY, %hist_db, $href, $binary_time, $date) ; +\& $dotdir = $ENV{HOME} || $ENV{LOGNAME}; +\& +\& $HISTORY = "$dotdir/.netscape/history.db"; +\& +\& tie %hist_db, \*(AqDB_File\*(Aq, $HISTORY +\& or die "Cannot open $HISTORY: $!\en" ;; +\& +\& # Dump the complete database +\& while ( ($href, $binary_time) = each %hist_db ) { +\& +\& # remove the terminating NULL +\& $href =~ s/\ex00$// ; +\& +\& # convert the binary time into a user friendly string +\& $date = localtime unpack("V", $binary_time); +\& print "$date $href\en" ; +\& } +\& +\& # check for the existence of a specific key +\& # remember to add the NULL +\& if ( $binary_time = $hist_db{"http://mox.perl.com/\ex00"} ) { +\& $date = localtime unpack("V", $binary_time) ; +\& print "Last visited mox.perl.com on $date\en" ; +\& } +\& else { +\& print "Never visited mox.perl.com\en" +\& } +\& +\& untie %hist_db ; +.Ve +.SS "The \fIuntie()\fP Gotcha" +.IX Subsection "The untie() Gotcha" +If you make use of the Berkeley \s-1DB API,\s0 it is \fIvery\fR strongly +recommended that you read \*(L"The untie Gotcha\*(R" in perltie. +.PP +Even if you don't currently make use of the \s-1API\s0 interface, it is still +worth reading it. +.PP +Here is an example which illustrates the problem from a \fBDB_File\fR +perspective: +.PP +.Vb 2 +\& use DB_File ; +\& use Fcntl ; +\& +\& my %x ; +\& my $X ; +\& +\& $X = tie %x, \*(AqDB_File\*(Aq, \*(Aqtst.fil\*(Aq , O_RDWR|O_TRUNC +\& or die "Cannot tie first time: $!" ; +\& +\& $x{123} = 456 ; +\& +\& untie %x ; +\& +\& tie %x, \*(AqDB_File\*(Aq, \*(Aqtst.fil\*(Aq , O_RDWR|O_CREAT +\& or die "Cannot tie second time: $!" ; +\& +\& untie %x ; +.Ve +.PP +When run, the script will produce this error message: +.PP +.Vb 1 +\& Cannot tie second time: Invalid argument at bad.file line 14. +.Ve +.PP +Although the error message above refers to the second \fItie()\fR statement +in the script, the source of the problem is really with the \fIuntie()\fR +statement that precedes it. +.PP +Having read perltie you will probably have already guessed that the +error is caused by the extra copy of the tied object stored in \f(CW$X\fR. +If you haven't, then the problem boils down to the fact that the +\&\fBDB_File\fR destructor, \s-1DESTROY,\s0 will not be called until \fIall\fR +references to the tied object are destroyed. Both the tied variable, +\&\f(CW%x\fR, and \f(CW$X\fR above hold a reference to the object. The call to +\&\fIuntie()\fR will destroy the first, but \f(CW$X\fR still holds a valid +reference, so the destructor will not get called and the database file +\&\fItst.fil\fR will remain open. The fact that Berkeley \s-1DB\s0 then reports the +attempt to open a database that is already open via the catch-all +\&\*(L"Invalid argument\*(R" doesn't help. +.PP +If you run the script with the \f(CW\*(C`\-w\*(C'\fR flag the error message becomes: +.PP +.Vb 2 +\& untie attempted while 1 inner references still exist at bad.file line 12. +\& Cannot tie second time: Invalid argument at bad.file line 14. +.Ve +.PP +which pinpoints the real problem. Finally the script can now be +modified to fix the original problem by destroying the \s-1API\s0 object +before the untie: +.PP +.Vb 2 +\& ... +\& $x{123} = 456 ; +\& +\& undef $X ; +\& untie %x ; +\& +\& $X = tie %x, \*(AqDB_File\*(Aq, \*(Aqtst.fil\*(Aq , O_RDWR|O_CREAT +\& ... +.Ve +.SH "COMMON QUESTIONS" +.IX Header "COMMON QUESTIONS" +.SS "Why is there Perl source in my database?" +.IX Subsection "Why is there Perl source in my database?" +If you look at the contents of a database file created by DB_File, +there can sometimes be part of a Perl script included in it. +.PP +This happens because Berkeley \s-1DB\s0 uses dynamic memory to allocate +buffers which will subsequently be written to the database file. Being +dynamic, the memory could have been used for anything before \s-1DB\s0 +malloced it. As Berkeley \s-1DB\s0 doesn't clear the memory once it has been +allocated, the unused portions will contain random junk. In the case +where a Perl script gets written to the database, the random junk will +correspond to an area of dynamic memory that happened to be used during +the compilation of the script. +.PP +Unless you don't like the possibility of there being part of your Perl +scripts embedded in a database file, this is nothing to worry about. +.SS "How do I store complex data structures with DB_File?" +.IX Subsection "How do I store complex data structures with DB_File?" +Although \fBDB_File\fR cannot do this directly, there is a module which +can layer transparently over \fBDB_File\fR to accomplish this feat. +.PP +Check out the \s-1MLDBM\s0 module, available on \s-1CPAN\s0 in the directory +\&\fImodules/by\-module/MLDBM\fR. +.ie n .SS "What does ""Invalid Argument"" mean?" +.el .SS "What does ``Invalid Argument'' mean?" +.IX Subsection "What does Invalid Argument mean?" +You will get this error message when one of the parameters in the +\&\f(CW\*(C`tie\*(C'\fR call is wrong. Unfortunately there are quite a few parameters to +get wrong, so it can be difficult to figure out which one it is. +.PP +Here are a couple of possibilities: +.IP "1." 5 +Attempting to reopen a database without closing it. +.IP "2." 5 +Using the O_WRONLY flag. +.ie n .SS "What does ""Bareword 'DB_File' not allowed"" mean?" +.el .SS "What does ``Bareword 'DB_File' not allowed'' mean?" +.IX Subsection "What does Bareword 'DB_File' not allowed mean?" +You will encounter this particular error message when you have the +\&\f(CW\*(C`strict \*(Aqsubs\*(Aq\*(C'\fR pragma (or the full strict pragma) in your script. +Consider this script: +.PP +.Vb 5 +\& use warnings ; +\& use strict ; +\& use DB_File ; +\& my %x ; +\& tie %x, DB_File, "filename" ; +.Ve +.PP +Running it produces the error in question: +.PP +.Vb 1 +\& Bareword "DB_File" not allowed while "strict subs" in use +.Ve +.PP +To get around the error, place the word \f(CW\*(C`DB_File\*(C'\fR in either single or +double quotes, like this: +.PP +.Vb 1 +\& tie %x, "DB_File", "filename" ; +.Ve +.PP +Although it might seem like a real pain, it is really worth the effort +of having a \f(CW\*(C`use strict\*(C'\fR in all your scripts. +.SH "REFERENCES" +.IX Header "REFERENCES" +Articles that are either about \fBDB_File\fR or make use of it. +.IP "1." 5 +\&\fIFull-Text Searching in Perl\fR, Tim Kientzle (tkientzle@ddj.com), +Dr. Dobb's Journal, Issue 295, January 1999, pp 34\-41 +.SH "HISTORY" +.IX Header "HISTORY" +Moved to the Changes file. +.SH "BUGS" +.IX Header "BUGS" +Some older versions of Berkeley \s-1DB\s0 had problems with fixed length +records using the \s-1RECNO\s0 file format. This problem has been fixed since +version 1.85 of Berkeley \s-1DB.\s0 +.PP +I am sure there are bugs in the code. If you do find any, or can +suggest any enhancements, I would welcome your comments. +.SH "AVAILABILITY" +.IX Header "AVAILABILITY" +\&\fBDB_File\fR comes with the standard Perl source distribution. Look in +the directory \fIext/DB_File\fR. Given the amount of time between releases +of Perl the version that ships with Perl is quite likely to be out of +date, so the most recent version can always be found on \s-1CPAN \s0(see +\&\*(L"\s-1CPAN\*(R"\s0 in perlmodlib for details), in the directory +\&\fImodules/by\-module/DB_File\fR. +.PP +This version of \fBDB_File\fR will work with either version 1.x, 2.x or +3.x of Berkeley \s-1DB,\s0 but is limited to the functionality provided by +version 1. +.PP +The official web site for Berkeley \s-1DB\s0 is \fIhttp://www.oracle.com/technology/products/berkeley\-db/db/index.html\fR. +All versions of Berkeley \s-1DB\s0 are available there. +.PP +Alternatively, Berkeley \s-1DB\s0 version 1 is available at your nearest \s-1CPAN\s0 +archive in \fIsrc/misc/db.1.85.tar.gz\fR. +.SH "COPYRIGHT" +.IX Header "COPYRIGHT" +Copyright (c) 1995\-2012 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. +.PP +Although \fBDB_File\fR is covered by the Perl license, the library it +makes use of, namely Berkeley \s-1DB,\s0 is not. Berkeley \s-1DB\s0 has its own +copyright and its own license. Please take the time to read it. +.PP +Here are a few words taken from the Berkeley \s-1DB FAQ \s0(at +\&\fIhttp://www.oracle.com/technology/products/berkeley\-db/db/index.html\fR) regarding the license: +.PP +.Vb 1 +\& Do I have to license DB to use it in Perl scripts? +\& +\& No. The Berkeley DB license requires that software that uses +\& Berkeley DB be freely redistributable. In the case of Perl, that +\& software is Perl, and not your scripts. Any Perl scripts that you +\& write are your property, including scripts that make use of +\& Berkeley DB. Neither the Perl license nor the Berkeley DB license +\& place any restriction on what you may do with them. +.Ve +.PP +If you are in any doubt about the license situation, contact either the +Berkeley \s-1DB\s0 authors or the author of DB_File. See \*(L"\s-1AUTHOR\*(R"\s0 for details. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +perl, \fIdbopen\fR\|(3), \fIhash\fR\|(3), \fIrecno\fR\|(3), \fIbtree\fR\|(3), +perldbmfilter +.SH "AUTHOR" +.IX Header "AUTHOR" +The DB_File interface was written by Paul Marquess +. diff --git a/fastSum/resources/ROUGE/DB_File-1.835/blib/script/.exists b/fastSum/resources/ROUGE/DB_File-1.835/blib/script/.exists new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/config.in b/fastSum/resources/ROUGE/DB_File-1.835/config.in new file mode 100644 index 0000000..292b09a --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/config.in @@ -0,0 +1,97 @@ +# Filename: config.in +# +# written by Paul Marquess +# last modified 9th Sept 1997 +# version 1.55 + +# 1. Where is the file db.h? +# +# Change the path below to point to the directory where db.h is +# installed on your system. + +INCLUDE = /usr/local/BerkeleyDB/include +#INCLUDE = /usr/local/include +#INCLUDE = /usr/include + +# 2. Where is libdb? +# +# Change the path below to point to the directory where libdb is +# installed on your system. + +LIB = /usr/local/BerkeleyDB/lib +#LIB = /usr/local/lib +#LIB = /usr/lib + +# 3. What version of Berkely DB have you got? +# +# If you have version 2.0 or greater, you can skip this question. +# +# If you have Berkeley DB 1.78 or greater you shouldn't have to +# change the definitions for PREFIX and HASH below. +# +# For older versions of Berkeley DB change both PREFIX and HASH to int. +# Version 1.71, 1.72 and 1.73 are known to need this change. +# +# If you don't know what version you have have a look in the file db.h. +# +# Search for the string "DB_VERSION_MAJOR". If it is present, you +# have Berkeley DB version 2 (or greater). +# +# If that didn't work, find the definition of the BTREEINFO typedef. +# Check the return type from the prefix element. It should look like +# this in an older copy of db.h: +# +# int (*prefix) __P((const DBT *, const DBT *)); +# +# and like this in a more recent copy: +# +# size_t (*prefix) /* prefix function */ +# __P((const DBT *, const DBT *)); +# +# Change the definition of PREFIX, below, to reflect the return type +# of the prefix function in your db.h. +# +# Now find the definition of the HASHINFO typedef. Check the return +# type of the hash element. Older versions look like this: +# +# int (*hash) __P((const void *, size_t)); +# +# newer like this: +# +# u_int32_t /* hash function */ +# (*hash) __P((const void *, size_t)); +# +# Change the definition of HASH, below, to reflect the return type of +# the hash function in your db.h. +# + +PREFIX = size_t +HASH = u_int32_t + +# 4. Is the library called libdb? +# +# If you have copies of both 1.x and 2.x Berkeley DB installed on +# your system it can sometimes be tricky to make sure you are using +# the correct one. Renaming one (or creating a symbolic link) to +# include the version number of the library can help. +# +# For example, if you have both Berkeley DB 2.3.12 and 1.85 on your +# system and you want to use the Berkeley DB version 2 library you +# could rename the version 2 library from libdb.a to libdb-2.3.12.a and +# change the DBNAME line below to look like this: +# +# DBNAME = -ldb-2.3.12 +# +# That will ensure you are linking the correct version of the DB +# library. +# +# Note: If you are building this module with Win32, -llibdb will be +# used by default. +# +# If you have changed the name of the library, uncomment the line +# below (by removing the leading #) and edit the line to use the name +# you have picked. + +#DBNAME = -ldb-2.4.10 + +# end of file config.in diff --git a/fastSum/resources/ROUGE/DB_File-1.835/constants.h b/fastSum/resources/ROUGE/DB_File-1.835/constants.h new file mode 100644 index 0000000..b4dda93 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/constants.h @@ -0,0 +1,455 @@ +#define PERL_constant_NOTFOUND 1 +#define PERL_constant_NOTDEF 2 +#define PERL_constant_ISIV 3 +#define PERL_constant_ISNO 4 +#define PERL_constant_ISNV 5 +#define PERL_constant_ISPV 6 +#define PERL_constant_ISPVN 7 +#define PERL_constant_ISSV 8 +#define PERL_constant_ISUNDEF 9 +#define PERL_constant_ISUV 10 +#define PERL_constant_ISYES 11 + +#ifndef NVTYPE +typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */ +#endif +#ifndef aTHX_ +#define aTHX_ /* 5.6 or later define this for threading support. */ +#endif +#ifndef pTHX_ +#define pTHX_ /* 5.6 or later define this for threading support. */ +#endif + +static int +constant_6 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DB_TXN R_LAST R_NEXT R_PREV */ + /* Offset 2 gives the best switch position. */ + switch (name[2]) { + case 'L': + if (memEQ(name, "R_LAST", 6)) { + /* ^ */ +#ifdef R_LAST + *iv_return = R_LAST; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "R_NEXT", 6)) { + /* ^ */ +#ifdef R_NEXT + *iv_return = R_NEXT; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'P': + if (memEQ(name, "R_PREV", 6)) { + /* ^ */ +#ifdef R_PREV + *iv_return = R_PREV; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case '_': + if (memEQ(name, "DB_TXN", 6)) { + /* ^ */ +#ifdef DB_TXN + *iv_return = DB_TXN; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_7 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DB_LOCK R_FIRST R_NOKEY */ + /* Offset 3 gives the best switch position. */ + switch (name[3]) { + case 'I': + if (memEQ(name, "R_FIRST", 7)) { + /* ^ */ +#ifdef R_FIRST + *iv_return = R_FIRST; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'L': + if (memEQ(name, "DB_LOCK", 7)) { + /* ^ */ +#ifdef DB_LOCK + *iv_return = DB_LOCK; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "R_NOKEY", 7)) { + /* ^ */ +#ifdef R_NOKEY + *iv_return = R_NOKEY; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_8 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DB_SHMEM R_CURSOR R_IAFTER */ + /* Offset 5 gives the best switch position. */ + switch (name[5]) { + case 'M': + if (memEQ(name, "DB_SHMEM", 8)) { + /* ^ */ +#ifdef DB_SHMEM + *iv_return = DB_SHMEM; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'S': + if (memEQ(name, "R_CURSOR", 8)) { + /* ^ */ +#ifdef R_CURSOR + *iv_return = R_CURSOR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'T': + if (memEQ(name, "R_IAFTER", 8)) { + /* ^ */ +#ifdef R_IAFTER + *iv_return = R_IAFTER; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_9 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + HASHMAGIC RET_ERROR R_IBEFORE */ + /* Offset 7 gives the best switch position. */ + switch (name[7]) { + case 'I': + if (memEQ(name, "HASHMAGIC", 9)) { + /* ^ */ +#ifdef HASHMAGIC + *iv_return = HASHMAGIC; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "RET_ERROR", 9)) { + /* ^ */ +#ifdef RET_ERROR + *iv_return = RET_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'R': + if (memEQ(name, "R_IBEFORE", 9)) { + /* ^ */ +#ifdef R_IBEFORE + *iv_return = R_IBEFORE; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_10 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + BTREEMAGIC R_FIXEDLEN R_SNAPSHOT __R_UNUSED */ + /* Offset 5 gives the best switch position. */ + switch (name[5]) { + case 'E': + if (memEQ(name, "R_FIXEDLEN", 10)) { + /* ^ */ +#ifdef R_FIXEDLEN + *iv_return = R_FIXEDLEN; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'M': + if (memEQ(name, "BTREEMAGIC", 10)) { + /* ^ */ +#ifdef BTREEMAGIC + *iv_return = BTREEMAGIC; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "__R_UNUSED", 10)) { + /* ^ */ +#ifdef __R_UNUSED + *iv_return = __R_UNUSED; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'P': + if (memEQ(name, "R_SNAPSHOT", 10)) { + /* ^ */ +#ifdef R_SNAPSHOT + *iv_return = R_SNAPSHOT; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_11 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + HASHVERSION RET_SPECIAL RET_SUCCESS R_RECNOSYNC R_SETCURSOR */ + /* Offset 10 gives the best switch position. */ + switch (name[10]) { + case 'C': + if (memEQ(name, "R_RECNOSYN", 10)) { + /* C */ +#ifdef R_RECNOSYNC + *iv_return = R_RECNOSYNC; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'L': + if (memEQ(name, "RET_SPECIA", 10)) { + /* L */ +#ifdef RET_SPECIAL + *iv_return = RET_SPECIAL; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "HASHVERSIO", 10)) { + /* N */ +#ifdef HASHVERSION + *iv_return = HASHVERSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'R': + if (memEQ(name, "R_SETCURSO", 10)) { + /* R */ +#ifdef R_SETCURSOR + *iv_return = R_SETCURSOR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'S': + if (memEQ(name, "RET_SUCCES", 10)) { + /* S */ +#ifdef RET_SUCCESS + *iv_return = RET_SUCCESS; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant (pTHX_ const char *name, STRLEN len, IV *iv_return) { + /* Initially switch on the length of the name. */ + /* When generated this function returned values for the list of names given + in this section of perl code. Rather than manually editing these functions + to add or remove constants, which would result in this comment and section + of code becoming inaccurate, we recommend that you edit this section of + code, and use it to regenerate a new set of constant functions which you + then use to replace the originals. + + Regenerate these constant functions by feeding this entire source file to + perl -x + +#!/usr/bin/perl -w +use ExtUtils::Constant qw (constant_types C_constant XS_constant); + +my $types = {map {($_, 1)} qw(IV)}; +my @names = (qw(BTREEMAGIC BTREEVERSION DB_LOCK DB_SHMEM DB_TXN HASHMAGIC + HASHVERSION MAX_PAGE_NUMBER MAX_PAGE_OFFSET MAX_REC_NUMBER + RET_ERROR RET_SPECIAL RET_SUCCESS R_CURSOR R_DUP R_FIRST + R_FIXEDLEN R_IAFTER R_IBEFORE R_LAST R_NEXT R_NOKEY + R_NOOVERWRITE R_PREV R_RECNOSYNC R_SETCURSOR R_SNAPSHOT + __R_UNUSED)); + +print constant_types(), "\n"; # macro defs +foreach (C_constant ("DB_File", 'constant', 'IV', $types, undef, 3, @names) ) { + print $_, "\n"; # C constant subs +} +print "\n#### XS Section:\n"; +print XS_constant ("DB_File", $types); +__END__ + */ + + switch (len) { + case 5: + if (memEQ(name, "R_DUP", 5)) { +#ifdef R_DUP + *iv_return = R_DUP; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 6: + return constant_6 (aTHX_ name, iv_return); + break; + case 7: + return constant_7 (aTHX_ name, iv_return); + break; + case 8: + return constant_8 (aTHX_ name, iv_return); + break; + case 9: + return constant_9 (aTHX_ name, iv_return); + break; + case 10: + return constant_10 (aTHX_ name, iv_return); + break; + case 11: + return constant_11 (aTHX_ name, iv_return); + break; + case 12: + if (memEQ(name, "BTREEVERSION", 12)) { +#ifdef BTREEVERSION + *iv_return = BTREEVERSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 13: + if (memEQ(name, "R_NOOVERWRITE", 13)) { +#ifdef R_NOOVERWRITE + *iv_return = R_NOOVERWRITE; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 14: + if (memEQ(name, "MAX_REC_NUMBER", 14)) { +#ifdef MAX_REC_NUMBER + *iv_return = MAX_REC_NUMBER; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 15: + /* Names all of length 15. */ + /* MAX_PAGE_NUMBER MAX_PAGE_OFFSET */ + /* Offset 9 gives the best switch position. */ + switch (name[9]) { + case 'N': + if (memEQ(name, "MAX_PAGE_NUMBER", 15)) { + /* ^ */ +#ifdef MAX_PAGE_NUMBER + *iv_return = MAX_PAGE_NUMBER; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "MAX_PAGE_OFFSET", 15)) { + /* ^ */ +#ifdef MAX_PAGE_OFFSET + *iv_return = MAX_PAGE_OFFSET; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + break; + } + return PERL_constant_NOTFOUND; +} + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/constants.xs b/fastSum/resources/ROUGE/DB_File-1.835/constants.xs new file mode 100644 index 0000000..779aa23 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/constants.xs @@ -0,0 +1,90 @@ +void +constant(sv) + PREINIT: +#ifdef dXSTARG + dXSTARG; /* Faster if we have it. */ +#else + dTARGET; +#endif + STRLEN len; + int type; + IV iv; + /* NV nv; Uncomment this if you need to return NVs */ + /* const char *pv; Uncomment this if you need to return PVs */ + INPUT: + SV * sv; + const char * s = SvPV(sv, len); + PPCODE: + /* Change this to constant(aTHX_ s, len, &iv, &nv); + if you need to return both NVs and IVs */ + type = constant(aTHX_ s, len, &iv); + /* Return 1 or 2 items. First is error message, or undef if no error. + Second, if present, is found value */ + switch (type) { + case PERL_constant_NOTFOUND: + sv = + sv_2mortal(newSVpvf("%s is not a valid DB_File macro", s)); + PUSHs(sv); + break; + case PERL_constant_NOTDEF: + sv = sv_2mortal(newSVpvf( + "Your vendor has not defined DB_File macro %s, used", + s)); + PUSHs(sv); + break; + case PERL_constant_ISIV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHi(iv); + break; + /* Uncomment this if you need to return NOs + case PERL_constant_ISNO: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_no); + break; */ + /* Uncomment this if you need to return NVs + case PERL_constant_ISNV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHn(nv); + break; */ + /* Uncomment this if you need to return PVs + case PERL_constant_ISPV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, strlen(pv)); + break; */ + /* Uncomment this if you need to return PVNs + case PERL_constant_ISPVN: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, iv); + break; */ + /* Uncomment this if you need to return SVs + case PERL_constant_ISSV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(sv); + break; */ + /* Uncomment this if you need to return UNDEFs + case PERL_constant_ISUNDEF: + break; */ + /* Uncomment this if you need to return UVs + case PERL_constant_ISUV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHu((UV)iv); + break; */ + /* Uncomment this if you need to return YESs + case PERL_constant_ISYES: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_yes); + break; */ + default: + sv = sv_2mortal(newSVpvf( + "Unexpected return type %d while processing DB_File macro %s, used", + type, s)); + PUSHs(sv); + } diff --git a/fastSum/resources/ROUGE/DB_File-1.835/dbinfo b/fastSum/resources/ROUGE/DB_File-1.835/dbinfo new file mode 100644 index 0000000..e8abc97 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/dbinfo @@ -0,0 +1,133 @@ +#!/usr/local/bin/perl + +# Name: dbinfo -- identify berkeley DB version used to create +# a database file +# +# Author: Paul Marquess +# Version: 1.06 +# Date 27th March 2008 +# +# Copyright (c) 1998-2012 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. + +# Todo: Print more stats on a db file, e.g. no of records +# add log/txn/lock files + +use strict ; + +my %Data = + ( + 0x053162 => # DB_BTREEMAGIC + { + Type => "Btree", + Versions => # DB_BTREEVERSION + { + 1 => [0, "Unknown (older than 1.71)"], + 2 => [0, "Unknown (older than 1.71)"], + 3 => [0, "1.71 -> 1.85, 1.86"], + 4 => [0, "Unknown"], + 5 => [0, "2.0.0 -> 2.3.0"], + 6 => [0, "2.3.1 -> 2.7.7"], + 7 => [0, "3.0.x"], + 8 => [0, "3.1.x -> 4.0.x"], + 9 => [1, "4.1.x or greater"], + } + }, + 0x061561 => # DB_HASHMAGIC + { + Type => "Hash", + Versions => # DB_HASHVERSION + { + 1 => [0, "Unknown (older than 1.71)"], + 2 => [0, "1.71 -> 1.85"], + 3 => [0, "1.86"], + 4 => [0, "2.0.0 -> 2.1.0"], + 5 => [0, "2.2.6 -> 2.7.7"], + 6 => [0, "3.0.x"], + 7 => [0, "3.1.x -> 4.0.x"], + 8 => [1, "4.1.x or greater"], + 9 => [1, "4.6.x or greater"], + } + }, + 0x042253 => # DB_QAMMAGIC + { + Type => "Queue", + Versions => # DB_QAMVERSION + { + 1 => [0, "3.0.x"], + 2 => [0, "3.1.x"], + 3 => [0, "3.2.x -> 4.0.x"], + 4 => [1, "4.1.x or greater"], + } + }, + ) ; + +die "Usage: dbinfo file\n" unless @ARGV == 1 ; + +print "testing file $ARGV[0]...\n\n" ; +open (F, "<$ARGV[0]") or die "Cannot open file $ARGV[0]: $!\n" ; + +my $buff ; +read F, $buff, 30 ; + + +my (@info) = unpack("NNNNNNC", $buff) ; +my (@info1) = unpack("VVVVVVC", $buff) ; +my ($magic, $version, $endian, $encrypt) ; + +if ($Data{$info[0]}) # first try DB 1.x format, big endian +{ + $magic = $info[0] ; + $version = $info[1] ; + $endian = "Big Endian" ; + $encrypt = "Not Supported"; +} +elsif ($Data{$info1[0]}) # first try DB 1.x format, little endian +{ + $magic = $info1[0] ; + $version = $info1[1] ; + $endian = "Little Endian" ; + $encrypt = "Not Supported"; +} +elsif ($Data{$info[3]}) # next DB 2.x big endian +{ + $magic = $info[3] ; + $version = $info[4] ; + $endian = "Big Endian" ; +} +elsif ($Data{$info1[3]}) # next DB 2.x little endian +{ + $magic = $info1[3] ; + $version = $info1[4] ; + $endian = "Little Endian" ; +} +else + { die "not a Berkeley DB database file.\n" } + +my $type = $Data{$magic} ; +$magic = sprintf "%06X", $magic ; + +my $ver_string = "Unknown" ; + +if ( defined $type->{Versions}{$version} ) +{ + $ver_string = $type->{Versions}{$version}[1]; + if ($type->{Versions}{$version}[0] ) + { $encrypt = $info[6] ? "Enabled" : "Disabled" } + else + { $encrypt = "Not Supported" } +} + +print <{Type} file. +File Version ID: $version +Built with Berkeley DB: $ver_string +Byte Order: $endian +Magic: $magic +Encryption: $encrypt +EOM + +close F ; + +exit ; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/fallback.h b/fastSum/resources/ROUGE/DB_File-1.835/fallback.h new file mode 100644 index 0000000..0213308 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/fallback.h @@ -0,0 +1,455 @@ +#define PERL_constant_NOTFOUND 1 +#define PERL_constant_NOTDEF 2 +#define PERL_constant_ISIV 3 +#define PERL_constant_ISNO 4 +#define PERL_constant_ISNV 5 +#define PERL_constant_ISPV 6 +#define PERL_constant_ISPVN 7 +#define PERL_constant_ISSV 8 +#define PERL_constant_ISUNDEF 9 +#define PERL_constant_ISUV 10 +#define PERL_constant_ISYES 11 + +#ifndef NVTYPE +typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */ +#endif +#ifndef aTHX_ +#define aTHX_ /* 5.6 or later define this for threading support. */ +#endif +#ifndef pTHX_ +#define pTHX_ /* 5.6 or later define this for threading support. */ +#endif + +static int +constant_6 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DB_TXN R_LAST R_NEXT R_PREV */ + /* Offset 2 gives the best switch position. */ + switch (name[2]) { + case 'L': + if (memEQ(name, "R_LAST", 6)) { + /* ^ */ +#ifdef R_LAST + *iv_return = R_LAST; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "R_NEXT", 6)) { + /* ^ */ +#ifdef R_NEXT + *iv_return = R_NEXT; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'P': + if (memEQ(name, "R_PREV", 6)) { + /* ^ */ +#ifdef R_PREV + *iv_return = R_PREV; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case '_': + if (memEQ(name, "DB_TXN", 6)) { + /* ^ */ +#ifdef DB_TXN + *iv_return = DB_TXN; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_7 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DB_LOCK R_FIRST R_NOKEY */ + /* Offset 3 gives the best switch position. */ + switch (name[3]) { + case 'I': + if (memEQ(name, "R_FIRST", 7)) { + /* ^ */ +#ifdef R_FIRST + *iv_return = R_FIRST; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'L': + if (memEQ(name, "DB_LOCK", 7)) { + /* ^ */ +#ifdef DB_LOCK + *iv_return = DB_LOCK; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "R_NOKEY", 7)) { + /* ^ */ +#ifdef R_NOKEY + *iv_return = R_NOKEY; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_8 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + DB_SHMEM R_CURSOR R_IAFTER */ + /* Offset 5 gives the best switch position. */ + switch (name[5]) { + case 'M': + if (memEQ(name, "DB_SHMEM", 8)) { + /* ^ */ +#ifdef DB_SHMEM + *iv_return = DB_SHMEM; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'S': + if (memEQ(name, "R_CURSOR", 8)) { + /* ^ */ +#ifdef R_CURSOR + *iv_return = R_CURSOR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'T': + if (memEQ(name, "R_IAFTER", 8)) { + /* ^ */ +#ifdef R_IAFTER + *iv_return = R_IAFTER; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_9 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + HASHMAGIC RET_ERROR R_IBEFORE */ + /* Offset 7 gives the best switch position. */ + switch (name[7]) { + case 'I': + if (memEQ(name, "HASHMAGIC", 9)) { + /* ^ */ +#ifdef HASHMAGIC + *iv_return = HASHMAGIC; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "RET_ERROR", 9)) { + /* ^ */ +#ifdef RET_ERROR + *iv_return = RET_ERROR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'R': + if (memEQ(name, "R_IBEFORE", 9)) { + /* ^ */ +#ifdef R_IBEFORE + *iv_return = R_IBEFORE; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_10 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + BTREEMAGIC R_FIXEDLEN R_SNAPSHOT __R_UNUSED */ + /* Offset 5 gives the best switch position. */ + switch (name[5]) { + case 'E': + if (memEQ(name, "R_FIXEDLEN", 10)) { + /* ^ */ +#ifdef R_FIXEDLEN + *iv_return = R_FIXEDLEN; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'M': + if (memEQ(name, "BTREEMAGIC", 10)) { + /* ^ */ +#ifdef BTREEMAGIC + *iv_return = BTREEMAGIC; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "__R_UNUSED", 10)) { + /* ^ */ +#ifdef __R_UNUSED + *iv_return = __R_UNUSED; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'P': + if (memEQ(name, "R_SNAPSHOT", 10)) { + /* ^ */ +#ifdef R_SNAPSHOT + *iv_return = R_SNAPSHOT; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant_11 (pTHX_ const char *name, IV *iv_return) { + /* When generated this function returned values for the list of names given + here. However, subsequent manual editing may have added or removed some. + HASHVERSION RET_SPECIAL RET_SUCCESS R_RECNOSYNC R_SETCURSOR */ + /* Offset 10 gives the best switch position. */ + switch (name[10]) { + case 'C': + if (memEQ(name, "R_RECNOSYNC", 11)) { + /* ^ */ +#ifdef R_RECNOSYNC + *iv_return = R_RECNOSYNC; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'L': + if (memEQ(name, "RET_SPECIAL", 11)) { + /* ^ */ +#ifdef RET_SPECIAL + *iv_return = RET_SPECIAL; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'N': + if (memEQ(name, "HASHVERSION", 11)) { + /* ^ */ +#ifdef HASHVERSION + *iv_return = HASHVERSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'R': + if (memEQ(name, "R_SETCURSOR", 11)) { + /* ^ */ +#ifdef R_SETCURSOR + *iv_return = R_SETCURSOR; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'S': + if (memEQ(name, "RET_SUCCESS", 11)) { + /* ^ */ +#ifdef RET_SUCCESS + *iv_return = RET_SUCCESS; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + return PERL_constant_NOTFOUND; +} + +static int +constant (pTHX_ const char *name, STRLEN len, IV *iv_return) { + /* Initially switch on the length of the name. */ + /* When generated this function returned values for the list of names given + in this section of perl code. Rather than manually editing these functions + to add or remove constants, which would result in this comment and section + of code becoming inaccurate, we recommend that you edit this section of + code, and use it to regenerate a new set of constant functions which you + then use to replace the originals. + + Regenerate these constant functions by feeding this entire source file to + perl -x + +#!bleedperl -w +use ExtUtils::Constant qw (constant_types C_constant XS_constant); + +my $types = {map {($_, 1)} qw(IV)}; +my @names = (qw(BTREEMAGIC BTREEVERSION DB_LOCK DB_SHMEM DB_TXN HASHMAGIC + HASHVERSION MAX_PAGE_NUMBER MAX_PAGE_OFFSET MAX_REC_NUMBER + RET_ERROR RET_SPECIAL RET_SUCCESS R_CURSOR R_DUP R_FIRST + R_FIXEDLEN R_IAFTER R_IBEFORE R_LAST R_NEXT R_NOKEY + R_NOOVERWRITE R_PREV R_RECNOSYNC R_SETCURSOR R_SNAPSHOT + __R_UNUSED)); + +print constant_types(); # macro defs +foreach (C_constant ("DB_File", 'constant', 'IV', $types, undef, 3, @names) ) { + print $_, "\n"; # C constant subs +} +print "#### XS Section:\n"; +print XS_constant ("DB_File", $types); +__END__ + */ + + switch (len) { + case 5: + if (memEQ(name, "R_DUP", 5)) { +#ifdef R_DUP + *iv_return = R_DUP; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 6: + return constant_6 (aTHX_ name, iv_return); + break; + case 7: + return constant_7 (aTHX_ name, iv_return); + break; + case 8: + return constant_8 (aTHX_ name, iv_return); + break; + case 9: + return constant_9 (aTHX_ name, iv_return); + break; + case 10: + return constant_10 (aTHX_ name, iv_return); + break; + case 11: + return constant_11 (aTHX_ name, iv_return); + break; + case 12: + if (memEQ(name, "BTREEVERSION", 12)) { +#ifdef BTREEVERSION + *iv_return = BTREEVERSION; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 13: + if (memEQ(name, "R_NOOVERWRITE", 13)) { +#ifdef R_NOOVERWRITE + *iv_return = R_NOOVERWRITE; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 14: + if (memEQ(name, "MAX_REC_NUMBER", 14)) { +#ifdef MAX_REC_NUMBER + *iv_return = MAX_REC_NUMBER; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 15: + /* Names all of length 15. */ + /* MAX_PAGE_NUMBER MAX_PAGE_OFFSET */ + /* Offset 9 gives the best switch position. */ + switch (name[9]) { + case 'N': + if (memEQ(name, "MAX_PAGE_NUMBER", 15)) { + /* ^ */ +#ifdef MAX_PAGE_NUMBER + *iv_return = MAX_PAGE_NUMBER; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + case 'O': + if (memEQ(name, "MAX_PAGE_OFFSET", 15)) { + /* ^ */ +#ifdef MAX_PAGE_OFFSET + *iv_return = MAX_PAGE_OFFSET; + return PERL_constant_ISIV; +#else + return PERL_constant_NOTDEF; +#endif + } + break; + } + break; + } + return PERL_constant_NOTFOUND; +} + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/fallback.xs b/fastSum/resources/ROUGE/DB_File-1.835/fallback.xs new file mode 100644 index 0000000..8650cdf --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/fallback.xs @@ -0,0 +1,88 @@ +void +constant(sv) + PREINIT: +#ifdef dXSTARG + dXSTARG; /* Faster if we have it. */ +#else + dTARGET; +#endif + STRLEN len; + int type; + IV iv; + /* NV nv; Uncomment this if you need to return NVs */ + /* const char *pv; Uncomment this if you need to return PVs */ + INPUT: + SV * sv; + const char * s = SvPV(sv, len); + PPCODE: + /* Change this to constant(aTHX_ s, len, &iv, &nv); + if you need to return both NVs and IVs */ + type = constant(aTHX_ s, len, &iv); + /* Return 1 or 2 items. First is error message, or undef if no error. + Second, if present, is found value */ + switch (type) { + case PERL_constant_NOTFOUND: + sv = sv_2mortal(newSVpvf("%s is not a valid DB_File macro", s)); + PUSHs(sv); + break; + case PERL_constant_NOTDEF: + sv = sv_2mortal(newSVpvf( + "Your vendor has not defined DB_File macro %s, used", s)); + PUSHs(sv); + break; + case PERL_constant_ISIV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHi(iv); + break; + /* Uncomment this if you need to return NOs + case PERL_constant_ISNO: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_no); + break; */ + /* Uncomment this if you need to return NVs + case PERL_constant_ISNV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHn(nv); + break; */ + /* Uncomment this if you need to return PVs + case PERL_constant_ISPV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, strlen(pv)); + break; */ + /* Uncomment this if you need to return PVNs + case PERL_constant_ISPVN: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHp(pv, iv); + break; */ + /* Uncomment this if you need to return SVs + case PERL_constant_ISSV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(sv); + break; */ + /* Uncomment this if you need to return UNDEFs + case PERL_constant_ISUNDEF: + break; */ + /* Uncomment this if you need to return UVs + case PERL_constant_ISUV: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHu((UV)iv); + break; */ + /* Uncomment this if you need to return YESs + case PERL_constant_ISYES: + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHs(&PL_sv_yes); + break; */ + default: + sv = sv_2mortal(newSVpvf( + "Unexpected return type %d while processing DB_File macro %s, used", + type, s)); + PUSHs(sv); + } diff --git a/fastSum/resources/ROUGE/DB_File-1.835/hints/dynixptx.pl b/fastSum/resources/ROUGE/DB_File-1.835/hints/dynixptx.pl new file mode 100644 index 0000000..bb5ffa5 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/hints/dynixptx.pl @@ -0,0 +1,3 @@ +# Need to add an extra '-lc' to the end to work around a DYNIX/ptx bug + +$self->{LIBS} = ['-lm -lc']; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/hints/sco.pl b/fastSum/resources/ROUGE/DB_File-1.835/hints/sco.pl new file mode 100644 index 0000000..ff60440 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/hints/sco.pl @@ -0,0 +1,2 @@ +# osr5 needs to explicitly link against libc to pull in some static symbols +$self->{LIBS} = ['-ldb -lc'] if $Config{'osvers'} =~ '3\.2v5\.0\..' ; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004 new file mode 100644 index 0000000..0665d1f --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004 @@ -0,0 +1,93 @@ +diff -rc perl5.004.orig/Configure perl5.004/Configure +*** perl5.004.orig/Configure 1997-05-13 18:20:34.000000000 +0100 +--- perl5.004/Configure 2003-04-26 16:36:53.000000000 +0100 +*************** +*** 188,193 **** +--- 188,194 ---- + mv='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 9902,9907 **** +--- 9903,9916 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 10370,10375 **** +--- 10379,10385 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.004.orig/Makefile.SH perl5.004/Makefile.SH +*** perl5.004.orig/Makefile.SH 1997-05-01 15:22:39.000000000 +0100 +--- perl5.004/Makefile.SH 2003-04-26 16:37:23.000000000 +0100 +*************** +*** 119,125 **** + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 119,125 ---- + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.004.orig/myconfig perl5.004/myconfig +*** perl5.004.orig/myconfig 1996-12-21 01:13:20.000000000 +0000 +--- perl5.004/myconfig 2003-04-26 16:37:51.000000000 +0100 +*************** +*** 35,41 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +--- 35,41 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +diff -rc perl5.004.orig/patchlevel.h perl5.004/patchlevel.h +*** perl5.004.orig/patchlevel.h 1997-05-15 23:15:17.000000000 +0100 +--- perl5.004/patchlevel.h 2003-04-26 16:38:11.000000000 +0100 +*************** +*** 38,43 **** +--- 38,44 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_01 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_01 new file mode 100644 index 0000000..1b05eb4 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_01 @@ -0,0 +1,217 @@ +diff -rc perl5.004_01.orig/Configure perl5.004_01/Configure +*** perl5.004_01.orig/Configure Wed Jun 11 00:28:03 1997 +--- perl5.004_01/Configure Sun Nov 12 22:12:35 2000 +*************** +*** 188,193 **** +--- 188,194 ---- + mv='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 9907,9912 **** +--- 9908,9921 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 10375,10380 **** +--- 10384,10390 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.004_01.orig/Makefile.SH perl5.004_01/Makefile.SH +*** perl5.004_01.orig/Makefile.SH Thu Jun 12 23:27:56 1997 +--- perl5.004_01/Makefile.SH Sun Nov 12 22:12:35 2000 +*************** +*** 126,132 **** + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 126,132 ---- + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.004_01.orig/lib/ExtUtils/Embed.pm perl5.004_01/lib/ExtUtils/Embed.pm +*** perl5.004_01.orig/lib/ExtUtils/Embed.pm Wed Apr 2 22:12:04 1997 +--- perl5.004_01/lib/ExtUtils/Embed.pm Sun Nov 12 22:12:35 2000 +*************** +*** 170,176 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 170,176 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.004_01.orig/lib/ExtUtils/Liblist.pm perl5.004_01/lib/ExtUtils/Liblist.pm +*** perl5.004_01.orig/lib/ExtUtils/Liblist.pm Sat Jun 7 01:19:44 1997 +--- perl5.004_01/lib/ExtUtils/Liblist.pm Sun Nov 12 22:13:27 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $Verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + print STDOUT "Potential libraries are '$potential_libs':\n" if $Verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $Verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + print STDOUT "Potential libraries are '$potential_libs':\n" if $Verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 186,196 **** + my($self, $potential_libs, $Verbose) = @_; + + # If user did not supply a list, we punt. +! # (caller should probably use the list in $Config{libs}) + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +--- 186,196 ---- + my($self, $potential_libs, $Verbose) = @_; + + # If user did not supply a list, we punt. +! # (caller should probably use the list in $Config{perllibs}) + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +*************** +*** 540,546 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 540,546 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +diff -rc perl5.004_01.orig/lib/ExtUtils/MM_Unix.pm perl5.004_01/lib/ExtUtils/MM_Unix.pm +*** perl5.004_01.orig/lib/ExtUtils/MM_Unix.pm Thu Jun 12 22:06:18 1997 +--- perl5.004_01/lib/ExtUtils/MM_Unix.pm Sun Nov 12 22:12:35 2000 +*************** +*** 2137,2143 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2137,2143 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -rc perl5.004_01.orig/myconfig perl5.004_01/myconfig +*** perl5.004_01.orig/myconfig Sat Dec 21 01:13:20 1996 +--- perl5.004_01/myconfig Sun Nov 12 22:12:35 2000 +*************** +*** 35,41 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +--- 35,41 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +diff -rc perl5.004_01.orig/patchlevel.h perl5.004_01/patchlevel.h +*** perl5.004_01.orig/patchlevel.h Wed Jun 11 03:06:10 1997 +--- perl5.004_01/patchlevel.h Sun Nov 12 22:12:35 2000 +*************** +*** 38,43 **** +--- 38,44 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_02 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_02 new file mode 100644 index 0000000..238f873 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_02 @@ -0,0 +1,217 @@ +diff -rc perl5.004_02.orig/Configure perl5.004_02/Configure +*** perl5.004_02.orig/Configure Thu Aug 7 15:08:44 1997 +--- perl5.004_02/Configure Sun Nov 12 22:06:24 2000 +*************** +*** 188,193 **** +--- 188,194 ---- + mv='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 9911,9916 **** +--- 9912,9925 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 10379,10384 **** +--- 10388,10394 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.004_02.orig/Makefile.SH perl5.004_02/Makefile.SH +*** perl5.004_02.orig/Makefile.SH Thu Aug 7 13:10:53 1997 +--- perl5.004_02/Makefile.SH Sun Nov 12 22:06:24 2000 +*************** +*** 126,132 **** + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 126,132 ---- + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.004_02.orig/lib/ExtUtils/Embed.pm perl5.004_02/lib/ExtUtils/Embed.pm +*** perl5.004_02.orig/lib/ExtUtils/Embed.pm Fri Aug 1 15:08:44 1997 +--- perl5.004_02/lib/ExtUtils/Embed.pm Sun Nov 12 22:06:24 2000 +*************** +*** 178,184 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 178,184 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.004_02.orig/lib/ExtUtils/Liblist.pm perl5.004_02/lib/ExtUtils/Liblist.pm +*** perl5.004_02.orig/lib/ExtUtils/Liblist.pm Fri Aug 1 19:36:58 1997 +--- perl5.004_02/lib/ExtUtils/Liblist.pm Sun Nov 12 22:06:24 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + print STDOUT "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + print STDOUT "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 186,196 **** + my($self, $potential_libs, $verbose) = @_; + + # If user did not supply a list, we punt. +! # (caller should probably use the list in $Config{libs}) + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +--- 186,196 ---- + my($self, $potential_libs, $verbose) = @_; + + # If user did not supply a list, we punt. +! # (caller should probably use the list in $Config{perllibs}) + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +*************** +*** 540,546 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 540,546 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +diff -rc perl5.004_02.orig/lib/ExtUtils/MM_Unix.pm perl5.004_02/lib/ExtUtils/MM_Unix.pm +*** perl5.004_02.orig/lib/ExtUtils/MM_Unix.pm Tue Aug 5 14:28:08 1997 +--- perl5.004_02/lib/ExtUtils/MM_Unix.pm Sun Nov 12 22:06:25 2000 +*************** +*** 2224,2230 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2224,2230 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -rc perl5.004_02.orig/myconfig perl5.004_02/myconfig +*** perl5.004_02.orig/myconfig Sat Dec 21 01:13:20 1996 +--- perl5.004_02/myconfig Sun Nov 12 22:06:25 2000 +*************** +*** 35,41 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +--- 35,41 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +diff -rc perl5.004_02.orig/patchlevel.h perl5.004_02/patchlevel.h +*** perl5.004_02.orig/patchlevel.h Fri Aug 1 15:07:34 1997 +--- perl5.004_02/patchlevel.h Sun Nov 12 22:06:25 2000 +*************** +*** 38,43 **** +--- 38,44 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_03 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_03 new file mode 100644 index 0000000..06331ea --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_03 @@ -0,0 +1,223 @@ +diff -rc perl5.004_03.orig/Configure perl5.004_03/Configure +*** perl5.004_03.orig/Configure Wed Aug 13 16:09:46 1997 +--- perl5.004_03/Configure Sun Nov 12 21:56:18 2000 +*************** +*** 188,193 **** +--- 188,194 ---- + mv='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 9911,9916 **** +--- 9912,9925 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 10379,10384 **** +--- 10388,10394 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +Only in perl5.004_03: Configure.orig +diff -rc perl5.004_03.orig/Makefile.SH perl5.004_03/Makefile.SH +*** perl5.004_03.orig/Makefile.SH Mon Aug 18 19:24:29 1997 +--- perl5.004_03/Makefile.SH Sun Nov 12 21:56:18 2000 +*************** +*** 126,132 **** + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 126,132 ---- + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +Only in perl5.004_03: Makefile.SH.orig +diff -rc perl5.004_03.orig/lib/ExtUtils/Embed.pm perl5.004_03/lib/ExtUtils/Embed.pm +*** perl5.004_03.orig/lib/ExtUtils/Embed.pm Fri Aug 1 15:08:44 1997 +--- perl5.004_03/lib/ExtUtils/Embed.pm Sun Nov 12 21:56:18 2000 +*************** +*** 178,184 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 178,184 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.004_03.orig/lib/ExtUtils/Liblist.pm perl5.004_03/lib/ExtUtils/Liblist.pm +*** perl5.004_03.orig/lib/ExtUtils/Liblist.pm Fri Aug 1 19:36:58 1997 +--- perl5.004_03/lib/ExtUtils/Liblist.pm Sun Nov 12 21:57:17 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + print STDOUT "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + print STDOUT "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 186,196 **** + my($self, $potential_libs, $verbose) = @_; + + # If user did not supply a list, we punt. +! # (caller should probably use the list in $Config{libs}) + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +--- 186,196 ---- + my($self, $potential_libs, $verbose) = @_; + + # If user did not supply a list, we punt. +! # (caller should probably use the list in $Config{perllibs}) + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +*************** +*** 540,546 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 540,546 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +Only in perl5.004_03/lib/ExtUtils: Liblist.pm.orig +Only in perl5.004_03/lib/ExtUtils: Liblist.pm.rej +diff -rc perl5.004_03.orig/lib/ExtUtils/MM_Unix.pm perl5.004_03/lib/ExtUtils/MM_Unix.pm +*** perl5.004_03.orig/lib/ExtUtils/MM_Unix.pm Mon Aug 18 19:16:12 1997 +--- perl5.004_03/lib/ExtUtils/MM_Unix.pm Sun Nov 12 21:56:19 2000 +*************** +*** 2224,2230 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2224,2230 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +Only in perl5.004_03/lib/ExtUtils: MM_Unix.pm.orig +diff -rc perl5.004_03.orig/myconfig perl5.004_03/myconfig +*** perl5.004_03.orig/myconfig Sat Dec 21 01:13:20 1996 +--- perl5.004_03/myconfig Sun Nov 12 21:56:19 2000 +*************** +*** 35,41 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +--- 35,41 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +diff -rc perl5.004_03.orig/patchlevel.h perl5.004_03/patchlevel.h +*** perl5.004_03.orig/patchlevel.h Wed Aug 13 11:42:01 1997 +--- perl5.004_03/patchlevel.h Sun Nov 12 21:56:19 2000 +*************** +*** 38,43 **** +--- 38,44 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + +Only in perl5.004_03: patchlevel.h.orig diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_04 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_04 new file mode 100644 index 0000000..a227dc7 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_04 @@ -0,0 +1,209 @@ +diff -rc perl5.004_04.orig/Configure perl5.004_04/Configure +*** perl5.004_04.orig/Configure Fri Oct 3 18:57:39 1997 +--- perl5.004_04/Configure Sun Nov 12 21:50:51 2000 +*************** +*** 188,193 **** +--- 188,194 ---- + mv='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 9910,9915 **** +--- 9911,9924 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 10378,10383 **** +--- 10387,10393 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.004_04.orig/Makefile.SH perl5.004_04/Makefile.SH +*** perl5.004_04.orig/Makefile.SH Wed Oct 15 10:33:16 1997 +--- perl5.004_04/Makefile.SH Sun Nov 12 21:50:51 2000 +*************** +*** 129,135 **** + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 129,135 ---- + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.004_04.orig/lib/ExtUtils/Embed.pm perl5.004_04/lib/ExtUtils/Embed.pm +*** perl5.004_04.orig/lib/ExtUtils/Embed.pm Fri Aug 1 15:08:44 1997 +--- perl5.004_04/lib/ExtUtils/Embed.pm Sun Nov 12 21:50:51 2000 +*************** +*** 178,184 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 178,184 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.004_04.orig/lib/ExtUtils/Liblist.pm perl5.004_04/lib/ExtUtils/Liblist.pm +*** perl5.004_04.orig/lib/ExtUtils/Liblist.pm Tue Sep 9 17:41:32 1997 +--- perl5.004_04/lib/ExtUtils/Liblist.pm Sun Nov 12 21:51:33 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 189,195 **** + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +--- 189,195 ---- + return ("", "", "", "") unless $potential_libs; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my($libpth) = $Config{'libpth'}; + my($libext) = $Config{'lib_ext'} || ".lib"; + +*************** +*** 539,545 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 539,545 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +diff -rc perl5.004_04.orig/lib/ExtUtils/MM_Unix.pm perl5.004_04/lib/ExtUtils/MM_Unix.pm +*** perl5.004_04.orig/lib/ExtUtils/MM_Unix.pm Wed Oct 8 14:13:51 1997 +--- perl5.004_04/lib/ExtUtils/MM_Unix.pm Sun Nov 12 21:50:51 2000 +*************** +*** 2229,2235 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2229,2235 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -rc perl5.004_04.orig/myconfig perl5.004_04/myconfig +*** perl5.004_04.orig/myconfig Mon Oct 6 18:26:49 1997 +--- perl5.004_04/myconfig Sun Nov 12 21:50:51 2000 +*************** +*** 35,41 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +--- 35,41 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +diff -rc perl5.004_04.orig/patchlevel.h perl5.004_04/patchlevel.h +*** perl5.004_04.orig/patchlevel.h Wed Oct 15 10:55:19 1997 +--- perl5.004_04/patchlevel.h Sun Nov 12 21:50:51 2000 +*************** +*** 39,44 **** +--- 39,45 ---- + /* The following line and terminating '};' are read by perlbug.PL. Don't alter. */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_05 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_05 new file mode 100644 index 0000000..51c8bf3 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.004_05 @@ -0,0 +1,209 @@ +diff -rc perl5.004_05.orig/Configure perl5.004_05/Configure +*** perl5.004_05.orig/Configure Thu Jan 6 22:05:49 2000 +--- perl5.004_05/Configure Sun Nov 12 21:36:25 2000 +*************** +*** 188,193 **** +--- 188,194 ---- + mv='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 10164,10169 **** +--- 10165,10178 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 10648,10653 **** +--- 10657,10663 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.004_05.orig/Makefile.SH perl5.004_05/Makefile.SH +*** perl5.004_05.orig/Makefile.SH Thu Jan 6 22:05:49 2000 +--- perl5.004_05/Makefile.SH Sun Nov 12 21:36:25 2000 +*************** +*** 151,157 **** + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 151,157 ---- + ext = \$(dynamic_ext) \$(static_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.004_05.orig/lib/ExtUtils/Embed.pm perl5.004_05/lib/ExtUtils/Embed.pm +*** perl5.004_05.orig/lib/ExtUtils/Embed.pm Fri Aug 1 15:08:44 1997 +--- perl5.004_05/lib/ExtUtils/Embed.pm Sun Nov 12 21:36:25 2000 +*************** +*** 178,184 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 178,184 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.004_05.orig/lib/ExtUtils/Liblist.pm perl5.004_05/lib/ExtUtils/Liblist.pm +*** perl5.004_05.orig/lib/ExtUtils/Liblist.pm Thu Jan 6 22:05:54 2000 +--- perl5.004_05/lib/ExtUtils/Liblist.pm Sun Nov 12 21:45:31 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 196,202 **** + my $BC = 1 if $cc =~ /^bcc/i; + my $GC = 1 if $cc =~ /^gcc/i; + my $so = $Config{'so'}; +! my $libs = $Config{'libs'}; + my $libpth = $Config{'libpth'}; + my $libext = $Config{'lib_ext'} || ".lib"; + +--- 196,202 ---- + my $BC = 1 if $cc =~ /^bcc/i; + my $GC = 1 if $cc =~ /^gcc/i; + my $so = $Config{'so'}; +! my $libs = $Config{'perllibs'}; + my $libpth = $Config{'libpth'}; + my $libext = $Config{'lib_ext'} || ".lib"; + +*************** +*** 590,596 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 590,596 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +diff -rc perl5.004_05.orig/lib/ExtUtils/MM_Unix.pm perl5.004_05/lib/ExtUtils/MM_Unix.pm +*** perl5.004_05.orig/lib/ExtUtils/MM_Unix.pm Thu Jan 6 22:05:54 2000 +--- perl5.004_05/lib/ExtUtils/MM_Unix.pm Sun Nov 12 21:36:25 2000 +*************** +*** 2246,2252 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2246,2252 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -rc perl5.004_05.orig/myconfig perl5.004_05/myconfig +*** perl5.004_05.orig/myconfig Thu Jan 6 22:05:55 2000 +--- perl5.004_05/myconfig Sun Nov 12 21:43:54 2000 +*************** +*** 34,40 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +--- 34,40 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so + useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: +diff -rc perl5.004_05.orig/patchlevel.h perl5.004_05/patchlevel.h +*** perl5.004_05.orig/patchlevel.h Thu Jan 6 22:05:48 2000 +--- perl5.004_05/patchlevel.h Sun Nov 12 21:36:25 2000 +*************** +*** 39,44 **** +--- 39,45 ---- + /* The following line and terminating '};' are read by perlbug.PL. Don't alter. */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005 new file mode 100644 index 0000000..effee3e --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005 @@ -0,0 +1,209 @@ +diff -rc perl5.005.orig/Configure perl5.005/Configure +*** perl5.005.orig/Configure Wed Jul 15 08:05:44 1998 +--- perl5.005/Configure Sun Nov 12 21:30:40 2000 +*************** +*** 234,239 **** +--- 234,240 ---- + nm='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 11279,11284 **** +--- 11280,11293 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 11804,11809 **** +--- 11813,11819 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.005.orig/Makefile.SH perl5.005/Makefile.SH +*** perl5.005.orig/Makefile.SH Sun Jul 19 08:06:35 1998 +--- perl5.005/Makefile.SH Sun Nov 12 21:30:40 2000 +*************** +*** 150,156 **** + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 150,156 ---- + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.005.orig/lib/ExtUtils/Embed.pm perl5.005/lib/ExtUtils/Embed.pm +*** perl5.005.orig/lib/ExtUtils/Embed.pm Wed Jul 22 07:45:02 1998 +--- perl5.005/lib/ExtUtils/Embed.pm Sun Nov 12 21:30:40 2000 +*************** +*** 194,200 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 194,200 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.005.orig/lib/ExtUtils/Liblist.pm perl5.005/lib/ExtUtils/Liblist.pm +*** perl5.005.orig/lib/ExtUtils/Liblist.pm Wed Jul 22 07:09:42 1998 +--- perl5.005/lib/ExtUtils/Liblist.pm Sun Nov 12 21:30:40 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 290,296 **** + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +--- 290,296 ---- + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +*************** +*** 598,604 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 598,604 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +diff -rc perl5.005.orig/lib/ExtUtils/MM_Unix.pm perl5.005/lib/ExtUtils/MM_Unix.pm +*** perl5.005.orig/lib/ExtUtils/MM_Unix.pm Tue Jul 14 04:39:12 1998 +--- perl5.005/lib/ExtUtils/MM_Unix.pm Sun Nov 12 21:30:41 2000 +*************** +*** 2281,2287 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2281,2287 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -rc perl5.005.orig/myconfig perl5.005/myconfig +*** perl5.005.orig/myconfig Fri Apr 3 01:20:35 1998 +--- perl5.005/myconfig Sun Nov 12 21:30:41 2000 +*************** +*** 34,40 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +--- 34,40 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +diff -rc perl5.005.orig/patchlevel.h perl5.005/patchlevel.h +*** perl5.005.orig/patchlevel.h Wed Jul 22 19:22:01 1998 +--- perl5.005/patchlevel.h Sun Nov 12 21:30:41 2000 +*************** +*** 39,44 **** +--- 39,45 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_01 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_01 new file mode 100644 index 0000000..2a05dd5 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_01 @@ -0,0 +1,209 @@ +diff -rc perl5.005_01.orig/Configure perl5.005_01/Configure +*** perl5.005_01.orig/Configure Wed Jul 15 08:05:44 1998 +--- perl5.005_01/Configure Sun Nov 12 20:55:58 2000 +*************** +*** 234,239 **** +--- 234,240 ---- + nm='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 11279,11284 **** +--- 11280,11293 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 11804,11809 **** +--- 11813,11819 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.005_01.orig/Makefile.SH perl5.005_01/Makefile.SH +*** perl5.005_01.orig/Makefile.SH Sun Jul 19 08:06:35 1998 +--- perl5.005_01/Makefile.SH Sun Nov 12 20:55:58 2000 +*************** +*** 150,156 **** + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 150,156 ---- + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.005_01.orig/lib/ExtUtils/Embed.pm perl5.005_01/lib/ExtUtils/Embed.pm +*** perl5.005_01.orig/lib/ExtUtils/Embed.pm Wed Jul 22 07:45:02 1998 +--- perl5.005_01/lib/ExtUtils/Embed.pm Sun Nov 12 20:55:58 2000 +*************** +*** 194,200 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 194,200 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.005_01.orig/lib/ExtUtils/Liblist.pm perl5.005_01/lib/ExtUtils/Liblist.pm +*** perl5.005_01.orig/lib/ExtUtils/Liblist.pm Wed Jul 22 07:09:42 1998 +--- perl5.005_01/lib/ExtUtils/Liblist.pm Sun Nov 12 20:55:58 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 290,296 **** + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +--- 290,296 ---- + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +*************** +*** 598,604 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 598,604 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +diff -rc perl5.005_01.orig/lib/ExtUtils/MM_Unix.pm perl5.005_01/lib/ExtUtils/MM_Unix.pm +*** perl5.005_01.orig/lib/ExtUtils/MM_Unix.pm Tue Jul 14 04:39:12 1998 +--- perl5.005_01/lib/ExtUtils/MM_Unix.pm Sun Nov 12 20:55:58 2000 +*************** +*** 2281,2287 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2281,2287 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -rc perl5.005_01.orig/myconfig perl5.005_01/myconfig +*** perl5.005_01.orig/myconfig Fri Apr 3 01:20:35 1998 +--- perl5.005_01/myconfig Sun Nov 12 20:55:58 2000 +*************** +*** 34,40 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +--- 34,40 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +diff -rc perl5.005_01.orig/patchlevel.h perl5.005_01/patchlevel.h +*** perl5.005_01.orig/patchlevel.h Mon Jan 3 11:07:45 2000 +--- perl5.005_01/patchlevel.h Sun Nov 12 20:55:58 2000 +*************** +*** 39,44 **** +--- 39,45 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_02 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_02 new file mode 100644 index 0000000..5dd57dd --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_02 @@ -0,0 +1,264 @@ +diff -rc perl5.005_02.orig/Configure perl5.005_02/Configure +*** perl5.005_02.orig/Configure Mon Jan 3 11:12:20 2000 +--- perl5.005_02/Configure Sun Nov 12 20:50:51 2000 +*************** +*** 234,239 **** +--- 234,240 ---- + nm='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 11334,11339 **** +--- 11335,11348 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 11859,11864 **** +--- 11868,11874 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +Only in perl5.005_02: Configure.orig +diff -rc perl5.005_02.orig/Makefile.SH perl5.005_02/Makefile.SH +*** perl5.005_02.orig/Makefile.SH Sun Jul 19 08:06:35 1998 +--- perl5.005_02/Makefile.SH Sun Nov 12 20:50:51 2000 +*************** +*** 150,156 **** + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 150,156 ---- + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +Only in perl5.005_02: Makefile.SH.orig +diff -rc perl5.005_02.orig/lib/ExtUtils/Embed.pm perl5.005_02/lib/ExtUtils/Embed.pm +*** perl5.005_02.orig/lib/ExtUtils/Embed.pm Wed Jul 22 07:45:02 1998 +--- perl5.005_02/lib/ExtUtils/Embed.pm Sun Nov 12 20:50:51 2000 +*************** +*** 194,200 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 194,200 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.005_02.orig/lib/ExtUtils/Liblist.pm perl5.005_02/lib/ExtUtils/Liblist.pm +*** perl5.005_02.orig/lib/ExtUtils/Liblist.pm Mon Jan 3 11:12:21 2000 +--- perl5.005_02/lib/ExtUtils/Liblist.pm Sun Nov 12 20:50:51 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 196,202 **** + my $BC = 1 if $cc =~ /^bcc/i; + my $GC = 1 if $cc =~ /^gcc/i; + my $so = $Config{'so'}; +! my $libs = $Config{'libs'}; + my $libpth = $Config{'libpth'}; + my $libext = $Config{'lib_ext'} || ".lib"; + +--- 196,202 ---- + my $BC = 1 if $cc =~ /^bcc/i; + my $GC = 1 if $cc =~ /^gcc/i; + my $so = $Config{'so'}; +! my $libs = $Config{'perllibs'}; + my $libpth = $Config{'libpth'}; + my $libext = $Config{'lib_ext'} || ".lib"; + +*************** +*** 333,339 **** + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +--- 333,339 ---- + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +*************** +*** 623,629 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +--- 623,629 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs> + as well as in C<$Config{libpth}>. For each library that is found, a +*************** +*** 666,672 **** + alphanumeric characters are treated as flags. Unknown flags will be ignored. + + An entry that matches C disables the appending of default +! libraries found in C<$Config{libs}> (this should be only needed very rarely). + + An entry that matches C disables all searching for + the libraries specified after it. Translation of C<-Lfoo> and +--- 666,672 ---- + alphanumeric characters are treated as flags. Unknown flags will be ignored. + + An entry that matches C disables the appending of default +! libraries found in C<$Config{perllibs}> (this should be only needed very rarely). + + An entry that matches C disables all searching for + the libraries specified after it. Translation of C<-Lfoo> and +*************** +*** 676,682 **** + + An entry that matches C reenables searching for + the libraries specified after it. You can put it at the end to +! enable searching for default libraries specified by C<$Config{libs}>. + + =item * + +--- 676,682 ---- + + An entry that matches C reenables searching for + the libraries specified after it. You can put it at the end to +! enable searching for default libraries specified by C<$Config{perllibs}>. + + =item * + +Only in perl5.005_02/lib/ExtUtils: Liblist.pm.orig +diff -rc perl5.005_02.orig/lib/ExtUtils/MM_Unix.pm perl5.005_02/lib/ExtUtils/MM_Unix.pm +*** perl5.005_02.orig/lib/ExtUtils/MM_Unix.pm Tue Jul 14 04:39:12 1998 +--- perl5.005_02/lib/ExtUtils/MM_Unix.pm Sun Nov 12 20:50:51 2000 +*************** +*** 2281,2287 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2281,2287 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +Only in perl5.005_02/lib/ExtUtils: MM_Unix.pm.orig +diff -rc perl5.005_02.orig/myconfig perl5.005_02/myconfig +*** perl5.005_02.orig/myconfig Fri Apr 3 01:20:35 1998 +--- perl5.005_02/myconfig Sun Nov 12 20:50:51 2000 +*************** +*** 34,40 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +--- 34,40 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +diff -rc perl5.005_02.orig/patchlevel.h perl5.005_02/patchlevel.h +*** perl5.005_02.orig/patchlevel.h Mon Jan 3 11:12:19 2000 +--- perl5.005_02/patchlevel.h Sun Nov 12 20:50:51 2000 +*************** +*** 40,45 **** +--- 40,46 ---- + */ + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_03 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_03 new file mode 100644 index 0000000..115f9f5 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.005_03 @@ -0,0 +1,250 @@ +diff -rc perl5.005_03.orig/Configure perl5.005_03/Configure +*** perl5.005_03.orig/Configure Sun Mar 28 17:12:57 1999 +--- perl5.005_03/Configure Sun Sep 17 22:19:16 2000 +*************** +*** 208,213 **** +--- 208,214 ---- + nm='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 11642,11647 **** +--- 11643,11656 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 12183,12188 **** +--- 12192,12198 ---- + patchlevel='$patchlevel' + path_sep='$path_sep' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -rc perl5.005_03.orig/Makefile.SH perl5.005_03/Makefile.SH +*** perl5.005_03.orig/Makefile.SH Thu Mar 4 02:35:25 1999 +--- perl5.005_03/Makefile.SH Sun Sep 17 22:21:01 2000 +*************** +*** 58,67 **** + shrpldflags="-H512 -T512 -bhalt:4 -bM:SRE -bE:perl.exp" + case "$osvers" in + 3*) +! shrpldflags="$shrpldflags -e _nostart $ldflags $libs $cryptlib" + ;; + *) +! shrpldflags="$shrpldflags -b noentry $ldflags $libs $cryptlib" + ;; + esac + aixinstdir=`pwd | sed 's/\/UU$//'` +--- 58,67 ---- + shrpldflags="-H512 -T512 -bhalt:4 -bM:SRE -bE:perl.exp" + case "$osvers" in + 3*) +! shrpldflags="$shrpldflags -e _nostart $ldflags $perllibs $cryptlib" + ;; + *) +! shrpldflags="$shrpldflags -b noentry $ldflags $perllibs $cryptlib" + ;; + esac + aixinstdir=`pwd | sed 's/\/UU$//'` +*************** +*** 155,161 **** + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 155,161 ---- + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +diff -rc perl5.005_03.orig/lib/ExtUtils/Embed.pm perl5.005_03/lib/ExtUtils/Embed.pm +*** perl5.005_03.orig/lib/ExtUtils/Embed.pm Wed Jan 6 02:17:50 1999 +--- perl5.005_03/lib/ExtUtils/Embed.pm Sun Sep 17 22:19:16 2000 +*************** +*** 194,200 **** + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{libs}) if defined $std; + + push(@mods, static_ext()) if $std; + +--- 194,200 ---- + @path = $path ? split(/:/, $path) : @INC; + + push(@potential_libs, @link_args) if scalar @link_args; +! push(@potential_libs, $Config{perllibs}) if defined $std; + + push(@mods, static_ext()) if $std; + +diff -rc perl5.005_03.orig/lib/ExtUtils/Liblist.pm perl5.005_03/lib/ExtUtils/Liblist.pm +*** perl5.005_03.orig/lib/ExtUtils/Liblist.pm Wed Jan 6 02:17:47 1999 +--- perl5.005_03/lib/ExtUtils/Liblist.pm Sun Sep 17 22:19:16 2000 +*************** +*** 16,33 **** + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{libs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{libs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'libs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +--- 16,33 ---- + + sub _unix_os2_ext { + my($self,$potential_libs, $verbose) = @_; +! if ($^O =~ 'os2' and $Config{perllibs}) { + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll again. + + $potential_libs .= " " if $potential_libs; +! $potential_libs .= $Config{perllibs}; + } + return ("", "", "", "") unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my($so) = $Config{'so'}; +! my($libs) = $Config{'perllibs'}; + my $Config_libext = $Config{lib_ext} || ".a"; + + +*************** +*** 196,202 **** + my $BC = 1 if $cc =~ /^bcc/i; + my $GC = 1 if $cc =~ /^gcc/i; + my $so = $Config{'so'}; +! my $libs = $Config{'libs'}; + my $libpth = $Config{'libpth'}; + my $libext = $Config{'lib_ext'} || ".lib"; + +--- 196,202 ---- + my $BC = 1 if $cc =~ /^bcc/i; + my $GC = 1 if $cc =~ /^gcc/i; + my $so = $Config{'so'}; +! my $libs = $Config{'perllibs'}; + my $libpth = $Config{'libpth'}; + my $libext = $Config{'lib_ext'} || ".lib"; + +*************** +*** 336,342 **** + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +--- 336,342 ---- + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +*************** +*** 626,632 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs>, + C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>. +--- 626,632 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs>, + C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>. +*************** +*** 670,676 **** + alphanumeric characters are treated as flags. Unknown flags will be ignored. + + An entry that matches C disables the appending of default +! libraries found in C<$Config{libs}> (this should be only needed very rarely). + + An entry that matches C disables all searching for + the libraries specified after it. Translation of C<-Lfoo> and +--- 670,676 ---- + alphanumeric characters are treated as flags. Unknown flags will be ignored. + + An entry that matches C disables the appending of default +! libraries found in C<$Config{perllibs}> (this should be only needed very rarely). + + An entry that matches C disables all searching for + the libraries specified after it. Translation of C<-Lfoo> and +*************** +*** 680,686 **** + + An entry that matches C reenables searching for + the libraries specified after it. You can put it at the end to +! enable searching for default libraries specified by C<$Config{libs}>. + + =item * + +--- 680,686 ---- + + An entry that matches C reenables searching for + the libraries specified after it. You can put it at the end to +! enable searching for default libraries specified by C<$Config{perllibs}>. + + =item * + +diff -rc perl5.005_03.orig/lib/ExtUtils/MM_Unix.pm perl5.005_03/lib/ExtUtils/MM_Unix.pm +*** perl5.005_03.orig/lib/ExtUtils/MM_Unix.pm Fri Mar 5 00:34:20 1999 +--- perl5.005_03/lib/ExtUtils/MM_Unix.pm Sun Sep 17 22:19:16 2000 +*************** +*** 2284,2290 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2284,2290 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { diff --git a/fastSum/resources/ROUGE/DB_File-1.835/patches/5.6.0 b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.6.0 new file mode 100644 index 0000000..1f9b3b6 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/patches/5.6.0 @@ -0,0 +1,294 @@ +diff -cr perl-5.6.0.orig/Configure perl-5.6.0/Configure +*** perl-5.6.0.orig/Configure Wed Mar 22 20:36:37 2000 +--- perl-5.6.0/Configure Sun Sep 17 23:40:15 2000 +*************** +*** 217,222 **** +--- 217,223 ---- + nm='' + nroff='' + perl='' ++ perllibs='' + pg='' + pmake='' + pr='' +*************** +*** 14971,14976 **** +--- 14972,14985 ---- + shift + extensions="$*" + ++ : Remove libraries needed only for extensions ++ : The appropriate ext/Foo/Makefile.PL will add them back in, if ++ : necessary. ++ set X `echo " $libs " | ++ sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` ++ shift ++ perllibs="$*" ++ + : Remove build directory name from cppstdin so it can be used from + : either the present location or the final installed location. + echo " " +*************** +*** 15640,15645 **** +--- 15649,15655 ---- + path_sep='$path_sep' + perl5='$perl5' + perl='$perl' ++ perllibs='$perllibs' + perladmin='$perladmin' + perlpath='$perlpath' + pg='$pg' +diff -cr perl-5.6.0.orig/Makefile.SH perl-5.6.0/Makefile.SH +*** perl-5.6.0.orig/Makefile.SH Sat Mar 11 16:05:24 2000 +--- perl-5.6.0/Makefile.SH Sun Sep 17 23:40:15 2000 +*************** +*** 70,76 **** + *) shrpldflags="$shrpldflags -b noentry" + ;; + esac +! shrpldflags="$shrpldflags $ldflags $libs $cryptlib" + linklibperl="-L $archlibexp/CORE -L `pwd | sed 's/\/UU$//'` -lperl" + ;; + hpux*) +--- 70,76 ---- + *) shrpldflags="$shrpldflags -b noentry" + ;; + esac +! shrpldflags="$shrpldflags $ldflags $perllibs $cryptlib" + linklibperl="-L $archlibexp/CORE -L `pwd | sed 's/\/UU$//'` -lperl" + ;; + hpux*) +*************** +*** 176,182 **** + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $libs $cryptlib + + public = perl $suidperl utilities translators + +--- 176,182 ---- + ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext) + DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT) + +! libs = $perllibs $cryptlib + + public = perl $suidperl utilities translators + +*************** +*** 333,339 **** + case "$osname" in + aix) + $spitshell >>Makefile <>Makefile <{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +--- 338,344 ---- + $self->{CCFLAS} || $Config{'ccflags'}; + @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '') + . 'PerlShr/Share' ); +! push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and +*************** +*** 624,630 **** + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs>, + C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>. +--- 624,630 ---- + =item * + + If C<$potential_libs> is empty, the return value will be empty. +! Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm) + will be appended to the list of C<$potential_libs>. The libraries + will be searched for in the directories specified in C<$potential_libs>, + C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>. +*************** +*** 668,674 **** + alphanumeric characters are treated as flags. Unknown flags will be ignored. + + An entry that matches C disables the appending of default +! libraries found in C<$Config{libs}> (this should be only needed very rarely). + + An entry that matches C disables all searching for + the libraries specified after it. Translation of C<-Lfoo> and +--- 668,674 ---- + alphanumeric characters are treated as flags. Unknown flags will be ignored. + + An entry that matches C disables the appending of default +! libraries found in C<$Config{perllibs}> (this should be only needed very rarely). + + An entry that matches C disables all searching for + the libraries specified after it. Translation of C<-Lfoo> and +*************** +*** 678,684 **** + + An entry that matches C reenables searching for + the libraries specified after it. You can put it at the end to +! enable searching for default libraries specified by C<$Config{libs}>. + + =item * + +--- 678,684 ---- + + An entry that matches C reenables searching for + the libraries specified after it. You can put it at the end to +! enable searching for default libraries specified by C<$Config{perllibs}>. + + =item * + +diff -cr perl-5.6.0.orig/lib/ExtUtils/MM_Unix.pm perl-5.6.0/lib/ExtUtils/MM_Unix.pm +*** perl-5.6.0.orig/lib/ExtUtils/MM_Unix.pm Thu Mar 2 17:52:52 2000 +--- perl-5.6.0/lib/ExtUtils/MM_Unix.pm Sun Sep 17 23:40:15 2000 +*************** +*** 2450,2456 **** + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +--- 2450,2456 ---- + MAP_STATIC = ", + join(" \\\n\t", reverse sort keys %static), " + +! MAP_PRELIBS = $Config::Config{perllibs} $Config::Config{cryptlib} + "; + + if (defined $libperl) { +diff -cr perl-5.6.0.orig/myconfig.SH perl-5.6.0/myconfig.SH +*** perl-5.6.0.orig/myconfig.SH Sat Feb 26 06:34:49 2000 +--- perl-5.6.0/myconfig.SH Sun Sep 17 23:41:17 2000 +*************** +*** 48,54 **** + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$libs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +--- 48,54 ---- + Linker and Libraries: + ld='$ld', ldflags ='$ldflags' + libpth=$libpth +! libs=$perllibs + libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl + Dynamic Linking: + dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' +diff -cr perl-5.6.0.orig/patchlevel.h perl-5.6.0/patchlevel.h +*** perl-5.6.0.orig/patchlevel.h Wed Mar 22 20:23:11 2000 +--- perl-5.6.0/patchlevel.h Sun Sep 17 23:40:15 2000 +*************** +*** 70,75 **** +--- 70,76 ---- + #if !defined(PERL_PATCHLEVEL_H_IMPLICIT) && !defined(LOCAL_PATCH_COUNT) + static char *local_patches[] = { + NULL ++ ,"NODB-1.0 - remove -ldb from core perl binary." + ,NULL + }; + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/pm_to_blib b/fastSum/resources/ROUGE/DB_File-1.835/pm_to_blib new file mode 100644 index 0000000..e69de29 diff --git a/fastSum/resources/ROUGE/DB_File-1.835/ppport.h b/fastSum/resources/ROUGE/DB_File-1.835/ppport.h new file mode 100644 index 0000000..8a68d2e --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/ppport.h @@ -0,0 +1,7667 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.25 + + Automatically created by Devel::PPPort running under perl 5.010000. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.25 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --version show version + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.20. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --version + +Display the version of F. + +=head2 --patch=I + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. Note that this does not +automagially add a dot between the original filename and the +suffix. If you want the dot, you have to include it in the option +argument. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C or a C program to be installed. + +=head2 --diff=I + +Manually set the diff program and options to use. The default +is to use C, when installed, and output unified +context diffs. + +=head2 --compat-version=I + +Tell F to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. Warnings will still be displayed. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F. +This reduces the size of F dramatically and may be useful +if you want to include F in smaller modules without +increasing their distribution size too much. + +The stripped F will have a C<--unstrip> option that allows +you to undo the stripping, but only if an appropriate C +module is installed. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints or warnings for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I + +Show portability information for API elements matching I. +If I is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C prefix is deprecated. Also, +some API functions used to have a C prefix. Using this form is +also deprecated. You can safely use the supported API, as F +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F. + +These functions or variables will be marked C in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C or global +variants. + +For a C function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + caller_cx() NEED_caller_cx NEED_caller_cx_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + load_module() NEED_load_module NEED_load_module_GLOBAL + mg_findext() NEED_mg_findext NEED_mg_findext_GLOBAL + my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL + my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL + my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL + my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL + newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL + newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL + pv_display() NEED_pv_display NEED_pv_display_GLOBAL + pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL + pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL + sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + sv_unmagicext() NEED_sv_unmagicext NEED_sv_unmagicext_GLOBAL + vload_module() NEED_vload_module NEED_vload_module_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + warner() NEED_warner NEED_warner_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C +macro. Just C<#define> the macro before including C: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C. + +=back + +The good thing is that most of the above can be checked by running +F on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +If you want to create patched copies of your files instead, use: + + perl ppport.h --copy=.new + +To display portability information for the C function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F is causing failure during +the compilation of this module, please check if newer versions +of either this module or C are available on CPAN +before sending a bug report. + +If F was generated using the latest version of +C and is causing failure of this module, please +file a bug report here: L + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L. + +=cut + +use strict; + +# Disable broken TRIE-optimization +BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } + +my $VERSION = 3.25; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, + version => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +# Never use C comments in this file! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip version + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +if ($opt{version}) { + print "This is $0 $VERSION.\n"; + exit 0; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +AvFILLp|5.004050||p +AvFILL||| +BhkDISABLE||5.019003| +BhkENABLE||5.019003| +BhkENTRY_set||5.019003| +BhkENTRY||| +BhkFLAGS||| +CALL_BLOCK_HOOKS||| +CLASS|||n +CPERLscope|5.005000||p +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002|5.004050|p +Copy||5.004050| +CvPADLIST||5.008001| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV_set|5.010001||p +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_METHOD|5.006001||p +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvAV||| +GvCV||| +GvHV||| +GvSVn|5.009003||p +GvSV||| +Gv_AMupdate||5.011000| +HEf_SVKEY|5.004000|5.004000|p +HeHASH||5.004000| +HeKEY||5.004000| +HeKLEN||5.004000| +HePV||5.004000| +HeSVKEY_force||5.004000| +HeSVKEY_set||5.004000| +HeSVKEY||5.004000| +HeUTF8|5.010001|5.010001|p +HeVAL||5.004000| +HvENAMELEN||5.015004| +HvENAMEUTF8||5.015004| +HvENAME||5.013007| +HvNAMELEN_get|5.009003||p +HvNAMELEN||5.015004| +HvNAMEUTF8||5.015004| +HvNAME_get|5.009003||p +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LINKLIST||5.013006| +LVRET||| +MARK||| +MULTICALL||5.019003| +MUTABLE_PTR|||p +MUTABLE_SV|||p +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002|5.004050|p +Move||5.004050| +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +OP_CLASS||5.013007| +OP_DESC||5.007003| +OP_NAME||5.007003| +ORIGMARK||| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERLIO_FUNCS_CAST|5.009003||p +PERLIO_FUNCS_DECL|5.009003||p +PERL_ABS|5.008001||p +PERL_BCDVERSION|5.019002||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_HASH|5.004000||p +PERL_INT_MAX|5.004000||p +PERL_INT_MIN|5.004000||p +PERL_LONG_MAX|5.004000||p +PERL_LONG_MIN|5.004000||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.019002||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.019002||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.019002||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.019002||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_PV_ESCAPE_ALL|5.009004||p +PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p +PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p +PERL_PV_ESCAPE_NOCLEAR|5.009004||p +PERL_PV_ESCAPE_QUOTE|5.009004||p +PERL_PV_ESCAPE_RE|5.009005||p +PERL_PV_ESCAPE_UNI_DETECT|5.009004||p +PERL_PV_ESCAPE_UNI|5.009004||p +PERL_PV_PRETTY_DUMP|5.009004||p +PERL_PV_PRETTY_ELLIPSES|5.010000||p +PERL_PV_PRETTY_LTGT|5.009004||p +PERL_PV_PRETTY_NOCLEAR|5.010000||p +PERL_PV_PRETTY_QUOTE|5.009004||p +PERL_PV_PRETTY_REGPROP|5.009004||p +PERL_QUAD_MAX|5.004000||p +PERL_QUAD_MIN|5.004000||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.004000||p +PERL_SHORT_MIN|5.004000||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_SYS_INIT3||5.010000| +PERL_SYS_INIT||5.010000| +PERL_SYS_TERM||5.019003| +PERL_UCHAR_MAX|5.004000||p +PERL_UCHAR_MIN|5.004000||p +PERL_UINT_MAX|5.004000||p +PERL_UINT_MIN|5.004000||p +PERL_ULONG_MAX|5.004000||p +PERL_ULONG_MIN|5.004000||p +PERL_UNUSED_ARG|5.009003||p +PERL_UNUSED_CONTEXT|5.009004||p +PERL_UNUSED_DECL|5.007002||p +PERL_UNUSED_VAR|5.007002||p +PERL_UQUAD_MAX|5.004000||p +PERL_UQUAD_MIN|5.004000||p +PERL_USE_GCC_BRACE_GROUPS|5.009004||p +PERL_USHORT_MAX|5.004000||p +PERL_USHORT_MIN|5.004000||p +PERL_VERSION|5.006000||p +PL_DBsignal|5.005000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||pn +PL_Sv|5.005000||p +PL_bufend|5.019002||p +PL_bufptr|5.019002||p +PL_check||5.006000| +PL_compiling|5.004050||p +PL_comppad_name||5.017004| +PL_comppad||5.008001| +PL_copline|5.019002||p +PL_curcop|5.004050||p +PL_curpad||5.005000| +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_error_count|5.019002||p +PL_expect|5.019002||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_in_my_stash|5.019002||p +PL_in_my|5.019002||p +PL_keyword_plugin||5.011002| +PL_last_in_gv|||n +PL_laststatval|5.005000||p +PL_lex_state|5.019002||p +PL_lex_stuff|5.019002||p +PL_linestr|5.019002||p +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofsgv|||n +PL_opfreehook||5.011000|n +PL_parser|5.009005|5.009005|p +PL_peepp||5.007003|n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rpeepp||5.013005|n +PL_rsfp_filters|5.019002||p +PL_rsfp|5.019002||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_statcache|5.005000||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +PL_tokenbuf|5.019002||p +POP_MULTICALL||5.019003| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2nat|5.009003||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.019003| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PadARRAY||5.019003| +PadMAX||5.019003| +PadlistARRAY||5.019003| +PadlistMAX||5.019003| +PadlistNAMESARRAY||5.019003| +PadlistNAMESMAX||5.019003| +PadlistNAMES||5.019003| +PadlistREFCNT||5.017004| +PadnameIsOUR||| +PadnameIsSTATE||| +PadnameLEN||5.019003| +PadnameOURSTASH||| +PadnameOUTER||| +PadnamePV||5.019003| +PadnameSV||5.019003| +PadnameTYPE||| +PadnameUTF8||5.019003| +PadnamelistARRAY||5.019003| +PadnamelistMAX||5.019003| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_context_layers||5.009004| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Perl_signbit||5.009005|n +PoisonFree|5.009004||p +PoisonNew|5.009004||p +PoisonWith|5.009004||p +Poison|5.008000||p +READ_XDIGIT||5.017006| +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +STR_WITH_LEN|5.009003||p +ST||| +SV_CONST_RETURN|5.009003||p +SV_COW_DROP_PV|5.008001||p +SV_COW_SHARED_HASH_KEYS|5.009005||p +SV_GMAGIC|5.007002||p +SV_HAS_TRAILING_NUL|5.009004||p +SV_IMMEDIATE_UNREF|5.007001||p +SV_MUTABLE_RETURN|5.009003||p +SV_NOSTEAL|5.009002||p +SV_SMAGIC|5.009003||p +SV_UTF8_NO_ENCODING|5.008001||p +SVfARG|5.009005||p +SVf_UTF8|5.006000||p +SVf|5.006000||p +SVt_INVLIST||5.019002| +SVt_IV||| +SVt_NULL||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVFM||| +SVt_PVGV||| +SVt_PVHV||| +SVt_PVIO||| +SVt_PVIV||| +SVt_PVLV||| +SVt_PVMG||| +SVt_PVNV||| +SVt_PV||| +SVt_REGEXP||5.011000| +Safefree||| +Slab_Alloc||| +Slab_Free||| +Slab_to_ro||| +Slab_to_rw||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGAMAGIC||5.006001| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_nomg||5.013002| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK_offset||5.011000| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_const|5.009003||p +SvPV_flags_const_nolen|5.009003||p +SvPV_flags_const|5.009003||p +SvPV_flags_mutable|5.009003||p +SvPV_flags|5.007002||p +SvPV_force_flags_mutable|5.009003||p +SvPV_force_flags_nolen|5.009003||p +SvPV_force_flags|5.007002||p +SvPV_force_mutable|5.009003||p +SvPV_force_nolen|5.009003||p +SvPV_force_nomg_nolen|5.009003||p +SvPV_force_nomg|5.007002||p +SvPV_force|||p +SvPV_mutable|5.009003||p +SvPV_nolen_const|5.009003||p +SvPV_nolen|5.006000||p +SvPV_nomg_const_nolen|5.009003||p +SvPV_nomg_const|5.009003||p +SvPV_nomg_nolen|5.013007||p +SvPV_nomg|5.007002||p +SvPV_renew|5.009003||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec_NN||5.017007| +SvREFCNT_dec||| +SvREFCNT_inc_NN|5.009004||p +SvREFCNT_inc_simple_NN|5.009004||p +SvREFCNT_inc_simple_void_NN|5.009004||p +SvREFCNT_inc_simple_void|5.009004||p +SvREFCNT_inc_simple|5.009004||p +SvREFCNT_inc_void_NN|5.009004||p +SvREFCNT_inc_void|5.009004||p +SvREFCNT_inc|||p +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvRXOK||5.009005| +SvRX||5.009005| +SvSETMAGIC||| +SvSHARED_HASH|5.009003||p +SvSHARE||5.007003| +SvSTASH_set|5.009003||p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTHINKFIRST||| +SvTRUE_nomg||5.013006| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK|5.007001|5.006000|p +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +SvVSTRING_mg|5.009004||p +THIS|||n +UNDERBAR|5.009002||p +UTF8_MAXBYTES|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +WARN_ALL|5.006000||p +WARN_AMBIGUOUS|5.006000||p +WARN_ASSERTIONS|5.019002||p +WARN_BAREWORD|5.006000||p +WARN_CLOSED|5.006000||p +WARN_CLOSURE|5.006000||p +WARN_DEBUGGING|5.006000||p +WARN_DEPRECATED|5.006000||p +WARN_DIGIT|5.006000||p +WARN_EXEC|5.006000||p +WARN_EXITING|5.006000||p +WARN_GLOB|5.006000||p +WARN_INPLACE|5.006000||p +WARN_INTERNAL|5.006000||p +WARN_IO|5.006000||p +WARN_LAYER|5.008000||p +WARN_MALLOC|5.006000||p +WARN_MISC|5.006000||p +WARN_NEWLINE|5.006000||p +WARN_NUMERIC|5.006000||p +WARN_ONCE|5.006000||p +WARN_OVERFLOW|5.006000||p +WARN_PACK|5.006000||p +WARN_PARENTHESIS|5.006000||p +WARN_PIPE|5.006000||p +WARN_PORTABLE|5.006000||p +WARN_PRECEDENCE|5.006000||p +WARN_PRINTF|5.006000||p +WARN_PROTOTYPE|5.006000||p +WARN_QW|5.006000||p +WARN_RECURSION|5.006000||p +WARN_REDEFINE|5.006000||p +WARN_REGEXP|5.006000||p +WARN_RESERVED|5.006000||p +WARN_SEMICOLON|5.006000||p +WARN_SEVERE|5.006000||p +WARN_SIGNAL|5.006000||p +WARN_SUBSTR|5.006000||p +WARN_SYNTAX|5.006000||p +WARN_TAINT|5.006000||p +WARN_THREADS|5.008000||p +WARN_UNINITIALIZED|5.006000||p +WARN_UNOPENED|5.006000||p +WARN_UNPACK|5.006000||p +WARN_UNTIE|5.006000||p +WARN_UTF8|5.006000||p +WARN_VOID|5.006000||p +WIDEST_UTYPE|5.015004||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002|5.007001|p +XCPT_TRY_END|5.009002|5.004000|p +XCPT_TRY_START|5.009002|5.004000|p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSPROTO|5.010000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_APIVERSION_BOOTCHECK||5.013004| +XS_EXTERNAL||5.019003| +XS_INTERNAL||5.019003| +XS_VERSION_BOOTCHECK||| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +XopDISABLE||5.019003| +XopENABLE||5.019003| +XopENTRY_set||5.019003| +XopENTRY||5.019003| +XopFLAGS||5.013007| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_add_range_to_invlist||| +_append_range_to_invlist||| +_core_swash_init||| +_get_swash_invlist||| +_invlist_array_init||| +_invlist_contains_cp||| +_invlist_contents||| +_invlist_dump||| +_invlist_intersection_maybe_complement_2nd||| +_invlist_intersection||| +_invlist_invert_prop||| +_invlist_invert||| +_invlist_len||| +_invlist_populate_swatch||| +_invlist_search||| +_invlist_subtract||| +_invlist_union_maybe_complement_2nd||| +_invlist_union||| +_is_uni_FOO||5.017008| +_is_uni_perl_idcont||5.017008| +_is_uni_perl_idstart||5.017007| +_is_utf8_FOO||5.017008| +_is_utf8_mark||5.017008| +_is_utf8_perl_idcont||5.017008| +_is_utf8_perl_idstart||5.017007| +_new_invlist_C_array||| +_new_invlist||| +_pMY_CXT|5.007003||p +_swash_inversion_hash||| +_swash_to_invlist||| +_to_fold_latin1||| +_to_uni_fold_flags||5.013011| +_to_upper_title_latin1||| +_to_utf8_fold_flags||5.015006| +_to_utf8_lower_flags||5.015006| +_to_utf8_title_flags||5.015006| +_to_utf8_upper_flags||5.015006| +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHXR_|5.019002||p +aTHXR|5.019002||p +aTHX_|5.006000||p +aTHX|5.006000||p +aassign_common_vars||| +add_cp_to_invlist||| +add_data|||n +add_utf16_textfilter||| +addmad||| +adjust_size_and_find_bucket|||n +adjust_stack_on_leave||| +alloc_maybe_populate_EXACT||| +alloccopstash||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_deref_call||5.013007| +amagic_i_ncmp||| +amagic_is_enabled||| +amagic_ncmp||| +anonymise_cv_maybe||| +any_dup||| +ao||| +append_madprops||| +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +assert_uft8_cache_coherent||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_create_and_push||5.009005| +av_create_and_unshift_one||5.009005| +av_delete||5.006000| +av_exists||5.006000| +av_extend_guts||| +av_extend||| +av_fetch||| +av_fill||| +av_iter_p||5.011000| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_tindex||5.017009| +av_top_index||5.017009| +av_undef||| +av_unshift||| +ax|||n +bad_type_gv||| +bad_type_pv||| +bind_match||| +block_end||| +block_gimme||5.004000| +block_start||| +blockhook_register||5.013003| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_mro||| +bytes_cmp_utf8||5.013007| +bytes_from_utf8||5.007001| +bytes_to_uni|||n +bytes_to_utf8||5.006001| +call_argv|5.006000||p +call_atexit||5.006000| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +caller_cx|5.013005|5.013005|p +calloc||5.007002|n +cando||| +cast_i32||5.006000| +cast_iv||5.006000| +cast_ulong||5.006000| +cast_uv||5.006000| +check_locale_boundary_crossing||| +check_type_and_open||| +check_uni||| +check_utf8_print||| +checkcomma||| +ckWARN|5.006000||p +ck_entersub_args_core||| +ck_entersub_args_list||5.013006| +ck_entersub_args_proto_or_list||5.013006| +ck_entersub_args_proto||5.013006| +ck_warner_d||5.011001|v +ck_warner||5.011001|v +ckwarn_common||| +ckwarn_d||5.009003| +ckwarn||5.009003| +cl_and|||n +cl_anything|||n +cl_init|||n +cl_is_anything|||n +cl_or|||n +clear_placeholders||| +clone_params_del|||n +clone_params_new|||n +closest_cop||| +compute_EXACTish||| +convert||| +cop_fetch_label||5.015001| +cop_free||| +cop_hints_2hv||5.013007| +cop_hints_fetch_pvn||5.013007| +cop_hints_fetch_pvs||5.013007| +cop_hints_fetch_pv||5.013007| +cop_hints_fetch_sv||5.013007| +cop_store_label||5.015001| +cophh_2hv||5.013007| +cophh_copy||5.013007| +cophh_delete_pvn||5.013007| +cophh_delete_pvs||5.013007| +cophh_delete_pv||5.013007| +cophh_delete_sv||5.013007| +cophh_fetch_pvn||5.013007| +cophh_fetch_pvs||5.013007| +cophh_fetch_pv||5.013007| +cophh_fetch_sv||5.013007| +cophh_free||5.013007| +cophh_new_empty||5.019003| +cophh_store_pvn||5.013007| +cophh_store_pvs||5.013007| +cophh_store_pv||5.013007| +cophh_store_sv||5.013007| +core_prototype||| +core_regclass_swash||| +coresub_op||| +could_it_be_a_POSIX_class||| +cr_textfilter||| +create_eval_scope||| +croak_memory_wrap||5.019003|n +croak_no_mem|||n +croak_no_modify||5.013003|n +croak_nocontext|||vn +croak_popstack|||n +croak_sv||5.013001| +croak_xs_usage||5.010001|n +croak|||v +csighandler||5.009003|n +curmad||| +current_re_engine||| +curse||| +custom_op_desc||5.007003| +custom_op_name||5.007003| +custom_op_register||5.013007| +custom_op_xop||5.013007| +cv_ckproto_len_flags||| +cv_clone_into||| +cv_clone||| +cv_const_sv_or_av||| +cv_const_sv||5.004000| +cv_dump||| +cv_forget_slab||| +cv_get_call_checker||5.013006| +cv_set_call_checker||5.013006| +cv_undef||| +cvgv_set||| +cvstash_set||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXR|5.019002||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dVAR|5.009003||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +debug_start_match||| +deb||5.007003|v +defelem_target||| +del_sv||| +delete_eval_scope||| +delimcpy||5.004000|n +deprecate_commaless_var_list||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_sv||5.013001| +die_unwind||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_close||| +do_delete_local||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_ncmp||| +do_oddball||| +do_op_dump||5.006000| +do_op_xmldump||| +do_open9||5.006000| +do_openn||5.007001| +do_open||5.004000| +do_pmop_dump||5.006000| +do_pmop_xmldump||| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +dump_all_perl||| +dump_all||5.006000| +dump_eval||5.006000| +dump_exec_pos||| +dump_fds||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs_perl||| +dump_packsubs||5.006000| +dump_sub_perl||| +dump_sub||5.006000| +dump_sv_child||| +dump_trie_interim_list||| +dump_trie_interim_table||| +dump_trie||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_cop_io||| +eval_pv|5.006000||p +eval_sv|5.006000||p +exec_failed||| +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +feature_is_enabled||| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +finalize_optree||| +finalize_op||| +find_and_forget_pmops||| +find_array_subscript||| +find_beginning||| +find_byclass||| +find_hash_subscript||| +find_in_my_stash||| +find_lexical_cv||| +find_runcv_where||| +find_runcv||5.008001| +find_rundefsv2||| +find_rundefsvoffset||5.009002| +find_rundefsv||5.013002| +find_script||| +find_uninit_var||| +first_symbol|||n +foldEQ_latin1||5.013008|n +foldEQ_locale||5.013002|n +foldEQ_utf8_flags||5.013010| +foldEQ_utf8||5.013002| +foldEQ||5.013002|n +fold_constants||| +forbid_setid||| +force_ident_maybe_lex||| +force_ident||| +force_list||| +force_next||| +force_strict_version||| +force_version||| +force_word||| +forget_pmop||| +form_nocontext|||vn +form_short_octal_warning||| +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_and_check_backslash_N_name||| +get_aux_mg||| +get_av|5.006000||p +get_context||5.006000|n +get_cvn_flags|5.009005||p +get_cvs|5.011000||p +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_invlist_iter_addr||| +get_invlist_offset_addr||| +get_invlist_previous_index_addr||| +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_re_arg||| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +glob_2number||| +glob_assign_glob||| +glob_assign_ref||| +gp_dup||| +gp_free||| +gp_ref||| +grok_bin|5.007003||p +grok_bslash_N||| +grok_bslash_c||| +grok_bslash_o||| +grok_bslash_x||| +grok_hex|5.007003||p +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_add_by_type||5.011000| +gv_autoload4||5.004000| +gv_autoload_pvn||5.015004| +gv_autoload_pv||5.015004| +gv_autoload_sv||5.015004| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.004000| +gv_efullname4||5.006001| +gv_efullname||| +gv_ename||| +gv_fetchfile_flags||5.009005| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmeth_pv_autoload||5.015004| +gv_fetchmeth_pvn_autoload||5.015004| +gv_fetchmeth_pvn||5.015004| +gv_fetchmeth_pv||5.015004| +gv_fetchmeth_sv_autoload||5.015004| +gv_fetchmeth_sv||5.015004| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod_pv_flags||5.015004| +gv_fetchmethod_pvn_flags||5.015004| +gv_fetchmethod_sv_flags||5.015004| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags|5.009002||p +gv_fetchpvs|5.009004||p +gv_fetchpv||| +gv_fetchsv|5.009002||p +gv_fullname3||5.004000| +gv_fullname4||5.006001| +gv_fullname||| +gv_handler||5.007001| +gv_init_pvn||5.015004| +gv_init_pv||5.015004| +gv_init_svtype||| +gv_init_sv||5.015004| +gv_init||| +gv_magicalize_isa||| +gv_name_set||5.009004| +gv_stashpvn|5.004000||p +gv_stashpvs|5.009003||p +gv_stashpv||| +gv_stashsv||| +gv_try_downgrade||| +handle_regex_sets||| +he_dup||| +hek_dup||| +hfree_next_entry||| +hfreeentries||| +hsplit||| +hv_assert||| +hv_auxinit||| +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_common_key_len||5.010000| +hv_common||5.010000| +hv_copy_hints_hv||5.009004| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.004000| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_ename_add||| +hv_ename_delete||| +hv_exists_ent||5.004000| +hv_exists||| +hv_fetch_ent||5.004000| +hv_fetchs|5.009003||p +hv_fetch||| +hv_fill||5.013002| +hv_free_ent_ret||| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.004000| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.004000| +hv_magic_check|||n +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||| +hv_placeholders_set||5.009003| +hv_rand_set||5.017011| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.004000| +hv_store_flags||5.008000| +hv_stores|5.009004||p +hv_store||| +hv_undef_flags||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incline||| +incpush_if_exists||| +incpush_use_sep||| +incpush||| +ingroup||| +init_argv_symbols||| +init_constants||| +init_dbargs||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +inplace_aassign||| +instr|||n +intro_my||| +intuit_method||| +intuit_more||| +invert||| +invlist_array||| +invlist_clone||| +invlist_extend||| +invlist_highest||| +invlist_is_iterating||| +invlist_iterfinish||| +invlist_iterinit||| +invlist_iternext||| +invlist_max||| +invlist_previous_index||| +invlist_set_len||| +invlist_set_previous_index||| +invlist_trim||| +invoke_exception_hook||| +io_close||| +isALNUMC|5.006000||p +isALNUM_lazy||| +isALPHANUMERIC||5.017008| +isALPHA||| +isASCII|5.006000|5.006000|p +isBLANK|5.006001||p +isCNTRL|5.006000|5.006000|p +isDIGIT||| +isFOO_lc||| +isFOO_utf8_lc||| +isGRAPH|5.006000||p +isGV_with_GP|5.009004||p +isIDCONT||5.017008| +isIDFIRST_lazy||| +isIDFIRST||| +isLOWER||| +isOCTAL||5.013005| +isPRINT|5.004000||p +isPSXSPC|5.006001||p +isPUNCT|5.006000||p +isSPACE||| +isUPPER||| +isWORDCHAR||5.013006| +isXDIGIT|5.006000||p +is_an_int||| +is_ascii_string||5.011000|n +is_cur_LC_category_utf8||| +is_handle_constructor|||n +is_list_assignment||| +is_lvalue_sub||5.007001| +is_uni_alnum_lc||5.006000| +is_uni_alnumc_lc||5.017007| +is_uni_alnumc||5.017007| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_blank_lc||5.017002| +is_uni_blank||5.017002| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_alnumc||5.017007| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_blank||5.017002| +is_utf8_char_buf||5.015008|n +is_utf8_char_slow|||n +is_utf8_char||5.006000|n +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_perl_space||5.011001| +is_utf8_perl_word||5.011001| +is_utf8_posix_digit||5.011001| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003|n +is_utf8_string_loc||5.008001|n +is_utf8_string||5.006001|n +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +is_utf8_xidcont||5.013010| +is_utf8_xidfirst||5.013010| +isa_lookup||| +items|||n +ix|||n +jmaybe||| +join_exact||| +keyword_plugin_standard||| +keyword||| +leave_scope||| +lex_bufutf8||5.011002| +lex_discard_to||5.011002| +lex_grow_linestr||5.011002| +lex_next_chunk||5.011002| +lex_peek_unichar||5.011002| +lex_read_space||5.011002| +lex_read_to||5.011002| +lex_read_unichar||5.011002| +lex_start||5.009005| +lex_stuff_pvn||5.011002| +lex_stuff_pvs||5.013005| +lex_stuff_pv||5.013006| +lex_stuff_sv||5.011002| +lex_unstuff||5.011002| +listkids||| +list||| +load_module_nocontext|||vn +load_module|5.006000||pv +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHs|5.010001||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHs|5.010001||p +mXPUSHu|5.009002||p +mad_free||| +madlex||| +madparse||| +magic_clear_all_env||| +magic_cleararylen_p||| +magic_clearenv||| +magic_clearhints||| +magic_clearhint||| +magic_clearisa||| +magic_clearpack||| +magic_clearsig||| +magic_copycallchecker||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_getarylen||| +magic_getdefelem||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_methcall1||| +magic_methcall|||v +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setarylen||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdefelem||| +magic_setenv||| +magic_sethint||| +magic_setisa||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +make_matcher||| +make_trie_failtable||| +make_trie||| +malloc_good_size|||n +malloced_size|||n +malloc||5.007002|n +markstack_grow||| +matcher_matches_sv||| +mayberelocate||| +measure_struct||| +memEQs|5.009005||p +memEQ|5.004000||p +memNEs|5.009005||p +memNE|5.004000||p +mem_collxfrm||| +mem_log_common|||n +mess_alloc||| +mess_nocontext|||vn +mess_sv||5.013001| +mess||5.006000|v +method_common||| +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_find_mglob||| +mg_findext|5.013008|5.013008|p +mg_find||| +mg_free_type||5.013006| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical||| +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002| +minus_v||| +missingterm||| +mode_from_discipline||| +modkids||| +more_bodies||| +more_sv||| +moreswitches||| +mro_clean_isarev||| +mro_gather_and_rename||| +mro_get_from_name||5.010001| +mro_get_linear_isa_dfs||| +mro_get_linear_isa||5.009005| +mro_get_private_data||5.010001| +mro_isa_changed_in||| +mro_meta_dup||| +mro_meta_init||| +mro_method_changed_in||5.009005| +mro_package_moved||| +mro_register||5.010001| +mro_set_mro||5.010001| +mro_set_private_data||5.010001| +mul128||| +mulexp10|||n +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_index||| +my_cxt_init||| +my_dirfd||5.009005| +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_kid||| +my_lstat_flags||| +my_lstat||5.019003| +my_memcmp|||n +my_memset||5.004000|n +my_pclose||5.004000| +my_popen_list||5.007001| +my_popen||5.004000| +my_setenv||| +my_snprintf|5.009004||pvn +my_socketpair||5.007003|n +my_sprintf|5.009003||pvn +my_stat_flags||| +my_stat||5.019003| +my_strftime||5.007002| +my_strlcat|5.009004||pn +my_strlcpy|5.009004||pn +my_unexec||| +my_vsnprintf||5.009004|n +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB_flags||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB_flags||5.015006| +newCONSTSUB|5.004050||p +newCVREF||| +newDEFSVOP||| +newFORM||| +newFOROP||5.013007| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGP||| +newGVOP||| +newGVREF||| +newGVgen_flags||5.015004| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMADPROP||| +newMADsv||| +newMYSUB||5.017004| +newNULLLIST||| +newOP||| +newPADOP||| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.004000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSTUB||| +newSUB||| +newSVOP||| +newSVREF||| +newSV_type|5.009005||p +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpadname||5.017004| +newSVpv_share||5.013006| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_flags|5.010001||p +newSVpvn_share|5.007001||p +newSVpvn_utf8|5.010001||p +newSVpvn|5.004050||p +newSVpvs_flags|5.010001||p +newSVpvs_share|5.009003||p +newSVpvs|5.009003||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newTOKEN||| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.013007| +newXS_flags||5.009004| +newXS_len_flags||| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +new_warnings_bitfield||| +next_symbol||| +nextargv||| +nextchar||| +ninstr|||n +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +not_a_number||| +not_incrementable||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +oopsAV||| +oopsHV||| +op_append_elem||5.013006| +op_append_list||5.013006| +op_clear||| +op_const_sv||| +op_contextualize||5.013006| +op_dump||5.006000| +op_free||| +op_getmad_weak||| +op_getmad||| +op_integerize||| +op_linklist||5.013006| +op_lvalue_flags||| +op_lvalue||5.013007| +op_null||5.007002| +op_prepend_elem||5.013006| +op_refcnt_dec||| +op_refcnt_inc||| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +op_scope||5.013007| +op_std_init||| +op_unscope||| +op_xmldump||| +open_script||| +opslab_force_free||| +opslab_free_nopad||| +opslab_free||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +packWARN|5.007003||p +pack_cat||5.007003| +pack_rec||| +package_version||| +package||| +packlist||5.008001| +pad_add_anon||5.008001| +pad_add_name_pvn||5.015001| +pad_add_name_pvs||5.015001| +pad_add_name_pv||5.015001| +pad_add_name_sv||5.015001| +pad_alloc_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||5.009003| +pad_findlex||| +pad_findmy_pvn||5.015001| +pad_findmy_pvs||5.015001| +pad_findmy_pv||5.015001| +pad_findmy_sv||5.015001| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||5.008001| +pad_peg|||n +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||| +pad_swipe||| +pad_tidy||5.008001| +padlist_dup||| +padlist_store||| +parse_arithexpr||5.013008| +parse_barestmt||5.013007| +parse_block||5.013007| +parse_body||| +parse_fullexpr||5.013008| +parse_fullstmt||5.013005| +parse_ident||| +parse_label||5.013007| +parse_listexpr||5.013008| +parse_lparen_question_flags||| +parse_stmtseq||5.013006| +parse_termexpr||5.013008| +parse_unicode_opts||| +parser_dup||| +parser_free_nexttoke_ops||| +parser_free||| +path_is_searchable|||n +peep||| +pending_ident||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pm_description||| +pmop_dump||5.006000| +pmop_xmldump||| +pmruntime||| +pmtrans||| +pop_scope||| +populate_isa|||v +pregcomp||5.009005| +pregexec||| +pregfree2||5.011000| +pregfree||| +prepend_madprops||| +prescan_version||5.011004| +printbuf||| +printf_nocontext|||vn +process_special_blocks||| +ptr_hash|||n +ptr_table_clear||5.009005| +ptr_table_fetch||5.009005| +ptr_table_find|||n +ptr_table_free||5.009005| +ptr_table_new||5.009005| +ptr_table_split||5.009005| +ptr_table_store||5.009005| +push_scope||| +put_byte||| +put_latin1_charclass_innards||| +pv_display|5.006000||p +pv_escape|5.009004||p +pv_pretty|5.009004||p +pv_uni_display||5.007003| +qerror||| +qsortsvu||| +re_compile||5.009005| +re_croak2||| +re_dup_guts||| +re_intuit_start||5.019001| +re_intuit_string||5.006000| +re_op_compile||| +readpipe_override||| +realloc||5.007002|n +reentrant_free||5.019003| +reentrant_init||5.019003| +reentrant_retry||5.019003|vn +reentrant_size||5.019003| +ref_array_or_hash||| +refcounted_he_chain_2hv||| +refcounted_he_fetch_pvn||| +refcounted_he_fetch_pvs||| +refcounted_he_fetch_pv||| +refcounted_he_fetch_sv||| +refcounted_he_free||| +refcounted_he_inc||| +refcounted_he_new_pvn||| +refcounted_he_new_pvs||| +refcounted_he_new_pv||| +refcounted_he_new_sv||| +refcounted_he_value||| +refkids||| +refto||| +ref||5.019003| +reg_check_named_buff_matched||| +reg_named_buff_all||5.009005| +reg_named_buff_exists||5.009005| +reg_named_buff_fetch||5.009005| +reg_named_buff_firstkey||5.009005| +reg_named_buff_iter||| +reg_named_buff_nextkey||5.009005| +reg_named_buff_scalar||5.009005| +reg_named_buff||| +reg_node||| +reg_numbered_buff_fetch||| +reg_numbered_buff_length||| +reg_numbered_buff_store||| +reg_qr_package||| +reg_recode||| +reg_scan_name||| +reg_skipcomment||| +reg_temp_copy||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.009004| +regclass||| +regcppop||| +regcppush||| +regcurly||| +regdump_extflags||| +regdump_intflags||| +regdump||5.005000| +regdupe_internal||| +regexec_flags||5.005000| +regfree_internal||5.009005| +reghop3|||n +reghop4|||n +reghopmaybe3|||n +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regpatws|||n +regpiece||| +regpposixcc||| +regprop||| +regrepeat||| +regtail_study||| +regtail||| +regtry||| +reguni||| +regwhite|||n +reg||| +repeatcpy|||n +report_evil_fh||| +report_redefined_cv||| +report_uninit||| +report_wrongway_fh||| +require_pv||5.006000| +require_tie_mod||| +restore_magic||| +rninstr|||n +rpeep||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rv2cv_op_cv||5.013006| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_adelete||5.011000| +save_aelem_flags||5.011000| +save_aelem||5.004050| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hdelete||5.011000| +save_hek_flags|||n +save_helem_flags||5.011000| +save_helem||5.004050| +save_hints||5.010001| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic_flags||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||5.005000| +save_padsv_and_mortalize||5.010001| +save_pptr||| +save_pushi32ptr||5.010001| +save_pushptri32ptr||| +save_pushptrptr||5.010001| +save_pushptr||5.010001| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_svref||| +save_vptr||5.006000| +savepvn||| +savepvs||5.009003| +savepv||| +savesharedpvn||5.009005| +savesharedpvs||5.013006| +savesharedpv||5.007003| +savesharedsvpv||5.013006| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type|||n +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.009005| +scan_word||| +screaminstr||5.005000| +search_const||| +seed||5.008001| +sequence_num||| +set_context||5.006000|n +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +setdefout||| +share_hek_flags||| +share_hek||5.004000| +si_dup||| +sighandler|||n +simplify_sort||| +skipspace0||| +skipspace1||| +skipspace2||| +skipspace_flags||| +softref2xv||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +space_join_names_mortal||| +ss_dup||| +stack_grow||| +start_force||| +start_glob||| +start_subparse||5.004000| +stdize_locale||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool_flags||5.013006| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_common||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2num||| +sv_2nv_flags||5.013001| +sv_2pv_flags|5.007002||p +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen|5.006000||p +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff||| +sv_bless||| +sv_cat_decode||5.008001| +sv_catpv_flags||5.013006| +sv_catpv_mg|5.004050||p +sv_catpv_nomg||5.013006| +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpvs_flags||5.013006| +sv_catpvs_mg||5.013006| +sv_catpvs_nomg||5.013006| +sv_catpvs|5.009003||p +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_catxmlpvn||| +sv_catxmlpv||| +sv_catxmlsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_flags||5.013006| +sv_cmp_locale_flags||5.013006| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm_flags||5.013006| +sv_collxfrm||| +sv_copypv_flags||5.017002| +sv_copypv_nomg||5.017002| +sv_copypv||| +sv_dec_nomg||5.013002| +sv_dec||| +sv_del_backref||| +sv_derived_from_pvn||5.015004| +sv_derived_from_pv||5.015004| +sv_derived_from_sv||5.015004| +sv_derived_from||5.004000| +sv_destroyable||5.010000| +sv_display||| +sv_does_pvn||5.015004| +sv_does_pv||5.015004| +sv_does_sv||5.015004| +sv_does||5.009004| +sv_dump||| +sv_dup_common||| +sv_dup_inc_multiple||| +sv_dup_inc||| +sv_dup||| +sv_eq_flags||5.013006| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_gets||5.004000| +sv_grow||| +sv_i_ncmp||| +sv_inc_nomg||5.013002| +sv_inc||| +sv_insert_flags||5.010001| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8_nomg||| +sv_len_utf8||5.006000| +sv_len||| +sv_magic_portable|5.019003|5.004000|p +sv_magicext_mglob||| +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy_flags||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||| +sv_nv||5.005000| +sv_peek||5.005000| +sv_pos_b2u_flags||5.019003| +sv_pos_b2u_midway||| +sv_pos_b2u||5.006000| +sv_pos_u2b_cached||| +sv_pos_u2b_flags||5.011005| +sv_pos_u2b_forwards|||n +sv_pos_u2b_midway|||n +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags|5.007002||p +sv_pvn_force||| +sv_pvn_nomg|5.007003|5.005000|p +sv_pvn||5.005000| +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_ref||| +sv_release_COW||| +sv_replace||| +sv_report_used||| +sv_resetpvn||| +sv_reset||| +sv_rvweaken||5.006000| +sv_sethek||| +sv_setiv_mg|5.004050||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.004050||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.004050||p +sv_setpvn||| +sv_setpvs_mg||5.013006| +sv_setpvs|5.009004||p +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pvs||5.019003| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.004050||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.004050||p +sv_setuv|5.004000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagicext|5.013008|5.013008|p +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_flags||5.009004| +sv_usepvn_mg|5.004050||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags_grow||5.011000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade_nomg||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.005000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn_flags||5.017002| +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +sv_xmlpeek||| +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_init||5.006000| +swatch_get||| +sys_init3||5.010000|n +sys_init||5.010000|n +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +sys_term||5.010000|n +taint_env||| +taint_proper||| +tied_method|||v +tmps_grow||5.006000| +toFOLD_uni||5.007003| +toFOLD_utf8||5.019001| +toFOLD||5.019001| +toLOWER_L1||5.019001| +toLOWER_LC||5.004000| +toLOWER_uni||5.007003| +toLOWER_utf8||5.015007| +toLOWER||| +toTITLE_uni||5.007003| +toTITLE_utf8||5.015007| +toTITLE||5.019001| +toUPPER_uni||5.007003| +toUPPER_utf8||5.015007| +toUPPER||5.004000| +to_byte_substr||| +to_lower_latin1||| +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.015007| +to_utf8_lower||5.015007| +to_utf8_substr||| +to_utf8_title||5.015007| +to_utf8_upper||5.015007| +token_free||| +token_getmad||| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments_pv||| +too_few_arguments_sv||| +too_many_arguments_pv||| +too_many_arguments_sv||| +translate_substr_offsets||| +try_amagic_bin||| +try_amagic_un||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unreferenced_to_tmp_stack||| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.004000| +unwind_handler_stack||| +update_debugger_info||| +upg_version||5.009005| +usage||| +utf16_textfilter||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000| +utf8_length||5.007001| +utf8_mg_len_cache_update||| +utf8_mg_pos_cache_update||| +utf8_to_bytes||5.006001| +utf8_to_uvchr_buf||5.015009| +utf8_to_uvchr||5.007001| +utf8_to_uvuni_buf||5.015009| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +valid_utf8_to_uvchr||| +valid_utf8_to_uvuni||5.015009| +validate_proto||| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module|5.006000||p +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warn_sv||5.013001| +warner_nocontext|||vn +warner|5.006000|5.004000|pv +warn|||v +was_lvalue_sub||| +watch||| +whichsig_pvn||5.015004| +whichsig_pv||5.015004| +whichsig_sv||5.015004| +whichsig||| +win32_croak_not_implemented|||n +with_queued_errors||| +wrap_op_checker||5.015008| +write_to_stderr||| +xmldump_all_perl||| +xmldump_all||| +xmldump_attr||| +xmldump_eval||| +xmldump_form||| +xmldump_indent|||v +xmldump_packsubs_perl||| +xmldump_packsubs||| +xmldump_sub_perl||| +xmldump_sub||| +xmldump_vindent||| +xs_apiversion_bootcheck||| +xs_version_bootcheck||| +yyerror_pvn||| +yyerror_pv||| +yyerror||| +yylex||| +yyparse||| +yyunlex||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %warnings, %depends); +my $replace = 0; +my($hint, $define, $function); + +sub find_api +{ + my $code = shift; + $code =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; + grep { exists $API{$_} } $code =~ /(\w+)/mg; +} + +while () { + if ($hint) { + my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; + if (m{^\s*\*\s(.*?)\s*$}) { + for (@{$hint->[1]}) { + $h->{$_} ||= ''; # suppress warning with older perls + $h->{$_} .= "$1\n"; + } + } + else { undef $hint } + } + + $hint = [$1, [split /,?\s+/, $2]] + if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; + + if ($define) { + if ($define->[1] =~ /\\$/) { + $define->[1] .= $_; + } + else { + if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { + my @n = find_api($define->[1]); + push @{$depends{$define->[0]}}, @n if @n + } + undef $define; + } + } + + $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; + + if ($function) { + if (/^}/) { + if (exists $API{$function->[0]}) { + my @n = find_api($function->[1]); + push @{$depends{$function->[0]}}, @n if @n + } + undef $function; + } + else { + $function->[1] .= $_; + } + } + + $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + my @deps = map { s/\s+//g; $_ } split /,/, $3; + my $d; + for $d (map { s/\s+//g; $_ } split /,/, $1) { + push @{$depends{$d}}, @deps; + } + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +for (values %depends) { + my %s; + $_ = [sort grep !$s{$_}++, @$_]; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "\n$hints{$f}" if exists $hints{$f}; + print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; + $info++; + } + print "No portability information available.\n" unless $info; + $count++; + } + $count or print "Found no API matching '$opt{'api-info'}'."; + print "\n"; + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + push @flags, 'warning' if exists $warnings{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); +my $srcext = join '|', map { quotemeta $_ } @srcext; + +if (@ARGV) { + my %seen; + for (@ARGV) { + if (-e) { + if (-f) { + push @files, $_ unless $seen{$_}++; + } + else { warn "'$_' is not a file.\n" } + } + else { + my @new = grep { -f } glob $_ + or warn "'$_' does not exist.\n"; + push @files, grep { !$seen{$_}++ } @new; + } + } +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +die "No input files given!\n" unless @files; + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; }; + close IN; + + my %file = (orig => $c, changes => 0); + + # Temporarily remove C/XS comments and strings from the code + my @ccom; + + $c =~ s{ + ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* + | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) + | ( ^$HS*\#[^\r\n]* + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' + | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) + }{ defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + $file{uses_provided}{$func}++; + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + $file{needs}{$_} = 'static' if exists $need{$_}; + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { warning("Possibly wrong #define $1 in $filename") } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + my $warnings = 0; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + unless ($API{$func}{nothxarg}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses_provided}}) { + if ($file{uses}{$func}) { + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + else { + diag("Uses $func"); + } + } + $warnings += hint($func); + } + + unless ($opt{quiet}) { + for $func (sort keys %{$file{uses_todo}}) { + print "*** WARNING: Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo}), ", even with '$ppport'\n"; + $warnings++; + } + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + my $s = $warnings != 1 ? 's' : ''; + my $warn = $warnings ? " ($warnings warning$s)" : ''; + info("Analysis completed$warn"); + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub try_use { eval "use @_;"; return $@ eq '' } + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and try_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <
$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while () { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub rec_depend +{ + my($func, $seen) = @_; + return () unless exists $depends{$func}; + $seen = {%{$seen||{}}}; + return () if $seen->{$func}++; + my %s; + grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +my %given_warnings; +sub hint +{ + $opt{quiet} and return; + my $func = shift; + my $rv = 0; + if (exists $warnings{$func} && !$given_warnings{$func}++) { + my $warn = $warnings{$func}; + $warn =~ s!^!*** !mg; + print "*** WARNING: $func\n", $warn; + $rv++; + } + if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; + } + $rv; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print < }; + my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; + $copy =~ s/^(?=\S+)/ /gms; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + if (eval \$Devel::PPPort::VERSION < $VERSION) { + die "$0 was originally generated with Devel::PPPort $VERSION.\\n" + . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" + . "Please install a newer version, or --unstrip will not work.\\n"; + } + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <$0" or die "cannot strip $0: $!\n"; + print OUT "$pl$c\n"; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) +#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ +#ifndef dTHR +# define dTHR dNOOP +#endif +#ifndef dTHX +# define dTHX dNOOP +#endif + +#ifndef dTHXa +# define dTHXa(x) dNOOP +#endif +#ifndef pTHX +# define pTHX void +#endif + +#ifndef pTHX_ +# define pTHX_ +#endif + +#ifndef aTHX +# define aTHX +#endif + +#ifndef aTHX_ +# define aTHX_ +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# ifdef USE_THREADS +# define aTHXR thr +# define aTHXR_ thr, +# else +# define aTHXR +# define aTHXR_ +# endif +# define dTHXR dTHR +#else +# define aTHXR aTHX +# define aTHXR_ aTHX_ +# define dTHXR dTHX +#endif +#ifndef dTHXoa +# define dTHXoa(x) dTHXa(x) +#endif + +#ifdef I_LIMITS +# include +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +# ifdef SHORT_MAX +# define PERL_SHORT_MAX ((short)SHORT_MAX) +# else +# ifdef MAXSHORT /* Often used in */ +# define PERL_SHORT_MAX ((short)MAXSHORT) +# else +# ifdef SHRT_MAX +# define PERL_SHORT_MAX ((short)SHRT_MAX) +# else +# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MIN +# ifdef SHORT_MIN +# define PERL_SHORT_MIN ((short)SHORT_MIN) +# else +# ifdef MINSHORT +# define PERL_SHORT_MIN ((short)MINSHORT) +# else +# ifdef SHRT_MIN +# define PERL_SHORT_MIN ((short)SHRT_MIN) +# else +# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +#ifndef PERL_UINT_MAX +# ifdef UINT_MAX +# define PERL_UINT_MAX ((unsigned int)UINT_MAX) +# else +# ifdef MAXUINT +# define PERL_UINT_MAX ((unsigned int)MAXUINT) +# else +# define PERL_UINT_MAX (~(unsigned int)0) +# endif +# endif +#endif + +#ifndef PERL_UINT_MIN +# define PERL_UINT_MIN ((unsigned int)0) +#endif + +#ifndef PERL_INT_MAX +# ifdef INT_MAX +# define PERL_INT_MAX ((int)INT_MAX) +# else +# ifdef MAXINT /* Often used in */ +# define PERL_INT_MAX ((int)MAXINT) +# else +# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_INT_MIN +# ifdef INT_MIN +# define PERL_INT_MIN ((int)INT_MIN) +# else +# ifdef MININT +# define PERL_INT_MIN ((int)MININT) +# else +# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MAX +# ifdef ULONG_MAX +# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) +# else +# ifdef MAXULONG +# define PERL_ULONG_MAX ((unsigned long)MAXULONG) +# else +# define PERL_ULONG_MAX (~(unsigned long)0) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MIN +# define PERL_ULONG_MIN ((unsigned long)0L) +#endif + +#ifndef PERL_LONG_MAX +# ifdef LONG_MAX +# define PERL_LONG_MAX ((long)LONG_MAX) +# else +# ifdef MAXLONG +# define PERL_LONG_MAX ((long)MAXLONG) +# else +# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_LONG_MIN +# ifdef LONG_MIN +# define PERL_LONG_MIN ((long)LONG_MIN) +# else +# ifdef MINLONG +# define PERL_LONG_MIN ((long)MINLONG) +# else +# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) +# ifndef PERL_UQUAD_MAX +# ifdef ULONGLONG_MAX +# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) +# else +# ifdef MAXULONGLONG +# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) +# else +# define PERL_UQUAD_MAX (~(unsigned long long)0) +# endif +# endif +# endif + +# ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN ((unsigned long long)0L) +# endif + +# ifndef PERL_QUAD_MAX +# ifdef LONGLONG_MAX +# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) +# else +# ifdef MAXLONGLONG +# define PERL_QUAD_MAX ((long long)MAXLONGLONG) +# else +# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) +# endif +# endif +# endif + +# ifndef PERL_QUAD_MIN +# ifdef LONGLONG_MIN +# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) +# else +# ifdef MINLONGLONG +# define PERL_QUAD_MIN ((long long)MINLONGLONG) +# else +# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +/* This is based on code from 5.003 perl.h */ +#ifdef HAS_QUAD +# ifdef cray +#ifndef IVTYPE +# define IVTYPE int +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_INT_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_INT_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UINT_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UINT_MAX +#endif + +# ifdef INTSIZE +#ifndef IVSIZE +# define IVSIZE INTSIZE +#endif + +# endif +# else +# if defined(convex) || defined(uts) +#ifndef IVTYPE +# define IVTYPE long long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_QUAD_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_QUAD_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UQUAD_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UQUAD_MAX +#endif + +# ifdef LONGLONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGLONGSIZE +#endif + +# endif +# else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +# ifdef LONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGSIZE +#endif + +# endif +# endif +# endif +#ifndef IVSIZE +# define IVSIZE 8 +#endif + +#ifndef LONGSIZE +# define LONGSIZE 8 +#endif + +#ifndef PERL_QUAD_MIN +# define PERL_QUAD_MIN IV_MIN +#endif + +#ifndef PERL_QUAD_MAX +# define PERL_QUAD_MAX IV_MAX +#endif + +#ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN UV_MIN +#endif + +#ifndef PERL_UQUAD_MAX +# define PERL_UQUAD_MAX UV_MAX +#endif + +#else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef LONGSIZE +# define LONGSIZE 4 +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif +#ifndef UVTYPE +# define UVTYPE unsigned IVTYPE +#endif + +#ifndef UVSIZE +# define UVSIZE IVSIZE +#endif +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif + +#if !defined(SvUOK) && defined(SvIOK_UV) +# define SvUOK(sv) SvIOK_UV(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef memEQs +# define memEQs(s1, l, s2) \ + (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) +#endif + +#ifndef memNEs +# define memNEs(s1, l, s2) !memEQs(s1, l, s2) +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif + +#ifndef PERL_UNUSED_DECL +# ifdef HASATTRIBUTE +# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) +# define PERL_UNUSED_DECL +# else +# define PERL_UNUSED_DECL __attribute__((unused)) +# endif +# else +# define PERL_UNUSED_DECL +# endif +#endif + +#ifndef PERL_UNUSED_ARG +# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ +# include +# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) +# else +# define PERL_UNUSED_ARG(x) ((void)x) +# endif +#endif + +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(x) ((void)x) +#endif + +#ifndef PERL_UNUSED_CONTEXT +# ifdef USE_ITHREADS +# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) +# else +# define PERL_UNUSED_CONTEXT +# endif +#endif +#ifndef NOOP +# define NOOP /*EMPTY*/(void)0 +#endif + +#ifndef dNOOP +# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif +#endif + +#ifndef PTR2ul +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif +#ifndef PTR2nat +# define PTR2nat(p) (PTRV)(p) +#endif + +#ifndef NUM2PTR +# define NUM2PTR(any,d) (any)PTR2nat(d) +#endif + +#ifndef PTR2IV +# define PTR2IV(p) INT2PTR(IV,p) +#endif + +#ifndef PTR2UV +# define PTR2UV(p) INT2PTR(UV,p) +#endif + +#ifndef PTR2NV +# define PTR2NV(p) NUM2PTR(NV,p) +#endif + +#undef START_EXTERN_C +#undef END_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C extern +#endif + +#if defined(PERL_GCC_PEDANTIC) +# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN +# define PERL_GCC_BRACE_GROUPS_FORBIDDEN +# endif +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) +# ifndef PERL_USE_GCC_BRACE_GROUPS +# define PERL_USE_GCC_BRACE_GROUPS +# endif +#endif + +#undef STMT_START +#undef STMT_END +#ifdef PERL_USE_GCC_BRACE_GROUPS +# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ +# define STMT_END ) +#else +# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) +# define STMT_START if (1) +# define STMT_END else (void)0 +# else +# define STMT_START do +# define STMT_END while (0) +# endif +#endif +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +/* DEFSV appears first in 5.004_56 */ +#ifndef DEFSV +# define DEFSV GvSV(PL_defgv) +#endif + +#ifndef SAVE_DEFSV +# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) +#endif + +#ifndef DEFSV_set +# define DEFSV_set(sv) (DEFSV = (sv)) +#endif + +/* Older perls (<=5.003) lack AvFILLp */ +#ifndef AvFILLp +# define AvFILLp AvFILL +#endif +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +/* Hint: gv_stashpvn + * This function's backport doesn't support the length parameter, but + * rather ignores it. Portability can only be ensured if the length + * parameter is used for speed reasons, but the length can always be + * correctly computed from the string argument. + */ +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,create) gv_stashpv(str,create) +#endif + +/* Replace: 1 */ +#ifndef get_cv +# define get_cv perl_get_cv +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef get_av +# define get_av perl_get_av +#endif + +#ifndef get_hv +# define get_hv perl_get_hv +#endif + +/* Replace: 0 */ +#ifndef dUNDERBAR +# define dUNDERBAR dNOOP +#endif + +#ifndef UNDERBAR +# define UNDERBAR DEFSV +#endif +#ifndef dAX +# define dAX I32 ax = MARK - PL_stack_base + 1 +#endif + +#ifndef dITEMS +# define dITEMS I32 items = SP - MARK +#endif +#ifndef dXSTARG +# define dXSTARG SV * targ = sv_newmortal() +#endif +#ifndef dAXMARK +# define dAXMARK I32 ax = POPMARK; \ + register SV ** const mark = PL_stack_base + ax++ +#endif +#ifndef XSprePUSH +# define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#if (PERL_BCDVERSION < 0x5005000) +# undef XSRETURN +# define XSRETURN(off) \ + STMT_START { \ + PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ + return; \ + } STMT_END +#endif +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +#ifndef SVfARG +# define SVfARG(p) ((void*)(p)) +#endif +#ifndef PERL_ABS +# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) +#endif +#ifndef dVAR +# define dVAR dNOOP +#endif +#ifndef SVf +# define SVf "_" +#endif +#ifndef UTF8_MAXBYTES +# define UTF8_MAXBYTES UTF8_MAXLEN +#endif +#ifndef CPERLscope +# define CPERLscope(x) x +#endif +#ifndef PERL_HASH +# define PERL_HASH(hash,str,len) \ + STMT_START { \ + const char *s_PeRlHaSh = str; \ + I32 i_PeRlHaSh = len; \ + U32 hash_PeRlHaSh = 0; \ + while (i_PeRlHaSh--) \ + hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ + (hash) = hash_PeRlHaSh; \ + } STMT_END +#endif + +#ifndef PERLIO_FUNCS_DECL +# ifdef PERLIO_FUNCS_CONST +# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) +# else +# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (funcs) +# endif +#endif + +/* provide these typedefs for older perls */ +#if (PERL_BCDVERSION < 0x5009003) + +# ifdef ARGSproto +typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); +# else +typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); +# endif + +typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); + +#endif +#ifndef isPSXSPC +# define isPSXSPC(c) (isSPACE(c) || (c) == '\v') +#endif + +#ifndef isBLANK +# define isBLANK(c) ((c) == ' ' || (c) == '\t') +#endif + +#ifdef EBCDIC +#ifndef isALNUMC +# define isALNUMC(c) isalnum(c) +#endif + +#ifndef isASCII +# define isASCII(c) isascii(c) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) iscntrl(c) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) isgraph(c) +#endif + +#ifndef isPRINT +# define isPRINT(c) isprint(c) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) ispunct(c) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) isxdigit(c) +#endif + +#else +# if (PERL_BCDVERSION < 0x5010000) +/* Hint: isPRINT + * The implementation in older perl versions includes all of the + * isSPACE() characters, which is wrong. The version provided by + * Devel::PPPort always overrides a present buggy version. + */ +# undef isPRINT +# endif + +#ifdef HAS_QUAD +# define WIDEST_UTYPE U64TYPE +#else +# define WIDEST_UTYPE U32 +#endif +#ifndef isALNUMC +# define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) +#endif + +#ifndef isASCII +# define isASCII(c) ((WIDEST_UTYPE) (c) <= 127) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) +#endif + +#ifndef isPRINT +# define isPRINT(c) (((c) >= 32 && (c) < 127)) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#endif + +#endif + +/* Until we figure out how to support this in older perls... */ +#if (PERL_BCDVERSION >= 0x5008000) +#ifndef HeUTF8 +# define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ + SvUTF8(HeKEY_sv(he)) : \ + (U32)HeKUTF8(he)) +#endif + +#endif + +#ifndef PERL_SIGNALS_UNSAFE_FLAG + +#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 + +#if (PERL_BCDVERSION < 0x5008000) +# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG +#else +# define D_PPP_PERL_SIGNALS_INIT 0 +#endif + +#if defined(NEED_PL_signals) +static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#elif defined(NEED_PL_signals_GLOBAL) +U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#else +extern U32 DPPP_(my_PL_signals); +#endif +#define PL_signals DPPP_(my_PL_signals) + +#endif + +/* Hint: PL_ppaddr + * Calling an op via PL_ppaddr requires passing a context argument + * for threaded builds. Since the context argument is different for + * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will + * automatically be defined as the correct argument. + */ + +#if (PERL_BCDVERSION <= 0x5005005) +/* Replace: 1 */ +# define PL_ppaddr ppaddr +# define PL_no_modify no_modify +/* Replace: 0 */ +#endif + +#if (PERL_BCDVERSION <= 0x5004005) +/* Replace: 1 */ +# define PL_DBsignal DBsignal +# define PL_DBsingle DBsingle +# define PL_DBsub DBsub +# define PL_DBtrace DBtrace +# define PL_Sv Sv +# define PL_bufend bufend +# define PL_bufptr bufptr +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_debstash debstash +# define PL_defgv defgv +# define PL_diehook diehook +# define PL_dirty dirty +# define PL_dowarn dowarn +# define PL_errgv errgv +# define PL_error_count error_count +# define PL_expect expect +# define PL_hexdigit hexdigit +# define PL_hints hints +# define PL_in_my in_my +# define PL_laststatval laststatval +# define PL_lex_state lex_state +# define PL_lex_stuff lex_stuff +# define PL_linestr linestr +# define PL_na na +# define PL_perl_destruct_level perl_destruct_level +# define PL_perldb perldb +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stack_base stack_base +# define PL_stack_sp stack_sp +# define PL_statcache statcache +# define PL_stdingv stdingv +# define PL_sv_arenaroot sv_arenaroot +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +# define PL_tainted tainted +# define PL_tainting tainting +# define PL_tokenbuf tokenbuf +/* Replace: 0 */ +#endif + +/* Warning: PL_parser + * For perl versions earlier than 5.9.5, this is an always + * non-NULL dummy. Also, it cannot be dereferenced. Don't + * use it if you can avoid is and unless you absolutely know + * what you're doing. + * If you always check that PL_parser is non-NULL, you can + * define DPPP_PL_parser_NO_DUMMY to avoid the creation of + * a dummy parser structure. + */ + +#if (PERL_BCDVERSION >= 0x5009005) +# ifdef DPPP_PL_parser_NO_DUMMY +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (croak("panic: PL_parser == NULL in %s:%d", \ + __FILE__, __LINE__), (yy_parser *) NULL))->var) +# else +# ifdef DPPP_PL_parser_NO_DUMMY_WARNING +# define D_PPP_parser_dummy_warning(var) +# else +# define D_PPP_parser_dummy_warning(var) \ + warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), +# endif +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) +#if defined(NEED_PL_parser) +static yy_parser DPPP_(dummy_PL_parser); +#elif defined(NEED_PL_parser_GLOBAL) +yy_parser DPPP_(dummy_PL_parser); +#else +extern yy_parser DPPP_(dummy_PL_parser); +#endif + +# endif + +/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ +/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf + * Do not use this variable unless you know exactly what you're + * doint. It is internal to the perl parser and may change or even + * be removed in the future. As of perl 5.9.5, you have to check + * for (PL_parser != NULL) for this variable to have any effect. + * An always non-NULL PL_parser dummy is provided for earlier + * perl versions. + * If PL_parser is NULL when you try to access this variable, a + * dummy is being accessed instead and a warning is issued unless + * you define DPPP_PL_parser_NO_DUMMY_WARNING. + * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access + * this variable will croak with a panic message. + */ + +# define PL_expect D_PPP_my_PL_parser_var(expect) +# define PL_copline D_PPP_my_PL_parser_var(copline) +# define PL_rsfp D_PPP_my_PL_parser_var(rsfp) +# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) +# define PL_linestr D_PPP_my_PL_parser_var(linestr) +# define PL_bufptr D_PPP_my_PL_parser_var(bufptr) +# define PL_bufend D_PPP_my_PL_parser_var(bufend) +# define PL_lex_state D_PPP_my_PL_parser_var(lex_state) +# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) +# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) +# define PL_in_my D_PPP_my_PL_parser_var(in_my) +# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) +# define PL_error_count D_PPP_my_PL_parser_var(error_count) + + +#else + +/* ensure that PL_parser != NULL and cannot be dereferenced */ +# define PL_parser ((void *) 1) + +#endif +#ifndef mPUSHs +# define mPUSHs(s) PUSHs(sv_2mortal(s)) +#endif + +#ifndef PUSHmortal +# define PUSHmortal PUSHs(sv_newmortal()) +#endif + +#ifndef mPUSHp +# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) +#endif + +#ifndef mPUSHn +# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) +#endif + +#ifndef mPUSHi +# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) +#endif + +#ifndef mPUSHu +# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) +#endif +#ifndef mXPUSHs +# define mXPUSHs(s) XPUSHs(sv_2mortal(s)) +#endif + +#ifndef XPUSHmortal +# define XPUSHmortal XPUSHs(sv_newmortal()) +#endif + +#ifndef mXPUSHp +# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END +#endif + +#ifndef mXPUSHn +# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END +#endif + +#ifndef mXPUSHi +# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END +#endif + +#ifndef mXPUSHu +# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END +#endif + +/* Replace: 1 */ +#ifndef call_sv +# define call_sv perl_call_sv +#endif + +#ifndef call_pv +# define call_pv perl_call_pv +#endif + +#ifndef call_argv +# define call_argv perl_call_argv +#endif + +#ifndef call_method +# define call_method perl_call_method +#endif +#ifndef eval_sv +# define eval_sv perl_eval_sv +#endif + +/* Replace: 0 */ +#ifndef PERL_LOADMOD_DENY +# define PERL_LOADMOD_DENY 0x1 +#endif + +#ifndef PERL_LOADMOD_NOIMPORT +# define PERL_LOADMOD_NOIMPORT 0x2 +#endif + +#ifndef PERL_LOADMOD_IMPORT_OPS +# define PERL_LOADMOD_IMPORT_OPS 0x4 +#endif + +#ifndef G_METHOD +# define G_METHOD 64 +# ifdef call_sv +# undef call_sv +# endif +# if (PERL_BCDVERSION < 0x5006000) +# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) +# else +# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) +# endif +#endif + +/* Replace perl_eval_pv with eval_pv */ + +#ifndef eval_pv +#if defined(NEED_eval_pv) +static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +static +#else +extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +#endif + +#ifdef eval_pv +# undef eval_pv +#endif +#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) +#define Perl_eval_pv DPPP_(my_eval_pv) + +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + +SV* +DPPP_(my_eval_pv)(char *p, I32 croak_on_error) +{ + dSP; + SV* sv = newSVpv(p, 0); + + PUSHMARK(sp); + eval_sv(sv, G_SCALAR); + SvREFCNT_dec(sv); + + SPAGAIN; + sv = POPs; + PUTBACK; + + if (croak_on_error && SvTRUE(GvSV(errgv))) + croak(SvPVx(GvSV(errgv), na)); + + return sv; +} + +#endif +#endif + +#ifndef vload_module +#if defined(NEED_vload_module) +static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +static +#else +extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +#endif + +#ifdef vload_module +# undef vload_module +#endif +#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) +#define Perl_vload_module DPPP_(my_vload_module) + +#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) + +void +DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) +{ + dTHR; + dVAR; + OP *veop, *imop; + + OP * const modname = newSVOP(OP_CONST, 0, name); + /* 5.005 has a somewhat hacky force_normal that doesn't croak on + SvREADONLY() if PL_compling is true. Current perls take care in + ck_require() to correctly turn off SvREADONLY before calling + force_normal_flags(). This seems a better fix than fudging PL_compling + */ + SvREADONLY_off(((SVOP*)modname)->op_sv); + modname->op_private |= OPpCONST_BARE; + if (ver) { + veop = newSVOP(OP_CONST, 0, ver); + } + else + veop = NULL; + if (flags & PERL_LOADMOD_NOIMPORT) { + imop = sawparens(newNULLLIST()); + } + else if (flags & PERL_LOADMOD_IMPORT_OPS) { + imop = va_arg(*args, OP*); + } + else { + SV *sv; + imop = NULL; + sv = va_arg(*args, SV*); + while (sv) { + imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); + sv = va_arg(*args, SV*); + } + } + { + const line_t ocopline = PL_copline; + COP * const ocurcop = PL_curcop; + const int oexpect = PL_expect; + +#if (PERL_BCDVERSION >= 0x5004000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), + veop, modname, imop); +#elif (PERL_BCDVERSION > 0x5003000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + veop, modname, imop); +#else + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + modname, imop); +#endif + PL_expect = oexpect; + PL_copline = ocopline; + PL_curcop = ocurcop; + } +} + +#endif +#endif + +#ifndef load_module +#if defined(NEED_load_module) +static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +static +#else +extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +#endif + +#ifdef load_module +# undef load_module +#endif +#define load_module DPPP_(my_load_module) +#define Perl_load_module DPPP_(my_load_module) + +#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) + +void +DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) +{ + va_list args; + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); +} + +#endif +#endif +#ifndef newRV_inc +# define newRV_inc(sv) newRV(sv) /* Replace */ +#endif + +#ifndef newRV_noinc +#if defined(NEED_newRV_noinc) +static SV * DPPP_(my_newRV_noinc)(SV *sv); +static +#else +extern SV * DPPP_(my_newRV_noinc)(SV *sv); +#endif + +#ifdef newRV_noinc +# undef newRV_noinc +#endif +#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) +#define Perl_newRV_noinc DPPP_(my_newRV_noinc) + +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) +SV * +DPPP_(my_newRV_noinc)(SV *sv) +{ + SV *rv = (SV *)newRV(sv); + SvREFCNT_dec(sv); + return rv; +} +#endif +#endif + +/* Hint: newCONSTSUB + * Returns a CV* as of perl-5.7.1. This return value is not supported + * by Devel::PPPort. + */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) +#if defined(NEED_newCONSTSUB) +static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +static +#else +extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +#endif + +#ifdef newCONSTSUB +# undef newCONSTSUB +#endif +#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) +#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + +/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ +/* (There's no PL_parser in perl < 5.005, so this is completely safe) */ +#define D_PPP_PL_copline PL_copline + +void +DPPP_(my_newCONSTSUB)(HV *stash, const 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 = D_PPP_PL_copline; + + PL_hints &= ~HINT_BLOCK_SCOPE; + if (stash) + PL_curstash = PL_curcop->cop_stash = stash; + + newSUB( + +#if (PERL_BCDVERSION < 0x5003022) + start_subparse(), +#elif (PERL_BCDVERSION == 0x5003022) + start_subparse(0), +#else /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +#endif + + newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), + newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ + newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) + ); + + PL_hints = oldhints; + PL_curcop->cop_stash = old_cop_stash; + PL_curstash = old_curstash; + PL_curcop->cop_line = oldline; +} +#endif +#endif + +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ + defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) + +#ifndef START_MY_CXT + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +#if (PERL_BCDVERSION < 0x5004068) +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) +#else /* >= perl5.004_68 */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) +#endif /* < perl5.004_68 */ + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +/* Clones the per-interpreter data. */ +#define MY_CXT_CLONE \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) +#endif + +#else /* single interpreter */ + +#ifndef START_MY_CXT + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +#define MY_CXT_CLONE NOOP +#endif + +#endif + +#ifndef IVdf +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# define UVuf "lu" +# define UVof "lo" +# define UVxf "lx" +# define UVXf "lX" +# elif IVSIZE == INTSIZE +# define IVdf "d" +# define UVuf "u" +# define UVof "o" +# define UVxf "x" +# define UVXf "X" +# else +# error "cannot define IV/UV formats" +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) + /* Not very likely, but let's try anyway. */ +# define NVef PERL_PRIeldbl +# define NVff PERL_PRIfldbl +# define NVgf PERL_PRIgldbl +# else +# define NVef "e" +# define NVff "f" +# define NVgf "g" +# endif +#endif + +#ifndef SvREFCNT_inc +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (SvREFCNT(_sv))++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc(sv) \ + ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_simple +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_simple(sv) \ + ({ \ + if (sv) \ + (SvREFCNT(sv))++; \ + (SV *)(sv); \ + }) +# else +# define SvREFCNT_inc_simple(sv) \ + ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_NN +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_NN(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + SvREFCNT(_sv)++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc_NN(sv) \ + (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) +# endif +#endif + +#ifndef SvREFCNT_inc_void +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_void(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (void)(SvREFCNT(_sv)++); \ + }) +# else +# define SvREFCNT_inc_void(sv) \ + (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) +# endif +#endif +#ifndef SvREFCNT_inc_simple_void +# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#endif + +#ifndef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) +#endif + +#ifndef SvREFCNT_inc_void_NN +# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef newSV_type + +#if defined(NEED_newSV_type) +static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +static +#else +extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +#endif + +#ifdef newSV_type +# undef newSV_type +#endif +#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) +#define Perl_newSV_type DPPP_(my_newSV_type) + +#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) + +SV* +DPPP_(my_newSV_type)(pTHX_ svtype const t) +{ + SV* const sv = newSV(0); + sv_upgrade(sv, t); + return sv; +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# define D_PPP_CONSTPV_ARG(x) ((char *) (x)) +#else +# define D_PPP_CONSTPV_ARG(x) (x) +#endif +#ifndef newSVpvn +# define newSVpvn(data,len) ((data) \ + ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ + : newSV(0)) +#endif +#ifndef newSVpvn_utf8 +# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) +#endif +#ifndef SVf_UTF8 +# define SVf_UTF8 0 +#endif + +#ifndef newSVpvn_flags + +#if defined(NEED_newSVpvn_flags) +static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +static +#else +extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +#endif + +#ifdef newSVpvn_flags +# undef newSVpvn_flags +#endif +#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) +#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) + +#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) + +SV * +DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) +{ + SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); + SvFLAGS(sv) |= (flags & SVf_UTF8); + return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; +} + +#endif + +#endif + +/* Backwards compatibility stuff... :-( */ +#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) +# define NEED_sv_2pv_flags +#endif +#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) +# define NEED_sv_2pv_flags_GLOBAL +#endif + +/* Hint: sv_2pv_nolen + * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). + */ +#ifndef sv_2pv_nolen +# define sv_2pv_nolen(sv) SvPV_nolen(sv) +#endif + +#ifdef SvPVbyte + +/* Hint: SvPVbyte + * Does not work in perl-5.6.1, ppport.h implements a version + * borrowed from perl-5.7.3. + */ + +#if (PERL_BCDVERSION < 0x5007000) + +#if defined(NEED_sv_2pvbyte) +static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +static +#else +extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +#endif + +#ifdef sv_2pvbyte +# undef sv_2pvbyte +#endif +#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) +#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) + +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + +char * +DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) +{ + sv_utf8_downgrade(sv,0); + return SvPV(sv,*lp); +} + +#endif + +/* Hint: sv_2pvbyte + * Use the SvPVbyte() macro instead of sv_2pvbyte(). + */ + +#undef SvPVbyte + +#define SvPVbyte(sv, lp) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + +#endif + +#else + +# define SvPVbyte SvPV +# define sv_2pvbyte sv_2pv + +#endif +#ifndef sv_2pvbyte_nolen +# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) +#endif + +/* Hint: sv_pvn + * Always use the SvPV() macro instead of sv_pvn(). + */ + +/* Hint: sv_pvn_force + * Always use the SvPV_force() macro instead of sv_pvn_force(). + */ + +/* If these are undefined, they're not handled by the core anyway */ +#ifndef SV_IMMEDIATE_UNREF +# define SV_IMMEDIATE_UNREF 0 +#endif + +#ifndef SV_GMAGIC +# define SV_GMAGIC 0 +#endif + +#ifndef SV_COW_DROP_PV +# define SV_COW_DROP_PV 0 +#endif + +#ifndef SV_UTF8_NO_ENCODING +# define SV_UTF8_NO_ENCODING 0 +#endif + +#ifndef SV_NOSTEAL +# define SV_NOSTEAL 0 +#endif + +#ifndef SV_CONST_RETURN +# define SV_CONST_RETURN 0 +#endif + +#ifndef SV_MUTABLE_RETURN +# define SV_MUTABLE_RETURN 0 +#endif + +#ifndef SV_SMAGIC +# define SV_SMAGIC 0 +#endif + +#ifndef SV_HAS_TRAILING_NUL +# define SV_HAS_TRAILING_NUL 0 +#endif + +#ifndef SV_COW_SHARED_HASH_KEYS +# define SV_COW_SHARED_HASH_KEYS 0 +#endif + +#if (PERL_BCDVERSION < 0x5007002) + +#if defined(NEED_sv_2pv_flags) +static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_2pv_flags +# undef sv_2pv_flags +#endif +#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) +#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) + +#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) + +char * +DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_2pv(sv, lp ? lp : &n_a); +} + +#endif + +#if defined(NEED_sv_pvn_force_flags) +static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_pvn_force_flags +# undef sv_pvn_force_flags +#endif +#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) +#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) + +#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) + +char * +DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_pvn_force(sv, lp ? lp : &n_a); +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) +# define DPPP_SVPV_NOLEN_LP_ARG &PL_na +#else +# define DPPP_SVPV_NOLEN_LP_ARG 0 +#endif +#ifndef SvPV_const +# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_mutable +# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) +#endif +#ifndef SvPV_flags +# define SvPV_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_flags_const +# define SvPV_flags_const(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ + (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_const_nolen +# define SvPV_flags_const_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : \ + (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_mutable +# define SvPV_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ + sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_force +# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nolen +# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) +#endif + +#ifndef SvPV_force_mutable +# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nomg +# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) +#endif + +#ifndef SvPV_force_nomg_nolen +# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) +#endif +#ifndef SvPV_force_flags +# define SvPV_force_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_force_flags_nolen +# define SvPV_force_flags_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) +#endif +#ifndef SvPV_force_flags_mutable +# define SvPV_force_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ + : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_nolen +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) +#endif +#ifndef SvPV_nolen_const +# define SvPV_nolen_const(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) +#endif +#ifndef SvPV_nomg +# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const +# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const_nolen +# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) +#endif + +#ifndef SvPV_nomg_nolen +# define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, 0)) +#endif +#ifndef SvPV_renew +# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ + SvPV_set((sv), (char *) saferealloc( \ + (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ + } STMT_END +#endif +#ifndef SvMAGIC_set +# define SvMAGIC_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5009003) +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) (0 + SvPVX(sv)) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END +#endif + +#else +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + ((sv)->sv_u.svu_rv = (val)); } STMT_END +#endif + +#endif +#ifndef SvSTASH_set +# define SvSTASH_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5004000) +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END +#endif + +#else +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END +#endif + +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) +#if defined(NEED_vnewSVpvf) +static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +static +#else +extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +#endif + +#ifdef vnewSVpvf +# undef vnewSVpvf +#endif +#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) +#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) + +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + +SV * +DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) +{ + register SV *sv = newSV(0); + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); + return sv; +} + +#endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) +# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) +# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) +#if defined(NEED_sv_catpvf_mg) +static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) + +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) +#if defined(NEED_sv_catpvf_mg_nocontext) +static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) +#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) + +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ +#ifndef sv_catpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# else +# define sv_catpvf_mg Perl_sv_catpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) +# define sv_vcatpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) +#if defined(NEED_sv_setpvf_mg) +static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) + +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) +#if defined(NEED_sv_setpvf_mg_nocontext) +static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) +#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) + +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ +#ifndef sv_setpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# else +# define sv_setpvf_mg Perl_sv_setpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) +# define sv_vsetpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +/* Hint: newSVpvn_share + * The SVs created by this function only mimic the behaviour of + * shared PVs without really being shared. Only use if you know + * what you're doing. + */ + +#ifndef newSVpvn_share + +#if defined(NEED_newSVpvn_share) +static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +static +#else +extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +#endif + +#ifdef newSVpvn_share +# undef newSVpvn_share +#endif +#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) +#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) + +#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) + +SV * +DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) +{ + SV *sv; + if (len < 0) + len = -len; + if (!hash) + PERL_HASH(hash, (char*) src, len); + sv = newSVpvn((char *) src, len); + sv_upgrade(sv, SVt_PVIV); + SvIVX(sv) = hash; + SvREADONLY_on(sv); + SvPOK_on(sv); + return sv; +} + +#endif + +#endif +#ifndef SvSHARED_HASH +# define SvSHARED_HASH(sv) (0 + SvUVX(sv)) +#endif +#ifndef HvNAME_get +# define HvNAME_get(hv) HvNAME(hv) +#endif +#ifndef HvNAMELEN_get +# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) +#endif +#ifndef GvSVn +# define GvSVn(gv) GvSV(gv) +#endif + +#ifndef isGV_with_GP +# define isGV_with_GP(gv) isGV(gv) +#endif + +#ifndef gv_fetchpvn_flags +# define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt) +#endif + +#ifndef gv_fetchsv +# define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) +#endif +#ifndef get_cvn_flags +# define get_cvn_flags(name, namelen, flags) get_cv(name, flags) +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#define Perl_warner DPPP_(my_warner) + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +/* concatenating with "" ensures that only literal strings are accepted as argument + * note that STR_WITH_LEN() can't be used as argument to macros or functions that + * under some configurations might be macros + */ +#ifndef STR_WITH_LEN +# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) +#endif +#ifndef newSVpvs +# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) +#endif + +#ifndef newSVpvs_flags +# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) +#endif + +#ifndef newSVpvs_share +# define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) +#endif + +#ifndef sv_catpvs +# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef sv_setpvs +# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef hv_fetchs +# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) +#endif + +#ifndef hv_stores +# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) +#endif +#ifndef gv_fetchpvs +# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) +#endif + +#ifndef gv_stashpvs +# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) +#endif +#ifndef get_cvs +# define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) +#endif +#ifndef SvGETMAGIC +# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END +#endif + +/* Some random bits for sv_unmagicext. These should probably be pulled in for + real and organized at some point */ +#ifndef HEf_SVKEY +# define HEf_SVKEY -2 +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +# define MUTABLE_PTR(p) ({ void *_p = (p); _p; }) +#else +# define MUTABLE_PTR(p) ((void *) (p)) +#endif + +#define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) + +/* end of random bits */ +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +/* That's the best we can do... */ +#ifndef sv_catpvn_nomg +# define sv_catpvn_nomg sv_catpvn +#endif + +#ifndef sv_catsv_nomg +# define sv_catsv_nomg sv_catsv +#endif + +#ifndef sv_setsv_nomg +# define sv_setsv_nomg sv_setsv +#endif + +#ifndef sv_pvn_nomg +# define sv_pvn_nomg sv_pvn +#endif + +#ifndef SvIV_nomg +# define SvIV_nomg SvIV +#endif + +#ifndef SvUV_nomg +# define SvUV_nomg SvUV +#endif + +#ifndef sv_catpv_mg +# define sv_catpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catpvn_mg +# define sv_catpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catsv_mg +# define sv_catsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_catsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setiv_mg +# define sv_setiv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setiv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setnv_mg +# define sv_setnv_mg(sv, num) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setnv(TeMpSv,num); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpv_mg +# define sv_setpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpvn_mg +# define sv_setpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setsv_mg +# define sv_setsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_setsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setuv_mg +# define sv_setuv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setuv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_usepvn_mg +# define sv_usepvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_usepvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif +#ifndef SvVSTRING_mg +# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) +#endif + +/* Hint: sv_magic_portable + * This is a compatibility function that is only available with + * Devel::PPPort. It is NOT in the perl core. + * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when + * it is being passed a name pointer with namlen == 0. In that + * case, perl 5.8.0 and later store the pointer, not a copy of it. + * The compatibility can be provided back to perl 5.004. With + * earlier versions, the code will not compile. + */ + +#if (PERL_BCDVERSION < 0x5004000) + + /* code that uses sv_magic_portable will not compile */ + +#elif (PERL_BCDVERSION < 0x5008000) + +# define sv_magic_portable(sv, obj, how, name, namlen) \ + STMT_START { \ + SV *SvMp_sv = (sv); \ + char *SvMp_name = (char *) (name); \ + I32 SvMp_namlen = (namlen); \ + if (SvMp_name && SvMp_namlen == 0) \ + { \ + MAGIC *mg; \ + sv_magic(SvMp_sv, obj, how, 0, 0); \ + mg = SvMAGIC(SvMp_sv); \ + mg->mg_len = -42; /* XXX: this is the tricky part */ \ + mg->mg_ptr = SvMp_name; \ + } \ + else \ + { \ + sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ + } \ + } STMT_END + +#else + +# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) + +#endif + +#if !defined(mg_findext) +#if defined(NEED_mg_findext) +static MAGIC * DPPP_(my_mg_findext)(pTHX_ SV * sv, int type, const MGVTBL *vtbl); +static +#else +extern MAGIC * DPPP_(my_mg_findext)(pTHX_ SV * sv, int type, const MGVTBL *vtbl); +#endif + +#ifdef mg_findext +# undef mg_findext +#endif +#define mg_findext(a,b,c) DPPP_(my_mg_findext)(aTHX_ a,b,c) +#define Perl_mg_findext DPPP_(my_mg_findext) + +#if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL) + +MAGIC * +DPPP_(my_mg_findext)(pTHX_ SV * sv, int type, const MGVTBL *vtbl) { + if (sv) { + MAGIC *mg; + +#ifdef AvPAD_NAMELIST + assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv))); +#endif + + for (mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) { + if (mg->mg_type == type && mg->mg_virtual == vtbl) + return mg; + } + } + + return NULL; +} + +#endif +#endif + +#if !defined(sv_unmagicext) +#if defined(NEED_sv_unmagicext) +static int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); +static +#else +extern int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); +#endif + +#ifdef sv_unmagicext +# undef sv_unmagicext +#endif +#define sv_unmagicext(a,b,c) DPPP_(my_sv_unmagicext)(aTHX_ a,b,c) +#define Perl_sv_unmagicext DPPP_(my_sv_unmagicext) + +#if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL) + +int +DPPP_(my_sv_unmagicext)(pTHX_ SV *const sv, const int type, MGVTBL *vtbl) +{ + MAGIC* mg; + MAGIC** mgp; + + if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv)) + return 0; + mgp = &(SvMAGIC(sv)); + for (mg = *mgp; mg; mg = *mgp) { + const MGVTBL* const virt = mg->mg_virtual; + if (mg->mg_type == type && virt == vtbl) { + *mgp = mg->mg_moremagic; + if (virt && virt->svt_free) + virt->svt_free(aTHX_ sv, mg); + if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) { + if (mg->mg_len > 0) + Safefree(mg->mg_ptr); + else if (mg->mg_len == HEf_SVKEY) /* Questionable on older perls... */ + SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr)); + else if (mg->mg_type == PERL_MAGIC_utf8) + Safefree(mg->mg_ptr); + } + if (mg->mg_flags & MGf_REFCOUNTED) + SvREFCNT_dec(mg->mg_obj); + Safefree(mg); + } + else + mgp = &mg->mg_moremagic; + } + if (SvMAGIC(sv)) { + if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */ + mg_magical(sv); /* else fix the flags now */ + } + else { + SvMAGICAL_off(sv); + SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; + } + return 0; +} + +#endif +#endif + +#ifdef USE_ITHREADS +#ifndef CopFILE +# define CopFILE(c) ((c)->cop_file) +#endif + +#ifndef CopFILEGV +# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) ((c)->cop_stashpv) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ + || (CopSTASHPV(c) && HvNAME(hv) \ + && strEQ(CopSTASHPV(c), HvNAME(hv))))) +#endif + +#else +#ifndef CopFILEGV +# define CopFILEGV(c) ((c)->cop_filegv) +#endif + +#ifndef CopFILEGV_set +# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) +#endif + +#ifndef CopFILE +# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) ((c)->cop_stash) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) +#endif + +#endif /* USE_ITHREADS */ + +#if (PERL_BCDVERSION >= 0x5006000) +#ifndef caller_cx + +# if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) +static I32 +DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) +{ + I32 i; + + for (i = startingblock; i >= 0; i--) { + register const PERL_CONTEXT * const cx = &cxstk[i]; + switch (CxTYPE(cx)) { + default: + continue; + case CXt_EVAL: + case CXt_SUB: + case CXt_FORMAT: + return i; + } + } + return i; +} +# endif + +# if defined(NEED_caller_cx) +static const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); +static +#else +extern const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); +#endif + +#ifdef caller_cx +# undef caller_cx +#endif +#define caller_cx(a,b) DPPP_(my_caller_cx)(aTHX_ a,b) +#define Perl_caller_cx DPPP_(my_caller_cx) + +#if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) + +const PERL_CONTEXT * +DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp) +{ + register I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix); + register const PERL_CONTEXT *cx; + register const PERL_CONTEXT *ccstack = cxstack; + const PERL_SI *top_si = PL_curstackinfo; + + for (;;) { + /* we may be in a higher stacklevel, so dig down deeper */ + while (cxix < 0 && top_si->si_type != PERLSI_MAIN) { + top_si = top_si->si_prev; + ccstack = top_si->si_cxstack; + cxix = DPPP_dopoptosub_at(ccstack, top_si->si_cxix); + } + if (cxix < 0) + return NULL; + /* caller() should not report the automatic calls to &DB::sub */ + if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 && + ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub)) + count++; + if (!count--) + break; + cxix = DPPP_dopoptosub_at(ccstack, cxix - 1); + } + + cx = &ccstack[cxix]; + if (dbcxp) *dbcxp = cx; + + if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) { + const I32 dbcxix = DPPP_dopoptosub_at(ccstack, cxix - 1); + /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the + field below is defined for any cx. */ + /* caller() should not report the automatic calls to &DB::sub */ + if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) + cx = &ccstack[dbcxix]; + } + + return cx; +} + +# endif +#endif /* caller_cx */ +#endif /* 5.6.0 */ +#ifndef IN_PERL_COMPILETIME +# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) +#endif + +#ifndef IN_LOCALE_RUNTIME +# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE_COMPILETIME +# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE +# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) +#endif +#ifndef IS_NUMBER_IN_UV +# define IS_NUMBER_IN_UV 0x01 +#endif + +#ifndef IS_NUMBER_GREATER_THAN_UV_MAX +# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef IS_NUMBER_NOT_INT +# define IS_NUMBER_NOT_INT 0x04 +#endif + +#ifndef IS_NUMBER_NEG +# define IS_NUMBER_NEG 0x08 +#endif + +#ifndef IS_NUMBER_INFINITY +# define IS_NUMBER_INFINITY 0x10 +#endif + +#ifndef IS_NUMBER_NAN +# define IS_NUMBER_NAN 0x20 +#endif +#ifndef GROK_NUMERIC_RADIX +# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +#endif +#ifndef PERL_SCAN_GREATER_THAN_UV_MAX +# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef PERL_SCAN_SILENT_ILLDIGIT +# define PERL_SCAN_SILENT_ILLDIGIT 0x04 +#endif + +#ifndef PERL_SCAN_ALLOW_UNDERSCORES +# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 +#endif + +#ifndef PERL_SCAN_DISALLOW_PREFIX +# define PERL_SCAN_DISALLOW_PREFIX 0x02 +#endif + +#ifndef grok_numeric_radix +#if defined(NEED_grok_numeric_radix) +static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +static +#else +extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +#endif + +#ifdef grok_numeric_radix +# undef grok_numeric_radix +#endif +#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) +#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) + +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) +bool +DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) +{ +#ifdef USE_LOCALE_NUMERIC +#ifdef PL_numeric_radix_sv + if (PL_numeric_radix_sv && IN_LOCALE) { + STRLEN len; + char* radix = SvPV(PL_numeric_radix_sv, len); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#else + /* older perls don't have PL_numeric_radix_sv so the radix + * must manually be requested from locale.h + */ +#include + dTHR; /* needed for older threaded perls */ + struct lconv *lc = localeconv(); + char *radix = lc->decimal_point; + if (radix && IN_LOCALE) { + STRLEN len = strlen(radix); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#endif +#endif /* USE_LOCALE_NUMERIC */ + /* always try "." if numeric radix didn't match because + * we may have data from different locales mixed */ + if (*sp < send && **sp == '.') { + ++*sp; + return TRUE; + } + return FALSE; +} +#endif +#endif + +#ifndef grok_number +#if defined(NEED_grok_number) +static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +static +#else +extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +#endif + +#ifdef grok_number +# undef grok_number +#endif +#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) +#define Perl_grok_number DPPP_(my_grok_number) + +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) +int +DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) +{ + const char *s = pv; + const char *send = pv + len; + const UV max_div_10 = UV_MAX / 10; + const char max_mod_10 = UV_MAX % 10; + int numtype = 0; + int sawinf = 0; + int sawnan = 0; + + while (s < send && isSPACE(*s)) + s++; + if (s == send) { + return 0; + } else if (*s == '-') { + s++; + numtype = IS_NUMBER_NEG; + } + else if (*s == '+') + s++; + + if (s == send) + return 0; + + /* next must be digit or the radix separator or beginning of infinity */ + if (isDIGIT(*s)) { + /* UVs are at least 32 bits, so the first 9 decimal digits cannot + overflow. */ + UV value = *s - '0'; + /* This construction seems to be more optimiser friendly. + (without it gcc does the isDIGIT test and the *s - '0' separately) + With it gcc on arm is managing 6 instructions (6 cycles) per digit. + In theory the optimiser could deduce how far to unroll the loop + before checking for overflow. */ + if (++s < send) { + int digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + /* Now got 9 digits, so need to check + each time for overflow. */ + digit = *s - '0'; + while (digit >= 0 && digit <= 9 + && (value < max_div_10 + || (value == max_div_10 + && digit <= max_mod_10))) { + value = value * 10 + digit; + if (++s < send) + digit = *s - '0'; + else + break; + } + if (digit >= 0 && digit <= 9 + && (s < send)) { + /* value overflowed. + skip the remaining digits, don't + worry about setting *valuep. */ + do { + s++; + } while (s < send && isDIGIT(*s)); + numtype |= + IS_NUMBER_GREATER_THAN_UV_MAX; + goto skip_value; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + numtype |= IS_NUMBER_IN_UV; + if (valuep) + *valuep = value; + + skip_value: + if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT; + while (s < send && isDIGIT(*s)) /* optional digits after the radix */ + s++; + } + } + else if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ + /* no digits before the radix means we need digits after it */ + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + if (valuep) { + /* integer approximation is valid - it's 0. */ + *valuep = 0; + } + } + else + return 0; + } else if (*s == 'I' || *s == 'i') { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; + s++; if (s < send && (*s == 'I' || *s == 'i')) { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; + s++; if (s == send || (*s != 'T' && *s != 't')) return 0; + s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; + s++; + } + sawinf = 1; + } else if (*s == 'N' || *s == 'n') { + /* XXX TODO: There are signaling NaNs and quiet NaNs. */ + s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; + sawnan = 1; + } else + return 0; + + if (sawinf) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; + } else if (sawnan) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; + } else if (s < send) { + /* we can have an optional exponent part */ + if (*s == 'e' || *s == 'E') { + /* The only flag we keep is sign. Blow away any "it's UV" */ + numtype &= IS_NUMBER_NEG; + numtype |= IS_NUMBER_NOT_INT; + s++; + if (s < send && (*s == '-' || *s == '+')) + s++; + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + } + else + return 0; + } + } + while (s < send && isSPACE(*s)) + s++; + if (s >= send) + return numtype; + if (len == 10 && memEQ(pv, "0 but true", 10)) { + if (valuep) + *valuep = 0; + return IS_NUMBER_IN_UV; + } + return 0; +} +#endif +#endif + +/* + * The grok_* routines have been modified to use warn() instead of + * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, + * which is why the stack variable has been renamed to 'xdigit'. + */ + +#ifndef grok_bin +#if defined(NEED_grok_bin) +static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_bin +# undef grok_bin +#endif +#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) +#define Perl_grok_bin DPPP_(my_grok_bin) + +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) +UV +DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_2 = UV_MAX / 2; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading b or 0b. + for compatibility silently suffer "b" and "0b" as valid binary + numbers. */ + if (len >= 1) { + if (s[0] == 'b') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'b') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + char bit = *s; + if (bit == '0' || bit == '1') { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_bin. */ + redo: + if (!overflowed) { + if (value <= max_div_2) { + value = (value << 1) | (bit - '0'); + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in binary number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 2.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount. */ + value_nv += (NV)(bit - '0'); + continue; + } + if (bit == '_' && len && allow_underscores && (bit = s[1]) + && (bit == '0' || bit == '1')) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal binary digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Binary number > 0b11111111111111111111111111111111 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_hex +#if defined(NEED_grok_hex) +static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_hex +# undef grok_hex +#endif +#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) +#define Perl_grok_hex DPPP_(my_grok_hex) + +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) +UV +DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_16 = UV_MAX / 16; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + const char *xdigit; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading x or 0x. + for compatibility silently suffer "x" and "0x" as valid hex numbers. + */ + if (len >= 1) { + if (s[0] == 'x') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'x') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + xdigit = strchr((char *) PL_hexdigit, *s); + if (xdigit) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_hex. */ + redo: + if (!overflowed) { + if (value <= max_div_16) { + value = (value << 4) | ((xdigit - PL_hexdigit) & 15); + continue; + } + warn("Integer overflow in hexadecimal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 16.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 16-tuples. */ + value_nv += (NV)((xdigit - PL_hexdigit) & 15); + continue; + } + if (*s == '_' && len && allow_underscores && s[1] + && (xdigit = strchr((char *) PL_hexdigit, s[1]))) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal hexadecimal digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Hexadecimal number > 0xffffffff non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_oct +#if defined(NEED_grok_oct) +static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_oct +# undef grok_oct +#endif +#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) +#define Perl_grok_oct DPPP_(my_grok_oct) + +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) +UV +DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_8 = UV_MAX / 8; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + for (; len-- && *s; s++) { + /* gcc 2.95 optimiser not smart enough to figure that this subtraction + out front allows slicker code. */ + int digit = *s - '0'; + if (digit >= 0 && digit <= 7) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + */ + redo: + if (!overflowed) { + if (value <= max_div_8) { + value = (value << 3) | digit; + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in octal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 8.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 8-tuples. */ + value_nv += (NV)digit; + continue; + } + if (digit == ('_' - '0') && len && allow_underscores + && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) + { + --len; + ++s; + goto redo; + } + /* Allow \octal to work the DWIM way (that is, stop scanning + * as soon as non-octal characters are seen, complain only iff + * someone seems to want to use the digits eight and nine). */ + if (digit == 8 || digit == 9) { + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal octal digit '%c' ignored", *s); + } + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Octal number > 037777777777 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#if !defined(my_snprintf) +#if defined(NEED_my_snprintf) +static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +static +#else +extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +#endif + +#define my_snprintf DPPP_(my_my_snprintf) +#define Perl_my_snprintf DPPP_(my_my_snprintf) + +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + +int +DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) +{ + dTHX; + int retval; + va_list ap; + va_start(ap, format); +#ifdef HAS_VSNPRINTF + retval = vsnprintf(buffer, len, format, ap); +#else + retval = vsprintf(buffer, format, ap); +#endif + va_end(ap); + if (retval < 0 || (len > 0 && (Size_t)retval >= len)) + Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); + return retval; +} + +#endif +#endif + +#if !defined(my_sprintf) +#if defined(NEED_my_sprintf) +static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +static +#else +extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +#endif + +#define my_sprintf DPPP_(my_my_sprintf) +#define Perl_my_sprintf DPPP_(my_my_sprintf) + +#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) + +int +DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) +{ + va_list args; + va_start(args, pat); + vsprintf(buffer, pat, args); + va_end(args); + return strlen(buffer); +} + +#endif +#endif + +#ifdef NO_XSLOCKS +# ifdef dJMPENV +# define dXCPT dJMPENV; int rEtV = 0 +# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) +# define XCPT_TRY_END JMPENV_POP; +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW JMPENV_JUMP(rEtV) +# else +# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 +# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) +# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW Siglongjmp(top_env, rEtV) +# endif +#endif + +#if !defined(my_strlcat) +#if defined(NEED_my_strlcat) +static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcat DPPP_(my_my_strlcat) +#define Perl_my_strlcat DPPP_(my_my_strlcat) + +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + +Size_t +DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif +#endif + +#if !defined(my_strlcpy) +#if defined(NEED_my_strlcpy) +static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcpy DPPP_(my_my_strlcpy) +#define Perl_my_strlcpy DPPP_(my_my_strlcpy) + +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + +Size_t +DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} + +#endif +#endif +#ifndef PERL_PV_ESCAPE_QUOTE +# define PERL_PV_ESCAPE_QUOTE 0x0001 +#endif + +#ifndef PERL_PV_PRETTY_QUOTE +# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_ELLIPSES +# define PERL_PV_PRETTY_ELLIPSES 0x0002 +#endif + +#ifndef PERL_PV_PRETTY_LTGT +# define PERL_PV_PRETTY_LTGT 0x0004 +#endif + +#ifndef PERL_PV_ESCAPE_FIRSTCHAR +# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 +#endif + +#ifndef PERL_PV_ESCAPE_UNI +# define PERL_PV_ESCAPE_UNI 0x0100 +#endif + +#ifndef PERL_PV_ESCAPE_UNI_DETECT +# define PERL_PV_ESCAPE_UNI_DETECT 0x0200 +#endif + +#ifndef PERL_PV_ESCAPE_ALL +# define PERL_PV_ESCAPE_ALL 0x1000 +#endif + +#ifndef PERL_PV_ESCAPE_NOBACKSLASH +# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 +#endif + +#ifndef PERL_PV_ESCAPE_NOCLEAR +# define PERL_PV_ESCAPE_NOCLEAR 0x4000 +#endif + +#ifndef PERL_PV_ESCAPE_RE +# define PERL_PV_ESCAPE_RE 0x8000 +#endif + +#ifndef PERL_PV_PRETTY_NOCLEAR +# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR +#endif +#ifndef PERL_PV_PRETTY_DUMP +# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_REGPROP +# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE +#endif + +/* Hint: pv_escape + * Note that unicode functionality is only backported to + * those perl versions that support it. For older perl + * versions, the implementation will fall back to bytes. + */ + +#ifndef pv_escape +#if defined(NEED_pv_escape) +static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +static +#else +extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +#endif + +#ifdef pv_escape +# undef pv_escape +#endif +#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) +#define Perl_pv_escape DPPP_(my_pv_escape) + +#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) + +char * +DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, + const STRLEN count, const STRLEN max, + STRLEN * const escaped, const U32 flags) +{ + const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; + const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; + char octbuf[32] = "%123456789ABCDF"; + STRLEN wrote = 0; + STRLEN chsize = 0; + STRLEN readsize = 1; +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; +#endif + const char *pv = str; + const char * const end = pv + count; + octbuf[0] = esc; + + if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) + sv_setpvs(dsv, ""); + +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) + isuni = 1; +#endif + + for (; pv < end && (!max || wrote < max) ; pv += readsize) { + const UV u = +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + isuni ? utf8_to_uvchr((U8*)pv, &readsize) : +#endif + (U8)*pv; + const U8 c = (U8)u & 0xFF; + + if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + chsize = my_snprintf(octbuf, sizeof octbuf, + "%" UVxf, u); + else + chsize = my_snprintf(octbuf, sizeof octbuf, + "%cx{%" UVxf "}", esc, u); + } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { + chsize = 1; + } else { + if (c == dq || c == esc || !isPRINT(c)) { + chsize = 2; + switch (c) { + case '\\' : /* fallthrough */ + case '%' : if (c == esc) + octbuf[1] = esc; + else + chsize = 1; + break; + case '\v' : octbuf[1] = 'v'; break; + case '\t' : octbuf[1] = 't'; break; + case '\r' : octbuf[1] = 'r'; break; + case '\n' : octbuf[1] = 'n'; break; + case '\f' : octbuf[1] = 'f'; break; + case '"' : if (dq == '"') + octbuf[1] = '"'; + else + chsize = 1; + break; + default: chsize = my_snprintf(octbuf, sizeof octbuf, + pv < end && isDIGIT((U8)*(pv+readsize)) + ? "%c%03o" : "%c%o", esc, c); + } + } else { + chsize = 1; + } + } + if (max && wrote + chsize > max) { + break; + } else if (chsize > 1) { + sv_catpvn(dsv, octbuf, chsize); + wrote += chsize; + } else { + char tmp[2]; + my_snprintf(tmp, sizeof tmp, "%c", c); + sv_catpvn(dsv, tmp, 1); + wrote++; + } + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + break; + } + if (escaped != NULL) + *escaped= pv - str; + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_pretty +#if defined(NEED_pv_pretty) +static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +static +#else +extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +#endif + +#ifdef pv_pretty +# undef pv_pretty +#endif +#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) +#define Perl_pv_pretty DPPP_(my_pv_pretty) + +#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) + +char * +DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, + const STRLEN max, char const * const start_color, char const * const end_color, + const U32 flags) +{ + const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; + STRLEN escaped; + + if (!(flags & PERL_PV_PRETTY_NOCLEAR)) + sv_setpvs(dsv, ""); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, "<"); + + if (start_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); + + pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); + + if (end_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, ">"); + + if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) + sv_catpvs(dsv, "..."); + + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_display +#if defined(NEED_pv_display) +static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +static +#else +extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +#endif + +#ifdef pv_display +# undef pv_display +#endif +#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) +#define Perl_pv_display DPPP_(my_pv_display) + +#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) + +char * +DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) +{ + pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); + if (len > cur && pv[cur] == '\0') + sv_catpvs(dsv, "\\0"); + return SvPVX(dsv); +} + +#endif +#endif + +#endif /* _P_P_PORTABILITY_H_ */ + +/* End of File ppport.h */ diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t b/fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t new file mode 100644 index 0000000..fb89a40 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t @@ -0,0 +1,1657 @@ +#!./perl -w + +use warnings; +use strict; +use Config; + +BEGIN { + if(-d "lib" && -f "TEST") { + if ($Config{'extensions'} !~ /\bDB_File\b/ ) { + print "1..0 # Skip: DB_File was not built\n"; + exit 0; + } + } +} + +BEGIN +{ + if ($^O eq 'darwin' + && (split(/\./, $Config{osvers}))[0] < 7 # Mac OS X 10.3 == Darwin 7 + && $Config{db_version_major} == 1 + && $Config{db_version_minor} == 0 + && $Config{db_version_patch} == 0) { + warn < @b ? @b : @a) ; + my $i = 0 ; + + foreach $i ( 0 .. $len -1) { + return $a[$i] - $b[$i] if $a[$i] != $b[$i] ; + } + + return @a - @b ; +} + +{ + package Redirect ; + use Symbol ; + + sub new + { + my $class = shift ; + my $filename = shift ; + my $fh = gensym ; + open ($fh, ">$filename") || die "Cannot open $filename: $!" ; + my $real_stdout = select($fh) ; + return bless [$fh, $real_stdout ] ; + + } + sub DESTROY + { + my $self = shift ; + close $self->[0] ; + select($self->[1]) ; + } +} + +sub docat +{ + my $file = shift; + local $/ = undef ; + open(CAT,$file) || die "Cannot open $file: $!"; + my $result = ; + close(CAT); + $result = normalise($result) ; + return $result ; +} + +sub docat_del +{ + my $file = shift; + my $result = docat($file); + unlink $file ; + return $result ; +} + +sub normalise +{ + my $data = shift ; + $data =~ s#\r\n#\n#g + if $^O eq 'cygwin' ; + + return $data ; +} + +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie %$hashref; + return $no_inner; +} + + + +my $db185mode = ($DB_File::db_version == 1 && ! $DB_File::db_185_compat) ; +my $null_keys_allowed = ($DB_File::db_ver < 2.004010 + || $DB_File::db_ver >= 3.1 ); + +my $Dfile = "dbbtree.tmp"; +unlink $Dfile; + +umask(0); + +# Check the interface to BTREEINFO + +my $dbh = new DB_File::BTREEINFO ; +ok(1, ! defined $dbh->{flags}) ; +ok(2, ! defined $dbh->{cachesize}) ; +ok(3, ! defined $dbh->{psize}) ; +ok(4, ! defined $dbh->{lorder}) ; +ok(5, ! defined $dbh->{minkeypage}) ; +ok(6, ! defined $dbh->{maxkeypage}) ; +ok(7, ! defined $dbh->{compare}) ; +ok(8, ! defined $dbh->{prefix}) ; + +$dbh->{flags} = 3000 ; +ok(9, $dbh->{flags} == 3000) ; + +$dbh->{cachesize} = 9000 ; +ok(10, $dbh->{cachesize} == 9000); + +$dbh->{psize} = 400 ; +ok(11, $dbh->{psize} == 400) ; + +$dbh->{lorder} = 65 ; +ok(12, $dbh->{lorder} == 65) ; + +$dbh->{minkeypage} = 123 ; +ok(13, $dbh->{minkeypage} == 123) ; + +$dbh->{maxkeypage} = 1234 ; +ok(14, $dbh->{maxkeypage} == 1234 ); + +# Check that an invalid entry is caught both for store & fetch +eval '$dbh->{fred} = 1234' ; +ok(15, $@ =~ /^DB_File::BTREEINFO::STORE - Unknown element 'fred' at/ ) ; +eval 'my $q = $dbh->{fred}' ; +ok(16, $@ =~ /^DB_File::BTREEINFO::FETCH - Unknown element 'fred' at/ ) ; + +# Now check the interface to BTREE + +my ($X, %h) ; +ok(17, $X = tie(%h, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE )) ; +die "Could not tie: $!" unless $X; + +my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); + +my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; + +ok(18, ($mode & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) + || $noMode{$^O} ); + +my ($key, $value, $i); +while (($key,$value) = each(%h)) { + $i++; +} +ok(19, !$i ) ; + +$h{'goner1'} = 'snork'; + +$h{'abc'} = 'ABC'; +ok(20, $h{'abc'} eq 'ABC' ); +ok(21, ! defined $h{'jimmy'} ) ; +ok(22, ! exists $h{'jimmy'} ) ; +ok(23, defined $h{'abc'} ) ; + +$h{'def'} = 'DEF'; +$h{'jkl','mno'} = "JKL\034MNO"; +$h{'a',2,3,4,5} = join("\034",'A',2,3,4,5); +$h{'a'} = 'A'; + +#$h{'b'} = 'B'; +$X->STORE('b', 'B') ; + +$h{'c'} = 'C'; + +#$h{'d'} = 'D'; +$X->put('d', 'D') ; + +$h{'e'} = 'E'; +$h{'f'} = 'F'; +$h{'g'} = 'X'; +$h{'h'} = 'H'; +$h{'i'} = 'I'; + +$h{'goner2'} = 'snork'; +delete $h{'goner2'}; + + +# IMPORTANT - $X must be undefined before the untie otherwise the +# underlying DB close routine will not get called. +undef $X ; +untie(%h); + +# tie to the same file again +ok(24, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE)) ; + +# Modify an entry from the previous tie +$h{'g'} = 'G'; + +$h{'j'} = 'J'; +$h{'k'} = 'K'; +$h{'l'} = 'L'; +$h{'m'} = 'M'; +$h{'n'} = 'N'; +$h{'o'} = 'O'; +$h{'p'} = 'P'; +$h{'q'} = 'Q'; +$h{'r'} = 'R'; +$h{'s'} = 'S'; +$h{'t'} = 'T'; +$h{'u'} = 'U'; +$h{'v'} = 'V'; +$h{'w'} = 'W'; +$h{'x'} = 'X'; +$h{'y'} = 'Y'; +$h{'z'} = 'Z'; + +$h{'goner3'} = 'snork'; + +delete $h{'goner1'}; +$X->DELETE('goner3'); + +my @keys = keys(%h); +my @values = values(%h); + +ok(25, $#keys == 29 && $#values == 29) ; + +$i = 0 ; +while (($key,$value) = each(%h)) { + if ($key eq $keys[$i] && $value eq $values[$i] && $key eq lc($value)) { + $key =~ y/a-z/A-Z/; + $i++ if $key eq $value; + } +} + +ok(26, $i == 30) ; + +@keys = ('blurfl', keys(%h), 'dyick'); +ok(27, $#keys == 31) ; + +#Check that the keys can be retrieved in order +my @b = keys %h ; +my @c = sort lexical @b ; +ok(28, ArrayCompare(\@b, \@c)) ; + +$h{'foo'} = ''; +ok(29, $h{'foo'} eq '' ) ; + +# Berkeley DB from version 2.4.10 to 3.0 does not allow null keys. +# This feature was reenabled in version 3.1 of Berkeley DB. +my $result = 0 ; +if ($null_keys_allowed) { + $h{''} = 'bar'; + $result = ( $h{''} eq 'bar' ); +} +else + { $result = 1 } +ok(30, $result) ; + +# check cache overflow and numeric keys and contents +my $ok = 1; +for ($i = 1; $i < 200; $i++) { $h{$i + 0} = $i + 0; } +for ($i = 1; $i < 200; $i++) { $ok = 0 unless $h{$i} == $i; } +ok(31, $ok); + +($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); +ok(32, $size > 0 ); + +@h{0..200} = 200..400; +my @foo = @h{0..200}; +ok(33, join(':',200..400) eq join(':',@foo) ); + +# Now check all the non-tie specific stuff + + +# Check R_NOOVERWRITE flag will make put fail when attempting to overwrite +# an existing record. + +my $status = $X->put( 'x', 'newvalue', R_NOOVERWRITE) ; +ok(34, $status == 1 ); + +# check that the value of the key 'x' has not been changed by the +# previous test +ok(35, $h{'x'} eq 'X' ); + +# standard put +$status = $X->put('key', 'value') ; +ok(36, $status == 0 ); + +#check that previous put can be retrieved +$value = 0 ; +$status = $X->get('key', $value) ; +ok(37, $status == 0 ); +ok(38, $value eq 'value' ); + +# Attempting to delete an existing key should work + +$status = $X->del('q') ; +ok(39, $status == 0 ); +if ($null_keys_allowed) { + $status = $X->del('') ; +} else { + $status = 0 ; +} +ok(40, $status == 0 ); + +# Make sure that the key deleted, cannot be retrieved +ok(41, ! defined $h{'q'}) ; +ok(42, ! defined $h{''}) ; + +undef $X ; +untie %h ; + +ok(43, $X = tie(%h, 'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE )); + +# Attempting to delete a non-existent key should fail + +$status = $X->del('joe') ; +ok(44, $status == 1 ); + +# Check the get interface + +# First a non-existing key +$status = $X->get('aaaa', $value) ; +ok(45, $status == 1 ); + +# Next an existing key +$status = $X->get('a', $value) ; +ok(46, $status == 0 ); +ok(47, $value eq 'A' ); + +# seq +# ### + +# use seq to find an approximate match +$key = 'ke' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(48, $status == 0 ); +ok(49, $key eq 'key' ); +ok(50, $value eq 'value' ); + +# seq when the key does not match +$key = 'zzz' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(51, $status == 1 ); + + +# use seq to set the cursor, then delete the record @ the cursor. + +$key = 'x' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(52, $status == 0 ); +ok(53, $key eq 'x' ); +ok(54, $value eq 'X' ); +$status = $X->del(0, R_CURSOR) ; +ok(55, $status == 0 ); +$status = $X->get('x', $value) ; +ok(56, $status == 1 ); + +# ditto, but use put to replace the key/value pair. +$key = 'y' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(57, $status == 0 ); +ok(58, $key eq 'y' ); +ok(59, $value eq 'Y' ); + +$key = "replace key" ; +$value = "replace value" ; +$status = $X->put($key, $value, R_CURSOR) ; +ok(60, $status == 0 ); +ok(61, $key eq 'replace key' ); +ok(62, $value eq 'replace value' ); +$status = $X->get('y', $value) ; +ok(63, 1) ; # hard-wire to always pass. the previous test ($status == 1) + # only worked because of a bug in 1.85/6 + +# use seq to walk forwards through a file + +$status = $X->seq($key, $value, R_FIRST) ; +ok(64, $status == 0 ); +my $previous = $key ; + +$ok = 1 ; +while (($status = $X->seq($key, $value, R_NEXT)) == 0) +{ + ($ok = 0), last if ($previous cmp $key) == 1 ; +} + +ok(65, $status == 1 ); +ok(66, $ok == 1 ); + +# use seq to walk backwards through a file +$status = $X->seq($key, $value, R_LAST) ; +ok(67, $status == 0 ); +$previous = $key ; + +$ok = 1 ; +while (($status = $X->seq($key, $value, R_PREV)) == 0) +{ + ($ok = 0), last if ($previous cmp $key) == -1 ; + #print "key = [$key] value = [$value]\n" ; +} + +ok(68, $status == 1 ); +ok(69, $ok == 1 ); + + +# check seq FIRST/LAST + +# sync +# #### + +$status = $X->sync ; +ok(70, $status == 0 ); + + +# fd +# ## + +$status = $X->fd ; +ok(71, 1 ); +#ok(71, $status != 0 ); + + +undef $X ; +untie %h ; + +unlink $Dfile; + +# Now try an in memory file +my $Y; +ok(72, $Y = tie(%h, 'DB_File',undef, O_RDWR|O_CREAT, 0640, $DB_BTREE )); + +# fd with an in memory file should return failure +$status = $Y->fd ; +ok(73, $status == -1 ); + + +undef $Y ; +untie %h ; + +# Duplicate keys +my $bt = new DB_File::BTREEINFO ; +$bt->{flags} = R_DUP ; +my ($YY, %hh); +ok(74, $YY = tie(%hh, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $bt )) ; + +$hh{'Wall'} = 'Larry' ; +$hh{'Wall'} = 'Stone' ; # Note the duplicate key +$hh{'Wall'} = 'Brick' ; # Note the duplicate key +$hh{'Wall'} = 'Brick' ; # Note the duplicate key and value +$hh{'Smith'} = 'John' ; +$hh{'mouse'} = 'mickey' ; + +# first work in scalar context +ok(75, scalar $YY->get_dup('Unknown') == 0 ); +ok(76, scalar $YY->get_dup('Smith') == 1 ); +ok(77, scalar $YY->get_dup('Wall') == 4 ); + +# now in list context +my @unknown = $YY->get_dup('Unknown') ; +ok(78, "@unknown" eq "" ); + +my @smith = $YY->get_dup('Smith') ; +ok(79, "@smith" eq "John" ); + +{ +my @wall = $YY->get_dup('Wall') ; +my %wall ; +@wall{@wall} = @wall ; +ok(80, (@wall == 4 && $wall{'Larry'} && $wall{'Stone'} && $wall{'Brick'}) ); +} + +# hash +my %unknown = $YY->get_dup('Unknown', 1) ; +ok(81, keys %unknown == 0 ); + +my %smith = $YY->get_dup('Smith', 1) ; +ok(82, keys %smith == 1 && $smith{'John'}) ; + +my %wall = $YY->get_dup('Wall', 1) ; +ok(83, keys %wall == 3 && $wall{'Larry'} == 1 && $wall{'Stone'} == 1 + && $wall{'Brick'} == 2); + +undef $YY ; +untie %hh ; +unlink $Dfile; + + +# test multiple callbacks +my $Dfile1 = "btree1" ; +my $Dfile2 = "btree2" ; +my $Dfile3 = "btree3" ; + +my $dbh1 = new DB_File::BTREEINFO ; +$dbh1->{compare} = sub { + no warnings 'numeric' ; + $_[0] <=> $_[1] } ; + +my $dbh2 = new DB_File::BTREEINFO ; +$dbh2->{compare} = sub { $_[0] cmp $_[1] } ; + +my $dbh3 = new DB_File::BTREEINFO ; +$dbh3->{compare} = sub { length $_[0] <=> length $_[1] } ; + + +my (%g, %k); +tie(%h, 'DB_File',$Dfile1, O_RDWR|O_CREAT, 0640, $dbh1 ) or die $!; +tie(%g, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) or die $!; +tie(%k, 'DB_File',$Dfile3, O_RDWR|O_CREAT, 0640, $dbh3 ) or die $!; + +my @Keys = qw( 0123 12 -1234 9 987654321 def ) ; +my (@srt_1, @srt_2, @srt_3); +{ + no warnings 'numeric' ; + @srt_1 = sort { $a <=> $b } @Keys ; +} +@srt_2 = sort { $a cmp $b } @Keys ; +@srt_3 = sort { length $a <=> length $b } @Keys ; + +foreach (@Keys) { + $h{$_} = 1 ; + $g{$_} = 1 ; + $k{$_} = 1 ; +} + +sub ArrayCompare +{ + my($a, $b) = @_ ; + + return 0 if @$a != @$b ; + + foreach (0 .. @$a - 1) + { + return 0 unless $$a[$_] eq $$b[$_]; + } + + 1 ; +} + +ok(84, ArrayCompare (\@srt_1, [keys %h]) ); +ok(85, ArrayCompare (\@srt_2, [keys %g]) ); +ok(86, ArrayCompare (\@srt_3, [keys %k]) ); + +untie %h ; +untie %g ; +untie %k ; +unlink $Dfile1, $Dfile2, $Dfile3 ; + +# clear +# ##### + +ok(87, tie(%h, 'DB_File', $Dfile1, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); +foreach (1 .. 10) + { $h{$_} = $_ * 100 } + +# check that there are 10 elements in the hash +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(88, $i == 10); + +# now clear the hash +%h = () ; + +# check it is empty +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(89, $i == 0); + +untie %h ; +unlink $Dfile1 ; + +{ + # check that attempting to tie an array to a DB_BTREE will fail + + my $filename = "xyz" ; + my @x ; + eval { tie @x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE ; } ; + ok(90, $@ =~ /^DB_File can only tie an associative array to a DB_BTREE database/) ; + unlink $filename ; +} + +{ + # sub-class test + + package Another ; + + use warnings ; + use strict ; + + open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ; + print FILE <<'EOM' ; + + package SubDB ; + + use warnings ; + use strict ; + our (@ISA, @EXPORT); + + require Exporter ; + use DB_File; + @ISA=qw(DB_File); + @EXPORT = @DB_File::EXPORT ; + + sub STORE { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::STORE($key, $value * 2) ; + } + + sub FETCH { + my $self = shift ; + my $key = shift ; + $self->SUPER::FETCH($key) - 1 ; + } + + sub put { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::put($key, $value * 3) ; + } + + sub get { + my $self = shift ; + $self->SUPER::get($_[0], $_[1]) ; + $_[1] -= 2 ; + } + + sub A_new_method + { + my $self = shift ; + my $key = shift ; + my $value = $self->FETCH($key) ; + return "[[$value]]" ; + } + + 1 ; +EOM + + close FILE ; + + BEGIN { push @INC, '.'; } + eval 'use SubDB ; '; + main::ok(91, $@ eq "") ; + my %h ; + my $X ; + eval ' + $X = tie(%h, "SubDB","dbbtree.tmp", O_RDWR|O_CREAT, 0640, $DB_BTREE ); + ' ; + + main::ok(92, $@ eq "") ; + + my $ret = eval '$h{"fred"} = 3 ; return $h{"fred"} ' ; + main::ok(93, $@ eq "") ; + main::ok(94, $ret == 5) ; + + my $value = 0; + $ret = eval '$X->put("joe", 4) ; $X->get("joe", $value) ; return $value' ; + main::ok(95, $@ eq "") ; + main::ok(96, $ret == 10) ; + + $ret = eval ' R_NEXT eq main::R_NEXT ' ; + main::ok(97, $@ eq "" ) ; + main::ok(98, $ret == 1) ; + + $ret = eval '$X->A_new_method("joe") ' ; + main::ok(99, $@ eq "") ; + main::ok(100, $ret eq "[[11]]") ; + + undef $X; + untie(%h); + unlink "SubDB.pm", "dbbtree.tmp" ; + +} + +{ + # DBM Filter tests + use warnings ; + use strict ; + my (%h, $db) ; + my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + unlink $Dfile; + + sub checkOutput + { + my($fk, $sk, $fv, $sv) = @_ ; + return + $fetch_key eq $fk && $store_key eq $sk && + $fetch_value eq $fv && $store_value eq $sv && + $_ eq 'original' ; + } + + ok(101, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_fetch_key (sub { $fetch_key = $_ }) ; + $db->filter_store_key (sub { $store_key = $_ }) ; + $db->filter_fetch_value (sub { $fetch_value = $_}) ; + $db->filter_store_value (sub { $store_value = $_ }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + # fk sk fv sv + ok(102, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(103, $h{"fred"} eq "joe"); + # fk sk fv sv + ok(104, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(105, $db->FIRSTKEY() eq "fred") ; + # fk sk fv sv + ok(106, checkOutput( "fred", "", "", "")) ; + + # replace the filters, but remember the previous set + my ($old_fk) = $db->filter_fetch_key + (sub { $_ = uc $_ ; $fetch_key = $_ }) ; + my ($old_sk) = $db->filter_store_key + (sub { $_ = lc $_ ; $store_key = $_ }) ; + my ($old_fv) = $db->filter_fetch_value + (sub { $_ = "[$_]"; $fetch_value = $_ }) ; + my ($old_sv) = $db->filter_store_value + (sub { s/o/x/g; $store_value = $_ }) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"Fred"} = "Joe" ; + # fk sk fv sv + ok(107, checkOutput( "", "fred", "", "Jxe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(108, $h{"Fred"} eq "[Jxe]"); + # fk sk fv sv + ok(109, checkOutput( "", "fred", "[Jxe]", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(110, $db->FIRSTKEY() eq "FRED") ; + # fk sk fv sv + ok(111, checkOutput( "FRED", "", "", "")) ; + + # put the original filters back + $db->filter_fetch_key ($old_fk); + $db->filter_store_key ($old_sk); + $db->filter_fetch_value ($old_fv); + $db->filter_store_value ($old_sv); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(112, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(113, $h{"fred"} eq "joe"); + ok(114, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(115, $db->FIRSTKEY() eq "fred") ; + ok(116, checkOutput( "fred", "", "", "")) ; + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(117, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(118, $h{"fred"} eq "joe"); + ok(119, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(120, $db->FIRSTKEY() eq "fred") ; + ok(121, checkOutput( "", "", "", "")) ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter with a closure + + use warnings ; + use strict ; + my (%h, $db) ; + + unlink $Dfile; + ok(122, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + my %result = () ; + + sub Closure + { + my ($name) = @_ ; + my $count = 0 ; + my @kept = () ; + + return sub { ++$count ; + push @kept, $_ ; + $result{$name} = "$name - $count: [@kept]" ; + } + } + + $db->filter_store_key(Closure("store key")) ; + $db->filter_store_value(Closure("store value")) ; + $db->filter_fetch_key(Closure("fetch key")) ; + $db->filter_fetch_value(Closure("fetch value")) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(123, $result{"store key"} eq "store key - 1: [fred]"); + ok(124, $result{"store value"} eq "store value - 1: [joe]"); + ok(125, ! defined $result{"fetch key"} ); + ok(126, ! defined $result{"fetch value"} ); + ok(127, $_ eq "original") ; + + ok(128, $db->FIRSTKEY() eq "fred") ; + ok(129, $result{"store key"} eq "store key - 1: [fred]"); + ok(130, $result{"store value"} eq "store value - 1: [joe]"); + ok(131, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(132, ! defined $result{"fetch value"} ); + ok(133, $_ eq "original") ; + + $h{"jim"} = "john" ; + ok(134, $result{"store key"} eq "store key - 2: [fred jim]"); + ok(135, $result{"store value"} eq "store value - 2: [joe john]"); + ok(136, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(137, ! defined $result{"fetch value"} ); + ok(138, $_ eq "original") ; + + ok(139, $h{"fred"} eq "joe"); + ok(140, $result{"store key"} eq "store key - 3: [fred jim fred]"); + ok(141, $result{"store value"} eq "store value - 2: [joe john]"); + ok(142, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(143, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(144, $_ eq "original") ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter recursion detection + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(145, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_store_key (sub { $_ = $h{$_} }) ; + + eval '$h{1} = 1234' ; + ok(146, $@ =~ /^recursion detected in filter_store_key at/ ); + + undef $db ; + untie %h; + unlink $Dfile; +} + + +{ + # Examples from the POD + + + my $file = "xyzt" ; + { + my $redirect = new Redirect $file ; + + # BTREE example 1 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my %h ; + + sub Compare + { + my ($key1, $key2) = @_ ; + "\L$key1" cmp "\L$key2" ; + } + + # specify the Perl sub that will do the comparison + $DB_BTREE->{'compare'} = \&Compare ; + + unlink "tree" ; + tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open file 'tree': $!\n" ; + + # Add a key/value pair to the file + $h{'Wall'} = 'Larry' ; + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + $h{'duck'} = 'donald' ; + + # Delete + delete $h{"duck"} ; + + # Cycle through the keys printing them in order. + # Note it is not necessary to sort the keys as + # the btree will have kept them in order automatically. + foreach (keys %h) + { print "$_\n" } + + untie %h ; + + unlink "tree" ; + } + + delete $DB_BTREE->{'compare'} ; + + ok(147, docat_del($file) eq <<'EOM') ; +mouse +Smith +Wall +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 2 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, %h); + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the associative array + # and print each key/value pair. + foreach (keys %h) + { print "$_ -> $h{$_}\n" } + + untie %h ; + + unlink $filename ; + } + + ok(148, docat_del($file) eq ($db185mode ? <<'EOM' : <<'EOM') ) ; +Smith -> John +Wall -> Brick +Wall -> Brick +Wall -> Brick +mouse -> mickey +EOM +Smith -> John +Wall -> Larry +Wall -> Larry +Wall -> Larry +mouse -> mickey +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 3 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $status, $key, $value); + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the btree using seq + # and print each key/value pair. + $key = $value = 0 ; + for ($status = $x->seq($key, $value, R_FIRST) ; + $status == 0 ; + $status = $x->seq($key, $value, R_NEXT) ) + { print "$key -> $value\n" } + + + undef $x ; + untie %h ; + } + + ok(149, docat_del($file) eq ($db185mode == 1 ? <<'EOM' : <<'EOM') ) ; +Smith -> John +Wall -> Brick +Wall -> Brick +Wall -> Larry +mouse -> mickey +EOM +Smith -> John +Wall -> Larry +Wall -> Brick +Wall -> Brick +mouse -> mickey +EOM + + + { + my $redirect = new Redirect $file ; + + # BTREE example 4 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h); + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + my $cnt = $x->get_dup("Wall") ; + print "Wall occurred $cnt times\n" ; + + my %hash = $x->get_dup("Wall", 1) ; + print "Larry is there\n" if $hash{'Larry'} ; + print "There are $hash{'Brick'} Brick Walls\n" ; + + my @list = sort $x->get_dup("Wall") ; + print "Wall => [@list]\n" ; + + @list = $x->get_dup("Smith") ; + print "Smith => [@list]\n" ; + + @list = $x->get_dup("Dog") ; + print "Dog => [@list]\n" ; + + undef $x ; + untie %h ; + } + + ok(150, docat_del($file) eq <<'EOM') ; +Wall occurred 3 times +Larry is there +There are 2 Brick Walls +Wall => [Brick Brick Larry] +Smith => [John] +Dog => [] +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 5 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found); + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; + print "Harry Wall is $found there\n" ; + + undef $x ; + untie %h ; + } + + ok(151, docat_del($file) eq <<'EOM') ; +Larry Wall is there +Harry Wall is not there +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 6 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found); + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $x->del_dup("Wall", "Larry") ; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + undef $x ; + untie %h ; + + unlink $filename ; + } + + ok(152, docat_del($file) eq <<'EOM') ; +Larry Wall is not there +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 7 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($filename, $x, %h, $st, $key, $value); + + sub match + { + my $key = shift ; + my $value = 0; + my $orig_key = $key ; + $x->seq($key, $value, R_CURSOR) ; + print "$orig_key\t-> $key\t-> $value\n" ; + } + + $filename = "tree" ; + unlink $filename ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'mouse'} = 'mickey' ; + $h{'Wall'} = 'Larry' ; + $h{'Walls'} = 'Brick' ; + $h{'Smith'} = 'John' ; + + + $key = $value = 0 ; + print "IN ORDER\n" ; + for ($st = $x->seq($key, $value, R_FIRST) ; + $st == 0 ; + $st = $x->seq($key, $value, R_NEXT) ) + + { print "$key -> $value\n" } + + print "\nPARTIAL MATCH\n" ; + + match "Wa" ; + match "A" ; + match "a" ; + + undef $x ; + untie %h ; + + unlink $filename ; + + } + + ok(153, docat_del($file) eq <<'EOM') ; +IN ORDER +Smith -> John +Wall -> Larry +Walls -> Brick +mouse -> mickey + +PARTIAL MATCH +Wa -> Wall -> Larry +A -> Smith -> John +a -> mouse -> mickey +EOM + +} + +#{ +# # R_SETCURSOR +# use strict ; +# my (%h, $db) ; +# unlink $Dfile; +# +# ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); +# +# $h{abc} = 33 ; +# my $k = "newest" ; +# my $v = 44 ; +# my $status = $db->put($k, $v, R_SETCURSOR) ; +# print "status = [$status]\n" ; +# ok(157, $status == 0) ; +# $status = $db->del($k, R_CURSOR) ; +# print "status = [$status]\n" ; +# ok(158, $status == 0) ; +# $k = "newest" ; +# ok(159, $db->get($k, $v, R_CURSOR)) ; +# +# ok(160, keys %h == 1) ; +# +# undef $db ; +# untie %h; +# unlink $Dfile; +#} + +{ + # Bug ID 20001013.009 + # + # test that $hash{KEY} = undef doesn't produce the warning + # Use of uninitialized value in null operation + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_BTREE + or die "Can't open file: $!\n" ; + $h{ABC} = undef; + ok(154, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # test that %hash = () doesn't produce the warning + # Argument "" isn't numeric in entersub + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_BTREE + or die "Can't open file: $!\n" ; + %h = (); ; + ok(155, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # When iterating over a tied hash using "each", the key passed to FETCH + # will be recycled and passed to NEXTKEY. If a Source Filter modifies the + # key in FETCH via a filter_fetch_key method we need to check that the + # modified key doesn't get passed to NEXTKEY. + # Also Test "keys" & "values" while we are at it. + + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my $bad_key = 0 ; + my %h = () ; + my $db ; + ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + $db->filter_fetch_key (sub { $_ =~ s/^Beta_/Alpha_/ if defined $_}) ; + $db->filter_store_key (sub { $bad_key = 1 if /^Beta_/ ; $_ =~ s/^Alpha_/Beta_/}) ; + + $h{'Alpha_ABC'} = 2 ; + $h{'Alpha_DEF'} = 5 ; + + ok(157, $h{'Alpha_ABC'} == 2); + ok(158, $h{'Alpha_DEF'} == 5); + + my ($k, $v) = ("",""); + while (($k, $v) = each %h) {} + ok(159, $bad_key == 0); + + $bad_key = 0 ; + foreach $k (keys %h) {} + ok(160, $bad_key == 0); + + $bad_key = 0 ; + foreach $v (values %h) {} + ok(161, $bad_key == 0); + + undef $db ; + untie %h ; + unlink $Dfile; +} + +{ + # now an error to pass 'compare' a non-code reference + my $dbh = new DB_File::BTREEINFO ; + + eval { $dbh->{compare} = 2 }; + ok(162, $@ =~ /^Key 'compare' not associated with a code reference at/); + + eval { $dbh->{prefix} = 2 }; + ok(163, $@ =~ /^Key 'prefix' not associated with a code reference at/); + +} + + +#{ +# # recursion detection in btree +# my %hash ; +# unlink $Dfile; +# my $dbh = new DB_File::BTREEINFO ; +# $dbh->{compare} = sub { $hash{3} = 4 ; length $_[0] } ; +# +# +# my (%h); +# ok(164, tie(%hash, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ); +# +# eval { $hash{1} = 2; +# $hash{4} = 5; +# }; +# +# ok(165, $@ =~ /^DB_File btree_compare: recursion detected/); +# { +# no warnings; +# untie %hash; +# } +# unlink $Dfile; +#} +ok(164,1); +ok(165,1); + +{ + # Check that two callbacks don't interact + my %hash1 ; + my %hash2 ; + my $h1_count = 0; + my $h2_count = 0; + unlink $Dfile, $Dfile2; + my $dbh1 = new DB_File::BTREEINFO ; + $dbh1->{compare} = sub { ++ $h1_count ; $_[0] cmp $_[1] } ; + + my $dbh2 = new DB_File::BTREEINFO ; + $dbh2->{compare} = sub { ;++ $h2_count ; $_[0] cmp $_[1] } ; + + + + my (%h); + ok(166, tie(%hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh1 ) ); + ok(167, tie(%hash2, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ); + + $hash1{DEFG} = 5; + $hash1{XYZ} = 2; + $hash1{ABCDE} = 5; + + $hash2{defg} = 5; + $hash2{xyz} = 2; + $hash2{abcde} = 5; + + ok(168, $h1_count > 0); + ok(169, $h1_count == $h2_count); + + ok(170, safeUntie \%hash1); + ok(171, safeUntie \%hash2); + unlink $Dfile, $Dfile2; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(172, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(173, $h{"fred"} eq "joe"); + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (174, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(175, $h{"fred"} eq "joe"); + + ok(176, $db->FIRSTKEY() eq "fred") ; + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (177, ! $@); + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # Check low-level API works with filter + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(178, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + + $db->filter_fetch_key (sub { $_ = unpack("i", $_) } ); + $db->filter_store_key (sub { $_ = pack("i", $_) } ); + $db->filter_fetch_value (sub { $_ = unpack("i", $_) } ); + $db->filter_store_value (sub { $_ = pack("i", $_) } ); + + $_ = 'fred'; + + my $key = 22 ; + my $value = 34 ; + + $db->put($key, $value) ; + ok 179, $key == 22; + ok 180, $value == 34 ; + ok 181, $_ eq 'fred'; + #print "k [$key][$value]\n" ; + + my $val ; + $db->get($key, $val) ; + ok 182, $key == 22; + ok 183, $val == 34 ; + ok 184, $_ eq 'fred'; + + $key = 51 ; + $value = 454; + $h{$key} = $value ; + ok 185, $key == 51; + ok 186, $value == 454 ; + ok 187, $_ eq 'fred'; + + undef $db ; + untie %h; + unlink $Dfile; +} + + + +{ + # Regression Test for bug 30237 + # Check that substr can be used in the key to db_put + # and that db_put does not trigger the warning + # + # Use of uninitialized value in subroutine entry + + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(188, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE )); + + my $warned = ''; + local $SIG{__WARN__} = sub {$warned = $_[0]} ; + + # db-put with substr of key + my %remember = () ; + for my $ix ( 10 .. 12 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put(substr($key,0), $value) ; + } + + ok 189, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # db-put with substr of value + $warned = ''; + for my $ix ( 20 .. 22 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put($key, substr($value,0)) ; + } + + ok 190, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of key + $warned = ''; + for my $ix ( 30 .. 32 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{substr($key,0)} = $value ; + } + + ok 191, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of value + $warned = ''; + for my $ix ( 40 .. 42 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{$key} = substr($value,0) ; + } + + ok 192, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + my %bad = () ; + $key = ''; + for ($status = $db->seq($key, $value, R_FIRST ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 193, keys %bad == 0 ; + ok 194, keys %remember == 0 ; + + print "# missing -- $key $value\n" while ($key, $value) = each %remember; + print "# bad -- $key $value\n" while ($key, $value) = each %bad; + + # Make sure this fix does not break code to handle an undef key + # Berkeley DB undef key is bron between versions 2.3.16 and + my $value = 'fred'; + $warned = ''; + $db->put(undef, $value) ; + ok 195, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + my $no_NULL = ($DB_File::db_ver >= 2.003016 && $DB_File::db_ver < 3.001) ; + print "# db_ver $DB_File::db_ver\n"; + $value = '' ; + $db->get(undef, $value) ; + ok 196, $no_NULL || $value eq 'fred' or print "# got [$value]\n" ; + ok 197, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + undef $db ; + untie %h; + unlink $Dfile; +} +exit ; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t.bak b/fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t.bak new file mode 100644 index 0000000..fb89a40 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/db-btree.t.bak @@ -0,0 +1,1657 @@ +#!./perl -w + +use warnings; +use strict; +use Config; + +BEGIN { + if(-d "lib" && -f "TEST") { + if ($Config{'extensions'} !~ /\bDB_File\b/ ) { + print "1..0 # Skip: DB_File was not built\n"; + exit 0; + } + } +} + +BEGIN +{ + if ($^O eq 'darwin' + && (split(/\./, $Config{osvers}))[0] < 7 # Mac OS X 10.3 == Darwin 7 + && $Config{db_version_major} == 1 + && $Config{db_version_minor} == 0 + && $Config{db_version_patch} == 0) { + warn < @b ? @b : @a) ; + my $i = 0 ; + + foreach $i ( 0 .. $len -1) { + return $a[$i] - $b[$i] if $a[$i] != $b[$i] ; + } + + return @a - @b ; +} + +{ + package Redirect ; + use Symbol ; + + sub new + { + my $class = shift ; + my $filename = shift ; + my $fh = gensym ; + open ($fh, ">$filename") || die "Cannot open $filename: $!" ; + my $real_stdout = select($fh) ; + return bless [$fh, $real_stdout ] ; + + } + sub DESTROY + { + my $self = shift ; + close $self->[0] ; + select($self->[1]) ; + } +} + +sub docat +{ + my $file = shift; + local $/ = undef ; + open(CAT,$file) || die "Cannot open $file: $!"; + my $result = ; + close(CAT); + $result = normalise($result) ; + return $result ; +} + +sub docat_del +{ + my $file = shift; + my $result = docat($file); + unlink $file ; + return $result ; +} + +sub normalise +{ + my $data = shift ; + $data =~ s#\r\n#\n#g + if $^O eq 'cygwin' ; + + return $data ; +} + +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie %$hashref; + return $no_inner; +} + + + +my $db185mode = ($DB_File::db_version == 1 && ! $DB_File::db_185_compat) ; +my $null_keys_allowed = ($DB_File::db_ver < 2.004010 + || $DB_File::db_ver >= 3.1 ); + +my $Dfile = "dbbtree.tmp"; +unlink $Dfile; + +umask(0); + +# Check the interface to BTREEINFO + +my $dbh = new DB_File::BTREEINFO ; +ok(1, ! defined $dbh->{flags}) ; +ok(2, ! defined $dbh->{cachesize}) ; +ok(3, ! defined $dbh->{psize}) ; +ok(4, ! defined $dbh->{lorder}) ; +ok(5, ! defined $dbh->{minkeypage}) ; +ok(6, ! defined $dbh->{maxkeypage}) ; +ok(7, ! defined $dbh->{compare}) ; +ok(8, ! defined $dbh->{prefix}) ; + +$dbh->{flags} = 3000 ; +ok(9, $dbh->{flags} == 3000) ; + +$dbh->{cachesize} = 9000 ; +ok(10, $dbh->{cachesize} == 9000); + +$dbh->{psize} = 400 ; +ok(11, $dbh->{psize} == 400) ; + +$dbh->{lorder} = 65 ; +ok(12, $dbh->{lorder} == 65) ; + +$dbh->{minkeypage} = 123 ; +ok(13, $dbh->{minkeypage} == 123) ; + +$dbh->{maxkeypage} = 1234 ; +ok(14, $dbh->{maxkeypage} == 1234 ); + +# Check that an invalid entry is caught both for store & fetch +eval '$dbh->{fred} = 1234' ; +ok(15, $@ =~ /^DB_File::BTREEINFO::STORE - Unknown element 'fred' at/ ) ; +eval 'my $q = $dbh->{fred}' ; +ok(16, $@ =~ /^DB_File::BTREEINFO::FETCH - Unknown element 'fred' at/ ) ; + +# Now check the interface to BTREE + +my ($X, %h) ; +ok(17, $X = tie(%h, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE )) ; +die "Could not tie: $!" unless $X; + +my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); + +my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; + +ok(18, ($mode & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) + || $noMode{$^O} ); + +my ($key, $value, $i); +while (($key,$value) = each(%h)) { + $i++; +} +ok(19, !$i ) ; + +$h{'goner1'} = 'snork'; + +$h{'abc'} = 'ABC'; +ok(20, $h{'abc'} eq 'ABC' ); +ok(21, ! defined $h{'jimmy'} ) ; +ok(22, ! exists $h{'jimmy'} ) ; +ok(23, defined $h{'abc'} ) ; + +$h{'def'} = 'DEF'; +$h{'jkl','mno'} = "JKL\034MNO"; +$h{'a',2,3,4,5} = join("\034",'A',2,3,4,5); +$h{'a'} = 'A'; + +#$h{'b'} = 'B'; +$X->STORE('b', 'B') ; + +$h{'c'} = 'C'; + +#$h{'d'} = 'D'; +$X->put('d', 'D') ; + +$h{'e'} = 'E'; +$h{'f'} = 'F'; +$h{'g'} = 'X'; +$h{'h'} = 'H'; +$h{'i'} = 'I'; + +$h{'goner2'} = 'snork'; +delete $h{'goner2'}; + + +# IMPORTANT - $X must be undefined before the untie otherwise the +# underlying DB close routine will not get called. +undef $X ; +untie(%h); + +# tie to the same file again +ok(24, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE)) ; + +# Modify an entry from the previous tie +$h{'g'} = 'G'; + +$h{'j'} = 'J'; +$h{'k'} = 'K'; +$h{'l'} = 'L'; +$h{'m'} = 'M'; +$h{'n'} = 'N'; +$h{'o'} = 'O'; +$h{'p'} = 'P'; +$h{'q'} = 'Q'; +$h{'r'} = 'R'; +$h{'s'} = 'S'; +$h{'t'} = 'T'; +$h{'u'} = 'U'; +$h{'v'} = 'V'; +$h{'w'} = 'W'; +$h{'x'} = 'X'; +$h{'y'} = 'Y'; +$h{'z'} = 'Z'; + +$h{'goner3'} = 'snork'; + +delete $h{'goner1'}; +$X->DELETE('goner3'); + +my @keys = keys(%h); +my @values = values(%h); + +ok(25, $#keys == 29 && $#values == 29) ; + +$i = 0 ; +while (($key,$value) = each(%h)) { + if ($key eq $keys[$i] && $value eq $values[$i] && $key eq lc($value)) { + $key =~ y/a-z/A-Z/; + $i++ if $key eq $value; + } +} + +ok(26, $i == 30) ; + +@keys = ('blurfl', keys(%h), 'dyick'); +ok(27, $#keys == 31) ; + +#Check that the keys can be retrieved in order +my @b = keys %h ; +my @c = sort lexical @b ; +ok(28, ArrayCompare(\@b, \@c)) ; + +$h{'foo'} = ''; +ok(29, $h{'foo'} eq '' ) ; + +# Berkeley DB from version 2.4.10 to 3.0 does not allow null keys. +# This feature was reenabled in version 3.1 of Berkeley DB. +my $result = 0 ; +if ($null_keys_allowed) { + $h{''} = 'bar'; + $result = ( $h{''} eq 'bar' ); +} +else + { $result = 1 } +ok(30, $result) ; + +# check cache overflow and numeric keys and contents +my $ok = 1; +for ($i = 1; $i < 200; $i++) { $h{$i + 0} = $i + 0; } +for ($i = 1; $i < 200; $i++) { $ok = 0 unless $h{$i} == $i; } +ok(31, $ok); + +($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); +ok(32, $size > 0 ); + +@h{0..200} = 200..400; +my @foo = @h{0..200}; +ok(33, join(':',200..400) eq join(':',@foo) ); + +# Now check all the non-tie specific stuff + + +# Check R_NOOVERWRITE flag will make put fail when attempting to overwrite +# an existing record. + +my $status = $X->put( 'x', 'newvalue', R_NOOVERWRITE) ; +ok(34, $status == 1 ); + +# check that the value of the key 'x' has not been changed by the +# previous test +ok(35, $h{'x'} eq 'X' ); + +# standard put +$status = $X->put('key', 'value') ; +ok(36, $status == 0 ); + +#check that previous put can be retrieved +$value = 0 ; +$status = $X->get('key', $value) ; +ok(37, $status == 0 ); +ok(38, $value eq 'value' ); + +# Attempting to delete an existing key should work + +$status = $X->del('q') ; +ok(39, $status == 0 ); +if ($null_keys_allowed) { + $status = $X->del('') ; +} else { + $status = 0 ; +} +ok(40, $status == 0 ); + +# Make sure that the key deleted, cannot be retrieved +ok(41, ! defined $h{'q'}) ; +ok(42, ! defined $h{''}) ; + +undef $X ; +untie %h ; + +ok(43, $X = tie(%h, 'DB_File',$Dfile, O_RDWR, 0640, $DB_BTREE )); + +# Attempting to delete a non-existent key should fail + +$status = $X->del('joe') ; +ok(44, $status == 1 ); + +# Check the get interface + +# First a non-existing key +$status = $X->get('aaaa', $value) ; +ok(45, $status == 1 ); + +# Next an existing key +$status = $X->get('a', $value) ; +ok(46, $status == 0 ); +ok(47, $value eq 'A' ); + +# seq +# ### + +# use seq to find an approximate match +$key = 'ke' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(48, $status == 0 ); +ok(49, $key eq 'key' ); +ok(50, $value eq 'value' ); + +# seq when the key does not match +$key = 'zzz' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(51, $status == 1 ); + + +# use seq to set the cursor, then delete the record @ the cursor. + +$key = 'x' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(52, $status == 0 ); +ok(53, $key eq 'x' ); +ok(54, $value eq 'X' ); +$status = $X->del(0, R_CURSOR) ; +ok(55, $status == 0 ); +$status = $X->get('x', $value) ; +ok(56, $status == 1 ); + +# ditto, but use put to replace the key/value pair. +$key = 'y' ; +$value = '' ; +$status = $X->seq($key, $value, R_CURSOR) ; +ok(57, $status == 0 ); +ok(58, $key eq 'y' ); +ok(59, $value eq 'Y' ); + +$key = "replace key" ; +$value = "replace value" ; +$status = $X->put($key, $value, R_CURSOR) ; +ok(60, $status == 0 ); +ok(61, $key eq 'replace key' ); +ok(62, $value eq 'replace value' ); +$status = $X->get('y', $value) ; +ok(63, 1) ; # hard-wire to always pass. the previous test ($status == 1) + # only worked because of a bug in 1.85/6 + +# use seq to walk forwards through a file + +$status = $X->seq($key, $value, R_FIRST) ; +ok(64, $status == 0 ); +my $previous = $key ; + +$ok = 1 ; +while (($status = $X->seq($key, $value, R_NEXT)) == 0) +{ + ($ok = 0), last if ($previous cmp $key) == 1 ; +} + +ok(65, $status == 1 ); +ok(66, $ok == 1 ); + +# use seq to walk backwards through a file +$status = $X->seq($key, $value, R_LAST) ; +ok(67, $status == 0 ); +$previous = $key ; + +$ok = 1 ; +while (($status = $X->seq($key, $value, R_PREV)) == 0) +{ + ($ok = 0), last if ($previous cmp $key) == -1 ; + #print "key = [$key] value = [$value]\n" ; +} + +ok(68, $status == 1 ); +ok(69, $ok == 1 ); + + +# check seq FIRST/LAST + +# sync +# #### + +$status = $X->sync ; +ok(70, $status == 0 ); + + +# fd +# ## + +$status = $X->fd ; +ok(71, 1 ); +#ok(71, $status != 0 ); + + +undef $X ; +untie %h ; + +unlink $Dfile; + +# Now try an in memory file +my $Y; +ok(72, $Y = tie(%h, 'DB_File',undef, O_RDWR|O_CREAT, 0640, $DB_BTREE )); + +# fd with an in memory file should return failure +$status = $Y->fd ; +ok(73, $status == -1 ); + + +undef $Y ; +untie %h ; + +# Duplicate keys +my $bt = new DB_File::BTREEINFO ; +$bt->{flags} = R_DUP ; +my ($YY, %hh); +ok(74, $YY = tie(%hh, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $bt )) ; + +$hh{'Wall'} = 'Larry' ; +$hh{'Wall'} = 'Stone' ; # Note the duplicate key +$hh{'Wall'} = 'Brick' ; # Note the duplicate key +$hh{'Wall'} = 'Brick' ; # Note the duplicate key and value +$hh{'Smith'} = 'John' ; +$hh{'mouse'} = 'mickey' ; + +# first work in scalar context +ok(75, scalar $YY->get_dup('Unknown') == 0 ); +ok(76, scalar $YY->get_dup('Smith') == 1 ); +ok(77, scalar $YY->get_dup('Wall') == 4 ); + +# now in list context +my @unknown = $YY->get_dup('Unknown') ; +ok(78, "@unknown" eq "" ); + +my @smith = $YY->get_dup('Smith') ; +ok(79, "@smith" eq "John" ); + +{ +my @wall = $YY->get_dup('Wall') ; +my %wall ; +@wall{@wall} = @wall ; +ok(80, (@wall == 4 && $wall{'Larry'} && $wall{'Stone'} && $wall{'Brick'}) ); +} + +# hash +my %unknown = $YY->get_dup('Unknown', 1) ; +ok(81, keys %unknown == 0 ); + +my %smith = $YY->get_dup('Smith', 1) ; +ok(82, keys %smith == 1 && $smith{'John'}) ; + +my %wall = $YY->get_dup('Wall', 1) ; +ok(83, keys %wall == 3 && $wall{'Larry'} == 1 && $wall{'Stone'} == 1 + && $wall{'Brick'} == 2); + +undef $YY ; +untie %hh ; +unlink $Dfile; + + +# test multiple callbacks +my $Dfile1 = "btree1" ; +my $Dfile2 = "btree2" ; +my $Dfile3 = "btree3" ; + +my $dbh1 = new DB_File::BTREEINFO ; +$dbh1->{compare} = sub { + no warnings 'numeric' ; + $_[0] <=> $_[1] } ; + +my $dbh2 = new DB_File::BTREEINFO ; +$dbh2->{compare} = sub { $_[0] cmp $_[1] } ; + +my $dbh3 = new DB_File::BTREEINFO ; +$dbh3->{compare} = sub { length $_[0] <=> length $_[1] } ; + + +my (%g, %k); +tie(%h, 'DB_File',$Dfile1, O_RDWR|O_CREAT, 0640, $dbh1 ) or die $!; +tie(%g, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) or die $!; +tie(%k, 'DB_File',$Dfile3, O_RDWR|O_CREAT, 0640, $dbh3 ) or die $!; + +my @Keys = qw( 0123 12 -1234 9 987654321 def ) ; +my (@srt_1, @srt_2, @srt_3); +{ + no warnings 'numeric' ; + @srt_1 = sort { $a <=> $b } @Keys ; +} +@srt_2 = sort { $a cmp $b } @Keys ; +@srt_3 = sort { length $a <=> length $b } @Keys ; + +foreach (@Keys) { + $h{$_} = 1 ; + $g{$_} = 1 ; + $k{$_} = 1 ; +} + +sub ArrayCompare +{ + my($a, $b) = @_ ; + + return 0 if @$a != @$b ; + + foreach (0 .. @$a - 1) + { + return 0 unless $$a[$_] eq $$b[$_]; + } + + 1 ; +} + +ok(84, ArrayCompare (\@srt_1, [keys %h]) ); +ok(85, ArrayCompare (\@srt_2, [keys %g]) ); +ok(86, ArrayCompare (\@srt_3, [keys %k]) ); + +untie %h ; +untie %g ; +untie %k ; +unlink $Dfile1, $Dfile2, $Dfile3 ; + +# clear +# ##### + +ok(87, tie(%h, 'DB_File', $Dfile1, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); +foreach (1 .. 10) + { $h{$_} = $_ * 100 } + +# check that there are 10 elements in the hash +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(88, $i == 10); + +# now clear the hash +%h = () ; + +# check it is empty +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(89, $i == 0); + +untie %h ; +unlink $Dfile1 ; + +{ + # check that attempting to tie an array to a DB_BTREE will fail + + my $filename = "xyz" ; + my @x ; + eval { tie @x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE ; } ; + ok(90, $@ =~ /^DB_File can only tie an associative array to a DB_BTREE database/) ; + unlink $filename ; +} + +{ + # sub-class test + + package Another ; + + use warnings ; + use strict ; + + open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ; + print FILE <<'EOM' ; + + package SubDB ; + + use warnings ; + use strict ; + our (@ISA, @EXPORT); + + require Exporter ; + use DB_File; + @ISA=qw(DB_File); + @EXPORT = @DB_File::EXPORT ; + + sub STORE { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::STORE($key, $value * 2) ; + } + + sub FETCH { + my $self = shift ; + my $key = shift ; + $self->SUPER::FETCH($key) - 1 ; + } + + sub put { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::put($key, $value * 3) ; + } + + sub get { + my $self = shift ; + $self->SUPER::get($_[0], $_[1]) ; + $_[1] -= 2 ; + } + + sub A_new_method + { + my $self = shift ; + my $key = shift ; + my $value = $self->FETCH($key) ; + return "[[$value]]" ; + } + + 1 ; +EOM + + close FILE ; + + BEGIN { push @INC, '.'; } + eval 'use SubDB ; '; + main::ok(91, $@ eq "") ; + my %h ; + my $X ; + eval ' + $X = tie(%h, "SubDB","dbbtree.tmp", O_RDWR|O_CREAT, 0640, $DB_BTREE ); + ' ; + + main::ok(92, $@ eq "") ; + + my $ret = eval '$h{"fred"} = 3 ; return $h{"fred"} ' ; + main::ok(93, $@ eq "") ; + main::ok(94, $ret == 5) ; + + my $value = 0; + $ret = eval '$X->put("joe", 4) ; $X->get("joe", $value) ; return $value' ; + main::ok(95, $@ eq "") ; + main::ok(96, $ret == 10) ; + + $ret = eval ' R_NEXT eq main::R_NEXT ' ; + main::ok(97, $@ eq "" ) ; + main::ok(98, $ret == 1) ; + + $ret = eval '$X->A_new_method("joe") ' ; + main::ok(99, $@ eq "") ; + main::ok(100, $ret eq "[[11]]") ; + + undef $X; + untie(%h); + unlink "SubDB.pm", "dbbtree.tmp" ; + +} + +{ + # DBM Filter tests + use warnings ; + use strict ; + my (%h, $db) ; + my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + unlink $Dfile; + + sub checkOutput + { + my($fk, $sk, $fv, $sv) = @_ ; + return + $fetch_key eq $fk && $store_key eq $sk && + $fetch_value eq $fv && $store_value eq $sv && + $_ eq 'original' ; + } + + ok(101, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_fetch_key (sub { $fetch_key = $_ }) ; + $db->filter_store_key (sub { $store_key = $_ }) ; + $db->filter_fetch_value (sub { $fetch_value = $_}) ; + $db->filter_store_value (sub { $store_value = $_ }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + # fk sk fv sv + ok(102, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(103, $h{"fred"} eq "joe"); + # fk sk fv sv + ok(104, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(105, $db->FIRSTKEY() eq "fred") ; + # fk sk fv sv + ok(106, checkOutput( "fred", "", "", "")) ; + + # replace the filters, but remember the previous set + my ($old_fk) = $db->filter_fetch_key + (sub { $_ = uc $_ ; $fetch_key = $_ }) ; + my ($old_sk) = $db->filter_store_key + (sub { $_ = lc $_ ; $store_key = $_ }) ; + my ($old_fv) = $db->filter_fetch_value + (sub { $_ = "[$_]"; $fetch_value = $_ }) ; + my ($old_sv) = $db->filter_store_value + (sub { s/o/x/g; $store_value = $_ }) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"Fred"} = "Joe" ; + # fk sk fv sv + ok(107, checkOutput( "", "fred", "", "Jxe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(108, $h{"Fred"} eq "[Jxe]"); + # fk sk fv sv + ok(109, checkOutput( "", "fred", "[Jxe]", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(110, $db->FIRSTKEY() eq "FRED") ; + # fk sk fv sv + ok(111, checkOutput( "FRED", "", "", "")) ; + + # put the original filters back + $db->filter_fetch_key ($old_fk); + $db->filter_store_key ($old_sk); + $db->filter_fetch_value ($old_fv); + $db->filter_store_value ($old_sv); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(112, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(113, $h{"fred"} eq "joe"); + ok(114, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(115, $db->FIRSTKEY() eq "fred") ; + ok(116, checkOutput( "fred", "", "", "")) ; + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(117, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(118, $h{"fred"} eq "joe"); + ok(119, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(120, $db->FIRSTKEY() eq "fred") ; + ok(121, checkOutput( "", "", "", "")) ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter with a closure + + use warnings ; + use strict ; + my (%h, $db) ; + + unlink $Dfile; + ok(122, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + my %result = () ; + + sub Closure + { + my ($name) = @_ ; + my $count = 0 ; + my @kept = () ; + + return sub { ++$count ; + push @kept, $_ ; + $result{$name} = "$name - $count: [@kept]" ; + } + } + + $db->filter_store_key(Closure("store key")) ; + $db->filter_store_value(Closure("store value")) ; + $db->filter_fetch_key(Closure("fetch key")) ; + $db->filter_fetch_value(Closure("fetch value")) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(123, $result{"store key"} eq "store key - 1: [fred]"); + ok(124, $result{"store value"} eq "store value - 1: [joe]"); + ok(125, ! defined $result{"fetch key"} ); + ok(126, ! defined $result{"fetch value"} ); + ok(127, $_ eq "original") ; + + ok(128, $db->FIRSTKEY() eq "fred") ; + ok(129, $result{"store key"} eq "store key - 1: [fred]"); + ok(130, $result{"store value"} eq "store value - 1: [joe]"); + ok(131, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(132, ! defined $result{"fetch value"} ); + ok(133, $_ eq "original") ; + + $h{"jim"} = "john" ; + ok(134, $result{"store key"} eq "store key - 2: [fred jim]"); + ok(135, $result{"store value"} eq "store value - 2: [joe john]"); + ok(136, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(137, ! defined $result{"fetch value"} ); + ok(138, $_ eq "original") ; + + ok(139, $h{"fred"} eq "joe"); + ok(140, $result{"store key"} eq "store key - 3: [fred jim fred]"); + ok(141, $result{"store value"} eq "store value - 2: [joe john]"); + ok(142, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(143, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(144, $_ eq "original") ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter recursion detection + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(145, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_store_key (sub { $_ = $h{$_} }) ; + + eval '$h{1} = 1234' ; + ok(146, $@ =~ /^recursion detected in filter_store_key at/ ); + + undef $db ; + untie %h; + unlink $Dfile; +} + + +{ + # Examples from the POD + + + my $file = "xyzt" ; + { + my $redirect = new Redirect $file ; + + # BTREE example 1 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my %h ; + + sub Compare + { + my ($key1, $key2) = @_ ; + "\L$key1" cmp "\L$key2" ; + } + + # specify the Perl sub that will do the comparison + $DB_BTREE->{'compare'} = \&Compare ; + + unlink "tree" ; + tie %h, "DB_File", "tree", O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open file 'tree': $!\n" ; + + # Add a key/value pair to the file + $h{'Wall'} = 'Larry' ; + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + $h{'duck'} = 'donald' ; + + # Delete + delete $h{"duck"} ; + + # Cycle through the keys printing them in order. + # Note it is not necessary to sort the keys as + # the btree will have kept them in order automatically. + foreach (keys %h) + { print "$_\n" } + + untie %h ; + + unlink "tree" ; + } + + delete $DB_BTREE->{'compare'} ; + + ok(147, docat_del($file) eq <<'EOM') ; +mouse +Smith +Wall +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 2 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, %h); + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the associative array + # and print each key/value pair. + foreach (keys %h) + { print "$_ -> $h{$_}\n" } + + untie %h ; + + unlink $filename ; + } + + ok(148, docat_del($file) eq ($db185mode ? <<'EOM' : <<'EOM') ) ; +Smith -> John +Wall -> Brick +Wall -> Brick +Wall -> Brick +mouse -> mickey +EOM +Smith -> John +Wall -> Larry +Wall -> Larry +Wall -> Larry +mouse -> mickey +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 3 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $status, $key, $value); + + $filename = "tree" ; + unlink $filename ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'Wall'} = 'Larry' ; + $h{'Wall'} = 'Brick' ; # Note the duplicate key + $h{'Wall'} = 'Brick' ; # Note the duplicate key and value + $h{'Smith'} = 'John' ; + $h{'mouse'} = 'mickey' ; + + # iterate through the btree using seq + # and print each key/value pair. + $key = $value = 0 ; + for ($status = $x->seq($key, $value, R_FIRST) ; + $status == 0 ; + $status = $x->seq($key, $value, R_NEXT) ) + { print "$key -> $value\n" } + + + undef $x ; + untie %h ; + } + + ok(149, docat_del($file) eq ($db185mode == 1 ? <<'EOM' : <<'EOM') ) ; +Smith -> John +Wall -> Brick +Wall -> Brick +Wall -> Larry +mouse -> mickey +EOM +Smith -> John +Wall -> Larry +Wall -> Brick +Wall -> Brick +mouse -> mickey +EOM + + + { + my $redirect = new Redirect $file ; + + # BTREE example 4 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h); + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + my $cnt = $x->get_dup("Wall") ; + print "Wall occurred $cnt times\n" ; + + my %hash = $x->get_dup("Wall", 1) ; + print "Larry is there\n" if $hash{'Larry'} ; + print "There are $hash{'Brick'} Brick Walls\n" ; + + my @list = sort $x->get_dup("Wall") ; + print "Wall => [@list]\n" ; + + @list = $x->get_dup("Smith") ; + print "Smith => [@list]\n" ; + + @list = $x->get_dup("Dog") ; + print "Dog => [@list]\n" ; + + undef $x ; + untie %h ; + } + + ok(150, docat_del($file) eq <<'EOM') ; +Wall occurred 3 times +Larry is there +There are 2 Brick Walls +Wall => [Brick Brick Larry] +Smith => [John] +Dog => [] +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 5 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found); + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + $found = ( $x->find_dup("Wall", "Harry") == 0 ? "" : "not") ; + print "Harry Wall is $found there\n" ; + + undef $x ; + untie %h ; + } + + ok(151, docat_del($file) eq <<'EOM') ; +Larry Wall is there +Harry Wall is not there +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 6 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + + my ($filename, $x, %h, $found); + + $filename = "tree" ; + + # Enable duplicate records + $DB_BTREE->{'flags'} = R_DUP ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + $x->del_dup("Wall", "Larry") ; + + $found = ( $x->find_dup("Wall", "Larry") == 0 ? "" : "not") ; + print "Larry Wall is $found there\n" ; + + undef $x ; + untie %h ; + + unlink $filename ; + } + + ok(152, docat_del($file) eq <<'EOM') ; +Larry Wall is not there +EOM + + { + my $redirect = new Redirect $file ; + + # BTREE example 7 + ### + + use warnings FATAL => qw(all) ; + use strict ; + use DB_File ; + use Fcntl ; + + my ($filename, $x, %h, $st, $key, $value); + + sub match + { + my $key = shift ; + my $value = 0; + my $orig_key = $key ; + $x->seq($key, $value, R_CURSOR) ; + print "$orig_key\t-> $key\t-> $value\n" ; + } + + $filename = "tree" ; + unlink $filename ; + + $x = tie %h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_BTREE + or die "Cannot open $filename: $!\n"; + + # Add some key/value pairs to the file + $h{'mouse'} = 'mickey' ; + $h{'Wall'} = 'Larry' ; + $h{'Walls'} = 'Brick' ; + $h{'Smith'} = 'John' ; + + + $key = $value = 0 ; + print "IN ORDER\n" ; + for ($st = $x->seq($key, $value, R_FIRST) ; + $st == 0 ; + $st = $x->seq($key, $value, R_NEXT) ) + + { print "$key -> $value\n" } + + print "\nPARTIAL MATCH\n" ; + + match "Wa" ; + match "A" ; + match "a" ; + + undef $x ; + untie %h ; + + unlink $filename ; + + } + + ok(153, docat_del($file) eq <<'EOM') ; +IN ORDER +Smith -> John +Wall -> Larry +Walls -> Brick +mouse -> mickey + +PARTIAL MATCH +Wa -> Wall -> Larry +A -> Smith -> John +a -> mouse -> mickey +EOM + +} + +#{ +# # R_SETCURSOR +# use strict ; +# my (%h, $db) ; +# unlink $Dfile; +# +# ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); +# +# $h{abc} = 33 ; +# my $k = "newest" ; +# my $v = 44 ; +# my $status = $db->put($k, $v, R_SETCURSOR) ; +# print "status = [$status]\n" ; +# ok(157, $status == 0) ; +# $status = $db->del($k, R_CURSOR) ; +# print "status = [$status]\n" ; +# ok(158, $status == 0) ; +# $k = "newest" ; +# ok(159, $db->get($k, $v, R_CURSOR)) ; +# +# ok(160, keys %h == 1) ; +# +# undef $db ; +# untie %h; +# unlink $Dfile; +#} + +{ + # Bug ID 20001013.009 + # + # test that $hash{KEY} = undef doesn't produce the warning + # Use of uninitialized value in null operation + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_BTREE + or die "Can't open file: $!\n" ; + $h{ABC} = undef; + ok(154, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # test that %hash = () doesn't produce the warning + # Argument "" isn't numeric in entersub + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_BTREE + or die "Can't open file: $!\n" ; + %h = (); ; + ok(155, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # When iterating over a tied hash using "each", the key passed to FETCH + # will be recycled and passed to NEXTKEY. If a Source Filter modifies the + # key in FETCH via a filter_fetch_key method we need to check that the + # modified key doesn't get passed to NEXTKEY. + # Also Test "keys" & "values" while we are at it. + + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my $bad_key = 0 ; + my %h = () ; + my $db ; + ok(156, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + $db->filter_fetch_key (sub { $_ =~ s/^Beta_/Alpha_/ if defined $_}) ; + $db->filter_store_key (sub { $bad_key = 1 if /^Beta_/ ; $_ =~ s/^Alpha_/Beta_/}) ; + + $h{'Alpha_ABC'} = 2 ; + $h{'Alpha_DEF'} = 5 ; + + ok(157, $h{'Alpha_ABC'} == 2); + ok(158, $h{'Alpha_DEF'} == 5); + + my ($k, $v) = ("",""); + while (($k, $v) = each %h) {} + ok(159, $bad_key == 0); + + $bad_key = 0 ; + foreach $k (keys %h) {} + ok(160, $bad_key == 0); + + $bad_key = 0 ; + foreach $v (values %h) {} + ok(161, $bad_key == 0); + + undef $db ; + untie %h ; + unlink $Dfile; +} + +{ + # now an error to pass 'compare' a non-code reference + my $dbh = new DB_File::BTREEINFO ; + + eval { $dbh->{compare} = 2 }; + ok(162, $@ =~ /^Key 'compare' not associated with a code reference at/); + + eval { $dbh->{prefix} = 2 }; + ok(163, $@ =~ /^Key 'prefix' not associated with a code reference at/); + +} + + +#{ +# # recursion detection in btree +# my %hash ; +# unlink $Dfile; +# my $dbh = new DB_File::BTREEINFO ; +# $dbh->{compare} = sub { $hash{3} = 4 ; length $_[0] } ; +# +# +# my (%h); +# ok(164, tie(%hash, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ); +# +# eval { $hash{1} = 2; +# $hash{4} = 5; +# }; +# +# ok(165, $@ =~ /^DB_File btree_compare: recursion detected/); +# { +# no warnings; +# untie %hash; +# } +# unlink $Dfile; +#} +ok(164,1); +ok(165,1); + +{ + # Check that two callbacks don't interact + my %hash1 ; + my %hash2 ; + my $h1_count = 0; + my $h2_count = 0; + unlink $Dfile, $Dfile2; + my $dbh1 = new DB_File::BTREEINFO ; + $dbh1->{compare} = sub { ++ $h1_count ; $_[0] cmp $_[1] } ; + + my $dbh2 = new DB_File::BTREEINFO ; + $dbh2->{compare} = sub { ;++ $h2_count ; $_[0] cmp $_[1] } ; + + + + my (%h); + ok(166, tie(%hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh1 ) ); + ok(167, tie(%hash2, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ); + + $hash1{DEFG} = 5; + $hash1{XYZ} = 2; + $hash1{ABCDE} = 5; + + $hash2{defg} = 5; + $hash2{xyz} = 2; + $hash2{abcde} = 5; + + ok(168, $h1_count > 0); + ok(169, $h1_count == $h2_count); + + ok(170, safeUntie \%hash1); + ok(171, safeUntie \%hash2); + unlink $Dfile, $Dfile2; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(172, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(173, $h{"fred"} eq "joe"); + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (174, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(175, $h{"fred"} eq "joe"); + + ok(176, $db->FIRSTKEY() eq "fred") ; + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (177, ! $@); + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # Check low-level API works with filter + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(178, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE ) ); + + + $db->filter_fetch_key (sub { $_ = unpack("i", $_) } ); + $db->filter_store_key (sub { $_ = pack("i", $_) } ); + $db->filter_fetch_value (sub { $_ = unpack("i", $_) } ); + $db->filter_store_value (sub { $_ = pack("i", $_) } ); + + $_ = 'fred'; + + my $key = 22 ; + my $value = 34 ; + + $db->put($key, $value) ; + ok 179, $key == 22; + ok 180, $value == 34 ; + ok 181, $_ eq 'fred'; + #print "k [$key][$value]\n" ; + + my $val ; + $db->get($key, $val) ; + ok 182, $key == 22; + ok 183, $val == 34 ; + ok 184, $_ eq 'fred'; + + $key = 51 ; + $value = 454; + $h{$key} = $value ; + ok 185, $key == 51; + ok 186, $value == 454 ; + ok 187, $_ eq 'fred'; + + undef $db ; + untie %h; + unlink $Dfile; +} + + + +{ + # Regression Test for bug 30237 + # Check that substr can be used in the key to db_put + # and that db_put does not trigger the warning + # + # Use of uninitialized value in subroutine entry + + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(188, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_BTREE )); + + my $warned = ''; + local $SIG{__WARN__} = sub {$warned = $_[0]} ; + + # db-put with substr of key + my %remember = () ; + for my $ix ( 10 .. 12 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put(substr($key,0), $value) ; + } + + ok 189, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # db-put with substr of value + $warned = ''; + for my $ix ( 20 .. 22 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put($key, substr($value,0)) ; + } + + ok 190, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of key + $warned = ''; + for my $ix ( 30 .. 32 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{substr($key,0)} = $value ; + } + + ok 191, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of value + $warned = ''; + for my $ix ( 40 .. 42 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{$key} = substr($value,0) ; + } + + ok 192, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + my %bad = () ; + $key = ''; + for ($status = $db->seq($key, $value, R_FIRST ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 193, keys %bad == 0 ; + ok 194, keys %remember == 0 ; + + print "# missing -- $key $value\n" while ($key, $value) = each %remember; + print "# bad -- $key $value\n" while ($key, $value) = each %bad; + + # Make sure this fix does not break code to handle an undef key + # Berkeley DB undef key is bron between versions 2.3.16 and + my $value = 'fred'; + $warned = ''; + $db->put(undef, $value) ; + ok 195, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + my $no_NULL = ($DB_File::db_ver >= 2.003016 && $DB_File::db_ver < 3.001) ; + print "# db_ver $DB_File::db_ver\n"; + $value = '' ; + $db->get(undef, $value) ; + ok 196, $no_NULL || $value eq 'fred' or print "# got [$value]\n" ; + ok 197, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + undef $db ; + untie %h; + unlink $Dfile; +} +exit ; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t b/fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t new file mode 100644 index 0000000..f4c8f95 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t @@ -0,0 +1,1225 @@ +#!./perl + +use warnings; +use strict; +use Config; + +BEGIN { + if(-d "lib" && -f "TEST") { + if ($Config{'extensions'} !~ /\bDB_File\b/ ) { + print "1..0 # Skip: DB_File was not built\n"; + exit 0; + } + } +} + +use DB_File; +use Fcntl; + +print "1..166\n"; + +unlink glob "__db.*"; + +sub ok +{ + my $no = shift ; + my $result = shift ; + + print "not " unless $result ; + print "ok $no\n" ; + + return $result ; +} + +{ + package Redirect ; + use Symbol ; + + sub new + { + my $class = shift ; + my $filename = shift ; + my $fh = gensym ; + open ($fh, ">$filename") || die "Cannot open $filename: $!" ; + my $real_stdout = select($fh) ; + return bless [$fh, $real_stdout ] ; + + } + sub DESTROY + { + my $self = shift ; + close $self->[0] ; + select($self->[1]) ; + } +} + +sub docat_del +{ + my $file = shift; + local $/ = undef; + open(CAT,$file) || die "Cannot open $file: $!"; + my $result = ; + close(CAT); + $result = normalise($result) ; + unlink $file ; + return $result; +} + +sub normalise +{ + my $data = shift ; + $data =~ s#\r\n#\n#g + if $^O eq 'cygwin' ; + return $data ; +} + +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie %$hashref; + return $no_inner; +} + + +my $Dfile = "dbhash.tmp"; +my $Dfile2 = "dbhash2.tmp"; +my $null_keys_allowed = ($DB_File::db_ver < 2.004010 + || $DB_File::db_ver >= 3.1 ); + +unlink $Dfile; + +umask(0); + +# Check the interface to HASHINFO + +my $dbh = new DB_File::HASHINFO ; + +ok(1, ! defined $dbh->{bsize}) ; +ok(2, ! defined $dbh->{ffactor}) ; +ok(3, ! defined $dbh->{nelem}) ; +ok(4, ! defined $dbh->{cachesize}) ; +ok(5, ! defined $dbh->{hash}) ; +ok(6, ! defined $dbh->{lorder}) ; + +$dbh->{bsize} = 3000 ; +ok(7, $dbh->{bsize} == 3000 ); + +$dbh->{ffactor} = 9000 ; +ok(8, $dbh->{ffactor} == 9000 ); + +$dbh->{nelem} = 400 ; +ok(9, $dbh->{nelem} == 400 ); + +$dbh->{cachesize} = 65 ; +ok(10, $dbh->{cachesize} == 65 ); + +my $some_sub = sub {} ; +$dbh->{hash} = $some_sub; +ok(11, $dbh->{hash} eq $some_sub ); + +$dbh->{lorder} = 1234 ; +ok(12, $dbh->{lorder} == 1234 ); + +# Check that an invalid entry is caught both for store & fetch +eval '$dbh->{fred} = 1234' ; +ok(13, $@ =~ /^DB_File::HASHINFO::STORE - Unknown element 'fred' at/ ); +eval 'my $q = $dbh->{fred}' ; +ok(14, $@ =~ /^DB_File::HASHINFO::FETCH - Unknown element 'fred' at/ ); + + +# Now check the interface to HASH +my ($X, %h); +ok(15, $X = tie(%h, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); +die "Could not tie: $!" unless $X; + +my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); + +my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; + +ok(16, ($mode & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) || + $noMode{$^O} ); + +my ($key, $value, $i); +while (($key,$value) = each(%h)) { + $i++; +} +ok(17, !$i ); + +$h{'goner1'} = 'snork'; + +$h{'abc'} = 'ABC'; +ok(18, $h{'abc'} eq 'ABC' ); +ok(19, !defined $h{'jimmy'} ); +ok(20, !exists $h{'jimmy'} ); +ok(21, exists $h{'abc'} ); + +$h{'def'} = 'DEF'; +$h{'jkl','mno'} = "JKL\034MNO"; +$h{'a',2,3,4,5} = join("\034",'A',2,3,4,5); +$h{'a'} = 'A'; + +#$h{'b'} = 'B'; +$X->STORE('b', 'B') ; + +$h{'c'} = 'C'; + +#$h{'d'} = 'D'; +$X->put('d', 'D') ; + +$h{'e'} = 'E'; +$h{'f'} = 'F'; +$h{'g'} = 'X'; +$h{'h'} = 'H'; +$h{'i'} = 'I'; + +$h{'goner2'} = 'snork'; +delete $h{'goner2'}; + + +# IMPORTANT - $X must be undefined before the untie otherwise the +# underlying DB close routine will not get called. +undef $X ; +untie(%h); + + +# tie to the same file again, do not supply a type - should default to HASH +ok(22, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640) ); + +# Modify an entry from the previous tie +$h{'g'} = 'G'; + +$h{'j'} = 'J'; +$h{'k'} = 'K'; +$h{'l'} = 'L'; +$h{'m'} = 'M'; +$h{'n'} = 'N'; +$h{'o'} = 'O'; +$h{'p'} = 'P'; +$h{'q'} = 'Q'; +$h{'r'} = 'R'; +$h{'s'} = 'S'; +$h{'t'} = 'T'; +$h{'u'} = 'U'; +$h{'v'} = 'V'; +$h{'w'} = 'W'; +$h{'x'} = 'X'; +$h{'y'} = 'Y'; +$h{'z'} = 'Z'; + +$h{'goner3'} = 'snork'; + +delete $h{'goner1'}; +$X->DELETE('goner3'); + +my @keys = keys(%h); +my @values = values(%h); + +ok(23, $#keys == 29 && $#values == 29) ; + +$i = 0 ; +while (($key,$value) = each(%h)) { + if ($key eq $keys[$i] && $value eq $values[$i] && $key eq lc($value)) { + $key =~ y/a-z/A-Z/; + $i++ if $key eq $value; + } +} + +ok(24, $i == 30) ; + +@keys = ('blurfl', keys(%h), 'dyick'); +ok(25, $#keys == 31) ; + +$h{'foo'} = ''; +ok(26, $h{'foo'} eq '' ); + +# Berkeley DB from version 2.4.10 to 3.0 does not allow null keys. +# This feature was reenabled in version 3.1 of Berkeley DB. +my $result = 0 ; +if ($null_keys_allowed) { + $h{''} = 'bar'; + $result = ( $h{''} eq 'bar' ); +} +else + { $result = 1 } +ok(27, $result) ; + +# check cache overflow and numeric keys and contents +my $ok = 1; +for ($i = 1; $i < 200; $i++) { $h{$i + 0} = $i + 0; } +for ($i = 1; $i < 200; $i++) { $ok = 0 unless $h{$i} == $i; } +ok(28, $ok ); + +($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); +ok(29, $size > 0 ); + +@h{0..200} = 200..400; +my @foo = @h{0..200}; +ok(30, join(':',200..400) eq join(':',@foo) ); + + +# Now check all the non-tie specific stuff + +# Check NOOVERWRITE will make put fail when attempting to overwrite +# an existing record. + +my $status = $X->put( 'x', 'newvalue', R_NOOVERWRITE) ; +ok(31, $status == 1 ); + +# check that the value of the key 'x' has not been changed by the +# previous test +ok(32, $h{'x'} eq 'X' ); + +# standard put +$status = $X->put('key', 'value') ; +ok(33, $status == 0 ); + +#check that previous put can be retrieved +$value = 0 ; +$status = $X->get('key', $value) ; +ok(34, $status == 0 ); +ok(35, $value eq 'value' ); + +# Attempting to delete an existing key should work + +$status = $X->del('q') ; +ok(36, $status == 0 ); + +# Make sure that the key deleted, cannot be retrieved +{ + no warnings 'uninitialized' ; + ok(37, $h{'q'} eq undef ); +} + +# Attempting to delete a non-existent key should fail + +$status = $X->del('joe') ; +ok(38, $status == 1 ); + +# Check the get interface + +# First a non-existing key +$status = $X->get('aaaa', $value) ; +ok(39, $status == 1 ); + +# Next an existing key +$status = $X->get('a', $value) ; +ok(40, $status == 0 ); +ok(41, $value eq 'A' ); + +# seq +# ### + +# ditto, but use put to replace the key/value pair. + +# use seq to walk backwards through a file - check that this reversed is + +# check seq FIRST/LAST + +# sync +# #### + +$status = $X->sync ; +ok(42, $status == 0 ); + + +# fd +# ## + +$status = $X->fd ; +ok(43, 1 ); +#ok(43, $status != 0 ); + +undef $X ; +untie %h ; + +unlink $Dfile; + +# clear +# ##### + +ok(44, tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); +foreach (1 .. 10) + { $h{$_} = $_ * 100 } + +# check that there are 10 elements in the hash +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(45, $i == 10); + +# now clear the hash +%h = () ; + +# check it is empty +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(46, $i == 0); + +untie %h ; +unlink $Dfile ; + + +# Now try an in memory file +ok(47, $X = tie(%h, 'DB_File',undef, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + +# fd with an in memory file should return fail +$status = $X->fd ; +ok(48, $status == -1 ); + +undef $X ; +untie %h ; + +{ + # check ability to override the default hashing + my %x ; + my $filename = "xyz" ; + my $hi = new DB_File::HASHINFO ; + $::count = 0 ; + $hi->{hash} = sub { ++$::count ; length $_[0] } ; + ok(49, tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $hi ) ; + $h{"abc"} = 123 ; + ok(50, $h{"abc"} == 123) ; + untie %x ; + unlink $filename ; + ok(51, $::count >0) ; +} + +{ + # check that attempting to tie an array to a DB_HASH will fail + + my $filename = "xyz" ; + my @x ; + eval { tie @x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_HASH ; } ; + ok(52, $@ =~ /^DB_File can only tie an associative array to a DB_HASH database/) ; + unlink $filename ; +} + +{ + # sub-class test + + package Another ; + + use warnings ; + use strict ; + + open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ; + print FILE <<'EOM' ; + + package SubDB ; + + use warnings ; + use strict ; + our (@ISA, @EXPORT); + + require Exporter ; + use DB_File; + @ISA=qw(DB_File); + @EXPORT = @DB_File::EXPORT ; + + sub STORE { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::STORE($key, $value * 2) ; + } + + sub FETCH { + my $self = shift ; + my $key = shift ; + $self->SUPER::FETCH($key) - 1 ; + } + + sub put { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::put($key, $value * 3) ; + } + + sub get { + my $self = shift ; + $self->SUPER::get($_[0], $_[1]) ; + $_[1] -= 2 ; + } + + sub A_new_method + { + my $self = shift ; + my $key = shift ; + my $value = $self->FETCH($key) ; + return "[[$value]]" ; + } + + 1 ; +EOM + + close FILE ; + + BEGIN { push @INC, '.'; } + eval 'use SubDB ; '; + main::ok(53, $@ eq "") ; + my %h ; + my $X ; + eval ' + $X = tie(%h, "SubDB","dbhash.tmp", O_RDWR|O_CREAT, 0640, $DB_HASH ); + ' ; + + main::ok(54, $@ eq "") ; + + my $ret = eval '$h{"fred"} = 3 ; return $h{"fred"} ' ; + main::ok(55, $@ eq "") ; + main::ok(56, $ret == 5) ; + + my $value = 0; + $ret = eval '$X->put("joe", 4) ; $X->get("joe", $value) ; return $value' ; + main::ok(57, $@ eq "") ; + main::ok(58, $ret == 10) ; + + $ret = eval ' R_NEXT eq main::R_NEXT ' ; + main::ok(59, $@ eq "" ) ; + main::ok(60, $ret == 1) ; + + $ret = eval '$X->A_new_method("joe") ' ; + main::ok(61, $@ eq "") ; + main::ok(62, $ret eq "[[11]]") ; + + undef $X; + untie(%h); + unlink "SubDB.pm", "dbhash.tmp" ; + +} + +{ + # DBM Filter tests + use warnings ; + use strict ; + my (%h, $db) ; + my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + unlink $Dfile; + + sub checkOutput + { + no warnings 'uninitialized'; + my($fk, $sk, $fv, $sv) = @_ ; + + print "# Fetch Key : expected '$fk' got '$fetch_key'\n" + if $fetch_key ne $fk ; + print "# Fetch Value : expected '$fv' got '$fetch_value'\n" + if $fetch_value ne $fv ; + print "# Store Key : expected '$sk' got '$store_key'\n" + if $store_key ne $sk ; + print "# Store Value : expected '$sv' got '$store_value'\n" + if $store_value ne $sv ; + print "# \$_ : expected 'original' got '$_'\n" + if $_ ne 'original' ; + + return + $fetch_key eq $fk && $store_key eq $sk && + $fetch_value eq $fv && $store_value eq $sv && + $_ eq 'original' ; + } + + ok(63, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_fetch_key (sub { $fetch_key = $_ }) ; + $db->filter_store_key (sub { $store_key = $_ }) ; + $db->filter_fetch_value (sub { $fetch_value = $_}) ; + $db->filter_store_value (sub { $store_value = $_ }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + # fk sk fv sv + ok(64, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(65, $h{"fred"} eq "joe"); + # fk sk fv sv + ok(66, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + my ($k, $v) ; + $k = 'fred'; + ok(67, ! $db->seq($k, $v, R_FIRST) ) ; + ok(68, $k eq "fred") ; + ok(69, $v eq "joe") ; + # fk sk fv sv + ok(70, checkOutput( "fred", "fred", "joe", "")) ; + + # replace the filters, but remember the previous set + my ($old_fk) = $db->filter_fetch_key + (sub { $_ = uc $_ ; $fetch_key = $_ }) ; + my ($old_sk) = $db->filter_store_key + (sub { $_ = lc $_ ; $store_key = $_ }) ; + my ($old_fv) = $db->filter_fetch_value + (sub { $_ = "[$_]"; $fetch_value = $_ }) ; + my ($old_sv) = $db->filter_store_value + (sub { s/o/x/g; $store_value = $_ }) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"Fred"} = "Joe" ; + # fk sk fv sv + ok(71, checkOutput( "", "fred", "", "Jxe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(72, $h{"Fred"} eq "[Jxe]"); + # fk sk fv sv + ok(73, checkOutput( "", "fred", "[Jxe]", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $k = 'Fred'; $v =''; + ok(74, ! $db->seq($k, $v, R_FIRST) ) ; + ok(75, $k eq "FRED") or + print "# k [$k]\n" ; + ok(76, $v eq "[Jxe]") ; + # fk sk fv sv + ok(77, checkOutput( "FRED", "fred", "[Jxe]", "")) ; + + # put the original filters back + $db->filter_fetch_key ($old_fk); + $db->filter_store_key ($old_sk); + $db->filter_fetch_value ($old_fv); + $db->filter_store_value ($old_sv); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(78, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(79, $h{"fred"} eq "joe"); + ok(80, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + #ok(77, $db->FIRSTKEY() eq "fred") ; + $k = 'fred'; + ok(81, ! $db->seq($k, $v, R_FIRST) ) ; + ok(82, $k eq "fred") ; + ok(83, $v eq "joe") ; + # fk sk fv sv + ok(84, checkOutput( "fred", "fred", "joe", "")) ; + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(85, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(86, $h{"fred"} eq "joe"); + ok(87, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $k = 'fred'; + ok(88, ! $db->seq($k, $v, R_FIRST) ) ; + ok(89, $k eq "fred") ; + ok(90, $v eq "joe") ; + ok(91, checkOutput( "", "", "", "")) ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter with a closure + + use warnings ; + use strict ; + my (%h, $db) ; + + unlink $Dfile; + ok(92, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + my %result = () ; + + sub Closure + { + my ($name) = @_ ; + my $count = 0 ; + my @kept = () ; + + return sub { ++$count ; + push @kept, $_ ; + $result{$name} = "$name - $count: [@kept]" ; + } + } + + $db->filter_store_key(Closure("store key")) ; + $db->filter_store_value(Closure("store value")) ; + $db->filter_fetch_key(Closure("fetch key")) ; + $db->filter_fetch_value(Closure("fetch value")) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(93, $result{"store key"} eq "store key - 1: [fred]"); + ok(94, $result{"store value"} eq "store value - 1: [joe]"); + ok(95, ! defined $result{"fetch key"} ); + ok(96, ! defined $result{"fetch value"} ); + ok(97, $_ eq "original") ; + + ok(98, $db->FIRSTKEY() eq "fred") ; + ok(99, $result{"store key"} eq "store key - 1: [fred]"); + ok(100, $result{"store value"} eq "store value - 1: [joe]"); + ok(101, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(102, ! defined $result{"fetch value"} ); + ok(103, $_ eq "original") ; + + $h{"jim"} = "john" ; + ok(104, $result{"store key"} eq "store key - 2: [fred jim]"); + ok(105, $result{"store value"} eq "store value - 2: [joe john]"); + ok(106, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(107, ! defined $result{"fetch value"} ); + ok(108, $_ eq "original") ; + + ok(109, $h{"fred"} eq "joe"); + ok(110, $result{"store key"} eq "store key - 3: [fred jim fred]"); + ok(111, $result{"store value"} eq "store value - 2: [joe john]"); + ok(112, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(113, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(114, $_ eq "original") ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter recursion detection + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(115, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_store_key (sub { $_ = $h{$_} }) ; + + eval '$h{1} = 1234' ; + ok(116, $@ =~ /^recursion detected in filter_store_key at/ ); + + undef $db ; + untie %h; + unlink $Dfile; +} + + +{ + # Examples from the POD + + my $file = "xyzt" ; + { + my $redirect = new Redirect $file ; + + use warnings FATAL => qw(all); + use strict ; + use DB_File ; + our (%h, $k, $v); + + unlink "fruit" ; + tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0640, $DB_HASH + or die "Cannot open file 'fruit': $!\n"; + + # Add a few key/value pairs to the file + $h{"apple"} = "red" ; + $h{"orange"} = "orange" ; + $h{"banana"} = "yellow" ; + $h{"tomato"} = "red" ; + + # Check for existence of a key + print "Banana Exists\n\n" if $h{"banana"} ; + + # Delete a key/value pair. + delete $h{"apple"} ; + + # print the contents of the file + while (($k, $v) = each %h) + { print "$k -> $v\n" } + + untie %h ; + + unlink "fruit" ; + } + + ok(117, docat_del($file) eq <<'EOM') ; +Banana Exists + +orange -> orange +tomato -> red +banana -> yellow +EOM + +} + +{ + # Bug ID 20001013.009 + # + # test that $hash{KEY} = undef doesn't produce the warning + # Use of uninitialized value in null operation + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile or die "Can't open file: $!\n" ; + $h{ABC} = undef; + ok(118, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # test that %hash = () doesn't produce the warning + # Argument "" isn't numeric in entersub + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile or die "Can't open file: $!\n" ; + %h = (); ; + ok(119, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # When iterating over a tied hash using "each", the key passed to FETCH + # will be recycled and passed to NEXTKEY. If a Source Filter modifies the + # key in FETCH via a filter_fetch_key method we need to check that the + # modified key doesn't get passed to NEXTKEY. + # Also Test "keys" & "values" while we are at it. + + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my $bad_key = 0 ; + my %h = () ; + my $db ; + ok(120, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + $db->filter_fetch_key (sub { $_ =~ s/^Beta_/Alpha_/ if defined $_}) ; + $db->filter_store_key (sub { $bad_key = 1 if /^Beta_/ ; $_ =~ s/^Alpha_/Beta_/}) ; + + $h{'Alpha_ABC'} = 2 ; + $h{'Alpha_DEF'} = 5 ; + + ok(121, $h{'Alpha_ABC'} == 2); + ok(122, $h{'Alpha_DEF'} == 5); + + my ($k, $v) = ("",""); + while (($k, $v) = each %h) {} + ok(123, $bad_key == 0); + + $bad_key = 0 ; + foreach $k (keys %h) {} + ok(124, $bad_key == 0); + + $bad_key = 0 ; + foreach $v (values %h) {} + ok(125, $bad_key == 0); + + undef $db ; + untie %h ; + unlink $Dfile; +} + +{ + # now an error to pass 'hash' a non-code reference + my $dbh = new DB_File::HASHINFO ; + + eval { $dbh->{hash} = 2 }; + ok(126, $@ =~ /^Key 'hash' not associated with a code reference at/); + +} + + +#{ +# # recursion detection in hash +# my %hash ; +# my $Dfile = "xxx.db"; +# unlink $Dfile; +# my $dbh = new DB_File::HASHINFO ; +# $dbh->{hash} = sub { $hash{3} = 4 ; length $_[0] } ; +# +# +# ok(127, tie(%hash, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ); +# +# eval { $hash{1} = 2; +# $hash{4} = 5; +# }; +# +# ok(128, $@ =~ /^DB_File hash callback: recursion detected/); +# { +# no warnings; +# untie %hash; +# } +# unlink $Dfile; +#} + +#ok(127, 1); +#ok(128, 1); + +{ + # Check that two hash's don't interact + my %hash1 ; + my %hash2 ; + my $h1_count = 0; + my $h2_count = 0; + unlink $Dfile, $Dfile2; + my $dbh1 = new DB_File::HASHINFO ; + $dbh1->{hash} = sub { ++ $h1_count ; length $_[0] } ; + + my $dbh2 = new DB_File::HASHINFO ; + $dbh2->{hash} = sub { ++ $h2_count ; length $_[0] } ; + + + + my (%h); + ok(127, tie(%hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh1 ) ); + ok(128, tie(%hash2, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ); + + $hash1{DEFG} = 5; + $hash1{XYZ} = 2; + $hash1{ABCDE} = 5; + + $hash2{defg} = 5; + $hash2{xyz} = 2; + $hash2{abcde} = 5; + + ok(129, $h1_count > 0); + ok(130, $h1_count == $h2_count); + + ok(131, safeUntie \%hash1); + ok(132, safeUntie \%hash2); + unlink $Dfile, $Dfile2; +} + +{ + # Passing undef for flags and/or mode when calling tie could cause + # Use of uninitialized value in subroutine entry + + + my $warn_count = 0 ; + #local $SIG{__WARN__} = sub { ++ $warn_count }; + my %hash1; + unlink $Dfile; + + tie %hash1, 'DB_File',$Dfile, undef; + ok(133, $warn_count == 0); + $warn_count = 0; + untie %hash1; + unlink $Dfile; + tie %hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, undef; + ok(134, $warn_count == 0); + untie %hash1; + unlink $Dfile; + tie %hash1, 'DB_File',$Dfile, undef, undef; + ok(135, $warn_count == 0); + $warn_count = 0; + + untie %hash1; + unlink $Dfile; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(136, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(137, $h{"fred"} eq "joe"); + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (138, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(139, $h{"fred"} eq "joe"); + + ok(140, $db->FIRSTKEY() eq "fred") ; + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (141, ! $@); + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # Check low-level API works with filter + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(142, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + + $db->filter_fetch_key (sub { $_ = unpack("i", $_) } ); + $db->filter_store_key (sub { $_ = pack("i", $_) } ); + $db->filter_fetch_value (sub { $_ = unpack("i", $_) } ); + $db->filter_store_value (sub { $_ = pack("i", $_) } ); + + $_ = 'fred'; + + my $key = 22 ; + my $value = 34 ; + + $db->put($key, $value) ; + ok 143, $key == 22; + ok 144, $value == 34 ; + ok 145, $_ eq 'fred'; + #print "k [$key][$value]\n" ; + + my $val ; + $db->get($key, $val) ; + ok 146, $key == 22; + ok 147, $val == 34 ; + ok 148, $_ eq 'fred'; + + $key = 51 ; + $value = 454; + $h{$key} = $value ; + ok 149, $key == 51; + ok 150, $value == 454 ; + ok 151, $_ eq 'fred'; + + undef $db ; + untie %h; + unlink $Dfile; +} + + +{ + # Regression Test for bug 30237 + # Check that substr can be used in the key to db_put + # and that db_put does not trigger the warning + # + # Use of uninitialized value in subroutine entry + + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(152, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + my $warned = ''; + local $SIG{__WARN__} = sub {$warned = $_[0]} ; + + # db-put with substr of key + my %remember = () ; + for my $ix ( 1 .. 2 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put(substr($key,0), $value) ; + } + + ok 153, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # db-put with substr of value + $warned = ''; + for my $ix ( 10 .. 12 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put($key, substr($value,0)) ; + } + + ok 154, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of key + $warned = ''; + for my $ix ( 30 .. 32 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{substr($key,0)} = $value ; + } + + ok 155, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of value + $warned = ''; + for my $ix ( 40 .. 42 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{$key} = substr($value,0) ; + } + + ok 156, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + my %bad = () ; + $key = ''; + for ($status = $db->seq(substr($key,0), substr($value,0), R_FIRST ) ; + $status == 0 ; + $status = $db->seq(substr($key,0), substr($value,0), R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 157, keys %bad == 0 ; + ok 158, keys %remember == 0 ; + + print "# missing -- $key=>$value\n" while ($key, $value) = each %remember; + print "# bad -- $key=>$value\n" while ($key, $value) = each %bad; + + # Make sure this fix does not break code to handle an undef key + # Berkeley DB undef key is broken between versions 2.3.16 and 3.1 + my $value = 'fred'; + $warned = ''; + $db->put(undef, $value) ; + ok 159, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + my $no_NULL = ($DB_File::db_ver >= 2.003016 && $DB_File::db_ver < 3.001) ; + print "# db_ver $DB_File::db_ver\n"; + $value = '' ; + $db->get(undef, $value) ; + ok 160, $no_NULL || $value eq 'fred' or print "# got [$value]\n" ; + ok 161, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # Check filter + substr + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(162, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + + { + $db->filter_fetch_key (sub { lc $_ } ); + $db->filter_store_key (sub { uc $_ } ); + $db->filter_fetch_value (sub { lc $_ } ); + $db->filter_store_value (sub { uc $_ } ); + } + + $_ = 'fred'; + + # db-put with substr of key + my %remember = () ; + my $status = 0 ; + for my $ix ( 1 .. 2 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $status += $db->put(substr($key,0), substr($value,0)) ; + } + + ok 163, $status == 0 or print "# Status $status\n" ; + + if (1) + { + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + } + + my %bad = () ; + my $key = ''; + my $value = ''; + for ($status = $db->seq($key, $value, R_FIRST ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 164, $_ eq 'fred'; + ok 165, keys %bad == 0 ; + ok 166, keys %remember == 0 ; + + print "# missing -- $key $value\n" while ($key, $value) = each %remember; + print "# bad -- $key $value\n" while ($key, $value) = each %bad; + undef $db ; + untie %h; + unlink $Dfile; +} + +exit ; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t.bak b/fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t.bak new file mode 100644 index 0000000..f4c8f95 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/db-hash.t.bak @@ -0,0 +1,1225 @@ +#!./perl + +use warnings; +use strict; +use Config; + +BEGIN { + if(-d "lib" && -f "TEST") { + if ($Config{'extensions'} !~ /\bDB_File\b/ ) { + print "1..0 # Skip: DB_File was not built\n"; + exit 0; + } + } +} + +use DB_File; +use Fcntl; + +print "1..166\n"; + +unlink glob "__db.*"; + +sub ok +{ + my $no = shift ; + my $result = shift ; + + print "not " unless $result ; + print "ok $no\n" ; + + return $result ; +} + +{ + package Redirect ; + use Symbol ; + + sub new + { + my $class = shift ; + my $filename = shift ; + my $fh = gensym ; + open ($fh, ">$filename") || die "Cannot open $filename: $!" ; + my $real_stdout = select($fh) ; + return bless [$fh, $real_stdout ] ; + + } + sub DESTROY + { + my $self = shift ; + close $self->[0] ; + select($self->[1]) ; + } +} + +sub docat_del +{ + my $file = shift; + local $/ = undef; + open(CAT,$file) || die "Cannot open $file: $!"; + my $result = ; + close(CAT); + $result = normalise($result) ; + unlink $file ; + return $result; +} + +sub normalise +{ + my $data = shift ; + $data =~ s#\r\n#\n#g + if $^O eq 'cygwin' ; + return $data ; +} + +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie %$hashref; + return $no_inner; +} + + +my $Dfile = "dbhash.tmp"; +my $Dfile2 = "dbhash2.tmp"; +my $null_keys_allowed = ($DB_File::db_ver < 2.004010 + || $DB_File::db_ver >= 3.1 ); + +unlink $Dfile; + +umask(0); + +# Check the interface to HASHINFO + +my $dbh = new DB_File::HASHINFO ; + +ok(1, ! defined $dbh->{bsize}) ; +ok(2, ! defined $dbh->{ffactor}) ; +ok(3, ! defined $dbh->{nelem}) ; +ok(4, ! defined $dbh->{cachesize}) ; +ok(5, ! defined $dbh->{hash}) ; +ok(6, ! defined $dbh->{lorder}) ; + +$dbh->{bsize} = 3000 ; +ok(7, $dbh->{bsize} == 3000 ); + +$dbh->{ffactor} = 9000 ; +ok(8, $dbh->{ffactor} == 9000 ); + +$dbh->{nelem} = 400 ; +ok(9, $dbh->{nelem} == 400 ); + +$dbh->{cachesize} = 65 ; +ok(10, $dbh->{cachesize} == 65 ); + +my $some_sub = sub {} ; +$dbh->{hash} = $some_sub; +ok(11, $dbh->{hash} eq $some_sub ); + +$dbh->{lorder} = 1234 ; +ok(12, $dbh->{lorder} == 1234 ); + +# Check that an invalid entry is caught both for store & fetch +eval '$dbh->{fred} = 1234' ; +ok(13, $@ =~ /^DB_File::HASHINFO::STORE - Unknown element 'fred' at/ ); +eval 'my $q = $dbh->{fred}' ; +ok(14, $@ =~ /^DB_File::HASHINFO::FETCH - Unknown element 'fred' at/ ); + + +# Now check the interface to HASH +my ($X, %h); +ok(15, $X = tie(%h, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); +die "Could not tie: $!" unless $X; + +my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); + +my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; + +ok(16, ($mode & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) || + $noMode{$^O} ); + +my ($key, $value, $i); +while (($key,$value) = each(%h)) { + $i++; +} +ok(17, !$i ); + +$h{'goner1'} = 'snork'; + +$h{'abc'} = 'ABC'; +ok(18, $h{'abc'} eq 'ABC' ); +ok(19, !defined $h{'jimmy'} ); +ok(20, !exists $h{'jimmy'} ); +ok(21, exists $h{'abc'} ); + +$h{'def'} = 'DEF'; +$h{'jkl','mno'} = "JKL\034MNO"; +$h{'a',2,3,4,5} = join("\034",'A',2,3,4,5); +$h{'a'} = 'A'; + +#$h{'b'} = 'B'; +$X->STORE('b', 'B') ; + +$h{'c'} = 'C'; + +#$h{'d'} = 'D'; +$X->put('d', 'D') ; + +$h{'e'} = 'E'; +$h{'f'} = 'F'; +$h{'g'} = 'X'; +$h{'h'} = 'H'; +$h{'i'} = 'I'; + +$h{'goner2'} = 'snork'; +delete $h{'goner2'}; + + +# IMPORTANT - $X must be undefined before the untie otherwise the +# underlying DB close routine will not get called. +undef $X ; +untie(%h); + + +# tie to the same file again, do not supply a type - should default to HASH +ok(22, $X = tie(%h,'DB_File',$Dfile, O_RDWR, 0640) ); + +# Modify an entry from the previous tie +$h{'g'} = 'G'; + +$h{'j'} = 'J'; +$h{'k'} = 'K'; +$h{'l'} = 'L'; +$h{'m'} = 'M'; +$h{'n'} = 'N'; +$h{'o'} = 'O'; +$h{'p'} = 'P'; +$h{'q'} = 'Q'; +$h{'r'} = 'R'; +$h{'s'} = 'S'; +$h{'t'} = 'T'; +$h{'u'} = 'U'; +$h{'v'} = 'V'; +$h{'w'} = 'W'; +$h{'x'} = 'X'; +$h{'y'} = 'Y'; +$h{'z'} = 'Z'; + +$h{'goner3'} = 'snork'; + +delete $h{'goner1'}; +$X->DELETE('goner3'); + +my @keys = keys(%h); +my @values = values(%h); + +ok(23, $#keys == 29 && $#values == 29) ; + +$i = 0 ; +while (($key,$value) = each(%h)) { + if ($key eq $keys[$i] && $value eq $values[$i] && $key eq lc($value)) { + $key =~ y/a-z/A-Z/; + $i++ if $key eq $value; + } +} + +ok(24, $i == 30) ; + +@keys = ('blurfl', keys(%h), 'dyick'); +ok(25, $#keys == 31) ; + +$h{'foo'} = ''; +ok(26, $h{'foo'} eq '' ); + +# Berkeley DB from version 2.4.10 to 3.0 does not allow null keys. +# This feature was reenabled in version 3.1 of Berkeley DB. +my $result = 0 ; +if ($null_keys_allowed) { + $h{''} = 'bar'; + $result = ( $h{''} eq 'bar' ); +} +else + { $result = 1 } +ok(27, $result) ; + +# check cache overflow and numeric keys and contents +my $ok = 1; +for ($i = 1; $i < 200; $i++) { $h{$i + 0} = $i + 0; } +for ($i = 1; $i < 200; $i++) { $ok = 0 unless $h{$i} == $i; } +ok(28, $ok ); + +($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime, + $blksize,$blocks) = stat($Dfile); +ok(29, $size > 0 ); + +@h{0..200} = 200..400; +my @foo = @h{0..200}; +ok(30, join(':',200..400) eq join(':',@foo) ); + + +# Now check all the non-tie specific stuff + +# Check NOOVERWRITE will make put fail when attempting to overwrite +# an existing record. + +my $status = $X->put( 'x', 'newvalue', R_NOOVERWRITE) ; +ok(31, $status == 1 ); + +# check that the value of the key 'x' has not been changed by the +# previous test +ok(32, $h{'x'} eq 'X' ); + +# standard put +$status = $X->put('key', 'value') ; +ok(33, $status == 0 ); + +#check that previous put can be retrieved +$value = 0 ; +$status = $X->get('key', $value) ; +ok(34, $status == 0 ); +ok(35, $value eq 'value' ); + +# Attempting to delete an existing key should work + +$status = $X->del('q') ; +ok(36, $status == 0 ); + +# Make sure that the key deleted, cannot be retrieved +{ + no warnings 'uninitialized' ; + ok(37, $h{'q'} eq undef ); +} + +# Attempting to delete a non-existent key should fail + +$status = $X->del('joe') ; +ok(38, $status == 1 ); + +# Check the get interface + +# First a non-existing key +$status = $X->get('aaaa', $value) ; +ok(39, $status == 1 ); + +# Next an existing key +$status = $X->get('a', $value) ; +ok(40, $status == 0 ); +ok(41, $value eq 'A' ); + +# seq +# ### + +# ditto, but use put to replace the key/value pair. + +# use seq to walk backwards through a file - check that this reversed is + +# check seq FIRST/LAST + +# sync +# #### + +$status = $X->sync ; +ok(42, $status == 0 ); + + +# fd +# ## + +$status = $X->fd ; +ok(43, 1 ); +#ok(43, $status != 0 ); + +undef $X ; +untie %h ; + +unlink $Dfile; + +# clear +# ##### + +ok(44, tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); +foreach (1 .. 10) + { $h{$_} = $_ * 100 } + +# check that there are 10 elements in the hash +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(45, $i == 10); + +# now clear the hash +%h = () ; + +# check it is empty +$i = 0 ; +while (($key,$value) = each(%h)) { + $i++; +} +ok(46, $i == 0); + +untie %h ; +unlink $Dfile ; + + +# Now try an in memory file +ok(47, $X = tie(%h, 'DB_File',undef, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + +# fd with an in memory file should return fail +$status = $X->fd ; +ok(48, $status == -1 ); + +undef $X ; +untie %h ; + +{ + # check ability to override the default hashing + my %x ; + my $filename = "xyz" ; + my $hi = new DB_File::HASHINFO ; + $::count = 0 ; + $hi->{hash} = sub { ++$::count ; length $_[0] } ; + ok(49, tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $hi ) ; + $h{"abc"} = 123 ; + ok(50, $h{"abc"} == 123) ; + untie %x ; + unlink $filename ; + ok(51, $::count >0) ; +} + +{ + # check that attempting to tie an array to a DB_HASH will fail + + my $filename = "xyz" ; + my @x ; + eval { tie @x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_HASH ; } ; + ok(52, $@ =~ /^DB_File can only tie an associative array to a DB_HASH database/) ; + unlink $filename ; +} + +{ + # sub-class test + + package Another ; + + use warnings ; + use strict ; + + open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ; + print FILE <<'EOM' ; + + package SubDB ; + + use warnings ; + use strict ; + our (@ISA, @EXPORT); + + require Exporter ; + use DB_File; + @ISA=qw(DB_File); + @EXPORT = @DB_File::EXPORT ; + + sub STORE { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::STORE($key, $value * 2) ; + } + + sub FETCH { + my $self = shift ; + my $key = shift ; + $self->SUPER::FETCH($key) - 1 ; + } + + sub put { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::put($key, $value * 3) ; + } + + sub get { + my $self = shift ; + $self->SUPER::get($_[0], $_[1]) ; + $_[1] -= 2 ; + } + + sub A_new_method + { + my $self = shift ; + my $key = shift ; + my $value = $self->FETCH($key) ; + return "[[$value]]" ; + } + + 1 ; +EOM + + close FILE ; + + BEGIN { push @INC, '.'; } + eval 'use SubDB ; '; + main::ok(53, $@ eq "") ; + my %h ; + my $X ; + eval ' + $X = tie(%h, "SubDB","dbhash.tmp", O_RDWR|O_CREAT, 0640, $DB_HASH ); + ' ; + + main::ok(54, $@ eq "") ; + + my $ret = eval '$h{"fred"} = 3 ; return $h{"fred"} ' ; + main::ok(55, $@ eq "") ; + main::ok(56, $ret == 5) ; + + my $value = 0; + $ret = eval '$X->put("joe", 4) ; $X->get("joe", $value) ; return $value' ; + main::ok(57, $@ eq "") ; + main::ok(58, $ret == 10) ; + + $ret = eval ' R_NEXT eq main::R_NEXT ' ; + main::ok(59, $@ eq "" ) ; + main::ok(60, $ret == 1) ; + + $ret = eval '$X->A_new_method("joe") ' ; + main::ok(61, $@ eq "") ; + main::ok(62, $ret eq "[[11]]") ; + + undef $X; + untie(%h); + unlink "SubDB.pm", "dbhash.tmp" ; + +} + +{ + # DBM Filter tests + use warnings ; + use strict ; + my (%h, $db) ; + my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + unlink $Dfile; + + sub checkOutput + { + no warnings 'uninitialized'; + my($fk, $sk, $fv, $sv) = @_ ; + + print "# Fetch Key : expected '$fk' got '$fetch_key'\n" + if $fetch_key ne $fk ; + print "# Fetch Value : expected '$fv' got '$fetch_value'\n" + if $fetch_value ne $fv ; + print "# Store Key : expected '$sk' got '$store_key'\n" + if $store_key ne $sk ; + print "# Store Value : expected '$sv' got '$store_value'\n" + if $store_value ne $sv ; + print "# \$_ : expected 'original' got '$_'\n" + if $_ ne 'original' ; + + return + $fetch_key eq $fk && $store_key eq $sk && + $fetch_value eq $fv && $store_value eq $sv && + $_ eq 'original' ; + } + + ok(63, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_fetch_key (sub { $fetch_key = $_ }) ; + $db->filter_store_key (sub { $store_key = $_ }) ; + $db->filter_fetch_value (sub { $fetch_value = $_}) ; + $db->filter_store_value (sub { $store_value = $_ }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + # fk sk fv sv + ok(64, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(65, $h{"fred"} eq "joe"); + # fk sk fv sv + ok(66, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + my ($k, $v) ; + $k = 'fred'; + ok(67, ! $db->seq($k, $v, R_FIRST) ) ; + ok(68, $k eq "fred") ; + ok(69, $v eq "joe") ; + # fk sk fv sv + ok(70, checkOutput( "fred", "fred", "joe", "")) ; + + # replace the filters, but remember the previous set + my ($old_fk) = $db->filter_fetch_key + (sub { $_ = uc $_ ; $fetch_key = $_ }) ; + my ($old_sk) = $db->filter_store_key + (sub { $_ = lc $_ ; $store_key = $_ }) ; + my ($old_fv) = $db->filter_fetch_value + (sub { $_ = "[$_]"; $fetch_value = $_ }) ; + my ($old_sv) = $db->filter_store_value + (sub { s/o/x/g; $store_value = $_ }) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"Fred"} = "Joe" ; + # fk sk fv sv + ok(71, checkOutput( "", "fred", "", "Jxe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(72, $h{"Fred"} eq "[Jxe]"); + # fk sk fv sv + ok(73, checkOutput( "", "fred", "[Jxe]", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $k = 'Fred'; $v =''; + ok(74, ! $db->seq($k, $v, R_FIRST) ) ; + ok(75, $k eq "FRED") or + print "# k [$k]\n" ; + ok(76, $v eq "[Jxe]") ; + # fk sk fv sv + ok(77, checkOutput( "FRED", "fred", "[Jxe]", "")) ; + + # put the original filters back + $db->filter_fetch_key ($old_fk); + $db->filter_store_key ($old_sk); + $db->filter_fetch_value ($old_fv); + $db->filter_store_value ($old_sv); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(78, checkOutput( "", "fred", "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(79, $h{"fred"} eq "joe"); + ok(80, checkOutput( "", "fred", "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + #ok(77, $db->FIRSTKEY() eq "fred") ; + $k = 'fred'; + ok(81, ! $db->seq($k, $v, R_FIRST) ) ; + ok(82, $k eq "fred") ; + ok(83, $v eq "joe") ; + # fk sk fv sv + ok(84, checkOutput( "fred", "fred", "joe", "")) ; + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h{"fred"} = "joe" ; + ok(85, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(86, $h{"fred"} eq "joe"); + ok(87, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $k = 'fred'; + ok(88, ! $db->seq($k, $v, R_FIRST) ) ; + ok(89, $k eq "fred") ; + ok(90, $v eq "joe") ; + ok(91, checkOutput( "", "", "", "")) ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter with a closure + + use warnings ; + use strict ; + my (%h, $db) ; + + unlink $Dfile; + ok(92, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + my %result = () ; + + sub Closure + { + my ($name) = @_ ; + my $count = 0 ; + my @kept = () ; + + return sub { ++$count ; + push @kept, $_ ; + $result{$name} = "$name - $count: [@kept]" ; + } + } + + $db->filter_store_key(Closure("store key")) ; + $db->filter_store_value(Closure("store value")) ; + $db->filter_fetch_key(Closure("fetch key")) ; + $db->filter_fetch_value(Closure("fetch value")) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(93, $result{"store key"} eq "store key - 1: [fred]"); + ok(94, $result{"store value"} eq "store value - 1: [joe]"); + ok(95, ! defined $result{"fetch key"} ); + ok(96, ! defined $result{"fetch value"} ); + ok(97, $_ eq "original") ; + + ok(98, $db->FIRSTKEY() eq "fred") ; + ok(99, $result{"store key"} eq "store key - 1: [fred]"); + ok(100, $result{"store value"} eq "store value - 1: [joe]"); + ok(101, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(102, ! defined $result{"fetch value"} ); + ok(103, $_ eq "original") ; + + $h{"jim"} = "john" ; + ok(104, $result{"store key"} eq "store key - 2: [fred jim]"); + ok(105, $result{"store value"} eq "store value - 2: [joe john]"); + ok(106, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(107, ! defined $result{"fetch value"} ); + ok(108, $_ eq "original") ; + + ok(109, $h{"fred"} eq "joe"); + ok(110, $result{"store key"} eq "store key - 3: [fred jim fred]"); + ok(111, $result{"store value"} eq "store value - 2: [joe john]"); + ok(112, $result{"fetch key"} eq "fetch key - 1: [fred]"); + ok(113, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(114, $_ eq "original") ; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # DBM Filter recursion detection + use warnings ; + use strict ; + my (%h, $db) ; + unlink $Dfile; + + ok(115, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_store_key (sub { $_ = $h{$_} }) ; + + eval '$h{1} = 1234' ; + ok(116, $@ =~ /^recursion detected in filter_store_key at/ ); + + undef $db ; + untie %h; + unlink $Dfile; +} + + +{ + # Examples from the POD + + my $file = "xyzt" ; + { + my $redirect = new Redirect $file ; + + use warnings FATAL => qw(all); + use strict ; + use DB_File ; + our (%h, $k, $v); + + unlink "fruit" ; + tie %h, "DB_File", "fruit", O_RDWR|O_CREAT, 0640, $DB_HASH + or die "Cannot open file 'fruit': $!\n"; + + # Add a few key/value pairs to the file + $h{"apple"} = "red" ; + $h{"orange"} = "orange" ; + $h{"banana"} = "yellow" ; + $h{"tomato"} = "red" ; + + # Check for existence of a key + print "Banana Exists\n\n" if $h{"banana"} ; + + # Delete a key/value pair. + delete $h{"apple"} ; + + # print the contents of the file + while (($k, $v) = each %h) + { print "$k -> $v\n" } + + untie %h ; + + unlink "fruit" ; + } + + ok(117, docat_del($file) eq <<'EOM') ; +Banana Exists + +orange -> orange +tomato -> red +banana -> yellow +EOM + +} + +{ + # Bug ID 20001013.009 + # + # test that $hash{KEY} = undef doesn't produce the warning + # Use of uninitialized value in null operation + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile or die "Can't open file: $!\n" ; + $h{ABC} = undef; + ok(118, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # test that %hash = () doesn't produce the warning + # Argument "" isn't numeric in entersub + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my %h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie %h, 'DB_File', $Dfile or die "Can't open file: $!\n" ; + %h = (); ; + ok(119, $a eq "") ; + untie %h ; + unlink $Dfile; +} + +{ + # When iterating over a tied hash using "each", the key passed to FETCH + # will be recycled and passed to NEXTKEY. If a Source Filter modifies the + # key in FETCH via a filter_fetch_key method we need to check that the + # modified key doesn't get passed to NEXTKEY. + # Also Test "keys" & "values" while we are at it. + + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my $bad_key = 0 ; + my %h = () ; + my $db ; + ok(120, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + $db->filter_fetch_key (sub { $_ =~ s/^Beta_/Alpha_/ if defined $_}) ; + $db->filter_store_key (sub { $bad_key = 1 if /^Beta_/ ; $_ =~ s/^Alpha_/Beta_/}) ; + + $h{'Alpha_ABC'} = 2 ; + $h{'Alpha_DEF'} = 5 ; + + ok(121, $h{'Alpha_ABC'} == 2); + ok(122, $h{'Alpha_DEF'} == 5); + + my ($k, $v) = ("",""); + while (($k, $v) = each %h) {} + ok(123, $bad_key == 0); + + $bad_key = 0 ; + foreach $k (keys %h) {} + ok(124, $bad_key == 0); + + $bad_key = 0 ; + foreach $v (values %h) {} + ok(125, $bad_key == 0); + + undef $db ; + untie %h ; + unlink $Dfile; +} + +{ + # now an error to pass 'hash' a non-code reference + my $dbh = new DB_File::HASHINFO ; + + eval { $dbh->{hash} = 2 }; + ok(126, $@ =~ /^Key 'hash' not associated with a code reference at/); + +} + + +#{ +# # recursion detection in hash +# my %hash ; +# my $Dfile = "xxx.db"; +# unlink $Dfile; +# my $dbh = new DB_File::HASHINFO ; +# $dbh->{hash} = sub { $hash{3} = 4 ; length $_[0] } ; +# +# +# ok(127, tie(%hash, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ); +# +# eval { $hash{1} = 2; +# $hash{4} = 5; +# }; +# +# ok(128, $@ =~ /^DB_File hash callback: recursion detected/); +# { +# no warnings; +# untie %hash; +# } +# unlink $Dfile; +#} + +#ok(127, 1); +#ok(128, 1); + +{ + # Check that two hash's don't interact + my %hash1 ; + my %hash2 ; + my $h1_count = 0; + my $h2_count = 0; + unlink $Dfile, $Dfile2; + my $dbh1 = new DB_File::HASHINFO ; + $dbh1->{hash} = sub { ++ $h1_count ; length $_[0] } ; + + my $dbh2 = new DB_File::HASHINFO ; + $dbh2->{hash} = sub { ++ $h2_count ; length $_[0] } ; + + + + my (%h); + ok(127, tie(%hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, 0640, $dbh1 ) ); + ok(128, tie(%hash2, 'DB_File',$Dfile2, O_RDWR|O_CREAT, 0640, $dbh2 ) ); + + $hash1{DEFG} = 5; + $hash1{XYZ} = 2; + $hash1{ABCDE} = 5; + + $hash2{defg} = 5; + $hash2{xyz} = 2; + $hash2{abcde} = 5; + + ok(129, $h1_count > 0); + ok(130, $h1_count == $h2_count); + + ok(131, safeUntie \%hash1); + ok(132, safeUntie \%hash2); + unlink $Dfile, $Dfile2; +} + +{ + # Passing undef for flags and/or mode when calling tie could cause + # Use of uninitialized value in subroutine entry + + + my $warn_count = 0 ; + #local $SIG{__WARN__} = sub { ++ $warn_count }; + my %hash1; + unlink $Dfile; + + tie %hash1, 'DB_File',$Dfile, undef; + ok(133, $warn_count == 0); + $warn_count = 0; + untie %hash1; + unlink $Dfile; + tie %hash1, 'DB_File',$Dfile, O_RDWR|O_CREAT, undef; + ok(134, $warn_count == 0); + untie %hash1; + unlink $Dfile; + tie %hash1, 'DB_File',$Dfile, undef, undef; + ok(135, $warn_count == 0); + $warn_count = 0; + + untie %hash1; + unlink $Dfile; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(136, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h{"fred"} = "joe" ; + ok(137, $h{"fred"} eq "joe"); + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (138, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h{"fred"} = "joe" ; + + ok(139, $h{"fred"} eq "joe"); + + ok(140, $db->FIRSTKEY() eq "fred") ; + + eval { my @r= grep { $h{$_} } (1, 2, 3) }; + ok (141, ! $@); + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # Check low-level API works with filter + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(142, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + + $db->filter_fetch_key (sub { $_ = unpack("i", $_) } ); + $db->filter_store_key (sub { $_ = pack("i", $_) } ); + $db->filter_fetch_value (sub { $_ = unpack("i", $_) } ); + $db->filter_store_value (sub { $_ = pack("i", $_) } ); + + $_ = 'fred'; + + my $key = 22 ; + my $value = 34 ; + + $db->put($key, $value) ; + ok 143, $key == 22; + ok 144, $value == 34 ; + ok 145, $_ eq 'fred'; + #print "k [$key][$value]\n" ; + + my $val ; + $db->get($key, $val) ; + ok 146, $key == 22; + ok 147, $val == 34 ; + ok 148, $_ eq 'fred'; + + $key = 51 ; + $value = 454; + $h{$key} = $value ; + ok 149, $key == 51; + ok 150, $value == 454 ; + ok 151, $_ eq 'fred'; + + undef $db ; + untie %h; + unlink $Dfile; +} + + +{ + # Regression Test for bug 30237 + # Check that substr can be used in the key to db_put + # and that db_put does not trigger the warning + # + # Use of uninitialized value in subroutine entry + + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(152, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + my $warned = ''; + local $SIG{__WARN__} = sub {$warned = $_[0]} ; + + # db-put with substr of key + my %remember = () ; + for my $ix ( 1 .. 2 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put(substr($key,0), $value) ; + } + + ok 153, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # db-put with substr of value + $warned = ''; + for my $ix ( 10 .. 12 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $db->put($key, substr($value,0)) ; + } + + ok 154, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of key + $warned = ''; + for my $ix ( 30 .. 32 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{substr($key,0)} = $value ; + } + + ok 155, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied hash is not a problem, but check anyway + # substr of value + $warned = ''; + for my $ix ( 40 .. 42 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $h{$key} = substr($value,0) ; + } + + ok 156, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + my %bad = () ; + $key = ''; + for ($status = $db->seq(substr($key,0), substr($value,0), R_FIRST ) ; + $status == 0 ; + $status = $db->seq(substr($key,0), substr($value,0), R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 157, keys %bad == 0 ; + ok 158, keys %remember == 0 ; + + print "# missing -- $key=>$value\n" while ($key, $value) = each %remember; + print "# bad -- $key=>$value\n" while ($key, $value) = each %bad; + + # Make sure this fix does not break code to handle an undef key + # Berkeley DB undef key is broken between versions 2.3.16 and 3.1 + my $value = 'fred'; + $warned = ''; + $db->put(undef, $value) ; + ok 159, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + my $no_NULL = ($DB_File::db_ver >= 2.003016 && $DB_File::db_ver < 3.001) ; + print "# db_ver $DB_File::db_ver\n"; + $value = '' ; + $db->get(undef, $value) ; + ok 160, $no_NULL || $value eq 'fred' or print "# got [$value]\n" ; + ok 161, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + undef $db ; + untie %h; + unlink $Dfile; +} + +{ + # Check filter + substr + + use warnings ; + use strict ; + my (%h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(162, $db = tie(%h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_HASH ) ); + + + { + $db->filter_fetch_key (sub { lc $_ } ); + $db->filter_store_key (sub { uc $_ } ); + $db->filter_fetch_value (sub { lc $_ } ); + $db->filter_store_value (sub { uc $_ } ); + } + + $_ = 'fred'; + + # db-put with substr of key + my %remember = () ; + my $status = 0 ; + for my $ix ( 1 .. 2 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$key} = $value ; + $status += $db->put(substr($key,0), substr($value,0)) ; + } + + ok 163, $status == 0 or print "# Status $status\n" ; + + if (1) + { + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + } + + my %bad = () ; + my $key = ''; + my $value = ''; + for ($status = $db->seq($key, $value, R_FIRST ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 164, $_ eq 'fred'; + ok 165, keys %bad == 0 ; + ok 166, keys %remember == 0 ; + + print "# missing -- $key $value\n" while ($key, $value) = each %remember; + print "# bad -- $key $value\n" while ($key, $value) = each %bad; + undef $db ; + untie %h; + unlink $Dfile; +} + +exit ; diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t b/fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t new file mode 100644 index 0000000..bd198dc --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t @@ -0,0 +1,1595 @@ +#!./perl -w + +use strict; +use Config; + +BEGIN { + if(-d "lib" && -f "TEST") { + if ($Config{'extensions'} !~ /\bDB_File\b/ ) { + print "1..0 # Skip: DB_File was not built\n"; + exit 0; + } + } +} + +use DB_File; +use Fcntl; +our ($dbh, $Dfile, $bad_ones, $FA); + +# full tied array support started in Perl 5.004_57 +# Double check to see if it is available. + +{ + sub try::TIEARRAY { bless [], "try" } + sub try::FETCHSIZE { $FA = 1 } + $FA = 0 ; + my @a ; + tie @a, 'try' ; + my $a = @a ; +} + + +sub ok +{ + my $no = shift ; + my $result = shift ; + + print "not " unless $result ; + print "ok $no\n" ; + + return $result ; +} + +{ + package Redirect ; + use Symbol ; + + sub new + { + my $class = shift ; + my $filename = shift ; + my $fh = gensym ; + open ($fh, ">$filename") || die "Cannot open $filename: $!" ; + my $real_stdout = select($fh) ; + return bless [$fh, $real_stdout ] ; + + } + sub DESTROY + { + my $self = shift ; + close $self->[0] ; + select($self->[1]) ; + } +} + +sub docat +{ + my $file = shift; + local $/ = undef; + open(CAT,$file) || die "Cannot open $file:$!"; + my $result = ; + close(CAT); + normalise($result) ; + return $result; +} + +sub docat_del +{ + my $file = shift; + my $result = docat($file); + unlink $file ; + return $result; +} + +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie @$hashref; + return $no_inner; +} + +sub bad_one +{ + unless ($bad_ones++) { + print STDERR <{bval}) ; +ok(2, ! defined $dbh->{cachesize}) ; +ok(3, ! defined $dbh->{psize}) ; +ok(4, ! defined $dbh->{flags}) ; +ok(5, ! defined $dbh->{lorder}) ; +ok(6, ! defined $dbh->{reclen}) ; +ok(7, ! defined $dbh->{bfname}) ; + +$dbh->{bval} = 3000 ; +ok(8, $dbh->{bval} == 3000 ); + +$dbh->{cachesize} = 9000 ; +ok(9, $dbh->{cachesize} == 9000 ); + +$dbh->{psize} = 400 ; +ok(10, $dbh->{psize} == 400 ); + +$dbh->{flags} = 65 ; +ok(11, $dbh->{flags} == 65 ); + +$dbh->{lorder} = 123 ; +ok(12, $dbh->{lorder} == 123 ); + +$dbh->{reclen} = 1234 ; +ok(13, $dbh->{reclen} == 1234 ); + +$dbh->{bfname} = 1234 ; +ok(14, $dbh->{bfname} == 1234 ); + + +# Check that an invalid entry is caught both for store & fetch +eval '$dbh->{fred} = 1234' ; +ok(15, $@ =~ /^DB_File::RECNOINFO::STORE - Unknown element 'fred' at/ ); +eval 'my $q = $dbh->{fred}' ; +ok(16, $@ =~ /^DB_File::RECNOINFO::FETCH - Unknown element 'fred' at/ ); + +# Now check the interface to RECNOINFO + +my $X ; +my @h ; +ok(17, $X = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ; + +my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; + +ok(18, ((stat($Dfile))[2] & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) + || $noMode{$^O} ); + +#my $l = @h ; +my $l = $X->length ; +ok(19, ($FA ? @h == 0 : !$l) ); + +my @data = qw( a b c d ever f g h i j k longername m n o p) ; + +$h[0] = shift @data ; +ok(20, $h[0] eq 'a' ); + +my $ i; +foreach (@data) + { $h[++$i] = $_ } + +unshift (@data, 'a') ; + +ok(21, defined $h[1] ); +ok(22, ! defined $h[16] ); +ok(23, $FA ? @h == @data : $X->length == @data ); + + +# Overwrite an entry & check fetch it +$h[3] = 'replaced' ; +$data[3] = 'replaced' ; +ok(24, $h[3] eq 'replaced' ); + +#PUSH +my @push_data = qw(added to the end) ; +($FA ? push(@h, @push_data) : $X->push(@push_data)) ; +push (@data, @push_data) ; +ok(25, $h[++$i] eq 'added' ); +ok(26, $h[++$i] eq 'to' ); +ok(27, $h[++$i] eq 'the' ); +ok(28, $h[++$i] eq 'end' ); + +# POP +my $popped = pop (@data) ; +my $value = ($FA ? pop @h : $X->pop) ; +ok(29, $value eq $popped) ; + +# SHIFT +$value = ($FA ? shift @h : $X->shift) ; +my $shifted = shift @data ; +ok(30, $value eq $shifted ); + +# UNSHIFT + +# empty list +($FA ? unshift @h,() : $X->unshift) ; +ok(31, ($FA ? @h == @data : $X->length == @data )); + +my @new_data = qw(add this to the start of the array) ; +$FA ? unshift (@h, @new_data) : $X->unshift (@new_data) ; +unshift (@data, @new_data) ; +ok(32, $FA ? @h == @data : $X->length == @data ); +ok(33, $h[0] eq "add") ; +ok(34, $h[1] eq "this") ; +ok(35, $h[2] eq "to") ; +ok(36, $h[3] eq "the") ; +ok(37, $h[4] eq "start") ; +ok(38, $h[5] eq "of") ; +ok(39, $h[6] eq "the") ; +ok(40, $h[7] eq "array") ; +ok(41, $h[8] eq $data[8]) ; + +# Brief test for SPLICE - more thorough 'soak test' is later. +my @old; +if ($FA) { + @old = splice(@h, 1, 2, qw(bananas just before)); +} +else { + @old = $X->splice(1, 2, qw(bananas just before)); +} +ok(42, $h[0] eq "add") ; +ok(43, $h[1] eq "bananas") ; +ok(44, $h[2] eq "just") ; +ok(45, $h[3] eq "before") ; +ok(46, $h[4] eq "the") ; +ok(47, $h[5] eq "start") ; +ok(48, $h[6] eq "of") ; +ok(49, $h[7] eq "the") ; +ok(50, $h[8] eq "array") ; +ok(51, $h[9] eq $data[8]) ; +$FA ? splice(@h, 1, 3, @old) : $X->splice(1, 3, @old); + +# Now both arrays should be identical + +my $ok = 1 ; +my $j = 0 ; +foreach (@data) +{ + $ok = 0, last if $_ ne $h[$j ++] ; +} +ok(52, $ok ); + +# Neagtive subscripts + +# get the last element of the array +ok(53, $h[-1] eq $data[-1] ); +ok(54, $h[-1] eq $h[ ($FA ? @h : $X->length) -1] ); + +# get the first element using a negative subscript +eval '$h[ - ( $FA ? @h : $X->length)] = "abcd"' ; +ok(55, $@ eq "" ); +ok(56, $h[0] eq "abcd" ); + +# now try to read before the start of the array +eval '$h[ - (1 + ($FA ? @h : $X->length))] = 1234' ; +ok(57, $@ =~ '^Modification of non-creatable array value attempted' ); + +# IMPORTANT - $X must be undefined before the untie otherwise the +# underlying DB close routine will not get called. +undef $X ; +ok(58, safeUntie \@h); + +unlink $Dfile; + + +{ + # Check bval defaults to \n + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + ok(59, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(60, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + ok(61, $x eq "abc\ndef\n\nghi\n") ; +} + +{ + # Change bval + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + $dbh->{bval} = "-" ; + ok(62, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(63, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + my $ok = ($x eq "abc-def--ghi-") ; + bad_one() unless $ok ; + ok(64, $ok) ; +} + +{ + # Check R_FIXEDLEN with default bval (space) + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + $dbh->{flags} = R_FIXEDLEN ; + $dbh->{reclen} = 5 ; + ok(65, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(66, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + my $ok = ($x eq "abc def ghi ") ; + bad_one() unless $ok ; + ok(67, $ok) ; +} + +{ + # Check R_FIXEDLEN with user-defined bval + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + $dbh->{flags} = R_FIXEDLEN ; + $dbh->{bval} = "-" ; + $dbh->{reclen} = 5 ; + ok(68, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(69, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + my $ok = ($x eq "abc--def-------ghi--") ; + bad_one() unless $ok ; + ok(70, $ok) ; +} + +{ + # check that attempting to tie an associative array to a DB_RECNO will fail + + my $filename = "xyz" ; + my %x ; + eval { tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO ; } ; + ok(71, $@ =~ /^DB_File can only tie an array to a DB_RECNO database/) ; + unlink $filename ; +} + +{ + # sub-class test + + package Another ; + + use warnings ; + use strict ; + + open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ; + print FILE <<'EOM' ; + + package SubDB ; + + use warnings ; + use strict ; + our (@ISA, @EXPORT); + + require Exporter ; + use DB_File; + @ISA=qw(DB_File); + @EXPORT = @DB_File::EXPORT ; + + sub STORE { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::STORE($key, $value * 2) ; + } + + sub FETCH { + my $self = shift ; + my $key = shift ; + $self->SUPER::FETCH($key) - 1 ; + } + + sub put { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::put($key, $value * 3) ; + } + + sub get { + my $self = shift ; + $self->SUPER::get($_[0], $_[1]) ; + $_[1] -= 2 ; + } + + sub A_new_method + { + my $self = shift ; + my $key = shift ; + my $value = $self->FETCH($key) ; + return "[[$value]]" ; + } + + 1 ; +EOM + + close FILE or die "Could not close: $!"; + + BEGIN { push @INC, '.'; } + eval 'use SubDB ; '; + main::ok(72, $@ eq "") ; + my @h ; + my $X ; + eval ' + $X = tie(@h, "SubDB","recno.tmp", O_RDWR|O_CREAT, 0640, $DB_RECNO ); + ' ; + die "Could not tie: $!" unless $X; + + main::ok(73, $@ eq "") ; + + my $ret = eval '$h[3] = 3 ; return $h[3] ' ; + main::ok(74, $@ eq "") ; + main::ok(75, $ret == 5) ; + + my $value = 0; + $ret = eval '$X->put(1, 4) ; $X->get(1, $value) ; return $value' ; + main::ok(76, $@ eq "") ; + main::ok(77, $ret == 10) ; + + $ret = eval ' R_NEXT eq main::R_NEXT ' ; + main::ok(78, $@ eq "" ) ; + main::ok(79, $ret == 1) ; + + $ret = eval '$X->A_new_method(1) ' ; + main::ok(80, $@ eq "") ; + main::ok(81, $ret eq "[[11]]") ; + + undef $X; + main::ok(82, main::safeUntie \@h); + unlink "SubDB.pm", "recno.tmp" ; + +} + +{ + + # test $# + my $self ; + unlink $Dfile; + ok(83, $self = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[2] = "ghi" ; + $h[3] = "jkl" ; + ok(84, $FA ? $#h == 3 : $self->length() == 4) ; + undef $self ; + ok(85, safeUntie \@h); + my $x = docat($Dfile) ; + ok(86, $x eq "abc\ndef\nghi\njkl\n") ; + + # $# sets array to same length + $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ; + ok(87, $self) + or warn "# $DB_File::Error\n"; + if ($FA) + { $#h = 3 } + else + { $self->STORESIZE(4) } + ok(88, $FA ? $#h == 3 : $self->length() == 4) ; + undef $self ; + ok(89, safeUntie \@h); + $x = docat($Dfile) ; + ok(90, $x eq "abc\ndef\nghi\njkl\n") ; + + # $# sets array to bigger + ok(91, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + if ($FA) + { $#h = 6 } + else + { $self->STORESIZE(7) } + ok(92, $FA ? $#h == 6 : $self->length() == 7) ; + undef $self ; + ok(93, safeUntie \@h); + $x = docat($Dfile) ; + ok(94, $x eq "abc\ndef\nghi\njkl\n\n\n\n") ; + + # $# sets array smaller + ok(95, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + if ($FA) + { $#h = 2 } + else + { $self->STORESIZE(3) } + ok(96, $FA ? $#h == 2 : $self->length() == 3) ; + undef $self ; + ok(97, safeUntie \@h); + $x = docat($Dfile) ; + ok(98, $x eq "abc\ndef\nghi\n") ; + + unlink $Dfile; + + +} + +{ + # DBM Filter tests + use warnings ; + use strict ; + my (@h, $db) ; + my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + unlink $Dfile; + + sub checkOutput + { + my($fk, $sk, $fv, $sv) = @_ ; + + print "# Fetch Key : expected '$fk' got '$fetch_key'\n" + if $fetch_key ne $fk ; + print "# Fetch Value : expected '$fv' got '$fetch_value'\n" + if $fetch_value ne $fv ; + print "# Store Key : expected '$sk' got '$store_key'\n" + if $store_key ne $sk ; + print "# Store Value : expected '$sv' got '$store_value'\n" + if $store_value ne $sv ; + print "# \$_ : expected 'original' got '$_'\n" + if $_ ne 'original' ; + + return + $fetch_key eq $fk && $store_key eq $sk && + $fetch_value eq $fv && $store_value eq $sv && + $_ eq 'original' ; + } + + ok(99, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_fetch_key (sub { $fetch_key = $_ }) ; + $db->filter_store_key (sub { $store_key = $_ }) ; + $db->filter_fetch_value (sub { $fetch_value = $_}) ; + $db->filter_store_value (sub { $store_value = $_ }) ; + + $_ = "original" ; + + $h[0] = "joe" ; + # fk sk fv sv + ok(100, checkOutput( "", 0, "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(101, $h[0] eq "joe"); + # fk sk fv sv + ok(102, checkOutput( "", 0, "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(103, $db->FIRSTKEY() == 0) ; + # fk sk fv sv + ok(104, checkOutput( 0, "", "", "")) ; + + # replace the filters, but remember the previous set + my ($old_fk) = $db->filter_fetch_key + (sub { ++ $_ ; $fetch_key = $_ }) ; + my ($old_sk) = $db->filter_store_key + (sub { $_ *= 2 ; $store_key = $_ }) ; + my ($old_fv) = $db->filter_fetch_value + (sub { $_ = "[$_]"; $fetch_value = $_ }) ; + my ($old_sv) = $db->filter_store_value + (sub { s/o/x/g; $store_value = $_ }) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h[1] = "Joe" ; + # fk sk fv sv + ok(105, checkOutput( "", 2, "", "Jxe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(106, $h[1] eq "[Jxe]"); + # fk sk fv sv + ok(107, checkOutput( "", 2, "[Jxe]", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(108, $db->FIRSTKEY() == 1) ; + # fk sk fv sv + ok(109, checkOutput( 1, "", "", "")) ; + + # put the original filters back + $db->filter_fetch_key ($old_fk); + $db->filter_store_key ($old_sk); + $db->filter_fetch_value ($old_fv); + $db->filter_store_value ($old_sv); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h[0] = "joe" ; + ok(110, checkOutput( "", 0, "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(111, $h[0] eq "joe"); + ok(112, checkOutput( "", 0, "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(113, $db->FIRSTKEY() == 0) ; + ok(114, checkOutput( 0, "", "", "")) ; + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h[0] = "joe" ; + ok(115, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(116, $h[0] eq "joe"); + ok(117, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(118, $db->FIRSTKEY() == 0) ; + ok(119, checkOutput( "", "", "", "")) ; + + undef $db ; + ok(120, safeUntie \@h); + unlink $Dfile; +} + +{ + # DBM Filter with a closure + + use warnings ; + use strict ; + my (@h, $db) ; + + unlink $Dfile; + ok(121, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + my %result = () ; + + sub Closure + { + my ($name) = @_ ; + my $count = 0 ; + my @kept = () ; + + return sub { ++$count ; + push @kept, $_ ; + $result{$name} = "$name - $count: [@kept]" ; + } + } + + $db->filter_store_key(Closure("store key")) ; + $db->filter_store_value(Closure("store value")) ; + $db->filter_fetch_key(Closure("fetch key")) ; + $db->filter_fetch_value(Closure("fetch value")) ; + + $_ = "original" ; + + $h[0] = "joe" ; + ok(122, $result{"store key"} eq "store key - 1: [0]"); + ok(123, $result{"store value"} eq "store value - 1: [joe]"); + ok(124, ! defined $result{"fetch key"} ); + ok(125, ! defined $result{"fetch value"} ); + ok(126, $_ eq "original") ; + + ok(127, $db->FIRSTKEY() == 0 ) ; + ok(128, $result{"store key"} eq "store key - 1: [0]"); + ok(129, $result{"store value"} eq "store value - 1: [joe]"); + ok(130, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(131, ! defined $result{"fetch value"} ); + ok(132, $_ eq "original") ; + + $h[7] = "john" ; + ok(133, $result{"store key"} eq "store key - 2: [0 7]"); + ok(134, $result{"store value"} eq "store value - 2: [joe john]"); + ok(135, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(136, ! defined $result{"fetch value"} ); + ok(137, $_ eq "original") ; + + ok(138, $h[0] eq "joe"); + ok(139, $result{"store key"} eq "store key - 3: [0 7 0]"); + ok(140, $result{"store value"} eq "store value - 2: [joe john]"); + ok(141, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(142, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(143, $_ eq "original") ; + + undef $db ; + ok(144, safeUntie \@h); + unlink $Dfile; +} + +{ + # DBM Filter recursion detection + use warnings ; + use strict ; + my (@h, $db) ; + unlink $Dfile; + + ok(145, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_store_key (sub { $_ = $h[0] }) ; + + eval '$h[1] = 1234' ; + ok(146, $@ =~ /^recursion detected in filter_store_key at/ ); + + undef $db ; + ok(147, safeUntie \@h); + unlink $Dfile; +} + + +{ + # Examples from the POD + + my $file = "xyzt" ; + { + my $redirect = new Redirect $file ; + + use warnings FATAL => qw(all); + use strict ; + use DB_File ; + + my $filename = "text" ; + unlink $filename ; + + my @h ; + my $x = tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO + or die "Cannot open file 'text': $!\n" ; + + # Add a few key/value pairs to the file + $h[0] = "orange" ; + $h[1] = "blue" ; + $h[2] = "yellow" ; + + $FA ? push @h, "green", "black" + : $x->push("green", "black") ; + + my $elements = $FA ? scalar @h : $x->length ; + print "The array contains $elements entries\n" ; + + my $last = $FA ? pop @h : $x->pop ; + print "popped $last\n" ; + + $FA ? unshift @h, "white" + : $x->unshift("white") ; + my $first = $FA ? shift @h : $x->shift ; + print "shifted $first\n" ; + + # Check for existence of a key + print "Element 1 Exists with value $h[1]\n" if $h[1] ; + + # use a negative index + print "The last element is $h[-1]\n" ; + print "The 2nd last element is $h[-2]\n" ; + + undef $x ; + untie @h ; + + unlink $filename ; + } + + ok(148, docat_del($file) eq <<'EOM') ; +The array contains 5 entries +popped black +shifted white +Element 1 Exists with value blue +The last element is green +The 2nd last element is yellow +EOM + + my $save_output = "xyzt" ; + { + my $redirect = new Redirect $save_output ; + + use warnings FATAL => qw(all); + use strict ; + our (@h, $H, $file, $i); + use DB_File ; + use Fcntl ; + + $file = "text" ; + + unlink $file ; + + $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0640, $DB_RECNO + or die "Cannot open file $file: $!\n" ; + + # first create a text file to play with + $h[0] = "zero" ; + $h[1] = "one" ; + $h[2] = "two" ; + $h[3] = "three" ; + $h[4] = "four" ; + + + # Print the records in order. + # + # The length method is needed here because evaluating a tied + # array in a scalar context does not return the number of + # elements in the array. + + print "\nORIGINAL\n" ; + foreach $i (0 .. $H->length - 1) { + print "$i: $h[$i]\n" ; + } + + # use the push & pop methods + $a = $H->pop ; + $H->push("last") ; + print "\nThe last record was [$a]\n" ; + + # and the shift & unshift methods + $a = $H->shift ; + $H->unshift("first") ; + print "The first record was [$a]\n" ; + + # Use the API to add a new record after record 2. + $i = 2 ; + $H->put($i, "Newbie", R_IAFTER) ; + + # and a new record before record 1. + $i = 1 ; + $H->put($i, "New One", R_IBEFORE) ; + + # delete record 3 + $H->del(3) ; + + # now print the records in reverse order + print "\nREVERSE\n" ; + for ($i = $H->length - 1 ; $i >= 0 ; -- $i) + { print "$i: $h[$i]\n" } + + # same again, but use the API functions instead + print "\nREVERSE again\n" ; + my ($s, $k, $v) = (0, 0, 0) ; + for ($s = $H->seq($k, $v, R_LAST) ; + $s == 0 ; + $s = $H->seq($k, $v, R_PREV)) + { print "$k: $v\n" } + + undef $H ; + untie @h ; + + unlink $file ; + } + + ok(149, docat_del($save_output) eq <<'EOM') ; + +ORIGINAL +0: zero +1: one +2: two +3: three +4: four + +The last record was [four] +The first record was [zero] + +REVERSE +5: last +4: three +3: Newbie +2: one +1: New One +0: first + +REVERSE again +5: last +4: three +3: Newbie +2: one +1: New One +0: first +EOM + +} + +{ + # Bug ID 20001013.009 + # + # test that $hash{KEY} = undef doesn't produce the warning + # Use of uninitialized value in null operation + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my @h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO + or die "Can't open file: $!\n" ; + $h[0] = undef; + ok(150, $a eq "") ; + ok(151, safeUntie \@h); + unlink $Dfile; +} + +{ + # test that %hash = () doesn't produce the warning + # Argument "" isn't numeric in entersub + use warnings ; + use strict ; + use DB_File ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + unlink $Dfile; + my @h ; + + tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO + or die "Can't open file: $!\n" ; + @h = (); ; + ok(152, $a eq "") ; + ok(153, safeUntie \@h); + unlink $Dfile; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (@h, $db) ; + unlink $Dfile; + + ok(154, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h[0] = "joe" ; + ok(155, $h[0] eq "joe"); + + eval { my @r= grep { $h[$_] } (1, 2, 3) }; + ok (156, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h[1] = "joe" ; + + ok(157, $h[1] eq "joe"); + + eval { my @r= grep { $h[$_] } (1, 2, 3) }; + ok (158, ! $@); + + undef $db ; + untie @h; + unlink $Dfile; +} + +{ + # Check low-level API works with filter + + use warnings ; + use strict ; + my (@h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(159, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + + $db->filter_fetch_key (sub { ++ $_ } ); + $db->filter_store_key (sub { -- $_ } ); + $db->filter_fetch_value (sub { $_ = unpack("i", $_) } ); + $db->filter_store_value (sub { $_ = pack("i", $_) } ); + + $_ = 'fred'; + + my $key = 22 ; + my $value = 34 ; + + $db->put($key, $value) ; + ok 160, $key == 22; + ok 161, $value == 34 ; + ok 162, $_ eq 'fred'; + #print "k [$key][$value]\n" ; + + my $val ; + $db->get($key, $val) ; + ok 163, $key == 22; + ok 164, $val == 34 ; + ok 165, $_ eq 'fred'; + + $key = 51 ; + $value = 454; + $h[$key] = $value ; + ok 166, $key == 51; + ok 167, $value == 454 ; + ok 168, $_ eq 'fred'; + + undef $db ; + untie @h; + unlink $Dfile; +} + + +{ + # Regression Test for bug 30237 + # Check that substr can be used in the key to db_put + # and that db_put does not trigger the warning + # + # Use of uninitialized value in subroutine entry + + + use warnings ; + use strict ; + my (@h, $db) ; + my $status ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(169, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO) ); + + my $warned = ''; + local $SIG{__WARN__} = sub {$warned = $_[0]} ; + + # db-put with substr of key + my %remember = () ; + for my $ix ( 0 .. 2 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{substr($key,0, 1)} = $value ; + $db->put(substr($key,0, 1), $value) ; + } + + ok 170, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # db-put with substr of value + $warned = ''; + for my $ix ( 3 .. 5 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$ix} = $value ; + $db->put($ix, substr($value,0)) ; + } + + ok 171, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied array is not a problem, but check anyway + # substr of key + $warned = ''; + for my $ix ( 6 .. 8 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{substr($key,0,1)} = $value ; + $h[substr($key,0,1)] = $value ; + } + + ok 172, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied array is not a problem, but check anyway + # substr of value + $warned = ''; + for my $ix ( 9 .. 10 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$ix} = $value ; + $h[$ix] = substr($value,0) ; + } + + ok 173, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + my %bad = () ; + my $key = ''; + for (my $status = $db->seq($key, $value, R_FIRST ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 174, keys %bad == 0 ; + ok 175, keys %remember == 0 ; + + print "# missing -- $key $value\n" while ($key, $value) = each %remember; + print "# bad -- $key $value\n" while ($key, $value) = each %bad; + + # Make sure this fix does not break code to handle an undef key + my $value = 'fred'; + $warned = ''; + $status = $db->put(undef, $value) ; + ok 176, $status == 0 + or print "# put failed - status $status\n"; + ok 177, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + print "# db_ver $DB_File::db_ver\n"; + $value = '' ; + $status = $db->get(undef, $value) ; + ok 178, $status == 0 + or print "# get failed - status $status\n" ; + ok(179, $db->get(undef, $value) == 0) or print "# get failed\n" ; + ok 180, $value eq 'fred' or print "# got [$value]\n" ; + ok 181, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + undef $db ; + untie @h; + unlink $Dfile; +} + +# Only test splice if this is a newish version of Perl +exit unless $FA ; + +# Test SPLICE + +{ + # check that the splice warnings are under the same lexical control + # as their non-tied counterparts. + + use warnings; + use strict; + + my $a = ''; + my @a = (1); + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + unlink $Dfile; + my @tied ; + + tie @tied, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO + or die "Can't open file: $!\n" ; + + # uninitialized offset + use warnings; + my $offset ; + $a = ''; + splice(@a, $offset); + ok(182, $a =~ /^Use of uninitialized value /); + $a = ''; + splice(@tied, $offset); + ok(183, $a =~ /^Use of uninitialized value in splice/); + + no warnings 'uninitialized'; + $a = ''; + splice(@a, $offset); + ok(184, $a eq ''); + $a = ''; + splice(@tied, $offset); + ok(185, $a eq ''); + + # uninitialized length + use warnings; + my $length ; + $a = ''; + splice(@a, 0, $length); + ok(186, $a =~ /^Use of uninitialized value /); + $a = ''; + splice(@tied, 0, $length); + ok(187, $a =~ /^Use of uninitialized value in splice/); + + no warnings 'uninitialized'; + $a = ''; + splice(@a, 0, $length); + ok(188, $a eq ''); + $a = ''; + splice(@tied, 0, $length); + ok(189, $a eq ''); + + # offset past end of array + use warnings; + $a = ''; + splice(@a, 3); + my $splice_end_array = ($a =~ /^splice\(\) offset past end of array/); + $a = ''; + splice(@tied, 3); + ok(190, !$splice_end_array || $a =~ /^splice\(\) offset past end of array/); + + no warnings 'misc'; + $a = ''; + splice(@a, 3); + ok(191, $a eq ''); + $a = ''; + splice(@tied, 3); + ok(192, $a eq ''); + + ok(193, safeUntie \@tied); + unlink $Dfile; +} + +# +# These are a few regression tests: bundles of five arguments to pass +# to test_splice(). The first four arguments correspond to those +# given to splice(), and the last says which context to call it in +# (scalar, list or void). +# +# The expected result is not needed because we get that by running +# Perl's built-in splice(). +# +my @tests = ([ [ 'falsely', 'dinosaur', 'remedy', 'commotion', + 'rarely', 'paleness' ], + -4, -2, + [ 'redoubled', 'Taylorize', 'Zoe', 'halogen' ], + 'void' ], + + [ [ 'a' ], -2, 1, [ 'B' ], 'void' ], + + [ [ 'Hartley', 'Islandia', 'assents', 'wishful' ], + 0, -4, + [ 'maids' ], + 'void' ], + + [ [ 'visibility', 'pocketful', 'rectangles' ], + -10, 0, + [ 'garbages' ], + 'void' ], + + [ [ 'sleeplessly' ], + 8, -4, + [ 'Margery', 'clearing', 'repercussion', 'clubs', + 'arise' ], + 'void' ], + + [ [ 'chastises', 'recalculates' ], + 0, 0, + [ 'momentariness', 'mediates', 'accents', 'toils', + 'regaled' ], + 'void' ], + + [ [ 'b', '' ], + 9, 8, + [ 'otrb', 'stje', 'ixrpw', 'vxfx', 'lhhf' ], + 'scalar' ], + + [ [ 'b', '' ], + undef, undef, + [ 'otrb', 'stje', 'ixrpw', 'vxfx', 'lhhf' ], + 'scalar' ], + + [ [ 'riheb' ], -8, undef, [], 'void' ], + + [ [ 'uft', 'qnxs', '' ], + 6, -2, + [ 'znp', 'mhnkh', 'bn' ], + 'void' ], + ); + +my $testnum = 194; +my $failed = 0; +my $tmp = "dbr$$"; +foreach my $test (@tests) { + my $err = test_splice(@$test); + if (defined $err) { + print STDERR "# failed: ", Dumper($test); + print STDERR "# error: $err\n"; + $failed = 1; + ok($testnum++, 0); + } + else { ok($testnum++, 1) } +} + +if ($failed) { + # Not worth running the random ones + print STDERR '# skipping ', $testnum++, "\n"; +} +else { + # A thousand randomly-generated tests + $failed = 0; + srand(0); + foreach (0 .. 1000 - 1) { + my $test = rand_test(); + my $err = test_splice(@$test); + if (defined $err) { + print STDERR "# failed: ", Dumper($test); + print STDERR "# error: $err\n"; + $failed = 1; + print STDERR "# skipping any remaining random tests\n"; + last; + } + } + + ok($testnum++, not $failed); +} + +die "testnum ($testnum) != total_tests ($total_tests) + 1" + if $testnum != $total_tests + 1; + +exit ; + +# Subroutines for SPLICE testing + +# test_splice() +# +# Test the new splice() against Perl's built-in one. The first four +# parameters are those passed to splice(), except that the lists must +# be (explicitly) passed by reference, and are not actually modified. +# (It's just a test!) The last argument specifies the context in +# which to call the functions: 'list', 'scalar', or 'void'. +# +# Returns: +# undef, if the two splices give the same results for the given +# arguments and context; +# +# an error message showing the difference, otherwise. +# +# Reads global variable $tmp. +# +sub test_splice { + die 'usage: test_splice(array, offset, length, list, context)' if @_ != 5; + my ($array, $offset, $length, $list, $context) = @_; + my @array = @$array; + my @list = @$list; + + unlink $tmp; + + my @h; + my $H = tie @h, 'DB_File', $tmp, O_CREAT|O_RDWR, 0644, $DB_RECNO + or die "cannot open $tmp: $!"; + + my $i = 0; + foreach ( @array ) { $h[$i++] = $_ } + + return "basic DB_File sanity check failed" + if list_diff(\@array, \@h); + + # Output from splice(): + # Returned value (munged a bit), error msg, warnings + # + my ($s_r, $s_error, @s_warnings); + + my $gather_warning = sub { push @s_warnings, $_[0] }; + if ($context eq 'list') { + my @r; + eval { + local $SIG{__WARN__} = $gather_warning; + @r = splice @array, $offset, $length, @list; + }; + $s_error = $@; + $s_r = \@r; + } + elsif ($context eq 'scalar') { + my $r; + eval { + local $SIG{__WARN__} = $gather_warning; + $r = splice @array, $offset, $length, @list; + }; + $s_error = $@; + $s_r = [ $r ]; + } + elsif ($context eq 'void') { + eval { + local $SIG{__WARN__} = $gather_warning; + splice @array, $offset, $length, @list; + }; + $s_error = $@; + $s_r = []; + } + else { + die "bad context $context"; + } + + foreach ($s_error, @s_warnings) { + chomp; + s/ at \S+ line \d+\.$//; + # only built-in splice identifies name of uninit value + s/(uninitialized value) \$\w+/$1/; + } + + # Now do the same for DB_File's version of splice + my ($ms_r, $ms_error, @ms_warnings); + $gather_warning = sub { push @ms_warnings, $_[0] }; + if ($context eq 'list') { + my @r; + eval { + local $SIG{__WARN__} = $gather_warning; + @r = splice @h, $offset, $length, @list; + }; + $ms_error = $@; + $ms_r = \@r; + } + elsif ($context eq 'scalar') { + my $r; + eval { + local $SIG{__WARN__} = $gather_warning; + $r = splice @h, $offset, $length, @list; + }; + $ms_error = $@; + $ms_r = [ $r ]; + } + elsif ($context eq 'void') { + eval { + local $SIG{__WARN__} = $gather_warning; + splice @h, $offset, $length, @list; + }; + $ms_error = $@; + $ms_r = []; + } + else { + die "bad context $context"; + } + + foreach ($ms_error, @ms_warnings) { + chomp; + s/ at \S+(\s+\S+)*? line \d+\.?.*//s; + } + + return "different errors: '$s_error' vs '$ms_error'" + if $s_error ne $ms_error; + return('different return values: ' . Dumper($s_r) . ' vs ' . Dumper($ms_r)) + if list_diff($s_r, $ms_r); + return('different changed list: ' . Dumper(\@array) . ' vs ' . Dumper(\@h)) + if list_diff(\@array, \@h); + + if ((scalar @s_warnings) != (scalar @ms_warnings)) { + return 'different number of warnings'; + } + + while (@s_warnings) { + my $sw = shift @s_warnings; + my $msw = shift @ms_warnings; + + if (defined $sw and defined $msw) { + $msw =~ s/ \(.+\)$//; + $msw =~ s/ in splice$// if $] < 5.006; + if ($sw ne $msw) { + return "different warning: '$sw' vs '$msw'"; + } + } + elsif (not defined $sw and not defined $msw) { + # Okay. + } + else { + return "one warning defined, another undef"; + } + } + + undef $H; + untie @h; + + open(TEXT, $tmp) or die "cannot open $tmp: $!"; + @h = ; normalise @h; chomp @h; + close TEXT or die "cannot close $tmp: $!"; + return('list is different when re-read from disk: ' + . Dumper(\@array) . ' vs ' . Dumper(\@h)) + if list_diff(\@array, \@h); + + unlink $tmp; + + return undef; # success +} + + +# list_diff() +# +# Do two lists differ? +# +# Parameters: +# reference to first list +# reference to second list +# +# Returns true iff they differ. Only works for lists of (string or +# undef). +# +# Surely there is a better way to do this? +# +sub list_diff { + die 'usage: list_diff(ref to first list, ref to second list)' + if @_ != 2; + my ($a, $b) = @_; + my @a = @$a; my @b = @$b; + return 1 if (scalar @a) != (scalar @b); + for (my $i = 0; $i < @a; $i++) { + my ($ae, $be) = ($a[$i], $b[$i]); + if (defined $ae and defined $be) { + return 1 if $ae ne $be; + } + elsif (not defined $ae and not defined $be) { + # Two undefined values are 'equal' + } + else { + return 1; + } + } + return 0; +} + + +# rand_test() +# +# Think up a random ARRAY, OFFSET, LENGTH, LIST, and context. +# ARRAY or LIST might be empty, and OFFSET or LENGTH might be +# undefined. Return a 'test' - a listref of these five things. +# +sub rand_test { + die 'usage: rand_test()' if @_; + my @contexts = qw; + my $context = $contexts[int(rand @contexts)]; + return [ rand_list(), + (rand() < 0.5) ? (int(rand(20)) - 10) : undef, + (rand() < 0.5) ? (int(rand(20)) - 10) : undef, + rand_list(), + $context ]; +} + + +sub rand_list { + die 'usage: rand_list()' if @_; + my @r; + + while (rand() > 0.1 * (scalar @r + 1)) { + push @r, rand_word(); + } + return \@r; +} + + +sub rand_word { + die 'usage: rand_word()' if @_; + my $r = ''; + my @chars = qw; + while (rand() > 0.1 * (length($r) + 1)) { + $r .= $chars[int(rand(scalar @chars))]; + } + return $r; +} + + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t.bak b/fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t.bak new file mode 100644 index 0000000..bd198dc --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/db-recno.t.bak @@ -0,0 +1,1595 @@ +#!./perl -w + +use strict; +use Config; + +BEGIN { + if(-d "lib" && -f "TEST") { + if ($Config{'extensions'} !~ /\bDB_File\b/ ) { + print "1..0 # Skip: DB_File was not built\n"; + exit 0; + } + } +} + +use DB_File; +use Fcntl; +our ($dbh, $Dfile, $bad_ones, $FA); + +# full tied array support started in Perl 5.004_57 +# Double check to see if it is available. + +{ + sub try::TIEARRAY { bless [], "try" } + sub try::FETCHSIZE { $FA = 1 } + $FA = 0 ; + my @a ; + tie @a, 'try' ; + my $a = @a ; +} + + +sub ok +{ + my $no = shift ; + my $result = shift ; + + print "not " unless $result ; + print "ok $no\n" ; + + return $result ; +} + +{ + package Redirect ; + use Symbol ; + + sub new + { + my $class = shift ; + my $filename = shift ; + my $fh = gensym ; + open ($fh, ">$filename") || die "Cannot open $filename: $!" ; + my $real_stdout = select($fh) ; + return bless [$fh, $real_stdout ] ; + + } + sub DESTROY + { + my $self = shift ; + close $self->[0] ; + select($self->[1]) ; + } +} + +sub docat +{ + my $file = shift; + local $/ = undef; + open(CAT,$file) || die "Cannot open $file:$!"; + my $result = ; + close(CAT); + normalise($result) ; + return $result; +} + +sub docat_del +{ + my $file = shift; + my $result = docat($file); + unlink $file ; + return $result; +} + +sub safeUntie +{ + my $hashref = shift ; + my $no_inner = 1; + local $SIG{__WARN__} = sub {-- $no_inner } ; + untie @$hashref; + return $no_inner; +} + +sub bad_one +{ + unless ($bad_ones++) { + print STDERR <{bval}) ; +ok(2, ! defined $dbh->{cachesize}) ; +ok(3, ! defined $dbh->{psize}) ; +ok(4, ! defined $dbh->{flags}) ; +ok(5, ! defined $dbh->{lorder}) ; +ok(6, ! defined $dbh->{reclen}) ; +ok(7, ! defined $dbh->{bfname}) ; + +$dbh->{bval} = 3000 ; +ok(8, $dbh->{bval} == 3000 ); + +$dbh->{cachesize} = 9000 ; +ok(9, $dbh->{cachesize} == 9000 ); + +$dbh->{psize} = 400 ; +ok(10, $dbh->{psize} == 400 ); + +$dbh->{flags} = 65 ; +ok(11, $dbh->{flags} == 65 ); + +$dbh->{lorder} = 123 ; +ok(12, $dbh->{lorder} == 123 ); + +$dbh->{reclen} = 1234 ; +ok(13, $dbh->{reclen} == 1234 ); + +$dbh->{bfname} = 1234 ; +ok(14, $dbh->{bfname} == 1234 ); + + +# Check that an invalid entry is caught both for store & fetch +eval '$dbh->{fred} = 1234' ; +ok(15, $@ =~ /^DB_File::RECNOINFO::STORE - Unknown element 'fred' at/ ); +eval 'my $q = $dbh->{fred}' ; +ok(16, $@ =~ /^DB_File::RECNOINFO::FETCH - Unknown element 'fred' at/ ); + +# Now check the interface to RECNOINFO + +my $X ; +my @h ; +ok(17, $X = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ; + +my %noMode = map { $_, 1} qw( amigaos MSWin32 NetWare cygwin ) ; + +ok(18, ((stat($Dfile))[2] & 0777) == (($^O eq 'os2' || $^O eq 'MacOS') ? 0666 : 0640) + || $noMode{$^O} ); + +#my $l = @h ; +my $l = $X->length ; +ok(19, ($FA ? @h == 0 : !$l) ); + +my @data = qw( a b c d ever f g h i j k longername m n o p) ; + +$h[0] = shift @data ; +ok(20, $h[0] eq 'a' ); + +my $ i; +foreach (@data) + { $h[++$i] = $_ } + +unshift (@data, 'a') ; + +ok(21, defined $h[1] ); +ok(22, ! defined $h[16] ); +ok(23, $FA ? @h == @data : $X->length == @data ); + + +# Overwrite an entry & check fetch it +$h[3] = 'replaced' ; +$data[3] = 'replaced' ; +ok(24, $h[3] eq 'replaced' ); + +#PUSH +my @push_data = qw(added to the end) ; +($FA ? push(@h, @push_data) : $X->push(@push_data)) ; +push (@data, @push_data) ; +ok(25, $h[++$i] eq 'added' ); +ok(26, $h[++$i] eq 'to' ); +ok(27, $h[++$i] eq 'the' ); +ok(28, $h[++$i] eq 'end' ); + +# POP +my $popped = pop (@data) ; +my $value = ($FA ? pop @h : $X->pop) ; +ok(29, $value eq $popped) ; + +# SHIFT +$value = ($FA ? shift @h : $X->shift) ; +my $shifted = shift @data ; +ok(30, $value eq $shifted ); + +# UNSHIFT + +# empty list +($FA ? unshift @h,() : $X->unshift) ; +ok(31, ($FA ? @h == @data : $X->length == @data )); + +my @new_data = qw(add this to the start of the array) ; +$FA ? unshift (@h, @new_data) : $X->unshift (@new_data) ; +unshift (@data, @new_data) ; +ok(32, $FA ? @h == @data : $X->length == @data ); +ok(33, $h[0] eq "add") ; +ok(34, $h[1] eq "this") ; +ok(35, $h[2] eq "to") ; +ok(36, $h[3] eq "the") ; +ok(37, $h[4] eq "start") ; +ok(38, $h[5] eq "of") ; +ok(39, $h[6] eq "the") ; +ok(40, $h[7] eq "array") ; +ok(41, $h[8] eq $data[8]) ; + +# Brief test for SPLICE - more thorough 'soak test' is later. +my @old; +if ($FA) { + @old = splice(@h, 1, 2, qw(bananas just before)); +} +else { + @old = $X->splice(1, 2, qw(bananas just before)); +} +ok(42, $h[0] eq "add") ; +ok(43, $h[1] eq "bananas") ; +ok(44, $h[2] eq "just") ; +ok(45, $h[3] eq "before") ; +ok(46, $h[4] eq "the") ; +ok(47, $h[5] eq "start") ; +ok(48, $h[6] eq "of") ; +ok(49, $h[7] eq "the") ; +ok(50, $h[8] eq "array") ; +ok(51, $h[9] eq $data[8]) ; +$FA ? splice(@h, 1, 3, @old) : $X->splice(1, 3, @old); + +# Now both arrays should be identical + +my $ok = 1 ; +my $j = 0 ; +foreach (@data) +{ + $ok = 0, last if $_ ne $h[$j ++] ; +} +ok(52, $ok ); + +# Neagtive subscripts + +# get the last element of the array +ok(53, $h[-1] eq $data[-1] ); +ok(54, $h[-1] eq $h[ ($FA ? @h : $X->length) -1] ); + +# get the first element using a negative subscript +eval '$h[ - ( $FA ? @h : $X->length)] = "abcd"' ; +ok(55, $@ eq "" ); +ok(56, $h[0] eq "abcd" ); + +# now try to read before the start of the array +eval '$h[ - (1 + ($FA ? @h : $X->length))] = 1234' ; +ok(57, $@ =~ '^Modification of non-creatable array value attempted' ); + +# IMPORTANT - $X must be undefined before the untie otherwise the +# underlying DB close routine will not get called. +undef $X ; +ok(58, safeUntie \@h); + +unlink $Dfile; + + +{ + # Check bval defaults to \n + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + ok(59, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(60, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + ok(61, $x eq "abc\ndef\n\nghi\n") ; +} + +{ + # Change bval + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + $dbh->{bval} = "-" ; + ok(62, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(63, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + my $ok = ($x eq "abc-def--ghi-") ; + bad_one() unless $ok ; + ok(64, $ok) ; +} + +{ + # Check R_FIXEDLEN with default bval (space) + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + $dbh->{flags} = R_FIXEDLEN ; + $dbh->{reclen} = 5 ; + ok(65, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(66, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + my $ok = ($x eq "abc def ghi ") ; + bad_one() unless $ok ; + ok(67, $ok) ; +} + +{ + # Check R_FIXEDLEN with user-defined bval + + my @h = () ; + my $dbh = new DB_File::RECNOINFO ; + $dbh->{flags} = R_FIXEDLEN ; + $dbh->{bval} = "-" ; + $dbh->{reclen} = 5 ; + ok(68, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[3] = "ghi" ; + ok(69, safeUntie \@h); + my $x = docat($Dfile) ; + unlink $Dfile; + my $ok = ($x eq "abc--def-------ghi--") ; + bad_one() unless $ok ; + ok(70, $ok) ; +} + +{ + # check that attempting to tie an associative array to a DB_RECNO will fail + + my $filename = "xyz" ; + my %x ; + eval { tie %x, 'DB_File', $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO ; } ; + ok(71, $@ =~ /^DB_File can only tie an array to a DB_RECNO database/) ; + unlink $filename ; +} + +{ + # sub-class test + + package Another ; + + use warnings ; + use strict ; + + open(FILE, ">SubDB.pm") or die "Cannot open SubDB.pm: $!\n" ; + print FILE <<'EOM' ; + + package SubDB ; + + use warnings ; + use strict ; + our (@ISA, @EXPORT); + + require Exporter ; + use DB_File; + @ISA=qw(DB_File); + @EXPORT = @DB_File::EXPORT ; + + sub STORE { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::STORE($key, $value * 2) ; + } + + sub FETCH { + my $self = shift ; + my $key = shift ; + $self->SUPER::FETCH($key) - 1 ; + } + + sub put { + my $self = shift ; + my $key = shift ; + my $value = shift ; + $self->SUPER::put($key, $value * 3) ; + } + + sub get { + my $self = shift ; + $self->SUPER::get($_[0], $_[1]) ; + $_[1] -= 2 ; + } + + sub A_new_method + { + my $self = shift ; + my $key = shift ; + my $value = $self->FETCH($key) ; + return "[[$value]]" ; + } + + 1 ; +EOM + + close FILE or die "Could not close: $!"; + + BEGIN { push @INC, '.'; } + eval 'use SubDB ; '; + main::ok(72, $@ eq "") ; + my @h ; + my $X ; + eval ' + $X = tie(@h, "SubDB","recno.tmp", O_RDWR|O_CREAT, 0640, $DB_RECNO ); + ' ; + die "Could not tie: $!" unless $X; + + main::ok(73, $@ eq "") ; + + my $ret = eval '$h[3] = 3 ; return $h[3] ' ; + main::ok(74, $@ eq "") ; + main::ok(75, $ret == 5) ; + + my $value = 0; + $ret = eval '$X->put(1, 4) ; $X->get(1, $value) ; return $value' ; + main::ok(76, $@ eq "") ; + main::ok(77, $ret == 10) ; + + $ret = eval ' R_NEXT eq main::R_NEXT ' ; + main::ok(78, $@ eq "" ) ; + main::ok(79, $ret == 1) ; + + $ret = eval '$X->A_new_method(1) ' ; + main::ok(80, $@ eq "") ; + main::ok(81, $ret eq "[[11]]") ; + + undef $X; + main::ok(82, main::safeUntie \@h); + unlink "SubDB.pm", "recno.tmp" ; + +} + +{ + + # test $# + my $self ; + unlink $Dfile; + ok(83, $self = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ; + $h[0] = "abc" ; + $h[1] = "def" ; + $h[2] = "ghi" ; + $h[3] = "jkl" ; + ok(84, $FA ? $#h == 3 : $self->length() == 4) ; + undef $self ; + ok(85, safeUntie \@h); + my $x = docat($Dfile) ; + ok(86, $x eq "abc\ndef\nghi\njkl\n") ; + + # $# sets array to same length + $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ; + ok(87, $self) + or warn "# $DB_File::Error\n"; + if ($FA) + { $#h = 3 } + else + { $self->STORESIZE(4) } + ok(88, $FA ? $#h == 3 : $self->length() == 4) ; + undef $self ; + ok(89, safeUntie \@h); + $x = docat($Dfile) ; + ok(90, $x eq "abc\ndef\nghi\njkl\n") ; + + # $# sets array to bigger + ok(91, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + if ($FA) + { $#h = 6 } + else + { $self->STORESIZE(7) } + ok(92, $FA ? $#h == 6 : $self->length() == 7) ; + undef $self ; + ok(93, safeUntie \@h); + $x = docat($Dfile) ; + ok(94, $x eq "abc\ndef\nghi\njkl\n\n\n\n") ; + + # $# sets array smaller + ok(95, $self = tie @h, 'DB_File', $Dfile, O_RDWR, 0640, $DB_RECNO ) ; + if ($FA) + { $#h = 2 } + else + { $self->STORESIZE(3) } + ok(96, $FA ? $#h == 2 : $self->length() == 3) ; + undef $self ; + ok(97, safeUntie \@h); + $x = docat($Dfile) ; + ok(98, $x eq "abc\ndef\nghi\n") ; + + unlink $Dfile; + + +} + +{ + # DBM Filter tests + use warnings ; + use strict ; + my (@h, $db) ; + my ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + unlink $Dfile; + + sub checkOutput + { + my($fk, $sk, $fv, $sv) = @_ ; + + print "# Fetch Key : expected '$fk' got '$fetch_key'\n" + if $fetch_key ne $fk ; + print "# Fetch Value : expected '$fv' got '$fetch_value'\n" + if $fetch_value ne $fv ; + print "# Store Key : expected '$sk' got '$store_key'\n" + if $store_key ne $sk ; + print "# Store Value : expected '$sv' got '$store_value'\n" + if $store_value ne $sv ; + print "# \$_ : expected 'original' got '$_'\n" + if $_ ne 'original' ; + + return + $fetch_key eq $fk && $store_key eq $sk && + $fetch_value eq $fv && $store_value eq $sv && + $_ eq 'original' ; + } + + ok(99, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_fetch_key (sub { $fetch_key = $_ }) ; + $db->filter_store_key (sub { $store_key = $_ }) ; + $db->filter_fetch_value (sub { $fetch_value = $_}) ; + $db->filter_store_value (sub { $store_value = $_ }) ; + + $_ = "original" ; + + $h[0] = "joe" ; + # fk sk fv sv + ok(100, checkOutput( "", 0, "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(101, $h[0] eq "joe"); + # fk sk fv sv + ok(102, checkOutput( "", 0, "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(103, $db->FIRSTKEY() == 0) ; + # fk sk fv sv + ok(104, checkOutput( 0, "", "", "")) ; + + # replace the filters, but remember the previous set + my ($old_fk) = $db->filter_fetch_key + (sub { ++ $_ ; $fetch_key = $_ }) ; + my ($old_sk) = $db->filter_store_key + (sub { $_ *= 2 ; $store_key = $_ }) ; + my ($old_fv) = $db->filter_fetch_value + (sub { $_ = "[$_]"; $fetch_value = $_ }) ; + my ($old_sv) = $db->filter_store_value + (sub { s/o/x/g; $store_value = $_ }) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h[1] = "Joe" ; + # fk sk fv sv + ok(105, checkOutput( "", 2, "", "Jxe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(106, $h[1] eq "[Jxe]"); + # fk sk fv sv + ok(107, checkOutput( "", 2, "[Jxe]", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(108, $db->FIRSTKEY() == 1) ; + # fk sk fv sv + ok(109, checkOutput( 1, "", "", "")) ; + + # put the original filters back + $db->filter_fetch_key ($old_fk); + $db->filter_store_key ($old_sk); + $db->filter_fetch_value ($old_fv); + $db->filter_store_value ($old_sv); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h[0] = "joe" ; + ok(110, checkOutput( "", 0, "", "joe")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(111, $h[0] eq "joe"); + ok(112, checkOutput( "", 0, "joe", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(113, $db->FIRSTKEY() == 0) ; + ok(114, checkOutput( 0, "", "", "")) ; + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + $h[0] = "joe" ; + ok(115, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(116, $h[0] eq "joe"); + ok(117, checkOutput( "", "", "", "")) ; + + ($fetch_key, $store_key, $fetch_value, $store_value) = ("") x 4 ; + ok(118, $db->FIRSTKEY() == 0) ; + ok(119, checkOutput( "", "", "", "")) ; + + undef $db ; + ok(120, safeUntie \@h); + unlink $Dfile; +} + +{ + # DBM Filter with a closure + + use warnings ; + use strict ; + my (@h, $db) ; + + unlink $Dfile; + ok(121, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + my %result = () ; + + sub Closure + { + my ($name) = @_ ; + my $count = 0 ; + my @kept = () ; + + return sub { ++$count ; + push @kept, $_ ; + $result{$name} = "$name - $count: [@kept]" ; + } + } + + $db->filter_store_key(Closure("store key")) ; + $db->filter_store_value(Closure("store value")) ; + $db->filter_fetch_key(Closure("fetch key")) ; + $db->filter_fetch_value(Closure("fetch value")) ; + + $_ = "original" ; + + $h[0] = "joe" ; + ok(122, $result{"store key"} eq "store key - 1: [0]"); + ok(123, $result{"store value"} eq "store value - 1: [joe]"); + ok(124, ! defined $result{"fetch key"} ); + ok(125, ! defined $result{"fetch value"} ); + ok(126, $_ eq "original") ; + + ok(127, $db->FIRSTKEY() == 0 ) ; + ok(128, $result{"store key"} eq "store key - 1: [0]"); + ok(129, $result{"store value"} eq "store value - 1: [joe]"); + ok(130, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(131, ! defined $result{"fetch value"} ); + ok(132, $_ eq "original") ; + + $h[7] = "john" ; + ok(133, $result{"store key"} eq "store key - 2: [0 7]"); + ok(134, $result{"store value"} eq "store value - 2: [joe john]"); + ok(135, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(136, ! defined $result{"fetch value"} ); + ok(137, $_ eq "original") ; + + ok(138, $h[0] eq "joe"); + ok(139, $result{"store key"} eq "store key - 3: [0 7 0]"); + ok(140, $result{"store value"} eq "store value - 2: [joe john]"); + ok(141, $result{"fetch key"} eq "fetch key - 1: [0]"); + ok(142, $result{"fetch value"} eq "fetch value - 1: [joe]"); + ok(143, $_ eq "original") ; + + undef $db ; + ok(144, safeUntie \@h); + unlink $Dfile; +} + +{ + # DBM Filter recursion detection + use warnings ; + use strict ; + my (@h, $db) ; + unlink $Dfile; + + ok(145, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_store_key (sub { $_ = $h[0] }) ; + + eval '$h[1] = 1234' ; + ok(146, $@ =~ /^recursion detected in filter_store_key at/ ); + + undef $db ; + ok(147, safeUntie \@h); + unlink $Dfile; +} + + +{ + # Examples from the POD + + my $file = "xyzt" ; + { + my $redirect = new Redirect $file ; + + use warnings FATAL => qw(all); + use strict ; + use DB_File ; + + my $filename = "text" ; + unlink $filename ; + + my @h ; + my $x = tie @h, "DB_File", $filename, O_RDWR|O_CREAT, 0640, $DB_RECNO + or die "Cannot open file 'text': $!\n" ; + + # Add a few key/value pairs to the file + $h[0] = "orange" ; + $h[1] = "blue" ; + $h[2] = "yellow" ; + + $FA ? push @h, "green", "black" + : $x->push("green", "black") ; + + my $elements = $FA ? scalar @h : $x->length ; + print "The array contains $elements entries\n" ; + + my $last = $FA ? pop @h : $x->pop ; + print "popped $last\n" ; + + $FA ? unshift @h, "white" + : $x->unshift("white") ; + my $first = $FA ? shift @h : $x->shift ; + print "shifted $first\n" ; + + # Check for existence of a key + print "Element 1 Exists with value $h[1]\n" if $h[1] ; + + # use a negative index + print "The last element is $h[-1]\n" ; + print "The 2nd last element is $h[-2]\n" ; + + undef $x ; + untie @h ; + + unlink $filename ; + } + + ok(148, docat_del($file) eq <<'EOM') ; +The array contains 5 entries +popped black +shifted white +Element 1 Exists with value blue +The last element is green +The 2nd last element is yellow +EOM + + my $save_output = "xyzt" ; + { + my $redirect = new Redirect $save_output ; + + use warnings FATAL => qw(all); + use strict ; + our (@h, $H, $file, $i); + use DB_File ; + use Fcntl ; + + $file = "text" ; + + unlink $file ; + + $H = tie @h, "DB_File", $file, O_RDWR|O_CREAT, 0640, $DB_RECNO + or die "Cannot open file $file: $!\n" ; + + # first create a text file to play with + $h[0] = "zero" ; + $h[1] = "one" ; + $h[2] = "two" ; + $h[3] = "three" ; + $h[4] = "four" ; + + + # Print the records in order. + # + # The length method is needed here because evaluating a tied + # array in a scalar context does not return the number of + # elements in the array. + + print "\nORIGINAL\n" ; + foreach $i (0 .. $H->length - 1) { + print "$i: $h[$i]\n" ; + } + + # use the push & pop methods + $a = $H->pop ; + $H->push("last") ; + print "\nThe last record was [$a]\n" ; + + # and the shift & unshift methods + $a = $H->shift ; + $H->unshift("first") ; + print "The first record was [$a]\n" ; + + # Use the API to add a new record after record 2. + $i = 2 ; + $H->put($i, "Newbie", R_IAFTER) ; + + # and a new record before record 1. + $i = 1 ; + $H->put($i, "New One", R_IBEFORE) ; + + # delete record 3 + $H->del(3) ; + + # now print the records in reverse order + print "\nREVERSE\n" ; + for ($i = $H->length - 1 ; $i >= 0 ; -- $i) + { print "$i: $h[$i]\n" } + + # same again, but use the API functions instead + print "\nREVERSE again\n" ; + my ($s, $k, $v) = (0, 0, 0) ; + for ($s = $H->seq($k, $v, R_LAST) ; + $s == 0 ; + $s = $H->seq($k, $v, R_PREV)) + { print "$k: $v\n" } + + undef $H ; + untie @h ; + + unlink $file ; + } + + ok(149, docat_del($save_output) eq <<'EOM') ; + +ORIGINAL +0: zero +1: one +2: two +3: three +4: four + +The last record was [four] +The first record was [zero] + +REVERSE +5: last +4: three +3: Newbie +2: one +1: New One +0: first + +REVERSE again +5: last +4: three +3: Newbie +2: one +1: New One +0: first +EOM + +} + +{ + # Bug ID 20001013.009 + # + # test that $hash{KEY} = undef doesn't produce the warning + # Use of uninitialized value in null operation + use warnings ; + use strict ; + use DB_File ; + + unlink $Dfile; + my @h ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO + or die "Can't open file: $!\n" ; + $h[0] = undef; + ok(150, $a eq "") ; + ok(151, safeUntie \@h); + unlink $Dfile; +} + +{ + # test that %hash = () doesn't produce the warning + # Argument "" isn't numeric in entersub + use warnings ; + use strict ; + use DB_File ; + my $a = ""; + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + unlink $Dfile; + my @h ; + + tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO + or die "Can't open file: $!\n" ; + @h = (); ; + ok(152, $a eq "") ; + ok(153, safeUntie \@h); + unlink $Dfile; +} + +{ + # Check that DBM Filter can cope with read-only $_ + + use warnings ; + use strict ; + my (@h, $db) ; + unlink $Dfile; + + ok(154, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + $db->filter_fetch_key (sub { }) ; + $db->filter_store_key (sub { }) ; + $db->filter_fetch_value (sub { }) ; + $db->filter_store_value (sub { }) ; + + $_ = "original" ; + + $h[0] = "joe" ; + ok(155, $h[0] eq "joe"); + + eval { my @r= grep { $h[$_] } (1, 2, 3) }; + ok (156, ! $@); + + + # delete the filters + $db->filter_fetch_key (undef); + $db->filter_store_key (undef); + $db->filter_fetch_value (undef); + $db->filter_store_value (undef); + + $h[1] = "joe" ; + + ok(157, $h[1] eq "joe"); + + eval { my @r= grep { $h[$_] } (1, 2, 3) }; + ok (158, ! $@); + + undef $db ; + untie @h; + unlink $Dfile; +} + +{ + # Check low-level API works with filter + + use warnings ; + use strict ; + my (@h, $db) ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(159, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ); + + + $db->filter_fetch_key (sub { ++ $_ } ); + $db->filter_store_key (sub { -- $_ } ); + $db->filter_fetch_value (sub { $_ = unpack("i", $_) } ); + $db->filter_store_value (sub { $_ = pack("i", $_) } ); + + $_ = 'fred'; + + my $key = 22 ; + my $value = 34 ; + + $db->put($key, $value) ; + ok 160, $key == 22; + ok 161, $value == 34 ; + ok 162, $_ eq 'fred'; + #print "k [$key][$value]\n" ; + + my $val ; + $db->get($key, $val) ; + ok 163, $key == 22; + ok 164, $val == 34 ; + ok 165, $_ eq 'fred'; + + $key = 51 ; + $value = 454; + $h[$key] = $value ; + ok 166, $key == 51; + ok 167, $value == 454 ; + ok 168, $_ eq 'fred'; + + undef $db ; + untie @h; + unlink $Dfile; +} + + +{ + # Regression Test for bug 30237 + # Check that substr can be used in the key to db_put + # and that db_put does not trigger the warning + # + # Use of uninitialized value in subroutine entry + + + use warnings ; + use strict ; + my (@h, $db) ; + my $status ; + my $Dfile = "xxy.db"; + unlink $Dfile; + + ok(169, $db = tie(@h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO) ); + + my $warned = ''; + local $SIG{__WARN__} = sub {$warned = $_[0]} ; + + # db-put with substr of key + my %remember = () ; + for my $ix ( 0 .. 2 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{substr($key,0, 1)} = $value ; + $db->put(substr($key,0, 1), $value) ; + } + + ok 170, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # db-put with substr of value + $warned = ''; + for my $ix ( 3 .. 5 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$ix} = $value ; + $db->put($ix, substr($value,0)) ; + } + + ok 171, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied array is not a problem, but check anyway + # substr of key + $warned = ''; + for my $ix ( 6 .. 8 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{substr($key,0,1)} = $value ; + $h[substr($key,0,1)] = $value ; + } + + ok 172, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + # via the tied array is not a problem, but check anyway + # substr of value + $warned = ''; + for my $ix ( 9 .. 10 ) + { + my $key = $ix . "data" ; + my $value = "value$ix" ; + $remember{$ix} = $value ; + $h[$ix] = substr($value,0) ; + } + + ok 173, $warned eq '' + or print "# Caught warning [$warned]\n" ; + + my %bad = () ; + my $key = ''; + for (my $status = $db->seq($key, $value, R_FIRST ) ; + $status == 0 ; + $status = $db->seq($key, $value, R_NEXT ) ) { + + #print "# key [$key] value [$value]\n" ; + if (defined $remember{$key} && defined $value && + $remember{$key} eq $value) { + delete $remember{$key} ; + } + else { + $bad{$key} = $value ; + } + } + + ok 174, keys %bad == 0 ; + ok 175, keys %remember == 0 ; + + print "# missing -- $key $value\n" while ($key, $value) = each %remember; + print "# bad -- $key $value\n" while ($key, $value) = each %bad; + + # Make sure this fix does not break code to handle an undef key + my $value = 'fred'; + $warned = ''; + $status = $db->put(undef, $value) ; + ok 176, $status == 0 + or print "# put failed - status $status\n"; + ok 177, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + print "# db_ver $DB_File::db_ver\n"; + $value = '' ; + $status = $db->get(undef, $value) ; + ok 178, $status == 0 + or print "# get failed - status $status\n" ; + ok(179, $db->get(undef, $value) == 0) or print "# get failed\n" ; + ok 180, $value eq 'fred' or print "# got [$value]\n" ; + ok 181, $warned eq '' + or print "# Caught warning [$warned]\n" ; + $warned = ''; + + undef $db ; + untie @h; + unlink $Dfile; +} + +# Only test splice if this is a newish version of Perl +exit unless $FA ; + +# Test SPLICE + +{ + # check that the splice warnings are under the same lexical control + # as their non-tied counterparts. + + use warnings; + use strict; + + my $a = ''; + my @a = (1); + local $SIG{__WARN__} = sub {$a = $_[0]} ; + + unlink $Dfile; + my @tied ; + + tie @tied, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0664, $DB_RECNO + or die "Can't open file: $!\n" ; + + # uninitialized offset + use warnings; + my $offset ; + $a = ''; + splice(@a, $offset); + ok(182, $a =~ /^Use of uninitialized value /); + $a = ''; + splice(@tied, $offset); + ok(183, $a =~ /^Use of uninitialized value in splice/); + + no warnings 'uninitialized'; + $a = ''; + splice(@a, $offset); + ok(184, $a eq ''); + $a = ''; + splice(@tied, $offset); + ok(185, $a eq ''); + + # uninitialized length + use warnings; + my $length ; + $a = ''; + splice(@a, 0, $length); + ok(186, $a =~ /^Use of uninitialized value /); + $a = ''; + splice(@tied, 0, $length); + ok(187, $a =~ /^Use of uninitialized value in splice/); + + no warnings 'uninitialized'; + $a = ''; + splice(@a, 0, $length); + ok(188, $a eq ''); + $a = ''; + splice(@tied, 0, $length); + ok(189, $a eq ''); + + # offset past end of array + use warnings; + $a = ''; + splice(@a, 3); + my $splice_end_array = ($a =~ /^splice\(\) offset past end of array/); + $a = ''; + splice(@tied, 3); + ok(190, !$splice_end_array || $a =~ /^splice\(\) offset past end of array/); + + no warnings 'misc'; + $a = ''; + splice(@a, 3); + ok(191, $a eq ''); + $a = ''; + splice(@tied, 3); + ok(192, $a eq ''); + + ok(193, safeUntie \@tied); + unlink $Dfile; +} + +# +# These are a few regression tests: bundles of five arguments to pass +# to test_splice(). The first four arguments correspond to those +# given to splice(), and the last says which context to call it in +# (scalar, list or void). +# +# The expected result is not needed because we get that by running +# Perl's built-in splice(). +# +my @tests = ([ [ 'falsely', 'dinosaur', 'remedy', 'commotion', + 'rarely', 'paleness' ], + -4, -2, + [ 'redoubled', 'Taylorize', 'Zoe', 'halogen' ], + 'void' ], + + [ [ 'a' ], -2, 1, [ 'B' ], 'void' ], + + [ [ 'Hartley', 'Islandia', 'assents', 'wishful' ], + 0, -4, + [ 'maids' ], + 'void' ], + + [ [ 'visibility', 'pocketful', 'rectangles' ], + -10, 0, + [ 'garbages' ], + 'void' ], + + [ [ 'sleeplessly' ], + 8, -4, + [ 'Margery', 'clearing', 'repercussion', 'clubs', + 'arise' ], + 'void' ], + + [ [ 'chastises', 'recalculates' ], + 0, 0, + [ 'momentariness', 'mediates', 'accents', 'toils', + 'regaled' ], + 'void' ], + + [ [ 'b', '' ], + 9, 8, + [ 'otrb', 'stje', 'ixrpw', 'vxfx', 'lhhf' ], + 'scalar' ], + + [ [ 'b', '' ], + undef, undef, + [ 'otrb', 'stje', 'ixrpw', 'vxfx', 'lhhf' ], + 'scalar' ], + + [ [ 'riheb' ], -8, undef, [], 'void' ], + + [ [ 'uft', 'qnxs', '' ], + 6, -2, + [ 'znp', 'mhnkh', 'bn' ], + 'void' ], + ); + +my $testnum = 194; +my $failed = 0; +my $tmp = "dbr$$"; +foreach my $test (@tests) { + my $err = test_splice(@$test); + if (defined $err) { + print STDERR "# failed: ", Dumper($test); + print STDERR "# error: $err\n"; + $failed = 1; + ok($testnum++, 0); + } + else { ok($testnum++, 1) } +} + +if ($failed) { + # Not worth running the random ones + print STDERR '# skipping ', $testnum++, "\n"; +} +else { + # A thousand randomly-generated tests + $failed = 0; + srand(0); + foreach (0 .. 1000 - 1) { + my $test = rand_test(); + my $err = test_splice(@$test); + if (defined $err) { + print STDERR "# failed: ", Dumper($test); + print STDERR "# error: $err\n"; + $failed = 1; + print STDERR "# skipping any remaining random tests\n"; + last; + } + } + + ok($testnum++, not $failed); +} + +die "testnum ($testnum) != total_tests ($total_tests) + 1" + if $testnum != $total_tests + 1; + +exit ; + +# Subroutines for SPLICE testing + +# test_splice() +# +# Test the new splice() against Perl's built-in one. The first four +# parameters are those passed to splice(), except that the lists must +# be (explicitly) passed by reference, and are not actually modified. +# (It's just a test!) The last argument specifies the context in +# which to call the functions: 'list', 'scalar', or 'void'. +# +# Returns: +# undef, if the two splices give the same results for the given +# arguments and context; +# +# an error message showing the difference, otherwise. +# +# Reads global variable $tmp. +# +sub test_splice { + die 'usage: test_splice(array, offset, length, list, context)' if @_ != 5; + my ($array, $offset, $length, $list, $context) = @_; + my @array = @$array; + my @list = @$list; + + unlink $tmp; + + my @h; + my $H = tie @h, 'DB_File', $tmp, O_CREAT|O_RDWR, 0644, $DB_RECNO + or die "cannot open $tmp: $!"; + + my $i = 0; + foreach ( @array ) { $h[$i++] = $_ } + + return "basic DB_File sanity check failed" + if list_diff(\@array, \@h); + + # Output from splice(): + # Returned value (munged a bit), error msg, warnings + # + my ($s_r, $s_error, @s_warnings); + + my $gather_warning = sub { push @s_warnings, $_[0] }; + if ($context eq 'list') { + my @r; + eval { + local $SIG{__WARN__} = $gather_warning; + @r = splice @array, $offset, $length, @list; + }; + $s_error = $@; + $s_r = \@r; + } + elsif ($context eq 'scalar') { + my $r; + eval { + local $SIG{__WARN__} = $gather_warning; + $r = splice @array, $offset, $length, @list; + }; + $s_error = $@; + $s_r = [ $r ]; + } + elsif ($context eq 'void') { + eval { + local $SIG{__WARN__} = $gather_warning; + splice @array, $offset, $length, @list; + }; + $s_error = $@; + $s_r = []; + } + else { + die "bad context $context"; + } + + foreach ($s_error, @s_warnings) { + chomp; + s/ at \S+ line \d+\.$//; + # only built-in splice identifies name of uninit value + s/(uninitialized value) \$\w+/$1/; + } + + # Now do the same for DB_File's version of splice + my ($ms_r, $ms_error, @ms_warnings); + $gather_warning = sub { push @ms_warnings, $_[0] }; + if ($context eq 'list') { + my @r; + eval { + local $SIG{__WARN__} = $gather_warning; + @r = splice @h, $offset, $length, @list; + }; + $ms_error = $@; + $ms_r = \@r; + } + elsif ($context eq 'scalar') { + my $r; + eval { + local $SIG{__WARN__} = $gather_warning; + $r = splice @h, $offset, $length, @list; + }; + $ms_error = $@; + $ms_r = [ $r ]; + } + elsif ($context eq 'void') { + eval { + local $SIG{__WARN__} = $gather_warning; + splice @h, $offset, $length, @list; + }; + $ms_error = $@; + $ms_r = []; + } + else { + die "bad context $context"; + } + + foreach ($ms_error, @ms_warnings) { + chomp; + s/ at \S+(\s+\S+)*? line \d+\.?.*//s; + } + + return "different errors: '$s_error' vs '$ms_error'" + if $s_error ne $ms_error; + return('different return values: ' . Dumper($s_r) . ' vs ' . Dumper($ms_r)) + if list_diff($s_r, $ms_r); + return('different changed list: ' . Dumper(\@array) . ' vs ' . Dumper(\@h)) + if list_diff(\@array, \@h); + + if ((scalar @s_warnings) != (scalar @ms_warnings)) { + return 'different number of warnings'; + } + + while (@s_warnings) { + my $sw = shift @s_warnings; + my $msw = shift @ms_warnings; + + if (defined $sw and defined $msw) { + $msw =~ s/ \(.+\)$//; + $msw =~ s/ in splice$// if $] < 5.006; + if ($sw ne $msw) { + return "different warning: '$sw' vs '$msw'"; + } + } + elsif (not defined $sw and not defined $msw) { + # Okay. + } + else { + return "one warning defined, another undef"; + } + } + + undef $H; + untie @h; + + open(TEXT, $tmp) or die "cannot open $tmp: $!"; + @h = ; normalise @h; chomp @h; + close TEXT or die "cannot close $tmp: $!"; + return('list is different when re-read from disk: ' + . Dumper(\@array) . ' vs ' . Dumper(\@h)) + if list_diff(\@array, \@h); + + unlink $tmp; + + return undef; # success +} + + +# list_diff() +# +# Do two lists differ? +# +# Parameters: +# reference to first list +# reference to second list +# +# Returns true iff they differ. Only works for lists of (string or +# undef). +# +# Surely there is a better way to do this? +# +sub list_diff { + die 'usage: list_diff(ref to first list, ref to second list)' + if @_ != 2; + my ($a, $b) = @_; + my @a = @$a; my @b = @$b; + return 1 if (scalar @a) != (scalar @b); + for (my $i = 0; $i < @a; $i++) { + my ($ae, $be) = ($a[$i], $b[$i]); + if (defined $ae and defined $be) { + return 1 if $ae ne $be; + } + elsif (not defined $ae and not defined $be) { + # Two undefined values are 'equal' + } + else { + return 1; + } + } + return 0; +} + + +# rand_test() +# +# Think up a random ARRAY, OFFSET, LENGTH, LIST, and context. +# ARRAY or LIST might be empty, and OFFSET or LENGTH might be +# undefined. Return a 'test' - a listref of these five things. +# +sub rand_test { + die 'usage: rand_test()' if @_; + my @contexts = qw; + my $context = $contexts[int(rand @contexts)]; + return [ rand_list(), + (rand() < 0.5) ? (int(rand(20)) - 10) : undef, + (rand() < 0.5) ? (int(rand(20)) - 10) : undef, + rand_list(), + $context ]; +} + + +sub rand_list { + die 'usage: rand_list()' if @_; + my @r; + + while (rand() > 0.1 * (scalar @r + 1)) { + push @r, rand_word(); + } + return \@r; +} + + +sub rand_word { + die 'usage: rand_word()' if @_; + my $r = ''; + my @chars = qw; + while (rand() > 0.1 * (length($r) + 1)) { + $r .= $chars[int(rand(scalar @chars))]; + } + return $r; +} + + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/pod.t b/fastSum/resources/ROUGE/DB_File-1.835/t/pod.t new file mode 100644 index 0000000..230df4b --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/pod.t @@ -0,0 +1,18 @@ +eval " use Test::More " ; + +if ($@) +{ + print "1..0 # Skip: Test::More required for testing POD\n" ; + exit 0; +} + +eval "use Test::Pod 1.00"; + +if ($@) +{ + print "1..0 # Skip: Test::Pod 1.00 required for testing POD\n" ; + exit 0; +} + +all_pod_files_ok(); + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/t/pod.t.bak b/fastSum/resources/ROUGE/DB_File-1.835/t/pod.t.bak new file mode 100644 index 0000000..230df4b --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/t/pod.t.bak @@ -0,0 +1,18 @@ +eval " use Test::More " ; + +if ($@) +{ + print "1..0 # Skip: Test::More required for testing POD\n" ; + exit 0; +} + +eval "use Test::Pod 1.00"; + +if ($@) +{ + print "1..0 # Skip: Test::Pod 1.00 required for testing POD\n" ; + exit 0; +} + +all_pod_files_ok(); + diff --git a/fastSum/resources/ROUGE/DB_File-1.835/typemap b/fastSum/resources/ROUGE/DB_File-1.835/typemap new file mode 100644 index 0000000..c46b685 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/typemap @@ -0,0 +1,57 @@ +# typemap for Perl 5 interface to Berkeley +# +# written by Paul Marquess +# last modified 20th June 2004 +# version 1.809 +# +#################################### DB SECTION +# +# + +u_int T_U_INT +DB_File T_PTROBJ +DBT T_dbtdatum +DBTKEY T_dbtkeydatum + +INPUT +T_dbtkeydatum + { + SV * my_sv = $arg; + DBM_ckFilter(my_sv, filter_store_key, \"filter_store_key\"); + DBT_clear($var) ; + SvGETMAGIC(my_sv) ; + if (db->type == DB_RECNO) { + if (SvOK(my_sv)) + Value = GetRecnoKey(aTHX_ db, SvIV(my_sv)) ; + else + Value = 1 ; + $var.data = & Value; + $var.size = (int)sizeof(recno_t); + } + else if (SvOK(my_sv)) { + STRLEN len; + $var.data = SvPVbyte(my_sv, len); + $var.size = (int)len; + } + } +T_dbtdatum + { + SV * my_sv = $arg; + DBM_ckFilter(my_sv, filter_store_value, \"filter_store_value\"); + DBT_clear($var) ; + SvGETMAGIC(my_sv) ; + if (SvOK(my_sv)) { + STRLEN len; + $var.data = SvPVbyte(my_sv, len); + $var.size = (int)len; + } + } + +OUTPUT + +T_dbtkeydatum + OutputKey($arg, $var) +T_dbtdatum + OutputValue($arg, $var) +T_PTROBJ + sv_setref_pv($arg, dbtype, (void*)$var); diff --git a/fastSum/resources/ROUGE/DB_File-1.835/version.c b/fastSum/resources/ROUGE/DB_File-1.835/version.c new file mode 100644 index 0000000..e01f6f6 --- /dev/null +++ b/fastSum/resources/ROUGE/DB_File-1.835/version.c @@ -0,0 +1,83 @@ +/* + + version.c -- Perl 5 interface to Berkeley DB + + written by Paul Marquess + last modified 2nd Jan 2002 + version 1.802 + + All comments/suggestions/problems are welcome + + Copyright (c) 1995-2002 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. + + Changes: + 1.71 - Support for Berkeley DB version 3. + Support for Berkeley DB 2/3's backward compatibility mode. + 1.72 - No change. + 1.73 - Added support for threading + 1.74 - Added Perl core patch 7801. + + +*/ + +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include + +void +#ifdef CAN_PROTOTYPE +__getBerkeleyDBInfo(void) +#else +__getBerkeleyDBInfo() +#endif +{ +#ifdef dTHX + dTHX; +#endif + SV * version_sv = perl_get_sv("DB_File::db_version", GV_ADD|GV_ADDMULTI) ; + SV * ver_sv = perl_get_sv("DB_File::db_ver", GV_ADD|GV_ADDMULTI) ; + SV * compat_sv = perl_get_sv("DB_File::db_185_compat", GV_ADD|GV_ADDMULTI) ; + +#ifdef DB_VERSION_MAJOR + int Major, Minor, Patch ; + + (void)db_version(&Major, &Minor, &Patch) ; + + /* Check that the versions of db.h and libdb.a are the same */ + if (Major != DB_VERSION_MAJOR || Minor != DB_VERSION_MINOR ) + /* || Patch != DB_VERSION_PATCH) */ + + croak("\nDB_File was build with libdb version %d.%d.%d,\nbut you are attempting to run it with libdb version %d.%d.%d\n", + DB_VERSION_MAJOR, DB_VERSION_MINOR, DB_VERSION_PATCH, + Major, Minor, Patch) ; + + /* check that libdb is recent enough -- we need 2.3.4 or greater */ + if (Major == 2 && (Minor < 3 || (Minor == 3 && Patch < 4))) + croak("DB_File needs Berkeley DB 2.3.4 or greater, you have %d.%d.%d\n", + Major, Minor, Patch) ; + + { + char buffer[40] ; + sprintf(buffer, "%d.%d", Major, Minor) ; + sv_setpv(version_sv, buffer) ; + sprintf(buffer, "%d.%03d%03d", Major, Minor, Patch) ; + sv_setpv(ver_sv, buffer) ; + } + +#else /* ! DB_VERSION_MAJOR */ + sv_setiv(version_sv, 1) ; + sv_setiv(ver_sv, 1) ; +#endif /* ! DB_VERSION_MAJOR */ + +#ifdef COMPAT185 + sv_setiv(compat_sv, 1) ; +#else /* ! COMPAT185 */ + sv_setiv(compat_sv, 0) ; +#endif /* ! COMPAT185 */ + +} diff --git a/fastSum/resources/ROUGE/DB_File-1.835/version.o b/fastSum/resources/ROUGE/DB_File-1.835/version.o new file mode 100644 index 0000000000000000000000000000000000000000..9bea205e5ae0fdd5e7d64c5d16f5c809fc5966c1 GIT binary patch literal 73776 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 YE5BCwy0Y>Ymbg?wu-|WfeP;Rp0c?AawEzGB literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/README.txt b/fastSum/resources/ROUGE/RELEASE-1.5.5/README.txt new file mode 100644 index 0000000..863fd9c --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/README.txt @@ -0,0 +1,295 @@ +A Brief Introduction of the ROUGE Summary Evaluation Package +by Chin-Yew LIN +Univeristy of Southern California/Information Sciences Institute +05/26/2005 + +<> + +(1) Correct the resampling routine which ignores the last evaluation + item in the evaluation list. Therefore, the average scores reported + by ROUGE is only based on the first N-1 evaluation items. + Thanks Barry Schiffman at Columbia University to report this bug. + This bug only affects ROUGE-1.5.X. For pre-1.5 ROUGE, it only affects + the computation of confidence interval (CI) estimation, i.e. CI is only + estimated by the first N-1 evaluation items, but it *does not* affect + average scores. +(2) Correct stemming on multi-token BE heads and modifiers. + Previously, only single token heads and modifiers were assumed. +(3) Change read_text and read_text_LCS functions to read exact words or + bytes required by users. Previous versions carry out whitespace + compression and other string clear up actions before enforce the length + limit. +(4) Add the capability to score summaries in Basic Element (BE) + format by using option "-3", standing for BE triple. There are 6 + different modes in BE scoring. We suggest using *"-3 HMR"* on BEs + extracted from Minipar parse trees based on our correlation analysis + of BE-based scoring vs. human judgments on DUC 2002 & 2003 automatic + summaries. +(5) ROUGE now generates three scores (recall, precision and F-measure) + for each evaluation. Previously, only one score is generated + (recall). Precision and F-measure scores are useful when the target + summary length is not enforced. Only recall scores were necessary since + DUC guideline dictated the limit on summary length. For comparsion to + previous DUC results, please use the recall scores. The default alpha + weighting for computing F-measure is 0.5. Users can specify a + particular alpha weighting that fits their application scenario using + option "-p alpha-weight". Where *alpah-weight* is a number between 0 + and 1 inclusively. +(6) Pre-1.5 version of ROUGE used model average to compute the overall + ROUGE scores when there are multiple references. Starting from v1.5+, + ROUGE provides an option to use the best matching score among the + referenes as the final score. The model average option is specified + using "-f A" (for Average) and the best model option is specified + using "-f B" (for the Best). The "-f A" option is better when use + ROUGE in summarization evaluations; while "-f B" option is better when + use ROUGE in machine translation (MT) and definition + question-answering (DQA) evaluations since in a typical MT or DQA + evaluation scenario matching a single reference translation or + defintion answer is sufficient. However, it is very likely that + multiple different but equally good summaries exist in summarization + evaluation. +(7) ROUGE v1.5+ also provides the option to specify whether model unit + level average will be used (macro-average, i.e. treating every model + unit equally) or token level average will be used (micro-average, + i.e. treating every token equally). In summarization evaluation, we + suggest using model unit level average and this is the default setting + in ROUGE. To specify other average mode, use "-t 0" (default) for + model unit level average, "-t 1" for token level average and "-t 2" + for output raw token counts in models, peers, and matches. +(8) ROUGE now offers the option to use file list as the configuration + file. The input format of the summary files are specified using the + "-z INPUT-FORMAT" option. The INPUT-FORMAT can be SEE, SPL, ISI or + SIMPLE. When "-z" is specified, ROUGE assumed that the ROUGE + evalution configuration file is a file list with each evaluation + instance per line in the following format: + +peer_path1 model_path1 model_path2 ... model_pathN +peer_path2 model_path1 model_path2 ... model_pathN +... +peer_pathM model_path1 model_path2 ... model_pathN + + The first file path is the peer summary (system summary) and it + follows with a list of model summaries (reference summaries) separated + by white spaces (spaces or tabs). +(9) When stemming is applied, a new WordNet exception database based + on WordNet 2.0 is used. The new database is included in the data + directory. + +<> + +(1) Use "-h" option to see a list of options. + Summary: +Usage: ROUGE-1.5.4.pl + [-a (evaluate all systems)] + [-c cf] + [-d (print per evaluation scores)] + [-e ROUGE_EVAL_HOME] + [-h (usage)] + [-b n-bytes|-l n-words] + [-m (use Porter stemmer)] + [-n max-ngram] + [-s (remove stopwords)] + [-r number-of-samples (for resampling)] + [-2 max-gap-length (if < 0 then no gap length limit)] + [-3 ] + [-u (include unigram in skip-bigram) default no)] + [-U (same as -u but also compute regular skip-bigram)] + [-w weight (weighting factor for WLCS)] + [-v (verbose)] + [-x (do not calculate ROUGE-L)] + [-f A|B (scoring formula)] + [-p alpha (0 <= alpha <=1)] + [-t 0|1|2 (count by token instead of sentence)] + [-z ] + [] + + ROUGE-eval-config-file: Specify the evaluation setup. Three files come with the ROUGE + evaluation package, i.e. ROUGE-test.xml, verify.xml, and verify-spl.xml are + good examples. + + systemID: Specify which system in the ROUGE-eval-config-file to perform the evaluation. + If '-a' option is used, then all systems are evaluated and users do not need to + provide this argument. + + Default: + When running ROUGE without supplying any options (except -a), the following defaults are used: + (1) ROUGE-L is computed; + (2) 95% confidence interval; + (3) No stemming; + (4) Stopwords are inlcuded in the calculations; + (5) ROUGE looks for its data directory first through the ROUGE_EVAL_HOME environment variable. If + it is not set, the current directory is used. + (6) Use model average scoring formula. + (7) Assign equal importance of ROUGE recall and precision in computing ROUGE f-measure, i.e. alpha=0.5. + (8) Compute average ROUGE by averaging sentence (unit) ROUGE scores. + Options: + -2: Compute skip bigram (ROGUE-S) co-occurrence, also specify the maximum gap length between two words (skip-bigram) + -u: Compute skip bigram as -2 but include unigram, i.e. treat unigram as "start-sentence-symbol unigram"; -2 has to be specified. + -3: Compute BE score. + H -> head only scoring (does not applied to Minipar-based BEs). + HM -> head and modifier pair scoring. + HMR -> head, modifier and relation triple scoring. + HM1 -> H and HM scoring (same as HM for Minipar-based BEs). + HMR1 -> HM and HMR scoring (same as HMR for Minipar-based BEs). + HMR2 -> H, HM and HMR scoring (same as HMR for Minipar-based BEs). + -a: Evaluate all systems specified in the ROUGE-eval-config-file. + -c: Specify CF\% (0 <= CF <= 100) confidence interval to compute. The default is 95\% (i.e. CF=95). + -d: Print per evaluation average score for each system. + -e: Specify ROUGE_EVAL_HOME directory where the ROUGE data files can be found. + This will overwrite the ROUGE_EVAL_HOME specified in the environment variable. + -f: Select scoring formula: 'A' => model average; 'B' => best model + -h: Print usage information. + -b: Only use the first n bytes in the system/peer summary for the evaluation. + -l: Only use the first n words in the system/peer summary for the evaluation. + -m: Stem both model and system summaries using Porter stemmer before computing various statistics. + -n: Compute ROUGE-N up to max-ngram length will be computed. + -p: Relative importance of recall and precision ROUGE scores. Alpha -> 1 favors precision, Alpha -> 0 favors recall. + -s: Remove stopwords in model and system summaries before computing various statistics. + -t: Compute average ROUGE by averaging over the whole test corpus instead of sentences (units). + 0: use sentence as counting unit, 1: use token as couting unit, 2: same as 1 but output raw counts + instead of precision, recall, and f-measure scores. 2 is useful when computation of the final, + precision, recall, and f-measure scores will be conducted later. + -r: Specify the number of sampling point in bootstrap resampling (default is 1000). + Smaller number will speed up the evaluation but less reliable confidence interval. + -w: Compute ROUGE-W that gives consecutive matches of length L in an LCS a weight of 'L^weight' instead of just 'L' as in LCS. + Typically this is set to 1.2 or other number greater than 1. + -v: Print debugging information for diagnositic purpose. + -x: Do not calculate ROUGE-L. + -z: ROUGE-eval-config-file is a list of peer-model pair per line in the specified format (SEE|SPL|ISI|SIMPLE). + +(2) Please read RELEASE-NOTE.txt for information about updates from previous versions. + +(3) The following files coming with this package in the "sample-output" + directory are the expected output of the evaluation files in the + "sample-test" directory. + (a) use "data" as ROUGE_EVAL_HOME, compute 95% confidence interval, + compute ROUGE-L (longest common subsequence, default), + compute ROUGE-S* (skip bigram) without gap length limit, + compute also ROUGE-SU* (skip bigram with unigram), + run resampling 1000 times, + compute ROUGE-N (N=1 to 4), + compute ROUGE-W (weight = 1.2), and + compute these ROUGE scores for all systems: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -a ROUGE-test.xml + + (b) Same as (a) but apply Porter's stemmer on the input: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -m -a ROUGE-test.xml + + (c) Same as (b) but apply also a stopword list on the input: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-a-m-s.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -m -s -a ROUGE-test.xml + + (d) Same as (a) but apply a summary length limit of 10 words: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -a ROUGE-test.xml + + (e) Same as (d) but apply Porter's stemmer on the input: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -m -a ROUGE-test.xml + + (f) Same as (e) but apply also a stopword list on the input: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-l10-a-m-s.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -l 10 -m -s -a ROUGE-test.xml + + (g) Same as (a) but apply a summary lenght limit of 75 bytes: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -a ROUGE-test.xml + + (h) Same as (g) but apply Porter's stemmer on the input: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -m -a ROUGE-test.xml + + (i) Same as (h) but apply also a stopword list on the input: + ROUGE-test-c95-2-1-U-r1000-n4-w1.2-b75-a-m-s.out + > ROUGE-1.5.4.pl -e data -c 95 -2 -1 -U -r 1000 -n 4 -w 1.2 -b 75 -m -s -a ROUGE-test.xml + + Sample DUC2002 data (1 system and 1 model only per DUC 2002 topic), their BE and + ROUGE evaluation configuration file in XML and file list format, + and their expected output are also included for your reference. + + (a) Use DUC2002-BE-F.in.26.lst, a BE files list, as ROUGE the + configuration file: + command> ROUGE-1.5.4.pl -3 HM -z SIMPLE DUC2002-BE-F.in.26.lst 26 + output: DUC2002-BE-F.in.26.lst.out + (b) Use DUC2002-BE-F.in.26.simple.xml as ROUGE XML evaluation configuration file: + command> ROUGE-1.5.4.pl -3 HM DUC2002-BE-F.in.26.simple.xml 26 + output: DUC2002-BE-F.in.26.simple.out + (c) Use DUC2002-BE-L.in.26.lst, a BE files list, as ROUGE the + configuration file: + command> ROUGE-1.5.4.pl -3 HM -z SIMPLE DUC2002-BE-L.in.26.lst 26 + output: DUC2002-BE-L.in.26.lst.out + (d) Use DUC2002-BE-L.in.26.simple.xml as ROUGE XML evaluation configuration file: + command> ROUGE-1.5.4.pl -3 HM DUC2002-BE-L.in.26.simple.xml 26 + output: DUC2002-BE-L.in.26.simple.out + (e) Use DUC2002-ROUGE.in.26.spl.lst, a BE files list, as ROUGE the + configuration file: + command> ROUGE-1.5.4.pl -n 4 -z SPL DUC2002-ROUGE.in.26.spl.lst 26 + output: DUC2002-ROUGE.in.26.spl.lst.out + (f) Use DUC2002-ROUGE.in.26.spl.xml as ROUGE XML evaluation configuration file: + command> ROUGE-1.5.4.pl -n 4 DUC2002-ROUGE.in.26.spl.xml 26 + output: DUC2002-ROUGE.in.26.spl.out + +<> + +(1) You need to have DB_File installed. If the Perl script complains + about database version incompatibility, you can create a new + WordNet-2.0.exc.db by running the buildExceptionDB.pl script in + the "data/WordNet-2.0-Exceptions" subdirectory. +(2) You also need to install XML::DOM from http://www.cpan.org. + Direct link: http://www.cpan.org/modules/by-module/XML/XML-DOM-1.43.tar.gz. + You might need install extra Perl modules that are required by + XML::DOM. +(3) Setup an environment variable ROUGE_EVAL_HOME that points to the + "data" subdirectory. For example, if your "data" subdirectory + located at "/usr/local/ROUGE-1.5.4/data" then you can setup + the ROUGE_EVAL_HOME as follows: + (a) Using csh or tcsh: + $command_prompt>setenv ROUGE_EVAL_HOME /usr/local/ROUGE-1.5.4/data + (b) Using bash + $command_prompt>ROUGE_EVAL_HOME=/usr/local/ROUGE-1.5.4/data + $command_prompt>export ROUGE_EVAL_HOME +(4) Run ROUGE-1.5.4.pl without supplying any arguments will give + you a description of how to use the ROUGE script. +(5) Please look into the included ROUGE-test.xml, verify.xml. and + verify-spl.xml evaluation configuration files for preparing your + own evaluation setup. More detailed description will be provided + later. ROUGE-test.xml and verify.xml specify the input from + systems and references are in SEE (Summary Evaluation Environment) + format (http://www.isi.edu/~cyl/SEE); while verify-spl.xml specify + inputs are in sentence per line format. + +<> + +(1) Please look into the "docs" directory for more information about + ROUGE. +(2) ROUGE-Note-v1.4.2.pdf explains how ROUGE works. It was published in + Proceedings of the Workshop on Text Summarization Branches Out + (WAS 2004), Bacelona, Spain, 2004. +(3) NAACL2003.pdf presents the initial idea of applying n-gram + co-occurrence statistics in automatic evaluation of + summarization. It was publised in Proceedsings of 2003 Language + Technology Conference (HLT-NAACL 2003), Edmonton, Canada, 2003. +(4) NTCIR2004.pdf discusses the effect of sample size on the + reliability of automatic evaluation results using data in the past + Document Understanding Conference (DUC) as examples. It was + published in Proceedings of the 4th NTCIR Meeting, Tokyo, Japan, 2004. +(5) ACL2004.pdf shows how ROUGE can be applied on automatic evaluation + of machine translation. It was published in Proceedings of the 42nd + Annual Meeting of the Association for Computational Linguistics + (ACL 2004), Barcelona, Spain, 2004. +(6) COLING2004.pdf proposes a new meta-evaluation framework, ORANGE, for + automatic evaluation of automatic evaluation methods. We showed + that ROUGE-S and ROUGE-L were significantly better than BLEU, + NIST, WER, and PER automatic MT evalaution methods under the + ORANGE framework. It was published in Proceedings of the 20th + International Conference on Computational Linguistics (COLING 2004), + Geneva, Switzerland, 2004. +(7) For information about BE, please go to http://www.isi.edu/~cyl/BE. + +<> + + Thanks for using the ROUGE evaluation package. If you have any +questions or comments, please send them to cyl@isi.edu. I will do my +best to answer your questions. diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/RELEASE-NOTE.txt b/fastSum/resources/ROUGE/RELEASE-1.5.5/RELEASE-NOTE.txt new file mode 100644 index 0000000..39547b9 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/RELEASE-NOTE.txt @@ -0,0 +1,232 @@ +# Revision Note: 05/26/2005, Chin-Yew LIN +# 1.5.5 +# (1) Correct stemming on multi-token BE heads and modifiers. +# Previously, only single token heads and modifiers were assumed. +# (2) Correct the resampling routine which ignores the last evaluation +# item in the evaluation list. Therefore, the average scores reported +# by ROUGE is only based on the first N-1 evaluation items. +# Thanks Barry Schiffman at Columbia University to report this bug. +# This bug only affects ROUGE-1.5.X. For pre-1.5 ROUGE, it only affects +# the computation of confidence interval (CI) estimation, i.e. CI is only +# estimated by the first N-1 evaluation items, but it *does not* affect +# average scores. +# (3) Change read_text and read_text_LCS functions to read exact words or +# bytes required by users. Previous versions carry out whitespace +# compression and other string clear up actions before enforce the length +# limit. +# 1.5.4.1 +# (1) Minor description change about "-t 0" option. +# 1.5.4 +# (1) Add easy evalution mode for single reference evaluations with -z +# option. +# 1.5.3 +# (1) Add option to compute ROUGE score based on SIMPLE BE format. Given +# a set of peer and model summary file in BE format with appropriate +# options, ROUGE will compute matching scores based on BE lexical +# matches. +# There are 6 options: +# 1. H : Head only match. This is similar to unigram match but +# only BE Head is used in matching. BEs generated by +# Minipar-based breaker do not include head-only BEs, +# therefore, the score will always be zero. Use HM or HMR +# optiions instead. +# 2. HM : Head and modifier match. This is similar to bigram or +# skip bigram but it's head-modifier bigram match based on +# parse result. Only BE triples with non-NIL modifier are +# included in the matching. +# 3. HMR : Head, modifier, and relation match. This is similar to +# trigram match but it's head-modifier-relation trigram +# match based on parse result. Only BE triples with non-NIL +# relation are included in the matching. +# 4. HM1 : This is combination of H and HM. It is similar to unigram + +# bigram or skip bigram with unigram match but it's +# head-modifier bigram match based on parse result. +# In this case, the modifier field in a BE can be "NIL" +# 5. HMR1 : This is combination of HM and HMR. It is similar to +# trigram match but it's head-modifier-relation trigram +# match based on parse result. In this case, the relation +# field of the BE can be "NIL". +# 6. HMR2 : This is combination of H, HM and HMR. It is similar to +# trigram match but it's head-modifier-relation trigram +# match based on parse result. In this case, the modifier and +# relation fields of the BE can both be "NIL". +# 1.5.2 +# (1) Add option to compute ROUGE score by token using the whole corpus +# as average unit instead of individual sentences. Previous versions of +# ROUGE uses sentence (or unit) boundary to break counting unit and takes +# the average score from the counting unit as the final score. +# Using the whole corpus as one single counting unit can potentially +# improve the reliablity of the final score that treats each token as +# equally important; while the previous approach considers each sentence as +# equally important that ignores the length effect of each individual +# sentences (i.e. long sentences contribute equal weight to the final +# score as short sentences.) +# +v1.2 provide a choice of these two counting modes that users can +# choose the one that fits their scenarios. +# 1.5.1 +# (1) Add precision oriented measure and f-measure to deal with different lengths +# in candidates and references. Importance between recall and precision can +# be controled by 'alpha' parameter: +# alpha -> 0: recall is more important +# alpha -> 1: precision is more important +# Following Chapter 7 in C.J. van Rijsbergen's "Information Retrieval". +# http://www.dcs.gla.ac.uk/Keith/Chapter.7/Ch.7.html +# F = 1/(alpha * (1/P) + (1 - alpha) * (1/R)) ;;; weighted harmonic mean +# 1.4.2 +# (1) Enforce length limit at the time when summary text is read. Previously (before +# and including v1.4.1), length limit was enforced at tokenization time. +# 1.4.1 +# (1) Fix potential over counting in ROUGE-L and ROUGE-W +# In previous version (i.e. 1.4 and order), LCS hit is computed +# by summing union hit over all model sentences. Each model sentence +# is compared with all peer sentences and mark the union LCS. The +# length of the union LCS is the hit of that model sentence. The +# final hit is then sum over all model union LCS hits. This potentially +# would over count a peer sentence which already been marked as contributed +# to some other model sentence. Therefore, double counting is resulted. +# This is seen in evalution where ROUGE-L score is higher than ROUGE-1 and +# this is not correct. +# ROUGEeval-1.4.1.pl fixes this by add a clip function to prevent +# double counting. +# 1.4 +# (1) Remove internal Jackknifing procedure: +# Now the ROUGE script will use all the references listed in the +# section in each section and no +# automatic Jackknifing is performed. +# If Jackknifing procedure is required when comparing human and system +# performance, then users have to setup the procedure in the ROUGE +# evaluation configuration script as follows: +# For example, to evaluate system X with 4 references R1, R2, R3, and R4. +# We do the following computation: +# +# for system: and for comparable human: +# s1 = X vs. R1, R2, R3 h1 = R4 vs. R1, R2, R3 +# s2 = X vs. R1, R3, R4 h2 = R2 vs. R1, R3, R4 +# s3 = X vs. R1, R2, R4 h3 = R3 vs. R1, R2, R4 +# s4 = X vs. R2, R3, R4 h4 = R1 vs. R2, R3, R4 +# +# Average system score for X = (s1+s2+s3+s4)/4 and for human = (h1+h2+h3+h4)/4 +# Implementation of this in a ROUGE evaluation configuration script is as follows: +# Instead of writing all references in a evaluation section as below: +# +# ... +# +#

systemX +# +# +# R1 +# R2 +# R3 +# R4 +# +# +# we write the following: +# +# +#

systemX +# +# +# R2 +# R3 +# R4 +# +# +# +# +#

systemX +# +# +# R1 +# R3 +# R4 +# +# +# +# +#

systemX +# +# +# R1 +# R2 +# R4 +# +# +# +# +#

systemX +# +# +# R1 +# R2 +# R3 +# +# +# +# In this case, the system and human numbers are comparable. +# ROUGE as it is implemented for summarization evaluation is a recall-based metric. +# As we increase the number of references, we are increasing the number of +# count units (n-gram or skip-bigram or LCSes) in the target pool (i.e. +# the number ends up in the denominator of any ROUGE formula is larger). +# Therefore, a candidate summary has more chance to hit but it also has to +# hit more. In the end, this means lower absolute ROUGE scores when more +# references are used and using different sets of rerferences should not +# be compared to each other. There is no nomalization mechanism in ROUGE +# to properly adjust difference due to different number of references used. +# +# In the ROUGE implementations before v1.4 when there are N models provided for +# evaluating system X in the ROUGE evaluation script, ROUGE does the +# following: +# (1) s1 = X vs. R2, R3, R4, ..., RN +# (2) s2 = X vs. R1, R3, R4, ..., RN +# (3) s3 = X vs. R1, R2, R4, ..., RN +# (4) s4 = X vs. R1, R2, R3, ..., RN +# (5) ... +# (6) sN= X vs. R1, R2, R3, ..., RN-1 +# And the final ROUGE score is computed by taking average of (s1, s2, s3, +# s4, ..., sN). When we provide only three references for evaluation of a +# human summarizer, ROUGE does the same thing but using 2 out 3 +# references, get three numbers, and then take the average as the final +# score. Now ROUGE (after v1.4) will use all references without this +# internal Jackknifing procedure. The speed of the evaluation should improve +# a lot, since only one set instead of four sets of computation will be +# conducted. +# 1.3 +# (1) Add skip bigram +# (2) Add an option to specify the number of sampling point (default is 1000) +# 1.2.3 +# (1) Correct the enviroment variable option: -e. Now users can specify evironment +# variable ROUGE_EVAL_HOME using the "-e" option; previously this option is +# not active. Thanks Zhouyan Li of Concordia University, Canada pointing this +# out. +# 1.2.2 +# (1) Correct confidence interval calculation for median, maximum, and minimum. +# Line 390. +# 1.2.1 +# (1) Add sentence per line format input format. See files in Verify-SPL for examples. +# (2) Streamline command line arguments. +# (3) Use bootstrap resampling to estimate confidence intervals instead of using t-test +# or z-test which assume a normal distribution. +# (4) Add LCS (longest common subsequence) evaluation method. +# (5) Add WLCS (weighted longest common subsequence) evaluation method. +# (6) Add length cutoff in bytes. +# (7) Add an option to specify the longest ngram to compute. The default is 4. +# 1.2 +# (1) Change zero condition check in subroutine &computeNGramScores when +# computing $gram1Score from +# if($totalGram2Count!=0) to +# if($totalGram1Count!=0) +# Thanks Ken Litkowski for this bug report. +# This original script will set gram1Score to zero if there is no +# bigram matches. This should rarely has significant affect the final score +# since (a) there are bigram matches most of time; (b) the computation +# of gram1Score is using Jackknifing procedure. However, this definitely +# did not compute the correct $gram1Score when there is no bigram matches. +# Therefore, users of version 1.1 should definitely upgrade to newer +# version of the script that does not contain this bug. +# Note: To use this script, two additional data files are needed: +# (1) smart_common_words.txt - contains stopword list from SMART IR engine +# (2) WordNet-1.6.exc.db - WordNet 1.6 exception inflexion database +# These two files have to be put in a directory pointed by the environment +# variable: "ROUGE_EVAL_HOME". +# If environment variable ROUGE_EVAL_HOME does not exist, this script will +# will assume it can find these two database files in the current directory. diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/ROUGE-1.5.5.pl b/fastSum/resources/ROUGE/RELEASE-1.5.5/ROUGE-1.5.5.pl new file mode 100644 index 0000000..c37963c --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/ROUGE-1.5.5.pl @@ -0,0 +1,3294 @@ +#!/usr/bin/perl -w +# Version: ROUGE v1.5.5 +# Date: 05/26/2005,05/19/2005,04/26/2005,04/03/2005,10/28/2004,10/25/2004,10/21/2004 +# Author: Chin-Yew Lin +# Description: Given an evaluation description file, for example: test.xml, +# this script computes the averages of the average ROUGE scores for +# the evaluation pairs listed in the ROUGE evaluation configuration file. +# For more information, please see: +# http://www.isi.edu/~cyl/ROUGE +# For more information about Basic Elements, please see: +# http://www.isi.edu/~cyl/BE +# Revision Note: +# 1.5.5 +# (1) Correct stemming on multi-token BE heads and modifiers. +# Previously, only single token heads and modifiers were assumed. +# (2) Correct the resampling routine which ignores the last evaluation +# item in the evaluation list. Therefore, the average scores reported +# by ROUGE is only based on the first N-1 evaluation items. +# Thanks Barry Schiffman at Columbia University to report this bug. +# This bug only affects ROUGE-1.5.X. For pre-1.5 ROUGE, it only affects +# the computation of confidence interval (CI) estimation, i.e. CI is only +# estimated by the first N-1 evaluation items, but it *does not* affect +# average scores. +# (3) Change read_text and read_text_LCS functions to read exact words or +# bytes required by users. Previous versions carry out whitespace +# compression and other string clear up actions before enforce the length +# limit. +# 1.5.4.1 +# (1) Minor description change about "-t 0" option. +# 1.5.4 +# (1) Add easy evalution mode for single reference evaluations with -z +# option. +# 1.5.3 +# (1) Add option to compute ROUGE score based on SIMPLE BE format. Given +# a set of peer and model summary file in BE format with appropriate +# options, ROUGE will compute matching scores based on BE lexical +# matches. +# There are 6 options: +# 1. H : Head only match. This is similar to unigram match but +# only BE Head is used in matching. BEs generated by +# Minipar-based breaker do not include head-only BEs, +# therefore, the score will always be zero. Use HM or HMR +# optiions instead. +# 2. HM : Head and modifier match. This is similar to bigram or +# skip bigram but it's head-modifier bigram match based on +# parse result. Only BE triples with non-NIL modifier are +# included in the matching. +# 3. HMR : Head, modifier, and relation match. This is similar to +# trigram match but it's head-modifier-relation trigram +# match based on parse result. Only BE triples with non-NIL +# relation are included in the matching. +# 4. HM1 : This is combination of H and HM. It is similar to unigram + +# bigram or skip bigram with unigram match but it's +# head-modifier bigram match based on parse result. +# In this case, the modifier field in a BE can be "NIL" +# 5. HMR1 : This is combination of HM and HMR. It is similar to +# trigram match but it's head-modifier-relation trigram +# match based on parse result. In this case, the relation +# field of the BE can be "NIL". +# 6. HMR2 : This is combination of H, HM and HMR. It is similar to +# trigram match but it's head-modifier-relation trigram +# match based on parse result. In this case, the modifier and +# relation fields of the BE can both be "NIL". +# 1.5.2 +# (1) Add option to compute ROUGE score by token using the whole corpus +# as average unit instead of individual sentences. Previous versions of +# ROUGE uses sentence (or unit) boundary to break counting unit and takes +# the average score from the counting unit as the final score. +# Using the whole corpus as one single counting unit can potentially +# improve the reliablity of the final score that treats each token as +# equally important; while the previous approach considers each sentence as +# equally important that ignores the length effect of each individual +# sentences (i.e. long sentences contribute equal weight to the final +# score as short sentences.) +# +v1.2 provide a choice of these two counting modes that users can +# choose the one that fits their scenarios. +# 1.5.1 +# (1) Add precision oriented measure and f-measure to deal with different lengths +# in candidates and references. Importance between recall and precision can +# be controled by 'alpha' parameter: +# alpha -> 0: recall is more important +# alpha -> 1: precision is more important +# Following Chapter 7 in C.J. van Rijsbergen's "Information Retrieval". +# http://www.dcs.gla.ac.uk/Keith/Chapter.7/Ch.7.html +# F = 1/(alpha * (1/P) + (1 - alpha) * (1/R)) ;;; weighted harmonic mean +# 1.4.2 +# (1) Enforce length limit at the time when summary text is read. Previously (before +# and including v1.4.1), length limit was enforced at tokenization time. +# 1.4.1 +# (1) Fix potential over counting in ROUGE-L and ROUGE-W +# In previous version (i.e. 1.4 and order), LCS hit is computed +# by summing union hit over all model sentences. Each model sentence +# is compared with all peer sentences and mark the union LCS. The +# length of the union LCS is the hit of that model sentence. The +# final hit is then sum over all model union LCS hits. This potentially +# would over count a peer sentence which already been marked as contributed +# to some other model sentence. Therefore, double counting is resulted. +# This is seen in evalution where ROUGE-L score is higher than ROUGE-1 and +# this is not correct. +# ROUGEeval-1.4.1.pl fixes this by add a clip function to prevent +# double counting. +# 1.4 +# (1) Remove internal Jackknifing procedure: +# Now the ROUGE script will use all the references listed in the +# section in each section and no +# automatic Jackknifing is performed. Please see RELEASE-NOTE.txt +# for more details. +# 1.3 +# (1) Add skip bigram +# (2) Add an option to specify the number of sampling point (default is 1000) +# 1.2.3 +# (1) Correct the enviroment variable option: -e. Now users can specify evironment +# variable ROUGE_EVAL_HOME using the "-e" option; previously this option is +# not active. Thanks Zhouyan Li of Concordia University, Canada pointing this +# out. +# 1.2.2 +# (1) Correct confidence interval calculation for median, maximum, and minimum. +# Line 390. +# 1.2.1 +# (1) Add sentence per line format input format. See files in Verify-SPL for examples. +# (2) Streamline command line arguments. +# (3) Use bootstrap resampling to estimate confidence intervals instead of using t-test +# or z-test which assume a normal distribution. +# (4) Add LCS (longest common subsequence) evaluation method. +# (5) Add WLCS (weighted longest common subsequence) evaluation method. +# (6) Add length cutoff in bytes. +# (7) Add an option to specify the longest ngram to compute. The default is 4. +# 1.2 +# (1) Change zero condition check in subroutine &computeNGramScores when +# computing $gram1Score from +# if($totalGram2Count!=0) to +# if($totalGram1Count!=0) +# Thanks Ken Litkowski for this bug report. +# This original script will set gram1Score to zero if there is no +# bigram matches. This should rarely has significant affect the final score +# since (a) there are bigram matches most of time; (b) the computation +# of gram1Score is using Jackknifing procedure. However, this definitely +# did not compute the correct $gram1Score when there is no bigram matches. +# Therefore, users of version 1.1 should definitely upgrade to newer +# version of the script that does not contain this bug. +# Note: To use this script, two additional data files are needed: +# (1) smart_common_words.txt - contains stopword list from SMART IR engine +# (2) WordNet-2.0.exc.db - WordNet 2.0 exception inflexion database +# These two files have to be put in a directory pointed by the environment +# variable: "ROUGE_EVAL_HOME". +# If environment variable ROUGE_EVAL_HOME does not exist, this script will +# will assume it can find these two database files in the current directory. +# COPYRIGHT (C) UNIVERSITY OF SOUTHERN CALIFORNIA, 2002,2003,2004 +# University of Southern California +# Information Sciences Institute +# 4676 Admiralty Way +# Marina Del Rey, California 90292-6695 +# +# This software was partially developed under SPAWAR Grant No. +# N66001-00-1-8916 , and the Government holds license rights under +# DAR 7-104.9(a)(c)(1). It is +# transmitted outside of the University of Southern California only under +# written license agreements or software exchange agreements, and its use +# is limited by these agreements. At no time shall any recipient use +# this software in any manner which conflicts or interferes with the +# governmental license rights or other provisions of the governing +# agreement under which it is obtained. It is supplied "AS IS," without +# any warranties of any kind. It is furnished only on the basis that any +# party who receives it indemnifies and holds harmless the parties who +# furnish and originate it against any claims, demands or liabilities +# connected with using it, furnishing it to others or providing it to a +# third party. THIS NOTICE MUST NOT BE REMOVED FROM THE SOFTWARE, +# AND IN THE EVENT THAT THE SOFTWARE IS DIVIDED, IT SHOULD BE +# ATTACHED TO EVERY PART. +# +# Contributor to its design is Chin-Yew Lin. + +use XML::DOM; +use DB_File; +use Getopt::Std; +#------------------------------------------------------------------------------------- +use vars qw($opt_a $opt_b $opt_c $opt_d $opt_e $opt_f $opt_h $opt_H $opt_m $opt_n $opt_p $opt_s $opt_t $opt_l $opt_v $opt_w $opt_2 $opt_u $opt_x $opt_U $opt_3 $opt_M $opt_z); +my $usageFull="$0\n [-a (evaluate all systems)] + [-c cf] + [-d (print per evaluation scores)] + [-e ROUGE_EVAL_HOME] + [-h (usage)] + [-H (detailed usage)] + [-b n-bytes|-l n-words] + [-m (use Porter stemmer)] + [-n max-ngram] + [-s (remove stopwords)] + [-r number-of-samples (for resampling)] + [-2 max-gap-length (if < 0 then no gap length limit)] + [-3 (for scoring based on BE)] + [-u (include unigram in skip-bigram) default no)] + [-U (same as -u but also compute regular skip-bigram)] + [-w weight (weighting factor for WLCS)] + [-v (verbose)] + [-x (do not calculate ROUGE-L)] + [-f A|B (scoring formula)] + [-p alpha (0 <= alpha <=1)] + [-t 0|1|2 (count by token instead of sentence)] + [-z ] + []\n +". + "ROUGE-eval-config-file: Specify the evaluation setup. Three files come with the ROUGE evaluation package, i.e.\n". + " ROUGE-test.xml, verify.xml, and verify-spl.xml are good examples.\n". + "systemID: Specify which system in the ROUGE-eval-config-file to perform the evaluation.\n". + " If '-a' option is used, then all systems are evaluated and users do not need to\n". + " provide this argument.\n". + "Default:\n". + " When running ROUGE without supplying any options (except -a), the following defaults are used:\n". + " (1) ROUGE-L is computed;\n". + " (2) 95% confidence interval;\n". + " (3) No stemming;\n". + " (4) Stopwords are inlcuded in the calculations;\n". + " (5) ROUGE looks for its data directory first through the ROUGE_EVAL_HOME environment variable. If\n". + " it is not set, the current directory is used.\n". + " (6) Use model average scoring formula.\n". + " (7) Assign equal importance of ROUGE recall and precision in computing ROUGE f-measure, i.e. alpha=0.5.\n". + " (8) Compute average ROUGE by averaging sentence (unit) ROUGE scores.\n". + "Options:\n". + " -2: Compute skip bigram (ROGUE-S) co-occurrence, also specify the maximum gap length between two words (skip-bigram)\n". + " -u: Compute skip bigram as -2 but include unigram, i.e. treat unigram as \"start-sentence-symbol unigram\"; -2 has to be specified.\n". + " -3: Compute BE score. Currently only SIMPLE BE triple format is supported.\n". + " H -> head only scoring (does not applied to Minipar-based BEs).\n". + " HM -> head and modifier pair scoring.\n". + " HMR -> head, modifier and relation triple scoring.\n". + " HM1 -> H and HM scoring (same as HM for Minipar-based BEs).\n". + " HMR1 -> HM and HMR scoring (same as HMR for Minipar-based BEs).\n". + " HMR2 -> H, HM and HMR scoring (same as HMR for Minipar-based BEs).\n". + " -a: Evaluate all systems specified in the ROUGE-eval-config-file.\n". + " -c: Specify CF\% (0 <= CF <= 100) confidence interval to compute. The default is 95\% (i.e. CF=95).\n". + " -d: Print per evaluation average score for each system.\n". + " -e: Specify ROUGE_EVAL_HOME directory where the ROUGE data files can be found.\n". + " This will overwrite the ROUGE_EVAL_HOME specified in the environment variable.\n". + " -f: Select scoring formula: 'A' => model average; 'B' => best model\n". + " -h: Print usage information.\n". + " -H: Print detailed usage information.\n". + " -b: Only use the first n bytes in the system/peer summary for the evaluation.\n". + " -l: Only use the first n words in the system/peer summary for the evaluation.\n". + " -m: Stem both model and system summaries using Porter stemmer before computing various statistics.\n". + " -n: Compute ROUGE-N up to max-ngram length will be computed.\n". + " -p: Relative importance of recall and precision ROUGE scores. Alpha -> 1 favors precision, Alpha -> 0 favors recall.\n". + " -s: Remove stopwords in model and system summaries before computing various statistics.\n". + " -t: Compute average ROUGE by averaging over the whole test corpus instead of sentences (units).\n". + " 0: use sentence as counting unit, 1: use token as couting unit, 2: same as 1 but output raw counts\n". + " instead of precision, recall, and f-measure scores. 2 is useful when computation of the final,\n". + " precision, recall, and f-measure scores will be conducted later.\n". + " -r: Specify the number of sampling point in bootstrap resampling (default is 1000).\n". + " Smaller number will speed up the evaluation but less reliable confidence interval.\n". + " -w: Compute ROUGE-W that gives consecutive matches of length L in an LCS a weight of 'L^weight' instead of just 'L' as in LCS.\n". + " Typically this is set to 1.2 or other number greater than 1.\n". + " -v: Print debugging information for diagnositic purpose.\n". + " -x: Do not calculate ROUGE-L.\n". + " -z: ROUGE-eval-config-file is a list of peer-model pair per line in the specified format (SEE|SPL|ISI|SIMPLE).\n"; + +my $usage="$0\n [-a (evaluate all systems)] + [-c cf] + [-d (print per evaluation scores)] + [-e ROUGE_EVAL_HOME] + [-h (usage)] + [-H (detailed usage)] + [-b n-bytes|-l n-words] + [-m (use Porter stemmer)] + [-n max-ngram] + [-s (remove stopwords)] + [-r number-of-samples (for resampling)] + [-2 max-gap-length (if < 0 then no gap length limit)] + [-3 (for scoring based on BE)] + [-u (include unigram in skip-bigram) default no)] + [-U (same as -u but also compute regular skip-bigram)] + [-w weight (weighting factor for WLCS)] + [-v (verbose)] + [-x (do not calculate ROUGE-L)] + [-f A|B (scoring formula)] + [-p alpha (0 <= alpha <=1)] + [-t 0|1|2 (count by token instead of sentence)] + [-z ] + [] +"; +getopts('ahHb:c:de:f:l:mMn:p:st:r:2:3:w:uUvxz:'); +my $systemID; + +die $usageFull if defined($opt_H); +die $usage if defined($opt_h)||@ARGV==0; +die "Please specify the ROUGE configuration file or use option '-h' for help\n" if(@ARGV==0); +if(@ARGV==1&&defined($opt_z)) { + $systemID="X"; # default system ID +} +elsif(@ARGV==1&&!defined($opt_a)) { + die "Please specify a system ID to evaluate or use option '-a' to evaluate all systems. For more information, use option '-h'.\n"; +} +elsif(@ARGV==2) { + $systemID=$ARGV[1]; +} +if(defined($opt_e)) { + $stopwords="$opt_e/smart_common_words.txt"; + $wordnetDB="$opt_e/WordNet-2.0.exc.db"; +} +else { + if(exists($ENV{"ROUGE_EVAL_HOME"})) { + $stopwords="$ENV{\"ROUGE_EVAL_HOME\"}/smart_common_words.txt"; + $wordnetDB="$ENV{\"ROUGE_EVAL_HOME\"}/WordNet-2.0.exc.db"; + } + elsif(exists($ENV{"RED_EVAL_HOME"})) { + $stopwords="$ENV{\"RED_EVAL_HOME\"}/smart_common_words.txt"; + $wordnetDB="$ENV{\"RED_EVAL_HOME\"}/WordNet-2.0.exc.db"; + } + else { + # if no environment variable exists then assume data files are in the current directory + $stopwords="smart_common_words.txt"; + $wordnetDB="WordNet-2.0.exc.db"; + } +} + +if(defined($opt_s)) { + $useStopwords=0; # do not use stop words +} +else { + $useStopwords=1; # use stop words +} + +if(defined($opt_l)&&defined($opt_b)) { + die "Please specify length limit in words or bytes but not both.\n"; +} + +if(defined($opt_l)) { + $lengthLimit=$opt_l; + $byteLimit=0; # no byte limit +} +elsif(defined($opt_b)) { + $lengthLimit=0; # no length limit in words + $byteLimit=$opt_b; +} +else { + $byteLimit=0; # no byte limit + $lengthLimit=0; # no length limit +} + +unless(defined($opt_c)) { + $opt_c=95; +} +else { + if($opt_c<0||$opt_c>100) { + die "Confidence interval should be within 0 and 100. Use option -h for more details.\n"; + } +} + +if(defined($opt_w)) { + if($opt_w>0) { + $weightFactor=$opt_w; + } + else { + die "ROUGE-W weight factor must greater than 0.\n"; + } +} +#unless(defined($opt_n)) { +# $opt_n=4; # default maximum ngram is 4 +#} +if(defined($opt_v)) { + $debug=1; +} +else { + $debug=0; +} + +if(defined($opt_r)) { + $numOfResamples=$opt_r; +} +else { + $numOfResamples=1000; +} + +if(defined($opt_2)) { + $skipDistance=$opt_2; +} + +if(defined($opt_3)) { + $BEMode=$opt_3; +} + +if(defined($opt_f)) { + $scoreMode=$opt_f; +} +else { + $scoreMode="A"; # default: use model average scoring formula +} + +if(defined($opt_p)) { + $alpha=$opt_p; + if($alpha<0|| + $alpha>1) { + die "Relative importance of ROUGE recall and precision has to be between 0 and 1 inclusively.\n"; + } +} +else { + $alpha=0.5; # default is equal importance of ROUGE recall and precision +} + +if(defined($opt_t)) { + # make $opt_t as undef when appropriate option is given + # when $opt_t is undef, sentence level average will be used + if($opt_t==0) { + $opt_t=undef; + } + elsif($opt_t!=1&& + $opt_t!=2) { + $opt_t=undef; # other than 1 or 2, let $opt_t to be undef + } +} + +if(defined($opt_z)) { + # If opt_z is specified, the user has to specify a system ID that + # is used for identification therefore -a option is not allowed. + # Here we make it undef. + $opt_a=undef; +} +#------------------------------------------------------------------------------------- +# Setup ROUGE scoring parameters +%ROUGEParam=(); # ROUGE scoring parameter +if(defined($lengthLimit)) { + $ROUGEParam{"LENGTH"}=$lengthLimit; +} +else { + $ROUGEParam{"LENGTH"}=undef; +} +if(defined($byteLimit)) { + $ROUGEParam{"BYTE"}=$byteLimit; +} +else { + $ROUGEParam{"BYTE"}=undef; +} +if(defined($opt_n)) { # ngram size + $ROUGEParam{"NSIZE"}=$opt_n; +} +else { + $ROUGEParam{"NSIZE"}=undef; +} +if(defined($weightFactor)) { + $ROUGEParam{"WEIGHT"}=$weightFactor; +} +else { + $ROUGEParam{"WEIGHT"}=undef; +} +if(defined($skipDistance)) { + $ROUGEParam{"SD"}=$skipDistance; +} +else { + $ROUGEParam{"SD"}=undef; +} +if(defined($scoreMode)) { + $ROUGEParam{"SM"}=$scoreMode; +} +else { + $ROUGEParam{"SM"}=undef; +} +if(defined($alpha)) { + $ROUGEParam{"ALPHA"}=$alpha; +} +else { + $ROUGEParam{"ALPHA"}=undef; +} +if(defined($opt_t)) { + $ROUGEParam{"AVERAGE"}=$opt_t; +} +else { + $ROUGEParam{"AVERAGE"}=undef; +} +if(defined($opt_3)) { + $ROUGEParam{"BEMODE"}=$opt_3; +} +else { + $ROUGEParam{"BEMODE"}=undef; +} +#------------------------------------------------------------------------------------- +# load stopwords +%stopwords=(); +open(STOP,$stopwords)||die "Cannot open $stopwords\n"; +while(defined($line=)) { + chomp($line); + $stopwords{$line}=1; +} +close(STOP); +# load WordNet database +if(-e "$wordnetDB") { + tie %exceptiondb,'DB_File',"$wordnetDB",O_RDONLY,0440,$DB_HASH or + die "Cannot open exception db file for reading: $wordnetDB\n"; +} +else { + die "Cannot open exception db file for reading: $wordnetDB\n"; +} +#------------------------------------------------------------------------------------- +# Initialize Porter Stemmer +&initialise(); +#------------------------------------------------------------------------------------- +# Read and parse the document +my $parser = new XML::DOM::Parser; +my $doc; +unless(defined($opt_z)) { + $doc=$parser->parsefile($ARGV[0]); +} +else { + open($doc,$ARGV[0])||die "Cannot open $ARGV[0]\n"; +} +%ROUGEEvals=(); +@ROUGEEvalIDs=(); +%ROUGEPeerIDTable=(); +@allPeerIDs=(); +%knownMissing=(); # remember missing submission already known +if(defined($doc)) { + # read evaluation description file + &readEvals(\%ROUGEEvals,\@ROUGEEvalIDs,\%ROUGEPeerIDTable,$doc,undef); + # print evaluation configuration + if(defined($opt_z)) { + if(defined($ARGV[1])) { + $systemID=$ARGV[1]; + } + else { + $systemID="X"; # default system ID in BE file list evaluation mode + } + push(@allPeerIDs,$systemID); + } + else { + unless(defined($opt_a)) { + $systemID=$ARGV[1]; + push(@allPeerIDs,$systemID); + } + else { + # run evaluation for each peer listed in the description file + @allPeerIDs=sort (keys %ROUGEPeerIDTable); + } + } + foreach $peerID (@allPeerIDs) { + %testIDs=(); + # print "\@PEER($peerID)--------------------------------------------------\n"; + if(defined($opt_n)) { + # evaluate a specific peer + # compute ROUGE score up to $opt_n-gram + for($n=1;$n<=$opt_n;$n++) { + my (%ROUGEScores,%ROUGEAverages); + + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + if($debug) { + print "\@Eval ($e)\n"; + } + $ROUGEParam{"NSIZE"}=$n; + &computeROUGEX("N",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-$n",$opt_c,$opt_t,$opt_d); + } + } + unless(defined($opt_x)||defined($opt_3)) { + #----------------------------------------------- + # compute LCS score + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + &computeROUGEX("L",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-L",$opt_c,$opt_t,$opt_d); + } + if(defined($opt_w)) { + #----------------------------------------------- + # compute WLCS score + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + &computeROUGEX("W",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-W-$weightFactor",$opt_c,$opt_t,$opt_d); + } + if(defined($opt_2)) { + #----------------------------------------------- + # compute skip bigram score + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + &computeROUGEX("S",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + if($skipDistance>=0) { + if(defined($opt_u)) { + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-SU$skipDistance",$opt_c,$opt_t,$opt_d); + } + elsif(defined($opt_U)) { + # print regular skip bigram results + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-S$skipDistance",$opt_c,$opt_t,$opt_d); + #----------------------------------------------- + # compute skip bigram with unigram extension score + $opt_u=1; + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + &computeROUGEX("S",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + $opt_u=undef; + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-SU$skipDistance",$opt_c,$opt_t,$opt_d); + } + else { + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-S$skipDistance",$opt_c,$opt_t,$opt_d); + } + } + else { + if(defined($opt_u)) { + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-SU*",$opt_c,$opt_t,$opt_d); + } + else { + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-S*",$opt_c,$opt_t,$opt_d); + if(defined($opt_U)) { + #----------------------------------------------- + # compute skip bigram with unigram extension score + $opt_u=1; + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + &computeROUGEX("S",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + $opt_u=undef; + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-SU*",$opt_c,$opt_t,$opt_d); + } + } + } + } + if(defined($opt_3)) { + #----------------------------------------------- + # compute Basic Element triple score + %ROUGEScores=(); + foreach $e (@ROUGEEvalIDs) { + &computeROUGEX("BE",\%ROUGEScores,$e,$ROUGEEvals{$e},$peerID,\%ROUGEParam); + } + # compute averages + %ROUGEAverages=(); + &computeAverages(\%ROUGEScores,\%ROUGEAverages,$opt_t); + &printResults($peerID,\%ROUGEAverages,\%ROUGEScores,"ROUGE-BE-$BEMode",$opt_c,$opt_t,$opt_d); + } + } +} +else { + die "Document undefined\n"; +} +if(defined($opt_z)) { + close($doc); +} +untie %exceptiondb; + +sub printResults { + my $peerID=shift; + my $ROUGEAverages=shift; + my $ROUGEScores=shift; + my $methodTag=shift; + my $opt_c=shift; + my $opt_t=shift; + my $opt_d=shift; + + print "---------------------------------------------\n"; + if(!defined($opt_t)||$opt_t==1) { + print "$peerID $methodTag Average_R: $ROUGEAverages->{'AvgR'} "; + print "($opt_c\%-conf.int. $ROUGEAverages->{'CIAvgL_R'} - $ROUGEAverages->{'CIAvgU_R'})\n"; + print "$peerID $methodTag Average_P: $ROUGEAverages->{'AvgP'} "; + print "($opt_c\%-conf.int. $ROUGEAverages->{'CIAvgL_P'} - $ROUGEAverages->{'CIAvgU_P'})\n"; + print "$peerID $methodTag Average_F: $ROUGEAverages->{'AvgF'} "; + print "($opt_c\%-conf.int. $ROUGEAverages->{'CIAvgL_F'} - $ROUGEAverages->{'CIAvgU_F'})\n"; + } + else { + print "$peerID $methodTag M_count: "; + print int($ROUGEAverages->{'M_cnt'}); + print " P_count: "; + print int($ROUGEAverages->{'P_cnt'}); + print " H_count: "; + print int($ROUGEAverages->{'H_cnt'}); + print "\n"; + } + if(defined($opt_d)) { + print ".............................................\n"; + &printPerEvalData($ROUGEScores,"$peerID $methodTag Eval"); + } +} + +sub bootstrapResampling { + my $scores=shift; + my $instances=shift; + my $seed=shift; + my $opt_t=shift; + my $sample; + my ($i,$ridx); + + # Use $seed to seed the random number generator to make sure + # we have the same random sequence every time, therefore a + # consistent estimation of confidence interval in different runs. + # This is not necessary. To ensure a consistent result in reporting + # results using ROUGE, this is implemented. + srand($seed); + for($i=0;$i<@{$instances};$i++) { + # generate a random index + $ridx=int(rand(@{$instances})); + unless(defined($sample)) { + # setup the resampling array + $sample=[]; + push(@$sample,$scores->{$instances->[$ridx]}[0]); + push(@$sample,$scores->{$instances->[$ridx]}[1]); + push(@$sample,$scores->{$instances->[$ridx]}[2]); + } + else { + # update the resampling array + $sample->[0]+=$scores->{$instances->[$ridx]}[0]; + $sample->[1]+=$scores->{$instances->[$ridx]}[1]; + $sample->[2]+=$scores->{$instances->[$ridx]}[2]; + } + } + # compute the average result for this resampling procedure + unless(defined($opt_t)) { + # per instance or sentence average + if(@{$instances}>0) { + $sample->[0]/=@{$instances}; + $sample->[1]/=@{$instances}; + $sample->[2]/=@{$instances}; + } + else { + $sample->[0]=0; + $sample->[1]=0; + $sample->[2]=0; + } + } + else { + if($opt_t==1) { + # per token or corpus level average + # output recall, precision, and f-measure score + my ($tmpR,$tmpP,$tmpF); + if($sample->[0]>0) { + $tmpR=$sample->[2]/$sample->[0]; # recall + } + else { + $tmpR=0; + } + if($sample->[1]>0) { + $tmpP=$sample->[2]/$sample->[1]; # precision + } + else { + $tmpP=0; + } + if((1-$alpha)*$tmpP+$alpha*$tmpR>0) { + $tmpF=($tmpR*$tmpP)/((1-$alpha)*$tmpP+$alpha*$tmpR); # f-measure + } + else { + $tmpF=0; + } + $sample->[0]=$tmpR; + $sample->[1]=$tmpP; + $sample->[2]=$tmpF; + } + else { + # $opt_t!=1 => output raw model token count, peer token count, and hit count + # do nothing, just return $sample + } + } + return $sample; +} + +sub by_value { + $a<=>$b; +} + +sub printPerEvalData { + my $ROUGEScores=shift; + my $tag=shift; # tag to identify each evaluation + my (@instances,$i,$j); + + @instances=sort by_evalID (keys %$ROUGEScores); + foreach $i (@instances) { + # print average per evaluation score + print "$tag $i R:$ROUGEScores->{$i}[0] P:$ROUGEScores->{$i}[1] F:$ROUGEScores->{$i}[2]\n"; + } +} + +sub by_evalID { + my ($a1,$b1); + + if($a=~/^([0-9]+)/o) { + $a1=$1; + } + if($b=~/^([0-9]+)/o) { + $b1=$1; + } + if(defined($a1)&&defined($b1)) { + return $a1<=>$b1; + } + else { + return $a cmp $b; + } +} + +sub computeAverages { + my $ROUGEScores=shift; + my $ROUGEAverages=shift; + my $opt_t=shift; + my ($avgAvgROUGE_R,$resampleAvgROUGE_R); + my ($avgAvgROUGE_P,$resampleAvgROUGE_P); + my ($avgAvgROUGE_F,$resampleAvgROUGE_F); + my ($ciU,$ciL); + my (@instances,$i,$j,@rankedArray_R,@rankedArray_P,@RankedArray_F); + + @instances=sort (keys %$ROUGEScores); + $avgAvgROUGE_R=0; + $avgAvgROUGE_P=0; + $avgAvgROUGE_F=0; + $resampleAvgROUGE_R=0; + $resampleAvgROUGE_P=0; + $resampleAvgROUGE_F=0; + # compute totals + foreach $i (@instances) { + $avgAvgROUGE_R+=$ROUGEScores->{$i}[0]; # recall ; or model token count + $avgAvgROUGE_P+=$ROUGEScores->{$i}[1]; # precision ; or peer token count + $avgAvgROUGE_F+=$ROUGEScores->{$i}[2]; # f1-measure ; or match token count (hit) + } + # compute averages + unless(defined($opt_t)) { + # per sentence average + if((scalar @instances)>0) { + $avgAvgROUGE_R=sprintf("%7.5f",$avgAvgROUGE_R/(scalar @instances)); + $avgAvgROUGE_P=sprintf("%7.5f",$avgAvgROUGE_P/(scalar @instances)); + $avgAvgROUGE_F=sprintf("%7.5f",$avgAvgROUGE_F/(scalar @instances)); + } + else { + $avgAvgROUGE_R=sprintf("%7.5f",0); + $avgAvgROUGE_P=sprintf("%7.5f",0); + $avgAvgROUGE_F=sprintf("%7.5f",0); + } + } + else { + if($opt_t==1) { + # per token average on corpus level + my ($tmpR,$tmpP,$tmpF); + if($avgAvgROUGE_R>0) { + $tmpR=$avgAvgROUGE_F/$avgAvgROUGE_R; + } + else { + $tmpR=0; + } + if($avgAvgROUGE_P>0) { + $tmpP=$avgAvgROUGE_F/$avgAvgROUGE_P; + } + else { + $tmpP=0; + } + if((1-$alpha)*$tmpP+$alpha*$tmpR>0) { + $tmpF=($tmpR+$tmpP)/((1-$alpha)*$tmpP+$alpha*$tmpR); + } + else { + $tmpF=0; + } + $avgAvgROUGE_R=sprintf("%7.5f",$tmpR); + $avgAvgROUGE_P=sprintf("%7.5f",$tmpP); + $avgAvgROUGE_F=sprintf("%7.5f",$tmpF); + } + } + if(!defined($opt_t)||$opt_t==1) { + # compute confidence intervals using bootstrap resampling + @ResamplingArray=(); + for($i=0;$i<$numOfResamples;$i++) { + my $sample; + + $sample=&bootstrapResampling($ROUGEScores,\@instances,$i,$opt_t); + # sample contains average sum of the sample + if(@ResamplingArray==0) { + # setup the resampling array for Avg + my $s; + + $s=[]; + push(@$s,$sample->[0]); + push(@ResamplingArray,$s); + $s=[]; + push(@$s,$sample->[1]); + push(@ResamplingArray,$s); + $s=[]; + push(@$s,$sample->[2]); + push(@ResamplingArray,$s); + } + else { + $rsa=$ResamplingArray[0]; + push(@{$rsa},$sample->[0]); + $rsa=$ResamplingArray[1]; + push(@{$rsa},$sample->[1]); + $rsa=$ResamplingArray[2]; + push(@{$rsa},$sample->[2]); + } + } + # sort resampling results + { + # recall + @rankedArray_R=sort by_value (@{$ResamplingArray[0]}); + $ResamplingArray[0]=\@rankedArray_R; + for($x=0;$x<=$#rankedArray_R;$x++) { + $resampleAvgROUGE_R+=$rankedArray_R[$x]; + # print "*R ($x): $rankedArray_R[$x]\n"; + } + $resampleAvgROUGE_R=sprintf("%7.5f",$resampleAvgROUGE_R/(scalar @rankedArray_R)); + # precision + @rankedArray_P=sort by_value (@{$ResamplingArray[1]}); + $ResamplingArray[1]=\@rankedArray_P; + for($x=0;$x<=$#rankedArray_P;$x++) { + $resampleAvgROUGE_P+=$rankedArray_P[$x]; + # print "*P ($x): $rankedArray_P[$x]\n"; + } + $resampleAvgROUGE_P=sprintf("%7.5f",$resampleAvgROUGE_P/(scalar @rankedArray_P)); + # f1-measure + @rankedArray_F=sort by_value (@{$ResamplingArray[2]}); + $ResamplingArray[2]=\@rankedArray_F; + for($x=0;$x<=$#rankedArray_F;$x++) { + $resampleAvgROUGE_F+=$rankedArray_F[$x]; + # print "*F ($x): $rankedArray_F[$x]\n"; + } + $resampleAvgROUGE_F=sprintf("%7.5f",$resampleAvgROUGE_F/(scalar @rankedArray_F)); + } + # $ciU=999-int((100-$opt_c)*10/2); # upper bound index + # $ciL=int((100-$opt_c)*10/2); # lower bound index + $delta=$numOfResamples*((100-$opt_c)/2.0)/100.0; + $ciUa=int($numOfResamples-$delta-1); # upper confidence interval lower index + $ciUb=$ciUa+1; # upper confidence interval upper index + $ciLa=int($delta); # lower confidence interval lower index + $ciLb=$ciLa+1; # lower confidence interval upper index + $ciR=$numOfResamples-$delta-1-$ciUa; # ratio bewteen lower and upper indexes + # $ROUGEAverages->{"AvgR"}=$avgAvgROUGE_R; + #------- + # recall + $ROUGEAverages->{"AvgR"}=$resampleAvgROUGE_R; + # find condifence intervals; take maximum distance from the mean + $ROUGEAverages->{"CIAvgL_R"}=sprintf("%7.5f",$ResamplingArray[0][$ciLa]+ + ($ResamplingArray[0][$ciLb]-$ResamplingArray[0][$ciLa])*$ciR); + $ROUGEAverages->{"CIAvgU_R"}=sprintf("%7.5f",$ResamplingArray[0][$ciUa]+ + ($ResamplingArray[0][$ciUb]-$ResamplingArray[0][$ciUa])*$ciR); + #------- + # precision + $ROUGEAverages->{"AvgP"}=$resampleAvgROUGE_P; + # find condifence intervals; take maximum distance from the mean + $ROUGEAverages->{"CIAvgL_P"}=sprintf("%7.5f",$ResamplingArray[1][$ciLa]+ + ($ResamplingArray[1][$ciLb]-$ResamplingArray[1][$ciLa])*$ciR); + $ROUGEAverages->{"CIAvgU_P"}=sprintf("%7.5f",$ResamplingArray[1][$ciUa]+ + ($ResamplingArray[1][$ciUb]-$ResamplingArray[1][$ciUa])*$ciR); + #------- + # f1-measure + $ROUGEAverages->{"AvgF"}=$resampleAvgROUGE_F; + # find condifence intervals; take maximum distance from the mean + $ROUGEAverages->{"CIAvgL_F"}=sprintf("%7.5f",$ResamplingArray[2][$ciLa]+ + ($ResamplingArray[2][$ciLb]-$ResamplingArray[2][$ciLa])*$ciR); + $ROUGEAverages->{"CIAvgU_F"}=sprintf("%7.5f",$ResamplingArray[2][$ciUa]+ + ($ResamplingArray[2][$ciUb]-$ResamplingArray[2][$ciUa])*$ciR); + $ROUGEAverages->{"M_cnt"}=$avgAvgROUGE_R; # model token count + $ROUGEAverages->{"P_cnt"}=$avgAvgROUGE_P; # peer token count + $ROUGEAverages->{"H_cnt"}=$avgAvgROUGE_F; # hit token count + } + else { + # $opt_t==2 => output raw count instead of precision, recall, and f-measure values + # in this option, no resampling is necessary, just output the raw counts + $ROUGEAverages->{"M_cnt"}=$avgAvgROUGE_R; # model token count + $ROUGEAverages->{"P_cnt"}=$avgAvgROUGE_P; # peer token count + $ROUGEAverages->{"H_cnt"}=$avgAvgROUGE_F; # hit token count + } +} + +sub computeROUGEX { + my $metric=shift; # which ROUGE metric to compute? + my $ROUGEScores=shift; + my $evalID=shift; + my $ROUGEEval=shift; # one particular evaluation pair + my $peerID=shift; # a specific peer ID + my $ROUGEParam=shift; # ROUGE scoring parameters + my $lengthLimit; # lenght limit in words + my $byteLimit; # length limit in bytes + my $NSIZE; # ngram size for ROUGE-N + my $weightFactor; # weight factor for ROUGE-W + my $skipDistance; # skip distance for ROUGE-S + my $scoreMode; # scoring mode: A = model average; B = best model + my $alpha; # relative importance between recall and precision + my $opt_t; # ROUGE score counting mode + my $BEMode; # Basic Element scoring mode + my ($c,$cx,@modelPaths,$modelIDs,$modelRoot,$inputFormat); + + $lengthLimit=$ROUGEParam->{"LENGTH"}; + $byteLimit=$ROUGEParam->{"BYTE"}; + $NSIZE=$ROUGEParam->{"NSIZE"}; + $weightFactor=$ROUGEParam->{"WEIGHT"}; + $skipDistance=$ROUGEParam->{"SD"}; + $scoreMode=$ROUGEParam->{"SM"}; + $alpha=$ROUGEParam->{"ALPHA"}; + $opt_t=$ROUGEParam->{"AVERAGE"}; + $BEMode=$ROUGEParam->{"BEMODE"}; + + # Check to see if this evaluation trial contains this $peerID. + # Sometimes not every peer provides response for each + # evaluation trial. + unless(exists($ROUGEEval->{"Ps"}{$peerID})) { + unless(exists($knownMissing{$evalID})) { + $knownMissing{$evalID}={}; + } + unless(exists($knownMissing{$evalID}{$peerID})) { + print STDERR "\*ROUGE Warning: test instance for peer $peerID does not exist for evaluation $evalID\n"; + $knownMissing{$evalID}{$peerID}=1; + } + return; + } + unless(defined($opt_z)) { + $peerPath=$ROUGEEval->{"PR"}."/".$ROUGEEval->{"Ps"}{$peerID}; + } + else { + # if opt_z is set then peerPath is read from a file list that + # includes the path to the peer. + $peerPath=$ROUGEEval->{"Ps"}{$peerID}; + } + if(defined($ROUGEEval->{"MR"})) { + $modelRoot=$ROUGEEval->{"MR"}; + } + else { + # if opt_z is set then modelPath is read from a file list that + # includes the path to the model. + $modelRoot=""; + } + $modelIDs=$ROUGEEval->{"MIDList"}; + $inputFormat=$ROUGEEval->{"IF"}; + # construct combined model + @modelPaths=(); # reset model paths + for($cx=0;$cx<=$#{$modelIDs};$cx++) { + my $modelID; + $modelID=$modelIDs->[$cx]; + unless(defined($opt_z)) { + $modelPath="$modelRoot/$ROUGEEval->{\"Ms\"}{$modelID}"; # get full model path + } + else { + # if opt_z is set then modelPath is read from a file list that + # includes the full path to the model. + $modelPath="$ROUGEEval->{\"Ms\"}{$modelID}"; # get full model path + } + if(-e "$modelPath") { + # print "*$modelPath\n"; + } + else { + die "Cannot find model summary: $modelPath\n"; + } + push(@modelPaths,$modelPath); + } + #--------------------------------------------------------------- + # evaluate peer + { + my (@results); + my ($testID,$avgROUGE,$avgROUGE_P,$avgROUGE_F); + @results=(); + if($metric eq "N") { + &computeNGramScore(\@modelPaths,$peerPath,\@results,$NSIZE,$lengthLimit,$byteLimit,$inputFormat,$scoreMode,$alpha); + } + elsif($metric eq "L") { + &computeLCSScore(\@modelPaths,$peerPath,\@results,$lengthLimit,$byteLimit,$inputFormat,$scoreMode,$alpha); + } + elsif($metric eq "W") { + &computeWLCSScore(\@modelPaths,$peerPath,\@results,$lengthLimit,$byteLimit,$inputFormat,$weightFactor,$scoreMode,$alpha); + } + elsif($metric eq "S") { + &computeSkipBigramScore(\@modelPaths,$peerPath,\@results,$skipDistance,$lengthLimit,$byteLimit,$inputFormat,$scoreMode,$alpha); + } + elsif($metric eq "BE") { + &computeBEScore(\@modelPaths,$peerPath,\@results,$BEMode,$lengthLimit,$byteLimit,$inputFormat,$scoreMode,$alpha); + } + else { + die "Unknown ROUGE metric ID: $metric, has to be N, L, W, or S\n"; + + } + unless(defined($opt_t)) { + # sentence level average + $avgROUGE=sprintf("%7.5f",$results[2]); + $avgROUGE_P=sprintf("%7.5f",$results[4]); + $avgROUGE_F=sprintf("%7.5f",$results[5]); + } + else { + # corpus level per token average + $avgROUGE=$results[0]; # total model token count + $avgROUGE_P=$results[3]; # total peer token count + $avgROUGE_F=$results[1]; # total match count between model and peer, i.e. hit + } + # record ROUGE scores for the current test + $testID="$evalID\.$peerID"; + if($debug) { + print "$testID\n"; + } + unless(exists($testIDs{$testID})) { + $testIDs{$testID}=1; + } + unless(exists($ROUGEScores->{$testID})) { + $ROUGEScores->{$testID}=[]; + push(@{$ROUGEScores->{$testID}},$avgROUGE); # average ; or model token count + push(@{$ROUGEScores->{$testID}},$avgROUGE_P); # average ; or peer token count + push(@{$ROUGEScores->{$testID}},$avgROUGE_F); # average ; or match token count (hit) + } + } +} + +# 10/21/2004 add selection of scoring mode +# A: average over all models +# B: take only the best score +sub computeNGramScore { + my $modelPaths=shift; + my $peerPath=shift; + my $results=shift; + my $NSIZE=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my $inputFormat=shift; + my $scoreMode=shift; + my $alpha=shift; + my ($modelPath,$modelText,$peerText,$text,@tokens); + my (%model_grams,%peer_grams); + my ($gramHit,$gramScore,$gramScoreBest); + my ($totalGramHit,$totalGramCount); + my ($gramScoreP,$gramScoreF,$totalGramCountP); + + #------------------------------------------------ + # read model file and create model n-gram maps + $totalGramHit=0; + $totalGramCount=0; + $gramScoreBest=-1; + $gramScoreP=0; # precision + $gramScoreF=0; # f-measure + $totalGramCountP=0; + #------------------------------------------------ + # read peer file and create model n-gram maps + %peer_grams=(); + $peerText=""; + &readText($peerPath,\$peerText,$inputFormat,$lengthLimit,$byteLimit); + &createNGram($peerText,\%peer_grams,$NSIZE); + if($debug) { + print "***P $peerPath\n"; + if(defined($peerText)) { + print "$peerText\n"; + print join("|",%peer_grams),"\n"; + } + else { + print "---empty text---\n"; + } + } + foreach $modelPath (@$modelPaths) { + %model_grams=(); + $modelText=""; + &readText($modelPath,\$modelText,$inputFormat,$lengthLimit,$byteLimit); + &createNGram($modelText,\%model_grams,$NSIZE); + if($debug) { + if(defined($modelText)) { + print "$modelText\n"; + print join("|",%model_grams),"\n"; + } + else { + print "---empty text---\n"; + } + } + #------------------------------------------------ + # compute ngram score + &ngramScore(\%model_grams,\%peer_grams,\$gramHit,\$gramScore); + # collect hit and count for each models + # This will effectively clip hit for each model; therefore would not give extra + # credit to reducdant information contained in the peer summary. + if($scoreMode eq "A") { + $totalGramHit+=$gramHit; + $totalGramCount+=$model_grams{"_cn_"}; + $totalGramCountP+=$peer_grams{"_cn_"}; + } + elsif($scoreMode eq "B") { + if($gramScore>$gramScoreBest) { + # only take a better score (i.e. better match) + $gramScoreBest=$gramScore; + $totalGramHit=$gramHit; + $totalGramCount=$model_grams{"_cn_"}; + $totalGramCountP=$peer_grams{"_cn_"}; + } + } + else { + # use average mode + $totalGramHit+=$gramHit; + $totalGramCount+=$model_grams{"_cn_"}; + $totalGramCountP+=$peer_grams{"_cn_"}; + } + if($debug) { + print "***M $modelPath\n"; + } + } + # prepare score result for return + # unigram + push(@$results,$totalGramCount); # total number of ngrams in models + push(@$results,$totalGramHit); + if($totalGramCount!=0) { + $gramScore=sprintf("%7.5f",$totalGramHit/$totalGramCount); + } + else { + $gramScore=sprintf("%7.5f",0); + } + push(@$results,$gramScore); + push(@$results,$totalGramCountP); # total number of ngrams in peers + if($totalGramCountP!=0) { + $gramScoreP=sprintf("%7.5f",$totalGramHit/$totalGramCountP); + } + else { + $gramScoreP=sprintf("%7.5f",0); + } + push(@$results,$gramScoreP); # precision score + if((1-$alpha)*$gramScoreP+$alpha*$gramScore>0) { + $gramScoreF=sprintf("%7.5f",($gramScoreP*$gramScore)/((1-$alpha)*$gramScoreP+$alpha*$gramScore)); + } + else { + $gramScoreF=sprintf("%7.5f",0); + } + push(@$results,$gramScoreF); # f1-measure score + if($debug) { + print "total $NSIZE-gram model count: $totalGramCount\n"; + print "total $NSIZE-gram peer count: $totalGramCountP\n"; + print "total $NSIZE-gram hit: $totalGramHit\n"; + print "total ROUGE-$NSIZE\-R: $gramScore\n"; + print "total ROUGE-$NSIZE\-P: $gramScoreP\n"; + print "total ROUGE-$NSIZE\-F: $gramScoreF\n"; + } +} + +sub computeSkipBigramScore { + my $modelPaths=shift; + my $peerPath=shift; + my $results=shift; + my $skipDistance=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my $inputFormat=shift; + my $scoreMode=shift; + my $alpha=shift; + my ($modelPath,$modelText,$peerText,$text,@tokens); + my (%model_grams,%peer_grams); + my ($gramHit,$gramScore,$gramScoreBest); + my ($totalGramHitm,$totalGramCount); + my ($gramScoreP,$gramScoreF,$totalGramCountP); + + #------------------------------------------------ + # read model file and create model n-gram maps + $totalGramHit=0; + $totalGramCount=0; + $gramScoreBest=-1; + $gramScoreP=0; # precision + $gramScoreF=0; # f-measure + $totalGramCountP=0; + #------------------------------------------------ + # read peer file and create model n-gram maps + %peer_grams=(); + $peerText=""; + &readText($peerPath,\$peerText,$inputFormat,$lengthLimit,$byteLimit); + &createSkipBigram($peerText,\%peer_grams,$skipDistance); + if($debug) { + print "***P $peerPath\n"; + if(defined($peerText)) { + print "$peerText\n"; + print join("|",%peer_grams),"\n"; + } + else { + print "---empty text---\n"; + } + } + foreach $modelPath (@$modelPaths) { + %model_grams=(); + $modelText=""; + &readText($modelPath,\$modelText,$inputFormat,$lengthLimit,$byteLimit); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=1; + } + &createSkipBigram($modelText,\%model_grams,$skipDistance); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=undef; + } + if($debug) { + if(defined($modelText)) { + print "$modelText\n"; + print join("|",%model_grams),"\n"; + } + else { + print "---empty text---\n"; + } + } + #------------------------------------------------ + # compute ngram score + &skipBigramScore(\%model_grams,\%peer_grams,\$gramHit,\$gramScore); + # collect hit and count for each models + # This will effectively clip hit for each model; therefore would not give extra + # credit to reducdant information contained in the peer summary. + if($scoreMode eq "A") { + $totalGramHit+=$gramHit; + $totalGramCount+=$model_grams{"_cn_"}; + $totalGramCountP+=$peer_grams{"_cn_"}; + } + elsif($scoreMode eq "B") { + if($gramScore>$gramScoreBest) { + # only take a better score (i.e. better match) + $gramScoreBest=$gramScore; + $totalGramHit=$gramHit; + $totalGramCount=$model_grams{"_cn_"}; + $totalGramCountP=$peer_grams{"_cn_"}; + } + } + else { + # use average mode + $totalGramHit+=$gramHit; + $totalGramCount+=$model_grams{"_cn_"}; + $totalGramCountP+=$peer_grams{"_cn_"}; + } + if($debug) { + print "***M $modelPath\n"; + } + } + # prepare score result for return + # unigram + push(@$results,$totalGramCount); # total number of ngrams + push(@$results,$totalGramHit); + if($totalGramCount!=0) { + $gramScore=sprintf("%7.5f",$totalGramHit/$totalGramCount); + } + else { + $gramScore=sprintf("%7.5f",0); + } + push(@$results,$gramScore); + push(@$results,$totalGramCountP); # total number of ngrams in peers + if($totalGramCountP!=0) { + $gramScoreP=sprintf("%7.5f",$totalGramHit/$totalGramCountP); + } + else { + $gramScoreP=sprintf("%7.5f",0); + } + push(@$results,$gramScoreP); # precision score + if((1-$alpha)*$gramScoreP+$alpha*$gramScore>0) { + $gramScoreF=sprintf("%7.5f",($gramScoreP*$gramScore)/((1-$alpha)*$gramScoreP+$alpha*$gramScore)); + } + else { + $gramScoreF=sprintf("%7.5f",0); + } + push(@$results,$gramScoreF); # f1-measure score + if($debug) { + print "total ROUGE-S$skipDistance model count: $totalGramCount\n"; + print "total ROUGE-S$skipDistance peer count: $totalGramCountP\n"; + print "total ROUGE-S$skipDistance hit: $totalGramHit\n"; + print "total ROUGE-S$skipDistance\-R: $gramScore\n"; + print "total ROUGE-S$skipDistance\-P: $gramScore\n"; + print "total ROUGE-S$skipDistance\-F: $gramScore\n"; + } +} + +sub computeLCSScore { + my $modelPaths=shift; + my $peerPath=shift; + my $results=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my $inputFormat=shift; + my $scoreMode=shift; + my $alpha=shift; + my ($modelPath,@modelText,@peerText,$text,@tokens); + my (@modelTokens,@peerTokens); + my ($lcsHit,$lcsScore,$lcsBase,$lcsScoreBest); + my ($totalLCSHitm,$totalLCSCount); + my (%peer_1grams,%tmp_peer_1grams,%model_1grams,$peerText1,$modelText1); + my ($lcsScoreP,$lcsScoreF,$totalLCSCountP); + + #------------------------------------------------ + $totalLCSHit=0; + $totalLCSCount=0; + $lcsScoreBest=-1; + $lcsScoreP=0; + $lcsScoreF=0; + $totalLCSCountP=0; + #------------------------------------------------ + # read peer file and create peer n-gram maps + @peerTokens=(); + @peerText=(); + &readText_LCS($peerPath,\@peerText,$inputFormat,$lengthLimit,$byteLimit); + &tokenizeText_LCS(\@peerText,\@peerTokens); + #------------------------------------------------ + # create unigram for clipping + %peer_1grams=(); + &readText($peerPath,\$peerText1,$inputFormat,$lengthLimit,$byteLimit); + &createNGram($peerText1,\%peer_1grams,1); + if($debug) { + my $i; + print "***P $peerPath\n"; + print join("\n",@peerText),"\n"; + for($i=0;$i<=$#peerText;$i++) { + print $i,": ",join("|",@{$peerTokens[$i]}),"\n"; + } + } + foreach $modelPath (@$modelPaths) { + %tmp_peer_1grams=%peer_1grams; # renew peer unigram hash, so the peer count can be reset to the orignal number + @modelTokens=(); + @modelText=(); + &readText_LCS($modelPath,\@modelText,$inputFormat,$lengthLimit,$byteLimit); + if(defined($opt_M)) { + $opt_m=1; + &tokenizeText_LCS(\@modelText,\@modelTokens); + $opt_m=undef; + } + else { + &tokenizeText_LCS(\@modelText,\@modelTokens); + } + #------------------------------------------------ + # create unigram for clipping + %model_1grams=(); + &readText($modelPath,\$modelText1,$inputFormat,$lengthLimit,$byteLimit); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=1; + } + &createNGram($modelText1,\%model_1grams,1); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=undef; + } + #------------------------------------------------ + # compute LCS score + &lcs(\@modelTokens,\@peerTokens,\$lcsHit,\$lcsScore,\$lcsBase,\%model_1grams,\%tmp_peer_1grams); + # collect hit and count for each models + # This will effectively clip hit for each model; therefore would not give extra + # credit to reductant information contained in the peer summary. + # Previous method that lumps model text together and inflates the peer summary + # the number of references time would reward redundant information + if($scoreMode eq "A") { + $totalLCSHit+=$lcsHit; + $totalLCSCount+=$lcsBase; + $totalLCSCountP+=$peer_1grams{"_cn_"}; + } + elsif($scoreMode eq "B") { + if($lcsScore>$lcsScoreBest) { + # only take a better score (i.e. better match) + $lcsScoreBest=$lcsScore; + $totalLCSHit=$lcsHit; + $totalLCSCount=$lcsBase; + $totalLCSCountP=$peer_1grams{"_cn_"}; + } + } + else { + # use average mode + $totalLCSHit+=$lcsHit; + $totalLCSCount+=$lcsBase; + $totalLCSCountP+=$peer_1grams{"_cn_"}; + } + if($debug) { + my $i; + print "***M $modelPath\n"; + print join("\n",@modelText),"\n"; + for($i=0;$i<=$#modelText;$i++) { + print $i,": ",join("|",@{$modelTokens[$i]}),"\n"; + } + } + } + # prepare score result for return + push(@$results,$totalLCSCount); # total number of ngrams + push(@$results,$totalLCSHit); + if($totalLCSCount!=0) { + $lcsScore=sprintf("%7.5f",$totalLCSHit/$totalLCSCount); + } + else { + $lcsScore=sprintf("%7.5f",0); + } + push(@$results,$lcsScore); + push(@$results,$totalLCSCountP); # total number of token in peers + if($totalLCSCountP!=0) { + $lcsScoreP=sprintf("%7.5f",$totalLCSHit/$totalLCSCountP); + } + else { + $lcsScoreP=sprintf("%7.5f",0); + } + push(@$results,$lcsScoreP); + if((1-$alpha)*$lcsScoreP+$alpha*$lcsScore>0) { + $lcsScoreF=sprintf("%7.5f",($lcsScoreP*$lcsScore)/((1-$alpha)*$lcsScoreP+$alpha*$lcsScore)); + } + else { + $lcsScoreF=sprintf("%7.5f",0); + } + push(@$results,$lcsScoreF); + if($debug) { + print "total ROUGE-L model count: $totalLCSCount\n"; + print "total ROUGE-L peer count: $totalLCSCountP\n"; + print "total ROUGE-L hit: $totalLCSHit\n"; + print "total ROUGE-L-R score: $lcsScore\n"; + print "total ROUGE-L-P: $lcsScoreP\n"; + print "total ROUGE-L-F: $lcsScoreF\n"; + } +} + +sub computeWLCSScore { + my $modelPaths=shift; + my $peerPath=shift; + my $results=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my $inputFormat=shift; + my $weightFactor=shift; + my $scoreMode=shift; + my $alpha=shift; + my ($modelPath,@modelText,@peerText,$text,@tokens); + my (@modelTokens,@peerTokens); + my ($lcsHit,$lcsScore,$lcsBase,$lcsScoreBest); + my ($totalLCSHitm,$totalLCSCount); + my (%peer_1grams,%tmp_peer_1grams,%model_1grams,$peerText1,$modelText1); + my ($lcsScoreP,$lcsScoreF,$totalLCSCountP); + + #------------------------------------------------ + # read model file and create model n-gram maps + $totalLCSHit=0; + $totalLCSCount=0; + $lcsScoreBest=-1; + $lcsScoreP=0; + $lcsScoreF=0; + $totalLCSCountP=0; + #------------------------------------------------ + # read peer file and create model n-gram maps + @peerTokens=(); + @peerText=(); + &readText_LCS($peerPath,\@peerText,$inputFormat,$lengthLimit,$byteLimit); + &tokenizeText_LCS(\@peerText,\@peerTokens); + #------------------------------------------------ + # create unigram for clipping + %peer_1grams=(); + &readText($peerPath,\$peerText1,$inputFormat,$lengthLimit,$byteLimit); + &createNGram($peerText1,\%peer_1grams,1); + if($debug) { + my $i; + print "***P $peerPath\n"; + print join("\n",@peerText),"\n"; + for($i=0;$i<=$#peerText;$i++) { + print $i,": ",join("|",@{$peerTokens[$i]}),"\n"; + } + } + foreach $modelPath (@$modelPaths) { + %tmp_peer_1grams=%peer_1grams; # renew peer unigram hash, so the peer count can be reset to the orignal number + @modelTokens=(); + @modelText=(); + &readText_LCS($modelPath,\@modelText,$inputFormat,$lengthLimit,$byteLimit); + &tokenizeText_LCS(\@modelText,\@modelTokens); + #------------------------------------------------ + # create unigram for clipping + %model_1grams=(); + &readText($modelPath,\$modelText1,$inputFormat,$lengthLimit,$byteLimit); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=1; + } + &createNGram($modelText1,\%model_1grams,1); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=undef; + } + #------------------------------------------------ + # compute WLCS score + &wlcs(\@modelTokens,\@peerTokens,\$lcsHit,\$lcsScore,\$lcsBase,$weightFactor,\%model_1grams,\%tmp_peer_1grams); + # collect hit and count for each models + # This will effectively clip hit for each model; therefore would not give extra + # credit to reductant information contained in the peer summary. + # Previous method that lumps model text together and inflates the peer summary + # the number of references time would reward redundant information + if($scoreMode eq "A") { + $totalLCSHit+=$lcsHit; + $totalLCSCount+=&wlcsWeight($lcsBase,$weightFactor); + $totalLCSCountP+=&wlcsWeight($peer_1grams{"_cn_"},$weightFactor); + } + elsif($scoreMode eq "B") { + if($lcsScore>$lcsScoreBest) { + # only take a better score (i.e. better match) + $lcsScoreBest=$lcsScore; + $totalLCSHit=$lcsHit; + $totalLCSCount=&wlcsWeight($lcsBase,$weightFactor); + $totalLCSCountP=&wlcsWeight($peer_1grams{"_cn_"},$weightFactor); + } + } + else { + # use average mode + $totalLCSHit+=$lcsHit; + $totalLCSCount+=&wlcsWeight($lcsBase,$weightFactor); + $totalLCSCountP+=&wlcsWeight($peer_1grams{"_cn_"},$weightFactor); + } + if($debug) { + my $i; + print "***M $modelPath\n"; + print join("\n",@modelText),"\n"; + for($i=0;$i<=$#modelText;$i++) { + print $i,": ",join("|",@{$modelTokens[$i]}),"\n"; + } + } + } + # prepare score result for return + push(@$results,$totalLCSCount); # total number of ngrams + push(@$results,$totalLCSHit); + if($totalLCSCount!=0) { + $lcsScore=sprintf("%7.5f",&wlcsWeightInverse($totalLCSHit/$totalLCSCount,$weightFactor)); + } + else { + $lcsScore=sprintf("%7.5f",0); + } + push(@$results,$lcsScore); + push(@$results,$totalLCSCountP); # total number of token in peers + if($totalLCSCountP!=0) { + $lcsScoreP=sprintf("%7.5f",&wlcsWeightInverse($totalLCSHit/$totalLCSCountP,$weightFactor)); + } + else { + $lcsScoreP=sprintf("%7.5f",0); + } + push(@$results,$lcsScoreP); + if((1-$alpha)*$lcsScoreP+$alpha*$lcsScore>0) { + $lcsScoreF=sprintf("%7.5f",($lcsScoreP*$lcsScore)/((1-$alpha)*$lcsScoreP+$alpha*$lcsScore)); + } + else { + $lcsScoreF=sprintf("%7.5f",0); + } + push(@$results,$lcsScoreF); + if($debug) { + print "total ROUGE-W-$weightFactor model count: $totalLCSCount\n"; + print "total ROUGE-W-$weightFactor peer count: $totalLCSCountP\n"; + print "total ROUGE-W-$weightFactor hit: $totalLCSHit\n"; + print "total ROUGE-W-$weightFactor-R score: $lcsScore\n"; + print "total ROUGE-W-$weightFactor-P score: $lcsScoreP\n"; + print "total ROUGE-W-$weightFactor-F score: $lcsScoreF\n"; + } +} + +sub computeBEScore { + my $modelPaths=shift; + my $peerPath=shift; + my $results=shift; + my $BEMode=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my $inputFormat=shift; + my $scoreMode=shift; + my $alpha=shift; + my ($modelPath,@modelBEList,@peerBEList,$text,@tokens); + my (%model_BEs,%peer_BEs); + my ($BEHit,$BEScore,$BEScoreBest); + my ($totalBEHit,$totalBECount); + my ($BEScoreP,$BEScoreF,$totalBECountP); + + #------------------------------------------------ + # read model file and create model BE maps + $totalBEHit=0; + $totalBECount=0; + $BEScoreBest=-1; + $BEScoreP=0; # precision + $BEScoreF=0; # f-measure + $totalBECountP=0; + #------------------------------------------------ + # read peer file and create model n-BE maps + %peer_BEs=(); + @peerBEList=(); + &readBE($peerPath,\@peerBEList,$inputFormat); + &createBE(\@peerBEList,\%peer_BEs,$BEMode); + if($debug) { + print "***P $peerPath\n"; + if(scalar @peerBEList > 0) { +# print join("\n",@peerBEList); +# print "\n"; + print join("#",%peer_BEs),"\n"; + } + else { + print "---empty text---\n"; + } + } + foreach $modelPath (@$modelPaths) { + %model_BEs=(); + @modelBEList=(); + &readBE($modelPath,\@modelBEList,$inputFormat); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=1; + } + &createBE(\@modelBEList,\%model_BEs,$BEMode); + if(defined($opt_M)) { # only apply stemming on models + $opt_m=undef; + } + if($debug) { + if(scalar @modelBEList > 0) { +# print join("\n",@modelBEList); +# print "\n"; + print join("#",%model_BEs),"\n"; + } + else { + print "---empty text---\n"; + } + } + #------------------------------------------------ + # compute BE score + &getBEScore(\%model_BEs,\%peer_BEs,\$BEHit,\$BEScore); + # collect hit and count for each models + # This will effectively clip hit for each model; therefore would not give extra + # credit to reducdant information contained in the peer summary. + if($scoreMode eq "A") { + $totalBEHit+=$BEHit; + $totalBECount+=$model_BEs{"_cn_"}; + $totalBECountP+=$peer_BEs{"_cn_"}; + } + elsif($scoreMode eq "B") { + if($BEScore>$BEScoreBest) { + # only take a better score (i.e. better match) + $BEScoreBest=$BEScore; + $totalBEHit=$BEHit; + $totalBECount=$model_BEs{"_cn_"}; + $totalBECountP=$peer_BEs{"_cn_"}; + } + } + else { + # use average mode + $totalBEHit+=$BEHit; + $totalBECount+=$model_BEs{"_cn_"}; + $totalBECountP+=$peer_BEs{"_cn_"}; + } + if($debug) { + print "***M $modelPath\n"; + } + } + # prepare score result for return + # uniBE + push(@$results,$totalBECount); # total number of nbes in models + push(@$results,$totalBEHit); + if($totalBECount!=0) { + $BEScore=sprintf("%7.5f",$totalBEHit/$totalBECount); + } + else { + $BEScore=sprintf("%7.5f",0); + } + push(@$results,$BEScore); + push(@$results,$totalBECountP); # total number of nBEs in peers + if($totalBECountP!=0) { + $BEScoreP=sprintf("%7.5f",$totalBEHit/$totalBECountP); + } + else { + $BEScoreP=sprintf("%7.5f",0); + } + push(@$results,$BEScoreP); # precision score + if((1-$alpha)*$BEScoreP+$alpha*$BEScore>0) { + $BEScoreF=sprintf("%7.5f",($BEScoreP*$BEScore)/((1-$alpha)*$BEScoreP+$alpha*$BEScore)); + } + else { + $BEScoreF=sprintf("%7.5f",0); + } + push(@$results,$BEScoreF); # f1-measure score + if($debug) { + print "total BE-$BEMode model count: $totalBECount\n"; + print "total BE-$BEMode peer count: $totalBECountP\n"; + print "total BE-$BEMode hit: $totalBEHit\n"; + print "total ROUGE-BE-$BEMode\-R: $BEScore\n"; + print "total ROUGE-BE-$BEMode\-P: $BEScoreP\n"; + print "total ROUGE-BE-$BEMode\-F: $BEScoreF\n"; + } +} + +sub readTextOld { + my $inPath=shift; + my $tokenizedText=shift; + my $type=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my ($text,$bsize,$wsize,@words,$done); + + $$tokenizedText=undef; + $bsize=0; + $wsize=0; + $done=0; + open(TEXT,$inPath)||die "Cannot open $inPath\n"; + if($type=~/^SEE$/oi) { + while(defined($line=)) { # SEE abstract format + if($line=~/^\[([0-9]+)\]<\/a>\s+([^<]+)/o) { + $text=$3; + $text=~tr/A-Z/a-z/; + &checkSummarySize($tokenizedText,\$text,\$wsize,\$bsize,\$done,$lengthLimit,$byteLimit); + } + } + } + elsif($type=~/^ISI$/oi) { # ISI standard sentence by sentence format + while(defined($line=)) { + if($line=~/^([^<]+)<\/S>/o) { + $text=$1; + $text=~tr/A-Z/a-z/; + &checkSummarySize($tokenizedText,\$text,\$wsize,\$bsize,\$done,$lengthLimit,$byteLimit); + } + } + } + elsif($type=~/^SPL$/oi) { # SPL one Sentence Per Line format + while(defined($line=)) { + chomp($line); + $line=~s/^\s+//; + $line=~s/\s+$//; + if(defined($line)&&length($line)>0) { + $text=$line; + $text=~tr/A-Z/a-z/; + &checkSummarySize($tokenizedText,\$text,\$wsize,\$bsize,\$done,$lengthLimit,$byteLimit); + } + } + } + else { + close(TEXT); + die "Unknown input format: $type\n"; + } + close(TEXT); + if(defined($$tokenizedText)) { + $$tokenizedText=~s/\-/ \- /g; + $$tokenizedText=~s/[^A-Za-z0-9\-]/ /g; + $$tokenizedText=~s/^\s+//; + $$tokenizedText=~s/\s+$//; + $$tokenizedText=~s/\s+/ /g; + } + else { + print STDERR "readText: $inPath -> empty text\n"; + } + # print "($$tokenizedText)\n\n"; +} + +# enforce length cutoff at the file level +# convert different input format into SPL format then put them into +# tokenizedText +sub readText { + my $inPath=shift; + my $tokenizedText=shift; + my $type=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my ($text,$bsize,$wsize,@words,$done,@sntList); + + $$tokenizedText=undef; + $bsize=0; + $wsize=0; + $done=0; + @sntList=(); + open(TEXT,$inPath)||die "Cannot open $inPath\n"; + if($type=~/^SEE$/oi) { + while(defined($line=)) { # SEE abstract format + if($line=~/^\[([0-9]+)\]<\/a>\s+([^<]+)/o|| + $line=~/^\[([0-9]+)\]<\/a>\s+([^<]+)/o) { + $text=$2; + $text=~tr/A-Z/a-z/; + push(@sntList,$text); + } + } + } + elsif($type=~/^ISI$/oi) { # ISI standard sentence by sentence format + while(defined($line=)) { + if($line=~/^([^<]+)<\/S>/o) { + $text=$1; + $text=~tr/A-Z/a-z/; + push(@sntList,$text); + } + } + } + elsif($type=~/^SPL$/oi) { # SPL one Sentence Per Line format + while(defined($line=)) { + chomp($line); + if(defined($line)&&length($line)>0) { + $text=$line; + $text=~tr/A-Z/a-z/; + push(@sntList,$text); + } + } + } + else { + close(TEXT); + die "Unknown input format: $type\n"; + } + close(TEXT); + if($lengthLimit==0&&$byteLimit==0) { + $$tokenizedText=join(" ",@sntList); + } + elsif($lengthLimit!=0) { + my ($tmpText); + $tmpText=""; + $tmpTextLen=0; + foreach $s (@sntList) { + my ($sLen,@tokens); + @tokens=split(/\s+/,$s); + $sLen=scalar @tokens; + if($tmpTextLen+$sLen<$lengthLimit) { + if($tmpTextLen!=0) { + $tmpText.=" $s"; + } + else { + $tmpText.="$s"; + } + $tmpTextLen+=$sLen; + } + else { + if($tmpTextLen>0) { + $tmpText.=" "; + } + $tmpText.=join(" ",@tokens[0..$lengthLimit-$tmpTextLen-1]); + last; + } + } + if(length($tmpText)>0) { + $$tokenizedText=$tmpText; + } + } + elsif($byteLimit!=0) { + my ($tmpText); + $tmpText=""; + $tmpTextLen=0; + foreach $s (@sntList) { + my ($sLen); + $sLen=length($s); + if($tmpTextLen+$sLen<$byteLimit) { + if($tmpTextLen!=0) { + $tmpText.=" $s"; + } + else { + $tmpText.="$s"; + } + $tmpTextLen+=$sLen; + } + else { + if($tmpTextLen>0) { + $tmpText.=" "; + } + $tmpText.=substr($s,0,$byteLimit-$tmpTextLen); + last; + } + } + if(length($tmpText)>0) { + $$tokenizedText=$tmpText; + } + } + if(defined($$tokenizedText)) { + $$tokenizedText=~s/\-/ \- /g; + $$tokenizedText=~s/[^A-Za-z0-9\-]/ /g; + $$tokenizedText=~s/^\s+//; + $$tokenizedText=~s/\s+$//; + $$tokenizedText=~s/\s+/ /g; + } + else { + print STDERR "readText: $inPath -> empty text\n"; + } + # print "($$tokenizedText)\n\n"; +} + +sub readBE { + my $inPath=shift; + my $BEList=shift; + my $type=shift; + my ($line); + + open(TEXT,$inPath)||die "Cannot open $inPath\n"; + if(defined($opt_v)) { + print STDERR "$inPath\n"; + } + if($type=~/^SIMPLE$/oi) { + while(defined($line=)) { # Simple BE triple format + chomp($line); + push(@{$BEList},$line); + } + } + elsif($type=~/^ISI$/oi) { # ISI standard BE format + while(defined($line=)) { + # place holder + } + } + else { + close(TEXT); + die "Unknown input format: $type\n"; + } + close(TEXT); + if(scalar @{$BEList} ==0) { + print STDERR "readBE: $inPath -> empty text\n"; + } +} + +sub checkSummarySize { + my $tokenizedText=shift; + my $text=shift; + my $wsize=shift; + my $bsize=shift; + my $done=shift; + my $lenghtLimit=shift; + my $byteLimit=shift; + my (@words); + + @words=split(/\s+/,$$text); + if(($lengthLimit==0&&$byteLimit==0)|| + ($lengthLimit!=0&&(scalar @words)+$$wsize<=$lengthLimit)|| + ($byteLimit!=0&&length($$text)+$$bsize<=$byteLimit)) { + if(defined($$tokenizedText)) { + $$tokenizedText.=" $$text"; + } + else { + $$tokenizedText=$$text; + } + $$bsize+=length($$text); + $$wsize+=(scalar @words); + } + elsif($lengthLimit!=0&&(scalar @words)+$$wsize>$lengthLimit) { + if($$done==0) { + if(defined($$tokenizedText)) { + $$tokenizedText.=" "; + $$tokenizedText.=join(" ",@words[0..$lengthLimit-$$wsize-1]); + } + else { + $$tokenizedText=join(" ",@words[0..$lengthLimit-$$wsize-1]); + } + $$done=1; + } + } + elsif($byteLimit!=0&&length($$text)+$$bsize>$byteLimit) { + if($$done==0) { + if(defined($$tokenizedText)) { + $$tokenizedText.=" "; + $$tokenizedText.=substr($$text,0,$byteLimit-$$bsize); + } + else { + $$tokenizedText=substr($$text,0,$byteLimit-$$bsize); + + } + $$done=1; + } + } +} + +# LCS computing is based on unit and cannot lump all the text together +# as in computing ngram co-occurrences +sub readText_LCS { + my $inPath=shift; + my $tokenizedText=shift; + my $type=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my ($text,$t,$bsize,$wsize,$done,@sntList); + + @{$tokenizedText}=(); + $bsize=0; + $wsize=0; + $done=0; + @sntList=(); + open(TEXT,$inPath)||die "Cannot open $inPath\n"; + if($type=~/^SEE$/oi) { + while(defined($line=)) { # SEE abstract format + if($line=~/^\[([0-9]+)\]<\/a>\s+([^<]+)/o|| + $line=~/^\[([0-9]+)\]<\/a>\s+([^<]+)/o) { + $text=$2; + $text=~tr/A-Z/a-z/; + push(@sntList,$text); + } + } + } + elsif($type=~/^ISI$/oi) { # ISI standard sentence by sentence format + while(defined($line=)) { + if($line=~/^([^<]+)<\/S>/o) { + $text=$1; + $text=~tr/A-Z/a-z/; + push(@sntList,$text); + } + } + } + elsif($type=~/^SPL$/oi) { # SPL one Sentence Per Line format + while(defined($line=)) { + chomp($line); + if(defined($line)&&length($line)>0) { + $text=$line; + $text=~tr/A-Z/a-z/; + push(@sntList,$text); + } + } + } + else { + close(TEXT); + die "Unknown input format: $type\n"; + } + close(TEXT); + if($lengthLimit==0&&$byteLimit==0) { + @{$tokenizedText}=@sntList; + } + elsif($lengthLimit!=0) { + my ($tmpText); + $tmpText=""; + $tmpTextLen=0; + foreach $s (@sntList) { + my ($sLen,@tokens); + @tokens=split(/\s+/,$s); + $sLen=scalar @tokens; + if($tmpTextLen+$sLen<$lengthLimit) { + $tmpTextLen+=$sLen; + push(@{$tokenizedText},$s); + } + else { + push(@{$tokenizedText},join(" ",@tokens[0..$lengthLimit-$tmpTextLen-1])); + last; + } + } + } + elsif($byteLimit!=0) { + my ($tmpText); + $tmpText=""; + $tmpTextLen=0; + foreach $s (@sntList) { + my ($sLen); + $sLen=length($s); + if($tmpTextLen+$sLen<$byteLimit) { + push(@{$tokenizedText},$s); + } + else { + push(@{$tokenizedText},substr($s,0,$byteLimit-$tmpTextLen)); + last; + } + } + } + if(defined(@{$tokenizedText}>0)) { + for($t=0;$t<@{$tokenizedText};$t++) { + $tokenizedText->[$t]=~s/\-/ \- /g; + $tokenizedText->[$t]=~s/[^A-Za-z0-9\-]/ /g; + $tokenizedText->[$t]=~s/^\s+//; + $tokenizedText->[$t]=~s/\s+$//; + $tokenizedText->[$t]=~s/\s+/ /g; + } + } + else { + print STDERR "readText_LCS: $inPath -> empty text\n"; + } +} + +# LCS computing is based on unit and cannot lump all the text together +# as in computing ngram co-occurrences +sub readText_LCS_old { + my $inPath=shift; + my $tokenizedText=shift; + my $type=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my ($text,$t,$bsize,$wsize,$done); + + @{$tokenizedText}=(); + $bsize=0; + $wsize=0; + $done=0; + open(TEXT,$inPath)||die "Cannot open $inPath\n"; + if($type=~/^SEE$/oi) { + while(defined($line=)) { # SEE abstract format + if($line=~/^\[([0-9]+)\]<\/a>\s+([^<]+)/o) { + $text=$3; + $text=~tr/A-Z/a-z/; + &checkSummarySize_LCS($tokenizedText,\$text,\$wsize,\$bsize,\$done,$lengthLimit,$byteLimit); + } + } + } + elsif($type=~/^ISI$/oi) { # ISI standard sentence by sentence format + while(defined($line=)) { + if($line=~/^([^<]+)<\/S>/o) { + $text=$1; + $text=~tr/A-Z/a-z/; + &checkSummarySize_LCS($tokenizedText,\$text,\$wsize,\$bsize,\$done,$lengthLimit,$byteLimit); + } + } + } + elsif($type=~/^SPL$/oi) { # SPL one Sentence Per Line format + while(defined($line=)) { + chomp($line); + $line=~s/^\s+//; + $line=~s/\s+$//; + if(defined($line)&&length($line)>0) { + $text=$line; + $text=~tr/A-Z/a-z/; + &checkSummarySize_LCS($tokenizedText,\$text,\$wsize,\$bsize,\$done,$lengthLimit,$byteLimit); + } + } + } + else { + close(TEXT); + die "Unknown input format: $type\n"; + } + close(TEXT); + if(defined(@{$tokenizedText}>0)) { + for($t=0;$t<@{$tokenizedText};$t++) { + $tokenizedText->[$t]=~s/\-/ \- /g; + $tokenizedText->[$t]=~s/[^A-Za-z0-9\-]/ /g; + $tokenizedText->[$t]=~s/^\s+//; + $tokenizedText->[$t]=~s/\s+$//; + $tokenizedText->[$t]=~s/\s+/ /g; + } + } + else { + print STDERR "readText_LCS: $inPath -> empty text\n"; + } +} + +sub checkSummarySize_LCS { + my $tokenizedText=shift; + my $text=shift; + my $wsize=shift; + my $bsize=shift; + my $done=shift; + my $lenghtLimit=shift; + my $byteLimit=shift; + my (@words); + + @words=split(/\s+/,$$text); + if(($lengthLimit==0&&$byteLimit==0)|| + ($lengthLimit!=0&&(scalar @words)+$$wsize<=$lengthLimit)|| + ($byteLimit!=0&&length($$text)+$$bsize<=$byteLimit)) { + push(@{$tokenizedText},$$text); + $$bsize+=length($$text); + $$wsize+=(scalar @words); + } + elsif($lengthLimit!=0&&(scalar @words)+$$wsize>$lengthLimit) { + if($$done==0) { + push(@{$tokenizedText},$$text); + $$done=1; + } + } + elsif($byteLimit!=0&&length($$text)+$$bsize>$byteLimit) { + if($$done==0) { + push(@{$tokenizedText},$$text); + $$done=1; + } + } +} + +sub ngramScore { + my $model_grams=shift; + my $peer_grams=shift; + my $hit=shift; + my $score=shift; + my ($s,$t,@tokens); + + $$hit=0; + @tokens=keys (%$model_grams); + foreach $t (@tokens) { + if($t ne "_cn_") { + my $h; + $h=0; + if(exists($peer_grams->{$t})) { + $h=$peer_grams->{$t}<=$model_grams->{$t}? + $peer_grams->{$t}:$model_grams->{$t}; # clip + $$hit+=$h; + } + } + } + if($model_grams->{"_cn_"}!=0) { + $$score=sprintf("%07.5f",$$hit/$model_grams->{"_cn_"}); + } + else { + # no instance of n-gram at this length + $$score=0; + # die "model n-grams has zero instance\n"; + } +} + +sub skipBigramScore { + my $model_grams=shift; + my $peer_grams=shift; + my $hit=shift; + my $score=shift; + my ($s,$t,@tokens); + + $$hit=0; + @tokens=keys (%$model_grams); + foreach $t (@tokens) { + if($t ne "_cn_") { + my $h; + $h=0; + if(exists($peer_grams->{$t})) { + $h=$peer_grams->{$t}<=$model_grams->{$t}? + $peer_grams->{$t}:$model_grams->{$t}; # clip + $$hit+=$h; + } + } + } + if($model_grams->{"_cn_"}!=0) { + $$score=sprintf("%07.5f",$$hit/$model_grams->{"_cn_"}); + } + else { + # no instance of n-gram at this length + $$score=0; + # die "model n-grams has zero instance\n"; + } +} + +sub lcs { + my $model=shift; + my $peer=shift; + my $hit=shift; + my $score=shift; + my $base=shift; + my $model_1grams=shift; + my $peer_1grams=shift; + my ($i,$j,@hitMask,@LCS); + + $$hit=0; + $$base=0; + # compute LCS length for each model/peer pair + for($i=0;$i<@{$model};$i++) { + # use @hitMask to make sure multiple peer hit won't be counted as multiple hits + @hitMask=(); + for($j=0;$j<@{$model->[$i]};$j++) { + push(@hitMask,0); # initialize hit mask + } + $$base+=scalar @{$model->[$i]}; # add model length + for($j=0;$j<@{$peer};$j++) { + &lcs_inner($model->[$i],$peer->[$j],\@hitMask); + } + @LCS=(); + for($j=0;$j<@{$model->[$i]};$j++) { + if($hitMask[$j]==1) { + if(exists($model_1grams->{$model->[$i][$j]})&& + exists($peer_1grams->{$model->[$i][$j]})&& + $model_1grams->{$model->[$i][$j]}>0&& + $peer_1grams->{$model->[$i][$j]}>0) { + $$hit++; + #--------------------------------------------- + # bookkeeping to clip over counting + # everytime a hit is found it is deducted + # from both model and peer unigram count + # if a unigram count already involve in + # one LCS match then it will not be counted + # if it match another token in the model + # unit. This will make sure LCS score + # is always lower than unigram score + $model_1grams->{$model->[$i][$j]}--; + $peer_1grams->{$model->[$i][$j]}--; + push(@LCS,$model->[$i][$j]); + } + } + } + if($debug) { + print "LCS: "; + if(@LCS) { + print join(" ",@LCS),"\n"; + } + else { + print "-\n"; + } + } + } + if($$base>0) { + $$score=$$hit/$$base; + } + else { + $$score=0; + } +} + +sub lcs_inner { + my $model=shift; + my $peer=shift; + my $hitMask=shift; + my $m=scalar @$model; # length of model + my $n=scalar @$peer; # length of peer + my ($i,$j); + my (@c,@b); + + if(@{$model}==0) { + return; + } + @c=(); + @b=(); + # initialize boundary condition and + # the DP array + for($i=0;$i<=$m;$i++) { + push(@c,[]); + push(@b,[]); + for($j=0;$j<=$n;$j++) { + push(@{$c[$i]},0); + push(@{$b[$i]},0); + } + } + for($i=1;$i<=$m;$i++) { + for($j=1;$j<=$n;$j++) { + if($model->[$i-1] eq $peer->[$j-1]) { + # recursively solve the i-1 subproblem + $c[$i][$j]=$c[$i-1][$j-1]+1; + $b[$i][$j]="\\"; # go diagonal + } + elsif($c[$i-1][$j]>=$c[$i][$j-1]) { + $c[$i][$j]=$c[$i-1][$j]; + $b[$i][$j]="^"; # go up + } + else { + $c[$i][$j]=$c[$i][$j-1]; + $b[$i][$j]="<"; # go left + } + } + } + &markLCS($hitMask,\@b,$m,$n); +} + +sub wlcs { + my $model=shift; + my $peer=shift; + my $hit=shift; + my $score=shift; + my $base=shift; + my $weightFactor=shift; + my $model_1grams=shift; + my $peer_1grams=shift; + my ($i,$j,@hitMask,@LCS,$hitLen); + + $$hit=0; + $$base=0; + # compute LCS length for each model/peer pair + for($i=0;$i<@{$model};$i++) { + # use @hitMask to make sure multiple peer hit won't be counted as multiple hits + @hitMask=(); + for($j=0;$j<@{$model->[$i]};$j++) { + push(@hitMask,0); # initialize hit mask + } + $$base+=&wlcsWeight(scalar @{$model->[$i]},$weightFactor); # add model length + for($j=0;$j<@{$peer};$j++) { + &wlcs_inner($model->[$i],$peer->[$j],\@hitMask,$weightFactor); + } + @LCS=(); + $hitLen=0; + for($j=0;$j<@{$model->[$i]};$j++) { + if($hitMask[$j]==1) { + if(exists($model_1grams->{$model->[$i][$j]})&& + exists($peer_1grams->{$model->[$i][$j]})&& + $model_1grams->{$model->[$i][$j]}>0&& + $peer_1grams->{$model->[$i][$j]}>0) { + $hitLen++; + if($j+1<@{$model->[$i]}&&$hitMask[$j+1]==0) { + $$hit+=&wlcsWeight($hitLen,$weightFactor); + $hitLen=0; # reset hit length + } + elsif($j+1==@{$model->[$i]}) { + # end of sentence + $$hit+=&wlcsWeight($hitLen,$weightFactor); + $hitLen=0; # reset hit length + } + #--------------------------------------------- + # bookkeeping to clip over counting + # everytime a hit is found it is deducted + # from both model and peer unigram count + # if a unigram count already involve in + # one LCS match then it will not be counted + # if it match another token in the model + # unit. This will make sure LCS score + # is always lower than unigram score + $model_1grams->{$model->[$i][$j]}--; + $peer_1grams->{$model->[$i][$j]}--; + push(@LCS,$model->[$i][$j]); + } + } + } + if($debug) { + print "ROUGE-W: "; + if(@LCS) { + print join(" ",@LCS),"\n"; + } + else { + print "-\n"; + } + } + } + $$score=wlcsWeightInverse($$hit/$$base,$weightFactor); +} + +sub wlcsWeight { + my $r=shift; + my $power=shift; + + return $r**$power; +} + +sub wlcsWeightInverse { + my $r=shift; + my $power=shift; + + return $r**(1/$power); +} + +sub wlcs_inner { + my $model=shift; + my $peer=shift; + my $hitMask=shift; + my $weightFactor=shift; + my $m=scalar @$model; # length of model + my $n=scalar @$peer; # length of peer + my ($i,$j); + my (@c,@b,@l); + + if(@{$model}==0) { + return; + } + @c=(); + @b=(); + @l=(); # the length of consecutive matches so far + # initialize boundary condition and + # the DP array + for($i=0;$i<=$m;$i++) { + push(@c,[]); + push(@b,[]); + push(@l,[]); + for($j=0;$j<=$n;$j++) { + push(@{$c[$i]},0); + push(@{$b[$i]},0); + push(@{$l[$i]},0); + } + } + for($i=1;$i<=$m;$i++) { + for($j=1;$j<=$n;$j++) { + if($model->[$i-1] eq $peer->[$j-1]) { + # recursively solve the i-1 subproblem + $k=$l[$i-1][$j-1]; + $c[$i][$j]=$c[$i-1][$j-1]+&wlcsWeight($k+1,$weightFactor)-&wlcsWeight($k,$weightFactor); + $b[$i][$j]="\\"; # go diagonal + $l[$i][$j]=$k+1; # extend the consecutive matching sequence + } + elsif($c[$i-1][$j]>=$c[$i][$j-1]) { + $c[$i][$j]=$c[$i-1][$j]; + $b[$i][$j]="^"; # go up + $l[$i][$j]=0; # no match at this position + } + else { + $c[$i][$j]=$c[$i][$j-1]; + $b[$i][$j]="<"; # go left + $l[$i][$j]=0; # no match at this position + } + } + } + &markLCS($hitMask,\@b,$m,$n); +} + +sub markLCS { + my $hitMask=shift; + my $b=shift; + my $i=shift; + my $j=shift; + + while($i!=0&&$j!=0) { + if($b->[$i][$j] eq "\\") { + $i--; + $j--; + $hitMask->[$i]=1; # mark current model position as a hit + } + elsif($b->[$i][$j] eq "^") { + $i--; + } + elsif($b->[$i][$j] eq "<") { + $j--; + } + else { + die "Illegal move in markLCS: ($i,$j): \"$b->[$i][$j]\".\n"; + } + } +} + +# currently only support simple lexical matching +sub getBEScore { + my $modelBEs=shift; + my $peerBEs=shift; + my $hit=shift; + my $score=shift; + my ($s,$t,@tokens); + + $$hit=0; + @tokens=keys (%$modelBEs); + foreach $t (@tokens) { + if($t ne "_cn_") { + my $h; + $h=0; + if(exists($peerBEs->{$t})) { + $h=$peerBEs->{$t}<=$modelBEs->{$t}? + $peerBEs->{$t}:$modelBEs->{$t}; # clip + $$hit+=$h; + if(defined($opt_v)) { + print "* Match: $t\n"; + } + } + } + } + if($modelBEs->{"_cn_"}!=0) { + $$score=sprintf("%07.5f",$$hit/$modelBEs->{"_cn_"}); + } + else { + # no instance of BE at this length + $$score=0; + # die "model BE has zero instance\n"; + } +} + +sub MorphStem { + my $token=shift; + my ($os,$ltoken); + + if(!defined($token)||length($token)==0) { + return undef; + } + + $ltoken=$token; + $ltoken=~tr/A-Z/a-z/; + if(exists($exceptiondb{$ltoken})) { + return $exceptiondb{$ltoken}; + } + $os=$ltoken; + return stem($os); +} + +sub createNGram { + my $text=shift; + my $g=shift; + my $NSIZE=shift; + my @mx_tokens=(); + my @m_tokens=(); + my ($i,$j); + my ($gram); + my ($count); + my ($byteSize); + + # remove stopwords + if($useStopwords) { + %stopwords=(); # consider stop words + } + unless(defined($text)) { + $g->{"_cn_"}=0; + return; + } + @mx_tokens=split(/\s+/,$text); + $byteSize=0; + for($i=0;$i<=$#mx_tokens;$i++) { + unless(exists($stopwords{$mx_tokens[$i]})) { + $byteSize+=length($mx_tokens[$i])+1; # the length of words in bytes so far + 1 space + if($mx_tokens[$i]=~/^[a-z0-9\$]/o) { + if(defined($opt_m)) { + # use stemmer + # only consider words starting with these characters + # use Porter stemmer + my $stem; + $stem=$mx_tokens[$i]; + if(length($stem)>3) { + push(@m_tokens,&MorphStem($stem)); + } + else { # no stemmer as default + push(@m_tokens,$mx_tokens[$i]); + } + } + else { # no stemmer + push(@m_tokens,$mx_tokens[$i]); + } + } + } + } + #------------------------------------- + # create ngram + $count=0; + for($i=0;$i<=$#m_tokens-$NSIZE+1;$i++) { + $gram=$m_tokens[$i]; + for($j=$i+1;$j<=$i+$NSIZE-1;$j++) { + $gram.=" $m_tokens[$j]"; + } + $count++; + unless(exists($g->{$gram})) { + $g->{$gram}=1; + } + else { + $g->{$gram}++; + } + } + # save total number of tokens + $g->{"_cn_"}=$count; +} + +sub createSkipBigram { + my $text=shift; + my $g=shift; + my $skipDistance=shift; + my @mx_tokens=(); + my @m_tokens=(); + my ($i,$j); + my ($gram); + my ($count); + my ($byteSize); + + # remove stopwords + if($useStopwords) { + %stopwords=(); # consider stop words + } + unless(defined($text)) { + $g->{"_cn_"}=0; + return; + } + @mx_tokens=split(/\s+/,$text); + $byteSize=0; + for($i=0;$i<=$#mx_tokens;$i++) { + unless(exists($stopwords{$mx_tokens[$i]})) { + $byteSize+=length($mx_tokens[$i])+1; # the length of words in bytes so far + 1 space + if($mx_tokens[$i]=~/^[a-z0-9\$]/o) { + if(defined($opt_m)) { + # use stemmer + # only consider words starting with these characters + # use Porter stemmer + my $stem; + $stem=$mx_tokens[$i]; + if(length($stem)>3) { + push(@m_tokens,&MorphStem($stem)); + } + else { # no stemmer as default + push(@m_tokens,$mx_tokens[$i]); + } + } + else { # no stemmer + push(@m_tokens,$mx_tokens[$i]); + } + } + } + } + #------------------------------------- + # create ngram + $count=0; + for($i=0;$i<$#m_tokens;$i++) { + if(defined($opt_u)) { + # add unigram count + $gram=$m_tokens[$i]; + $count++; + unless(exists($g->{$gram})) { + $g->{$gram}=1; + } + else { + $g->{$gram}++; + } + } + for($j=$i+1; + $j<=$#m_tokens&&($skipDistance<0||$j<=$i+$skipDistance+1); + $j++) { + $gram=$m_tokens[$i]; + $gram.=" $m_tokens[$j]"; + $count++; + unless(exists($g->{$gram})) { + $g->{$gram}=1; + } + else { + $g->{$gram}++; + } + } + } + # save total number of tokens + $g->{"_cn_"}=$count; +} + +sub createBE { + my $BEList=shift; + my $BEMap=shift; + my $BEMode=shift; + my ($i); + + $BEMap->{"_cn_"}=0; + unless(scalar @{$BEList} > 0) { + return; + } + for($i=0;$i<=$#{$BEList};$i++) { + my (@fds); + my ($be,$stemH,$stemM); + $be=$BEList->[$i]; + $be=~tr/A-Z/a-z/; + @fds=split(/\|/,$be); + if(@fds!=3) { + print STDERR "Basic Element (BE) input file is invalid: *$be*\n"; + print STDERR "A BE file has to be in this format per line: HEAD|MODIFIER|RELATION\n"; + die "For more infomation about BE, go to: http://www.isi.edu/~cyl/BE\n"; + } + $stemH=$fds[0]; + $stemM=$fds[1]; + if(defined($opt_m)) { + # use stemmer + # only consider words starting with these characters + # use Porter stemmer + if(length($stemH)>3) { + $stemH=&MorphStemMulti($stemH); + } + if($stemM ne "NIL"&& + length($stemM)>3) { + $stemM=&MorphStemMulti($stemM); + } + } + if($BEMode eq "H"&& + $stemM eq "nil") { + unless(exists($BEMap->{$stemH})) { + $BEMap->{$stemH}=0; + } + $BEMap->{$stemH}++; + $BEMap->{"_cn_"}++; + } + elsif($BEMode eq "HM"&& + $stemM ne "nil") { + my $pair="$stemH|$stemM"; + unless(exists($BEMap->{$pair})) { + $BEMap->{$pair}=0; + } + $BEMap->{$pair}++; + $BEMap->{"_cn_"}++; + } + elsif($BEMode eq "HMR"&& + $fds[2] ne "nil") { + my $triple="$stemH|$stemM|$fds[2]"; + unless(exists($BEMap->{$triple})) { + $BEMap->{$triple}=0; + } + $BEMap->{$triple}++; + $BEMap->{"_cn_"}++; + } + elsif($BEMode eq "HM1") { + my $pair="$stemH|$stemM"; + unless(exists($BEMap->{$pair})) { + $BEMap->{$pair}=0; + } + $BEMap->{$pair}++; + $BEMap->{"_cn_"}++; + } + elsif($BEMode eq "HMR1"&& + $fds[1] ne "nil") { + # relation can be "NIL" but modifier has to have value + my $triple="$stemH|$stemM|$fds[2]"; + unless(exists($BEMap->{$triple})) { + $BEMap->{$triple}=0; + } + $BEMap->{$triple}++; + $BEMap->{"_cn_"}++; + } + elsif($BEMode eq "HMR2") { + # modifier and relation can be "NIL" + my $triple="$stemH|$stemM|$fds[2]"; + unless(exists($BEMap->{$triple})) { + $BEMap->{$triple}=0; + } + $BEMap->{$triple}++; + $BEMap->{"_cn_"}++; + } + } +} + +sub MorphStemMulti { + my $string=shift; + my (@tokens,@stems,$t,$i); + + @tokens=split(/\s+/,$string); + foreach $t (@tokens) { + if($t=~/[A-Za-z0-9]/o&& + $t!~/(-LRB-|-RRB-|-LSB-|-RSB-|-LCB-|-RCB-)/o) { + my $s; + if(defined($s=&MorphStem($t))) { + $t=$s; + } + push(@stems,$t); + } + else { + push(@stems,$t); + } + } + return join(" ",@stems); +} + +sub tokenizeText { + my $text=shift; + my $tokenizedText=shift; + my @mx_tokens=(); + my ($i,$byteSize); + + # remove stopwords + if($useStopwords) { + %stopwords=(); # consider stop words + } + unless(defined($text)) { + return; + } + @mx_tokens=split(/\s+/,$text); + $byteSize=0; + @{$tokenizedText}=(); + for($i=0;$i<=$#mx_tokens;$i++) { + unless(exists($stopwords{$mx_tokens[$i]})) { + $byteSize+=length($mx_tokens[$i])+1; # the length of words in bytes so far + 1 space + if($mx_tokens[$i]=~/^[a-z0-9\$]/o) { + if(defined($opt_m)) { + # use stemmer + # only consider words starting with these characters + # use Porter stemmer + my $stem; + $stem=$mx_tokens[$i]; + if(length($stem)>3) { + push(@{$tokenizedText},&MorphStem($stem)); + } + else { # no stemmer as default + push(@{$tokenizedText},$mx_tokens[$i]); + } + } + else { # no stemmer + push(@{$tokenizedText},$mx_tokens[$i]); + } + } + } + } +} + +sub tokenizeText_LCS { + my $text=shift; + my $tokenizedText=shift; + my $lengthLimit=shift; + my $byteLimit=shift; + my @mx_tokens=(); + my ($i,$byteSize,$t,$done); + + # remove stopwords + if($useStopwords) { + %stopwords=(); # consider stop words + } + if(@{$text}==0) { + return; + } + $byteSize=0; + @{$tokenizedText}=(); + $done=0; + for($t=0;$t<@{$text}&&$done==0;$t++) { + @mx_tokens=split(/\s+/,$text->[$t]); + # tokenized array for each separate unit (for example, sentence) + push(@{$tokenizedText},[]); + for($i=0;$i<=$#mx_tokens;$i++) { + unless(exists($stopwords{$mx_tokens[$i]})) { + $byteSize+=length($mx_tokens[$i])+1; # the length of words in bytes so far + 1 space + if($mx_tokens[$i]=~/^[a-z0-9\$]/o) { + if(defined($opt_m)) { + # use stemmer + # only consider words starting with these characters + # use Porter stemmer + my $stem; + $stem=$mx_tokens[$i]; + if(length($stem)>3) { + push(@{$tokenizedText->[$t]},&MorphStem($stem)); + } + else { # no stemmer as default + push(@{$tokenizedText->[$t]},$mx_tokens[$i]); + } + } + else { # no stemmer + push(@{$tokenizedText->[$t]},$mx_tokens[$i]); + } + } + } + } + } +} + +# Input file configuration is a list of peer/model pair for each evaluation +# instance. Each evaluation pair is in a line separated by white spaces +# characters. +sub readFileList { + my ($ROUGEEvals)=shift; + my ($ROUGEEvalIDs)=shift; + my ($ROUGEPeerIDTable)=shift; + my ($doc)=shift; + my ($evalID,$pair); + my ($inputFormat,$peerFile,$modelFile,$peerID,$modelID); + my (@files); + + $evalID=1; # automatically generated evaluation ID starting from 1 + $peerID=$systemID; + $modelID="M"; + unless(exists($ROUGEPeerIDTable->{$peerID})) { + $ROUGEPeerIDTable->{$peerID}=1; + } + while(defined($pair=<$doc>)) { + my ($peerPath,$modelPath); + if($pair!~/^\#/o&& + $pair!~/^\s*$/o) { # Lines start with '#' is a comment line + chomp($pair); + $pair=~s/^\s+//; + $pair=~s/\s+$//; + @files=split(/\s+/,$pair); + if(scalar @files < 2) { + die "File list has to have at least 2 filenames per line (peer model1 model2 ... modelN)\n"; + } + $peerFile=$files[0]; + unless(exists($ROUGEEvals->{$evalID})) { + $ROUGEEvals->{$evalID}={}; + push(@{$ROUGEEvalIDs},$evalID); + $ROUGEEvals->{$evalID}{"IF"}=$opt_z; + } + unless(exists($ROUGEPeerIDTable->{$peerID})) { + $ROUGEPeerIDTable->{$peerID}=1; # save peer ID for reference + } + if(exists($ROUGEEvals->{$evalID})) { + unless(exists($ROUGEEvals->{$evalID}{"Ps"})) { + $ROUGEEvals->{$evalID}{"Ps"}={}; + $ROUGEEvals->{$evalID}{"PIDList"}=[]; + } + push(@{$ROUGEEvals->{$evalID}{"PIDList"}},$peerID); # save peer IDs + } + else { + die "(PEERS) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + # remove leading and trailing newlines and + # spaces + if(exists($ROUGEEvals->{$evalID}{"Ps"})) { + $ROUGEEvals->{$evalID}{"Ps"}{$peerID}=$peerFile; # save peer filename + } + else { + die "(P) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + for($mid=1;$mid<=$#files;$mid++) { + $modelFile=$files[$mid]; + if(exists($ROUGEEvals->{$evalID})) { + unless(exists($ROUGEEvals->{$evalID}{"Ms"})) { + $ROUGEEvals->{$evalID}{"Ms"}={}; + $ROUGEEvals->{$evalID}{"MIDList"}=[]; + } + push(@{$ROUGEEvals->{$evalID}{"MIDList"}},"$modelID.$mid"); # save model IDs + } + else { + die "(MODELS) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + # remove leading and trailing newlines and + # spaces + if(exists($ROUGEEvals->{$evalID}{"Ms"})) { + $ROUGEEvals->{$evalID}{"Ms"}{"$modelID.$mid"}=$modelFile; # save peer filename + } + else { + die "(M) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + } + $evalID++; + } + } +} + +# read and parse ROUGE evaluation file +sub readEvals { + my ($ROUGEEvals)=shift; + my ($ROUGEEvalIDs)=shift; + my ($ROUGEPeerIDTable)=shift; + my ($node)=shift; + my ($evalID)=shift; + my ($inputFormat,$peerRoot,$modelRoot,$peerFile,$modelFile,$peerID,$modelID); + + if(defined($opt_z)) { + # Input file configuration is a list of peer/model pair for each evaluation + # instance. Each evaluation pair is in a line separated by white spaces + # characters. + &readFileList($ROUGEEvals,$ROUGEEvalIDs,$ROUGEPeerIDTable,$node); + return; + } + # Otherwise, the input file is the standard ROUGE XML evaluation configuration + # file. + if($node->getNodeType==ELEMENT_NODE|| + $node->getNodeType==DOCUMENT_NODE) { + if($node->getNodeType==ELEMENT_NODE) { + $nodeName=$node->getNodeName; + if($nodeName=~/^EVAL$/oi) { + $evalID=$node->getAttributeNode("ID")->getValue; + unless(exists($ROUGEEvals->{$evalID})) { + $ROUGEEvals->{$evalID}={}; + push(@{$ROUGEEvalIDs},$evalID); + } + foreach my $child ($node->getChildNodes()) { + &readEvals($ROUGEEvals,$ROUGEEvalIDs,$ROUGEPeerIDTable,$child,$evalID); + } + } + elsif($nodeName=~/^INPUT-FORMAT$/oi) { + $inputFormat=$node->getAttributeNode("TYPE")->getValue; + if($inputFormat=~/^(SEE|ISI|SPL|SIMPLE)$/oi) { # SPL: one sentence per line + if(exists($ROUGEEvals->{$evalID})) { + $ROUGEEvals->{$evalID}{"IF"}=$inputFormat; + } + else { + die "(INPUT-FORMAT) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + } + else { + die "Unknown input type: $inputFormat\n"; + } + } + elsif($nodeName=~/^PEER-ROOT$/oi) { + foreach my $child ($node->getChildNodes()) { + if($child->getNodeType==TEXT_NODE) { + $peerRoot=$child->getData; + # remove leading and trailing newlines and + # spaces + $peerRoot=~s/^[\n\s]+//; + $peerRoot=~s/[\n\s]+$//; + if(exists($ROUGEEvals->{$evalID})) { + $ROUGEEvals->{$evalID}{"PR"}=$peerRoot; + } + else { + die "(PEER-ROOT) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + } + } + } + elsif($nodeName=~/^MODEL-ROOT$/oi) { + foreach my $child ($node->getChildNodes()) { + if($child->getNodeType==TEXT_NODE) { + $modelRoot=$child->getData; + # remove leading and trailing newlines and + # spaces + $modelRoot=~s/^[\n\s]+//; + $modelRoot=~s/[\n\s]+$//; + if(exists($ROUGEEvals->{$evalID})) { + $ROUGEEvals->{$evalID}{"MR"}=$modelRoot; + } + else { + die "(MODEL-ROOT) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + } + } + } + elsif($nodeName=~/^PEERS$/oi) { + foreach my $child ($node->getChildNodes()) { + if($child->getNodeType==ELEMENT_NODE&& + $child->getNodeName=~/^P$/oi) { + $peerID=$child->getAttributeNode("ID")->getValue; + unless(exists($ROUGEPeerIDTable->{$peerID})) { + $ROUGEPeerIDTable->{$peerID}=1; # save peer ID for reference + } + if(exists($ROUGEEvals->{$evalID})) { + unless(exists($ROUGEEvals->{$evalID}{"Ps"})) { + $ROUGEEvals->{$evalID}{"Ps"}={}; + $ROUGEEvals->{$evalID}{"PIDList"}=[]; + } + push(@{$ROUGEEvals->{$evalID}{"PIDList"}},$peerID); # save peer IDs + } + else { + die "(PEERS) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + foreach my $grandchild ($child->getChildNodes()) { + if($grandchild->getNodeType==TEXT_NODE) { + $peerFile=$grandchild->getData; + # remove leading and trailing newlines and + # spaces + $peerFile=~s/^[\n\s]+//; + $peerFile=~s/[\n\s]+$//; + if(exists($ROUGEEvals->{$evalID}{"Ps"})) { + $ROUGEEvals->{$evalID}{"Ps"}{$peerID}=$peerFile; # save peer filename + } + else { + die "(P) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + } + } + } + } + } + elsif($nodeName=~/^MODELS$/oi) { + foreach my $child ($node->getChildNodes()) { + if($child->getNodeType==ELEMENT_NODE&& + $child->getNodeName=~/^M$/oi) { + $modelID=$child->getAttributeNode("ID")->getValue; + if(exists($ROUGEEvals->{$evalID})) { + unless(exists($ROUGEEvals->{$evalID}{"Ms"})) { + $ROUGEEvals->{$evalID}{"Ms"}={}; + $ROUGEEvals->{$evalID}{"MIDList"}=[]; + } + push(@{$ROUGEEvals->{$evalID}{"MIDList"}},$modelID); # save model IDs + } + else { + die "(MODELS) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + foreach my $grandchild ($child->getChildNodes()) { + if($grandchild->getNodeType==TEXT_NODE) { + $modelFile=$grandchild->getData; + # remove leading and trailing newlines and + # spaces + $modelFile=~s/^[\n\s]+//; + $modelFile=~s/[\n\s]+$//; + if(exists($ROUGEEvals->{$evalID}{"Ms"})) { + $ROUGEEvals->{$evalID}{"Ms"}{$modelID}=$modelFile; # save peer filename + } + else { + die "(M) Evaluation database does not contain entry for this evaluation ID: $evalID\n"; + } + } + } + } + } + } + else { + foreach my $child ($node->getChildNodes()) { + &readEvals($ROUGEEvals,$ROUGEEvalIDs,$ROUGEPeerIDTable,$child,$evalID); + } + } + } + else { + foreach my $child ($node->getChildNodes()) { + &readEvals($ROUGEEvals,$ROUGEEvalIDs,$ROUGEPeerIDTable,$child,$evalID); + } + } + } + else { + if(defined($node->getChildNodes())) { + foreach my $child ($node->getChildNodes()) { + &readEvals($ROUGEEvals,$ROUGEEvalIDs,$ROUGEPeerIDTable,$child,$evalID); + } + } + } +} + +# Porter stemmer in Perl. Few comments, but it's easy to follow against the rules in the original +# paper, in +# +# Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14, +# no. 3, pp 130-137, +# +# see also http://www.tartarus.org/~martin/PorterStemmer + +# Release 1 + +local %step2list; +local %step3list; +local ($c, $v, $C, $V, $mgr0, $meq1, $mgr1, $_v); + + +sub stem + { my ($stem, $suffix, $firstch); + my $w = shift; + if (length($w) < 3) { return $w; } # length at least 3 + # now map initial y to Y so that the patterns never treat it as vowel: + $w =~ /^./; $firstch = $&; + if ($firstch =~ /^y/) { $w = ucfirst $w; } + + # Step 1a + if ($w =~ /(ss|i)es$/) { $w=$`.$1; } + elsif ($w =~ /([^s])s$/) { $w=$`.$1; } + # Step 1b + if ($w =~ /eed$/) { if ($` =~ /$mgr0/o) { chop($w); } } + elsif ($w =~ /(ed|ing)$/) + { $stem = $`; + if ($stem =~ /$_v/o) + { $w = $stem; + if ($w =~ /(at|bl|iz)$/) { $w .= "e"; } + elsif ($w =~ /([^aeiouylsz])\1$/) { chop($w); } + elsif ($w =~ /^${C}${v}[^aeiouwxy]$/o) { $w .= "e"; } + } +} +# Step 1c + if ($w =~ /y$/) { $stem = $`; if ($stem =~ /$_v/o) { $w = $stem."i"; } } + +# Step 2 +if ($w =~ /(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/) + { $stem = $`; $suffix = $1; + if ($stem =~ /$mgr0/o) { $w = $stem . $step2list{$suffix}; } + } + +# Step 3 + +if ($w =~ /(icate|ative|alize|iciti|ical|ful|ness)$/) + { $stem = $`; $suffix = $1; + if ($stem =~ /$mgr0/o) { $w = $stem . $step3list{$suffix}; } + } + +# Step 4 + + # CYL: Modified 02/14/2004, a word ended in -ement will not try the rules "-ment" and "-ent" +# if ($w =~ /(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/) +# elsif ($w =~ /(s|t)(ion)$/) +# { $stem = $` . $1; if ($stem =~ /$mgr1/o) { $w = $stem; } } + if ($w =~ /(al|ance|ence|er|ic|able|ible|ant|ement|ou|ism|ate|iti|ous|ive|ize)$/) + { $stem = $`; if ($stem =~ /$mgr1/o) { $w = $stem; } } + if ($w =~ /ment$/) + { $stem = $`; if ($stem =~ /$mgr1/o) { $w = $stem; } } + if ($w =~ /ent$/) + { $stem = $`; if ($stem =~ /$mgr1/o) { $w = $stem; } } + elsif ($w =~ /(s|t)(ion)$/) + { $stem = $` . $1; if ($stem =~ /$mgr1/o) { $w = $stem; } } + +# Step 5 + +if ($w =~ /e$/) + { $stem = $`; + if ($stem =~ /$mgr1/o or + ($stem =~ /$meq1/o and not $stem =~ /^${C}${v}[^aeiouwxy]$/o)) +{ $w = $stem; } +} +if ($w =~ /ll$/ and $w =~ /$mgr1/o) { chop($w); } + +# and turn initial Y back to y +if ($firstch =~ /^y/) { $w = lcfirst $w; } +return $w; +} + + sub initialise { + + %step2list = + ( 'ational'=>'ate', 'tional'=>'tion', 'enci'=>'ence', 'anci'=>'ance', 'izer'=>'ize', 'bli'=>'ble', + 'alli'=>'al', 'entli'=>'ent', 'eli'=>'e', 'ousli'=>'ous', 'ization'=>'ize', 'ation'=>'ate', + 'ator'=>'ate', 'alism'=>'al', 'iveness'=>'ive', 'fulness'=>'ful', 'ousness'=>'ous', 'aliti'=>'al', + 'iviti'=>'ive', 'biliti'=>'ble', 'logi'=>'log'); + + %step3list = + ('icate'=>'ic', 'ative'=>'', 'alize'=>'al', 'iciti'=>'ic', 'ical'=>'ic', 'ful'=>'', 'ness'=>''); + + + $c = "[^aeiou]"; # consonant + $v = "[aeiouy]"; # vowel + $C = "${c}[^aeiouy]*"; # consonant sequence + $V = "${v}[aeiou]*"; # vowel sequence + + $mgr0 = "^(${C})?${V}${C}"; # [C]VC... is m>0 + $meq1 = "^(${C})?${V}${C}(${V})?" . '$'; # [C]VC[V] is m=1 + $mgr1 = "^(${C})?${V}${C}${V}${C}"; # [C]VCVC... is m>1 + $_v = "^(${C})?${v}"; # vowel in stem + +} + diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/WordNet-1.6.exc.db b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/WordNet-1.6.exc.db new file mode 100644 index 0000000000000000000000000000000000000000..68cd6010c9392b3cea4b5488ee089cd993ee9b6f GIT binary patch literal 638976 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¬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

^H+#nypLB>E009dwR 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ʚ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�N=p^aE(#^ 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

T%UbvJQ5wTv1e8?*0 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%0DaLSpHu5>hd?rUoU?J|Np1T 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 I{B#EY2Rz)dRsaA1 literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adj.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adj.exc new file mode 100644 index 0000000..db59aa6 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adj.exc @@ -0,0 +1,1322 @@ +after after +airier airy +airiest airy +angrier angry +angriest angry +artier arty +artiest arty +ashier ashy +ashiest ashy +baggier baggy +baggiest baggy +balkier balky +balkiest balky +balmier balmy +balmiest balmy +bandier bandy +bandiest bandy +barmier barmy +barmiest barmy +battier batty +battiest batty +baulkier baulky +baulkiest baulky +bawdier bawdy +bawdiest bawdy +beadier beady +beadiest beady +beastlier beastly +beastliest beastly +beefier beefy +beefiest beefy +beerier beery +beeriest beery +bendier bendy +bendiest bendy +bigger big +biggest big +bitchier bitchy +bitchiest bitchy +bittier bitty +bittiest bitty +blearier bleary +bleariest bleary +bloodier bloody +bloodiest bloody +bloodthirstier bloodthirsty +bloodthirstiest bloodthirsty +blowier blowy +blowiest blowy +blowsier blowsy +blowsiest blowsy +blowzier blowzy +blowziest blowzy +bluer blue +bluest blue +bonier bony +boniest bony +bonnier bonny +bonniest bonny +boozier boozy +booziest boozy +boskier bosky +boskiest bosky +bossier bossy +bossiest bossy +botchier botchy +botchiest botchy +bother bother +bouncier bouncy +bounciest bouncy +brainier brainy +brainiest brainy +brashier brashy +brashiest brashy +brassier brassy +brassiest brassy +brawnier brawny +brawniest brawny +breathier breathy +breathiest breathy +breezier breezy +breeziest breezy +brinier briny +briniest briny +broodier broody +broodiest broody +bubblier bubbly +bubbliest bubbly +buggier buggy +buggiest buggy +bulkier bulky +bulkiest bulky +bumpier bumpy +bumpiest bumpy +bunchier bunchy +bunchiest bunchy +burlier burly +burliest burly +burrier burry +burriest burry +bushier bushy +bushiest bushy +busier busy +busiest busy +bustier busty +bustiest busty +cagier cagey +cagiest cagey +cannier canny +canniest canny +cantier canty +cantiest canty +catchier catchy +catchiest catchy +cattier catty +cattiest catty +chancier chancy +chanciest chancy +charier chary +chariest chary +chattier chatty +chattiest chatty +cheekier cheeky +cheekiest cheeky +cheerier cheery +cheeriest cheery +cheesier cheesy +cheesiest cheesy +chestier chesty +chestiest chesty +chewier chewy +chewiest chewy +chillier chilly +chilliest chilly +chintzier chintzy +chintziest chintzy +chippier chippy +chippiest chippy +choosier choosy +choosiest choosy +choppier choppy +choppiest choppy +chubbier chubby +chubbiest chubby +chuffier chuffy +chuffiest chuffy +chummier chummy +chummiest chummy +chunkier chunky +chunkiest chunky +churchier churchy +churchiest churchy +clammier clammy +clammiest clammy +classier classy +classiest classy +cleanlier cleanly +cleanliest cleanly +clerklier clerkly +clerkliest clerkly +cloudier cloudy +cloudiest cloudy +clubbier clubby +clubbiest clubby +clumsier clumsy +clumsiest clumsy +cockier cocky +cockiest cocky +collier colly +colliest colly +comelier comely +comeliest comely +comfier comfy +comfiest comfy +cornier corny +corniest corny +cosier cosy +cosiest cosy +costlier costly +costliest costly +courtlier courtly +courtliest courtly +cozier cozy +coziest cozy +crabbier crabby +crabbiest crabby +craftier crafty +craftiest crafty +craggier craggy +craggiest craggy +crankier cranky +crankiest cranky +crawlier crawly +crawliest crawly +crazier crazy +craziest crazy +creamier creamy +creamiest creamy +creepier creepy +creepiest creepy +crispier crispy +crispiest crispy +crumbier crumby +crumbiest crumby +crumblier crumbly +crumbliest crumbly +crummier crummy +crummiest crummy +crustier crusty +crustiest crusty +curlier curly +curliest curly +daffier daffy +daffiest daffy +daintier dainty +daintiest dainty +dandier dandy +dandiest dandy +deadlier deadly +deadliest deadly +dewier dewy +dewiest dewy +dicier dicey +diciest dicey +dimmer dim +dimmest dim +dingier dingy +dingiest dingy +dinkier dinky +dinkiest dinky +dippier dippy +dippiest dippy +dirtier dirty +dirtiest dirty +dishier dishy +dishiest dishy +dizzier dizzy +dizziest dizzy +dodgier dodgy +dodgiest dodgy +dopier dopey +dopiest dopey +dottier dotty +dottiest dotty +doughier doughy +doughiest doughy +doughtier doughty +doughtiest doughty +dowdier dowdy +dowdiest dowdy +dowier dowie dowy +dowiest dowie dowy +downier downy +downiest downy +dozier dozy +doziest dozy +drabber drab +drabbest drab +draftier drafty +draftiest drafty +draggier draggy +draggiest draggy +draughtier draughty +draughtiest draughty +dreamier dreamy +dreamiest dreamy +drearier dreary +dreariest dreary +dreggier dreggy +dreggiest dreggy +dressier dressy +dressiest dressy +drier dry +driest dry +drippier drippy +drippiest drippy +drowsier drowsy +drowsiest drowsy +dryer dry +dryest dry +dumpier dumpy +dumpiest dumpy +dunner dun +dunnest dun +duskier dusky +duskiest dusky +dustier dusty +dustiest dusty +earlier early +earliest early +earthier earthy +earthiest earthy +earthlier earthly +earthliest earthly +easier easy +easiest easy +edgier edgy +edgiest edgy +eerier eerie +eeriest eerie +emptier empty +emptiest empty +fancier fancy +fanciest fancy +fatter fat +fattest fat +fattier fatty +fattiest fatty +faultier faulty +faultiest faulty +feistier feisty +feistiest feisty +fiddlier fiddly +fiddliest fiddly +filmier filmy +filmiest filmy +filthier filthy +filthiest filthy +finnier finny +finniest finny +fishier fishy +fishiest fishy +fitter fit +fittest fit +flabbier flabby +flabbiest flabby +flaggier flaggy +flaggiest flaggy +flakier flaky +flakiest flaky +flashier flashy +flashiest flashy +flatter flat +flattest flat +flauntier flaunty +flauntiest flaunty +fledgier fledgy +fledgiest fledgy +fleecier fleecy +fleeciest fleecy +fleshier fleshy +fleshiest fleshy +fleshlier fleshly +fleshliest fleshly +flightier flighty +flightiest flighty +flimsier flimsy +flimsiest flimsy +flintier flinty +flintiest flinty +floatier floaty +floatiest floaty +floppier floppy +floppiest floppy +flossier flossy +flossiest flossy +fluffier fluffy +fluffiest fluffy +flukier fluky +flukiest fluky +foamier foamy +foamiest foamy +foggier foggy +foggiest foggy +folksier folksy +folksiest folksy +foolhardier foolhardy +foolhardiest foolhardy +forest forest +foxier foxy +foxiest foxy +fratchier fratchy +fratchiest fratchy +freakier freaky +freakiest freaky +freer free +freest free +frenchier frenchy +frenchiest frenchy +friendlier friendly +friendliest friendly +friskier frisky +friskiest frisky +frizzier frizzy +frizziest frizzy +frizzlier frizzly +frizzliest frizzly +frostier frosty +frostiest frosty +frouzier frouzy +frouziest frouzy +frowsier frowsy +frowsiest frowsy +frowzier frowzy +frowziest frowzy +fruitier fruity +fruitiest fruity +funkier funky +funkiest funky +funnier funny +funniest funny +furrier furry +furriest furry +fussier fussy +fussiest fussy +fustier fusty +fustiest fusty +fuzzier fuzzy +fuzziest fuzzy +gabbier gabby +gabbiest gabby +gamier gamy +gamiest gamy +gammier gammy +gammiest gammy +gassier gassy +gassiest gassy +gaudier gaudy +gaudiest gaudy +gauzier gauzy +gauziest gauzy +gawkier gawky +gawkiest gawky +ghastlier ghastly +ghastliest ghastly +ghostlier ghostly +ghostliest ghostly +giddier giddy +giddiest giddy +gladder glad +gladdest glad +glassier glassy +glassiest glassy +glibber glib +glibbest glib +gloomier gloomy +gloomiest gloomy +glossier glossy +glossiest glossy +glummer glum +glummest glum +godlier godly +godliest godly +goodlier goodly +goodliest goodly +goofier goofy +goofiest goofy +gooier gooey +gooiest gooey +goosier goosy +goosiest goosy +gorier gory +goriest gory +gradelier gradely +gradeliest gradely +grainier grainy +grainiest grainy +grassier grassy +grassiest grassy +greasier greasy +greasiest greasy +greedier greedy +greediest greedy +grimmer grim +grimmest grim +grislier grisly +grisliest grisly +grittier gritty +grittiest gritty +grizzlier grizzly +grizzliest grizzly +groggier groggy +groggiest groggy +groovier groovy +grooviest groovy +grottier grotty +grottiest grotty +groutier grouty +groutiest grouty +grubbier grubby +grubbiest grubby +grumpier grumpy +grumpiest grumpy +guiltier guilty +guiltiest guilty +gummier gummy +gummiest gummy +gushier gushy +gushiest gushy +gustier gusty +gustiest gusty +gutsier gutsy +gutsiest gutsy +hairier hairy +hairiest hairy +halfways halfway +hammier hammy +hammiest hammy +handier handy +handiest handy +happier happy +happiest happy +hardier hardy +hardiest hardy +hastier hasty +hastiest hasty +haughtier haughty +haughtiest haughty +hazier hazy +haziest hazy +headier heady +headiest heady +healthier healthy +healthiest healthy +heartier hearty +heartiest hearty +heavier heavy +heaviest heavy +heftier hefty +heftiest hefty +hepper hep +heppest hep +herbier herby +herbiest herby +hinder hind +hipper hip +hippest hip +hippier hippy +hippiest hippy +hoarier hoary +hoariest hoary +holier holy +holiest holy +homelier homely +homeliest homely +homier homey +homiest homey +hornier horny +horniest horny +horsier horsy +horsiest horsy +hotter hot +hottest hot +humpier humpy +humpiest humpy +hungrier hungry +hungriest hungry +huskier husky +huskiest husky +icier icy +iciest icy +inkier inky +inkiest inky +jaggier jaggy +jaggiest jaggy +jammier jammy +jammiest jammy +jauntier jaunty +jauntiest jaunty +jazzier jazzy +jazziest jazzy +jerkier jerky +jerkiest jerky +jollier jolly +jolliest jolly +juicier juicy +juiciest juicy +jumpier jumpy +jumpiest jumpy +kindlier kindly +kindliest kindly +kinkier kinky +kinkiest kinky +knottier knotty +knottiest knotty +knurlier knurly +knurliest knurly +kookier kooky +kookiest kooky +lacier lacy +laciest lacy +lairier lairy +lairiest lairy +lakier laky +lakiest laky +lankier lanky +lankiest lanky +lathier lathy +lathiest lathy +layer layer +lazier lazy +laziest lazy +leafier leafy +leafiest leafy +leakier leaky +leakiest leaky +learier leary +leariest leary +leerier leery +leeriest leery +leggier leggy +leggiest leggy +lengthier lengthy +lengthiest lengthy +limier limy +limiest limy +lippier lippy +lippiest lippy +livelier lively +liveliest lively +loftier lofty +loftiest lofty +logier logy +logiest logy +lonelier lonely +loneliest lonely +loonier loony +looniest loony +loopier loopy +loopiest loopy +lordlier lordly +lordliest lordly +lousier lousy +lousiest lousy +lovelier lovely +loveliest lovely +lowlier lowly +lowliest lowly +luckier lucky +luckiest lucky +lumpier lumpy +lumpiest lumpy +lunier luny +luniest luny +lustier lusty +lustiest lusty +madder mad +maddest mad +maltier malty +maltiest malty +mangier mangy +mangiest mangy +mankier manky +mankiest manky +manlier manly +manliest manly +marshier marshy +marshiest marshy +massier massy +massiest massy +matter matter +maungier maungy +maungiest maungy +mazier mazy +maziest mazy +mealier mealy +mealiest mealy +measlier measly +measliest measly +meatier meaty +meatiest meaty +merrier merry +merriest merry +messier messy +messiest messy +miffier miffy +miffiest miffy +mightier mighty +mightiest mighty +milkier milky +milkiest milky +mingier mingy +mingiest mingy +mirkier mirky +mirkiest mirky +mistier misty +mistiest misty +modest modest +moldier moldy +moldiest moldy +moodier moody +moodiest moody +moonier moony +mooniest moony +mothier mothy +mothiest mothy +mouldier mouldy +mouldiest mouldy +mousier mousy +mousiest mousy +mouthier mouthy +mouthiest mouthy +muckier mucky +muckiest mucky +muddier muddy +muddiest muddy +muggier muggy +muggiest muggy +murkier murky +murkiest murky +mushier mushy +mushiest mushy +muskier musky +muskiest musky +mustier musty +mustiest musty +muzzier muzzy +muzziest muzzy +nappier nappy +nappiest nappy +nastier nasty +nastiest nasty +nattier natty +nattiest natty +naughtier naughty +naughtiest naughty +needier needy +neediest needy +nervier nervy +nerviest nervy +newsier newsy +newsiest newsy +niftier nifty +niftiest nifty +nippier nippy +nippiest nippy +nittier nitty +nittiest nitty +noisier noisy +noisiest noisy +nosier nosy +nosiest nosy +nuttier nutty +nuttiest nutty +oilier oily +oiliest oily +oozier oozy +ooziest oozy +pallier pally +palliest pally +palmier palmy +palmiest palmy +paltrier paltry +paltriest paltry +pappier pappy +pappiest pappy +parkier parky +parkiest parky +pastier pasty +pastiest pasty +patchier patchy +patchiest patchy +pawkier pawky +pawkiest pawky +peachier peachy +peachiest peachy +pearlier pearly +pearliest pearly +peppier peppy +peppiest peppy +perkier perky +perkiest perky +peskier pesky +peskiest pesky +pettier petty +pettiest petty +phonier phony +phoniest phony +pickier picky +pickiest picky +piggier piggy +piggiest piggy +pinier piny +piniest piny +pitchier pitchy +pitchiest pitchy +pithier pithy +pithiest pithy +plashier plashy +plashiest plashy +platier platy +platiest platy +pluckier plucky +pluckiest plucky +plumier plumy +plumiest plumy +plummier plummy +plummiest plummy +podgier podgy +podgiest podgy +pokier poky +pokiest poky +porkier porky +porkiest porky +portlier portly +portliest portly +pottier potty +pottiest potty +preachier preachy +preachiest preachy +prettier pretty +prettiest pretty +pricier pricy +priciest pricy +pricklier prickly +prickliest prickly +priestlier priestly +priestliest priestly +primmer prim +primmest prim +princelier princely +princeliest princely +prissier prissy +prissiest prissy +privier privy +priviest privy +prosier prosy +prosiest prosy +pudgier pudgy +pudgiest pudgy +puffier puffy +puffiest puffy +pulpier pulpy +pulpiest pulpy +punchier punchy +punchiest punchy +punier puny +puniest puny +pushier pushy +pushiest pushy +pussier pussy +pussiest pussy +quaggier quaggy +quaggiest quaggy +quakier quaky +quakiest quaky +queasier queasy +queasiest queasy +queenlier queenly +queenliest queenly +racier racy +raciest racy +rainier rainy +rainiest rainy +randier randy +randiest randy +rangier rangy +rangiest rangy +rattier ratty +rattiest ratty +rattlier rattly +rattliest rattly +raunchier raunchy +raunchiest raunchy +readier ready +readiest ready +redder red +reddest red +reedier reedy +reediest reedy +rimier rimy +rimiest rimy +riskier risky +riskiest risky +ritzier ritzy +ritziest ritzy +rockier rocky +rockiest rocky +roilier roily +roiliest roily +rookier rooky +rookiest rooky +roomier roomy +roomiest roomy +ropier ropy +ropiest ropy +rosier rosy +rosiest rosy +rowdier rowdy +rowdiest rowdy +ruddier ruddy +ruddiest ruddy +runnier runny +runniest runny +rushier rushy +rushiest rushy +rustier rusty +rustiest rusty +ruttier rutty +ruttiest rutty +sadder sad +saddest sad +saltier salty +saltiest salty +sandier sandy +sandiest sandy +sappier sappy +sappiest sappy +sassier sassy +sassiest sassy +sauccier saucy +saucciest saucy +savvier savvy +savviest savvy +scabbier scabby +scabbiest scabby +scalier scaly +scaliest scaly +scantier scanty +scantiest scanty +scarier scary +scariest scary +scraggier scraggy +scraggiest scraggy +scragglier scraggly +scraggliest scraggly +scrappier scrappy +scrappiest scrappy +scrawnier scrawny +scrawniest scrawny +screwier screwy +screwiest screwy +scrubbier scrubby +scrubbiest scrubby +scruffier scruffy +scruffiest scruffy +scungier scungy +scungiest scungy +scurvier scurvy +scurviest scurvy +seamier seamy +seamiest seamy +seedier seedy +seediest seedy +seemlier seemly +seemliest seemly +sexier sexy +sexiest sexy +shabbier shabby +shabbiest shabby +shadier shady +shadiest shady +shaggier shaggy +shaggiest shaggy +shakier shaky +shakiest shaky +shapelier shapely +shapeliest shapely +shier shy +shiest shy +shiftier shifty +shiftiest shifty +shinier shiny +shiniest shiny +shirtier shirty +shirtiest shirty +shoddier shoddy +shoddiest shoddy +showier showy +showiest showy +shrubbier shrubby +shrubbiest shrubby +shyer shy +shyest shy +sicklier sickly +sickliest sickly +sightlier sightly +sightliest sightly +silkier silky +silkiest silky +sillier silly +silliest silly +sketchier sketchy +sketchiest sketchy +skimpier skimpy +skimpiest skimpy +skinnier skinny +skinniest skinny +slaphappier slaphappy +slaphappiest slaphappy +slatier slaty +slatiest slaty +sleazier sleazy +sleaziest sleazy +sleepier sleepy +sleepiest sleepy +slier sly +sliest sly +slimier slimy +slimiest slimy +slimmer slim +slimmest slim +slimsier slimsy +slimsiest slimsy +slinkier slinky +slinkiest slinky +slippier slippy +slippiest slippy +sloppier sloppy +sloppiest sloppy +slyer sly +slyest sly +smarmier smarmy +smarmiest smarmy +smellier smelly +smelliest smelly +smokier smoky +smokiest smoky +smugger smug +smuggest smug +snakier snaky +snakiest snaky +snappier snappy +snappiest snappy +snatchier snatchy +snatchiest snatchy +snazzier snazzy +snazziest snazzy +sniffier sniffy +sniffiest sniffy +snootier snooty +snootiest snooty +snottier snotty +snottiest snotty +snowier snowy +snowiest snowy +snuffier snuffy +snuffiest snuffy +snugger snug +snuggest snug +soapier soapy +soapiest soapy +soggier soggy +soggiest soggy +sonsier sonsy +sonsiest sonsy +sootier sooty +sootiest sooty +soppier soppy +soppiest soppy +sorrier sorry +sorriest sorry +soupier soupy +soupiest soupy +speedier speedy +speediest speedy +spicier spicy +spiciest spicy +spiffier spiffy +spiffiest spiffy +spikier spiky +spikiest spiky +spindlier spindly +spindliest spindly +spinier spiny +spiniest spiny +splashier splashy +splashiest splashy +spongier spongy +spongiest spongy +spookier spooky +spookiest spooky +spoonier spoony +spooniest spoony +sportier sporty +sportiest sporty +spottier spotty +spottiest spotty +sprier spry +spriest spry +sprightlier sprightly +sprightliest sprightly +springier springy +springiest springy +squashier squashy +squashiest squashy +squiffier squiffy +squiffiest squiffy +stagier stagy +stagiest stagy +stalkier stalky +stalkiest stalky +starchier starchy +starchiest starchy +starrier starry +starriest starry +statelier stately +stateliest stately +steadier steady +steadiest steady +stealthier stealthy +stealthiest stealthy +steamier steamy +steamiest steamy +stingier stingy +stingiest stingy +stockier stocky +stockiest stocky +stodgier stodgy +stodgiest stodgy +stonier stony +stoniest stony +stormier stormy +stormiest stormy +streakier streaky +streakiest streaky +streamier streamy +streamiest streamy +stretchier stretchy +stretchiest stretchy +stringier stringy +stringiest stringy +stripier stripy +stripiest stripy +stronger strong +strongest strong +stroppier stroppy +stroppiest stroppy +stuffier stuffy +stuffiest stuffy +stumpier stumpy +stumpiest stumpy +sturdier sturdy +sturdiest sturdy +sulkier sulky +sulkiest sulky +sultrier sultry +sultriest sultry +sunnier sunny +sunniest sunny +surlier surly +surliest surly +swankier swanky +swankiest swanky +swarthier swarthy +swarthiest swarthy +sweatier sweaty +sweatiest sweaty +tackier tacky +tackiest tacky +talkier talky +talkiest talky +tangier tangy +tangiest tangy +tanner tan +tannest tan +tardier tardy +tardiest tardy +tastier tasty +tastiest tasty +tattier tatty +tattiest tatty +tawdrier tawdry +tawdriest tawdry +techier techy +techiest techy +teenier teeny +teeniest teeny +testier testy +testiest testy +tetchier tetchy +tetchiest tetchy +thinner thin +thinnest thin +thirstier thirsty +thirstiest thirsty +thornier thorny +thorniest thorny +threadier thready +threadiest thready +thriftier thrifty +thriftiest thrifty +throatier throaty +throatiest throaty +tidier tidy +tidiest tidy +timelier timely +timeliest timely +tinier tiny +tiniest tiny +tinnier tinny +tinniest tinny +tipsier tipsy +tipsiest tipsy +tonier tony +toniest tony +toothier toothy +toothiest toothy +touchier touchy +touchiest touchy +trashier trashy +trashiest trashy +trendier trendy +trendiest trendy +trickier tricky +trickiest tricky +tricksier tricksy +tricksiest tricksy +trimmer trim +trimmest trim +truer true +truest true +trustier trusty +trustiest trusty +tubbier tubby +tubbiest tubby +turfier turfy +turfiest turfy +tweedier tweedy +tweediest tweedy +twiggier twiggy +twiggiest twiggy +uglier ugly +ugliest ugly +unfriendlier unfriendly +unfriendliest unfriendly +ungainlier ungainly +ungainliest ungainly +ungodlier ungodly +ungodliest ungodly +unhappier unhappy +unhappiest unhappy +unhealthier unhealthy +unhealthiest unhealthy +unholier unholy +unholiest unholy +unrulier unruly +unruliest unruly +untidier untidy +untidiest untidy +vastier vasty +vastiest vasty +viewier viewy +viewiest viewy +wackier wacky +wackiest wacky +wanner wan +wannest wan +warier wary +wariest wary +washier washy +washiest washy +wavier wavy +waviest wavy +waxier waxy +waxiest waxy +weaklier weakly +weakliest weakly +wealthier wealthy +wealthiest wealthy +wearier weary +weariest weary +webbier webby +webbiest webby +weedier weedy +weediest weedy +weenier weeny +weeniest weeny +weensier weensy +weensiest weensy +weepier weepy +weepiest weepy +weightier weighty +weightiest weighty +wetter wet +wettest wet +whackier whacky +whackiest whacky +whimsier whimsy +whimsiest whimsy +wieldier wieldy +wieldiest wieldy +wilier wily +wiliest wily +windier windy +windiest windy +winier winy +winiest winy +winterier wintery +winteriest wintery +wintrier wintry +wintriest wintry +wirier wiry +wiriest wiry +wispier wispy +wispiest wispy +wittier witty +wittiest witty +wonkier wonky +wonkiest wonky +woodier woody +woodiest woody +woodsier woodsy +woodsiest woodsy +woollier woolly +woolliest woolly +woozier woozy +wooziest woozy +wordier wordy +wordiest wordy +worldlier worldly +worldliest worldly +wormier wormy +wormiest wormy +worthier worthy +worthiest worthy +wrier wry +wriest wry +wryer wry +wryest wry +yarer yare +yarest yare +yeastier yeasty +yeastiest yeasty +younger young +youngest young +yummier yummy +yummiest yummy +zanier zany +zaniest zany +zippier zippy +zippiest zippy diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adv.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adv.exc new file mode 100644 index 0000000..5ddf085 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/adv.exc @@ -0,0 +1,7 @@ +best well +better well +deeper deeply +farther far +further far +harder hard +hardest hard diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/buildExeptionDB.pl b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/buildExeptionDB.pl new file mode 100644 index 0000000..45c35df --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/buildExeptionDB.pl @@ -0,0 +1,21 @@ +#!/usr/bin/perl -w +use DB_File; +@ARGV!=3&&die "Usage: buildExceptionDB.pl WordNet-exception-file-directory exception-file-extension output-file\n"; +opendir(DIR,$ARGV[0])||die "Cannot open directory $ARGV[0]\n"; +tie %exceptiondb,'DB_File',"$ARGV[2]",O_CREAT|O_RDWR,0640,$DB_HASH or + die "Cannot open exception db file for output: $ARGV[2]\n"; +while(defined($file=readdir(DIR))) { + if($file=~/\.$ARGV[1]$/o) { + print $file,"\n"; + open(IN,"$file")||die "Cannot open exception file: $file\n"; + while(defined($line=)) { + chomp($line); + @tmp=split(/\s+/,$line); + $exceptiondb{$tmp[0]}=$tmp[1]; + print $tmp[0],"\n"; + } + close(IN); + } +} +untie %exceptiondb; + diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/noun.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/noun.exc new file mode 100644 index 0000000..501bb38 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/noun.exc @@ -0,0 +1,5969 @@ +aardwolves aardwolf +abaci abacus +abacuses abacus +abbacies abbacy +abhenries abhenry +abilities ability +abnormalities abnormality +aboideaus aboideau +aboideaux aboideau +aboiteaus aboiteau +aboiteaux aboiteau +abos abo +abscissae abscissa +abscissas abscissa +absurdities absurdity +academies academy +acanthi acanthus +acanthuses acanthus +acari acarus +accelerandos accelerando +accessaries accessary +accessories accessory +acciaccaturas acciaccatura +acciaccature acciaccatura +acclivities acclivity +accuracies accuracy +acerbities acerbity +acetabula acetabulum +achaemenidae achaemenid +achaemenides achaemenid +achaemenids achaemenid +acicula aciculum +aciculae acicula +aciculums aciculum +acidities acidity +acini acinus +acouchies acouchy +acouchis acouchi +acre-feet acre-foot +acrimonies acrimony +acromia acromion +actiniae actinia +actinias actinia +activities activity +actualities actuality +actuaries actuary +adagios adagio +addenda addendum +adenectomies adenectomy +adenocarcinomas adenocarcinoma +adenocarcinomata adenocarcinoma +adenoidectomies adenoidectomy +adenomas adenoma +adenomata adenoma +adieus adieu +adieux adieu +admen adman +admiralties admiralty +adulteries adultery +adversaries adversary +adversities adversity +advocacies advocacy +adygeis adygei +adyghes adyghe +adyta adytum +aecia aecium +aecidia aecidium +aeries aery +aerobes aerobe +aerobia aerobium +aetiologies aetiology +affinities affinity +aficionados aficionado +afros afro +afterbodies afterbody +agencies agency +agents-general agent-general +aggiornamenti aggiornamento +agnonomina agnomen +agones agon +agonies agony +agorae agora +agoras agora +agouties agouti +agoutis agouti +aides-de-camp aide-de-camp +aides-memoire aide-memoire +aids-de-camp aid-de-camp +ailanthuses ailanthus +ainus ainu +aircraftmen aircraftman +aircraftwomen aircraftswoman aircraftwoman +airmen airman +ais ai +akans akan +alae ala +albinos albino +alchemies alchemy +alderflies alderfly +aldermen alderman +alewives alewife +aliases alias +alibis alibi +alkalies alkali +alkalis alkali +alkies alkie alky +allegories allegory +allegrettos allegretto +allegros allegro +allergies allergy +allies ally +allodia allodium +allods allod +alluvia alluvium +alluviums alluvium +almohades almohade +almohads almohad +almonries almonry +almsmen almsman +almswomen almswoman +alodia alodium +aloes aloe +alto-relievos alto-relievo alto-rilievo +altocumuli altocumulus +altos alto +altostrati altostratus +alulae alula +alumnae alumna +alumni alumnus +alveoli alveolus +amanuenses amanuensis +ambaries ambary +ambaris ambari +ambiguities ambiguity +ambos ambo +ambries ambry aumbry +ambulacra ambulacrum +ambulatories ambulatory +amebae ameba +amebas ameba +amenities amenity +amici_curiae amicus_curiae +amigos amigo +amities amity +amnesties amnesty +amninia amnion +amniocenteses amniocentesis +amnions amnion +amoebae amoeba +amoebiases amoebiasis +amoretretti amoretto +amoretti amoretto +amorini amorino +amoririni amorino +amphiarthroses amphiarthrosis +amphibolies amphiboly +amphibologies amphibology +amphicia amphithecium +amphictyonies amphictyony +amphigories amphigory +amphigouris amphigouri +amphimixes amphimixis +amphioxi amphioxus +amphioxuses amphioxus +amphisbaenae amphisbaena +amphisbaenas amphisbaena +amphorae amphora +amphoras amphora +ampullae ampulla +amygdalae amygdala +anabaenas anabaena +anabases anabasis +anacolutha anacoluthon +anacruses anacrusis +anaerobes anaerobe +anaerobia anaerobium +anagnorises anagnorisis +analemmas analemma +analemmata analemma +analogies analogy +analyses analysis +anamneses anamnesis +anamorphoses anamorphosis +anastomoses anastomosis +anathemas anathema +anatomies anatomy +anattos anatto +anatyxes anaptyxis +anburies anbury +ancestries ancestry +anchovies anchovy +ancillaries ancillary +ancones ancon ancone +andantinos andantino +androclinia androclinium +androecia androecium +androsphinges androsphinx +androsphinxes androsphinx +angelenos angeleno +angelfishes angelfish +angiomas angioma +angiomata angioma +angularities angularity +angwantibos angwantibo +animalcula animalculum +animalcules animalcule +animosities animosity +anis ani +ankuses ankus +anlagen anlage +anlages anlage +annattos anatto annatto +anniversaries anniversary +annuities annuity +annuli annulus +annuluses annulus +anomalies anomaly +antae anta +antalkalies antalkali +antalkalis antalkali +antefixa antefix +antefixes antefix +antelopes antelope +antennae antenna +antependia antependium +anthelia anthelion +anthelices anthelix +anthemia anthemion +antheridiia antheridium +anthodia anthodium +anthologies anthology +anthraces anthrax +antibodies antibody +anticlinonoria anticlinorium +antihelices antihelix +antihelixes antihelix +antiheroes antihero +antilogies antilogy +antineutrinos antineutrino +antinomies antinomy +antipastos antipasto +antipathies antipathy +antiphonaries antiphonary +antiphonies antiphony +antiquaries antiquary +antiquities antiquity +antisera antiserum +antiserums antiserum +antitheses antithesis +antitragi antitragus +antra antrum +anus anus +anxieties anxiety +anybodies anybody +aortae aorta +aortas aorta +apaches apache +aparejos aparejo +apemen apeman +aperies apery +apexes apex +aphelia aphelion +aphides aphis +apiaries apiary +apices apex +apodoses apodosis +apollos apollo +apologies apology +apomixes apomixis +aponeuroses aponeurosis +apophyses apophysis +aposiopeses aposiopesis +apostasies apostasy +apothecaries apothecary +apothecia apothecium +apotheoses apotheosis +apparatus apparatus +apparatuses apparatus +appendices appendix +appendictomies appendectomy appendicectomy +appendixes appendix +appetences appetence +appetencies appetency +appoggiaturas appoggiatura +appoggiature appoggiatura +apsides apsis +aquae aqua +aquaria aquarium +aquariums aquarium +aquas aqua +araglis argali +arapahos arapaho +arbitraries arbitrary +arboreta arboretum +arboretums arboretum +arbutuses arbutus +arcana arcanum +archdeaconries archdeaconry +archduchies archduchy +archegonia archegonium +archenemies archenemy +archerfishes archerfish +archespores archespore +archesporia archesporium +archipelagoes archipelago +archipelagos archipelago +arcs-boutants arc-boutant +areolae areola +areolas areola +argali argali +argals argal +argumenta argumentum +ariettas arietta +ariette arietta +ariettes ariette +aristae arista +aristocracies aristocracy +armadillos armadillo +armamentariia armamentarium +armamentariums armamentarium +armfuls armful +armies army +armories armory +armouries armoury +arpeggios arpeggio +arrises arris +arroyos arroyo +arses arsis +artal rotl +artel rotl +arteries artery +arterioscleroses arteriosclerosis +artillerymen artilleryman +aruspices aruspex +asceses ascesis +asci ascus +ascidcidia ascidium +ascogonia ascogonium +ashkenazim ashkenazi +aspergilla aspergillum +aspergilli aspergillus +aspergilloses aspergillosis +aspergills aspergill +aspergillums aspergillum +asperities asperity +aspersoria aspersorium +aspirins aspirin +assagais assagai +assegais assagai assegai +assemblies assembly +assemblymen assemblyman +assiduities assiduity +astragali astragalus +asyndeta asyndeton +atamans ataman +atheromas atheroma +atheromata atheroma +atheroscleroses atherosclerosis +atlases atlas +atmolyses atmolysis +atomies atomy +atria atrium +atrocities atrocity +atrophies atrophy +attorneys-at-law attorney-at-law +auditoria auditorium +auditoriums auditorium +auguries augury +aunties auntie aunty +aurae aura +aurar eyrir +auras aura +aurei aureus +auriculae auricula +auriculas auricula +aurorae aurora +auroras aurora +auspices auspex auspice +austerities austerity +autarchies autarchy +autarkies autarky +authorities authority +autoantibodies autoantibody +autobiographies autobiography +autocatalyses autocatalysis +autochthones autochthon +autochthons autochthon +autocracies autocracy +autogiros autogiro +autogyros autogyro +automata automaton +automatons automaton +autonomies autonomy +autopsies autopsy +autos auto +autos-da-fe auto-da-fe +autotomies autotomy +auxiliaries auxiliary +aviaries aviary +avitaminoses avitaminosis +avocados avocado +axes ax axis +axillae axilla +axillaries axillary +axises axis +aymaras aymara +azerbaijanis azerbaijani +babies baby +bacchantes bacchant bacchante +bacchants bacchant +bacchii bacchius +bacilli bacillus +backwoodsmen backwoodsman +bacteriostases bacteriostasis +bacula baculum +baculums baculum +baddies baddie baddy +badmen badman +baggies baggy +bagies bagie +bagmen bagman +bagnios bagnio +bahts baht +bailsmen bailsman +bains-marie bain-marie +bakeries bakery +bakras bakra +balconies balcony +ballistae ballista +baluchis baluchi +bambaras bambara +bambini bambino +bambinos bambino +bandeaux bandeau +banderilleros banderillero +bandies bandy +bandits bandit +banditti bandit +bandsmen bandsman +bandy-bandies bandy-bandy +baneberries baneberry +bani ban +banjoes banjo +banjos banjo +bankruptcies bankruptcy +bantus bantu +baptisteries baptistery +baptistries baptistry +barbarities barbarity +barberries barberry +bargees bargee +bargemen bargeman +barklice barklouse +barmen barman +baronetcies baronetcy +baronies barony +barotses barotse +barracudas barracuda +barramundas barramunda +barramundies barramundi +barramundis barramundi +barrancas barranca +barrancos barranco +barrios barrio +basemen baseman +bases base basis +bases-on-balls base_on_balls +bases_on_balls base_on_balls +basidia basidium +basidiia basidium +basileis basileus +basothos basotho +bassi basso +bassos basso +bastinadoes bastinado +basutos basuto +bateaux bateau +batfishes batfish +baths bath +batmen batman +batsmen batsman +batteries battery +batwomen batwoman +bayberries bayberry +bead-rubies bead-ruby +beadsmen beadsman bedesman +beaneries beanery +beanies beanie beany +beanos beano +bearberries bearberry +bears bear +beaus beau +beauties beauty +beaux beau +beccaficos beccafico +beches-de-mer beche-de-mer +bechuanas bechuana +bedesmen bedesman +bedouins bedouin +beentos beento +beetflies beetfly +beeves beef +behooves behoof +belfries belfry +bellies belly +bellmen bellman +bembas bemba +beneficiaries beneficiary +benignities benignity +benis beni +bennies benny +berries berry +bersaglieri bersagliere +bestialities bestiality +bestiaries bestiary +betonies betony +bevies bevy +bevvies bevvy +bhishties bheesty bhishti +bibliographies bibliography +bibliothecae bibliotheca +bibliothecas bibliotheca +bicennaries bicentenary bicentennial +bicepses biceps +biddies biddy +biddy-biddies biddy-biddy +bigamies bigamy +bigeyes bigeye +bighorns bighorn +bigotries bigotry +bijoux bijou +bilberries bilberry +bilboes bilbo +bilbos bilbo +billets-doux billet-doux +billfishes billfish +billies billy +billions billion +billycans billycan +bimboes bimbo +bimbos bimbo +bimillenaries bimillenary +bimonthlies bimonthly +binaries binary +binderies bindery +bingeys bingey +bingies bingy +biographies biography +biopsies biopsy +bioscopies bioscopy +birdmen birdman +biros biro +bisectrices bisectrix +bistouries bistoury +bistros bistro +bivvies bivvy +biweeklies biweekly +blackberries blackberry +blackfeet blackfoot +blackfishes blackfish +blackflies blackfly +blasphemies blasphemy +blastemas blastema +blastemata blastema +blastulae blastula +blastulas blastula +blauboks blaubok +blazonries blazonry +blennies blenny +blesboks blesbok +blesbucks blesbuck +blindfishes blindfish +blindstoreys blindstorey +blindstories blindstory +bloomeries bloomery +blowfishes blowfish +blowflies blowfly +blueberries blueberry +bluefishes bluefish +boarfishes boarfish +boatmen boatman +bobberies bobbery +bobbies bobby +bodies body +bogeymen bogeyman +bogies bogy +bok boschbok +bolas bola +bolases bolas +boleros bolero +boleti boletus +boletuses boletus +bolivares bolivar +bolivars bolivar +bolivianos boliviano +bolos bolo +bolsheviki bolshevik +bolsheviks bolshevik +bolshies bolshie bolshy +boluses bolus +bondsmen bondsman +bonefishes bonefish +bongoes bongo +bongos bongo +bonitoes bonito +bonitos bonito +bonteboks bontebok +boo-boos boo-boo +boobies booby +boohoos boohoo +bookbindereries bookbindery +booklice booklouse +bookshelves bookshelf +booths booth +booties booty +boraces borax +boraxes borax +borborygmi borborygmus +bordellos bordello +bordereaux bordereau +borzois borzoi +boschboks boschbok +bosses boss +botanies botany +botargoes botargo +botflies botfly +bothies bothy +bottomries bottomry +botulinuses botulinus +bouncing_betties bouncing_betty +boundaries boundary +bounties bounty +bowmen bowman +box-kodaks box_kodak +boxberries boxberry +boxfishes boxfish +boysenberries boysenberry +bozos bozo +brachia brachium +brachylogies brachylogy +braggadocios braggadocio +brahmanis brahmani +brahmans brahman +brahmins brahmin +brahuis brahui +brainchildren brainchild +brakemen brakeman +brakesmen brakesman +branchiae branchia +brandies brandy +brants brant brent +brassies brassie brassy +bravadoes bravado +bravados bravado +bravoes bravo +bravos bravo +breadfruits breadfruit +bregmata bregma +brents brent +brethren brother +breviaries breviary +brevities brevity +breweries brewery +briberies bribery +brills brill +brionies briony +broadleaves broadleaf +brollies brolly +bronchi bronchus +bronchos broncho +broncos bronco +brothers-in-law brother-in-law +brumbies brumby +brutalities brutality +bryonies briony bryony +buboes bubo +buckoes bucko +buckteeth bucktooth +buddies buddy +buffaloes buffalo +buffalos buffalo +bugaboos bugaboo +buggies buggy +bullae bulla +bullies bully +buncos bunco +bunde bund +bunds bund +bunkos bunko +bunnies bunny +burberries burberry +burbots burbot +bureaucracies bureaucracy +bureaus bureau +bureaux bureau +burglaries burglary +burgoos burgoo +burgundies burgundy +buroos buroo +burros burro +bursae bursa +bursaries bursary +bursas bursa +busbies busby +buses bus +bushbabies bushbaby +bushbok boschbok +bushboks boschbok +bushbucks bushbuck +bushies bushie bushy +bushmen bushman +businessmen businessman +businesswomen businesswoman +busses bus +busybodies busybody +butcheries butchery +butleries butlery +butterfishes butterfish +butterflies butterfly +butteries buttery +butties butty +byes bye +byssi byssus +byssuses byssus +caballeros caballero +cabbies cabby +cabmen cabman +cacophonies cacophony +cacti cactus +cactuses cactus +caddies caddie caddy +caddisflies caddisfly +cadences cadence +cadencies cadency +cadis cadi +caducei caduceus +caeca caecum +caestuses caestus +caesurae caesura +caesuras caesura +caimans caiman +calami calamus +calamities calamity +calathi calathus +calcanei calcaneum calcaneus +calces calx +calculi calculus +caldaria caldarium +calefactories calefactory +calices calix +calicoes calico +calicos calico +calli callus +callosities callosity +calluses callus +calories calorie calory +calumnies calumny +calvaries calvary +calves calf +calxes calx +calyces calyx +calypsos calypso +calyxes calyx +cambia cambium +cambiums cambium +cameos cameo +camerae camera +cameramen cameraman +camerlengos camerlengo +camerlingos camerlingo +camisades camisade +camisados camisado +campos campo +campuses campus +canaliculi canaliculus +canaries canary +candelabra candelabrum +candelabras candelabra +candelabrums candelabrum +candies candy +candleberries candleberry +candlefishes candlefish +canneries cannery +cannonries cannonry +cannons cannon +cannulas cannula +canonries canonry +canopies canopy +canthi canthus +cantos canto +canulae canula +canulas canula +canvasbacks canvasback +canzoni canzone +capabilities capability +capacities capacity +capillaries capillary +capita caput +capitula capitulum +capitularies capitulary +capos capo +cappuccinos cappuccino +capricci capriccio +capriccios capriccio +caprices caprice +captivities captivity +carabaos carabao +carabinieri carabiniere +caravansaries caravansary +caravanserais caravanserai +carbies carby +carbonadoes carbonado +carbonados carbonado +carcinomas carcinoma +carcinomata carcinoma +cargoes cargo +cargos cargo +caribous caribou +caribs carib +carides caryatid +carinae carina +carinas carina +carmen carman +caroli carolus +caroluses carolus +carpi carpus +carpogonia carpogonium +carps carp +carries carry +carryings-on carrying-on +cartularies cartulary +caryatids caryatid +caryopses caryopsis +caryopsides caryopsis +casinos casino +cassowaries cassowary +castellanies castellany +castrati castrato +castratos castrato +casualties casualty +casuistries casuistry +catabases catabasis +cataclases cataclasis +cataloes catalo +catalos catalo +catalyses catalysis +catawbas catawba +catchflies catchfly +catchpennies catchpenny +categories category +catenae catena +catenaries catenary +catfishes catfish +cathari cathar +catharists catharist +cathars cathar +cathexes cathexis +cattaloes cattalo +catteries cattery +catties cattie catty +cattlemen cattleman +caucuses caucus +caudexes caudex +caudices caudex +caudillos caudillo +caules caulis +causalities causality +cauteries cautery +cavallas cavalla +cavallies cavally +cavalries cavalry +cavalrymen cavalryman +cavatine cavatina +cavefishes cavefish +cavemen caveman +cavetti cavetto +cavies cavy +cavities cavity +cavo-relievos cavo-relievo +cavo-rilievi cavo-rilievo +caymans cayman +cayugas cayuga +ceca cecum +celebrities celebrity +cellae cella +cellos cello +cembali cembalo +cembalos cembalo +cemeteries cemetery +censuses census +centauries centaury +centavos centavo +centenaries centenary +centesimi centesimo +centesimos centesimo +centillions centillion +centimos centimo +centos cento +centra centrum +centralities centrality +centrums centrum +centuries century +cephalothoraces cephalothorax +cephalothoraxes cephalothorax +ceratoduses ceratodus +cercariae cercaria +cercariiae cercaria +cerci cercus +cerebella cerebellum +cerebellums cerebellum +cerebra cerebrum +cerebrums cerebrum +ceremonies ceremony +ceros cero +certainties certainty +cervices cervix +cervixes cervix +cessionaries cessionary +cestuses caestus +cesurae cesura +cesuras cesura +chadarim cheder +chaetae chaeta +chainmen chainman +chairmen chairman +chaise_longues chaise_longue +chaises_longues chaise_longue +chalazae chalaza +chalazas chalaza +chalcedonies chalcedony +chalcidflies chalcidfly +challahs challah +challoth hallah +chalutzim chalutz +champerties champerty +chams cham +chancelleries chancellery +chancellories chancellory +chanceries chancery +chandleries chandlery +chanteys chantey +chanties chanty +chantries chantry +chapaties chapati +chapatis chapati +chapatties chapatti +chapattis chapatti +chapeaus chapeau +chapeaux chapeau +characteries charactery +charities charity +charladies charlady +charrs charr +chars char +chartularies chartulary +charwomen charwoman +chateaus chateau +chateaux chateau +chazanim chazan +chazans chazan +chechens chechen +checkerberries checkerberry +chedarim cheder +chefs-d'ouvre chef-d'ouvre +chelae chela +chelicerae chelicera +chemistries chemistry +cherokees cherokee +cherries cherry +cherubim cherub +cherubs cherub +chesses chess +chessmen chessman +chevaux-de-frise cheval-de-frise +chewas chewa +cheyennes cheyenne +chiaroscuros chiaroscuro +chiasmas chiasma +chiasmata chiasma +chiasmi chiasmus +chiasms chiasm +chicaneries chicanery +chicanos chicano +chiccories chiccory +chickabiddies chickabiddy +chickasaws chickasaw +chicories chicory +chicos chico +children child +chillies chilli +chinaberries chinaberry +chinamen chinaman +chinese_eddoes chinese_eddo +chinooks chinook +chinos chino +chippewas chippewa +chippeways chippeway +chippies chippie chippy +chitarroni chitarrone +chivalries chivalry +chochos chocho +choctaws choctaw +chokeberries chokeberry +chokecherries chokecherry +chokos choko +cholecystectomies cholecystectomy +chondromas chondroma +chondromata chondroma +choragi choragus +choraguses choragus +choriamambi choriambus +choriambs choriamb +chorizos chorizo +choruses chorus +choux chou +chrestomathies chrestomathy +chrismatories chrismatory +christies christy +chromonemata chromonema +chromos chromo +chronologies chronology +chrysalides chrysalis +chrysalises chrysalis +chubs chub +churchmen churchman +churchwomen churchwoman +churingas churinga +chuvashes chuvash +ciboria ciborium +cicadae cicada +cicadas cicada +cicalas cicala +cicale cicala +cicatrices cicatrix +cicelies cicely +cicerones cicerone +ciceroni cicerone +ciceros cicero +cicisbei cicisbeo +cigarillos cigarillo +ciggies ciggy +cigs cig +cilia cilium +cimices cimex +cineraria cinerarium +cingula cingulum +circuities circuity +circuses circus +cirri cirrus +cirrocumuli cirrocumulus +cirrostrati cirrostratus +ciscoes cisco +ciscos cisco +cisternae cisterna +cities city +citizenries citizenry +citruses citrus +civies civvy +civilities civility +civvies civvy +clani clarino +clanos clarino +clansmen clansman +clanswomen clanswoman +claries clary +claroes claro +claros claro +clavicembalos clavicembalo +clearstories clearstory +clemencies clemency +clepsydrae clepsydra +clepsydras clepsydra +clerestories clerestory +clergies clergy +clergymen clergyman +cleruchies cleruchy +clinandria clinandrium +clingfishes clingfish +clitella clitellum +cloacae cloaca +clostridiia clostridium +clostridiums clostridium +cloths cloth +cloudberries cloudberry +cloverleaves cloverleaf +clubmen clubman +clubwomen clubwoman +clypei clypeus +coachmen coachman +coagula coagulum +coalfishes coalfish +coati-mondis coati-mondi +coati-mundis coati-mundi +coatis coati +cocci coccus +coccyges coccyx +cochleae cochlea +cockatoos cockatoo +cocksfoots cocksfoot +cockshies cockshy +cocos coco +codfishes codfish +codices codex +cods cod +coelentera coelenteron +coenuri coenurus +cognomens cognomen +cognomina cognomen +cohos coho +cola colon +colectomies colectomy +coleorhizae coleorhiza +coleuses coleus +colies coly +collectivities collectivity +collegigia collegium +collegigiums collegium +collieries colliery +collies colly +colloquia colloquium +colloquies colloquy +colloquiums colloquium +colluvia colluvium +colluviums colluvium +collyria collyrium +collyriums collyrium +colones colon +colonies colony +colons colon +colossi colossus +colossuses colossus +colostomies colostomy +colotomies colotomy +coloureds coloured +colourmen colourman +coltsfoots coltsfoot +colugos colugo +columbariia columbarium +columellae columella +comae coma +comanches comanche +comas coma +comatulae comatula +comatulids comatulid +combos combo +combtooth_blennies combtooth_blenny +comedies comedy +comedones comedo +comedos comedo +comities comity +commandoes commando +commandos commando +commentaries commentary +commies commie commy +commissaries commissary +committeemen committeeman +commodities commodity +commonalities commonality +commonalties commonalty +commos commo +communities community +companies company +competencies competency +complacences complacence +complacencies complacency +complexities complexity +complicacies complicacy +complicities complicity +compos compo +concavities concavity +concertanti concertante +concerti concerto +concerti_grossi concerto_grosso +concertini concertino +concerto_grossos concerto_grosso +concertos concerto +concessionaries concessionary +conchae concha +conches conch +conchies conchie conchy +conchs conch +concinnities concinnity +condominiums condominium +condottieri condottiere +conductivities conductivity +condylomas condyloma +condylomata condyloma +coneys coney +confectionaries confectionary +confectioneries confectionery +confederacies confederacy +confervae conferva +confervas conferva +conformances conformance +conformities conformity +confraternities confraternity +congii congius +congress-gaiters congress-gaiter +congressmen congressman +congresswomen congresswoman +conidia conidium +conidnidia conidium +conies cony +conjunctivae conjunctiva +conjunctivas conjunctiva +conquistadores conquistador +conquistadors conquistador +conservancies conservancy +conservatories conservatory +consistences consistence +consistencies consistency +consistories consistory +consonances consonance +consonancies consonancy +consonannancies consonancy +consortia consortium +conspiracies conspiracy +constabularies constabulary +constituencies constituency +contagia contagium +contangos contango +contemporaries contemporary +contingencies contingency +continua continuum +continuities continuity +continuos continuo +continuums continuum +contos conto +contradictories contradictory +contralti contralto +contraltos contralto +contraries contrary +contrarieties contrariety +contributories contributory +controversies controversy +contumacies contumacy +contumelies contumely +conventionalities conventionality +conversaziozioni conversazione +convexities convexity +convolvuli convolvulus +convolvuluses convolvulus +cookies cookie cooky +cooks-general cook-general +coolies coolie cooly +cooperies coopery +copies copy +copulae copula +copulas copula +coquetries coquetry +coquitos coquito +corantos coranto +corbiculae corbicula +cordialities cordiality +coria corium +corneae cornea +corneas cornea +cornetcies cornetcy +cornua cornu +corodies corody +corollaries corollary +coronae corona +coronaries coronary +coronas corona +corozos corozo +corpora corpus +corpsmen corpsman +corrigenda corrigendum +corrodies corrody +cortices cortex +cortinae cortina +corybantes corybant +corybants corybant +coryphaei coryphaeus +cosies cosy +cosignatories cosignatory +cosmogonies cosmogony +cosmoses cosmos +costae costa +costmaries costmary +costotomies costotomy +cothurni cothurnus +cothurns cothurn +cottonseeds cottonseed +councilmen councilman +counter-revolutionaries counter-revolutionary +counterspies counterspy +counties county +countries country +countrymen countryman +court_martials court_martial +courts_martial court_martial +couteaux couteau +cowberries cowberry +cowfishes cowfish +cowmen cowman +cowries cowrie cowry +coxae coxa +coxcombries coxcombry +coyotes coyote +coyotillos coyotillo +coypus coypu +cozies cozy +cracksmen cracksman +craftsmen craftsman +cragsmen cragsman +cramboes crambo +cranberries cranberry +crania cranium +craniotomies craniotomy +craniums cranium +crannies cranny +crappies crappie +crases crasis +crawfishes crawfish +crayfishes crayfish +creameries creamery +credenda credendum +credos credo +creeks creek +creepy-crawlies creepy-crawly +crees cree +crematoria crematorium +crematoriums crematorium +crescendi crescendo +crescendos crescendo +cribella cribellum +cries cry +criminalities criminality +criollos criollo +crises crisis +crissa crissum +cristae crista +criteria criterion +criterions criterion +crocuses crocus +cronies crony +crowberries crowberry +crowfoots crowfoot +cruces crux +crudities crudity +cruelties cruelty +crummies crummy +crura crus +crusadoes crusado +crusados crusado +cruxes crux +cruzadoes cruzado +cruzados cruzado +cruzeiros cruzeiro +crybabies crybaby +crying cry +cryings cry +cryoscopies cryoscopy +ctenidiia ctenidium +cubicula cubiculum +cuckoos cuckoo +cuddies cuddie cuddy +cul-de-sacs cul-de-sac +culices culex +cullies cully +culpae culpa +culs-de-sac cul-de-sac +culti cultus +cultuses cultus +cumuli cumulus +cumulonimbi cumulonimbus +cumulonimbuses cumulonimbus +cumulostrati cumulostratus +curacies curacy +curculios curculio +curiae curia +curios curio +curiosities curiosity +currencies currency +curricula curriculum +curriculums curriculum +currieries curriery +curries curry +curtseys curtsey +curtsies curtsy +cusks cusk +custodes custos +custodies custody +customaries customary +customs_duties customs_duty +cutcheries cutchery +cutcherries cutcherry +cutes cutis +cuticulae cuticula +cutises cutis +cutties cutty +cuttlefishes cuttlefish +cyclopes cyclops +cyclopses cyclops +cycloses cyclosis +cylices cylix +cylikes cylix +cymae cyma +cymas cyma +cymatia cymatium +cymbalos cymbalo +cypselae cypsela +cystectomies cystectomy +cysticerci cysticercus +cystotomies cystotomy +daces dace +dacoities dacoity +dactylologies dactylology +daddies daddy +dadoes dado +dados dado +dagoes dago +dagos dago +dailies daily +daimyos daimyo +dainties dainty +daiquiris daiquiri +dairies dairy +dairymen dairyman +daisies daisy +dalesmen dalesman +damaras damara +damselfishes damselfish +damselflies damselfly +dandies dandy +danios danio +darkeys darkey +darkies darky +data datum +dataries datary +datos dato +daughters-in-law daughter-in-law +dayaks dayak +dayflies dayfly +daymio daimio +daymios daimio +deaconries deaconry +dealfishes dealfish +deaneries deanery +dearies dearie deary +debilities debility +decemviri decemvir +decemvirs decemvir +decencies decency +decennaries decennary +decennia decennium +decenniums decennium +deciduae decidua +deciduas decidua +declivities declivity +decuries decury +deers deer +deficiencies deficiency +definienda definiendum +definientia definiens +deformities deformity +degeneracies degeneracy +deities deity +delawares delaware +delegacies delegacy +deles dele +delicacies delicacy +delinquencies delinquency +deliveries delivery +delphiniia delphinium +delphiniums delphinium +demagogies demagogy +demies demy +democracies democracy +demos demo +denarnarii denarius +densities density +dentalia dentalium +dentaliums dentalium +dependencies dependency +depilatories depilatory +depositaries depositary +depositories depository +depravities depravity +deputies deputy +derbies derby +dermatotoses dermatosis +desiderata desideratum +desmans desman +desperadoes desperado +desperados desperado +destinies destiny +devilfishes devilfish +devilries devilry +deviltries deviltry +dewberries dewberry +diabolos diabolo +diaereses diaeresis +diaerses diaeresis +diagnoses diagnosis +dialyses dialysis +dianthuses dianthus +diaphyses diaphysis +diapophyses diapophysis +diarchies diarchy dyarchy +diaries diary +diarthroses diarthrosis +diastalses diastalsis +diastases diastasis +diastemata diastema +diathermancies diathermancy +diathses diathesis +diazoes diazo +diazos diazo +dibbukkim dibbuk +dibbuks dibbuk +dichasia dichasium +dichotomies dichotomy +dickeys dickey +dickies dicky +dicta dictum +dictionaries dictionary +dictums dictum +didakais didakai +diddicoys diddicoy +didoes dido +didos dido +diereses dieresis +dieses diesis +dietaries dietary +differentiae differentia +difficulties difficulty +digamies digamy +dignitaries dignitary +dignities dignity +dildoes dildoe +dildos dildo +dilettantes dilettante +dilettanti dilettante +dillies dilly +diluvia diluvium +diminuendos diminuendo +dimities dimity +dingeys dingey +dinghies dinghy +dingies dingy +dingoes dingo +dinkas dinka +diplococci diplococcus +diplodocuses diplodocus +diplomacies diplomacy +dipodies dipody +directories directory +directors-general director-general +disabilities disability +disci discus +discoboli discobolos discobolus +discommodities discommodity +disconformities disconformity +discontinuities discontinuity +discos disco +discourtesies discourtesy +discoveries discovery +discrepancies discrepancy +discuses discus +disharmonies disharmony +dishonesties dishonesty +disloyalties disloyalty +disparities disparity +dispensaries dispensary +dispensatories dispensatory +dissimilarities dissimilarity +dissymmetries dissymmetry +distilleries distillery +distributaries distributary +disunities disunity +dittanies dittany +ditties ditty +dittographies dittography +divas diva +dive diva +diverticula diverticulum +divertimenti divertimento +divi-divis divi-divi +divinities divinity +djinn djinni djinny +dobbies dobby +dobros dobro +dobsonflies dobsonfly +documentaries documentary +dodoes dodo +dodos dodo +does doe +dogberries dogberry +dogeys dogey +dogfishes dogfish +doggeries doggery +doggies doggie doggy +dogies dogie dogy +dogmas dogma +dogmata dogma +dogsbodies dogsbody +dogteeth dogtooth +dohs doh +dojos dojo +dollarfishes dollarfish +dollies dolly +dolmans dolman +domesticities domesticity +dominoes domino +dominos domino +doormen doorman +dories dory +dormice dormouse +dormitories dormitory +dorsa dorsum +dos do +dowdies dowdy +doweries dowery +dowries dowry +doxies doxie doxy +doxologies doxology +doyleys doyley +doylies doyly +dozens dozen +drachmae drachma +drachmas drachma +draftsmen draftsman +dragomans dragoman +dragomen dragoman +dragonflies dragonfly +drains drain +draperies drapery +draughtsmen draughtsman +drawknives drawknife +drawshaves drawshave +dries dry +droits droit +drolleries drollery +dromedaries dromedary +drongos drongo +droshkies droshky +droskies drosky +drosophilae drosophila +drosophilas drosophila +drudgeries drudgery +drumfishes drumfish +drunk_and_disorderlies drunk_and_disorderly +dryades dryad +dryads dryad +drys dry +dualas duala +dualities duality +dubieties dubiety +dubiosities dubiosity +duchies duchy +duellos duello +dui duo +duikers duiker +dummies dummy +dunnies dunny +duodecimos duodecimo +duomos duomo +duona duodenum +duonas duodenum +duos duo +duplicities duplicity +dupondii dupondius +duppies duppy +duros duro +dustmen dustman +dutchmen dutchman +duties duty +duumviri duumvir +duumvirs duumvir +dwarfs dwarf +dwarves dwarf +dyaks dyak +dyarchies dyarchy +dybbukkim dybbuk +dybbuks dybbuk +dynamos dynamo +dynasties dynasty +dyulas dyula +dzos dzo +ealdormen ealdorman +earthmen earthman +easterlies easterly +ebonies ebony +eccentricities eccentricity +ecchymoses ecchymosis +ecclesiae ecclesia +ecdyses ecdysis +echidnae echidna +echidnas echidna +echini echinus +echinococci echinococcus +echoes echo +economies economy +ecstasies ecstasy +eddies eddy +eddoes eddo +edemata edema +edos edo +effendis effendi +efficiencies efficiency +effigies effigy +effluvia effluvium +effluviums effluvium +effronteries effrontery +efiks efik +egos ego +eicies eigenfrequency +eidola eidolon +eidolons eidolon +eighteenmos eighteenmo +eighties eighty +eightvos eightvo +eisegeses eisegesis +eisteddfodau eisteddfod +eisteddfods eisteddfod +elderberries elderberry +electros electro +electuaries electuary +elegances elegance +elegancies elegancy +elegies elegy +elemis elemi +elenchi elenchus +elephants elephant +elks elk +ellipses ellipsis +eluvia eluvium +elves elf +elytra elytron elytrum +embargoes embargo +embassies embassy +embolectomies embolectomy +emboli embolus +embolies emboly +embrectomies embrectomy +embroideries embroidery +embryectomies embryectomy +embryos embryo +embusques embusque +emergencies emergency +eminences eminence +eminencies eminency +emissaries emissary +emmies emmy +emmys emmy +emphases emphasis +emporia emporium +emporiums emporium +empties empty +emunctories emunctory +enarthroses enarthrosis +encephala encephalon +encephalomas encephaloma +encephalomata encephaloma +enchiridia enchiridion +enchiridions enchiridion +enchondromas enchondroma +enchondromata enchondroma +encomia encomium +encomiums encomium +endamebae endameba +endamebas endameba +endamoebae endamoeba +endamoebas endamoeba +endocardia endocardium +endocrania endocranium +endometria endometrium +endostea endosteum +endostoses endostosis +endothecicia endothecium +endothelia endothelium +endotheliomata endothelioma +enemas enema +enemata enema +enemies enemy +energies energy +engineries enginery +englishmen englishman +englishwomen englishwoman +enmities enmity +enneahedra enneahedron +enneahedrons enneahedron +enormities enormity +entamebae entameba +entamebas entameba +entamoebae entamoeba +entamoebas entamoeba +entases entasis +entelechies entelechy +entera enteron +enterostomies enterostomy +enterotomies enterotomy +enteroviruses enterovirus +entia ens +entireties entirety +entities entity +entozoa entozoan entozoon +entreaties entreaty +entries entry +entropies entropy +envies envy +eohippuses eohippus +eparchates eparchate +eparchies eparchy +epencephala epencephalon +epentheses epenthesis +epexegeses epexegesis +ephemerae ephemera +ephemeras ephemera +ephemerera ephemeron +ephemererons ephemeron +ephemerides ephemeris +ephori ephor +epibolies epiboly +epicalyces epicalyx +epicalyxes epicalyx +epicanthi epicanthus +epicardia epicardium +epicedidia epicedium +epicenters epicenter +epicentres epicentre +epicleses epiclesis +epididymides epididymis +epigastria epigastrium +epiglottides epiglottis +epiglottises epiglottis +epimysia epimysium +epinasties epinasty +epiphanies epiphany +epiphenomena epiphenomenon +epiphyses epiphysis +episcopacies episcopacy +episiotomies episiotomy +episterna episternum +epithalamia epithalamion epithalamium +epithelia epithelium +epitheliomas epithelioma +epitheliomata epithelioma +epitheliums epithelium +epizoa epizoon +epoxies epoxy +epyllilia epyllion +equalities equality +equerries equerry +equilibria equilibrium +equilibriums equilibrium +equiseta equisetum +equisetums equisetum +equities equity +ergatocracies ergatocracy +ergs erg +eries erie +eringoes eringo +eringos eringo +ermines ermine +errancies errancy +errantries errantry +errata erratum +eryngoes eryngo +escolars escolar +escudos escudo +eskies esky +eskimos eskimo +esophagi esophagus +esophaguses esophagus +espartos esparto +espressos espresso +esquimaus esquimau +estuaries estuary +eternities eternity +etiologies etiology +etuis etui +etyma etymon +etymologies etymology +etymons etymon +eucalypti eucalyptus +eucalypts eucalypt +eucalyptuses eucalyptus +eulachans eulachan +eulachons eulachon +eulogies eulogy +eupatridae eupatrid +eupatrids eupatrid +euphonies euphony +euphrasies euphrasy +euripi euripus +eventualities eventuality +ewes ewe +ex-servicemen ex-serviceman +exanthemas exanthema +exanthemata exanthema +exanthems exanthem +exarchates exarchate +exarchies exarchy +excellences excellence +excellencies excellency +excisemen exciseman +excrescencies excrescency +excursuses excursus +executrices executrix +executrixes executrix +exegeses exegesis +exempla exemplum +exigences exigence +exigencies exigency +exordia exordium +exordiums exordium +exostoses exostosis +expediences expedience +expediencies expediency +expiries expiry +expos expo +externalities externality +extradoses extrados +extrema extremum +extremities extremity +eyeteeth eyetooth +fabliaux fabliau +faciae facia +facilities facility +factories factory +faculae facula +faculties faculty +faeries faerie faery +faeroese faeroese +fairies fairy +fallacies fallacy +fallfishes fallfish +falsettos falsetto +falsities falsity +familiarities familiarity +families family +famuli famulus +fancies fancy +fandangos fandango +fangs fang +fannies fanny +fantasies fantasy +fantis fanti +farcies farcy +farmers-general farmer-general +faroese faroese +farragoes farrago +farrieries farriery +fasciae fascia +fasciculi fasciculus +fatalities fatality +fathers-in-law father-in-law +fatsoes fatso +fatsos fatso +fatties fatty +fatuities fatuity +faunae fauna +faunas fauna +fealties fealty +februaries february +feculae fecula +fedayeen fedayee +feet foot +felicities felicity +fellaheen fellah +fellahin fellah +fellahs fellah +fellies felly +felloes felloe +felones_de_se felo_de_se +felonies felony +felonries felonry +felos_de_se felo_de_se +femora femur +femurs femur +fenestellae fenestella +fenestrae fenestra +feretories feretory +feriae feria +ferias feria +ferities ferity +fermatas fermata +fermate fermata +ferneries fernery +ferries ferry +ferulae ferula +ferulas ferula +fervencies fervency +festivities festivity +festschriften festschrift +festschrifts festschrift +fetiales fetial +feudalities feudality +fezzes fez +fiascoes fiasco +fiascos fiasco +fibrillae fibrilla +fibrils fibril +fibromas fibroma +fibromata fibroma +fibulae fibula +fibulas fibula +ficoes fico +fideicommissa fideicommissum +fideicommissaries fideicommissary +fidelities fidelity +fieldmice fieldmouse +fieldsmen fieldsman +fifties fifty +figs. fig. +fila filum +filariiae filaria +filefishes filefish +filipinos filipino +fillies filly +fils fil +fimbriae fimbria +finalities finality +fineries finery +finfoots finfoot +fingos fingo +fireflies firefly +firemen fireman +fisheries fishery +fishermen fisherman +fishes fish +fishflies fishfly +fishwives fishwife +fistulae fistula +fistulas fistula +fixities fixity +flabella flabellum +flagella flagellum +flagellums flagellum +flagmen flagman +flagpoles flagpole +flagstaffs flagstaff +flagstaves flagstaff +flambeaus flambeau +flambeaux flambeau +flamencos flamenco +flamens flamen +flamines flamen +flamingoes flamingo +flamingos flamingo +flatfeet flatfoot +flatfishes flatfish +flatfoots flatfoot +flatheads flathead +flatteries flattery +flatuses flatus +fleurs-de-lis fleur-de-lis +fleurs-de-lys fleur-de-lys +flies fly +flights_of_stairs flight_of_stairs +flittermice flittermouse +flocci floccus +flocculi flocculus +floosies floosie +floozies floozie +florae flora +floras flora +floreant. floreat +florilegia florilegium +flounders flounder +flowers-de-luce flower-de-luce +flummeries flummery +flunkeys flunkey +flunkies flunky +flurries flurry +flybys flyby +flyleaves flyleaf +foci focus +focuses focus +foemen foeman +foetuses foetus +fogeys fogey +fogies fogy +foilsmen foilsman +folia folium +folios folio +folks folk +follies folly +fooleries foolery +footmen footman +fopperies foppery +fora forum +foramens foramen +foramina foramen +forceps forceps +forefeet forefoot +foremen foreman +foreteeth foretooth +forgeries forgery +formalities formality +formicaria formicarium +formicaries formicary +formulae formula +formularies formulary +formulas formula +fornices fornix +fortes fortis +forties forty +fortnightlies fortnightly +fortuities fortuity +forums forum +fossae fossa +foundries foundry +foveae fovea +foveolae foveola +foxes fox +fractocumuli fractocumulus +fractostrati fractostratus +fraena fraenum +fragrances fragrance +fragrancies fragrancy +frailties frailty +frangipanis frangipani +fraternities fraternity +frauen frau +frauleins fraulein +fraus frau +freedmen freedman +freemen freeman +frena frenum +frenchies frenchy +frenchmen frenchman +frenula frenulum +frenzies frenzy +frequencies frequency +frescoes fresco +frescos fresco +freshers fresher +freshmen freshman +friaries friary +fricandeaus fricandeau +fricandeaux fricandeau +fricandoes fricando +friendlies friendly +fries fry +frijoles frijol +fripperies frippery +fritillaries fritillary +frogfishes frogfish +froggies froggy +frogmen frogman +frogs frog +frontes frons +frontiersmen frontiersman +frusta frustum +frustums frustum +fuci fucus +fucuses fucus +fuddy-duddies fuddy-duddy +fugios fugio +fuglemen fugleman +fulas fula +fulcra fulcrum +fulcrums fulcrum +fumatoria fumatorium +fumatories fumatory +fumatoriums fumatorium +fumitories fumitory +functionaries functionary +fundi fundus +fungi fungus +funguses fungus +funiculi funiculus +funnies funny +furcula furculum +furculae furcula +furfures furfur +furies fury +furrieries furriery +futilities futility +futurities futurity +fuzzy-wuzzies fuzzy-wuzzy +g-men g-man +gabbros gabbro +gabies gaby +gadflies gadfly +gadwalls gadwall +gaieties gaiety +galagos galago +galaxies galaxy +galeae galea +galibis galibi +gallantries gallantry +gallas galla +galleries gallery +gallflies gallfly +gallimaufries gallimaufry +gallowses gallows +galvos galvo +gambades gambade +gambadoes gambado +gambados gambado +gametangia gametangium +gammadidia gammadion +gandas ganda +ganglia ganglion +ganglions ganglion +gantries gantry +garbanzos garbanzo +garbos garbo +garfishes garfish +gars gar +gas gas +gases gas +gasmen gasman +gasses gas +gastrectomies gastrectomy +gastroenterostomies gastroenterostomy +gastrostomies gastrostomy +gastrotomies gastrotomy +gastrulae gastrula +gastrulas gastrula +gateaux gateau +gauchos gaucho +gauderies gaudery +gauntries gauntry +gazeboes gazebo +gazebos gazebo +gazelles gazelle +geckoes gecko +geckos gecko +geese goose +geishas geisha +gelsemia gelsemium +gelsemiums gelsemium +gemboks gemsbok +gembucks gemsbuck +gemeinschaften gemeinschaft +gemmae gemma +genealogies genealogy +genera genus +generalissimos generalissimo +generalities generality +generatrices generatrix +generosities generosity +geneses genesis +genevans genevan +genii genius +geniuses genius +gentes gens +gentilities gentility +gentlemen gentleman +gentlemen-at-arms gentleman-at-arms +gentlemen-farmers gentleman-farmer +gentlewomen gentlewoman +genua genu +genus genus +genuses genus +geographies geography +germens germen +germina germen +gerontocracies gerontocracy +gesellschaften gesellschaft +gestalten gestalt +gestalts gestalt +gharries gharri gharry +ghazis ghazi +ghettoes ghetto +ghettos ghetto +gibbosities gibbosity +gigantomachias gigantomachia +gigantomachies gigantomachy +gigolos gigolo +gildsmen gildsman +gildswomen gildswoman +gingivae gingiva +gingkoes gingko +ginglymi ginglymus +ginkgoes ginkgo +gippies gippy +gippoes gippo +gipsies gipsy +giraffes giraffe +giros giro +gis gi +glabellae glabella +glacises glacis +gladioli gladiolus +gladioluses gladiolus +glandes glans +glassmen glassman +gleemen gleeman +glengarries glengarry +gliomas glioma +gliomata glioma +glissandi glissando +glissandos glissando +globefishes globefish +globigerinae globigerina +globigerinas globigerina +glochidchidia glochidium +glomeruli glomerulus +glories glory +glossae glossa +glossaries glossary +glossas glossa +glossectomies glossectomy +glossies glossy +glottides glottis +glottises glottis +glutaei glutaeus +glutei gluteus +gluttonies gluttony +gnoses gnosis +gnus gnu +goatfishes goatfish +gobies goby +goboes gobo +gobos gobo +godchildren godchild +goes go +goings-over going-over +goldeneyes goldeneye +goldeyes goldeye +goldfishes goldfish +gollies golly +gombos gombo +gomphoses gomphosis +gonidiia gonidium +goninia gonion +gonococci gonococcus +goodies goody +goodmen goodman +goodwives goodwife +goody-goodies goody-goody +googlies googly +gooseberries gooseberry +goosefishes goosefish +goosefoots goosefoot +gooses goose +gorgoneineia gorgoneion +gospopoda gospodin +gouramis gourami +governor_generals governor_general +governors_general governor_general +goyim goy +goys goy +graciosos gracioso +graduses gradus +grafen graf +graffiti graffito +grampuses grampus +granaries granary +grandchildren grandchild +granddaddies granddaddy +granddads granddad +grannies grannie granny +grants-in-aid grant-in-aid +granulomas granuloma +granulomata granuloma +grapefruits grapefruit +gratuities gratuity +gravavamina gravamen +gravies gravy +gravities gravity +graylings grayling +greegrees greegree +greeneries greenery +greenflies greenfly +grig-gris gris-gris +grigris grigri +grikwas grikwa +grilses grilse +grinderies grindery +gringos gringo +griquas griqua +grislies grisly +grizzlies grizzly +groceries grocery +groomsmen groomsman +grosses gross +groszy grosz +grotesqueries grotesquerie grotesquery +grottoes grotto +grottos grotto +groundsmen groundsman +groupers grouper +grouses grouse +guacharos guacharo +guacos guaco +guanacos guanaco +guanos guano +guaranis guarani +guaranties guaranty +guardsmen guardsman +guilder guilde +guilders guilde guilder +guitarfishes guitarfish +gujeratis gujerati +guldens gulden +gullahs gullah +gullies gully +gumbos gumbo +gummas gumma +gummata gumma +gunmen gunman +gunnies gunny +guppies guppy +gurkhas gurkha +gurnard gurnar +gurnards gurnar gurnard +gurnets gurnet +guttae gutta +gutties gutty +gymnasia gymnasium +gymnasiums gymnasium +gynaecea gynaeceum +gynaecia gynaecium +gynaecocracies gynaecocracy gynecocracy +gynarchies gynarchy +gynecea gynecium +gynecia gynecium +gynoecea gynoecium +gynoecia gynoecium +gypsies gypsy +gyri gyrus +gyros gyro +ha'pennies ha'penny +habaneros habanero +haberdasheries haberdashery +hackberries hackberry +hadarim heder +haddocks haddock +hadjes hadj +hadjis hadji +haecceities haecceity +haematolyses haematolysis +haematomas haematoma +haematomata haematoma +haematozozoa haematozoon +haemodialyses haemodialysis +haemolyses haemolysis +haemoptyses haemoptysis +haemorrhoidectomies haemorrhoidectomy +haeredes haeres +haftarahs haftarah +haftaroth haftarah +hagfishes hagfish +haggadahs haggadah +haggadas haggada haggadah +haggadoth haggada +hagiarchies hagiarchy +hagiocracies hagiocracy +hagiographies hagiography +hagiologies hagiology +haidas haida +hairdos hairdo +hajis haji +hajjes hajj +hajjis hajji +hakes hake +halers haler +haleru haler +halibuts halibut +hallahs hallah +halloas halloa +halloos halloo +hallos hallo +hallot hallah +halloth hallah +haloes halo +halos halo +halteres halter haltere +halves half +hamuli hamulus +handfuls handful +handymen handyman +hangers-on hanger-on +hangmen hangman +hankies hankie hanky +haphtarahs haphtarah +haphtaroth haphtarah +haphtatarahs haphtarah +haphtataroth haphtarah +haplographies haplography +hardies hardy +hares hare +harmonies harmony +harpies harpy +harquebuses harquebus +harts hart +haruspices haruspex +harvestmen harvestman +hatcheries hatchery +hausas hausa +haustella haustellum +haustoria haustorium +hazans hazan +hazzanim hazzan +hazzans hazzan +he-men he-man +headmen headman +headsmen headsman +heathberries heathberry +heathens heathen +heavies heavy +hectocotyli hectocotylus +hegemonies hegemony +heirs-at-law heir-at-law +heldentetenore heldentenor +helianthuses helianthus +helices helix +helixes helix +hellos hello +hematolyses hematolysis +hematomas hematoma +hematomata hematoma +hematozozoa hematozoon +hemelytra hemelytron +hemielytra hemielytron +hemodialyses hemodialysis +hemolyses hemolysis +hemoptyses hemoptysis +hemorrhoidectomies hemorrhoidectomy +henchmen henchman +hendecahedra hendecahedron +hendecahedrons hendecahedron +henneries hennery +henries henry +henrys henry +hens-and-chickens hen-and-chickens +heptarchies heptarchy +heraclidae heraclid +heraklidae heraklid +heraldries heraldry +herbariia herbarium +herbariums herbarium +herdsmen herdsman +heredities heredity +heresies heresy +hermae herm herma +hermai herma +herms herm +herniae hernia +hernias hernia +herniorrhaphies herniorrhaphy +heroes hero +heronries heronry +heros herero +herren herr +herrings herring +hetaerae hetaera +hetairai hetaira +heteroplasties heteroplasty +hetmans hetman +hexapodies hexapody +hiatuses hiatus +hibernacles hibernacle +hibernacula hibernaculum +hibiscuses hibiscus +hickories hickory +hidalgos hidalgo +hieracosphinges hieracosphinx +hieracosphinxes hieracosphinx +hierarchies hierarchy +hierocracies hierocracy +hierologies hierology +highwaymen highwayman +hila hilum +hillbillies hillbilly +himatia himation +hindoos hindoo +hinds hind +hindus hindu +hinnies hinny +hippies hippie hippy +hippocampi hippocampus +hippopotami hippopotamus +hippopotamuses hippopotamus +hippos hippo +histories history +hobbies hobby +hoboes hobo +hobos hobo +hodmen hodman +hogfishes hogfish +holibuts holibut +holies holy +hollas holla +hollies holly +hollos hollo +homilies homily +homologies homology +homos homo +homunculi homunculus +honesties honesty +honkies honky +honorariia honorarium +honorariums honorarium +hoodoos hoodoo +hoofs hoof +hootenannies hootenanny +hootnannies hootnanny +hooves hoof +hopis hopi +horologia horologium +horoscopies horoscopy +hors_d'oeuvres hors_d'oeuvre +horseflies horsefly +horsemen horseman +hospitalities hospitality +hostelries hostelry +hostilities hostility +hottentots hottentot +houris houri +houseflies housefly +housemen houseman +houses house +housewives housewife +hubbies hubby +huckleberries huckleberry +hullaballoos hullaballoo +hullabaloos hullabaloo +hullos hullo +humanities humanity +humeri humerus +humilities humility +humpies humpy +hundreds hundred +hundredweights hundredweight +huntsmen huntsman +hurdy-gurdies hurdy-gurdy +hurly-burlies hurly-burly +hurons huron +hurries hurry +husbandmen husbandman +huskies husky +hussies hussy +hutus hutu +hydrae hydra +hydras hydra +hydromedusae hydromedusa +hydromedusas hydromedusa +hydros hydro +hymenoptera hymenopteran +hymenopterans hymenopteran +hymenopterons hymenopteron +hynia hymenium +hyniums hymenium +hypanthia hypanthium +hyperostoses hyperostosis +hypertrophies hypertrophy +hyphae hypha +hypnoses hypnosis +hypochondria hypochondrium +hypocrisies hypocrisy +hypogastria hypogastrium +hypogea hypogeum +hypophyses hypophysis +hypos hypo +hypostases hypostasis +hypothalami hypothalamus +hypotheses hypothesis +hyraces hyrax +hyraxes hyrax +hysterectomies hysterectomy +hysterotomies hysterotomy +iambi iamb +iambs iamb +iambuses iambus +ibexes ibex +ibibios ibibio +ibices ibex +ibises ibis +ibo igbo +ibos ibo +ichthyosauri ichthyosaurus +ichthyosaurs ichthyosaur +ichthyosauruses ichthyosaur ichthyosaurus +iconographies iconography +iconostases iconostas iconostasis +icosahedra icosahedron +icosahedrons icosahedron +ictuses ictus +ideata ideatum +identities identity +ideologies ideology +idiocies idiocy +idiopathies idiopathy +idiosyncrasies idiosyncrasy +igbos igbo +igloos igloo +iglus iglu +ignominies ignominy +ignoramuses ignoramus +igorots igorot +igorrorote igorrote +igorrotes igorrote +ileostomies ileostomy +ilia ilium +imageries imagery +imagines imago +imagoes imago +imbroglios imbroglio +immediacies immediacy +immensities immensity +immoralities immorality +immunities immunity +impalas impala +imparities imparity +impediments impediment +imperiria imperium +impetuses impetus +impies impi +impieties impiety +impolicies impolicy +importunities importunity +impossibilities impossibility +impresarios impresario +improbities improbity +improprieties impropriety +impunities impunity +impurities impurity +inaccuracies inaccuracy +inadequacies inadequacy +inamoratas inamorata +inamoratos inamorato +inanities inanity +incapacities incapacity +incas inca +incendiaries incendiary +incensories incensory +incivilities incivility +incognitas incognita +incognitos incognito +incommodities incommodity +incongruities incongruity +inconsistencies inconsistency +incubi incubus +incubuses incubus +incudes incus +incumbencies incumbency +indecencies indecency +indemnities indemnity +independencies independency +indexes index +indiamen indiaman +indices index +indignities indignity +indigoes indigo +indigos indigo +individualities individuality +indusia indusium +industries industry +inequalities inequality +inequities inequity +infamies infamy +infancies infancy +infantries infantry +infantrymen infantryman +infelicities infelicity +infernos inferno +infidelities infidelity +infinities infinity +infirmaries infirmary +infirmities infirmity +informalities informality +infundibula infundibulum +ingenuities ingenuity +ingushes ingush +inhumanities inhumanity +iniquities iniquity +injuries injury +inkberries inkberry +innuendoes innuendo +innuendos innuendo +inocula inoculum +inoculants inoculant +inquiries inquiry +inquisitors-general inquisitor-general +insanities insanity +insectaria insectarium +insectaries insectary +insectariums insectarium +insignias insignia +instabilities instability +instrumentalities instrumentality +insulae insula +intagli intaglio +intaglios intaglio +intensities intensity +interleaves interleaf +intermediaries intermediary +intermezzi intermezzo +intermezzos intermezzo +internuncios internuncio +interreges interrex +interregna interregnum +interregnums interregnum +intimacies intimacy +intimae intima +intradoses intrados +intros intro +inuits inuit +inventories inventory +inveracities inveracity +involucella involucellum +involucels involucel +involucra involucrum +involucres involucre +iridectomies iridectomy +irides iris +iridotomies iridotomy +irises iris +irishmen irishman +irishwomen irishwoman +ironies irony +irregularities irregularity +irrelevancies irrelevancy +is is +ischia ischium +isocracies isocracy +israelis israeli +isthmi isthmus +isthmuses isthmus +itineraries itinerary +ivies ivy +ivories ivory +jack-in-the-boxes jack-in-the-box +jackeroos jackaroo jackeroo +jackfishes jackfish +jackknives jackknife +jacks-in-the-box jack-in-the-box +jacksmelts jacksmelt +jacksnipes jacksnipe +jacobuses jacobus +jaguarondis jaguarondi +jaguarundis jaguarundi +jalopies jalopy +jaloppies jaloppy +jambarts jambart +jambeaux jambeau +jambers jamber +janissaries janissary +janizaries janizary +januaries january +jatos jato +jats jat +jealousies jealousy +jellies jelly +jellyfishes jellyfish +jemmies jemmy +jennies jenny +jequerities jequerity +jequirities jequirity +jerries jerry +jetties jetty +jewelfishes jewelfish +jewfishes jewfish +jewries jewry +jiffies jiffy +jiffs jiff +jimmies jimmy +jingoes jingo +jinn jinni +jockos jocko +joes jo joe +johnnies johnny +jollities jollity +journeymen journeyman +journos journo +judge_advocate_generals judge_advocate_general +judge_advocates_general judge_advocate_general +judiciaries judiciary +judies judy +julies july +jumbos jumbo +juncos junco +juneberries juneberry +junkies junkie junky +junkmen junkman +juntos junto +jura jus +juries jury +jurymen juryman +justiciaries justiciary +juvenilities juvenility +kabyles kabyle +kaddishim kaddish +kadis kadi +kaffirs kaffir +kafirs kafir +kakapos kakapo +kakemonos kakemono +kakis kaki +kalmuck kalmuc +kalmucks kalmuc kalmuck +kalmyks kalmyk +kangaroos kangaroo +kanjis kanji +kara-kalpaks kara-kalpak +karens karen +karoos karoo +karroos karroo +kashmiris kashmiri +katabases katabasis +kauries kaury +kauris kauri +kazakhs kazakh +kazaks kazak +kazoos kazoo +keeshonden keeshond +keeshonds keeshond +kelpies kelpie kelpy +kepis kepi +keratoplasties keratoplasty +kerries kerry +khakis khaki +kibbutzim kibbutz +kiddies kiddie kiddy +kikuyus kikuyu +killdeers killdeer +killifishes killifish +kilos kilo +kimonos kimono +kingfishes kingfish +kings-of-arms king-of-arms +kinsmen kinsman +kirkmen kirkman +kitties kitty +kiwis kiwi +klansmen klansman +kleenexes kleenex +klootchmans klootchman +klootchmen klootchman +knaveries knavery +knights_bachelor knight_bachelor +knights_bachelors knight_bachelor +knights_templar knight_templar +knights_templars knight_templar +knives knife +kohlrabies kohlrabi +kolinskies kolinsky +kolos kolo +kondos kondo +kongos kongo +kotos koto +krios krio +kronen krone +kroner krone +kronur krona +krooni kroon +kroons kroon +kwakiutls kwakiutl +kylikes kylix +labara labarum +labella labellum +labia labium +laboratories laboratory +labra labrum +lachrymatories lachrymatory +lactobacilli lactobacillus +lacunae lacuna +lacunaria lacunar +lacunars lacunar +lacunas lacuna +ladies lady +ladies-in-waiting lady-in-waiting +ladinos ladino +lamaseries lamasery +lamellae lamella +lamellas lamella +lamiae lamia +lamias lamia +laminae lamina +laminas lamina +landladies landlady +landsmen landsman +laniaries laniary +lanugos lanugo +laos lao +laotians laotian +laparotomies laparotomy +lapidaries lapidary +lapilli lapillus +lapithae lapith +lapiths lapith +larcenies larceny +larghettos larghetto +largos largo +larvae larva +larynges larynx +laryngotomies laryngotomy +larynxes larynx +lassoes lasso +lassos lasso +latexes latex +laths lath +lati lat +latices latex +latifundia latifundium +lats lat +latu lat +laundries laundry +laundrymen laundryman +laundrywomen laundrywoman +lavaboes lavabo +lavabos lavabo +lavatories lavatory +lawmen lawman +laymen layman +laywomen laywoman +lazarets lazaret +lazarettes lazarette +lazarettos lazaretto +leadsmen leadsman +lean-tos lean-to +leaves leaf leave +lecheries lechery +lectionaries lectionary +lecythi lecythus +lefties lefty +legacies legacy +legalities legality +legatos legato +leges lex +legionaries legionary +legmen legman +lei leu +lemmas lemma +lemmata lemma +lemnisci lemniscus +lenes lenis +lengthmen lengthman +lenities lenity +lenos leno +lentigines lentigo +lentos lento +leonides leonid +leonids leonid +lepidoptera lepidopteran +lepidopterans lepidopteran +leprosaria leprosarium +lepta lepton +leptocephali leptocephalus +lethargies lethargy +lettermen letterman +leva lev +levies levy +levities levity +liabilities liability +liberalities liberality +liberties liberty +libidos libido +librae libra +libraries library +libretti libretto +librettos libretto +lice louse +lieder lied +liegemen liegeman +liftboys liftboy +liftmen liftman +ligulae ligula +ligulas ligula +lilies lily +lilos lilo +limbi limbus +limbos limbo +limens limen +limina limen +limites limes +limuli limulus +linctuses linctus +linemen lineman +linesmen linesman +lingcods lingcod +lingoes lingo +lings ling +lingua_francas lingua_franca +linguae lingua +linguae_francae lingua_franca +linkboys linkboy +linkmen linkman +lionfishes lionfish +lipomas lipoma +lipomata lipoma +liras lira +lire lira +liriodendra liriodendron +liriodendrons liriodendron +listente sente +litai lit litas +litanies litany +lithos litho +lithotomies lithotomy +lithotrities lithotrity +lits lit +litu litas +liturgies liturgy +liveries livery +liverymen liveryman +lives life +lixiviia lixivium +lixiviums lixivium +llanos llano +loaves loaf +lobbies lobby +lobectomies lobectomy +loblollies loblolly +lobos lobo +lobotomies lobotomy +lobsters lobster +localities locality +loci locus +locomen locoman +locos loco +locules locule +loculi loculus +loganberries loganberry +loggias loggia +loggie loggia +logia logion +logomachies logomachy +logos logo +lollies lolly +lomenmenta lomentum +loments loment +longbowmen longbowman +longobardi longobard +longobards longobard +longshoremen longshoreman +loobies looby +looneys looney +loonies loony +loos loo +loricae lorica +lories lory +lorries lorry +lotharios lothario +lotteries lottery +louses louse +lowerclassmen lowerclassman +loyalties loyalty +luba luba +lubas luba +lubritoria lubritorium +lullabies lullaby +lumens lumen +lumina lumen +luminaries luminary +luminosities luminosity +lumpfishes lumpfish +lunacies lunacy +lungfishes lungfish +lunies luny +lunulae lunula +lunules lunule +lupercalias lupercalia +lures lur lure +lustra lustre +lustrums lustrum +luxuries luxury +lycees lycee +lyings-in lying-in +lymphangitides lymphangitis +lymphomas lymphoma +lymphomata lymphoma +lymphopoieses lymphopoiesis +lynxes lynx +lyses lysis +lyttae lytta +lyttas lytta +maare maar +maars maar +macacos macaco +macaronies macaroni +macaronis macaroni +maccaronies maccaroni +maccaronis maccaroni +machineries machinery +machzorim machzor +mackerels mackerel +macronuclei macronucleus +macros macro +macrosporangia macrosporangium +maculae macula +macules macule +madmen madman +madornos madrono +madronas madrona +madrones madrone +maduros maduro +madwomen madwoman +maestri maestro +maestros maestro +mafiosi mafioso +mafiosos mafioso +magi magus +magisteries magistery +magistracies magistracy +magistratures magistrature +magmas magma +magmata magma +magnanimities magnanimity +magnetos magneto +magnificoes magnifico +magnums magnum +magyars magyar +mahicans mahican +mahoganies mahogany +mahzorim mahzor +mailmen mailman +majesties majesty +major-axes major_axis +major-domos major-domo +major_axes major_axis +majorities majority +makos mako +makuta likuta +maladies malady +malagasies malagasy +malevolencies malevolency +malignancies malignancy +malignities malignity +malihinis malihini +malinkes malinke +mallei malleus +malleoli malleolus +mambos mambo +mamillae mamilla +mammae mamma +mammies mammie mammy +mammillae mammilla +manchus manchu +mandamuses mandamus +mandatories mandatory +mandes mande +mandingoes mandingo +mandingos mandingo +mangoes mango +mangos mango +manifestoes manifesto +manifestos manifesto +maninkes maninke +manitos manito +manitous manitou +manitus manitu +manservants manservant +manteaus manteau +manteaux manteau +mantes mantis +mantises mantis +manubria manubrium +manubriums manubrium +manufactories manufactory +manxmen manxman +maoris maori +maravedis maravedi +marchese marchesa +marchesi marchese +maremme maremma +markhoors markhoor +markhors markhor +markkaa markka +marksmen marksman +marlins marlin +marqueteries marqueterie +marquetries marquetry +marquises marquis +marranos marrano +marsupia marsupium +martens marten +martinis martini +martyries martyry +martyrologies martyrology +marvels-of-peru marvel-of-peru +masais masai +mashies mashie mashy +mashonas mashona +maskalonges maskalonge +maskanonges maskanonge +masonries masonry +massachusets massachuset +masses mass masse +mastectomies mastectomy +masteries mastery +masters-at-arms master-at-arms +masticatories masticatory +mastoidectomies mastoidectomy +matabeles matabele +materialities materiality +matriarchies matriarchy +matrices matrix +matrimonies matrimony +matrixes matrix +maturities maturity +matzahs matzah +matzas matza +matzohs matzoh +matzos matzo +matzoth matzo +mau-maus mau-mau +maubies mauby +maundies maundy +mausolea mausoleum +mausoleums mausoleum +maxillae maxilla +maxima maximum +mayas maya +mayflies mayfly +mayoralties mayoralty +meanies meanie meany +meatuses meatus +media medium +mediae media +mediastina mediastinum +medicos medico +mediocrities mediocrity +mediums medium +medulla_oblongatas medulla_oblongata +medullae medulla +medullae_oblongatae medulla_oblongata +medullas medulla +medusae medusa +medusas medusa +megara megaron +megasporangia megasporangium +megillahs megillah +megilloth megillah +meinies meinie meiny +meioses meiosis +meistersingers meistersinger +melancholies melancholy +melanomas melanoma +melanomata melanoma +melismas melisma +melismata melisma +melodies melody +mementoes memento +mementos memento +memoranda memorandum +memorandums memorandum +memories memory +memos memo +men man +men-at-arms man-at-arms +men-o'-war man-of-war +men-of-war man-of-war +men_of_letters man_of_letters +mendacities mendacity +menisci meniscus +meniscuses meniscus +menologies menology +menominees menominee +menominis menomini +menstrua menstruum +menstruums menstruum +mentalities mentality +mercenaries mercenary +merchantmen merchantman +mercies mercy +mercuries mercury +mergansers merganser +merinos merino +meritocracies meritocracy +mermen merman +mesdames madame +mesdemoiselles mademoiselle +mesenteries mesentery +mesentertera mesenteron +mesnalties mesnalty +mesothoraces mesothorax +mesothoraxes mesothorax +messeigneurs monseigneur +messieurs monsieur +mestizoes mestizo +mestizos mestizo +metacarpi metacarpus +metagalaxies metagalaxy +metamorphoses metamorphosis +metanephroi metanephros +metastases metastasis +metatarsi metatarsus +metatheses metathesis +metathoraces metathorax +metathoraxes metathorax +metempsychoses metempsychosis +metencephala metencephalon +metencephalons metencephalon +methodologies methodology +metifs metif +metonymies metonymy +metrologies metrology +metropolises metropolis +metros metro +mezuzahs mezuzah +mezuzoth mezuzah +mezzo-sopranos mezzo-soprano +mezzos mezzo +mhos mho +miasmas miasma +miasmata miasma +mice mouse +micmacs micmac +microanalyses microanalysis +micrococci micrococcus +microcopies microcopy +micronuclei micronucleus +micronucleuses micronucleus +microsporangia microsporangium +microtomies microtomy +middies middy +middlemen middleman +midinettes midinette +midrashim midrash +midshipmen midshipman +midwives midwife +miladies miladi milady +milia milium +milieus milieu +milieux milieu +militaries military +militated_against militate_against +militiamen militiaman +milkfishes milkfish +milkmen milkman +millenaries millenary +millennia millennium +millenniums millennium +millions million +milos milo +mimicries mimicry +minae mina +minas mina +minima minimum +minimums minimum +ministeria ministerium +ministries ministry +minnows minnow +minorities minority +minstrelsies minstrelsy +minutemen minuteman +minutiae minutia +minyanim minyan +minyans minyan +mioses miosis +miracidiia miracidium +miri mir +miscellanies miscellany +miseries misery +mishnayoth mishna mishnah +missies missy +missionaries missionary +mitochondria mitochondrion +mittimuses mittimus +mitzvahs mitzvah +mitzvoth mitzvah +mixtecs mixtec +mlles mlle +mobocracies mobocracy +mockeries mockery +modalities modality +modernities modernity +modesties modesty +modioli modiolus +moduli modulus +mohaves mohave +mohawks mohawk +mohicans mohican +moieties moiety +mojaves mojave +molalities molality +molas mola +molies moly +mollies molly +momenta momentum +momentums momentum +momi momus +momuses momus +monades monad monas +monads monad +monarchies monarchy +monasteries monastery +moneys money +mongoes mongoe +mongolians mongolian +mongooses mongoose +mongos mongo +monies money +monitories monitory +monkeries monkery +monkfishes monkfish +monochasia monochasium +monocracies monocracy +monodies monody +monopodia monopodium +monopolies monopoly +monopsonies monopsony +monoptera monopteron +monopteroi monopteros +monotonies monotony +mons mon +monsignori monsignor +monsignors monsignor +monstrosities monstrosity +montagnards montagnard +monteros montero +monthlies monthly +monts-de-piete mont-de-piete +mooncalves mooncalf +moonfishes moonfish +morae mora +moralities morality +moras mora +moratoria moratorium +moratoriums moratorium +morays moray +morceaux morceau +mordvins mordvin +morellos morello +morescoes moresco +morescos moresco +moriscoes morisco +moriscos morisco +morning-glories morning-glory +moros moro +morphallaxes morphallaxis +morphoses morphosis +morros morro +mortalities mortality +mortuaries mortuary +morulae morula +morulas morula +mosasauri mosasaurus +mosasaurs mosasaur +moshavim moshav +moslems moslem +moslim moslem +moslims moslem +mosothos mosotho +mosquitoes mosquito +mosquitos mosquito +mossis mossi +mother_superiors mother_superior +mothers-in-law mother-in-law +mothers_superior mother_superior +motormen motorman +mottoes motto +mottos motto +motus motu +mounties mountie mounty +mouthfuls mouthful +mouths mouth +mucosae mucosa +mucrones mucro +mudejares mudejar +mudfishes mudfish +muftis mufti +mulattoes mulatto +mulattos mulatto +mulberries mulberry +multiparae multipara +multiplicities multiplicity +mummeries mummery +mummies mummy +mundas munda +mungos mungo +municipalities municipality +murices murex +murphies murphy +musclemen muscleman +muskallunge muskellunge +muskellunges muskellunge +muskies musky +muskrats muskrat +muslims muslim +mussalmans mussalman +mussulmans mussulman +mustachios mustachio +mutinies mutiny +mycelia mycelium +mycetomas mycetoma +mycetomata mycetoma +mycobacteria mycobacterium +mycorhizas mycorhiza +mycorrhizae mycorrhiza +myelencephala myelencephalon +myelencephalons myelencephalon +myiases myiasis +myocardia myocardium +myofibrillae myofibrilla +myomas myoma +myomata myoma +myoses myosis +myrmidones myrmidon +myrmidons myrmidon +mysteries mystery +mythoi mythos +mythologies mythology +myxomas myxoma +myxomata myxoma +naevi naevus +nagas naga +nahuatls nahuatl +naiades naiad +naiads naiad +namaquas namaqua +namas nama +namby-pambies namby-pamby +nannies nanny +naoi naos +nappies nappy +narcissi narcissus +narcissuses narcissus +nares naris +narragansets narraganset +narragansetts narragansett +naseberries naseberry +nasopharynges nasopharynx +nasopharynxes nasopharynx +natalities natality +natatoria natatorium +natatoriums natatorium +nationalities nationality +nativities nativity +naumachiae naumachia +naumachias naumachia +naumachies naumachy +nauplii nauplius +nautili nautilus +nautiluses nautilus +navahoes navaho +navahos navaho +navajoes navajo +navajos navajo +navies navy +nazis nazi +nebulae nebula +nebulas nebula +nebulosities nebulosity +necessities necessity +necrologies necrology +necropoleis necropolis +necropolises necropolis +necropsies necropsy +necroscopies necroscopy +necrotomies necrotomy +nectaries nectary +neddies neddy +needlefishes needlefish +needlewomen needlewoman +negrilloes negrillo +negrillos negrillo +negritoes negrito +negritos negrito +negroes negro +neguses negus +nelumbos nelumbo +nemeses nemesis +neologies neology +neologisms neologism +nephrectomies nephrectomy +nephridiia nephridium +nephrotomies nephrotomy +nereides nereid +netties netty +neurectomies neurectomy +neurohypophyses neurohypophysis +neuromas neuroma +neuromata neuroma +neuroptera neuropteron +neuropterans neuropteran +neuroses neurosis +neurotomies neurotomy +neutrettos neutretto +neutrinos neutrino +nevi nevus +newspapermen newspaperman +newspaperwomen newspapermen newspaperwoman +nibelungen nibelung +nibelungs nibelung +niceties nicety +nidi nidus +nielli niello +niellos niello +nighties nightie nighty +nilgai nilgai +nilgais nilgai +nilghaus nilghau +nimbi nimbus +nimbostrati nimbostratus +nimbuses nimbus +nimieties nimiety +nineties ninety +ninnies ninny +nobilities nobility +noblemen nobleman +noblewomen noblemen noblewoman +nobodies nobody +noctilucae noctiluca +noddies noddy +nodi nodus +noes no +nomarchies nomarchy +nomina nomen +nomocracries nomocracy +nomographies nomography +non-resistants non-resistant +nonentities nonentity +nonpluses nonplus +norsemen norseman +northcountrymen northcountryman +northeasterlies northeasterly +northerlies northerly +northmen northman +northwesterlies northwesterly +nos no +nota notum +notabilities notability +notaries notary +noumena noumenon +novae nova +novas nova +novellas novella +novelle novella +novelties novelty +novenae novena +nubas nuba +nubeculae nubecula +nucelli nucellus +nuchae nucha +nuclei nucleus +nucleoli nucleolus +nucleuses nucleus +nudities nudity +nulliparae nullipara +nullities nullity +numbfishes numbfish +numina numen +nuncios nuncio +nunneries nunnery +nupes nupe +nuris nuri +nurseries nursery +nurserymen nurseryman +nyalas nyala +nyanjas nyanja +nylghaus nylghau +nymphae nympha +nympholepsies nympholepsy +nymphos nympho +nyoros nyoro +oarfishes oarfish +oarsmen oarsman +oases oasis +oaths oath +obbligatos obbligato +obeahs obeah +obedientiaries obedientiary +obeli obelus +obis obi +obituaries obituary +objets_d'art objet_d'art +obligati obligato +obliquities obliquity +obloquies obloquy +oboli obolus +obols obol +obscenities obscenity +obscurities obscurity +observatories observatory +obstinacies obstinacy +occipita occiput +occiputs occiput +occupancies occupancy +oceanariia oceanarium +oceanariums oceanarium +oceanides oceanid +oceanids oceanid +ocelli ocellus +ochlocracies ochlocracy +ochreae ochrea +ocotillos ocotillo +ocreae ochrea ocrea +octahedra octahedron +octahedrons octahedron +octarchies octarchy +octavos octavo +octocentenaries octocentenary +octodecimos octodecimo +octogenarians octogenarian +octogenaries octogenary +octonaries octonary +octopuses octopus +oddities oddity +odea odeum +oedemata edema oedema +oesophagi esophagus oesophagus +offertories offertory +officiaries officiary +oil-water_interfaces oil-water_interface +oilmen oilman +ojibwas ojibwa +okapis okapi +oldwives oldwife +olea oleum +oleums oleum +olfactories olfactory +oligarchies oligarchy +oligopolies oligopoly +oligopsonies oligopsony +olios olio +ologies ology +omasa omasum +omayyades omayyad +omayyads omayyad +ombudsmen ombudsman +omenta omentum +ommatidtidia ommatidium +ommiades ommiad +ommiads ommiad +omnibuses omnibus +onagers onager +onagri onager +one-eightys one-eighty +oneidas oneida +onondagas onondaga +onuses onus +oogonia oogonium +oogoniums oogonium +oophorectomies oophorectomy +oothecae ootheca +opacities opacity +opera_serias opera_seria +operas_seria opera_seria +opercula operculum +operculums operculum +opossums opossum +opportunities opportunity +optima optimum +optimums optimum +opuses opus +ora os +orangemen orangeman +orangeries orangery +oratories oratory +oratorios oratorio +orchardmen orchardman +orderlies orderly +ordinaries ordinary +organa organon organum +organdies organdie organdy +organons organon +organums organa organum +orgies orgy +oribis oribi +originalities originality +orreries orrery +orthodoxies orthodoxy +orthographies orthography +orthopterans orthopteran +orthoptertera orthopteron +orthostichies orthostichy +oryxes oryx +osages osage +osar os +oscitances oscitance +oscitancies oscitancy +oscula osculum +osmanlis osmanli +ossa os +ossuaries ossuary +osteomas osteoma +osteomata osteoma +osteoplasties osteoplasty +osteotomies osteotomy +ostia ostium +ostiaries ostiary +ostriches ostrich +ostyaks ostyak +otters otter +ottomans othman ottoman +outcries outcry +outlawries outlawry +ova ovum +ovambos ovambo +ovariectomies ovariectomy +ovaries ovary +ovariotomies ovariotomy +overmen overman +ovoli ovolo +ovotestes ovotestis +owelties owelty +oxen ox +oxymora oxymoron +oystermen oysterman +pachucos pachuco +paddies paddy +paddlefishes paddlefish +paellas paella +paeonies paeony +pageantries pageantry +pairs pair +paisanos paisano +paise paisa +paiutes paiute +palaestras palaestra +paleae palea +pales pale +palestrae palestra +palestras palestra +palingeneses palingenesis +pallia pallium +palliums pallium +palmettoes palmetto +palmettos palmetto +palominos palomino +palpi palpus +palps palp +palsies palsy +pamperos pampero +pancratia pancratium +pandanuses pandanus +pandies pandy +pandowdies pandowdy +panettones panettone +panettoni panettone +panoplies panoply +pansies pansy +panthers panther +pantos panto +pantries pantry +papacies papacy +paperknives paperknife +papillae papilla +papillomas papilloma +papillomata papilloma +pappi pappus +pappies pappy +papulae papula +papules papule +papyri papyrus +papyruses papyrus +parabases parabasis +paraleipses paraleipsis paralipsis +paralyses paralysis +paramecia paramecium +paramenta parament +paraments parament +paramos paramo +paraphyses paraphysis +parapodia parapodium +paras para +paraselenae paraselene +parashoth parashah +parastichies parastichy +parasyntheta parasyntheton +parentheses parenthesis +parerga parergon +parhelia parhelion +pari-mutuels pari-mutuel +parietes paries +paris-mutuels pari-mutuel +parities parity +parodies parody +parries parry +parrotfishes parrotfish +parrs parr +partialities partiality +particularities particularity +parties party +partridgeberries partridgeberry +partridges partridge +parulides parulis +pashtos pashto +paso_dobles paso_doble +pasos_dobles paso_doble +passepieds passepied +passers-by passer-by +passuses passus +pasties pasty +pastorales pastorale +pastorali pastorale +pastries pastry +patagia patagium +patellae patella +pathologies pathology +paths path +patinae patina +patios patio +patresfamilias paterfamilias +patriarchies patriarchy +patrimonies patrimony +patrolmen patrolman +patsies patsy +patties patty +pawnees pawnee +peacocks peacock +peafowls peafowl +pearlies pearly +pease pea +peaveys peavey +peavies peavy +peccadilloes peccadillo +peccadillos peccadillo +peccaries peccary +peccavis peccavi +pectens pecten +pectines pecten +peculiarities peculiarity +pedaloes pedalo +pedalos pedalo +pedantries pedantry +pedes pes +pekingese pekinese +pellitories pellitory +peloruses pelorus +peltries peltry +pelves pelvis +pelvises pelvis +penalties penalty +pence penny +penes penis +penicillia penicillium +penicilliums penicillium +penises penis +penitentiaries penitentiary +penknives penknife +penmen penman +pennae penna +pennia penni +pennies penny +pennis penni +penny-dreadfuls penny-dreadful +pensionaries pensionary +pentahedra pentahedron +pentahedrons pentahedron +pentarchies pentarchy +pentimenti pentimento +penumbrae penumbra +penumbras penumbra +peonies peony +peoples people +pepla peplum +peploses peplos +peplums peplum +pepluses peplus +pepos pepo +pequots pequot +perches perch +perfectos perfecto +perfidies perfidy +perfumeries perfumery +pericardia pericardium +perichondria perichondrium +pericrania pericranium +peridia peridium +perihelia perihelion +perinea perineum +perinephria perinephrium +perionychiia perionychium +periostea periosteum +peripheries periphery +periphrases periphrasis +peris peri +peristalses peristalsis +perithecia perithecium +peritonea peritoneum +peritoneums peritoneum +perjuries perjury +permanencies permanency +permittivities permittivity +perpetuities perpetuity +perplexities perplexity +perries perry +personae persona +personalities personality +personalties personalty +persons person +perversities perversity +pesos peso +pessaries pessary +petermen peterman +petrologies petrology +pfennige pfennig +pfennigs pfennig +phalanges phalange phalanx +phalansteries phalanstery +phalanxes phalanx +phalli phallus +phalluses phallus +phantasies phantasy +pharmacies pharmacy +pharynges pharynx +pharyngotomies pharyngotomy +pharynxes pharynx +phenocopies phenocopy +phenomena phenomenon +phenomenons phenomenon +phi-phenomena phi-phenomenon +philanthropies philanthropy +philodendra philodendron +philodendrons philodendron +philosophies philosophy +phis phi +phlebotomies phlebotomy +phloxes phlox +phlyctenae phlyctaena phlyctena +phoneys phoney +phonies phony +phonologies phonology +photocopies photocopy +photos photo +phraseologies phraseology +phratries phratry +phrensies phrensy +phyla phylum +phylacteries phylactery +phylae phyle +phyllotaxes phyllotaxis +phyllotaxies phyllotaxy +phyllotaxtaxes phyllotaxis +phylloxerae phylloxera +phylloxeras phylloxera +phylogeneses phylogenesis +phylogenies phylogeny +pianos piano +piccolos piccolo +pichiciegos pichiciego +pickaninnies pickaninny +pickerels pickerel +pieds-a-terre pied-a-terre +piemen pieman +pies pie +pieties piety +pigfishes pigfish +piggeries piggery +piggies piggy +pigmies pigmy +pigsties pigpen pigsty +pikemen pikeman +pikeperches pikeperch +pikes pike +pilea pileum +pilei pileus +pilis pili +pillories pillory +pimentos pimento +pimientos pimiento +pinchpennies pinchpenny +pineries pinery +pineta pinetum +pinfishes pinfish +pingos pingo +pinkies pinkie pinky +pinkoes pinko +pinkos pinko +pinnae pinna +pinnas pinna +pinnies pinny +pinnulae pinnula +pinnules pinnule +pintails pintail +pintos pinto +pipefishes pipefish +piracies piracy +pirogi pirog +pis pi +piscaries piscary +piscinae piscina +piscinas piscina +pistachios pistachio +pitchmen pitchman +pithecanthropi pithecanthropus +pithoi pithos +pities pity +pitmen pitman +pituitaries pituitary +pixies pixie pixy +placeboes placebo +placebos placebo +placemen placeman +placentae placenta +placentas placenta +plaices plaice +plain-clothesmen plain-clothesman +plainsmen plainsman +planetaries planetary +planetariia planetarium +planetariums planetarium +planulae planula +plasmodesdesmata plasmodesma +plasmodesmata plasmodesma +plasmodesms plasmodesm +plasmodia plasmodium +plateaus plateau +plateaux plateau +platies platy +platypuses platypus +platys platy +pleasantries pleasantry +plectra plectron plectrum +plectrons plectron +plectrums plectrum +plena plenum +plenipotentiaries plenipotentiary +plenties plenty +plenums plenum +pleura pleuron +pleurae pleura +pleurotomies pleurotomy +plexuses plexus +plicae plica +plies ply +plonkos plonko +ploughmen ploughman plowman +plug-uglies plug-ugly +plumbagos plumbago +plumberies plumbery +pluralities plurality +plutocracies plutocracy +pneumectomies pneumectomy +pneumobacilli pneumobacillus +pneumococci pneumococcus +pneumonectomies pneumectomy pneumonectomy +pochards pochard +pocketfuls pocketful +pocketknives pocketknife +podia podium +podiums podium +poesies poesy +pogeys pogey +pogies pogy +pointsmen pointsman +pokeberries pokeberry +pokeys pokey +pokies poky +polarities polarity +polecats polecat +poleis polis +policemen policeman +policewomen policewoman +policies policy +politicos politico +polities polity +polkas polka +pollacks pollack +pollices pollex +polliniia pollinium +pollocks pollock +polonies polony +polyanthuses polyanthus +polychasia polychasium +polyhedra polyhedron +polyhedrons polyhedron +polyparies polypary +polyparparia polyparium +polyphonies polyphony +polypi polypus +polypodies polypody +polys poly +polyzoariia polyzoarium +pomelos pomelo +pommies pommy +pompanos pompano +pomposities pomposity +ponchos poncho +pondos pondo +ponies pony +pontes pons +pontifices pontifex +poppies poppy +porgies porgy +porosities porosity +porphyries porphyry +porpoises porpoise +portamenti portamento +portfolios portfolio +porticoes portico +porticos portico +portmanteaus portmanteau +portmanteaux portmanteau +pos po +posadas posada +posies posy +possemen posseman +possibilities possibility +postliminies postliminy +postliminiia postliminium +postmen postman +postwomen postmen postwoman +potatoes potato +potbelllies potbelly +potboys potboy +potences potence +potencies potency +potentialities potentiality +pothecarcaries pothecary +potiches potiche +potmen potman +potpourris potpourri +potteries pottery +potties potty +pottos potto +poulterers poulterer +poultrymen poultryman +pouts pout +praenomens praenomen +praenomina praenomen +praxes praxis +praxises praxis +prebendaries prebendary +preceptories preceptory +preciosities preciosity +predelle predella +pregnancies pregnancy +prehistories prehistory +prelacies prelacy +preliminaries preliminary +premaxillae premaxilla +prenonomens prenomen +prenonomina prenomen +presbyteries presbytery +prese presa +presidencies presidency +presidios presidio +pressmen pressman +prestissimos prestissimo +prestos presto +pretties pretty +pries pry +primacies primacy +primaries primary +primi primo +primigravidae primigravida +primigravidas primigravida +primiparae primipara +primiparas primipara +primordia primordium +primos primo +principalities principality +principiia principium +printeries printery +priories priory +priorities priority +privacies privacy +privies privy +privities privity +probabilities probability +proboscides proboscis +proboscises proboscis +proces-verbaux proces-verbal +proclivities proclivity +prodigies prodigy +profanities profanity +progenies progeny +proglotglottides proglottid proglottis +prognoses prognosis +prolegomena prolegomenon +prolepses prolepsis +proletarians proletarian +proletaries proletary +promiscuities promiscuity +promontories promontory +promycelilia promycelium +pronephra pronephros +pronephroi pronephros +pronuclei pronucleus +pronunciamentos pronunciamento +propensities propensity +properties property +prophecies prophecy +propmen propman +propositi propositus +proprietartaries proprietary +proprieties propriety +proptoses proptosis +propyla propylon +propylaea propylaeum +propylons propylon +pros pro +proscenia proscenium +prosceniums proscenium +prosencephala prosencephalon +prospectuses prospectus +prosperities prosperity +prostatectomies prostatectomy +prostheses prosthesis +prostomia prostomium +protases protasis +protectories protectory +prothalamimia prothalamion prothalamium +prothalli prothallus +prothallia prothallium +prothonotaries prothonotary protonotary +prothoraces prothorax +prothoraxes prothorax +protonemata protonema +protozoa protozoan +protozoans protozoan +proventricutriculi proventriculus +provisoes proviso +provisos proviso +provos provo +proxies proxy +prytanea prytaneum +psalmodies psalmody +psalteria psalterium +psalteries psaltery +pseudomutualities pseudomutuality +pseudopodia pseudopodium +psychohistories psychohistory +psychologies psychology +psychoneuroses psychoneurosis +psychos psycho +psychoses psychosis +ptarmigans ptarmigan +pterygia pterygium +pterylae pteryla +ptochocracies ptochocracy +ptoses ptosis +pubes pubis +pudenda pudendum +pueblos pueblo +pufferies puffery +puli pul +pullmans pullman +puls pul +pulvilli pulvillus +pulvini pulvinus +punchinelloes punchinello +punchinellos punchinello +punctilios punctilio +punties punty +pupae pupa +pupariia puparium +pupas pupa +puppies puppy +pussies pussy +pussyfoots pussyfoot +putamina putamen +puttees puttee +putti putto +putties putty +pycnidiia pycnidium +pygidiia pygidium +pygmies pigmy pygmy +pylorectomies pylorectomy +pylori pylorus +pyrographies pyrography +pyxides pyxis +pyxidiia pyxidium +qaddishim qaddish +qadis qadi +quackeries quackery +quadrennia quadrennium +quadrenniums quadrennium +quadricepses quadriceps +quadrigae quadriga +quadrigas quadriga +quaggas quagga +quails quail +qualia quale +qualities quality +quandaries quandary +quangos quango +quanta quantum +quantities quantity +quarries quarry +quarrymen quarryman +quarterlies quarterly +quarterstaves quarterstaff +quartos quarto +quatercentenaries quatercentenary +quaternaries quaternary +quebrachos quebracho +queries query +quetzals quetzal +quezales quezal +quichuas quichua +quiddities quiddity +quietuses quietus +quinaries quinary +quincentenaries quincentenary +quinquecentenaries quinquecentenary +quinquennia quinquennium +quintillions quintillion +quists quist +quizzes quiz +rabatos rabato rebato +rabbis rabbi +rabbitfishes rabbitfish +rabbitries rabbitry +rabbits rabbit +raccoons raccoon +rachides rhachis +rachises rachis +racoons racoon +radiances radiance +radiancies radiancy +radices radix +radii radius +radios radio +radiuses radius +radixes radix +radulae radula +railleries raillery +railwaymen railwayman +rallies rally +ramenta ramentum +rami ramus +rancheros ranchero +ranchos rancho +randies randy +ranunculi ranunculus +ranunculuses ranunculus +raphae raphe +raphides raphide raphis +rarities rarity +rascalities rascality +raspaies raspatory +raspberries raspberry +ratfishes ratfish +rationalities rationality +ratios ratio +razees razee +razzias razzia +re-entries re-entry +reactionaries reactionary +reales real +realities reality +reals real +rearmice rearmouse +rebatos rebato +rebozos rebozo +rebuses rebus +recoveries recovery +recta rectum +recti rectus +rectories rectory +rectos recto +rectrices rectrix +rectums rectum +redfishes redfish +rediae redia +redundancies redundancy +reeboks reebok +reedbucks reedbuck +refectories refectory +referenda referendum +referendums referendum +refineries refinery +reformatories reformatory +refractories refractory +refugia refugium +regalities regality +regencies regency +registries registry +reguli regulus +reguluses regulus +reichsmarks reichsmark +reindeers reindeer +reis real +relata relatum +reliquaries reliquary +reluctivities reluctivity +remaindermen remainderman +remedies remedy +remiges remex +renegados renegado +repairmen repairman +repertories repertory +replevies replevy +replies reply +repositories repository +reproducibilities reproducibility +repros repro +reremice rearmouse reremouse +reseaus reseau +reseaux reseau +residencies residency +residentiaries residentiary +residuua residuum +responsa responsum +responsibilities responsibility +responsories responsory +retia rete +retiararii retiarius +reticula reticulum +retinacula retinaculum +retinae retina +retinas retina +retros retro +revelries revelry +reverberatories reverberatory +reveries reverie revery +reversos reverso +revolutionaries revolutionary +rhabdomyomas rhabdomyoma +rhabdomyomata rhabdomyoma +rhachides rhachis +rhachises rachis rhachis +rhapsodies rhapsody +rhatanies rhatany +rheboks rhebok +rhinencephala rhinencephalon +rhinencephalons rhinencephalon +rhinoceroses rhinoceros +rhinos rhino +rhizobia rhizobium +rhizotomies rhizotomy +rhombi rhombus +rhombuses rhombus +rhonchi rhonchus +rhos rho +rhumbas rhumba +rhyta rhyton +rialtos rialto +ribbonfishes ribbonfish +ricercacari ricercare +ricercari ricercare +ricercars ricercar +rickettsiae rickettsia +rickettsias rickettsia +rictuses rictus +ridottos ridotto +riflemen rifleman +rilievi rilievo +ringhalses ringhals +risibilities risibility +rivalries rivalry +roaches roach +robalos robalo +robberies robbery +robes-de-chambre robe-de-chambre +rockeries rockery +rockfishes rockfish +rocklings rockling +rodeos rodeo +roebucks roebuck +roes roe +rogueries roguery +roma rom +romanies romany rommany +romans-fleuves roman-fleuve +romeos romeo +rondeaux rondeau +rondos rondo +roneos roneo +roofs roof +rookeries rookery +roomfuls roomful +rosaries rosary +rosarsaria rosarium +rosarsariums rosarium +rosefishes rosefish +rosemaries rosemary +roseries rosery +rostella rostellum +rostra rostrum +rostrums rostrum +rotaries rotary +rotls rotl +rouleaus rouleau +rouleaux rouleau +roundsmen roundsman +rowdies rowdy +royalties royalty +rubatos rubato +rubbies rubby +rubies ruby +ruckuses ruckus +rugae ruga +rumens rumen +rumina rumen +rummies rummy +rumpuses rumpus +runners-up runner-up +rupiahs rupiah +russes russ +russkies russky +russkis russki +sables sable +sacra sacrum +sacrarcraria sacrarium +sacristies sacristy +saddleries saddlery +safaris safari +safeties safety +saguaros saguaro sahuaro +sahaptans sahaptan +sahaptians sahaptian +sahaptins sahaptin +sailfishes sailfish +salaries salary +salesmen salesman +salespeople salesperson +sallies sally +salmis salmi +salmonberries salmonberry +salmonellae salmonella +salmons salmon +salpae salpa +salpas salpa +salpingectomies salpingectomy +salpinges salpinx +salsifies salsify +saltarelli saltarello +saltarellos saltarello +saltuses saltus +salvoes salvo +salvos salvo +sambars sambar +sambas samba +sambos sambo +samburs sambur +sammies sammy +samoyeds samoyed +sanatoriums sanatorium +sanbenitos sanbenito +sancta sanctum +sanctities sanctity +sanctuaries sanctuary +sanctums sanctum +sandflies sandfly +sandhis sandhi +sandmen sandman +sanitaria sanitarium +sanitariums sanitarium +saphenae saphena +sarcophagi sarcophagus +sarcophaguses sarcophagus +sardines sardine +sargassos sargasso +saris sari +sartorii sartorius +sassabies sassaby +sassasanidae sassanid +sassasanids sassanid +satrapies satrapy +saturnalias saturnalia +sauries saury +savageries savagery +savories savory +savouries savory savoury +sawboneses sawbones +sawfishes sawfish +sawflies sawfly +scads scad +scalades scalade +scalalados scalado +scaldfishes scaldfish +scaleni scalenus +scammonies scammony +scapulae scapula +scapulas scapula +scarabaei scarabaeus +scarabaeuses scarabaeus +scarcities scarcity +scarfs scarf +scarves scarf +scenarios scenario +sceneries scenery +schatchens schatchen +schatchonim schatchen shadchan +schemata schema +scherzandi scherzando +scherzandos scherzando +scherzi scherzo +scherzos scherzo +schizos schizo +schmoes schmo +scholia scholium +schoolmen schoolman +schuln schul +schutzstaffeln schutzstaffel +sciamachies sciamachy +sciomachies sciomachy +scirrhi scirrhus +scirrhuses scirrhus +scleromata scleroma +scleroses sclerosis +sclerotia sclerotium +sclerotomies sclerotomy +scoleces scolex +scolices scolex +scopulae scopula +scopulas scopula +scoriae scoria +scotchmen scotchman +scoters scoter +scotomas scotoma +scotomata scotoma +scotsmen scotsman +scotties scottie scotty +scriptoria scriptorium +scriptoriums scriptorium +scrota scrotum +scrotums scrotum +scrutinies scrutiny +scudi scudo +sculleries scullery +sculpins sculpin +scurries scurry +scuta scutum +scutella scutellum +scyphi scyphus +scyphistomae scyphistoma +scyphistomas scyphistoma +seamen seaman +seccos secco +secondaries secondary +secondi secondo +secrecies secrecy +secretaries secretary +secretaries-general secretary-general +sectaries sectary +secularities secularity +securities security +segni segno +seigneuries seigneury +seigniories seigniory +selectmen selectman +seleucidae seleucid +seleucids seleucid +selves self +seminaries seminary +seminoles seminole +semipros semipro +senecas seneca +seniorities seniority +senoras senora +senores senor +senoritas senorita +senors senor +sensibilities sensibility +sensilla sensillum +sensitivities sensitivity +sensualities sensuality +sentimentalities sentimentality +sentries sentry +senussis senusi senussi +separatrices separatrix +sephardim sephardi +septa septum +septariia septarium +septenaries septenary +septennia septennium +septenniums septennium +septillions septillion +sequelae sequela +sequestra sequestrum +sera serum +seraglios seraglio +serails serail +seraphim seraph +seraphs seraph +serenities serenity +serums serum +servals serval +serviceberries serviceberry +servicemen serviceman +servos servo +sestertia sestertium +setae seta +seventies seventy +severalties severalty +sexcentenaries sexcentenary +sextillions sextillion +sextodecimos sextodecimo +sextos sexto +sgraffiti sgraffito +shabbasim shabbas +shabbatim shabbat +shackoes shacko +shackos shacko +shadberries shadberry +shadchanim shadchan +shadchans schatchen shadchan +shads shad +shakoes shako +shakos shako +shammies shammy +shammosim shammas shammes +shamuses shamus +shandies shandy +shandygaffs shandygaff +shannies shanny +shans shan +shanteys shantey +shanties shanty +shawnees shawnee +sheatfishes sheatfish +sheaths sheath +sheaves sheaf +sheenies sheeny +sheepsheads sheepshead +shellfishes shellfish +shelties sheltie shelty +shelves shelf +sherpas sherpa +sherries sherry +shies shy +shikarees shikaree +shikaris shikari +shillyshallies shillyshally +shimmies shimmy +shindies shindy +shindigs shindig +shinleaves shinleaf +shinties shinny shinty +shipmasters shipmaster +shipmen shipman +shittahs shittah +shittim shittah +shluhs shluh +shmoes shmo +shofars shofar +shofroth shofar shophar +shojis shoji +shonas shona +shophars shophar +shophroth shophar +shorties shortie shorty +shoshones shoshone +shoshonis shoshoni +showmen showman +shrewmice shrewmouse +shrievalties shrievalty +shrubberies shrubbery +shufties shufty +shuggies shuggy +shuln shul +siddurim siddur +siddurs siddur +sidemen sideman +sidesmen sidesman +sigloi siglos +signalmen signalman +signatories signatory +signoras signora +signore signora +signori signior signore +signories signory +signorinas signorina +signorine signorina +signors signor +siliquae siliqua +siliquas siliqua +siliques silique +silos silo +silvae silva +silverfishes silverfish +similarities similarity +simplicities simplicity +simulacra simulacrum +sincipita sinciput +sinciputs sinciput +sindhis sindhi +sinfonie sinfonia +singularities singularity +sinhaleses sinhalese +sinuationtions sinuation +sinuosities sinuosity +sinuses sinus +siroccos sirocco +sissies sissy +sisters-in-law sister-in-law +sistra sistrum +situlae situla +sixmos sixmo +sixteenmos sixteenmo +sixties sixty +sixty-fourmos sixty-fourmo +skates skate +skellies skelly +skerries skerry +skiamachies skiamachy +skies sky +skinfuls skinful +skipjacks skipjack +skis ski +skivvies skivvy +skollies skollie skolly +skunks skunk +slaughtermen slaughterman +slavocracies slavocracy +slurries slurry +smalti smalto +smaltos smalto +smart_alecks smart_aleck +smarties smarty +smelts smelt +smitheries smithery +smithies smithy +smoothies smoothie smoothy +snaggleteeth snaggletooth +snailfishes snailfish +snappers snapper +snipefishes snipefish +snipes snipe +snooks snook +snotties snotty +snowberries snowberry +snowmen snowman +snuggeries snuggery +so-and-sos so-and-so +soapberries soapberry +socialities sociality +societies society +socmen socman sokeman +sodalities sodality +soddies soddy +softies softie softy +sokemen sokeman +sola solum +solaria solarium +solariums solarium +solatia solatium +soldi soldo +soldieries soldiery +solemnities solemnity +soles sol sole +solfeges solfege +solfegfeggi solfeggio +solfegfeggios solfeggio +solfeggi solfeggio +solfeggios solfeggio +soli solo +solidagos solidago +solidarities solidarity +solidi solidus +soliloquies soliloquy +solitaries solitary +solos solo +sols sol +solubilities solubility +solums solum +somalis somali +somas soma +somata soma +sombreros sombrero +somebodies somebody +somniloquies somniloquy +sondages sondage +songhais songhai +sonnies sonny +sons-in-law son-in-law +sophies sophi sophy +sophistries sophistry +soprani soprano +sopraninos sopranino +sopranos soprano +sorceries sorcery +sordini sordino +sorghos sorgho +sorgos sorgo +sori sorus +sororities sorority +soroses sorosis +sothos sotho +southeasterlies southeasterly +southerlies southerly +southwesterlies southwesterly +sovereignties sovereignty +sovkhozy sovkhoz +spacemen spaceman +spacewomen spacewoman +spadefishes spadefish +spadices spadix +spahees spahee +spahis spahi +sparlings sparling +speakeasies speakeasy +spearfishes spearfish +spearmen spearman +specialities speciality specialty +specialties specialty +speciosities speciosity +spectra spectrum +specula speculum +speculums speculum +speedos speedo +spermaries spermary +spermatia spermatium +spermatogonia spermatogonium +spermatozoa spermatozoon +spermogonia spermogonium +sphinges sphinx +sphinxes sphinx +spicae spica +spicas spica +spiceberries spiceberry +spiceries spicery +spicula spiculum +spidermen spiderman +spies spy +spirilla spirillum +spiritualities spirituality +spiritualties spiritualty +splayfeet splayfoot +splenectomies splenectomy +splenii splenius +spoilsmen spoilsman +spokesmen spokesman +spontaneities spontaneity +spoonfuls spoonful +spoonies spooney spoony +sporangia sporangium +sporogonia sporogonium +sports_arenas sports_arena +sportsmen sportsman +sportswomen sportswoman +springboks springbok +springbucks springbuck +springhase springhaas +spuggies spuggy +spugs spug +spumoni spumone +spurries spurrey spurry +sputa sputum +squabs squab +squaccos squacco +squamae squama +squashes squash +squeteagues squeteague +squids squid +squillae squilla +squillas squilla +squirearchies squirarchy squirearchy +squirrelfishes squirrelfish +squirrels squirrel +squizzes squiz +stabilities stability +stableboys stableboy +stablemen stableman +stadia stadium +stadiums stadium +staffmen staffman +staffs staff +stamens stamen +stamina stamen +staminodes staminode +staminonodia staminodium +stannaries stannary +stapedes stapes +staphylococci staphylococcus +starfishes starfish +startsy starets +statesmen statesman +statuaries statuary +statuses status +steadies steady +steelheads steelhead +steenboks steenbok +steersmen steersman +steinboks steinbok +stelae stele +steles stele +stenos steno +stenoses stenosis +stepchildren stepchild +stereos stereo +sterna sternum +sternums sternum +sternutatories sternutatory +stickfuls stickful +sties sty +stigmas stigma +stigmata stigma +stilettos stiletto +stimuli stimulus +stingies stingy +stipendiaries stipendiary +stipites stipes +stirpes stirps +stoae stoa +stoas stoa +stockfishes stockfish +stockmen stockman +stogies stogey stogy +stomata stoma +stomodaea stomodaeum +stomodea stomodeum +stonefishes stonefish +stoneflies stonefly +storeys storey +stories story +stotinki stotinka +stotkini stotinka +strabotomies strabotomy +strappadoes strappado +strata stratum +strategies strategy +strati stratus +stratocracies stratocracy +stratocumuli stratocumulus +stratums stratum +strawberries strawberry +streptococci streptococcus +stretti stretto +strettos stretto +striae stria +strobiles strobile +strobili strobilus +strobiluses strobilus +stromata stroma +strongmen strongman +strumae struma +stuccoes stucco +stuccos stucco +studies study +studios studio +stupidities stupidity +styes stye +styli stylus +stylopes stylops +stylopodia stylopodium +styluses stylus +stymies stymie stymy +subassemblies subassembly +subcortices subcortex +subdelirliria subdelirium +subdelirliriums subdelirium +subfamilies subfamily +subgenera subgenus +subgenuses subgenus +subindexes subindex +subindices subindex +submucosae submucosa +subordinaries subordinary +subphyla subphylum +subsidiaries subsidiary +subsidies subsidy +substrasta substratum +subtleties subtlety +subtreasuries subtreasury +succedanea succedaneum +succories succory +succubi succubus +suckerfishes suckerfish +suckfishes suckfish +sudardaria sudarium +sudatoria sudatorium +sudatories sudatory +sudatotoria sudatorium +sufficiencies sufficiency +sufis sufi +sulci sulcus +sulkies sulky +sullies sully +summae summa +summaries summary +summonses summons +sundries sundry +sunfishes sunfish +supercargoes supercargo +superegos superego +superfamilies superfamily +superheroes superhero +superintendencies superintendency +supermen superman +supernovae supernova +supernovas supernova +supernumeraries supernumerary +superstrata superstratum +superstratums superstratum +supplementaries supplementary +supplies supply +suppositories suppository +supremos supremo +sureties surety +surgeoncies surgeoncy +surgeonfishes surgeonfish +surgeries surgery +surpluses surplus +susceptibilities susceptibility +suspensories suspensory +sussos susso +susus susu +suzerainties suzerainty +swagmen swagman +swahilis swahili +swamies swami +swamis swami +swanneries swannery +swathes swathe +swaths swath +swazis swazi +sweetiewives sweetiewife +sweetmen sweetman +swellfishes swellfish +switchmen switchman +swordfishes swordfish +swordsmen swordsman +syconia syconium +syllabaries syllabary +syllabi syllabus +syllabuses syllabus +syllepses syllepsis +sylvas sylva +symmetries symmetry +sympathectomies sympathectomy +sympathies sympathy +symphonies symphony +symphyses symphysis +sympodia sympodium +symposia symposium +symposiums symposium +synapses synapsis +synarchies synarchy +synarthroses synarthrosis +synchros synchro +synclinoria synclinorium +syncytia syncytium +syndesmoses syndesmosis +synergies synergy +synonymies synonymy +synopses synopsis +syntagmata syntagma +syntagms syntagm +syntagtagmata syntagma +syntheses synthesis +syphilomas syphiloma +syphilomata syphiloma +syringes syrinx +syrinxes syrinx +syssarcoses syssarcosis +syzygies syzygy +t-men t-man +tabbies tabby +tableaus tableau +tableaux tableau +taboos taboo +tabus tabu +tacos taco +taeniae taenia tenia +taffies taffy +tagalogs tagalog +tailles taille +tainos taino +talers taler +tali talus +talismans talisman +tallaisim tallith +tallies tally +tallithes tallith +tallitoth tallith +tally-hos tally-ho +tallymen tallyman +taluses talus +tamarindos tamarindo +tamarinds tamarind +tamils tamil +tamises tamis +tammies tammy +tangelos tangelo +tangleberries tangleberry +tangos tango +tankas tanka +tanneries tannery +tansies tansy +tantivies tantivy +tapestries tapestry +tapeta tapetum +tapirs tapir +tarantulae tarantula +tarantulas tarantula +taros taro +tarpons tarpon +tarries tarry +tarsi tarsus +tarsometatarsi tarsometatarsus +tattoos tattoo +tautologies tautology +taxa taxon +taxies taxi +taxis taxi +teaberries teaberry +teals teal +technicalities technicality +technocracies technocracy +technologies technology +tectrices tectrix +teeth tooth +tegmina tegmen +telae tela +telamones telamon +telamons telamon +telangiectases telangiectasia telangiectasis +telia telium +tellies telly +telugus telugu +temnes temne +tempi tempo +temporalities temporality +tempos tempo +tenacula tenaculum +tenancies tenancy +tendencies tendency +tenderfeet tenderfoot +tenderfoots tenderfoot +teniae tenia +tennos tenno +tenorrhaphies tenorrhaphy +tenotomies tenotomy +tenues tenuis +teocallis teocalli +teraphim teraph +tercentenaries tercentenary +tercentennials tercentennial +teredines teredo +teredos teredo +terga tergum +termini terminus +terminologies terminology +terminuses terminus +ternaries ternary +terrarraria terrarium +terrarrariums terrarium +terries terry +territories territory +tertiaries tertiary +terzetti terzetto +terzettos terzetto +tesserae tessera +testae testa +testes testis +testimonies testimony +testudines testudo +tete-a-tetes tete-a-tete +tetrahedra tetrahedron +tetrahedrons tetrahedron +tetralogies tetralogy +tetrapodies tetrapody +tetras tetra +textuaries textuary +thais thai +thalamencephala thalamencephalon +thalamencephalons thalamencephalon +thalami thalamus +thalli thallus +thalluses thallus +thearchies thearchy +theatres-in-the-round theatre-in-the-round +thecae theca +theocracies theocracy +theodicies theodicy +theogonies theogony +theologies theology +theomachies theomachy +theophagies theophagy +theophanies theophany +theorbos theorbo +theories theory +therapies therapy +therses thyrse +thesauri thesaurus +thesauruses thesaurus +theses thesis +theurgies theurgy +thickleaves thickleaf +thieves thief +thirties thirty +thirty-twomos thirty-twomo +tholoi tholos +thoraces thorax +thoracoplasties thoracoplasty +thoracotomies thoracotomy +thoraxes thorax +thous thou +threadfins threadfin +three-sixties three-sixty +threnodes threnode +threnodies threnody +thrombi thrombus +thymi thymus +thymuses thymus +thyroidectomies thyroidectomy +thyrsi thyrsus +tibiae tibia +tibias tibia +ticals tical +tidies tidy +tiffanies tiffany +tilburies tilbury +tilefishes tilefish +timocracies timocracy +tintinnabula tintinnabulum +tipis tipi +tirewomen tirewoman +tiros tiro +tis ti +titis titi +titmen titman +titmice titmouse +titularies titulary +titulars titular +tivs tiv +tizzies tizzy +tlingits tlingit +to-dos to-do +toadfishes toadfish +toadies toady +tobaccoes tobacco +tobaccos tobacco +toddies toddy +todies tody +toffees toffee +toffies toffy +toiletries toiletry +tollies tollie tolly +toltecs toltec +tomatoes tomato +tombolos tombolo +tomenta tomentum +tomfooleries tomfoolery +tommies tommy +tonalities tonality +tondi tondo +tongas tonga +tonneaus tonneau +tonneaux tonneau +tonsillectomies tonsillectomy +tonsillotomies tonsillotomy +tootses toots +tootsies tootsie tootsy +tootsy-wootsies tootsy-wootsy +topees topee +tophi tophus +topiaries topiary +topis topi +topminnows topminnow +topographies topography +topoi topos +toreros torero +tori torus +tories tory +tornadoes tornado +tornados tornado +torpedoes torpedo +torsi torso +torsks torsk +torsos torso +tortuosities tortuosity +totalities totality +touracos touraco turaco +townsmen townsman +trabeculae trabecula +traceries tracery +tracheae trachea +tracheostomies tracheostomy +tracheotomies tracheotomy +trackmen trackman +tradesmen tradesman +traditores traditor +traditors traditor +tragedies tragedy +tragi tragus +tragicomedies tragicomedy +trajectories trajectory +transparencies transparency +trapezia trapezium +trapeziums trapezium +trapeziuses trapezius +trapezohedra trapezohedron +trapezohedrons trapezohedron +trapuntos trapunto +traumas trauma +traumata trauma +travesties travesty +treacheries treachery +treasuries treasury +treaties treaty +tremolos tremolo +trenchermen trencherman +treponemas treponema +treponemata treponema +treponemes treponeme +triarchies triarchy +tribesmen tribesman +tributaries tributary +tricepses triceps +trichinae trichina +trichotomies trichotomy +trickeries trickery +tricliniia triclinium +triennia triennium +trienniums triennium +trierarchies trierarchy +tries try +triforia triforium +triggerfishes triggerfish +trihedra trihedron +trihedrons trihedron +trilbies trilby +trilogies trilogy +trinities trinity +trios trio +tripletails tripletail +triplicities triplicity +tripodies tripody +triskeles triskele +triskelia triskelion +trisoctahedra trisoctahedron +trisoctahedrons trisoctahedron +triumviri triumvir +triumvirs triumvir +trivialities triviality +triviia trivium +triweeklies triweekly +trochleae trochlea +tropaeola tropaeolum +tropaeolums tropaeolum +trophies trophy +tropologies tropology +trous-de-loup trou-de-loup +trousseaus trousseau +trousseaux trousseau +trouts trout +trumperies trumpery +trunkfishes trunkfish +trusties trusty +trymata tryma +tsongas tsonga +tswanas tswana +tuaregs tuareg +tubae tuba +tubas tuba +tuberosities tuberosity +tubifexes tubifex +tummies tummy +tunas tuna +tunguses tungus +tunnies tunny +tupamaros tupamaro +tupelos tupelo +tupis tupi +turacos turaco +turbaries turbary +turbots turbot +turcos turco +turfmen turfman +turfs turf +turkeys turkey +turkmen turkman +turkomans turkoman +turneries turnery +turves turf +tuscaroras tuscarora +tutelaries tutelary +tutelars tutelar +tutsis tutsi +tuxedos tuxedo +tweenies tweeny +twelvemos twelvemo +twenties twenty +twinberries twinberry +twis twi +two-plies two-ply +tympana tympanum +tympanies tympany +tympanums tympanum +typos typo +tyrannies tyranny +tyros tiro tyro +ubermenschen ubermensch +udos udo +uglies ugli +uglis ugli +uigurs uighur +ulnae ulna +ulnas ulna +ulstermen ulsterman +ultimata ultimatum +ultimatums ultimatum +umbilici umbilicus +umbones umbo +umbos umbo +umbrae umbra +umbras umbra +umpies umpy +uncertainties uncertainty +unci uncus +uncicini uncinus +uncoes unco +unconformities unconformity +uncos unco +underbellies underbelly +underbodies underbody +undersecretaries undersecretary +understudies understudy +ungues unguis +ungulae ungula +uniformities uniformity +unities unity +universalities universality +universities university +upholsteries upholstery +uraeuses uraeus +uranalyses uranalysis +urbanities urbanity +uredidia uredium +uredines uredo +uredinia uredinium +uredinidinia uredinium +uredososori uredosorus +urethrae urethra +urethras urethra +urinalyses urinalysis +urinaries urinary +uruses urus +usuries usury +uteri uterus +utes ute +utilities utility +utricles utricle +utriculi utriculus +uvulae uvula +uvulas uvula +uzbeks uzbek +vacancies vacancy +vacua vacuum +vacuities vacuity +vacuums vacuum +vagaries vagary +vagi vagus vagus +vaginae vagina +vaginas vagina +vagotomies vagotomy +vagrancies vagrancy +valedictories valedictory +valencies valence valency +valetudinarians valetudinarian +valetudinaries valetudinary +valleculae vallecula +vanities vanity +vaporetti vaporetto +vaporettos vaporetto +varices varix +varicosities varicosity +varicotomies varicotomy +varieties variety +varsities varsity +vasa vas +vascula vasculum +vasculums vasculum +vasectomies vasectomy +veddas vedda +veeries veery +vela velum +velalamina velamen +velarlaria velarium +velleities velleity +velocities velocity +venae vena +vendaces vendace +vendas venda +veniremen venireman +ventriculi ventriculus +veracities veracity +verities verity +vermes vermis +verrucae verruca +verrucas verruca +versos verso +vertebrae vertebra +vertebras vertebra +vertexes vertex +vertices vertex +vertigines vertigo +vertigoes vertigo +vesicae vesica +vesicants vesicant +vesicatories vesicatory +vespiaries vespiary +vestries vestry +vestrymen vestryman +vetoes veto +vexilla vexillum +viatica viaticum +viaticums viaticum +viatores viator +vibracula vibraculum +vibratos vibrato +vibrios vibrio +vibrissae vibrissa +vice-chairman vice-chairman +viceroyalties viceroyalty +vicinities vicinity +victories victory +videos video +villainies villainy +villanellas villanella +villi villus +villosities villosity +vimina vimen +vincula vinculum +vineries vinery +vinos vino +violoncellos violoncello +viragoes virago +viragos virago +vireos vireo +vires vis +virtuosi virtuoso +virtuosos virtuoso +viruses virus +visas visa +visayans visayan +viscosities viscosity +visionaries visionary +vitae vita +vitalities vitality +vitelli vitellus +vitelluses vitellus +vittae vitta +vivacities vivacity +vivariia vivarium +vivariums vivarium +vocabularies vocabulary +voces vox +voguls vogul +volcanoes volcano +volcanos volcano +volkslieder volkslied +volte volta +voluntaries voluntary +voluptuaries voluptuary +volvae volva +volvas volva +volvuluses volvulus +vomitories vomitory +vomituses vomitus +voodoos voodoo +vortexes vortex +vorticellae vorticella +vortices vortex +votaries votary +votyaks votyak +vulgarities vulgarity +vulneraries vulnerary +vulvae vulva +vulvas vulva +waddies waddy +wadies wadi wady +wagons-lits wagon-lit +wahhabis wahabi wahhabi +wahoos wahoo +walkie-talkies walkie-talkie walky-talky +wallabies wallaby +wallaroos wallaroo +walleyes walleye +wallies wally +walruses walrus +wanderjahre wanderjahr +wanderoos wanderoo +wapitis wapiti +ward-heelers ward-heeler +warehousemen warehouseman +warranties warranty +washermen washman +washerwomen washerwoman +washwomen washwoman +watchmen watchman +watermen waterman +watusis watusi +waxberries waxberry +weakfishes weakfish +weasels weasel +weathermen weatherman +weeklies weekly +weepies weepy +weirdies weirdie +weirdos weirdo +welshmen welshman +welshwomen welshmen welshwoman +werewolves werewolf +westerlies westerly +whales whale +wharfs wharf +wharves wharf +wheelies wheelie +wherries wherry +whimseys whimsey +whimsies whimsy +whinnies whinny +whippers-in whipper-in +whiskies whisky +whitefishes whitefish +whiteflies whitefly +whities whity +whortleberries whortleberry +whys why +wicopies wicopy +wildcats wildcat +wildebeests wildebeest +wineries winery +winnebagos winnebago +winos wino +wiremen wireman +wires wire +witcheries witchery +withies withy +wives wife +wobblies wobbly +wolffishes wolffish +wollies wolly +wolofs wolof +wolves wolf +women woman +woodlice woodlouse +woodmen woodman +woodsmen woodsman +woollies woollie woolly +workmen workman +worries worry +worthies worthy +wos wo +wreaths wreath +wreckfishes wreckfish +wunderkinder wunderkind +wunderkinds wunderkind +xhosas xhosa +xiphisterna xiphisternum +xis xi +yabbies yabbie yabby +yachtsmen yachtsman +yachtswomen yachtsmen yachtswoman +yahoos yahoo +yakuts yakut +yearlies yearly +yellow-bellies yellow-belly +yellowtails yellowtail +yeomen yeoman +yeshivahs yeshiva +yeshivoth yeshiva +yo-yos yo-yo +yobbos yobbo +yobs yob +yogin yogi +yogis yogi +yokes yoke +yorubas yoruba +youngberries youngberry +yourselves yourself +youths youth +zamindaris zamindari zemindari +zanies zany +zapateados zapateado +zapotecs zapotec +zebras zebra +zecchini zecchino +zemstvos zemstvo +zeroes zero +zeros zero +zhos zho +zillions zillion +zlotys zloty +zoa zoon +zoaeae zoaea zoea +zoaeas zoaea +zoeae zoea +zoeas zoaea +zombies zombie +zombis zombi +zoologies zoology +zoonoses zoonosis +zoons zoon +zoos zoo +zoosporangia zoosporangium +zos zo +zucchettos zucchetto +zucchinis zucchini +zulus zulu diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/verb.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/verb.exc new file mode 100644 index 0000000..ba300df --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6-Exceptions/verb.exc @@ -0,0 +1,5281 @@ +abets abet +abetted abet +abetting abet +abhorred abhor +abhorring abhor +abhors abhor +abided abide +abides abide +abiding abide +abode abide +abought aby +about-shipped about-ship +about-shipping about-ship +about-ships about-ship +abuts abut +abutted abut +abutting abut +abye aby +abyes aby +abying aby +abys aby +accompanied accompany +accompanies accompany +accompanying accompany +accrued accrue +accrues accrue +accruing accrue +acetified acetify +acetifies acetify +acetifying acetify +acidified acidify +acidifies acidify +acidifying acidify +acquits acquit +acquitted acquit +acquitting acquit +ad-libbed ad-lib +ad-libbing ad-lib +ad-libs ad-lib +addressed address +addresses address +addressing address +addrest address +admits admit +admitted admit +admitting admit +aerified aerify +aerifies aerify +aerifying aerify +aged age +ageing age +ages age +aging age +agreed agree +agreeing agree +agrees agree +air-dried air-dry +air-dries air-dry +air-drying air-dry +airdropped airdrop +airdropping airdrop +airdrops airdrop +alkalified alkalify +alkalifies alkalify +alkalifying alkalify +allied ally +allies ally +allots allot +allotted allot +allotting allot +allowed_for allow_for +allowing_for allow_for +allows_for allow_for +allying ally +am be +ammonified ammonify +ammonifies ammonify +ammonifying ammonify +amnestied amnesty +amnesties amnesty +amnestying amnesty +amplified amplify +amplifies amplify +amplifying amplify +anglicised anglicise +anglicises anglicise +anglicising anglicise +anglicized anglicize +anglicizes anglicize +anglicizing anglicize +anglified anglify +anglifies anglify +anglifying anglify +annulled annul +annulling annul +annuls annul +anted ante +anteed ante +anteing ante +antes ante +appalled appal appall +appalling appal appall +appalls appall +appals appal +applied apply +applies apply +appliqued applique +appliqueing applique +appliques applique +applying apply +arced arc +arcing arc +arcked arc +arcking arc +arcs arc +are be +argued argue +argues argue +argufied argufy +argufies argufy +argufying argufy +arguing argue +arisen arise +arises arise +arising arise +arose arise +ate eat +atrophied atrophy +atrophies atrophy +atrophying atrophy +averred aver +averring aver +avers aver +awaked awake +awakes awake +awaking awake +awoke awake +awoken awake +baaed baa +baaing baa +baas baa +babied baby +babies baby +baby-sat baby-sit +baby-sits baby-sit +baby-sitting baby-sit +babying baby +back-pedaled back-pedal +back-pedaling back-pedal +back-pedalled back-pedal +back-pedalling back-pedal +back-pedals back-pedal +backbit backbite +backbites backbite +backbiting backbite +backbitten backbite +backslid backslide +backslidden backslide +backslides backslide +backsliding backslide +bade bid +bagged bag +bagging bag +bags bag +balloted ballot +balloting ballot +ballots ballot +ballyhooed ballyhoo +ballyhooing ballyhoo +ballyhoos ballyhoo +ballyragged ballyrag +ballyragging ballyrag +ballyrags ballyrag +bandied bandy +bandies bandy +bandying bandy +banned ban +banning ban +banqueted banquet +banqueting banquet +banquets banquet +bans ban +barbecued barbecue +barbecues barbecue +barbecuing barbecue +barred bar +barreled barrel +barreling barrel +barrelled barrel +barrelling barrel +barrels barrel +barring bar +bars bar +basified basify +basifies basify +basifying basify +basseted basset +basseting basset +bassets basset +bastinadoed bastinado +bastinadoes bastinado +bastinadoing bastinado +bats bat +batted bat +batting bat +bayoneted bayonet +bayoneting bayonet +bayonets bayonet +bayonetted bayonet +bayonetting bayonet +beared bear +bearing bear +bears bear +beaten beat +beatified beatify +beatifies beatify +beatifying beatify +beating beat +beats beat +beautified beautify +beautifies beautify +beautifying beautify +became become +became_known become_known +becomes become +becomes_known become_known +becoming become +bed bed +bedded bed +bedding bed +bedeviled bedevil +bedeviling bedevil +bedevilled bedevil +bedevilling bedevil +bedevils bedevil +bedighted bedight +bedighting bedight +bedights bedight +bedimmed bedim +bedimming bedim +bedims bedim +beds bed +been be +befallen befall +befalling befall +befalls befall +befell befall +befits befit +befitted befit +befitting befit +befogged befog +befogging befog +befogs befog +began begin +begat beget +begets beget +begetting beget +begged beg +begging beg +beginning begin +begins begin +begirded begird +begirding begird +begirds begird +begirt begird +begot beget +begotten beget +begs beg +beguiled beguile +beguiles beguile +beguiling beguile +begun begin +beheld behold +beholden behold +beholding behold +beholds behold +bejeweled bejewel +bejeweling bejewel +bejewelled bejewel +bejewelling bejewel +bejewels bejewel +belayed belay +belaying belay +belays belay +belied belie +belies belie +bellied belly +bellies belly +belly-flopped belly-flop +belly-flopping belly-flop +belly-flops belly-flop +bellying belly +belying belie +benamed bename +benames bename +benaming bename +bending bend +bends bend +benefited benefit +benefiting benefit +benefitted benefit +benefitting benefit +benempt bename +bent bend +berried berry +berries berry +berrying berry +beseeched beseech +beseeches beseech +beseeching beseech +besets beset +besetting beset +besought beseech +bespeaking bespeak +bespeaks bespeak +bespoke bespeak +bespoken bespeak +bespreading bespread +bespreads bespread +besteaded bestead +besteading bestead +besteads bestead +bestirred bestir +bestirring bestir +bestirs bestir +bestrewed bestrew +bestrewing bestrew +bestrewn bestrew +bestrews bestrew +bestrid bestride +bestridden bestride +bestrides bestride +bestriding bestride +bestrode bestride +betaken betake +betakes betake +betaking betake +bethinking bethink +bethinks bethink +bethought bethink +betook betake +bets bet +betted bet +betting bet +beveled bevel +beveling bevel +bevelled bevel +bevelling bevel +bevels bevel +biased bias +biases bias +biasing bias +biassed bias +biassing bias +bidden bid +bidding bid +bids bid +binding bind +binds bind +binned bin +binning bin +bins bin +bird-dogged bird-dog +bird-dogging bird-dog +bird-dogs bird-dog +bit bite +bites bite +biting bite +bits bit +bitted bit +bitten bite +bitting bit +bivouacked bivouac +bivouacking bivouac +bivouacs bivouac +blabbed blab +blabbing blab +blabs blab +blackberried blackberry +blackberries blackberry +blackberrying blackberry +blacklegged blackleg +blacklegging blackleg +blacklegs blackleg +blats blat +blatted blat +blatting blat +bled bleed +bleeding bleed +bleeds bleed +blessed bless +blesses bless +blessing bless +blest bless +blew blow +blew_one's_nose blow_one's_nose +blipped blip +blipping blip +blips blip +blobbed blob +blobbing blob +blobs blob +bloodied bloody +bloodies bloody +bloodying bloody +blots blot +blotted blot +blotting blot +blowing blow +blowing_one's_nose blow_one's_nose +blown blow +blows blow +blows_one's_nose blow_one's_nose +blubbed blub +blubbing blub +blubs blub +blue-pencilled blue-pencil +blue-pencilling blue-pencil +blue-pencills blue-pencil +blued blue +blueing blue +blues blue +bluing blue +blurred blur +blurring blur +blurs blur +bobbed bob +bobbing bob +bobs bob +bodied body +bodies body +bodying body +bogged-down bog-down +bogged_down bog_down +bogging-down bog-down +bogging_down bog_down +bogs-down bog-down +bogs_down bog_down +booby-trapped booby-trap +booby-trapping booby-trap +booby-traps booby-trap +booed boo +boogied boogie +boogieing boogie +boogies boogie +boohooed boohoo +boohooing boohoo +boohoos boohoo +booing boo +boos boo +bootlegged bootleg +bootlegging bootleg +bootlegs bootleg +bopped bop +bopping bop +bops bop +bore bear +born bear +borne bear +bottle-fed bottle-feed +bottle-feeding bottle-feed +bottle-feeds bottle-feed +bought buy +bound bind +bragged brag +bragging brag +brags brag +breaking break +breaks break +breast-fed breast-feed +breast-feeding breast-feed +breast-feeds breast-feed +bred breed +breeding breed +breeds breed +breid brei +breiing brei +breis brei +breveted brevet +breveting brevet +brevets brevet +brevetted brevet +brevetting brevet +brimmed brim +brimming brim +brims brim +bringing bring +brings bring +broadcasted broadcast +broadcasting broadcast +broadcasts broadcast +broke break +broken break +brought bring +browbeaten browbeat +browbeating browbeat +browbeats browbeat +brutified brutify +brutifies brutify +brutifying brutify +buckramed buckram +buckraming buckram +buckrams buckram +budded bud +budding bud +buds bud +buffeted buffet +buffeting buffet +buffets buffet +bugged bug +bugging bug +bugs bug +building build +builds build +built build +bulldogging bulldog +bullied bully +bullies bully +bullshits bullshit +bullshitted bullshit +bullshitting bullshit +bullwhipped bullwhip +bullwhipping bullwhip +bullwhips bullwhip +bullying bully +bullyragged bullyrag +bullyragging bullyrag +bullyrags bullyrag +bummed bum +bumming bum +bums bum +buncoed bunco +buncoing bunco +buncos bunco +bunkoed bunko +bunkoing bunko +bunkos bunko +buried bury +buries bury +burlesked burlesk +burlesking burlesk +burlesks burlesk +burlesqued burlesque +burlesques burlesque +burlesquing burlesque +burned burn +burning burn +burns burn +burnt burn +burred bur +burring bur +burs bur +bursting burst +bursts burst +burying bury +bused bus +buses bus +busheled bushel +busheling bushel +bushelled bushel +bushelling bushel +bushels bushel +busied busy +busies busy +busing bus +bussed buss +busses buss +bussing buss +busted bust +busting bust +busts bust +busying busy +buying buy +buys buy +bypassed bypass +bypasses bypass +bypassing bypass +bypast bypass +caballed cabal +caballing cabal +cabals cabal +caddied caddie caddy +caddies caddie caddy +caddying caddie caddy +calcified calcify +calcifies calcify +calcifying calcify +calqued calque +calques calque +calquing calque +came come +canaled canal +canaling canal +canalled canal +canalling canal +canals canal +canceled cancel +canceling cancel +cancelled cancel +cancelling cancel +cancels cancel +candied candy +candies candy +candying candy +canned can +canning can +canopied canopy +canopies canopy +canopying canopy +cans can +capped cap +capping cap +caps cap +carbonadoed carbonado +carbonadoing carbonado +carbonados carbonado +carbureted carburet +carbureting carburet +carburets carburet +carburetted carburet +carburetting carburet +carillonned carillon +carillonning carillon +carillons carillon +carneyed carney +carneying carney +carneys carney +carnied carny +carnies carny +carnified carnify +carnifies carnify +carnifying carnify +carnying carny +caroled carol +caroling carol +carolled carol +carolling carol +carols carol +carried carry +carries carry +carrying carry +casefied casefy +casefies casefy +casefying casefy +casting cast +casts cast +catches catch +catching catch +catnapped catnap +catnapping catnap +catnaps catnap +cats cat +catted cat +catting cat +caught catch +caviled cavil +caviling cavil +cavilled cavil +cavilling cavil +cavils cavil +certified certify +certifies certify +certifying certify +channeled channel +channeling channel +channelled channel +channelling channel +channels channel +chapped chap +chapping chap +chaps chap +charred char +charring char +chars char +chassed chasse +chasseing chasse +chasses chasse +chats chat +chatted chat +chatting chat +chevied chivy +chevies chivy +chevying chivy +chid chide +chidden chide +chided chide +chides chide +chiding chide +chinned chin +chinning chin +chins chin +chipped chip +chipping chip +chips chip +chiseled chisel +chiseling chisel +chiselled chisel +chiselling chisel +chisels chisel +chitchats chitchat +chitchatted chitchat +chitchatting chitchat +chivied chivy +chivies chivy +chivs chiv +chivved chiv +chivvied chivy +chivvies chivy +chivving chiv +chivvying chivy +chivying chivy +chondrified chondrify +chondrifies chondrify +chondrifying chondrify +chooses choose +choosing choose +chopped chop +chopping chop +chops chop +chose choose +chosen choose +chugged chug +chugging chug +chugs chug +chummed chum +chumming chum +chums chum +citified citify +citifies citify +citifying citify +clad clothe +cladding clad +clads clad +clammed clam +clamming clam +clams clam +clapped clap +clapping clap +claps clap +clarified clarify +clarifies clarify +clarifying clarify +classified classify +classifies classify +classifying classify +cleaved cleave +cleaves cleave +cleaving cleave +cleft cleave +clemmed clem +clemming clem +clems clem +cleped clepe +clepes clepe +cleping clepe +clept clepe +clinging cling +clings cling +clipped clip +clipping clip +clips clip +clogged clog +clogging clog +clogs clog +clopped clop +clopping clop +clops clop +clothed clothe +clothes clothe +clothing clothe +clots clot +clotted clot +clotting clot +clove cleave +cloven cleave +clubbed club +clubbing club +clubs club +clued clue +clues clue +cluing clue +clung cling +co-opted co-opt +co-opted coopt +co-opting co-opt +co-opting coopt +co-opts co-opt +co-opts coopts +co-ordinate coordinate +co-ordinated coordinate +co-ordinates coordinate +co-ordinating coordinate +co-starred co-star +co-starring co-star +co-stars co-star +cockneyfied cockneyfy +cockneyfies cockneyfy +cockneyfying cockneyfy +codded cod +codding cod +codified codify +codifies codify +codifying codify +cods cod +cogged cog +cogging cog +cogs cog +coiffed coif +coiffing coif +coifs coif +collied colly +collies colly +collogued collogue +collogues collogue +colloguing collogue +collying colly +combated combat +combating combat +combats combat +combatted combat +combatting combat +commits commit +committed commit +committing commit +compelled compel +compelling compel +compels compel +complied comply +complies comply +complots complot +complotted complot +complotting complot +complying comply +concertinaed concertina +concertinaing concertina +concertinas concertina +concurred concur +concurring concur +concurs concur +confabbed confab +confabbing confab +confabs confab +conferred confer +conferring confer +confers confer +congaed conga +congaing conga +congas conga +conned con +conning con +cons con +construed construe +construes construe +construing construe +contangoed contango +contangoes contango +contangoing contango +continued continue +continues continue +continuing continue +controlled control +controlling control +controls control +cooed coo +cooeed cooee +cooeeing cooee +cooees cooee +cooeyed cooey +cooeying cooey +cooeys cooey +cooing coo +coos coo +copied copy +copies copy +copped cop +copping cop +cops cop +copying copy +copyreading copyread +copyreads copyread +coquets coquet +coquetted coquet +coquetting coquet +corralled corral +corralling corral +corrals corral +costing cost +costs cost +counseled counsel +counseling counsel +counselled counsel +counselling counsel +counsels counsel +counterplots counterplot +counterplotted counterplot +counterplotting counterplot +countersank countersink +countersinking countersink +countersinks countersink +countersunk countersink +court-martialled court-martial +court-martialling court-martial +court-martials court-martial +crabbed crab +crabbing crab +crabs crab +crammed cram +cramming cram +crams cram +crapped crap +crapping crap +craps crap +creeping creep +creeps creep +crept creep +crescendoed crescendo +crescendoes crescendo +crescendoing crescendo +cribbed crib +cribbing crib +cribs crib +cried cry +cries cry +crocheted crochet +crocheting crochet +crochets crochet +cropped crop +cropping crop +crops crop +croqueted croquet +croqueting croquet +croquets croquet +crossbred crossbreed +crossbreeding crossbreed +crossbreeds crossbreed +crosscuts crosscut +crosscutting crosscut +crucified crucify +crucifies crucify +crucifying crucify +crying cry +crystallized crystallize +crystallizes crystallize +crystallizing crystallize +cubbed cub +cubbing cub +cubs cub +cuckooed cuckoo +cuckooing cuckoo +cuckoos cuckoo +cudgeled cudgel +cudgeling cudgel +cudgelled cudgel +cudgelling cudgel +cudgels cudgel +cued cue +cues cue +cuing cue +cupeled cupel +cupeling cupel +cupelled cupel +cupelling cupel +cupels cupel +cupped cup +cupping cup +cups cup +curets curet +curetted curet +curettes curet +curetting curet +curried curry +curries curry +currying curry +cursed curse +curses curse +cursing curse +curst curse +curtseyed curtsey +curtseying curtsey +curtseys curtsey +curtsied curtsy +curtsies curtsy +curtsying curtsy +curveted curvet +curveting curvet +curvets curvet +curvetted curvet +curvetting curvet +cutting cut +dabbed dab +dabbing dab +dabs dab +dagged dag +dagging dag +dags dag +dallied dally +dallies dally +dallying dally +dammed dam +damming dam +damnified damnify +damnifies damnify +damnifying damnify +dams dam +dandified dandify +dandifies dandify +dandifying dandify +dapped dap +dapping dap +daps dap +de-emphasized de-emphasize +de-emphasizes de-emphasize +de-emphasizing de-emphasize +dealt deal +debarred debar +debarring debar +debars debar +debugged debug +debugging debug +debugs debug +debused debus +debuses debus +debusing debus +debussed debus +debusses debus +debussing debus +decalcified decalcify +decalcifies decalcify +decalcifying decalcify +declassified declassify +declassifies declassify +declassifying declassify +decontrolled decontrol +decontrolling decontrol +decontrols decontrol +decreed decree +decreeing decree +decrees decree +decried decry +decries decry +decrying decry +deep-freeze deepfreeze +deep-freezed deepfreeze +deep-freezes deepfreeze +deep-fried deep-fry +deep-fries deep-fry +deep-frying deep-fry +deferred defer +deferring defer +defers defer +defied defy +defies defy +defying defy +degases degas +degassed degas +degasses degas +degassing degas +dehumidified dehumidify +dehumidifies dehumidify +dehumidifying dehumidify +deified deify +deifies deify +deifying deify +deled dele +deleing dele +deles dele +demits demit +demitted demit +demitting demit +demobbed demob +demobbing demob +demobs demob +demulsified demulsify +demulsifies demulsify +demulsifying demulsify +demurred demur +demurring demur +demurs demur +demystified demystify +demystifies demystify +demystifying demystify +denazified denazify +denazifies denazify +denazifying denazify +denied deny +denies deny +denitrified denitrify +denitrifies denitrify +denitrifying denitrify +denned den +denning den +dens den +denying deny +descried descry +descries descry +descrying descry +deterred deter +deterring deter +deters deter +detoxified detoxify +detoxifies detoxify +detoxifying detoxify +devaluated devaluate +devaluates devaluate +devaluating devaluate +devalued devalue +devalues devalue +devaluing devalue +deviled devil +deviling devil +devilled devil +devilling devil +devils devil +devitrified devitrify +devitrifies devitrify +devitrifying devitrify +diagramed diagram +diagraming diagram +diagrammed diagram +diagramming diagram +diagrams diagram +dialed dial +dialing dial +dialled dial +dialling dial +dials dial +dibbed dib +dibbing dib +dibs dib +did do +die-casting die-cast +die-casts die-cast +died die +dies die +digging dig +dighted dight +dighting dight +dights dight +dignified dignify +dignifies dignify +dignifying dignify +digs dig +dilly-dallied dilly-dally +dilly-dallies dilly-dally +dilly-dallying dilly-dally +dimmed dim +dimming dim +dims dim +dinned din +dinning din +dins din +dipped dip +dipping dip +dips dip +dirtied dirty +dirties dirty +dirtying dirty +disagreed disagree +disagreeing disagree +disagrees disagree +disannulled disannul +disannulling disannul +disannuls disannul +disbarred disbar +disbarring disbar +disbars disbar +disbudded disbud +disbudding disbud +disbuds disbud +discontinued discontinue +discontinues discontinue +discontinuing discontinue +disembodied disembody +disembodies disembody +disembodying disembody +disembogued disembogue +disembogues disembogue +disemboguing disembogue +disemboweled disembowel +disemboweling disembowel +disembowelled disembowel +disembowelling disembowel +disembowels disembowel +disenthralled disenthral disenthrall +disenthralling disenthral disenthrall +disenthralls disenthral +disenthrals disenthrall +disheveled dishevel +disheveling dishevel +dishevelled dishevel +dishevelling dishevel +dishevels dishevel +disinterred disinter +disinterring disinter +disinters disinter +dispelled dispel +dispelling dispel +dispels dispel +disqualified disqualify +disqualifies disqualify +disqualifying disqualify +dissatisfied dissatisfy +dissatisfies dissatisfy +dissatisfying dissatisfy +distilled distil distill +distilling distil distill +distills distill +distils distil +dittoed ditto +dittoing ditto +dittos ditto +dived dive +diversified diversify +diversifies diversify +diversifying diversify +dives dive +diving dive +divvied divvy +divvies divvy +divvying divvy +dizzied dizzy +dizzies dizzy +dizzying dizzy +does do +dogged dog +dogging dog +doglegged dogleg +doglegging dogleg +doglegs dogleg +dogs dog +doing do +dollied dolly +dollies dolly +dollying dolly +done do +donned don +donning don +dons don +dots dot +dotted dot +dotting dot +double-tongued double-tongue +double-tongues double-tongue +double-tonguing double-tongue +dought dow +dove dive +dowed dow +dowing dow +dows dow +drabbed drab +drabbing drab +drabs drab +dragged drag +dragging drag +drags drag +drank drink +drawing draw +drawn draw +draws draw +dreamed dream +dreaming dream +dreams dream +dreamt dream +dreed dree +dreeing dree +drees dree +drew draw +dried dry +dries dry +drinking drink +drinks drink +dripped drip +dripping drip +drips drip +driveled drivel +driveling drivel +drivelled drivel +drivelling drivel +drivels drivel +driven drive +drives drive +driving drive +dropped drop +dropping drop +drops drop +drove drive +drubbed drub +drubbing drub +drubs drub +drugged drug +drugging drug +drugs drug +drummed drum +drumming drum +drunk drink +drying dry +dubbed dub +dubbing dub +dubs dub +dueled duel +dueling duel +duelled duel +duelling duel +duels duel +dug dig +dulcified dulcify +dulcifies dulcify +dulcifying dulcify +dummied dummy +dummies dummy +dummying dummy +dunned dun +dunning dun +duns dun +dwelled dwell +dwelling dwell +dwells dwell +dwelt dwell +dyed dye +dyeing dye +dyes dye +dying die +easied easy +easies easy +easying easy +eaten eat +eating eat +eats eat +eavesdropped eavesdrop +eavesdropping eavesdrop +eavesdrops eavesdrop +echoed echo +echoes echo +echoing echo +eddied eddy +eddies eddy +eddying eddy +edified edify +edifies edify +edifying edify +ego-tripped ego-trip +ego-tripping ego-trip +ego-trips ego-trip +electrified electrify +electrifies electrify +electrifying electrify +embargoed embargo +embargoes embargo +embargoing embargo +embedded embed +embedding embed +embeds embed +embodied embody +embodies embody +embodying embody +embrued embrue +embrues embrue +embruing embrue +embused embus +embuses embus +embusing embus +embussed embus +embusses embus +embussing embus +emceed emcee +emceeing emcee +emcees emcee +emits emit +emitted emit +emitting emit +empaneled empanel +empaneling empanel +empanelled empanel +empanelling empanel +empanels empanel +emptied empty +empties empty +emptying empty +emulsified emulsify +emulsifies emulsify +emulsifying emulsify +enameled enamel +enameling enamel +enamelled enamel +enamelling enamel +enamels enamel +endued endue +endues endue +enduing endue +engluts englut +englutted englut +englutting englut +enrolled enrol enroll +enrolling enrol enroll +enrolls enroll +enrols enrol +ensued ensue +ensues ensue +ensuing ensue +enthralled enthral enthrall +enthralling enthral enthrall +enthralls enthrall +enthrals enthral +entrammelled entrammel +entrammelling entrammel +entrammels entrammel +entrapped entrap +entrapping entrap +entraps entrap +envied envy +envies envy +envying envy +enwinding enwind +enwinds enwind +enwound enwind +enwrapped enwrap +enwrapping enwrap +enwraps enwrap +equaled equal +equaling equal +equalled equal +equalling equal +equals equal +equipped equip +equipping equip +equips equip +espied espy +espies espy +espying espy +esterified esterify +esterifies esterify +esterifying esterify +estopped estop +estopping estop +estops estop +etherified etherify +etherifies etherify +etherifying etherify +excelled excel +excelling excel +excels excel +exemplified exemplify +exemplifies exemplify +exemplifying exemplify +expelled expel +expelling expel +expels expel +extolled extol extoll +extolling extol extoll +extolls extoll +extols extol +eyed eye +eyeing eye +eyes eye +eying eye +faceted facet +faceting facet +facets facet +facetted facet +facetting facet +facsimiled facsimile +facsimileing facsimile +facsimiles facsimile +fagged fag +fagging fag +fags fag +fallen fall +falling fall +falls fall +falsified falsify +falsifies falsify +falsifying falsify +fancied fancy +fancies fancy +fancying fancy +fanned fan +fanning fan +fans fan +fantasied fantasy +fantasies fantasy +fantasying fantasy +fatigued fatigue +fatigues fatigue +fatiguing fatigue +fats fat +fatted fat +fatting fat +featherbedded featherbed +featherbedding featherbed +featherbeds featherbed +fed feed +feed feed fee +feeding feed +feeds feed +feeing fee +feeling feel +feels feel +fees fee +fell fall +felt feel felt +felted felt +felting felt +felts felt +ferried ferry +ferries ferry +ferrying ferry +fibbed fib +fibbing fib +fibs fib +figged fig +figging fig +fighting fight +fights fight +filagreed filagree +filagreeing filagree +filagrees filagree +filigreed filigree +filigreeing filigree +filigrees filigree +fillagreed fillagree +fillagreeing fillagree +fillagrees fillagree +filled_up fill_up +finding find +finds find +fine-drawing fine-draw +fine-drawn fine-draw +fine-draws fine-draw +fine-drew fine-draw +finned fin +finning fin +fins fin +fits fit +fitted fit +fitting fit +flagged flag +flagging flag +flags flag +flammed flam +flamming flam +flams flam +flanneled flannel +flanneling flannel +flannelled flannel +flannelling flannel +flannels flannel +flapped flap +flapping flap +flaps flap +flats flat +flatted flat +flatting flat +fled flee +fleeing flee +flees flee +flew fly +flies fly +flimflammed flimflam +flimflamming flimflam +flimflams flimflam +flinging fling +flings fling +flip-flopped flip-flop +flip-flopping flip-flop +flip-flops flip-flop +flipped flip +flipping flip +flips flip +flits flit +flitted flit +flitting flit +flogged flog +flogging flog +flogs flog +floodlighting floodlight +floodlights floodlight +floodlit floodlight +flopped flop +flopping flop +flops flop +flown fly +flubbed flub +flubbing flub +flung fling +flurried flurry +flurries flurry +flurrying flurry +flyblew flyblow +flyblowing flyblow +flyblown flyblow +flyblows flyblow +flying fly +fobbed fob +fobbing fob +fobs fob +focused focus +focuses focus +focusing focus +fogged fog +fogging fog +fogs fog +folioed folio +folioing folio +folios folio +footslogged footslog +footslogging footslog +footslogs footslog +forbad forbid +forbade forbid +forbearing forbear +forbears forbear +forbidden forbid +forbidding forbid +forbids forbid +forbore forbear +forborne forbear +force-fed force-feed +force-feeding force-feed +force-feeds force-feed +fordid fordo +fordoes fordo +fordoing fordo +fordone fordo +forecasted forecast +forecasting forecast +forecasts forecast +foredid foredo +foredoes foredo +foredoing foredo +foredone foredo +foregoes forego +foregoing forego +foregone forego +foreknew foreknow +foreknowing foreknow +foreknown foreknow +foreknows foreknow +foreran forerun +forerunning forerun +foreruns forerun +foresaw foresee +foreseeing foresee +foreseen foresee +foresees foresee +foreshowed foreshow +foreshowing foreshow +foreshown foreshow +foreshows foreshow +forespeaking forespeak +forespeaks forespeak +forespoke forespeak +forespoken forespeak +foretelling foretell +foretells foretell +foretold foretell +forewent forego +forgave forgive +forgets forget +forgetting forget +forgiven forgive +forgives forgive +forgiving forgive +forgoes forgo +forgoing forgo +forgone forgo +forgot forget +forgotten forget +formats format +formatted format +formatting format +forsaken forsake +forsakes forsake +forsaking forsake +forsook forsake +forspeaking forspeak +forspeaks forspeak +forspoke forspeak +forspoken forspeak +forswearing forswear +forswears forswear +forswore forswear +forsworn forswear +fortified fortify +fortifies fortify +fortifying fortify +forwent forgo +fought fight +found find +foxtrots foxtrot +foxtrotted foxtrot +foxtrotting foxtrot +frapped frap +frapping frap +fraps frap +freed free +freeing free +frees free +freeze-dried freeze-dry +freeze-dries freeze-dry +freeze-drying freeze-dry +freezes freeze +freezing freeze +frenchified frenchify +frenchifies frenchify +frenchifying frenchify +frenzied frenzy +frenzies frenzy +frenzying frenzy +frets fret +fretted fret +fretting fret +fricasseed fricassee +fricasseeing fricassee +fricassees fricassee +fried fry +fries fry +frigged frig +frigging frig +frigs frig +frits frit +fritted frit fritt +fritting frit fritt +fritts fritt +frivoled frivol +frivoling frivol +frivolled frivol +frivolling frivol +frivols frivol +frogged frog +frogging frog +frogs frog +frolicked frolic +frolicking frolic +frolics frolic +froze freeze +frozen freeze +fructified fructify +fructifies fructify +fructifying fructify +frying fry +fueled fuel +fueling fuel +fuelled fuel +fuelling fuel +fuels fuel +fulfilled fulfil fulfill +fulfilling fulfil fulfill +fulfills fulfill +fulfils fulfil +funned fun +funneled funnel +funneling funnel +funnelled funnel +funnelling funnel +funnels funnel +funning fun +funs fun +furred fur +furring fur +furs fur +gadded gad +gadding gad +gads gad +gagged gag +gagging gag +gags gag +gainsaid gainsay +gainsaying gainsay +gainsays gainsay +gamboled gambol +gamboling gambol +gambolled gambol +gambolling gambol +gambols gambol +gammed gam +gamming gam +gams gam +gan gin +ganned gan +ganning gan +gans gan +gapped gap +gapping gap +gaps gap +garnisheed garnishee +garnisheeing garnishee +garnishees garnishee +gases gas +gasified gasify +gasifies gasify +gasifying gasify +gassed gas +gasses gas +gassing gas +gave give +geed gee +geeing gee +gees gee +gelded geld +gelding geld +gelds geld +gelled gel +gelling gel +gels gel +gelt geld +gemmed gem +gemming gem +gems gem +genned-up gen-up +genning-up gen-up +gens-up gen-up +gets get +gets_lost get_lost +gets_started get_started +getting get +getting_lost get_lost +getting_started get_started +ghostwrites ghostwrite +ghostwriting ghostwrite +ghostwritten ghostwrite +ghostwrote ghostwrite +gibbed gib +gibbing gib +gibs gib +giddied giddy +giddies giddy +giddying giddy +giftwrapped giftwrap +giftwrapping giftwrap +giftwraps giftwrap +gigged gig +gigging gig +gigs gig +gilded gild +gilding gild +gilds gild +gilt gild +ginned gin +ginning gin +gins gin +gipped gip +gipping gip +gips gip +girded gird +girding gird +girds gird +girt gird +given give +gives give +giving give +glaceed glace +glaceing glace +glaces glace +glommed glom +glomming glom +gloried glory +glories glory +glorified glorify +glorifies glorify +glorifying glorify +glorying glory +glued glue +glues glue +gluing glue +gluts glut +glutted glut +glutting glut +gnawed gnaw +gnawing gnaw +gnawn gnaw +gnaws gnaw +goes go +goes_deep go_deep +going go +going_deep go_deep +gollied golly +gollies golly +gollying golly +gone go +gone_deep go_deep +goose-stepped goose-step +goose-stepping goose-step +goose-steps goose-step +got get +got_lost get_lost +got_started get_started +gotten get +gotten_lost get_lost +grabbed grab +grabbing grab +grabs grab +gratified gratify +gratifies gratify +gratifying gratify +graved grave +graveled gravel +graveling gravel +gravelled gravel +gravelling gravel +gravels gravel +graven grave +graves grave +graving grave +greed gree +greeing gree +grees gree +grew grow +grinding grind +grinds grind +grinned grin +grinning grin +grins grin +gripped grip +gripping grip +grips grip +gript grip +grits grit +gritted grit +gritting grit +ground grind +groveled grovel +groveling grovel +grovelled grovel +grovelling grovel +grovels grovel +growing grow +grown grow +grows grow +grubbed grub +grubbing grub +grubs grub +guaranteed guarantee +guaranteeing guarantee +guarantees guarantee +guarantied guaranty +guaranties guaranty +guarantying guaranty +gullied gully +gullies gully +gullying gully +gummed gum +gumming gum +gums gum +gumshoed gumshoe +gumshoeing gumshoe +gumshoes gumshoe +gunned gun +gunning gun +guns gun +gypped gyp +gypping gyp +gyps gyp +hacksawed hacksaw +hacksawing hacksaw +hacksawn hacksaw +hacksaws hacksaw +had have +had_a_feeling have_a_feeling +had_left have_left +had_the_feeling have_the_feeling +halloaed halloa +halloaing halloa +halloas halloa +halloed hallo +halloing hallo +hallooed halloo +hallooing halloo +halloos halloo +hallos hallo +haloed halo +haloes halo +haloing halo +halos halo +hammed ham +hamming ham +hams ham +hamstringing hamstring +hamstrings hamstring +hamstrung hamstring +hand-knits hand-knit +hand-knitted hand-knit +hand-knitting hand-knit +handfed handfeed +handfeeding handfeed +handfeeds handfeed +handicapped handicap +handicapping handicap +handicaps handicap +handselled handsel +handselling handsel +handsels handsel +hanging hang +hangs hang +hanseled hansel +hanseling hansel +hansels hansel +harried harry +harries harry +harrying harry +has have +has_a_feeling have_a_feeling +has_left have_left +has_the_feeling have_the_feeling +hatcheled hatchel +hatcheling hatchel +hatchelled hatchel +hatchelling hatchel +hatchels hatchel +hats hat +hatted hat +hatting hat +having have +having_a_feeling have_a_feeling +having_left have_left +having_the_feeling have_the_feeling +heard hear +hearing hear +hears hear +heaved heave +heaves heave +heaving heave +hedgehopped hedgehop +hedgehopping hedgehop +hedgehops hedgehop +held hold +hemmed hem +hemming hem +hems hem +hewed hew +hewing hew +hewn hew +hews hew +hiccuped hiccup +hiccuping hiccup +hiccupped hiccup +hiccupping hiccup +hiccups hiccup +hid hide +hidden hide +hides hide +hiding hide +high-hats high-hat +high-hatted high-hat +high-hatting high-hat +hinnied hinny +hinnies hinny +hinnying hinny +hits hit +hitting hit +hobbed hob +hobbing hob +hobnobbed hobnob +hobnobbing hobnob +hobnobs hobnob +hobs hob +hocus-pocused hocus-pocus +hocus-pocuses hocus-pocus +hocus-pocusing hocus-pocus +hocus-pocussed hocus-pocus +hocus-pocussing hocus-pocus +hocused hocus +hocuses hocus +hocusing hocus +hocussed hocus +hocussing hocus +hoed hoe +hoeing hoe +hoes hoe +hogged hog +hogging hog +hogs hog +hogtied hogtie +hogties hogtie +hogtying hogtie +holding hold +holds hold +honeyed honey +honeying honey +honeys honey +honied honey +hoodooed hoodoo +hoodooing hoodoo +hoodoos hoodoo +hopped hop +hopping hop +hops hop +horrified horrify +horrifies horrify +horrifying horrify +horseshoed horseshoe +horseshoeing horseshoe +horseshoes horseshoe +horsewhipped horsewhip +horsewhipping horsewhip +horsewhips horsewhip +houseled housel +houseling housel +houselled housel +houselling housel +housels housel +hove heave +hoveled hovel +hoveling hovel +hovelled hovel +hovelling hovel +hovels hovel +hugged hug +hugging hug +hugs hug +humbugged humbug +humbugging humbug +humbugs humbug +humidified humidify +humidifies humidify +humidifying humidify +hummed hum +humming hum +hums hum +hung hang +hurried hurry +hurries hurry +hurrying hurry +hurting hurt +hurts hurt +hypertrophied hypertrophy +hypertrophies hypertrophy +hypertrophying hypertrophy +identified identify +identifies identify +identifying identify +imbedded imbed +imbedding imbed +imbeds imbed +imbrued imbrue +imbrues imbrue +imbruing imbrue +imbued imbue +imbues imbue +imbuing imbue +impaneled impanel +impaneling impanel +impanelled impanel +impanelling impanel +impanells impanel +impanels impanel +impelled impel +impelling impel +impels impel +implied imply +implies imply +implying imply +inbred inbreed +inbreeding inbreed +inbreeds inbreed +incurred incur +incurring incur +incurs incur +indemnified indemnify +indemnifies indemnify +indemnifying indemnify +indued indue +indues indue +induing indue +indwelling indwell +indwells indwell +indwelt indwell +inferred infer +inferring infer +infers infer +initialed initial +initialing initial +initialled initial +initialling initial +initials initial +inlaid inlay +inlaying inlay +inlays inlay +inlets inlet +insets inset +insetting inset +inspanned inspan +inspanning inspan +inspans inspan +installed instal install +installing instal install +installs install +instals instal +intensified intensify +intensifies intensify +intensifying intensify +interbred interbreed +interbreeding interbreed +interbreeds interbreed +intercropped intercrop +intercropping intercrop +intercrops intercrop +intercuts intercut +intercutting intercut +interlaid interlay +interlapped interlap +interlapping interlap +interlaps interlap +interlaying interlay +interlays interlay +intermarried intermarry +intermarries intermarry +intermarrying intermarry +intermits intermit +intermitted intermit +intermitting intermit +interpleaded interplead +interpleading interplead +interpleads interplead +interpled interplead +interred inter +interring inter +inters inter +interstratified interstratify +interstratifies interstratify +interstratifying interstratify +interweaved interweave +interweaves interweave +interweaving interweave +interwove interweave +interwoven interweave +intrigued intrigue +intrigues intrigue +intriguing intrigue +intromits intromit +intromitted intromit +intromitting intromit +inweaved inweave +inweaves inweave +inweaving inweave +inwove inweave +inwoven inweave +inwrapped inwrap +inwrapping inwrap +inwraps inwrap +is be +issued issue +issues issue +issuing issue +jabbed jab +jabbing jab +jabs jab +jagged jag +jagging jag +jags jag +jammed jam +jamming jam +jams jam +japanned japan +japanning japan +japans japan +jarred jar +jarring jar +jars jar +jelled jell +jellied jelly +jellies jelly +jellified jellify +jellifies jellify +jellifying jellify +jelling jell +jells jell +jellying jelly +jemmied jemmy +jemmies jemmy +jemmying jemmy +jerry-building jerry-build +jerry-builds jerry-build +jerry-built jerry-build +jets jet +jetted jet +jetting jet +jeweled jewel +jeweling jewel +jewelled jewel +jewelling jewel +jewels jewel +jibbed jib +jibbing jib +jibs jib +jigged jig +jigging jig +jigs jig +jimmied jimmy +jimmies jimmy +jimmying jimmy +jitterbugged jitterbug +jitterbugging jitterbug +jitterbugs jitterbug +jobbed job +jobbing job +jobs job +jog-trots jog-trot +jog-trotted jog-trot +jog-trotting jog-trot +jogged jog +jogging jog +jogs jog +joined_battle join_battle +joined_forces join_forces +joining_battle join_battle +joining_forces join_forces +joins_battle join_battle +joins_forces join_forces +jollied jolly +jollies jolly +jollified jollify +jollifies jollify +jollifying jollify +jollying jolly +jots jot +jotted jot +jotting jot +joy-ridden joy-ride +joy-rides joy-ride +joy-riding joy-ride +joy-rode joy-ride +joypopped joypop +joypopping joypop +joypops joypop +jugged jug +jugging jug +jugs jug +jumped_off jump_off +jumping_off jump_off +jumps_off jump_off +justified justify +justifies justify +justifying justify +juts jut +jutted jut +jutting jut +keeping keep +keeps keep +kenned ken +kenneled kennel +kenneling kennel +kennelled kennel +kennelling kennel +kennels kennel +kenning ken +kens ken +kent ken +kept keep +kerneled kernel +kerneling kernel +kernelled kernel +kernelling kernel +kernels kernel +kidded kid +kidding kid +kidnaped kidnap +kidnaping kidnap +kidnapped kidnap +kidnapping kidnap +kidnaps kidnap +kids kid +kipped kip +kipping kip +kips kip +knapped knap +knapping knap +knaps knap +kneecapped kneecap +kneecapping kneecap +kneecaps kneecap +kneed knee +kneeing knee +kneeled kneel +kneeling kneel +kneels kneel +knees knee +knelt kneel +knew know +knits knit +knitted knit +knitting knit +knobbed knob +knobbing knob +knobs knob +knots knot +knotted knot +knotting knot +knowing know +known know +knows know +ko'd ko +ko'ing ko +ko's ko +labeled label +labeling label +labelled label +labelling label +labels label +laded lade +laden lade +lades lade +lading lade +ladyfied ladify +ladyfies ladify +ladyfying ladify +lagged lag +lagging lag +lags lag +laicized laicize +laicizes laicize +laicizing laicize +laid lay +lain lie +lallygagged lallygag +lallygagging lallygag +lallygags lallygag +lammed lam +lamming lam +lams lam +lapidified lapidify +lapidifies lapidify +lapidifying lapidify +lapped lap +lapping lap +laps lap +lassoed lasso +lassoes lasso +lassoing lasso +lassos lasso +laureled laurel +laureling laurel +laurelled laurel +laurelling laurel +laurels laurel +lay lie +layed_for lie_for +laying lay +laying_for lie_for +lays lay +lays_for lie_for +leading lead +leads lead +leagued league +leagues league +leaguing league +leaned lean +leaning lean +leans lean +leant lean +leaped leap +leapfrogged leapfrog +leapfrogging leapfrog +leapfrogs leapfrog +leaping leap +leaps leap +leapt leap +learned learn +learning learn +learns learn +learnt learn +leaves leave +leaves_undone leave_undone +leaving leave +leaving_undone leave_undone +led lead +left leave +left_undone leave_undone +legitimized legitimize +legitimizes legitimize +legitimizing legitimize +lending lend +lends lend +lent lend +lets let +letting let +leveled level +leveling level +levelled level +levelling level +levels level +levied levy +levies levy +levying levy +libeled libel +libeling libel +libelled libel +libelling libel +libels libel +lied lie +lies lie +lighted light +lighting light +lights light +lignified lignify +lignifies lignify +lignifying lignify +lip-reading lip-read +lip-reads lip-read +lipped lip +lipping lip +lips lip +liquefied liquefy +liquefies liquefy +liquefying liquefy +liquified liquify +liquifies liquify +liquifying liquify +lit light +lobbed lob +lobbied lobby +lobbies lobby +lobbing lob +lobbying lobby +lobs lob +logged log +logging log +logs log +looked_towards look_towards +looking_towards look_towards +looks_towards look_towards +lopped lop +lopping lop +lops lop +loses lose +losing lose +lost lose +lots lot +lotted lot +lotting lot +lugged lug +lugging lug +lugs lug +lullabied lullaby +lullabies lullaby +lullabying lullaby +lying lie +machine-gunned machine-gun +machine-gunning machine-gun +machine-guns machine-gun +madded mad +madding mad +made make +mads mad +magnified magnify +magnifies magnify +magnifying magnify +makes make +making make +manned man +manning man +mans man +manumits manumit +manumitted manumit +manumitting manumit +mapped map +mapping map +maps map +marcelled marcel +marcelling marcel +marcels marcel +marred mar +married marry +marries marry +marring mar +marrying marry +mars mar +marshaled marshal +marshaling marshal +marshalled marshal +marshalling marshal +marshals marshal +marveled marvel +marveling marvel +marvelled marvel +marvelling marvel +marvels marvel +mats mat +matted mat +matting mat +meaning mean +means mean +meant mean +medaled medal +medaling medal +medalled medal +medalling medal +medals medal +meeting meet +meets meet +melted melt +melting melt +melts melt +met meet +metaled metal +metaling metal +metalled metal +metalling metal +metals metal +metrified metrify +metrifies metrify +metrifying metrify +might may +militated_against militate_against +militates_against militate_against +militating_against militate_against +mimicked mimic +mimicking mimic +mimics mimic +minified minify +minifies minify +minifying minify +misapplied misapply +misapplies misapply +misapplying misapply +misbecame misbecome +misbecomes misbecome +misbecoming misbecome +miscarried miscarry +miscarries miscarry +miscarrying miscarry +miscasting miscast +miscasts miscast +misconstrued misconstrue +misconstrues misconstrue +misconstruing misconstrue +misdealing misdeal +misdeals misdeal +misdealt misdeal +misfits misfit +misfitted misfit +misfitting misfit +misgave misgive +misgiven misgive +misgives misgive +misgiving misgive +misheard mishear +mishearing mishear +mishears mishear +mishits mishit +mishitting mishit +mislaid mislay +mislaying mislay +mislays mislay +misleading mislead +misleads mislead +misled mislead +mispleaded misplead +mispleading misplead +mispleads misplead +mispled misplead +misreading misread +misreads misread +misspelled misspell +misspelling misspell +misspells misspell +misspelt misspell +misspending misspend +misspends misspend +misspent misspend +mistaken mistake +mistakes mistake +mistaking mistake +mistook mistake +misunderstanding misunderstand +misunderstands misunderstand +misunderstood misunderstand +mobbed mob +mobbing mob +mobs mob +modeled model +modeling model +modelled model +modelling model +models model +modified modify +modifies modify +modifying modify +mollified mollify +mollifies mollify +mollifying mollify +molten melt +moonlighted moonlight +moonlighting moonlight +moonlights moonlight +mopped mop +mopping mop +mops mop +mortified mortify +mortifies mortify +mortifying mortify +mowed mow +mowing mow +mown mow +mows mow +mudded mud +muddied muddy +muddies muddy +mudding mud +muddying muddy +muds mud +mugged mug +mugging mug +mugs mug +multiplied multiply +multiplies multiply +multiplying multiply +mummed mum +mummified mummify +mummifies mummify +mummifying mummify +mumming mum +mums mum +mutinied mutiny +mutinies mutiny +mutinying mutiny +mystified mystify +mystifies mystify +mystifying mystify +nabbed nab +nabbing nab +nabs nab +nagged nag +nagging nag +nags nag +napped nap +napping nap +naps nap +nets net +netted net +netting net +nibbed nib +nibbing nib +nibs nib +nickeled nickel +nickeling nickel +nickelled nickel +nickelling nickel +nickels nickel +nid-nodded nid-nod +nid-nodding nid-nod +nid-nods nid-nod +nidified nidify +nidifies nidify +nidifying nidify +nielloed niello +nielloing niello +niellos niello +nigrified nigrify +nigrifies nigrify +nigrifying nigrify +nipped nip +nipping nip +nips nip +nitrified nitrify +nitrifies nitrify +nitrifying nitrify +nodded nod +nodding nod +nods nod +non-prossed non-pros +non-prosses non-pros +non-prossing non-pros +nonplused nonplus +nonpluses nonplus +nonplusing nonplus +nonplussed nonplus +nonplusses nonplus +nonplussing nonplus +notified notify +notifies notify +notifying notify +nullified nullify +nullifies nullify +nullifying nullify +nuts nut +nutted nut +nutting nut +objectified objectify +objectifies objectify +objectifying objectify +occupied occupy +occupies occupy +occupying occupy +occurred occur +occurring occur +occurs occur +offsets offset +offsetting offset +omits omit +omitted omit +omitting omit +opaqued opaque +opaques opaque +opaquing opaque +opsonized opsonize +opsonizes opsonize +opsonizing opsonize +ossified ossify +ossifies ossify +ossifying ossify +outbidden outbid +outbidding outbid +outbids outbid +outbred outbreed +outbreeding outbreed +outbreeds outbreed +outcried outcry +outcries outcry +outcropped outcrop +outcropping outcrop +outcrops outcrop +outcrying outcry +outdid outdo +outdoes outdo +outdoing outdo +outdone outdo +outdrawing outdraw +outdrawn outdraw +outdraws outdraw +outdrew outdraw +outfits outfit +outfitted outfit +outfitting outfit +outfought outfight +outgassed outgas +outgasses outgas +outgassing outgas +outgeneraled outgeneral +outgeneraling outgeneral +outgeneralled outgeneral +outgeneralling outgeneral +outgenerals outgeneral +outgoes outgo +outgoing outgo +outgone outgo +outgrew outgrow +outgrowing outgrow +outgrown outgrow +outgrows outgrow +outlaid outlay +outlaying outlay +outlays outlay +outmanned outman +outmanning outman +outmans outman +outputted output +outputting output +outran outrun +outridden outride +outrides outride +outriding outride +outrode outride +outrunning outrun +outruns outrun +outselling outsell +outsells outsell +outshines outshine +outshining outshine +outshone outshine +outshooting outshoot +outshoots outshoot +outshot outshoot +outsold outsell +outspanned outspan +outspanning outspan +outspans outspan +outspreading outspread +outspreads outspread +outstanding outstand +outstands outstand +outstood outstand +outstripped outstrip +outstripping outstrip +outstrips outstrip +outthinking outthink +outthinks outthink +outthought outthink +outwearing outwear +outwears outwear +outwent outgo +outwits outwit +outwitted outwit +outwitting outwit +outwore outwear +outworn outwear +overbearing overbear +overbears overbear +overbidden overbid +overbidding overbid +overbids overbid +overblew overblow +overblowing overblow +overblown overblow +overblows overblow +overbore overbear +overborne overbear +overbuilding overbuild +overbuilds overbuild +overbuilt overbuild +overcame overcome +overcomes overcome +overcoming overcome +overcropped overcrop +overcropping overcrop +overcrops overcrop +overdid overdo +overdoes overdo +overdoing overdo +overdone overdo +overdrawing overdraw +overdrawn overdraw +overdraws overdraw +overdrew overdraw +overdriven overdrive +overdrives overdrive +overdriving overdrive +overdrove overdrive +overflew overfly +overflies overfly +overflowed overflow +overflowing overflow +overflown overflow overfly +overflows overflow +overflying overfly +overgrew overgrow +overgrowing overgrow +overgrown overgrow +overgrows overgrow +overhanging overhang +overhangs overhang +overheard overhear +overhearing overhear +overhears overhear +overhung overhang +overissued overissue +overissues overissue +overissuing overissue +overlaid overlay +overlain overlie +overlapped overlap +overlapping overlap +overlaps overlap +overlay overlie +overlaying overlay +overlays overlay +overlies overlie +overlying overlie +overmanned overman +overmanning overman +overmans overman +overpaid overpay +overpassed overpass +overpasses overpass +overpassing overpass +overpast overpass +overpaying overpay +overpays overpay +overran overrun +overridden override +overrides override +overriding override +overrode override +overrunning overrun +overruns overrun +oversaw oversee +overseeing oversee +overseen oversee +oversees oversee +overselling oversell +oversells oversell +oversets overset +oversetting overset +oversewed oversew +oversewing oversew +oversewn oversew +oversews oversew +overshooting overshoot +overshoots overshoot +overshot overshoot +oversimplified oversimplify +oversimplifies oversimplify +oversimplifying oversimplify +oversleeping oversleep +oversleeps oversleep +overslept oversleep +oversold oversell +overspending overspend +overspends overspend +overspent overspend +overspilled overspill +overspilling overspill +overspills overspill +overspilt overspill +overstepped overstep +overstepping overstep +oversteps overstep +overtaken overtake +overtakes overtake +overtaking overtake +overthrew overthrow +overthrowing overthrow +overthrown overthrow +overthrows overthrow +overtook overtake +overtopped overtop +overtopping overtop +overtops overtop +overwinding overwind +overwinds overwind +overwound overwind +overwrites overwrite +overwriting overwrite +overwritten overwrite +overwrote overwrite +pacified pacify +pacifies pacify +pacifying pacify +padded pad +padding pad +pads pad +paid pay +palled pal +palling pal +pals pal +palsied palsy +palsies palsy +palsying palsy +pandied pandy +pandies pandy +pandying pandy +paneled panel +paneling panel +panelled panel +panelling panel +panels panel +panicked panic +panicking panic +panics panic +panned pan +panning pan +pans pan +paralleled parallel +paralleling parallel +parallelled parallel +parallelling parallel +parallels parallel +parceled parcel +parceling parcel +parcelled parcel +parcelling parcel +parcels parcel +parenthesized parenthesize +parenthesizes parenthesize +parenthesizing parenthesize +parodied parody +parodies parody +parodying parody +parried parry +parries parry +parrying parry +partaken partake +partakes partake +partaking partake +partook partake +pasquil pasquinade +pasquilled pasquinade +pasquilling pasquinade +pasquils pasquinade +pasquinaded pasquinade +pasquinades pasquinade +pasquinading pasquinade +patrolled patrol +patrolling patrol +patrols patrol +pats pat +patted pat +patting pat +payed pay +paying pay +pays pay +pedaled pedal +pedaling pedal +pedalled pedal +pedalling pedal +pedals pedal +peed pee +peeing pee +pees pee +pegged peg +pegging peg +pegs peg +penciled pencil +penciling pencil +pencilled pencil +pencilling pencil +pencils pencil +penned pen +penning pen +pens pen +pent pen +pepped pep +pepping pep +peps pep +permits permit +permitted permit +permitting permit +personified personify +personifies personify +personifying personify +petrified petrify +petrifies petrify +petrifying petrify +pets pet +petted pet +pettifogged pettifog +pettifogging pettifog +pettifogs pettifog +petting pet +phantasied phantasy +phantasies phantasy +phantasying phantasy +photocopied photocopy +photocopies photocopy +photocopying photocopy +photomapped photomap +photomapping photomap +photomaps photomap +photosets photoset +photosetting photoset +physicked physic +physicking physic +physics physic +picnicked picnic +picnicking picnic +picnics picnic +pied pie +pieing pie +pies pie +pigged pig +pigging pig +pigs pig +piing pie +pilloried pillory +pillories pillory +pillorying pillory +pinch-hits pinch-hit +pinch-hitting pinch-hit +pinned pin +pinning pin +pins pin +pipped pip +pipping pip +pips pip +piqued pique +piques pique +piquing pique +pistol-whipped pistol-whip +pistol-whipping pistol-whip +pistol-whips pistol-whip +pistoled pistol +pistoling pistol +pistolled pistol +pistolling pistol +pistols pistol +pitapats pitapat +pitapatted pitapat +pitapatting pitapat +pitied pity +pities pity +pits pit +pitted pit +pitting pit +pitying pity +plagued plague +plagues plague +plaguing plague +planned plan +planning plan +plans plan +plats plat +platted plat +platting plat +played_a_part play_a_part +playing_a_part play_a_part +plays_a_part play_a_part +pleaded plead +pleading plead +pleads plead +pled plead +plied ply +plies ply +plodded plod +plodding plod +plods plod +plopped plop +plopping plop +plops plop +plots plot +plotted plot +plotting plot +plugged plug +plugging plug +plugs plug +plying ply +podded pod +podding pod +pods pod +polkaed polka +polkaing polka +polkas polka +pommeled pommel +pommeling pommel +pommelled pommel +pommelling pommel +pommels pommel +popped pop +popping pop +pops pop +pots pot +potted pot +potting pot +preachified preachify +preachifies preachify +preachifying preachify +precanceled precancel +precanceling precancel +precancelled precancel +precancelling precancel +precancels precancel +precasting precast +precasts precast +preferred prefer +preferring prefer +prefers prefer +preoccupied preoccupy +preoccupies preoccupy +preoccupying preoccupy +prepaid prepay +prepaying prepay +prepays prepay +presignified presignify +presignifies presignify +presignifying presignify +pretermits pretermit +pretermitted pretermit +pretermitting pretermit +prettied pretty +pretties pretty +prettified prettify +prettifies prettify +prettifying prettify +prettying pretty +pried pry +pries pry +prigged prig +prigging prig +prigs prig +primmed prim +primming prim +prims prim +prodded prod +prodding prod +prods prod +programmed program +programmes program +programming program +programs program +prologed prologue +prologing prologue +prologs prologue +prologued prologue +prologues prologue +prologuing prologue +proofreading proofread +proofreads proofread +propelled propel +propelling propel +propels propel +prophesied prophesy +prophesies prophesy +prophesying prophesy +propped prop +propping prop +props prop +proved prove +proven prove +proves prove +proving prove +prying pry +pubbed pub +pubbing pub +pubs pub +pugged pug +pugging pug +pugs pug +pummeled pummel +pummeling pummel +pummelled pummel +pummelling pummel +pummels pummel +punned pun +punning pun +puns pun +pupped pup +pupping pup +pups pup +pureed puree +pureeing puree +purees puree +purified purify +purifies purify +purifying purify +pursued pursue +pursues pursue +pursuing pursue +put-puts put-put +put-putted put-put +put-putting put-put +putrefied putrefy +putrefies putrefy +putrefying putrefy +puts put +puttied putty +putties putty +putting put +puttying putty +qualified qualify +qualifies qualify +qualifying qualify +quantified quantify +quantifies quantify +quantifying quantify +quarreled quarrel +quarreling quarrel +quarrelled quarrel +quarrelling quarrel +quarrels quarrel +quarried quarry +quarries quarry +quarrying quarry +quartersawed quartersaw +quartersawing quartersaw +quartersawn quartersaw +quartersaws quartersaw +queried query +queries query +querying query +queued queue +queues queue +queuing queue +quick-freezes quick-freeze +quick-freezing quick-freeze +quick-froze quick-freeze +quick-frozen quick-freeze +quickstepped quickstep +quickstepping quickstep +quicksteps quickstep +quipped quip +quipping quip +quips quip +quits quit +quitted quit +quitting quit +quizzed quiz +quizzes quiz +quizzing quiz +radioed radio +radioing radio +radios radio +ragged rag +ragging rag +ragouted ragout +ragouting ragout +ragouts ragout +rags rag +rallied rally +rallies rally +rallying rally +ramified ramify +ramifies ramify +ramifying ramify +rammed ram +ramming ram +rams ram +ran run +rang ring +rapped rap +rappelled rappel +rappelling rappel +rappels rappel +rapping rap +raps rap +rarfied rarefy +rarfies rarefy +rarfying rarefy +ratified ratify +ratifies ratify +ratifying ratify +rats rat +ratted rat +ratting rat +raveled ravel +raveling ravel +ravelled ravel +ravelling ravel +ravels ravel +raz-cuts raz-cut +raz-cutting raz-cut +razeed razee +razeeing razee +razees razee +re-treading re-tread +re-treads re-tread +re-trod re-tread +re-trodden re-tread +reading read +reads read +reaved reave +reaves reave +reaving reave +rebelled rebel +rebelling rebel +rebels rebel +rebuilt rebuild +rebuts rebut +rebutted rebut +rebutting rebut +recapped recap +recapping recap +recaps recap +recced recce +recceed recce +recceing recce +recces recce +reclassified reclassify +reclassifies reclassify +reclassifying reclassify +recommits recommit +recommitted recommit +recommitting recommit +recopied recopy +recopies recopy +recopying recopy +rectified rectify +rectifies rectify +rectifying rectify +recurred recur +recurring recur +recurs recur +red red +red-pencilled red-pencil +red-pencilling red-pencil +red-pencils red-pencil +redded red redd +redding red redd +redds redd +redid redo +redoes redo +redoing redo +redone redo +reds red +reeved reeve +reeves reeve +reeving reeve +refereed referee +refereeing referee +referees referee +referred refer +referring refer +refers refer +refits refit +refitted refit +refitting refit +reft reave +refueled refuel +refueling refuel +refuelled refuel +refuelling refuel +refuels refuel +regrets regret +regretted regret +regretting regret +reheard rehear +rehearing rehear +rehears rehear +reified reify +reifies reify +reifying reify +relied rely +relies rely +relying rely +remade remake +remakes remake +remaking remake +remarried remarry +remarries remarry +remarrying remarry +remits remit +remitted remit +remitting remit +rending rend +rends rend +rent rend +repaid repay +repaying repay +repays repay +repelled repel +repelling repel +repels repel +replevied replevy +replevies replevy +replevying replevy +replied reply +replies reply +replying reply +repots repot +repotted repot +repotting repot +reran rerun +rerunning rerun +reruns rerun +resat resit +rescued rescue +rescues rescue +rescuing rescue +resets reset +resetting reset +resits resit +resitting resit +retaken retake +retakes retake +retaking retake +retelling retell +retells retell +rethinking rethink +rethinks rethink +rethought rethink +retold retell +retook retake +retransmits retransmit +retransmitted retransmit +retransmitting retransmit +retreaded retread +retreading retread +retreads retread +retried retry +retries retry +retrofits retrofit +retrofitted retrofit +retrofitting retrofit +retrying retry +rets ret +retted ret +retting ret +reunified reunify +reunifies reunify +reunifying reunify +revalorized revalorize +revalorizes revalorize +revalorizing revalorize +reveled revel +reveling revel +revelled revel +revelling revel +revels revel +revets revet +revetted revet +revetting revet +revivified revivify +revivifies revivify +revivifying revivify +revs rev +revved rev +revving rev +rewinding rewind +rewinds rewind +rewound rewind +rewrites rewrite +rewriting rewrite +rewritten rewrite +rewrote rewrite +ribbed rib +ribbing rib +ribs rib +ricocheted ricochet +ricocheting ricochet +ricochets ricochet +ricochetted ricochet +ricochetting ricochet +ridded rid +ridden ride +ridding rid +rides ride +riding ride +rids rid +rigged rig +rigging rig +rigidified rigidify +rigidifies rigidify +rigidifying rigidify +rigs rig +rimmed rim +rimming rim +rims rim +ringed ring +ringing ring +rings ring +ripped rip +ripping rip +rips rip +risen rise +rises rise +rising rise +rivaled rival +rivaling rival +rivalled rival +rivalling rival +rivals rival +rived rive +riven rive +rives rive +riving rive +robbed rob +robbing rob +robs rob +rode ride +roqueted roquet +roqueting roquet +roquets roquet +rose rise +rots rot +rotted rot +rotting rot +rough-dried rough-dry +rough-dries rough-dry +rough-drying rough-dry +rough-hewed rough-hew +rough-hewing rough-hew +rough-hewn rough-hew +rough-hews rough-hew +roughcasting roughcast +roughcasts roughcast +rove reeve +roweled rowel +roweling rowel +rowelled rowel +rowelling rowel +rowels rowel +rubbed rub +rubbing rub +rubs rub +rued rue +rues rue +ruggedized ruggedize +ruggedizes ruggedize +ruggedizing ruggedize +ruing rue +rung ring +running run +runs run +ruts rut +rutted rut +rutting rut +saccharified saccharify +saccharifies saccharify +saccharifying saccharify +sagged sag +sagging sag +sags sag +said say +salaried salary +salaries salary +salarying salary +salified salify +salifies salify +salifying salify +sallied sally +sallies sally +sallying sally +sambaed samba +sambaing samba +sambas samba +sanctified sanctify +sanctifies sanctify +sanctifying sanctify +sand-casting sand-cast +sand-casts sand-cast +sandbagged sandbag +sandbagging sandbag +sandbags sandbag +sang sing +sank sink +saponified saponify +saponifies saponify +saponifying saponify +sapped sap +sapping sap +saps sap +sat sit +satisfied satisfy +satisfies satisfy +satisfying satisfy +sauteed saute +sauteing saute +sautes saute +savvied savvy +savvies savvy +savvying savvy +saw see +sawed saw +sawing saw +sawn saw +saws saw +saying say +says say +scagged scag +scagging scag +scags scag +scanned scan +scanning scan +scans scan +scarified scarify +scarifies scarify +scarifying scarify +scarred scar +scarring scar +scars scar +scats scat +scatted scat +scatting scat +scended scend +scending scend +scends scend +scorified scorify +scorifies scorify +scorifying scorify +scragged scrag +scragging scrag +scrags scrag +scrammed scram +scramming scram +scrams scram +scrapped scrap +scrapping scrap +scraps scrap +scried scry +scries scry +scrubbed scrub +scrubbing scrub +scrubs scrub +scrummed scrum +scrumming scrum +scrums scrum +scrying scry +scudded scud +scudding scud +scuds scud +scummed scum +scumming scum +scums scum +scurried scurry +scurries scurry +scurrying scurry +seed seed +seeing see +seeking seek +seeks seek +seen see +sees see +selling sell +sells sell +sending send +sends send +sent send +sets set +setting set +sewed sew +sewing sew +sewn sew +sews sew +shagged shag +shagging shag +shags shag +shaken shake +shaken_hands shake_hands +shakes shake +shakes_hands shake_hands +shaking shake +shaking_hands shake_hands +shammed sham +shamming sham +shampooed shampoo +shampooing shampoo +shampoos shampoo +shams sham +shanghaied shanghai +shanghaiing shanghai +shanghais shanghai +sharecropped sharecrop +sharecropping sharecrop +sharecrops sharecrop +shaved shave +shaven shave +shaves shave +shaving shave +sheared shear +shearing shear +shears shear +shed shed +shedding shed +sheds shed +shellacked shellac +shellacking shellac +shellacs shellac +shending shend +shends shend +shent shend +shewed shew +shewing shew +shewn shew +shews shew +shied shy +shies shy +shikarred shikar +shikarring shikar +shikars shikar +shillyshallied shillyshally +shillyshallies shillyshally +shillyshallying shillyshally +shimmed shim +shimmied shimmy +shimmies shimmy +shimming shim +shimmying shimmy +shims shim +shines shine +shining shine +shinned shin +shinning shin +shins shin +shipped ship +shipping ship +ships ship +shits shit +shitted shit +shitting shit +shod shoe +shoeing shoe +shoes shoe +shone shine +shooed shoo +shooing shoo +shook shake +shook_hands shake_hands +shoos shoo +shooting shoot +shoots shoot +shopped shop +shopping shop +shops shop +shot shoot +shotgunned shotgun +shotgunning shotgun +shotguns shotgun +shots shot +shotted shot +shotting shot +shoveled shovel +shoveling shovel +shovelled shovel +shovelling shovel +shovels shovel +showed show +showing show +shown show +shows show +shrank shrink +shredded shred +shredding shred +shrink-wrapped shrink-wrap +shrink-wrapping shrink-wrap +shrink-wraps shrink-wrap +shrinking shrink +shrinks shrink +shrived shrive +shriveled shrivel +shriveling shrivel +shrivelled shrivel +shrivelling shrivel +shrivels shrivel +shriven shrive +shrives shrive +shriving shrive +shrove shrive +shrugged shrug +shrugging shrug +shrugs shrug +shrunk shrink +shrunken shrink +shunned shun +shunning shun +shuns shun +shuts shut +shutting shut +shying shy +sicked sic +sicking sic +sics sic +sideslipped sideslip +sideslipping sideslip +sideslips sideslip +sidestepped sidestep +sidestepping sidestep +sidesteps sidestep +sight-reading sight-read +sight-reads sight-read +sightsaw sightsee +sightseeing sightsee +sightseen sightsee +sightsees sightsee +signaled signal +signaling signal +signalled signal +signalling signal +signals signal +signified signify +signifies signify +signifying signify +silicified silicify +silicifies silicify +silicifying silicify +simplified simplify +simplifies simplify +simplifying simplify +singing sing singe +single-stepped single-step +single-stepping single-step +single-steps single-step +sings sing +sinking sink +sinks sink +sinned sin +sinning sin +sipped sip +sipping sip +sips sip +sits sit +sitting sit +skellied skelly +skellies skelly +skellying skelly +skenned sken +skenning sken +skens sken +skets sket +sketted sket +sketting sket +ski'd ski +skidded skid +skidding skid +skids skid +skied ski +skies sky +skiing ski +skimmed skim +skimming skim +skims skim +skin-popped skin-pop +skin-popping skin-pop +skin-pops skin-pop +skinned skin +skinning skin +skinny-dipped skinny-dip +skinny-dipping skinny-dip +skinny-dips skinny-dip +skins skin +skipped skip +skipping skip +skips skip +skis ski +skivvied skivvy +skivvies skivvy +skivvying skivvy +skydived skydive +skydives skydive +skydiving skydive +skydove skydive +skying sky +slabbed slab +slabbing slab +slabs slab +slagged slag +slagging slag +slags slag +slain slay +slammed slam +slamming slam +slams slam +slapped slap +slapping slap +slaps slap +slats slat +slatted slat +slatting slat +slaying slay +slays slay +sleeping sleep +sleeps sleep +slept sleep +slew slay +slid slide +slidden slide +slides slide +sliding slide +slinging sling +slings sling +slinking slink +slinks slink +slipped slip +slipping slip +slips slip +slits slit +slitting slit +slogged slog +slogging slog +slogs slog +slopped slop +slopping slop +slops slop +slots slot +slotted slot +slotting slot +slugged slug +slugging slug +slugs slug +slummed slum +slumming slum +slums slum +slung sling +slunk slink +slurred slur +slurring slur +slurs slur +smelled smell +smelling smell +smells smell +smelt smell +smit smite +smites smite +smiting smite +smitten smite +smote smite +smuts smut +smutted smut +smutting smut +snafued snafu +snafues snafu +snafuing snafu +snagged snag +snagging snag +snags snag +snapped snap +snapping snap +snaps snap +snedded sned +snedding sned +sneds sned +snipped snip +snipping snip +snips snip +sniveled snivel +sniveling snivel +snivelled snivel +snivelling snivel +snivels snivel +snogged snog +snogging snog +snogs snog +snowshoed snowshoe +snowshoeing snowshoe +snowshoes snowshoe +snubbed snub +snubbing snub +snubs snub +snugged snug +snugging snug +snugs snug +sobbed sob +sobbing sob +sobs sob +socialized socialize +socializes socialize +socializing socialize +sodded sod +sodding sod +sods sod +soft-pedaled soft-pedal +soft-pedaling soft-pedal +soft-pedalled soft-pedal +soft-pedalling soft-pedal +soft-pedals soft-pedal +sol-faed sol-fa +sol-faing sol-fa +sol-fas sol-fa +sold sell +solemnified solemnify +solemnifies solemnify +solemnifying solemnify +solidified solidify +solidifies solidify +solidifying solidify +soothsaid soothsay +soothsaying soothsay +soothsays soothsay +sopped sop +sopping sop +sops sop +sortied sortie +sortieing sortie +sorties sortie +sought seek +sowed sow +sowing sow +sown sow +sows sow +spagged spag +spagging spag +spags spag +spanceled spancel +spanceling spancel +spancelled spancel +spancelling spancel +spancels spancel +spanned span +spanning span +spans span +sparred spar +sparring spar +spars spar +spat spit +spats spat +spatted spat +spatting spat +speaking speak +speaks speak +specified specify +specifies specify +specifying specify +sped speed +speechified speechify +speechifies speechify +speechifying speechify +speeded speed +speeding speed +speeds speed +spellbinding spellbind +spellbinds spellbind +spellbound spellbind +spelled spell +spelling spell +spells spell +spelt spell +spending spend +spends spend +spent spend +spied spy +spies spy +spilled spill +spilling spill +spills spill +spilt spill +spin-dried spin-dry +spin-dries spin-dry +spin-drying spin-dry +spinning spin +spins spin +spiraled spiral +spiraling spiral +spiralled spiral +spiralling spiral +spirals spiral +spits spit +spitted spit +spitting spit +splits split +splitting split +spoiled spoil +spoiling spoil +spoils spoil +spoilt spoil +spoke speak +spoken speak +spoon-fed spoon-feed +spoon-feeding spoon-feed +spoon-feeds spoon-feed +spotlighted spotlight +spotlighting spotlight +spotlights spotlight +spotlit spotlight +spots spot +spotted spot +spotting spot +sprang spring +spreading spread +spreads spread +sprigged sprig +sprigging sprig +sprigs sprig +springing spring +springs spring +sprung spring +spudded spud +spudding spud +spuds spud +spued spue +spues spue +spuing spue +spun spin +spurred spur +spurring spur +spurs spur +spying spy +squats squat +squatted squat +squatting squat +squeegeed squeegee +squeegeeing squeegee +squeegees squeegee +squibbed squib +squibbing squib +squibs squib +squidded squid +squidding squid +squids squid +squilgee squeegee +stabbed stab +stabbing stab +stabs stab +stall-fed stall-feed +stall-feeding stall-feed +stall-feeds stall-feed +standing stand +stands stand +stank stink +starred star +starring star +stars star +staved stave +staves stave +staving stave +steadied steady +steadies steady +steadying steady +stealing steal +steals steal +stellified stellify +stellifies stellify +stellifying stellify +stemmed stem +stemming stem +stems stem +stems_from stem_from +stenciled stencil +stenciling stencil +stencilled stencil +stencilling stencil +stencils stencil +stepped step +stepping step +steps step +stets stet +stetted stet +stetting stet +sticked stick +sticking stick +sticks stick +stied sty +sties sty +stilettoed stiletto +stilettoeing stiletto +stilettoes stiletto +stinging sting +stings sting +stinking stink +stinks stink +stirred stir +stirring stir +stirs stir +stole steal +stolen steal +stood stand +stopped stop +stopping stop +stops stop +storied story +stories story +storying story +stots stot +stotted stot +stotting stot +stove stave +strapped strap +strapping strap +straps strap +stratified stratify +stratifies stratify +stratifying stratify +strewed strew +strewing strew +strewn strew +strews strew +stridden stride +strikes strike +striking strike +stringing string +strings string +stripped strip +stripping strip +strips strip +striven strive +strives strive +striving strive +strode stride +stropped strop +stropping strop +strops strop +strove strive +strowed strow +strowing strow +strown strow +strows strow +struck strike +strummed strum +strumming strum +strums strum +strung string +struts strut +strutted strut +strutting strut +stubbed stub +stubbing stub +stubs stub +stuccoed stucco +stuccoes stucco +stuccoing stucco +stuccos stucco +stuck stick +studded stud +studding stud +studied study +studies study +studs stud +studying study +stultified stultify +stultifies stultify +stultifying stultify +stummed stum +stumming stum +stums stum +stung sting +stunk stink +stunned stun +stunning stun +stuns stun +stupefied stupefy +stupefies stupefy +stupefying stupefy +stying sty +stymied stymie +stymieing stymie +stymies stymie +stymying stymie +subbed sub +subbing sub +subdued subdue +subdues subdue +subduing subdue +subjectified subjectify +subjectifies subjectify +subjectifying subjectify +sublets sublet +subletting sublet +submits submit +submitted submit +submitting submit +subpoenaed subpoena +subpoenaing subpoena +subpoenas subpoena +subs sub +subtotaled subtotal +subtotaling subtotal +subtotalled subtotal +subtotalling subtotal +subtotals subtotal +sued sue +sues sue +suing sue +sullied sully +sullies sully +sullying sully +sulphureted sulphuret +sulphureting sulphuret +sulphurets sulphuret +sulphuretted sulphuret +sulphuretting sulphuret +summed sum +summing sum +sums sum +sung sing +sunk sink +sunken sink +sunned sun +sunning sun +suns sun +supped sup +supping sup +supplied supply +supplies supply +supplying supply +sups sup +swabbed swab +swabbing swab +swabs swab +swagged swag +swagging swag +swags swag +swam swim +swapped swap +swapping swap +swaps swap +swats swat +swatted swat +swatting swat +swearing swear +swears swear +sweated sweat +sweating sweat +sweats sweat +sweeping sweep +sweeps sweep +swelled swell +swelling swell +swells swell +swept sweep +swigged swig +swigging swig +swigs swig +swimming swim +swims swim +swinging swing +swings swing +swiveled swivel +swiveling swivel +swivelled swivel +swivelling swivel +swivels swivel +swollen swell +swopped swap +swopping swap +swops swap +swore swear +sworn swear +swots swot +swotted swot +swotting swot +swum swim +swung swing +syllabicated syllabicate +syllabicates syllabicate +syllabicating syllabicate +syllabified syllabify +syllabifies syllabify +syllabifying syllabify +symboled symbol +symboling symbol +symbolled symbol +symbolling symbol +symbols symbol +tabbed tab +tabbing tab +tabs tab +tagged tag +tagging tag +tags tag +taken take +taken_a_side take_a_side +taken_pains take_pains +taken_steps take_steps +takes take +takes_a_side take_a_side +takes_pains take_pains +takes_steps take_steps +taking take +taking_a_side take_a_side +taking_pains take_pains +taking_steps take_steps +talced talc +talcing talc +talcked talc +talcking talc +talcs talc +tallied tally +tallies tally +tally-ho'd tally-ho +tally-hoed tally-ho +tally-hoing tally-ho +tally-hos tally-ho +tallying tally +tammied tammy +tammies tammy +tammying tammy +tangoed tango +tangoes tango +tangoing tango +tanned tan +tanning tan +tans tan +tapped tap +tapping tap +taps tap +tarred tar +tarried tarry +tarries tarry +tarring tar +tarrying tarry +tars tar +tasseled tassel +tasseling tassel +tasselled tassel +tasselling tassel +tassels tassel +tats tat +tatted tat +tatting tat +tattooed tattoo +tattooing tattoo +tattoos tattoo +taught teach +taxied taxi +taxies taxi +taxiing taxi +taxying taxi +te-heed te-hee +te-heeing te-hee +te-hees te-hee +teaches teach +teaching teach +tearing tear +tears tear +teaselled teasel +teaselling teasel +teasels teasel +tedded ted +tedding ted +teds ted +teed tee +teeing tee +tees tee +telecasted telecast +telecasting telecast +telecasts telecast +telling tell +tells tell +tepefied tepefy +tepefies tepefy +tepefying tepefy +terrified terrify +terrifies terrify +terrifying terrify +testified testify +testifies testify +testifying testify +thinking think +thinking_the_world_of think_the_world_of +thinks think +thinks_the_world_of think_the_world_of +thinned thin +thinning thin +thins thin +thought think +thought_the_world_of think_the_world_of +threw throw +threw_out throw_out +thrived thrive +thriven thrive +thrives thrive +thriving thrive +throbbed throb +throbbing throb +throbs throb +throve thrive +throwing throw +throwing_out throw_out +thrown throw +thrown_out throw_out +throws throw +throws_out throw_out +thrummed thrum +thrumming thrum +thrums thrum +thudded thud +thudding thud +thuds thud +tidied tidy +tidies tidy +tidying tidy +tied tie +ties tie +tinged tinge +tingeing tinge +tinges tinge +tinging tinge +tinned tin +tinning tin +tins tin +tinseled tinsel +tinseling tinsel +tinselled tinsel +tinselling tinsel +tinsels tinsel +tipped tip +tipping tip +tips tip +tiptoed tiptoe +tiptoeing tiptoe +tiptoes tiptoe +tittuped tittup +tittuping tittup +tittupped tittup +tittupping tittup +tittups tittup +toadied toady +toadies toady +toadying toady +toed toe +toeing toe +toes toe +togged tog +togging tog +togs tog +told tell +tongued tongue +tongues tongue +tonguing tongue +took take +took_a_side take_a_side +took_pains take_pains +took_steps take_steps +topped top +topping top +tops top +tore tear +torn tear +torrefied torrefy +torrefies torrefy +torrefying torrefy +torrify torrefy +totaled total +totaling total +totalled total +totalling total +totals total +tots tot +totted tot +totting tot +toweled towel +toweling towel +towelled towel +towelling towel +towels towel +trafficked traffic +trafficking traffic +traffics traffic +traipsed traipse +traipses traipse +traipsing traipse +trameled trammel +trameling trammel +tramelled trammel +tramelling trammel +tramels trammel +trammed tram +tramming tram +trams tram +tranquillized tranquillize +tranquillizes tranquillize +tranquillizing tranquillize +transferred transfer +transferring transfer +transfers transfer +transfixed transfix +transfixes transfix +transfixing transfix +transfixt transfix +tranship transship +transhipped tranship +transhipping tranship +tranships tranship +transmits transmit +transmitted transmit +transmitting transmit +transmogrified transmogrify +transmogrifies transmogrify +transmogrifying transmogrify +transshipped transship +transshipping transship +transships transship +transvalued transvalue +transvalues transvalue +transvaluing transvalue +trapanned trapan +trapanning trapan +trapans trapan +trapped trap +trapping trap +traps trap +traumatized traumatize +traumatizes traumatize +traumatizing traumatize +traveled travel +traveling travel +travelled travel +travelling travel +travels travel +travestied travesty +travesties travesty +travestying travesty +treading tread +treads tread +trekked trek +trekking trek +treks trek +trepanned trepan +trepanning trepan +trepans trepan +tried try +tries try +trigged trig +trigging trig +trigs trig +trimmed trim +trimming trim +trims trim +tripped trip +tripping trip +trips trip +trod tread +trodden tread +trogged trog +trogging trog +trogs trog +trots trot +trotted trot +trotting trot +troweled trowel +troweling trowel +trowelled trowel +trowelling trowel +trowels trowel +trued true +trues true +truing true +trying try +tugged tug +tugging tug +tugs tug +tumefied tumefy +tumefies tumefy +tumefying tumefy +tunned tun +tunneled tunnel +tunneling tunnel +tunnelled tunnel +tunnelling tunnel +tunnels tunnel +tunning tun +tuns tun +tupped tup +tupping tup +tups tup +tut-tuts tut-tut +tut-tutted tut-tut +tut-tutting tut-tut +twigged twig +twigging twig +twigs twig +twinned twin +twinning twin +twins twin +twits twit +twitted twit +twitting twit +tying tie +typecasting typecast +typecasts typecast +typesets typeset +typesetting typeset +typewrites typewrite +typewriting typewrite +typewritten typewrite +typewrote typewrite +typified typify +typifies typify +typifying typify +uglified uglify +uglifies uglify +uglifying uglify +unbarred unbar +unbarring unbar +unbars unbar +unbending unbend +unbends unbend +unbent unbend +unbinding unbind +unbinds unbind +unbound unbind +uncapped uncap +uncapping uncap +uncaps uncap +unclad unclothe +unclogged unclog +unclogging unclog +unclogs unclog +unclothed unclothe +unclothes unclothe +unclothing unclothe +underbidding underbid +underbids underbid +underbought underbuy +underbuying underbuy +underbuys underbuy +undercuts undercut +undercutting undercut +underfed underfeed +underfeeding underfeed +underfeeds underfeed +undergirded undergird +undergirding undergird +undergirds undergird +undergirt undergird +undergoes undergo +undergoing undergo +undergone undergo +underlaid underlay +underlain underlie +underlay underlie +underlaying underlay +underlays underlay +underlets underlet +underletting underlet +underlies underlie +underlying underlie +underpaid underpay +underpaying underpay +underpays underpay +underpinned underpin +underpinning underpin +underpins underpin +underpropped underprop +underpropping underprop +underprops underprop +underselling undersell +undersells undersell +undersets underset +undersetting underset +undershooting undershoot +undershoots undershoot +undershot undershoot +undersold undersell +understanding understand +understands understand +understood understand +understudied understudy +understudies understudy +understudying understudy +undertaken undertake +undertakes undertake +undertaking undertake +undertook undertake +undervalued undervalue +undervalues undervalue +undervaluing undervalue +underwent undergo +underwrites underwrite +underwriting underwrite +underwritten underwrite +underwrote underwrite +undid undo +undoes undo +undoing undo +undone undo +unfits unfit +unfitted unfit +unfitting unfit +unfreezes unfreeze +unfreezing unfreeze +unfroze unfreeze +unfrozen unfreeze +unified unify +unifies unify +unifying unify +unkenneled unkennel +unkenneling unkennel +unkennelled unkennel +unkennelling unkennel +unkennels unkennel +unknits unknit +unknitted unknit +unknitting unknit +unlaid unlay +unlaying unlay +unlays unlay +unlearned unlearn +unlearning unlearn +unlearns unlearn +unlearnt unlearn +unmade unmake +unmakes unmake +unmaking unmake +unmanned unman +unmanning unman +unmans unman +unpegged unpeg +unpegging unpeg +unpegs unpeg +unpinned unpin +unpinning unpin +unpins unpin +unplugged unplug +unplugging unplug +unplugs unplug +unraveled unravel +unraveling unravel +unravelled unravel +unravelling unravel +unravels unravel +unreeved unreeve +unreeves unreeve +unreeving unreeve +unrigged unrig +unrigging unrig +unrigs unrig +unripped unrip +unripping unrip +unrips unrip +unrove unreeve +unsaid unsay +unsaying unsay +unsays unsay +unshipped unship +unshipping unship +unships unship +unslinging unsling +unslings unsling +unslung unsling +unsnapped unsnap +unsnapping unsnap +unsnaps unsnap +unspeaking unspeak +unspeaks unspeak +unspoke unspeak +unspoken unspeak +unsteadied unsteady +unsteadies unsteady +unsteadying unsteady +unstepped unstep +unstepping unstep +unsteps unstep +unsticking unstick +unsticks unstick +unstopped unstop +unstopping unstop +unstops unstop +unstringing unstring +unstrings unstring +unstrung unstring +unstuck unstick +unswearing unswear +unswears unswear +unswore unswear +unsworn unswear +untaught unteach +unteaches unteach +unteaching unteach +unthinking unthink +unthinks unthink +unthought unthink +untidied untidy +untidies untidy +untidying untidy +untied untie +unties untie +untreading untread +untreads untread +untrod untread +untrodden untread +untying untie +unwinding unwind +unwinds unwind +unwound unwind +unwrapped unwrap +unwrapping unwrap +unwraps unwrap +unzipped unzip +unzipping unzip +unzips unzip +upbuilding upbuild +upbuilds upbuild +upbuilt upbuild +upcasting upcast +upcasts upcast +upheaved upheave +upheaves upheave +upheaving upheave +upheld uphold +upholding uphold +upholds uphold +uphove upheave +upped up +uppercuts uppercut +uppercutting uppercut +upping up +uprisen uprise +uprises uprise +uprising uprise +uprose uprise +ups up +upsets upset +upsetting upset +upsprang upspring +upspringing upspring +upsprings upspring +upsprung upspring +upsweeping upsweep +upsweeps upsweep +upswelled upswell +upswelling upswell +upswells upswell +upswept upsweep +upswinging upswing +upswings upswing +upswollen upswell +upswung upswing +vagged vag +vagging vag +vags vag +valued value +values value +valuing value +varied vary +varies vary +varying vary +vats vat +vatted vat +vatting vat +verbified verbify +verbifies verbify +verbifying verbify +verified verify +verifies verify +verifying verify +versified versify +versifies versify +versifying versify +vetoed veto +vetoes veto +vetoing veto +vets vet +vetted vet +vetting vet +victualed victual +victualing victual +victualled victual +victualling victual +victuals victual +vied vie +vies vie +vilified vilify +vilifies vilify +vilifying vilify +visaed visa +visaing visa +visas visa +vitrified vitrify +vitrifies vitrify +vitrifying vitrify +vitrioled vitriol +vitrioling vitriol +vitriolled vitriol +vitriolling vitriol +vitriols vitriol +vivaed viva +vivaing viva +vivas viva +vivified vivify +vivifies vivify +vivifying vivify +voodooed voodoo +voodooing voodoo +voodoos voodoo +vying vie +wadded wad +waddied waddy +waddies waddy +wadding wad +waddying waddy +wads wad +wadsets wadset +wadsetted wadset +wadsetting wadset +wagged wag +wagging wag +wags wag +wakes wake +waking wake +wanned wan +wanning wan +wans wan +warred war +warring war +wars war +was be +water-ski'd water-ski +water-skied water-ski +water-skiing water-ski +water-skis water-ski +waylaid waylay +waylaying waylay +waylays waylay +wearied weary +wearies weary +wearing wear +wears wear +wearying weary +weatherstripped weatherstrip +weatherstripping weatherstrip +weaved weave +weaves weave +weaving weave +webbed web +webbing web +webs web +wedded wed +wedding wed +weds wed +weeping weep +weeps weep +went go +went_deep go_deep +wept weep +were be +wets wet +wetted wet +wetting wet +whammed wham +whamming wham +whams wham +whapped whap +whapping whap +whaps whap +whets whet +whetted whet +whetting whet +whinnied whinny +whinnies whinny +whinnying whinny +whipped whip +whipping whip +whips whip +whipsawed whipsaw +whipsawing whipsaw +whipsawn whipsaw +whipsaws whipsaw +whirred whir +whirring whir +whirs whir +whistle-stopped whistle-stop +whistle-stopping whistle-stop +whistle-stops whistle-stop +whizzed whiz +whizzes whiz +whizzing whiz +whopped whop +whopping whop +whops whop +wigged wig +wigging wig +wigs wig +wigwagged wigwag +wigwagging wigwag +wigwags wigwag +wildcats wildcat +wildcatted wildcat +wildcatting wildcat +winded wind +winding wind +window-shopped window-shop +window-shopping window-shop +window-shops window-shop +winds wind +winning win +wins win +winterfed winterfeed +winterfeeding winterfeed +winterfeeds winterfeed +wiredrawing wiredraw +wiredrawn wiredraw +wiredraws wiredraw +wiredrew wiredraw +withdrawing withdraw +withdrawn withdraw +withdraws withdraw +withdrew withdraw +withheld withhold +withholding withhold +withholds withhold +withstanding withstand +withstands withstand +withstood withstand +woke wake +woken wake +won win +wonned won +wonning won +wons won +wooed woo +wooing woo +woos woo +wore wear +worn wear +worried worry +worries worry +worrying worry +worshipped worship +worshipping worship +worships worship +wound wind +wove weave +woven weave +wrapped wrap +wrapping wrap +wraps wrap +wried wry +wries wry +wringing wring +wrings wring +writes write +writing write +written write +wrote write +wrought work +wrung wring +wrying wry +yakked yak +yakking yak +yaks yak +yapped yap +yapping yap +yaps yap +ycleped clepe +yclept clepe +yenned yen +yenning yen +yens yen +yodeled yodel +yodeling yodel +yodelled yodel +yodelling yodel +yodels yodel +zapped zap +zapping zap +zaps zap +zeroed zero +zeroes zero +zeroing zero +zigzagged zigzag +zigzagging zigzag +zigzags zigzag +zipped zip +zipping zip +zips zip diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6.exc.db b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-1.6.exc.db new file mode 100644 index 0000000000000000000000000000000000000000..68cd6010c9392b3cea4b5488ee089cd993ee9b6f GIT binary patch literal 638976 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¬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

^H+#nypLB>E009dwR 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ʚ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�N=p^aE(#^ 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

T%UbvJQ5wTv1e8?*0 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%0DaLSpHu5>hd?rUoU?J|Np1T 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 I{B#EY2Rz)dRsaA1 literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/WordNet-2.0.exc.db b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/WordNet-2.0.exc.db new file mode 100644 index 0000000000000000000000000000000000000000..a7a14c7726d7f2b8ba608c742f9d8f44f47cf87e GIT binary patch literal 294912 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 Ac>n+a literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adj.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adj.exc new file mode 100644 index 0000000..e053283 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adj.exc @@ -0,0 +1,1490 @@ +acer acer +after after +airier airy +airiest airy +all-arounder all-arounder +angrier angry +angriest angry +archer archer +artier arty +artiest arty +ashier ashy +ashiest ashy +assaulter assaulter +attacker attacker +backer backer +baggier baggy +baggiest baggy +balkier balky +balkiest balky +balmier balmy +balmiest balmy +bandier bandy +bandiest bandy +bargainer bargainer +barmier barmy +barmiest barmy +battier batty +battiest batty +baulkier baulky +baulkiest baulky +bawdier bawdy +bawdiest bawdy +bayer bayer +beadier beady +beadiest beady +beastlier beastly +beastliest beastly +beater beater +beefier beefy +beefiest beefy +beerier beery +beeriest beery +bendier bendy +bendiest bendy +best good +better good well +bigger big +biggest big +bitchier bitchy +bitchiest bitchy +biter biter +bittier bitty +bittiest bitty +blearier bleary +bleariest bleary +bloodier bloody +bloodiest bloody +bloodthirstier bloodthirsty +bloodthirstiest bloodthirsty +blowier blowy +blowiest blowy +blowsier blowsy +blowsiest blowsy +blowzier blowzy +blowziest blowzy +bluer blue +bluest blue +boner boner +bonier bony +boniest bony +bonnier bonny +bonniest bonny +boozier boozy +booziest boozy +boskier bosky +boskiest bosky +bossier bossy +bossiest bossy +botchier botchy +botchiest botchy +bother bother +bouncier bouncy +bounciest bouncy +bounder bounder +bower bower +brainier brainy +brainiest brainy +brashier brashy +brashiest brashy +brassier brassy +brassiest brassy +brawnier brawny +brawniest brawny +breathier breathy +breathiest breathy +breezier breezy +breeziest breezy +brinier briny +briniest briny +britisher britisher +broadcaster broadcaster +brooder brooder +broodier broody +broodiest broody +bubblier bubbly +bubbliest bubbly +buggier buggy +buggiest buggy +bulkier bulky +bulkiest bulky +bumpier bumpy +bumpiest bumpy +bunchier bunchy +bunchiest bunchy +burlier burly +burliest burly +burrier burry +burriest burry +burster burster +bushier bushy +bushiest bushy +busier busy +busiest busy +buster buster +bustier busty +bustiest busty +cagier cagey +cagiest cagey +camper camper +cannier canny +canniest canny +canter canter +cantier canty +cantiest canty +caster caster +catchier catchy +catchiest catchy +cattier catty +cattiest catty +cer cer +chancier chancy +chanciest chancy +charier chary +chariest chary +chattier chatty +chattiest chatty +cheekier cheeky +cheekiest cheeky +cheerier cheery +cheeriest cheery +cheesier cheesy +cheesiest cheesy +chestier chesty +chestiest chesty +chewier chewy +chewiest chewy +chillier chilly +chilliest chilly +chintzier chintzy +chintziest chintzy +chippier chippy +chippiest chippy +choosier choosy +choosiest choosy +choppier choppy +choppiest choppy +chubbier chubby +chubbiest chubby +chuffier chuffy +chuffiest chuffy +chummier chummy +chummiest chummy +chunkier chunky +chunkiest chunky +churchier churchy +churchiest churchy +clammier clammy +clammiest clammy +classier classy +classiest classy +cleanlier cleanly +cleanliest cleanly +clerklier clerkly +clerkliest clerkly +cloudier cloudy +cloudiest cloudy +clubbier clubby +clubbiest clubby +clumsier clumsy +clumsiest clumsy +cockier cocky +cockiest cocky +coder coder +collier colly +colliest colly +comelier comely +comeliest comely +comfier comfy +comfiest comfy +cornier corny +corniest corny +cosier cosy +cosiest cosy +costlier costly +costliest costly +costumer costumer +counterfeiter counterfeiter +courtlier courtly +courtliest courtly +cozier cozy +coziest cozy +crabbier crabby +crabbiest crabby +cracker cracker +craftier crafty +craftiest crafty +craggier craggy +craggiest craggy +crankier cranky +crankiest cranky +crasher crasher +crawlier crawly +crawliest crawly +crazier crazy +craziest crazy +creamer creamer +creamier creamy +creamiest creamy +creepier creepy +creepiest creepy +crispier crispy +crispiest crispy +crumbier crumby +crumbiest crumby +crumblier crumbly +crumbliest crumbly +crummier crummy +crummiest crummy +crustier crusty +crustiest crusty +curlier curly +curliest curly +customer customer +cuter cute +daffier daffy +daffiest daffy +daintier dainty +daintiest dainty +dandier dandy +dandiest dandy +deadlier deadly +deadliest deadly +dealer dealer +deserter deserter +dewier dewy +dewiest dewy +dicier dicey +diciest dicey +dimer dimer +dimmer dim +dimmest dim +dingier dingy +dingiest dingy +dinkier dinky +dinkiest dinky +dippier dippy +dippiest dippy +dirtier dirty +dirtiest dirty +dishier dishy +dishiest dishy +dizzier dizzy +dizziest dizzy +dodgier dodgy +dodgiest dodgy +dopier dopey +dopiest dopey +dottier dotty +dottiest dotty +doughier doughy +doughiest doughy +doughtier doughty +doughtiest doughty +dowdier dowdy +dowdiest dowdy +dowier dowie dowy +dowiest dowie dowy +downer downer +downier downy +downiest downy +dozier dozy +doziest dozy +drabber drab +drabbest drab +draftier drafty +draftiest drafty +draggier draggy +draggiest draggy +draughtier draughty +draughtiest draughty +dreamier dreamy +dreamiest dreamy +drearier dreary +dreariest dreary +dreggier dreggy +dreggiest dreggy +dresser dresser +dressier dressy +dressiest dressy +drier dry +driest dry +drippier drippy +drippiest drippy +drowsier drowsy +drowsiest drowsy +dryer dry +dryest dry +dumpier dumpy +dumpiest dumpy +dunner dun +dunnest dun +duskier dusky +duskiest dusky +dustier dusty +dustiest dusty +earlier early +earliest early +earthier earthy +earthiest earthy +earthlier earthly +earthliest earthly +easier easy +easiest easy +easter easter +eastsider eastsider +edger edger +edgier edgy +edgiest edgy +eerier eerie +eeriest eerie +emptier empty +emptiest empty +faker faker +fancier fancy +fanciest fancy +fatter fat +fattest fat +fattier fatty +fattiest fatty +faultier faulty +faultiest faulty +feistier feisty +feistiest feisty +feller feller +fiddlier fiddly +fiddliest fiddly +filmier filmy +filmiest filmy +filthier filthy +filthiest filthy +finnier finny +finniest finny +first-rater first-rater +first-stringer first-stringer +fishier fishy +fishiest fishy +fitter fit +fittest fit +flabbier flabby +flabbiest flabby +flaggier flaggy +flaggiest flaggy +flakier flaky +flakiest flaky +flasher flasher +flashier flashy +flashiest flashy +flatter flat +flattest flat +flauntier flaunty +flauntiest flaunty +fledgier fledgy +fledgiest fledgy +fleecier fleecy +fleeciest fleecy +fleshier fleshy +fleshiest fleshy +fleshlier fleshly +fleshliest fleshly +flightier flighty +flightiest flighty +flimsier flimsy +flimsiest flimsy +flintier flinty +flintiest flinty +floatier floaty +floatiest floaty +floppier floppy +floppiest floppy +flossier flossy +flossiest flossy +fluffier fluffy +fluffiest fluffy +flukier fluky +flukiest fluky +foamier foamy +foamiest foamy +foggier foggy +foggiest foggy +folder folder +folksier folksy +folksiest folksy +foolhardier foolhardy +foolhardiest foolhardy +fore-and-after fore-and-after +foreigner foreigner +forest forest +founder founder +foxier foxy +foxiest foxy +fratchier fratchy +fratchiest fratchy +freakier freaky +freakiest freaky +freer free +freest free +frenchier frenchy +frenchiest frenchy +friendlier friendly +friendliest friendly +friskier frisky +friskiest frisky +frizzier frizzy +frizziest frizzy +frizzlier frizzly +frizzliest frizzly +frostier frosty +frostiest frosty +frouzier frouzy +frouziest frouzy +frowsier frowsy +frowsiest frowsy +frowzier frowzy +frowziest frowzy +fruitier fruity +fruitiest fruity +funkier funky +funkiest funky +funnier funny +funniest funny +furrier furry +furriest furry +fussier fussy +fussiest fussy +fustier fusty +fustiest fusty +fuzzier fuzzy +fuzziest fuzzy +gabbier gabby +gabbiest gabby +gamier gamy +gamiest gamy +gammier gammy +gammiest gammy +gassier gassy +gassiest gassy +gaudier gaudy +gaudiest gaudy +gauzier gauzy +gauziest gauzy +gawkier gawky +gawkiest gawky +ghastlier ghastly +ghastliest ghastly +ghostlier ghostly +ghostliest ghostly +giddier giddy +giddiest giddy +gladder glad +gladdest glad +glassier glassy +glassiest glassy +glibber glib +glibbest glib +gloomier gloomy +gloomiest gloomy +glossier glossy +glossiest glossy +glummer glum +glummest glum +godlier godly +godliest godly +goer goer +goner goner +goodlier goodly +goodliest goodly +goofier goofy +goofiest goofy +gooier gooey +gooiest gooey +goosier goosy +goosiest goosy +gorier gory +goriest gory +gradelier gradely +gradeliest gradely +grader grader +grainier grainy +grainiest grainy +grassier grassy +grassiest grassy +greasier greasy +greasiest greasy +greedier greedy +greediest greedy +grimmer grim +grimmest grim +grislier grisly +grisliest grisly +grittier gritty +grittiest gritty +grizzlier grizzly +grizzliest grizzly +groggier groggy +groggiest groggy +groovier groovy +grooviest groovy +grottier grotty +grottiest grotty +grounder grounder +grouper grouper +groutier grouty +groutiest grouty +grubbier grubby +grubbiest grubby +grumpier grumpy +grumpiest grumpy +guest guest +guiltier guilty +guiltiest guilty +gummier gummy +gummiest gummy +gushier gushy +gushiest gushy +gustier gusty +gustiest gusty +gutsier gutsy +gutsiest gutsy +hairier hairy +hairiest hairy +halfways halfway +halter halter +hammier hammy +hammiest hammy +handier handy +handiest handy +happier happy +happiest happy +hardier hardy +hardiest hardy +hastier hasty +hastiest hasty +haughtier haughty +haughtiest haughty +hazier hazy +haziest hazy +header header +headier heady +headiest heady +healthier healthy +healthiest healthy +heartier hearty +heartiest hearty +heavier heavy +heaviest heavy +heftier hefty +heftiest hefty +hepper hep +heppest hep +herbier herby +herbiest herby +hinder hind +hipper hip +hippest hip +hippier hippy +hippiest hippy +hoarier hoary +hoariest hoary +holier holy +holiest holy +homelier homely +homeliest homely +homer homer +homier homey +homiest homey +hornier horny +horniest horny +horsier horsy +horsiest horsy +hotter hot +hottest hot +humpier humpy +humpiest humpy +hunger hunger +hungrier hungry +hungriest hungry +huskier husky +huskiest husky +icier icy +iciest icy +inkier inky +inkiest inky +insider insider +interest interest +jaggier jaggy +jaggiest jaggy +jammier jammy +jammiest jammy +jauntier jaunty +jauntiest jaunty +jazzier jazzy +jazziest jazzy +jerkier jerky +jerkiest jerky +jointer jointer +jollier jolly +jolliest jolly +juicier juicy +juiciest juicy +jumpier jumpy +jumpiest jumpy +kindlier kindly +kindliest kindly +kinkier kinky +kinkiest kinky +knottier knotty +knottiest knotty +knurlier knurly +knurliest knurly +kookier kooky +kookiest kooky +lacier lacy +laciest lacy +lairier lairy +lairiest lairy +lakier laky +lakiest laky +lander lander +lankier lanky +lankiest lanky +lathier lathy +lathiest lathy +layer layer +lazier lazy +laziest lazy +leafier leafy +leafiest leafy +leakier leaky +leakiest leaky +learier leary +leariest leary +leer leer +leerier leery +leeriest leery +left-hander left-hander +left-winger left-winger +leggier leggy +leggiest leggy +lengthier lengthy +lengthiest lengthy +ler ler +leveler leveler +limier limy +limiest limy +lippier lippy +lippiest lippy +liter liter +livelier lively +liveliest lively +liver liver +loather loather +loftier lofty +loftiest lofty +logier logy +logiest logy +lonelier lonely +loneliest lonely +loner loner +loonier loony +looniest loony +loopier loopy +loopiest loopy +lordlier lordly +lordliest lordly +lousier lousy +lousiest lousy +lovelier lovely +loveliest lovely +lowlander lowlander +lowlier lowly +lowliest lowly +luckier lucky +luckiest lucky +lumpier lumpy +lumpiest lumpy +lunier luny +luniest luny +lustier lusty +lustiest lusty +madder mad +maddest mad +mainer mainer +maligner maligner +maltier malty +maltiest malty +mangier mangy +mangiest mangy +mankier manky +mankiest manky +manlier manly +manliest manly +mariner mariner +marshier marshy +marshiest marshy +massier massy +massiest massy +matter matter +maungier maungy +maungiest maungy +mazier mazy +maziest mazy +mealier mealy +mealiest mealy +measlier measly +measliest measly +meatier meaty +meatiest meaty +meeter meeter +merrier merry +merriest merry +messier messy +messiest messy +miffier miffy +miffiest miffy +mightier mighty +mightiest mighty +milcher milcher +milker milker +milkier milky +milkiest milky +mingier mingy +mingiest mingy +minter minter +mirkier mirky +mirkiest mirky +miser miser +mistier misty +mistiest misty +mocker mocker +modeler modeler +modest modest +moldier moldy +moldiest moldy +moodier moody +moodiest moody +moonier moony +mooniest moony +mothier mothy +mothiest mothy +mouldier mouldy +mouldiest mouldy +mousier mousy +mousiest mousy +mouthier mouthy +mouthiest mouthy +muckier mucky +muckiest mucky +muddier muddy +muddiest muddy +muggier muggy +muggiest muggy +multiplexer multiplexer +murkier murky +murkiest murky +mushier mushy +mushiest mushy +muskier musky +muskiest musky +muster muster +mustier musty +mustiest musty +muzzier muzzy +muzziest muzzy +nappier nappy +nappiest nappy +nastier nasty +nastiest nasty +nattier natty +nattiest natty +naughtier naughty +naughtiest naughty +needier needy +neediest needy +nervier nervy +nerviest nervy +newsier newsy +newsiest newsy +niftier nifty +niftiest nifty +nippier nippy +nippiest nippy +nittier nitty +nittiest nitty +noisier noisy +noisiest noisy +northeasterner northeasterner +norther norther +northerner northerner +nosier nosy +nosiest nosy +number number +nuttier nutty +nuttiest nutty +offer off +offer offer +oilier oily +oiliest oily +old-timer old-timer +oliver oliver +oozier oozy +ooziest oozy +opener opener +outsider outsider +overcomer overcomer +overnighter overnighter +owner owner +pallier pally +palliest pally +palmier palmy +palmiest palmy +paltrier paltry +paltriest paltry +pappier pappy +pappiest pappy +parkier parky +parkiest parky +part-timer part-timer +passer passer +paster paster +pastier pasty +pastiest pasty +patchier patchy +patchiest patchy +pater pater +pawkier pawky +pawkiest pawky +peachier peachy +peachiest peachy +pearler pearler +pearlier pearly +pearliest pearly +pedaler pedaler +peppier peppy +peppiest peppy +perkier perky +perkiest perky +peskier pesky +peskiest pesky +peter peter +pettier petty +pettiest petty +phonier phony +phoniest phony +pickier picky +pickiest picky +piggier piggy +piggiest piggy +pinier piny +piniest piny +pitchier pitchy +pitchiest pitchy +pithier pithy +pithiest pithy +planer planer +plashier plashy +plashiest plashy +platier platy +platiest platy +player player +pluckier plucky +pluckiest plucky +plumber plumber +plumier plumy +plumiest plumy +plummier plummy +plummiest plummy +podgier podgy +podgiest podgy +pokier poky +pokiest poky +polisher polisher +porkier porky +porkiest porky +porter porter +portlier portly +portliest portly +poster poster +pottier potty +pottiest potty +preachier preachy +preachiest preachy +presenter presenter +pretender pretender +prettier pretty +prettiest pretty +pricier pricy +priciest pricy +pricklier prickly +prickliest prickly +priestlier priestly +priestliest priestly +primer primer +primmer prim +primmest prim +princelier princely +princeliest princely +printer printer +prissier prissy +prissiest prissy +privateer privateer +privier privy +priviest privy +prompter prompter +prosier prosy +prosiest prosy +pudgier pudgy +pudgiest pudgy +puffer puffer +puffier puffy +puffiest puffy +pulpier pulpy +pulpiest pulpy +punchier punchy +punchiest punchy +punier puny +puniest puny +pushier pushy +pushiest pushy +pussier pussy +pussiest pussy +quaggier quaggy +quaggiest quaggy +quakier quaky +quakiest quaky +queasier queasy +queasiest queasy +queenlier queenly +queenliest queenly +racier racy +raciest racy +rainier rainy +rainiest rainy +randier randy +randiest randy +rangier rangy +rangiest rangy +ranker ranker +rattier ratty +rattiest ratty +rattlier rattly +rattliest rattly +raunchier raunchy +raunchiest raunchy +readier ready +readiest ready +recorder recorder +redder red +reddest red +reedier reedy +reediest reedy +renter renter +retailer retailer +right-hander right-hander +right-winger right-winger +rimier rimy +rimiest rimy +riskier risky +riskiest risky +ritzier ritzy +ritziest ritzy +roaster roaster +rockier rocky +rockiest rocky +roilier roily +roiliest roily +rookier rooky +rookiest rooky +roomier roomy +roomiest roomy +ropier ropy +ropiest ropy +rosier rosy +rosiest rosy +rowdier rowdy +rowdiest rowdy +ruddier ruddy +ruddiest ruddy +runnier runny +runniest runny +rusher rusher +rushier rushy +rushiest rushy +rustier rusty +rustiest rusty +ruttier rutty +ruttiest rutty +sadder sad +saddest sad +salter salter +saltier salty +saltiest salty +sampler sampler +sandier sandy +sandiest sandy +sappier sappy +sappiest sappy +sassier sassy +sassiest sassy +saucier saucy +sauciest saucy +savvier savvy +savviest savvy +scabbier scabby +scabbiest scabby +scalier scaly +scaliest scaly +scantier scanty +scantiest scanty +scarier scary +scariest scary +scraggier scraggy +scraggiest scraggy +scragglier scraggly +scraggliest scraggly +scraper scraper +scrappier scrappy +scrappiest scrappy +scrawnier scrawny +scrawniest scrawny +screwier screwy +screwiest screwy +scrubbier scrubby +scrubbiest scrubby +scruffier scruffy +scruffiest scruffy +scungier scungy +scungiest scungy +scurvier scurvy +scurviest scurvy +seamier seamy +seamiest seamy +second-rater second-rater +seconder seconder +seedier seedy +seediest seedy +seemlier seemly +seemliest seemly +serer serer +sexier sexy +sexiest sexy +shabbier shabby +shabbiest shabby +shadier shady +shadiest shady +shaggier shaggy +shaggiest shaggy +shakier shaky +shakiest shaky +shapelier shapely +shapeliest shapely +shier shy +shiest shy +shiftier shifty +shiftiest shifty +shinier shiny +shiniest shiny +shirtier shirty +shirtiest shirty +shoddier shoddy +shoddiest shoddy +showier showy +showiest showy +shrubbier shrubby +shrubbiest shrubby +shyer shy +shyest shy +sicklier sickly +sickliest sickly +sightlier sightly +sightliest sightly +signaler signaler +signer signer +silkier silky +silkiest silky +sillier silly +silliest silly +sketchier sketchy +sketchiest sketchy +skewer skewer +skimpier skimpy +skimpiest skimpy +skinnier skinny +skinniest skinny +slaphappier slaphappy +slaphappiest slaphappy +slatier slaty +slatiest slaty +slaver slaver +sleazier sleazy +sleaziest sleazy +sleepier sleepy +sleepiest sleepy +slier sly +sliest sly +slimier slimy +slimiest slimy +slimmer slim +slimmest slim +slimsier slimsy +slimsiest slimsy +slinkier slinky +slinkiest slinky +slippier slippy +slippiest slippy +sloppier sloppy +sloppiest sloppy +slyer sly +slyest sly +smarmier smarmy +smarmiest smarmy +smellier smelly +smelliest smelly +smokier smoky +smokiest smoky +smugger smug +smuggest smug +snakier snaky +snakiest snaky +snappier snappy +snappiest snappy +snatchier snatchy +snatchiest snatchy +snazzier snazzy +snazziest snazzy +sneaker sneaker +sniffier sniffy +sniffiest sniffy +snootier snooty +snootiest snooty +snottier snotty +snottiest snotty +snowier snowy +snowiest snowy +snuffer snuffer +snuffier snuffy +snuffiest snuffy +snugger snug +snuggest snug +soapier soapy +soapiest soapy +soggier soggy +soggiest soggy +solder solder +sonsier sonsy +sonsiest sonsy +sootier sooty +sootiest sooty +soppier soppy +soppiest soppy +sorrier sorry +sorriest sorry +soupier soupy +soupiest soupy +souther souther +southerner southerner +speedier speedy +speediest speedy +spicier spicy +spiciest spicy +spiffier spiffy +spiffiest spiffy +spikier spiky +spikiest spiky +spindlier spindly +spindliest spindly +spinier spiny +spiniest spiny +splashier splashy +splashiest splashy +spongier spongy +spongiest spongy +spookier spooky +spookiest spooky +spoonier spoony +spooniest spoony +sportier sporty +sportiest sporty +spottier spotty +spottiest spotty +spreader spreader +sprier spry +spriest spry +sprightlier sprightly +sprightliest sprightly +springer springer +springier springy +springiest springy +squashier squashy +squashiest squashy +squatter squat +squattest squat +squattier squatty +squattiest squatty +squiffier squiffy +squiffiest squiffy +stagier stagy +stagiest stagy +stalkier stalky +stalkiest stalky +stapler stapler +starchier starchy +starchiest starchy +starer starer +starest starest +starrier starry +starriest starry +statelier stately +stateliest stately +steadier steady +steadiest steady +stealthier stealthy +stealthiest stealthy +steamier steamy +steamiest steamy +stingier stingy +stingiest stingy +stiper striper +stocker stocker +stockier stocky +stockiest stocky +stodgier stodgy +stodgiest stodgy +stonier stony +stoniest stony +stormier stormy +stormiest stormy +streakier streaky +streakiest streaky +streamier streamy +streamiest streamy +stretcher stretcher +stretchier stretchy +stretchiest stretchy +stringier stringy +stringiest stringy +stripier stripy +stripiest stripy +stronger strong +strongest strong +stroppier stroppy +stroppiest stroppy +stuffier stuffy +stuffiest stuffy +stumpier stumpy +stumpiest stumpy +sturdier sturdy +sturdiest sturdy +submariner submariner +sulkier sulky +sulkiest sulky +sultrier sultry +sultriest sultry +sunnier sunny +sunniest sunny +surlier surly +surliest surly +swagger swagger +swankier swanky +swankiest swanky +swarthier swarthy +swarthiest swarthy +sweatier sweaty +sweatiest sweaty +tackier tacky +tackiest tacky +talkier talky +talkiest talky +tangier tangy +tangiest tangy +tanner tan +tannest tan +tardier tardy +tardiest tardy +tastier tasty +tastiest tasty +tattier tatty +tattiest tatty +tawdrier tawdry +tawdriest tawdry +techier techy +techiest techy +teenager teenager +teenier teeny +teeniest teeny +teetotaler teetotaler +tester tester +testier testy +testiest testy +tetchier tetchy +tetchiest tetchy +thinner thin +thinnest thin +third-rater third-rater +thirstier thirsty +thirstiest thirsty +thornier thorny +thorniest thorny +threadier thready +threadiest thready +thriftier thrifty +thriftiest thrifty +throatier throaty +throatiest throaty +tidier tidy +tidiest tidy +timelier timely +timeliest timely +tinier tiny +tiniest tiny +tinnier tinny +tinniest tinny +tipsier tipsy +tipsiest tipsy +tonier tony +toniest tony +toothier toothy +toothiest toothy +toper toper +touchier touchy +touchiest touchy +trader trader +trashier trashy +trashiest trashy +trendier trendy +trendiest trendy +trickier tricky +trickiest tricky +tricksier tricksy +tricksiest tricksy +trimer trimer +trimmer trim +trimmest trim +truer true +truest true +trustier trusty +trustiest trusty +tubbier tubby +tubbiest tubby +turfier turfy +turfiest turfy +tweedier tweedy +tweediest tweedy +twiggier twiggy +twiggiest twiggy +uglier ugly +ugliest ugly +unfriendlier unfriendly +unfriendliest unfriendly +ungainlier ungainly +ungainliest ungainly +ungodlier ungodly +ungodliest ungodly +unhappier unhappy +unhappiest unhappy +unhealthier unhealthy +unhealthiest unhealthy +unholier unholy +unholiest unholy +unrulier unruly +unruliest unruly +untidier untidy +untidiest untidy +vastier vasty +vastiest vasty +vest vest +viewier viewy +viewiest viewy +wackier wacky +wackiest wacky +wanner wan +wannest wan +warier wary +wariest wary +washier washy +washiest washy +waster waster +wavier wavy +waviest wavy +waxier waxy +waxiest waxy +weaklier weakly +weakliest weakly +wealthier wealthy +wealthiest wealthy +wearier weary +weariest weary +webbier webby +webbiest webby +weedier weedy +weediest weedy +weenier weeny +weeniest weeny +weensier weensy +weensiest weensy +weepier weepy +weepiest weepy +weightier weighty +weightiest weighty +welsher welsher +wetter wet +wettest wet +whackier whacky +whackiest whacky +whimsier whimsy +whimsiest whimsy +wholesaler wholesaler +wieldier wieldy +wieldiest wieldy +wilier wily +wiliest wily +windier windy +windiest windy +winier winy +winiest winy +winterier wintery +winteriest wintery +wintrier wintry +wintriest wintry +wirier wiry +wiriest wiry +wispier wispy +wispiest wispy +wittier witty +wittiest witty +wonkier wonky +wonkiest wonky +woodier woody +woodiest woody +woodsier woodsy +woodsiest woodsy +woollier woolly +woolliest woolly +woozier woozy +wooziest woozy +wordier wordy +wordiest wordy +worldlier worldly +worldliest worldly +wormier wormy +wormiest wormy +worse bad +worst bad +worthier worthy +worthiest worthy +wrier wry +wriest wry +wryer wry +wryest wry +yarer yare +yarest yare +yeastier yeasty +yeastiest yeasty +younger young +youngest young +yummier yummy +yummiest yummy +zanier zany +zaniest zany +zippier zippy +zippiest zippy diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adv.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adv.exc new file mode 100644 index 0000000..5ddf085 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/adv.exc @@ -0,0 +1,7 @@ +best well +better well +deeper deeply +farther far +further far +harder hard +hardest hard diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/buildExeptionDB.pl b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/buildExeptionDB.pl new file mode 100644 index 0000000..45c35df --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/buildExeptionDB.pl @@ -0,0 +1,21 @@ +#!/usr/bin/perl -w +use DB_File; +@ARGV!=3&&die "Usage: buildExceptionDB.pl WordNet-exception-file-directory exception-file-extension output-file\n"; +opendir(DIR,$ARGV[0])||die "Cannot open directory $ARGV[0]\n"; +tie %exceptiondb,'DB_File',"$ARGV[2]",O_CREAT|O_RDWR,0640,$DB_HASH or + die "Cannot open exception db file for output: $ARGV[2]\n"; +while(defined($file=readdir(DIR))) { + if($file=~/\.$ARGV[1]$/o) { + print $file,"\n"; + open(IN,"$file")||die "Cannot open exception file: $file\n"; + while(defined($line=)) { + chomp($line); + @tmp=split(/\s+/,$line); + $exceptiondb{$tmp[0]}=$tmp[1]; + print $tmp[0],"\n"; + } + close(IN); + } +} +untie %exceptiondb; + diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/noun.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/noun.exc new file mode 100644 index 0000000..a547fce --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/noun.exc @@ -0,0 +1,2041 @@ +aardwolves aardwolf +abaci abacus +aboideaux aboideau +aboiteaux aboiteau +abscissae abscissa +acanthi acanthus +acari acarus +acciaccature acciaccatura +acetabula acetabulum +achaemenidae achaemenid +achaemenides achaemenid +acicula aciculum +aciculae acicula +acini acinus +acre-feet acre-foot +acromia acromion +actiniae actinia +actinozoa actinozoan +addenda addendum +adenocarcinomata adenocarcinoma +adenomata adenoma +adieux adieu +adyta adytum +aecia aecium +aecidia aecidium +aerobia aerobium +agents-general agent-general +aggiornamenti aggiornamento +agnomina agnomen +agones agon +agorae agora +agouties agouti +aides-de-camp aide-de-camp +aides-memoire aide-memoire +aids-de-camp aid-de-camp +alae ala +alewives alewife +alkalies alkali +allodia allodium +alluvia alluvium +alodia alodium +alto-relievos alto-relievo alto-rilievo +altocumuli altocumulus +altostrati altostratus +alulae alula +alumnae alumna +alumni alumnus +alveoli alveolus +amanuenses amanuensis +ambulacra ambulacrum +amebae ameba +amici_curiae amicus_curiae +amnia amnion +amniocenteses amniocentesis +amoebae amoeba +amoebiases amoebiasis +amoraim amora +amoretti amoretto +amorini amorino +amphiarthroses amphiarthrosis +amphicia amphithecium +amphimixes amphimixis +amphioxi amphioxus +amphisbaenae amphisbaena +amphorae amphora +ampullae ampulla +amygdalae amygdala +anabases anabasis +anacolutha anacoluthon +anacruses anacrusis +anaerobia anaerobium +anagnorises anagnorisis +analemmata analemma +analyses analysis +anamneses anamnesis +anamorphoses anamorphosis +anastomoses anastomosis +anatyxes anaptyxis +ancones ancon ancone +androclinia androclinium +androecia androecium +androsphinges androsphinx +andtheridia antheridium +angelfishes angelfish +angiomata angioma +animalcula animalculum +anlagen anlage +annattos anatto annatto +annuli annulus +antae anta +antalkalies antalkali +antefixa antefix +antennae antenna +antependia antependium +anthelia anthelion +anthelices anthelix +anthemia anthemion +antheridia antheridium +anthodia anthodium +anthozoa anthozoan +anthraces anthrax +anticlinoria anticlinorium +antihelices antihelix +antiheroes antihero +antisera antiserum +antitheses antithesis +antitragi antitragus +antra antrum +anus anus +aortae aorta +aphelia aphelion +aphides aphis +apices apex +apodoses apodosis +apomixes apomixis +aponeuroses aponeurosis +apophyses apophysis +aposiopeses aposiopesis +apothecia apothecium +apotheoses apotheosis +apparatus apparatus +appendices appendix +appoggiature appoggiatura +apsides apsis +aquae aqua +aquaria aquarium +araglis argali +arboreta arboretum +arcana arcanum +archegonia archegonium +archerfishes archerfish +archesporia archesporium +archipelagoes archipelago +arcs-boutants arc-boutant +areolae areola +argali argali +argumenta argumentum +ariette arietta +aristae arista +armamentaria armamentarium +arses arsis +artal rotl +artel rotl +arterioscleroses arteriosclerosis +aruspices aruspex +asceses ascesis +asci ascus +ascidia ascidium +ascogonia ascogonium +ashkenazim ashkenazi +aspergilla aspergillum +aspergilli aspergillus +aspergilloses aspergillosis +aspersoria aspersorium +assegais assagai assegai +astragali astragalus +asyndeta asyndeton +atheromata atheroma +atheroscleroses atherosclerosis +atmolyses atmolysis +atria atrium +attorneys-at-law attorney-at-law +auditoria auditorium +aurae aura +aurar eyrir +aurei aureus +auriculae auricula +aurorae aurora +auspices auspex auspice +autocatalyses autocatalysis +autochthones autochthon +automata automaton +autos-da-fe auto-da-fe +avitaminoses avitaminosis +axes ax axis +axillae axilla +bacchantes bacchant bacchante +bacchii bacchius +bacilli bacillus +bacteriostases bacteriostasis +bacula baculum +bains-marie bain-marie +bains_marie bain_marie +ballistae ballista +bambini bambino +bandeaux bandeau +banditti bandit +bani ban +banjoes banjo +barklice barklouse +barramundies barramundi +bases base basis +bases-on-balls base_on_balls +bases_on_balls base_on_balls +basidia basidium +basileis basileus +bassi basso +bastinadoes bastinado +bateaux bateau +batfishes batfish +beadsmen beadsman bedesman +beaux beau +beches-de-mer beche-de-mer +beeves beef +behooves behoof +bersaglieri bersagliere +bhishties bheesty bhishti +bibliothecae bibliotheca +bicennaries bicentenary bicentennial +bijoux bijou +bilboes bilbo +billets-doux billet-doux +billfishes billfish +bimboes bimbo +bisectrices bisectrix +blackfeet blackfoot +blackfishes blackfish +blastemata blastema +blastulae blastula +blindfishes blindfish +blowfishes blowfish +bluefishes bluefish +boarfishes boarfish +bok boschbok +boleti boletus +bolivares bolivar +bolsheviki bolshevik +bonefishes bonefish +bongoes bongo +bonitoes bonito +booklice booklouse +bookshelves bookshelf +boraces borax +borborygmi borborygmus +bordereaux bordereau +botargoes botargo +box-kodaks box_kodak +boxfishes boxfish +brachia brachium +brainchildren brainchild +branchiae branchia +brants brant brent +bravadoes bravado +bravoes bravo +bregmata bregma +brethren brother +broadcast_media broadcast_medium +broadleaves broadleaf +bronchi bronchus +brothers-in-law brother-in-law +bryozoa bryozoan +buboes bubo +buckoes bucko +buckteeth bucktooth +buffaloes buffalo +bullae bulla +bunde bund +bureaux bureau +bureaux_de_change bureau_de_change +bursae bursa +bushbok boschbok +bushboks boschbok +busses bus +butterfishes butterfish +byssi byssus +cacti cactus +caducei caduceus +caeca caecum +caesurae caesura +calami calamus +calathi calathus +calcanei calcaneum calcaneus +calces calx +calculi calculus +caldaria caldarium +calices calix +calicoes calico +calli callus +calves calf +calyces calyx +cambia cambium +camerae camera +canaliculi canaliculus +candelabra candelabrum +candlefishes candlefish +canthi canthus +canulae canula +canzoni canzone +capita caput +capitula capitulum +capricci capriccio +carabinieri carabiniere +carbonadoes carbonado +carcinomata carcinoma +cargoes cargo +carides caryatid +carinae carina +caroli carolus +carpi carpus +carpogonia carpogonium +carryings-on carrying-on +caryopses caryopsis +caryopsides caryopsis +castrati castrato +catabases catabasis +cataclases cataclasis +cataloes catalo +catalyses catalysis +catenae catena +catfishes catfish +cathari cathar +cathexes cathexis +cattaloes cattalo +caudices caudex +caules caulis +cavatine cavatina +cavefishes cavefish +cavetti cavetto +cavo-rilievi cavo-rilievo +ceca cecum +cellae cella +cembali cembalo +centesimi centesimo +centra centrum +cephalothoraces cephalothorax +cercariae cercaria +cercariiae cercaria +cerci cercus +cerebella cerebellum +cerebra cerebrum +cervices cervix +cestuses caestus +cesurae cesura +chadarim cheder +chaetae chaeta +chaises_longues chaise_longue +chalazae chalaza +challoth hallah +chalutzim chalutz +chapaties chapati +chapatties chapatti +chapeaux chapeau +chasidim chasid +chassidim chassid +chateaux chateau +chazanim chazan +chedarim cheder +chefs-d'ouvre chef-d'ouvre +chelae chela +chelicerae chelicera +cherubim cherub +chevaux-de-frise cheval-de-frise +chiasmata chiasma +chiasmi chiasmus +children child +chillies chilli +chinese_eddoes chinese_eddo +chitarroni chitarrone +chlamydes chlamys +chlamyses chlamys +chondromata chondroma +choragi choragus +choriambi choriambus +choux chou +chromonemata chromonema +chrysalides chrysalis +chuvashes chuvash +ciboria ciborium +cicadae cicada +cicale cicala +cicatrices cicatrix +ciceroni cicerone +cicisbei cicisbeo +cilia cilium +cimices cimex +cineraria cinerarium +cingula cingulum +cirri cirrus +cirrocumuli cirrocumulus +cirrostrati cirrostratus +ciscoes cisco +cisternae cisterna +clani clarino +clanos clarino +claroes claro +clepsydrae clepsydra +clinandria clinandrium +clingfishes clingfish +clitella clitellum +cloacae cloaca +clostridia clostridium +cloverleaves cloverleaf +clypei clypeus +coagula coagulum +coalfishes coalfish +cocci coccus +coccyges coccyx +cochleae cochlea +codfishes codfish +codices codex +coelentera coelenteron +coenuri coenurus +cognomina cognomen +cola colon +coleorhizae coleorhiza +collegia collegium +colloquia colloquium +colluvia colluvium +collyria collyrium +colones colon +colossi colossus +columbaria columbarium +columellae columella +comae coma +comatulae comatula +comedones comedo +comics comic_strip comic +commandoes commando +concertanti concertante +concerti concerto +concerti_grossi concerto_grosso +concertini concertino +conchae concha +condottieri condottiere +condylomata condyloma +confervae conferva +congii congius +conidia conidium +conjunctivae conjunctiva +conquistadores conquistador +consortia consortium +contagia contagium +continua continuum +contralti contralto +conversazioni conversazione +convolvuli convolvulus +cooks-general cook-general +copulae copula +corbiculae corbicula +coria corium +corneae cornea +cornua cornu +coronae corona +corpora corpus +corpora_lutea corpus_luteum +corpora_striata corpus_striatum +corrigenda corrigendum +cortices cortex +cortinae cortina +corybantes corybant +coryphaei coryphaeus +costae costa +cothurni cothurnus +courts_martial court_martial +couteaux couteau +cowfishes cowfish +coxae coxa +cramboes crambo +crania cranium +crases crasis +crawfishes crawfish +crayfishes crayfish +credenda credendum +crematoria crematorium +crescendi crescendo +cribella cribellum +crises crisis +crissa crissum +cristae crista +criteria criterion +cruces crux +crura crus +crusadoes crusado +cruzadoes cruzado +crying cry +cryings cry +ctenidia ctenidium +cubicula cubiculum +culices culex +culpae culpa +culs-de-sac cul-de-sac +culti cultus +cumuli cumulus +cumulonimbi cumulonimbus +cumulostrati cumulostratus +curiae curia +curricula curriculum +custodes custos +cutes cutis +cuticulae cuticula +cuttlefishes cuttlefish +cyclopes cyclops +cycloses cyclosis +cylices cylix +cylikes cylix +cymae cyma +cymatia cymatium +cypselae cypsela +cysticerci cysticercus +dadoes dado +dagoes dago +damselfishes damselfish +data datum +daughters-in-law daughter-in-law +daymio daimio +daymios daimio +dealfishes dealfish +decemviri decemvir +decennia decennium +deciduae decidua +definienda definiendum +definientia definiens +delphinia delphinium +denarii denarius +dentalia dentalium +dermatoses dermatosis +desiderata desideratum +desperadoes desperado +devilfishes devilfish +diaereses diaeresis +diaerses diaeresis +diagnoses diagnosis +dialyses dialysis +diaphyses diaphysis +diapophyses diapophysis +diarthroses diarthrosis +diastalses diastalsis +diastases diastasis +diastemata diastema +diathses diathesis +diazoes diazo +dibbukkim dibbuk +dichasia dichasium +dicta dictum +didoes dido +diereses dieresis +dieses diesis +differentiae differentia +dilettanti dilettante +diluvia diluvium +dingoes dingo +diplococci diplococcus +directors-general director-general +disci discus +discoboli discobolos discobolus +dive diva +diverticula diverticulum +divertimenti divertimento +djinn djinni djinny +dodoes dodo +dogfishes dogfish +dogmata dogma +dogteeth dogtooth +dollarfishes dollarfish +domatia domatium +dominoes domino +dormice dormouse +dorsa dorsum +drachmae drachma +drawknives drawknife +drosophilae drosophila +drumfishes drumfish +dryades dryad +dui duo +duona duodenum +duonas duodenum +dupondii dupondius +duumviri duumvir +dwarves dwarf +dybbukkim dybbuk +ecchymoses ecchymosis +ecclesiae ecclesia +ecdyses ecdysis +echidnae echidna +echini echinus +echinococci echinococcus +echoes echo +ectozoa ectozoan +eddoes eddo +edemata edema +effluvia effluvium +eidola eidolon +eisegeses eisegesis +eisteddfodau eisteddfod +elenchi elenchus +ellipses ellipsis +eluvia eluvium +elves elf +elytra elytron elytrum +embargoes embargo +emboli embolus +emphases emphasis +emporia emporium +enarthroses enarthrosis +encephala encephalon +encephalitides encephalitis +encephalomata encephaloma +enchiridia enchiridion +enchondromata enchondroma +encomia encomium +endamebae endameba +endamoebae endamoeba +endocardia endocardium +endocrania endocranium +endometria endometrium +endostea endosteum +endostoses endostosis +endothecia endothecium +endothelia endothelium +endotheliomata endothelioma +endozoa endozoan +enemata enema +enneahedra enneahedron +entamebae entameba +entamoebae entamoeba +entases entasis +entera enteron +entia ens +entozoa entozoan entozoon +epencephala epencephalon +epentheses epenthesis +epexegeses epexegesis +ephemera ephemeron +ephemerae ephemera +ephemerides ephemeris +ephori ephor +epicalyces epicalyx +epicanthi epicanthus +epicardia epicardium +epicedia epicedium +epicleses epiclesis +epididymides epididymis +epigastria epigastrium +epiglottides epiglottis +epimysia epimysium +epiphenomena epiphenomenon +epiphyses epiphysis +episterna episternum +epithalamia epithalamion epithalamium +epithelia epithelium +epitheliomata epithelioma +epizoa epizoan epizoon +epyllia epyllion +equilibria equilibrium +equiseta equisetum +eringoes eringo +errata erratum +eryngoes eryngo +esophagi esophagus +etyma etymon +eucalypti eucalyptus +eupatridae eupatrid +euripi euripus +exanthemata exanthema +executrices executrix +exegeses exegesis +exempla exemplum +exordia exordium +exostoses exostosis +extrema extremum +eyeteeth eyetooth +fabliaux fabliau +faciae facia +faculae facula +faeroese faeroese +fallfishes fallfish +famuli famulus +farmers-general farmer-general +faroese faroese +farragoes farrago +fasciae fascia +fasciculi fasciculus +fathers-in-law father-in-law +fatsoes fatso +faunae fauna +feculae fecula +fedayeen fedayee +feet foot +fellaheen fellah +fellahin fellah +felones_de_se felo_de_se +felos_de_se felo_de_se +femora femur +fenestellae fenestella +fenestrae fenestra +feriae feria +fermate fermata +ferulae ferula +festschriften festschrift +fetiales fetial +fezzes fez +fiascoes fiasco +fibrillae fibrilla +fibromata fibroma +fibulae fibula +ficoes fico +fideicommissa fideicommissum +fieldmice fieldmouse +figs. fig. +fila filum +filariiae filaria +filefishes filefish +fimbriae fimbria +fishes fish +fishwives fishwife +fistulae fistula +flabella flabellum +flagella flagellum +flagstaves flagstaff +flambeaux flambeau +flamines flamen +flamingoes flamingo +flatfeet flatfoot +flatfishes flatfish +fleurs-de-lis fleur-de-lis +fleurs-de-lys fleur-de-lys +flights_of_stairs flight_of_stairs +flittermice flittermouse +flocci floccus +flocculi flocculus +florae flora +floreant. floreat +florilegia florilegium +flowers-de-luce flower-de-luce +flyleaves flyleaf +foci focus +folia folium +fora forum +foramina foramen +forceps forceps +forefeet forefoot +foreteeth foretooth +formicaria formicarium +formulae formula +fornices fornix +fortes fortis +fossae fossa +foveae fovea +foveolae foveola +fractocumuli fractocumulus +fractostrati fractostratus +fraena fraenum +frauen frau +frena frenum +frenula frenulum +frescoes fresco +fricandeaux fricandeau +fricandoes fricando +frijoles frijol +frogfishes frogfish +frontes frons +frusta frustum +fuci fucus +fulcra fulcrum +fumatoria fumatorium +fundi fundus +fungi fungus +funiculi funiculus +furcula furculum +furculae furcula +furfures furfur +galeae galea +gambadoes gambado +gametangia gametangium +gametoecia gametoecium +gammadia gammadion +ganglia ganglion +garfishes garfish +gas gas +gasses gas +gastrulae gastrula +gateaux gateau +gazeboes gazebo +geckoes gecko +geese goose +gelsemia gelsemium +gemboks gemsbok +gembucks gemsbuck +gemeinschaften gemeinschaft +gemmae gemma +genera genus +generatrices generatrix +geneses genesis +genii genius +gentes gens +gentlemen-at-arms gentleman-at-arms +gentlemen-farmers gentleman-farmer +genua genu +genus genus +germina germen +gesellschaften gesellschaft +gestalten gestalt +ghettoes ghetto +gingivae gingiva +gingkoes gingko +ginglymi ginglymus +ginkgoes ginkgo +gippoes gippo +glabellae glabella +gladioli gladiolus +glandes glans +gliomata glioma +glissandi glissando +globefishes globefish +globigerinae globigerina +glochidcia glochidium +glochidia glochidium +glomeruli glomerulus +glossae glossa +glottides glottis +glutaei glutaeus +glutei gluteus +gnoses gnosis +goatfishes goatfish +goboes gobo +godchildren godchild +goes go +goings-over going-over +goldfishes goldfish +gomphoses gomphosis +gonia gonion +gonidia gonidium +gonococci gonococcus +goodwives goodwife +goosefishes goosefish +gorgoneia gorgoneion +gospopoda gospodin +governors_general governor_general +goyim goy +grafen graf +graffiti graffito +grandchildren grandchild +grants-in-aid grant-in-aid +granulomata granuloma +gravamina gravamen +grig-gris gris-gris +groszy grosz +grottoes grotto +guilder guilde +guilders guilde guilder +guitarfishes guitarfish +gummata gumma +gurnard gurnar +gurnards gurnar gurnard +guttae gutta +gymnasia gymnasium +gynaecea gynaeceum +gynaecia gynaecium +gynecea gynecium +gynecia gynecium +gynoecea gynoecium +gynoecia gynoecium +gyri gyrus +hadarim heder +hadjes hadj +haematolyses haematolysis +haematomata haematoma +haematozoa haematozoon +haemodialyses haemodialysis +haemolyses haemolysis +haemoptyses haemoptysis +haeredes haeres +haftaroth haftarah +hagfishes hagfish +haggadas haggada haggadah +haggadoth haggada +hajjes hajj +haleru haler +hallot hallah +halloth hallah +halluces hallux +haloes halo +halteres halter haltere +halves half +hamuli hamulus +hangers-on hanger-on +haphtaroth haphtarah +haredim haredi +haruspices haruspex +hasidim hasid +hassidim hassid +haustella haustellum +haustoria haustorium +hazzanim hazzan +hectocotyli hectocotylus +heirs-at-law heir-at-law +heldentenore heldentenor +helices helix +heliozoa heliozoan +hematolyses hematolysis +hematomata hematoma +hematozoa hematozoon +hemelytra hemelytron +hemielytra hemielytron +hemodialyses hemodialysis +hemolyses hemolysis +hemoptyses hemoptysis +hendecahedra hendecahedron +hens-and-chickens hen-and-chickens +heraclidae heraclid +heraklidae heraklid +herbaria herbarium +hermae herm herma +hermai herma +herniae hernia +heroes hero +herren herr +hetaerae hetaera +hetairai hetaira +hibernacula hibernaculum +hieracosphinges hieracosphinx +hila hilum +hili hilus +himatia himation +hippocampi hippocampus +hippopotami hippopotamus +his his +hoboes hobo +hogfishes hogfish +homunculi homunculus +honoraria honorarium +hooves hoof +horologia horologium +housewives housewife +humeri humerus +hydrae hydra +hydromedusae hydromedusa +hydrozoa hydrozoan +hymenoptera hymenopteran +hynia hymenium +hyniums hymenium +hypanthia hypanthium +hyperostoses hyperostosis +hyphae hypha +hypnoses hypnosis +hypochondria hypochondrium +hypogastria hypogastrium +hypogea hypogeum +hypophyses hypophysis +hypostases hypostasis +hypothalami hypothalamus +hypotheses hypothesis +hyraces hyrax +iambi iamb +ibices ibex +ibo igbo +ichthyosauri ichthyosaurus +ichthyosauruses ichthyosaur ichthyosaurus +iconostases iconostas iconostasis +icosahedra icosahedron +ideata ideatum +igorrorote igorrote +ilia ilium +imagines imago +imagoes imago +imperia imperium +impies impi +incubi incubus +incudes incus +indices index +indigoes indigo +indumenta indumentum +indusia indusium +infundibula infundibulum +ingushes ingush +innuendoes innuendo +inocula inoculum +inquisitors-general inquisitor-general +insectaria insectarium +insulae insula +intagli intaglio +interleaves interleaf +intermezzi intermezzo +interreges interrex +interregna interregnum +intimae intima +involucella involucellum +involucra involucre +involucra involucrum +irides iris +irs irs +is is +ischia ischium +isthmi isthmus +jackeroos jackaroo jackeroo +jackfishes jackfish +jackknives jackknife +jacks-in-the-box jack-in-the-box +jambeaux jambeau +jellyfishes jellyfish +jewelfishes jewelfish +jewfishes jewfish +jingoes jingo +jinn jinni +joes jo joe +judge_advocates_general judge_advocate_general +jura jus +kaddishim kaddish +kalmuck kalmuc +kalmucks kalmuc kalmuck +katabases katabasis +keeshonden keeshond +kibbutzim kibbutz +killifishes killifish +kingfishes kingfish +kings-of-arms king-of-arms +knights_bachelor knight_bachelor +knights_bachelors knight_bachelor +knights_templar knight_templar +knights_templars knight_templar +knives knife +kohlrabies kohlrabi +kronen krone +kroner krone +kronur krona +krooni kroon +kylikes kylix +labara labarum +labella labellum +labia labium +labra labrum +lactobacilli lactobacillus +lacunae lacuna +lacunaria lacunar +ladies-in-waiting lady-in-waiting +lamellae lamella +lamiae lamia +laminae lamina +lapilli lapillus +lapithae lapith +larvae larva +larynges larynx +lassoes lasso +lati lat +latices latex +latifundia latifundium +latu lat +lavaboes lavabo +leaves leaf leave +lecythi lecythus +leges lex +lei leu +lemmata lemma +lemnisci lemniscus +lenes lenis +lentigines lentigo +leonides leonid +lepidoptera lepidopteran +leprosaria leprosarium +lepta lepton +leptocephali leptocephalus +leucocytozoa leucocytozoan +leva lev +librae libra +libretti libretto +lice louse +lieder lied +ligulae ligula +limbi limbus +limina limen +limites limes +limuli limulus +lingoes lingo +linguae lingua +linguae_francae lingua_franca +lionfishes lionfish +lipomata lipoma +lire lira +liriodendra liriodendron +listente sente +litai lit litas +litu litas +lives life +lixivia lixivium +loaves loaf +loci locus +loculi loculus +loggie loggia +logia logion +lomenta lomentum +longobardi longobard +loricae lorica +luba luba +lubritoria lubritorium +lumbus lumbi +lumina lumen +lumpfishes lumpfish +lungfishes lungfish +lunulae lunula +lures lur lure +lustra lustre +lyings-in lying-in +lymphangitides lymphangitis +lymphomata lymphoma +lymphopoieses lymphopoiesis +lyses lysis +lyttae lytta +maare maar +macaronies macaroni +maccaronies maccaroni +machzorim machzor +macronuclei macronucleus +macrosporangia macrosporangium +maculae macula +madornos madrono +maestri maestro +mafiosi mafioso +magi magus +magmata magma +magnificoes magnifico +mahzorim mahzor +major-axes major_axis +major_axes major_axis +makuta likuta +mallei malleus +malleoli malleolus +maloti loti +mamillae mamilla +mammae mamma +mammillae mammilla +mandingoes mandingo +mangoes mango +manifestoes manifesto +manteaux manteau +mantes mantis +manubria manubrium +marchese marchesa +marchesi marchese +maremme maremma +markkaa markka +marsupia marsupium +marvels-of-peru marvel-of-peru +mass_media mass_medium +masses mass masse +masters-at-arms master-at-arms +matrices matrix +matzoth matzo +mausolea mausoleum +maxillae maxilla +maxima maximum +media medium +mediae media +mediastina mediastinum +medullae medulla +medullae_oblongatae medulla_oblongata +medusae medusa +megara megaron +megasporangia megasporangium +megilloth megillah +meioses meiosis +melanomata melanoma +melismata melisma +mementoes memento +memoranda memorandum +men man +men-at-arms man-at-arms +men-o'-war man-of-war +men-of-war man-of-war +men_of_letters man_of_letters +menisci meniscus +menservants manservant +menstrua menstruum +mesdames madame +mesdemoiselles mademoiselle +mesentera mesenteron +mesothoraces mesothorax +messeigneurs monseigneur +messieurs monsieur +mestizoes mestizo +metacarpi metacarpus +metamorphoses metamorphosis +metanephroi metanephros +metastases metastasis +metatarsi metatarsus +metatheses metathesis +metathoraces metathorax +metazoa metazoan +metempsychoses metempsychosis +metencephala metencephalon +mezuzoth mezuzah +miasmata miasma +mice mouse +microanalyses microanalysis +micrococci micrococcus +micronuclei micronucleus +microsporangia microsporangium +midrashim midrash +midwives midwife +milia milium +milieux milieu +militated_against militate_against +milkfishes milkfish +millennia millennium +minae mina +minima minimum +ministeria ministerium +minutiae minutia +minyanim minyan +mioses miosis +miracidia miracidium +miri mir +mishnayoth mishna mishnah +mitochondria mitochondrion +mitzvoth mitzvah +modioli modiolus +moduli modulus +momenta momentum +moments_of_truth moment_of_truth +momi momus +monades monad monas +monkfishes monkfish +monochasia monochasium +monopodia monopodium +monoptera monopteron +monopteroi monopteros +monsignori monsignor +monts-de-piete mont-de-piete +mooncalves mooncalf +moonfishes moonfish +morae mora +moratoria moratorium +morceaux morceau +morescoes moresco +moriscoes morisco +morphallaxes morphallaxis +morphoses morphosis +morulae morula +mosasauri mosasaurus +moshavim moshav +moslim moslem +moslims moslem +mosquitoes mosquito +mothers-in-law mother-in-law +mothers_superior mother_superior +mottoes motto +movers_and_shakers mover_and_shaker +mucosae mucosa +mucrones mucro +mudejares mudejar +mudfishes mudfish +mulattoes mulatto +multiparae multipara +murices murex +muskallunge muskellunge +mycelia mycelium +mycetomata mycetoma +mycobacteria mycobacterium +mycorrhizae mycorrhiza +myelencephala myelencephalon +myiases myiasis +myocardia myocardium +myofibrillae myofibrilla +myomata myoma +myoses myosis +myrmidones myrmidon +mythoi mythos +myxomata myxoma +naevi naevus +naiades naiad +naoi naos +narcissi narcissus +nares naris +nasopharynges nasopharynx +natatoria natatorium +naumachiae naumachia +nauplii nauplius +nautili nautilus +navahoes navaho +navajoes navajo +nebulae nebula +necropoleis necropolis +needlefishes needlefish +negrilloes negrillo +negritoes negrito +negroes negro +nemeses nemesis +nephridia nephridium +nereides nereid +neurohypophyses neurohypophysis +neuromata neuroma +neuroptera neuropteron +neuroses neurosis +nevi nevus +nibelungen nibelung +nidi nidus +nielli niello +nilgai nilgai +nimbi nimbus +nimbostrati nimbostratus +noctilucae noctiluca +nodi nodus +noes no +nomina nomen +nota notum +noumena noumenon +novae nova +novelle novella +novenae novena +nubeculae nubecula +nucelli nucellus +nuchae nucha +nuclei nucleus +nucleoli nucleolus +nulliparae nullipara +numbfishes numbfish +numina numen +nymphae nympha +oarfishes oarfish +oases oasis +obeli obelus +objets_d'art objet_d'art +obligati obligato +oboli obolus +occipita occiput +oceanaria oceanarium +oceanides oceanid +ocelli ocellus +ochreae ochrea +ocreae ochrea ocrea +octahedra octahedron +octopi octopus +oculi oculus +odea odeum +oedemata edema oedema +oesophagi esophagus oesophagus +oldwives oldwife +olea oleum +omasa omasum +omayyades omayyad +omenta omentum +ommatidia ommatidium +ommiades ommiad +onagri onager +oogonia oogonium +oothecae ootheca +operas_seria opera_seria +opercula operculum +optima optimum +ora os +organa organon organum +organums organa organum +orthoptera orthopteron +osar os +oscula osculum +ossa os +osteomata osteoma +ostia ostium +ottomans othman ottoman +ova ovum +ovoli ovolo +ovotestes ovotestis +oxen ox +oxymora oxymoron +paddlefishes paddlefish +paise paisa +paleae palea +palestrae palestra +palingeneses palingenesis +pallia pallium +palmettoes palmetto +palpi palpus +pancratia pancratium +panettoni panettone +paparazzi paparazzo +paperknives paperknife +papillae papilla +papillomata papilloma +pappi pappus +papulae papula +papyri papyrus +parabases parabasis +paraleipses paraleipsis paralipsis +paralyses paralysis +paramecia paramecium +paramenta parament +paraphyses paraphysis +parapodia parapodium +parapraxes parapraxis +paraselenae paraselene +parashoth parashah +parasyntheta parasyntheton +parazoa parazoan +parentheses parenthesis +parerga parergon +parhelia parhelion +parietes paries +paris-mutuels pari-mutuel +parrotfishes parrotfish +parulides parulis +pasos_dobles paso_doble +passers-by passer-by +pastorali pastorale +patagia patagium +patellae patella +patinae patina +patresfamilias paterfamilias +pease pea +peccadilloes peccadillo +pectines pecten +pedaloes pedalo +pedes pes +pekingese pekinese +pelves pelvis +pence penny +penes penis +penetralium penetralia +penicillia penicillium +penknives penknife +pennae penna +pennia penni +pentahedra pentahedron +pentimenti pentimento +penumbrae penumbra +pepla peplum +pericardia pericardium +perichondria perichondrium +pericrania pericranium +peridia peridium +perigonia perigonium +perihelia perihelion +perinea perineum +perinephria perinephrium +perionychia perionychium +periostea periosteum +periphrases periphrasis +peristalses peristalsis +perithecia perithecium +peritonea peritoneum +personae persona +petechiae petechia +pfennige pfennig +phalanges phalange phalanx +phalli phallus +pharynges pharynx +phenomena phenomenon +phi-phenomena phi-phenomenon +philodendra philodendron +phlyctenae phlyctaena phlyctena +phyla phylum +phylae phyle +phyllotaxes phyllotaxis +phylloxerae phylloxera +phylogeneses phylogenesis +pieds-a-terre pied-a-terre +pigfishes pigfish +pilea pileum +pilei pileus +pineta pinetum +pinfishes pinfish +pinkoes pinko +pinnae pinna +pinnulae pinnula +pipefishes pipefish +pirogi pirog +piscinae piscina +pithecanthropi pithecanthropus +pithoi pithos +placeboes placebo +placentae placenta +planetaria planetarium +planulae planula +plasmodesmata plasmodesma +plasmodia plasmodium +plateaux plateau +plectra plectron plectrum +plena plenum +pleura pleuron +pleurae pleura +plicae plica +ploughmen ploughman plowman +pneumobacilli pneumobacillus +pneumococci pneumococcus +pocketknives pocketknife +podetia podetium +podia podium +poleis polis +pollices pollex +pollinia pollinium +polychasia polychasium +polyhedra polyhedron +polyparia polyparium +polypi polypus +polyzoa polyzoan +polyzoaria polyzoarium +pontes pons +pontifices pontifex +portamenti portamento +porticoes portico +portmanteaux portmanteau +postliminia postliminium +potatoes potato +praenomina praenomen +praxes praxis +predelle predella +premaxillae premaxilla +prenomina prenomen +prese presa +primi primo +primigravidae primigravida +primiparae primipara +primordia primordium +principia principium +proboscides proboscis +proces-verbaux proces-verbal +proglottides proglottid proglottis +prognoses prognosis +prolegomena prolegomenon +prolepses prolepsis +promycelia promycelium +pronephra pronephros +pronephroi pronephros +pronuclei pronucleus +propositi propositus +proptoses proptosis +propyla propylon +propylaea propylaeum +proscenia proscenium +prosencephala prosencephalon +prostheses prosthesis +prostomia prostomium +protases protasis +prothalamia prothalamion prothalamium +prothalli prothallus +prothallia prothallium +prothoraces prothorax +protonemata protonema +protozoa protozoan +proventriculi proventriculus +provisoes proviso +prytanea prytaneum +psalteria psalterium +pseudopodia pseudopodium +psychoneuroses psychoneurosis +psychoses psychosis +pterygia pterygium +pterylae pteryla +ptoses ptosis +pubes pubis +pudenda pudendum +puli pul +pulvilli pulvillus +pulvini pulvinus +punchinelloes punchinello +pupae pupa +puparia puparium +putamina putamen +putti putto +pycnidia pycnidium +pygidia pygidium +pylori pylorus +pyxides pyxis +pyxidia pyxidium +qaddishim qaddish +quadrennia quadrennium +quadrigae quadriga +qualia quale +quanta quantum +quarterstaves quarterstaff +quezales quezal +quinquennia quinquennium +quizzes quiz +rabatos rabato rebato +rabbitfishes rabbitfish +rachides rhachis +radices radix +radii radius +radulae radula +ramenta ramentum +rami ramus +ranulae ranula +ranunculi ranunculus +raphae raphe +raphides raphide raphis +ratfishes ratfish +reales real +rearmice rearmouse +recta rectum +recti rectus +rectrices rectrix +redfishes redfish +rediae redia +referenda referendum +refugia refugium +reguli regulus +reis real +relata relatum +remiges remex +reremice rearmouse reremouse +reseaux reseau +residua residuum +responsa responsum +retia rete +retiarii retiarius +reticula reticulum +retinacula retinaculum +retinae retina +rhabdomyomata rhabdomyoma +rhachides rhachis +rhachises rachis rhachis +rhinencephala rhinencephalon +rhizobia rhizobium +rhombi rhombus +rhonchi rhonchus +rhyta rhyton +ribbonfishes ribbonfish +ricercacari ricercare +ricercari ricercare +rickettsiae rickettsia +rilievi rilievo +rimae rima +robes-de-chambre robe-de-chambre +rockfishes rockfish +roma rom +romans-fleuves roman-fleuve +rondeaux rondeau +rosaria rosarium +rosefishes rosefish +rostella rostellum +rostra rostrum +rouleaux rouleau +rugae ruga +rumina rumen +runners-up runner-up +sacra sacrum +sacraria sacrarium +saguaros saguaro sahuaro +sailfishes sailfish +salespeople salesperson +salmonellae salmonella +salpae salpa +salpinges salpinx +saltarelli saltarello +salvoes salvo +sancta sanctum +sanitaria sanitarium +santimi santims +saphenae saphena +sarcophagi sarcophagus +sartorii sartorius +sassanidae sassanid +sawfishes sawfish +scaldfishes scaldfish +scaleni scalenus +scapulae scapula +scarabaei scarabaeus +scarves scarf +schatchonim schatchen shadchan +schemata schema +scherzandi scherzando +scherzi scherzo +schmoes schmo +scholia scholium +schuln schul +schutzstaffeln schutzstaffel +scirrhi scirrhus +scleromata scleroma +scleroses sclerosis +sclerotia sclerotium +scoleces scolex +scolices scolex +scopulae scopula +scoriae scoria +scotomata scotoma +scriptoria scriptorium +scrota scrotum +scudi scudo +scuta scutum +scutella scutellum +scyphi scyphus +scyphistomae scyphistoma +scyphozoa scyphozoan +secondi secondo +secretaries-general secretary-general +segni segno +seleucidae seleucid +selves self +senores senor +sensilla sensillum +senti sent +senussis senusi senussi +separatrices separatrix +sephardim sephardi +septa septum +septaria septarium +septennia septennium +sequelae sequela +sequestra sequestrum +sera serum +seraphim seraph +sestertia sestertium +setae seta +sgraffiti sgraffito +shabbasim shabbas +shabbatim shabbat +shackoes shacko +shadchanim shadchan +shadchans schatchen shadchan +shakoes shako +shammosim shammas shammes +sheatfishes sheatfish +sheaves sheaf +shellfishes shellfish +shelves shelf +shinleaves shinleaf +shittim shittah +shmoes shmo +shofroth shofar shophar +shophroth shophar +shrewmice shrewmouse +shuln shul +siddurim siddur +sigloi siglos +signore signora +signori signior signore +signorine signorina +siliquae siliqua +silvae silva +silverfishes silverfish +simulacra simulacrum +sincipita sinciput +sinfonie sinfonia +sisters-in-law sister-in-law +sistra sistrum +situlae situla +smalti smalto +snaggleteeth snaggletooth +snailfishes snailfish +snipefishes snipefish +socmen socman sokeman +sola solum +solaria solarium +solatia solatium +soldi soldo +soles sol sole +solfeggi solfeggio +soli solo +solidi solidus +somata soma +sons-in-law son-in-law +soprani soprano +sordini sordino +sori sorus +soroses sorosis +sovkhozy sovkhoz +spadefishes spadefish +spadices spadix +spearfishes spearfish +spectra spectrum +specula speculum +spermatia spermatium +spermatogonia spermatogonium +spermatozoa spermatozoon +spermogonia spermogonium +sphinges sphinx +spicae spica +spicula spiculum +spirilla spirillum +splayfeet splayfoot +splenii splenius +sporangia sporangium +sporogonia sporogonium +sporozoa sporozoan +springhase springhaas +spumoni spumone +sputa sputum +squamae squama +squashes squash +squillae squilla +squirrelfishes squirrelfish +squizzes squiz +stadia stadium +stamina stamen +staminodia staminodium +stapedes stapes +staphylococci staphylococcus +starfishes starfish +startsy starets +stelae stele +stemmata stemma +stenoses stenosis +stepchildren stepchild +sterna sternum +stigmata stigma +stimuli stimulus +stipites stipes +stirpes stirps +stoae stoa +stockfishes stockfish +stomata stoma +stomodaea stomodaeum +stomodea stomodeum +stonefishes stonefish +stotinki stotinka +stotkini stotinka +strappadoes strappado +strata stratum +strati stratus +stratocumuli stratocumulus +street_children street_child +streptococci streptococcus +stretti stretto +striae stria +strobili strobilus +stromata stroma +strumae struma +stuccoes stucco +styli stylus +stylopes stylops +stylopodia stylopodium +subcortices subcortex +subdeliria subdelirium +subgenera subgenus +subindices subindex +submucosae submucosa +subphyla subphylum +substrasta substratum +succedanea succedaneum +succubi succubus +suckerfishes suckerfish +suckfishes suckfish +sudaria sudarium +sudatoria sudatorium +sulci sulcus +summae summa +sunfishes sunfish +supercargoes supercargo +superheroes superhero +supernovae supernova +superstrata superstratum +surgeonfishes surgeonfish +swamies swami +sweetiewives sweetiewife +swellfishes swellfish +swordfishes swordfish +syconia syconium +syllabi syllabus +syllepses syllepsis +symphyses symphysis +sympodia sympodium +symposia symposium +synapses synapsis +synarthroses synarthrosis +synclinoria synclinorium +syncytia syncytium +syndesmoses syndesmosis +synopses synopsis +syntagmata syntagma +syntheses synthesis +syphilomata syphiloma +syringes syrinx +syssarcoses syssarcosis +tableaux tableau +taeniae taenia tenia +tali talus +tallaisim tallith +tallithes tallith +tallitoth tallith +tapeta tapetum +tarantulae tarantula +tarsi tarsus +tarsometatarsi tarsometatarsus +taxa taxon +taxes tax taxis +taxies taxi +tectrices tectrix +teeth tooth +tegmina tegmen +telae tela +telamones telamon +telangiectases telangiectasia telangiectasis +telia telium +tempi tempo +tenacula tenaculum +tenderfeet tenderfoot +teniae tenia +tenues tenuis +teraphim teraph +terata teras +teredines teredo +terga tergum +termini terminus +terraria terrarium +terzetti terzetto +tesserae tessera +testae testa +testes testis +testudines testudo +tetrahedra tetrahedron +tetraskelia tetraskelion +thalamencephala thalamencephalon +thalami thalamus +thalli thallus +theatres-in-the-round theatre-in-the-round +thecae theca +therses thyrse +thesauri thesaurus +theses thesis +thickleaves thickleaf +thieves thief +tholoi tholos +thoraces thorax +thrombi thrombus +thymi thymus +thyrsi thyrsus +tibiae tibia +tilefishes tilefish +tintinnabula tintinnabulum +titmice titmouse +toadfishes toadfish +tobaccoes tobacco +tomatoes tomato +tomenta tomentum +tondi tondo +tonneaux tonneau +tophi tophus +topoi topos +tori torus +tornadoes tornado +torpedoes torpedo +torsi torso +touracos touraco turaco +trabeculae trabecula +tracheae trachea +traditores traditor +tragi tragus +trapezia trapezium +trapezohedra trapezohedron +traumata trauma +treponemata treponema +trichinae trichina +triclinia triclinium +triennia triennium +triforia triforium +triggerfishes triggerfish +trihedra trihedron +triskelia triskelion +trisoctahedra trisoctahedron +triumviri triumvir +trivia trivium +trochleae trochlea +tropaeola tropaeolum +trous-de-loup trou-de-loup +trousseaux trousseau +trunkfishes trunkfish +trymata tryma +tubae tuba +turves turf +tympana tympanum +tyros tiro tyro +ubermenschen ubermensch +uglies ugli +uigurs uighur +ulnae ulna +ultimata ultimatum +umbilici umbilicus +umbones umbo +umbrae umbra +unci uncus +uncidia uredium +uredines uredo +uredinia uredinium +uredosori uredosorus +urethrae urethra +urinalyses urinalysis +uteri uterus +utriculi utriculus +uvulae uvula +vacua vacuum +vagi vagus vagus +vaginae vagina +valleculae vallecula +vaporetti vaporetto +varices varix +vasa vas +vascula vasculum +vela velum +velamina velamen +velaria velarium +venae vena +venae_cavae vena_cava +ventriculi ventriculus +vermes vermis +verrucae verruca +vertebrae vertebra +vertices vertex +vertigines vertigo +vertigoes vertigo +vesicae vesica +vetoes veto +vexilla vexillum +viatica viaticum +viatores viator +vibracula vibraculum +vibrissae vibrissa +vice-chairman vice-chairman +villi villus +vimina vimen +vincula vinculum +viragoes virago +vires vis +virtuosi virtuoso +vitae vita +vitelli vitellus +vittae vitta +vivaria vivarium +voces vox +volcanoes volcano +volkslieder volkslied +volte volta +volvae volva +vorticellae vorticella +vortices vortex +vulvae vulva +wagons-lits wagon-lit +wahhabis wahabi wahhabi +wanderjahre wanderjahr +weakfishes weakfish +werewolves werewolf +wharves wharf +whippers-in whipper-in +whitefishes whitefish +wives wife +wolffishes wolffish +wolves wolf +woodlice woodlouse +wreckfishes wreckfish +wunderkinder wunderkind +xiphisterna xiphisternum +yeshivahs yeshiva +yeshivoth yeshiva +yogin yogi +yourselves yourself +zamindaris zamindari zemindari +zecchini zecchino +zeroes zero +zoa zoon +zoaeae zoaea zoea +zoeae zoea +zoeas zoaea +zoonoses zoonosis +zoosporangia zoosporangium diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/verb.exc b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/verb.exc new file mode 100644 index 0000000..e486edf --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0-Exceptions/verb.exc @@ -0,0 +1,2401 @@ +abetted abet +abetting abet +abhorred abhor +abhorring abhor +abode abide +abought aby +about-shipped about-ship +about-shipping about-ship +abutted abut +abutting abut +abye aby +accompanied accompany +acetified acetify +acidified acidify +acquitted acquit +acquitting acquit +ad-libbed ad-lib +ad-libbing ad-lib +addrest address +admitted admit +admitting admit +aerified aerify +air-dried air-dry +airdropped airdrop +airdropping airdrop +alkalified alkalify +allied ally +allotted allot +allotting allot +allowed_for allow_for +allowing_for allow_for +allows_for allow_for +am be +ammonified ammonify +amnestied amnesty +amplified amplify +anglified anglify +annulled annul +annulling annul +appalled appal appall +appalling appal appall +applied apply +arcked arc +arcking arc +are be +argufied argufy +arisen arise +arose arise +ate eat +atrophied atrophy +averred aver +averring aver +awoke awake +awoken awake +babied baby +baby-sat baby-sit +baby-sitting baby-sit +back-pedalled back-pedal +back-pedalling back-pedal +backbit backbite +backbitten backbite +backslid backslide +backslidden backslide +bade bid +bagged bag +bagging bag +ballyragged ballyrag +ballyragging ballyrag +bandied bandy +banned ban +banning ban +barred bar +barrelled barrel +barrelling barrel +barring bar +basified basify +batted bat +batting bat +bayonetted bayonet +bayonetting bayonet +beaten beat +beatified beatify +beautified beautify +became become +became_known become_known +becomes_known become_known +bed bed +bedded bed +bedding bed +bedevilled bedevil +bedevilling bedevil +bedimmed bedim +bedimming bedim +been be +befallen befall +befell befall +befitted befit +befitting befit +befogged befog +befogging befog +began begin +begat beget +begetting beget +begged beg +begging beg +beginning begin +begirt begird +begot beget +begotten beget +begun begin +beheld behold +beholden behold +bejewelled bejewel +bejewelling bejewel +bellied belly +belly-flopped belly-flop +belly-flopping belly-flop +belying belie +benefitted benefit +benefitting benefit +benempt bename +bent bend +berried berry +besetting beset +besought beseech +bespoke bespeak +bespoken bespeak +bestirred bestir +bestirring bestir +bestrewn bestrew +bestrid bestride +bestridden bestride +bestrode bestride +betaken betake +bethought bethink +betook betake +betted bet +betting bet +bevelled bevel +bevelling bevel +biassed bias +biassing bias +bidden bid +bidding bid +bing bing +binned bin +binning bin +bird-dogged bird-dog +bird-dogging bird-dog +bit bite +bitted bit +bitten bite +bitting bit +bivouacked bivouac +bivouacking bivouac +blabbed blab +blabbing blab +blackberried blackberry +blacklegged blackleg +blacklegging blackleg +blatted blat +blatting blat +bled bleed +blest bless +blew blow +blew_one's_nose blow_one's_nose +blipped blip +blipping blip +blobbed blob +blobbing blob +bloodied bloody +blotted blot +blotting blot +blowing_one's_nose blow_one's_nose +blown blow +blows_one's_nose blow_one's_nose +blubbed blub +blubbing blub +blue-pencilled blue-pencil +blue-pencilling blue-pencil +blurred blur +blurring blur +bobbed bob +bobbing bob +bodied body +bogged-down bog-down +bogged_down bog_down +bogging-down bog-down +bogging_down bog_down +bogs-down bog-down +bogs_down bog_down +booby-trapped booby-trap +booby-trapping booby-trap +bootlegged bootleg +bootlegging bootleg +bopped bop +bopping bop +bore bear +born bear +borne bear +bottle-fed bottle-feed +bought buy +bound bind +bragged brag +bragging brag +breast-fed breast-feed +bred breed +brevetted brevet +brevetting brevet +brimmed brim +brimming brim +broke break +broken break +brought bring +browbeaten browbeat +brutified brutify +budded bud +budding bud +bugged bug +bugging bug +built build +bulldogging bulldog +bullied bully +bullshitted bullshit +bullshitting bullshit +bullwhipped bullwhip +bullwhipping bullwhip +bullyragged bullyrag +bullyragging bullyrag +bummed bum +bumming bum +buried bury +burnt burn +burred bur +burring bur +bushelled bushel +bushelling bushel +busied busy +bypast bypass +caballed cabal +caballing cabal +caddied caddie caddy +caddies caddie caddy +caddying caddie caddy +calcified calcify +came come +canalled canal +canalling canal +cancelled cancel +cancelling cancel +candied candy +canned can +canning can +canopied canopy +capped cap +capping cap +carburetted carburet +carburetting carburet +carillonned carillon +carillonning carillon +carnied carny +carnified carnify +carolled carol +carolling carol +carried carry +casefied casefy +catnapped catnap +catnapping catnap +catted cat +catting cat +caught catch +cavilled cavil +cavilling cavil +certified certify +channelled channel +channelling channel +chapped chap +chapping chap +charred char +charring char +chatted chat +chatting chat +chevied chivy +chevies chivy +chevying chivy +chid chide +chidden chide +chinned chin +chinning chin +chipped chip +chipping chip +chiselled chisel +chiselling chisel +chitchatted chitchat +chitchatting chitchat +chivied chivy +chivved chiv +chivvied chivy +chivvies chivy +chivving chiv +chivvying chivy +chondrified chondrify +chopped chop +chopping chop +chose choose +chosen choose +chugged chug +chugging chug +chummed chum +chumming chum +citified citify +clad clothe +cladding clad +clammed clam +clamming clam +clapped clap +clapping clap +clarified clarify +classified classify +cleft cleave +clemmed clem +clemming clem +clept clepe +clipped clip +clipping clip +clogged clog +clogging clog +clopped clop +clopping clop +clotted clot +clotting clot +clove cleave +cloven cleave +clubbed club +clubbing club +clung cling +co-opted coopt +co-opting coopt +co-opts coopts +co-ordinate coordinate +co-ordinated coordinate +co-ordinates coordinate +co-ordinating coordinate +co-starred co-star +co-starring co-star +cockneyfied cockneyfy +codded cod +codding cod +codified codify +cogged cog +cogging cog +coiffed coif +coiffing coif +collied colly +combatted combat +combatting combat +committed commit +committing commit +compelled compel +compelling compel +complied comply +complotted complot +complotting complot +concurred concur +concurring concur +confabbed confab +confabbing confab +conferred confer +conferring confer +conned con +conning con +controlled control +controlling control +copied copy +copped cop +copping cop +coquetted coquet +coquetting coquet +corralled corral +corralling corral +counselled counsel +counselling counsel +counterplotted counterplot +counterplotting counterplot +countersank countersink +countersunk countersink +court-martialled court-martial +court-martialling court-martial +crabbed crab +crabbing crab +crammed cram +cramming cram +crapped crap +crapping crap +crept creep +cribbed crib +cribbing crib +cried cry +cropped crop +cropping crop +crossbred crossbreed +crosscutting crosscut +crucified crucify +cubbed cub +cubbing cub +cudgelled cudgel +cudgelling cudgel +cupelled cupel +cupelling cupel +cupped cup +cupping cup +curetted curet +curettes curet +curetting curet +curried curry +curst curse +curtsied curtsy +curvetted curvet +curvetting curvet +cutting cut +dabbed dab +dabbing dab +dagged dag +dagging dag +dallied dally +dammed dam +damming dam +damnified damnify +dandified dandify +dapped dap +dapping dap +dealt deal +debarred debar +debarring debar +debugged debug +debugging debug +debussed debus +debusses debus +debussing debus +decalcified decalcify +declassified declassify +decontrolled decontrol +decontrolling decontrol +decried decry +deep-freeze deepfreeze +deep-freezed deepfreeze +deep-freezes deepfreeze +deep-fried deep-fry +deferred defer +deferring defer +defied defy +degassed degas +degasses degas +degassing degas +dehumidified dehumidify +deified deify +demitted demit +demitting demit +demobbed demob +demobbing demob +demulsified demulsify +demurred demur +demurring demur +demystified demystify +denazified denazify +denied deny +denitrified denitrify +denned den +denning den +descried descry +deterred deter +deterring deter +detoxified detoxify +devilled devil +devilling devil +devitrified devitrify +diagrammed diagram +diagramming diagram +dialled dial +dialling dial +dibbed dib +dibbing dib +did do +digging dig +dignified dignify +dilly-dallied dilly-dally +dimmed dim +dimming dim +dinned din +dinning din +dipped dip +dipping dip +dirtied dirty +disannulled disannul +disannulling disannul +disbarred disbar +disbarring disbar +disbudded disbud +disbudding disbud +disembodied disembody +disembowelled disembowel +disembowelling disembowel +disenthralled disenthral disenthrall +disenthralling disenthral disenthrall +disenthralls disenthral +disenthrals disenthrall +dishevelled dishevel +dishevelling dishevel +disinterred disinter +disinterring disinter +dispelled dispel +dispelling dispel +disqualified disqualify +dissatisfied dissatisfy +distilled distil distill +distilling distil distill +diversified diversify +divvied divvy +dizzied dizzy +dogged dog +dogging dog +doglegged dogleg +doglegging dogleg +dollied dolly +done do +donned don +donning don +dotted dot +dotting dot +dought dow +dove dive +drabbed drab +drabbing drab +dragged drag +dragging drag +drank drink +drawn draw +dreamt dream +drew draw +dried dry +dripped drip +dripping drip +drivelled drivel +drivelling drivel +driven drive +dropped drop +dropping drop +drove drive +drubbed drub +drubbing drub +drugged drug +drugging drug +drummed drum +drumming drum +drunk drink +dubbed dub +dubbing dub +duelled duel +duelling duel +dug dig +dulcified dulcify +dummied dummy +dunned dun +dunning dun +dwelt dwell +dying die +easied easy +eaten eat +eavesdropped eavesdrop +eavesdropping eavesdrop +eddied eddy +edified edify +ego-tripped ego-trip +ego-tripping ego-trip +electrified electrify +embedded embed +embedding embed +embodied embody +embussed embus +embusses embus +embussing embus +emitted emit +emitting emit +empanelled empanel +empanelling empanel +emptied empty +emulsified emulsify +enamelled enamel +enamelling enamel +englutted englut +englutting englut +enrolled enrol enroll +enrolling enrol enroll +enthralled enthral enthrall +enthralling enthral enthrall +entrammelled entrammel +entrammelling entrammel +entrapped entrap +entrapping entrap +envied envy +enwound enwind +enwrapped enwrap +enwrapping enwrap +equalled equal +equalling equal +equipped equip +equipping equip +espied espy +esterified esterify +estopped estop +estopping estop +etherified etherify +excelled excel +excelling excel +exemplified exemplify +expelled expel +expelling expel +extolled extol extoll +extolling extol extoll +facetted facet +facetting facet +fagged fag +fagging fag +fallen fall +falsified falsify +fancied fancy +fanned fan +fanning fan +fantasied fantasy +fatted fat +fatting fat +featherbedded featherbed +featherbedding featherbed +fed feed +feed feed fee +fell fall +felt feel felt +ferried ferry +fibbed fib +fibbing fib +figged fig +figging fig +filled_up fill_up +fine-drawn fine-draw +fine-drew fine-draw +finned fin +finning fin +fitted fit +fitting fit +flagged flag +flagging flag +flammed flam +flamming flam +flannelled flannel +flannelling flannel +flapped flap +flapping flap +flatted flat +flatting flat +fled flee +flew fly +flimflammed flimflam +flimflamming flimflam +flip-flopped flip-flop +flip-flopping flip-flop +flipped flip +flipping flip +flitted flit +flitting flit +flogged flog +flogging flog +floodlit floodlight +flopped flop +flopping flop +flown fly +flubbed flub +flubbing flub +flung fling +flurried flurry +flyblew flyblow +flyblown flyblow +fobbed fob +fobbing fob +fogged fog +fogging fog +footslogged footslog +footslogging footslog +forbad forbid +forbade forbid +forbidden forbid +forbidding forbid +forbore forbear +forborne forbear +force-fed force-feed +fordid fordo +fordone fordo +foredid foredo +foredone foredo +foregone forego +foreknew foreknow +foreknown foreknow +foreran forerun +forerunning forerun +foresaw foresee +foreseen foresee +foreshown foreshow +forespoke forespeak +forespoken forespeak +foretold foretell +forewent forego +forgave forgive +forgetting forget +forgiven forgive +forgone forgo +forgot forget +forgotten forget +formatted format +formatting format +forsaken forsake +forsook forsake +forspoke forspeak +forspoken forspeak +forswore forswear +forsworn forswear +fortified fortify +forwent forgo +fought fight +found find +foxtrotted foxtrot +foxtrotting foxtrot +frapped frap +frapping frap +freeze-dried freeze-dry +frenchified frenchify +frenzied frenzy +fretted fret +fretting fret +fried fry +frigged frig +frigging frig +fritted frit fritt +fritting frit fritt +frivolled frivol +frivolling frivol +frogged frog +frogging frog +frolicked frolic +frolicking frolic +froze freeze +frozen freeze +fructified fructify +fuelled fuel +fuelling fuel +fulfilled fulfil fulfill +fulfilling fulfil fulfill +funned fun +funnelled funnel +funnelling funnel +funning fun +furred fur +furring fur +gadded gad +gadding gad +gagged gag +gagging gag +gainsaid gainsay +gambolled gambol +gambolling gambol +gammed gam +gamming gam +gan gin +ganned gan +ganning gan +gapped gap +gapping gap +gasified gasify +gassed gas +gasses gas +gassing gas +gave give +gelled gel +gelling gel +gelt geld +gemmed gem +gemming gem +genned-up gen-up +genning-up gen-up +gens-up gen-up +gets_lost get_lost +gets_started get_started +getting get +getting_lost get_lost +getting_started get_started +ghostwritten ghostwrite +ghostwrote ghostwrite +gibbed gib +gibbing gib +giddied giddy +giftwrapped giftwrap +giftwrapping giftwrap +gigged gig +gigging gig +gilt gild +ginned gin +ginning gin +gipped gip +gipping gip +girt gird +given give +glommed glom +glomming glom +gloried glory +glorified glorify +glutted glut +glutting glut +gnawn gnaw +goes_deep go_deep +going_deep go_deep +gollied golly +gone go +gone_deep go_deep +goose-stepped goose-step +goose-stepping goose-step +got get +got_lost get_lost +got_started get_started +gotten get +gotten_lost get_lost +grabbed grab +grabbing grab +gratified gratify +gravelled gravel +gravelling gravel +graven grave +grew grow +grinned grin +grinning grin +gripped grip +gripping grip +gript grip +gritted grit +gritting grit +ground grind +grovelled grovel +grovelling grovel +grown grow +grubbed grub +grubbing grub +guarantied guaranty +gullied gully +gummed gum +gumming gum +gunned gun +gunning gun +gypped gyp +gypping gyp +hacksawn hacksaw +had have +had_a_feeling have_a_feeling +had_left have_left +had_the_feeling have_the_feeling +hammed ham +hamming ham +hamstrung hamstring +hand-knitted hand-knit +hand-knitting hand-knit +handfed handfeed +handicapped handicap +handicapping handicap +handselled handsel +handselling handsel +harried harry +has have +has_a_feeling have_a_feeling +has_left have_left +has_the_feeling have_the_feeling +hatchelled hatchel +hatchelling hatchel +hatted hat +hatting hat +having_a_feeling have_a_feeling +having_left have_left +having_the_feeling have_the_feeling +heard hear +hedgehopped hedgehop +hedgehopping hedgehop +held hold +hemmed hem +hemming hem +hewn hew +hiccupped hiccup +hiccupping hiccup +hid hide +hidden hide +high-hatted high-hat +high-hatting high-hat +hinnied hinny +hitting hit +hobbed hob +hobbing hob +hobnobbed hobnob +hobnobbing hobnob +hocus-pocussed hocus-pocus +hocus-pocussing hocus-pocus +hocussed hocus +hocussing hocus +hogged hog +hogging hog +hogtying hogtie +honied honey +hopped hop +hopping hop +horrified horrify +horsewhipped horsewhip +horsewhipping horsewhip +houselled housel +houselling housel +hove heave +hovelled hovel +hovelling hovel +hugged hug +hugging hug +humbugged humbug +humbugging humbug +humidified humidify +hummed hum +humming hum +hung hang +hurried hurry +hypertrophied hypertrophy +identified identify +imbedded imbed +imbedding imbed +impanelled impanel +impanelling impanel +impelled impel +impelling impel +implied imply +inbred inbreed +incurred incur +incurring incur +indemnified indemnify +indwelt indwell +inferred infer +inferring infer +initialled initial +initialling initial +inlaid inlay +insetting inset +inspanned inspan +inspanning inspan +installed instal install +installing instal install +intensified intensify +interbred interbreed +intercropped intercrop +intercropping intercrop +intercutting intercut +interlaid interlay +interlapped interlap +interlapping interlap +intermarried intermarry +intermitted intermit +intermitting intermit +interpled interplead +interred inter +interring inter +interstratified interstratify +interwove interweave +interwoven interweave +intromitted intromit +intromitting intromit +inwove inweave +inwoven inweave +inwrapped inwrap +inwrapping inwrap +is be +jabbed jab +jabbing jab +jagged jag +jagging jag +jammed jam +jamming jam +japanned japan +japanning japan +jarred jar +jarring jar +jellied jelly +jellified jellify +jemmied jemmy +jerry-built jerry-build +jetted jet +jetting jet +jewelled jewel +jewelling jewel +jibbed jib +jibbing jib +jigged jig +jigging jig +jimmied jimmy +jitterbugged jitterbug +jitterbugging jitterbug +jobbed job +jobbing job +jog-trotted jog-trot +jog-trotting jog-trot +jogged jog +jogging jog +joined_battle join_battle +joined_forces join_forces +joining_battle join_battle +joining_forces join_forces +joins_battle join_battle +joins_forces join_forces +jollied jolly +jollified jollify +jotted jot +jotting jot +joy-ridden joy-ride +joy-rode joy-ride +joypopped joypop +joypopping joypop +jugged jug +jugging jug +jumped_off jump_off +jumping_off jump_off +jumps_off jump_off +justified justify +jutted jut +jutting jut +kenned ken +kennelled kennel +kennelling kennel +kenning ken +kent ken +kept keep +kernelled kernel +kernelling kernel +kidded kid +kidding kid +kidnapped kidnap +kidnapping kidnap +kipped kip +kipping kip +knapped knap +knapping knap +kneecapped kneecap +kneecapping kneecap +knelt kneel +knew know +knitted knit +knitting knit +knobbed knob +knobbing knob +knotted knot +knotting knot +known know +ko'd ko +ko'ing ko +ko's ko +labelled label +labelling label +laden lade +ladyfied ladify +ladyfies ladify +ladyfying ladify +lagged lag +lagging lag +laid lay +lain lie +lallygagged lallygag +lallygagging lallygag +lammed lam +lamming lam +lapidified lapidify +lapped lap +lapping lap +laurelled laurel +laurelling laurel +lay lie +layed_for lie_for +laying_for lie_for +lays_for lie_for +leant lean +leapfrogged leapfrog +leapfrogging leapfrog +leapt leap +learnt learn +leaves_undone leave_undone +leaving_undone leave_undone +led lead +left leave +left_undone leave_undone +lent lend +letting let +levelled level +levelling level +levied levy +libelled libel +libelling libel +lignified lignify +lipped lip +lipping lip +liquefied liquefy +liquified liquify +lit light +lobbed lob +lobbied lobby +lobbing lob +logged log +logging log +looked_towards look_towards +looking_towards look_towards +looks_towards look_towards +lopped lop +lopping lop +lost lose +lotted lot +lotting lot +lugged lug +lugging lug +lullabied lullaby +lying lie +machine-gunned machine-gun +machine-gunning machine-gun +madded mad +madding mad +made make +magnified magnify +manned man +manning man +manumitted manumit +manumitting manumit +mapped map +mapping map +marcelled marcel +marcelling marcel +marred mar +married marry +marring mar +marshalled marshal +marshalling marshal +marvelled marvel +marvelling marvel +matted mat +matting mat +meant mean +medalled medal +medalling medal +met meet +metalled metal +metalling metal +metrified metrify +might may +militated_against militate_against +militates_against militate_against +militating_against militate_against +mimicked mimic +mimicking mimic +minified minify +misapplied misapply +misbecame misbecome +miscarried miscarry +misdealt misdeal +misfitted misfit +misfitting misfit +misgave misgive +misgiven misgive +mishitting mishit +mislaid mislay +misled mislead +mispled misplead +misspelt misspell +misspent misspend +mistaken mistake +mistook mistake +misunderstood misunderstand +mobbed mob +mobbing mob +modelled model +modelling model +modified modify +mollified mollify +molten melt +mopped mop +mopping mop +mortified mortify +mown mow +mudded mud +muddied muddy +mudding mud +mugged mug +mugging mug +multiplied multiply +mummed mum +mummified mummify +mumming mum +mutinied mutiny +mystified mystify +nabbed nab +nabbing nab +nagged nag +nagging nag +napped nap +napping nap +netted net +netting net +nibbed nib +nibbing nib +nickelled nickel +nickelling nickel +nid-nodded nid-nod +nid-nodding nid-nod +nidified nidify +nigrified nigrify +nipped nip +nipping nip +nitrified nitrify +nodded nod +nodding nod +non-prossed non-pros +non-prosses non-pros +non-prossing non-pros +nonplussed nonplus +nonplusses nonplus +nonplussing nonplus +notified notify +nullified nullify +nutted nut +nutting nut +objectified objectify +occupied occupy +occurred occur +occurring occur +offsetting offset +omitted omit +omitting omit +ossified ossify +outbidden outbid +outbidding outbid +outbred outbreed +outcried outcry +outcropped outcrop +outcropping outcrop +outdid outdo +outdone outdo +outdrawn outdraw +outdrew outdraw +outfitted outfit +outfitting outfit +outfought outfight +outgassed outgas +outgasses outgas +outgassing outgas +outgeneralled outgeneral +outgeneralling outgeneral +outgone outgo +outgrew outgrow +outgrown outgrow +outlaid outlay +outmanned outman +outmanning outman +outputted output +outputting output +outran outrun +outridden outride +outrode outride +outrunning outrun +outshone outshine +outshot outshoot +outsold outsell +outspanned outspan +outspanning outspan +outstood outstand +outstripped outstrip +outstripping outstrip +outthought outthink +outwent outgo +outwitted outwit +outwitting outwit +outwore outwear +outworn outwear +overbidden overbid +overbidding overbid +overblew overblow +overblown overblow +overbore overbear +overborne overbear +overbuilt overbuild +overcame overcome +overcropped overcrop +overcropping overcrop +overdid overdo +overdone overdo +overdrawn overdraw +overdrew overdraw +overdriven overdrive +overdrove overdrive +overflew overfly +overflown overflow overfly +overgrew overgrow +overgrown overgrow +overheard overhear +overhung overhang +overlaid overlay +overlain overlie +overlapped overlap +overlapping overlap +overlay overlie +overlying overlie +overmanned overman +overmanning overman +overpaid overpay +overpast overpass +overran overrun +overridden override +overrode override +overrunning overrun +oversaw oversee +overseen oversee +oversetting overset +oversewn oversew +overshot overshoot +oversimplified oversimplify +overslept oversleep +oversold oversell +overspent overspend +overspilt overspill +overstepped overstep +overstepping overstep +overtaken overtake +overthrew overthrow +overthrown overthrow +overtook overtake +overtopped overtop +overtopping overtop +overwound overwind +overwritten overwrite +overwrote overwrite +pacified pacify +padded pad +padding pad +paid pay +palled pal +palling pal +palsied palsy +pandied pandy +panelled panel +panelling panel +panicked panic +panicking panic +panned pan +panning pan +parallelled parallel +parallelling parallel +parcelled parcel +parcelling parcel +parodied parody +parried parry +partaken partake +partook partake +pasquil pasquinade +pasquilled pasquinade +pasquilling pasquinade +pasquils pasquinade +patrolled patrol +patrolling patrol +patted pat +patting pat +pedalled pedal +pedalling pedal +pegged peg +pegging peg +pencilled pencil +pencilling pencil +penned pen +penning pen +pent pen +pepped pep +pepping pep +permitted permit +permitting permit +personified personify +petrified petrify +petted pet +pettifogged pettifog +pettifogging pettifog +petting pet +phantasied phantasy +photocopied photocopy +photomapped photomap +photomapping photomap +photosetting photoset +physicked physic +physicking physic +picnicked picnic +picnicking picnic +pigged pig +pigging pig +pilloried pillory +pinch-hitting pinch-hit +pinned pin +pinning pin +pipped pip +pipping pip +pistol-whipped pistol-whip +pistol-whipping pistol-whip +pistolled pistol +pistolling pistol +pitapatted pitapat +pitapatting pitapat +pitied pity +pitted pit +pitting pit +planned plan +planning plan +platted plat +platting plat +played_a_part play_a_part +playing_a_part play_a_part +plays_a_part play_a_part +pled plead +plied ply +plodded plod +plodding plod +plopped plop +plopping plop +plotted plot +plotting plot +plugged plug +plugging plug +podded pod +podding pod +pommelled pommel +pommelling pommel +popes popes +popped pop +popping pop +potted pot +potting pot +preachified preachify +precancelled precancel +precancelling precancel +preferred prefer +preferring prefer +preoccupied preoccupy +prepaid prepay +presignified presignify +pretermitted pretermit +pretermitting pretermit +prettied pretty +prettified prettify +pried pry +prigged prig +prigging prig +primmed prim +primming prim +prodded prod +prodding prod +programmed program +programmes program +programming program +prologed prologue +prologing prologue +prologs prologue +propelled propel +propelling propel +prophesied prophesy +propped prop +propping prop +proven prove +pubbed pub +pubbing pub +pugged pug +pugging pug +pummelled pummel +pummelling pummel +punned pun +punning pun +pupped pup +pupping pup +purified purify +put-putted put-put +put-putting put-put +putrefied putrefy +puttied putty +putting put +qualified qualify +quantified quantify +quarrelled quarrel +quarrelling quarrel +quarried quarry +quartersawn quartersaw +queried query +quick-froze quick-freeze +quick-frozen quick-freeze +quickstepped quickstep +quickstepping quickstep +quipped quip +quipping quip +quitted quit +quitting quit +quizzed quiz +quizzes quiz +quizzing quiz +ragged rag +ragging rag +rallied rally +ramified ramify +rammed ram +ramming ram +ran run +rang ring +rapped rap +rappelled rappel +rappelling rappel +rapping rap +rarefied rarefy +ratified ratify +ratted rat +ratting rat +ravelled ravel +ravelling ravel +razor-cutting razor-cut +re-trod re-tread +re-trodden re-tread +rebelled rebel +rebelling rebel +rebuilt rebuild +rebutted rebut +rebutting rebut +recapped recap +recapping recap +reclassified reclassify +recommitted recommit +recommitting recommit +recopied recopy +rectified rectify +recurred recur +recurring recur +red red +red-pencilled red-pencil +red-pencilling red-pencil +redded red redd +redding red redd +redid redo +redone redo +referred refer +referring refer +refitted refit +refitting refit +reft reave +refuelled refuel +refuelling refuel +regretted regret +regretting regret +reheard rehear +reified reify +relied rely +remade remake +remarried remarry +remitted remit +remitting remit +rent rend +repaid repay +repelled repel +repelling repel +replevied replevy +replied reply +repotted repot +repotting repot +reran rerun +rerunning rerun +resat resit +resetting reset +resewn resew +resitting resit +retaken retake +rethought rethink +retold retell +retook retake +retransmitted retransmit +retransmitting retransmit +retried retry +retrofitted retrofit +retrofitting retrofit +retted ret +retting ret +reunified reunify +revelled revel +revelling revel +revetted revet +revetting revet +revivified revivify +revved rev +revving rev +rewound rewind +rewritten rewrite +rewrote rewrite +ribbed rib +ribbing rib +ricochetted ricochet +ricochetting ricochet +ridded rid +ridden ride +ridding rid +rigged rig +rigging rig +rigidified rigidify +rimmed rim +rimming rim +ripped rip +ripping rip +risen rise +rivalled rival +rivalling rival +riven rive +robbed rob +robbing rob +rode ride +rose rise +rotted rot +rotting rot +rough-dried rough-dry +rough-hewn rough-hew +rove reeve +rowelled rowel +rowelling rowel +rubbed rub +rubbing rub +rung ring +running run +rutted rut +rutting rut +saccharified saccharify +sagged sag +sagging sag +said say +salaried salary +salified salify +sallied sally +sanctified sanctify +sandbagged sandbag +sandbagging sandbag +sang sing +sank sink +saponified saponify +sapped sap +sapping sap +sat sit +satisfied satisfy +savvied savvy +saw see +sawn saw +scagged scag +scagging scag +scanned scan +scanning scan +scarified scarify +scarred scar +scarring scar +scatted scat +scatting scat +scorified scorify +scragged scrag +scragging scrag +scrammed scram +scramming scram +scrapped scrap +scrapping scrap +scried scry +scrubbed scrub +scrubbing scrub +scrummed scrum +scrumming scrum +scudded scud +scudding scud +scummed scum +scumming scum +scurried scurry +seed seed +seen see +sent send +setting set +sewn sew +shagged shag +shagging shag +shaken shake +shaken_hands shake_hands +shakes_hands shake_hands +shaking_hands shake_hands +shammed sham +shamming sham +sharecropped sharecrop +sharecropping sharecrop +shat shit +shaven shave +shed shed +shedding shed +shellacked shellac +shellacking shellac +shent shend +shewn shew +shied shy +shikarred shikar +shikarring shikar +shillyshallied shillyshally +shimmed shim +shimmied shimmy +shimming shim +shinned shin +shinning shin +shipped ship +shipping ship +shitted shit +shitting shit +shod shoe +shone shine +shook shake +shook_hands shake_hands +shopped shop +shopping shop +shot shoot +shotgunned shotgun +shotgunning shotgun +shotted shot +shotting shot +shovelled shovel +shovelling shovel +shown show +shrank shrink +shredded shred +shredding shred +shrink-wrapped shrink-wrap +shrink-wrapping shrink-wrap +shrivelled shrivel +shrivelling shrivel +shriven shrive +shrove shrive +shrugged shrug +shrugging shrug +shrunk shrink +shrunken shrink +shunned shun +shunning shun +shutting shut +sicked sic +sicking sic +sideslipped sideslip +sideslipping sideslip +sidestepped sidestep +sidestepping sidestep +sightsaw sightsee +sightseen sightsee +signalled signal +signalling signal +signified signify +silicified silicify +simplified simplify +singing sing singe +single-stepped single-step +single-stepping single-step +sinned sin +sinning sin +sipped sip +sipping sip +sitting sit +skellied skelly +skenned sken +skenning sken +sketted sket +sketting sket +ski'd ski +skidded skid +skidding skid +skimmed skim +skimming skim +skin-popped skin-pop +skin-popping skin-pop +skinned skin +skinning skin +skinny-dipped skinny-dip +skinny-dipping skinny-dip +skipped skip +skipping skip +skivvied skivvy +skydove skydive +slabbed slab +slabbing slab +slagged slag +slagging slag +slain slay +slammed slam +slamming slam +slapped slap +slapping slap +slatted slat +slatting slat +sledding sled +slept sleep +slew slay +slid slide +slidden slide +slipped slip +slipping slip +slitting slit +slogged slog +slogging slog +slopped slop +slopping slop +slotted slot +slotting slot +slugged slug +slugging slug +slummed slum +slumming slum +slung sling +slunk slink +slurred slur +slurring slur +smelt smell +smit smite +smitten smite +smote smite +smutted smut +smutting smut +snagged snag +snagging snag +snapped snap +snapping snap +snedded sned +snedding sned +snipped snip +snipping snip +snivelled snivel +snivelling snivel +snogged snog +snogging snog +snubbed snub +snubbing snub +snuck sneak +snugged snug +snugging snug +sobbed sob +sobbing sob +sodded sod +sodding sod +soft-pedalled soft-pedal +soft-pedalling soft-pedal +sold sell +solemnified solemnify +solidified solidify +soothsaid soothsay +sopped sop +sopping sop +sought seek +sown sow +spagged spag +spagging spag +spancelled spancel +spancelling spancel +spanned span +spanning span +sparred spar +sparring spar +spat spit +spatted spat +spatting spat +specified specify +sped speed +speechified speechify +spellbound spellbind +spelt spell +spent spend +spied spy +spilt spill +spin-dried spin-dry +spinning spin +spiralled spiral +spiralling spiral +spitted spit +spitting spit +splitting split +spoilt spoil +spoke speak +spoken speak +spoon-fed spoon-feed +spotlit spotlight +spotted spot +spotting spot +sprang spring +sprigged sprig +sprigging sprig +sprung spring +spudded spud +spudding spud +spun spin +spurred spur +spurring spur +squatted squat +squatting squat +squibbed squib +squibbing squib +squidded squid +squidding squid +squilgee squeegee +stabbed stab +stabbing stab +stall-fed stall-feed +stank stink +starred star +starring star +steadied steady +stellified stellify +stemmed stem +stemming stem +stems_from stem_from +stencilled stencil +stencilling stencil +stepped step +stepping step +stetted stet +stetting stet +stied sty +stilettoeing stiletto +stirred stir +stirring stir +stole steal +stolen steal +stood stand +stopped stop +stopping stop +storied story +stotted stot +stotting stot +stove stave +strapped strap +strapping strap +stratified stratify +strewn strew +stridden stride +stripped strip +stripping strip +striven strive +strode stride +stropped strop +stropping strop +strove strive +strown strow +struck strike +strummed strum +strumming strum +strung string +strutted strut +strutting strut +stubbed stub +stubbing stub +stuck stick +studded stud +studding stud +studied study +stultified stultify +stummed stum +stumming stum +stung sting +stunk stink +stunned stun +stunning stun +stupefied stupefy +stymying stymie +subbed sub +subbing sub +subjectified subjectify +subletting sublet +submitted submit +submitting submit +subtotalled subtotal +subtotalling subtotal +sullied sully +sulphuretted sulphuret +sulphuretting sulphuret +summed sum +summing sum +sung sing +sunk sink +sunken sink +sunned sun +sunning sun +supped sup +supping sup +supplied supply +swabbed swab +swabbing swab +swagged swag +swagging swag +swam swim +swapped swap +swapping swap +swatted swat +swatting swat +swept sweep +swigged swig +swigging swig +swimming swim +swivelled swivel +swivelling swivel +swollen swell +swopped swap +swopping swap +swops swap +swore swear +sworn swear +swotted swot +swotting swot +swum swim +swung swing +syllabified syllabify +symbolled symbol +symbolling symbol +tabbed tab +tabbing tab +tagged tag +tagging tag +taken take +taken_a_side take_a_side +taken_pains take_pains +taken_steps take_steps +takes_a_side take_a_side +takes_pains take_pains +takes_steps take_steps +taking_a_side take_a_side +taking_pains take_pains +taking_steps take_steps +talcked talc +talcking talc +tallied tally +tally-ho'd tally-ho +tammied tammy +tanned tan +tanning tan +tapped tap +tapping tap +tarred tar +tarried tarry +tarring tar +tasselled tassel +tasselling tassel +tatted tat +tatting tat +taught teach +taxis taxis +taxying taxi +teaselled teasel +teaselling teasel +tedded ted +tedding ted +tepefied tepefy +terrified terrify +testes testes +testified testify +thinking_the_world_of think_the_world_of +thinks_the_world_of think_the_world_of +thinned thin +thinning thin +thought think +thought_the_world_of think_the_world_of +threw throw +threw_out throw_out +thriven thrive +throbbed throb +throbbing throb +throve thrive +throwing_out throw_out +thrown throw +thrown_out throw_out +throws_out throw_out +thrummed thrum +thrumming thrum +thudded thud +thudding thud +tidied tidy +tinned tin +tinning tin +tinselled tinsel +tinselling tinsel +tipped tip +tipping tip +tittupped tittup +tittupping tittup +toadied toady +togged tog +togging tog +told tell +took take +took_a_side take_a_side +took_pains take_pains +took_steps take_steps +topped top +topping top +tore tear +torn tear +torrefied torrefy +torrify torrefy +totalled total +totalling total +totted tot +totting tot +towelled towel +towelling towel +trafficked traffic +trafficking traffic +trameled trammel +trameling trammel +tramelled trammel +tramelling trammel +tramels trammel +trammed tram +tramming tram +transferred transfer +transferring transfer +transfixt transfix +tranship transship +transhipped tranship +transhipping tranship +transmitted transmit +transmitting transmit +transmogrified transmogrify +transshipped transship +transshipping transship +trapanned trapan +trapanning trapan +trapped trap +trapping trap +travelled travel +travelling travel +travestied travesty +trekked trek +trekking trek +trepanned trepan +trepanning trepan +tried try +trigged trig +trigging trig +trimmed trim +trimming trim +tripped trip +tripping trip +trod tread +trodden tread +trogged trog +trogging trog +trotted trot +trotting trot +trowelled trowel +trowelling trowel +tugged tug +tugging tug +tumefied tumefy +tunned tun +tunnelled tunnel +tunnelling tunnel +tunning tun +tupped tup +tupping tup +tut-tutted tut-tut +tut-tutting tut-tut +twigged twig +twigging twig +twinned twin +twinning twin +twitted twit +twitting twit +tying tie +typesetting typeset +typewritten typewrite +typewrote typewrite +typified typify +uglified uglify +unbarred unbar +unbarring unbar +unbent unbend +unbound unbind +uncapped uncap +uncapping uncap +unclad unclothe +unclogged unclog +unclogging unclog +underbidding underbid +underbought underbuy +undercutting undercut +underfed underfeed +undergirt undergird +undergone undergo +underlaid underlay +underlain underlie +underlay underlie +underletting underlet +underlying underlie +underpaid underpay +underpinned underpin +underpinning underpin +underpropped underprop +underpropping underprop +undersetting underset +undershot undershoot +undersold undersell +understood understand +understudied understudy +undertaken undertake +undertook undertake +underwent undergo +underwritten underwrite +underwrote underwrite +undid undo +undone undo +unfitted unfit +unfitting unfit +unfroze unfreeze +unfrozen unfreeze +unified unify +unkennelled unkennel +unkennelling unkennel +unknitted unknit +unknitting unknit +unlaid unlay +unlearnt unlearn +unmade unmake +unmanned unman +unmanning unman +unpegged unpeg +unpegging unpeg +unpinned unpin +unpinning unpin +unplugged unplug +unplugging unplug +unravelled unravel +unravelling unravel +unrigged unrig +unrigging unrig +unripped unrip +unripping unrip +unrove unreeve +unsaid unsay +unshipped unship +unshipping unship +unslung unsling +unsnapped unsnap +unsnapping unsnap +unspoke unspeak +unspoken unspeak +unsteadied unsteady +unstepped unstep +unstepping unstep +unstopped unstop +unstopping unstop +unstrung unstring +unstuck unstick +unswore unswear +unsworn unswear +untaught unteach +unthought unthink +untidied untidy +untrod untread +untrodden untread +untying untie +unwound unwind +unwrapped unwrap +unwrapping unwrap +unzipped unzip +unzipping unzip +upbuilt upbuild +upheld uphold +uphove upheave +upped up +uppercutting uppercut +upping up +uprisen uprise +uprose uprise +upsetting upset +upsprang upspring +upsprung upspring +upswept upsweep +upswollen upswell +upswung upswing +vagged vag +vagging vag +varied vary +vatted vat +vatting vat +verbified verbify +verified verify +versified versify +vetted vet +vetting vet +victualled victual +victualling victual +vilified vilify +vitrified vitrify +vitriolled vitriol +vitriolling vitriol +vivified vivify +vying vie +wadded wad +waddied waddy +wadding wad +wadsetted wadset +wadsetting wadset +wagged wag +wagging wag +wanned wan +wanning wan +warred war +warring war +was be +water-ski'd water-ski +waylaid waylay +wearied weary +weatherstripped weatherstrip +weatherstripping weatherstrip +webbed web +webbing web +wedded wed +wedding wed +weed weed +went go +went_deep go_deep +wept weep +were be +wetted wet +wetting wet +whammed wham +whamming wham +whapped whap +whapping whap +whetted whet +whetting whet +whinnied whinny +whipped whip +whipping whip +whipsawn whipsaw +whirred whir +whirring whir +whistle-stopped whistle-stop +whistle-stopping whistle-stop +whizzed whiz +whizzes whiz +whizzing whiz +whopped whop +whopping whop +wigged wig +wigging wig +wigwagged wigwag +wigwagging wigwag +wildcatted wildcat +wildcatting wildcat +window-shopped window-shop +window-shopping window-shop +winning win +winterfed winterfeed +wiredrawn wiredraw +wiredrew wiredraw +withdrawn withdraw +withdrew withdraw +withheld withhold +withstood withstand +woke wake +woken wake +won win +wonned won +wonning won +wore wear +worn wear +worried worry +worshipped worship +worshipping worship +wound wind +wove weave +woven weave +wrapped wrap +wrapping wrap +wried wry +written write +wrote write +wrought work +wrung wring +yakked yak +yakking yak +yapped yap +yapping yap +ycleped clepe +yclept clepe +yenned yen +yenning yen +yodelled yodel +yodelling yodel +zapped zap +zapping zap +zigzagged zigzag +zigzagging zigzag +zipped zip +zipping zip diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0.exc.db b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/WordNet-2.0.exc.db new file mode 100644 index 0000000000000000000000000000000000000000..a7a14c7726d7f2b8ba608c742f9d8f44f47cf87e GIT binary patch literal 294912 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 Ac>n+a literal 0 HcmV?d00001 diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/data/smart_common_words.txt b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/smart_common_words.txt new file mode 100644 index 0000000..76991f6 --- /dev/null +++ b/fastSum/resources/ROUGE/RELEASE-1.5.5/data/smart_common_words.txt @@ -0,0 +1,598 @@ +reuters +ap +jan +feb +mar +apr +may +jun +jul +aug +sep +oct +nov +dec +tech +news +index +mon +tue +wed +thu +fri +sat +'s +a +a's +able +about +above +according +accordingly +across +actually +after +afterwards +again +against +ain't +all +allow +allows +almost +alone +along +already +also +although +always +am +amid +among +amongst +an +and +another +any +anybody +anyhow +anyone +anything +anyway +anyways +anywhere +apart +appear +appreciate +appropriate +are +aren't +around +as +aside +ask +asking +associated +at +available +away +awfully +b +be +became +because +become +becomes +becoming +been +before +beforehand +behind +being +believe +below +beside +besides +best +better +between +beyond +both +brief +but +by +c +c'mon +c's +came +can +can't +cannot +cant +cause +causes +certain +certainly +changes +clearly +co +com +come +comes +concerning +consequently +consider +considering +contain +containing +contains +corresponding +could +couldn't +course +currently +d +definitely +described +despite +did +didn't +different +do +does +doesn't +doing +don't +done +down +downwards +during +e +each +edu +eg +e.g. +eight +either +else +elsewhere +enough +entirely +especially +et +etc +etc. +even +ever +every +everybody +everyone +everything +everywhere +ex +exactly +example +except +f +far +few +fifth +five +followed +following +follows +for +former +formerly +forth +four +from +further +furthermore +g +get +gets +getting +given +gives +go +goes +going +gone +got +gotten +greetings +h +had +hadn't +happens +hardly +has +hasn't +have +haven't +having +he +he's +hello +help +hence +her +here +here's +hereafter +hereby +herein +hereupon +hers +herself +hi +him +himself +his +hither +hopefully +how +howbeit +however +i +i'd +i'll +i'm +i've +ie +i.e. +if +ignored +immediate +in +inasmuch +inc +indeed +indicate +indicated +indicates +inner +insofar +instead +into +inward +is +isn't +it +it'd +it'll +it's +its +itself +j +just +k +keep +keeps +kept +know +knows +known +l +lately +later +latter +latterly +least +less +lest +let +let's +like +liked +likely +little +look +looking +looks +ltd +m +mainly +many +may +maybe +me +mean +meanwhile +merely +might +more +moreover +most +mostly +mr. +ms. +much +must +my +myself +n +namely +nd +near +nearly +necessary +need +needs +neither +never +nevertheless +new +next +nine +no +nobody +non +none +noone +nor +normally +not +nothing +novel +now +nowhere +o +obviously +of +off +often +oh +ok +okay +old +on +once +one +ones +only +onto +or +other +others +otherwise +ought +our +ours +ourselves +out +outside +over +overall +own +p +particular +particularly +per +perhaps +placed +please +plus +possible +presumably +probably +provides +q +que +quite +qv +r +rather +rd +re +really +reasonably +regarding +regardless +regards +relatively +respectively +right +s +said +same +saw +say +saying +says +second +secondly +see +seeing +seem +seemed +seeming +seems +seen +self +selves +sensible +sent +serious +seriously +seven +several +shall +she +should +shouldn't +since +six +so +some +somebody +somehow +someone +something +sometime +sometimes +somewhat +somewhere +soon +sorry +specified +specify +specifying +still +sub +such +sup +sure +t +t's +take +taken +tell +tends +th +than +thank +thanks +thanx +that +that's +thats +the +their +theirs +them +themselves +then +thence +there +there's +thereafter +thereby +therefore +therein +theres +thereupon +these +they +they'd +they'll +they're +they've +think +third +this +thorough +thoroughly +those +though +three +through +throughout +thru +thus +to +together +too +took +toward +towards +tried +tries +truly +try +trying +twice +two +u +un +under +unfortunately +unless +unlikely +until +unto +up +upon +us +use +used +useful +uses +using +usually +uucp +v +value +various +very +via +viz +vs +w +want +wants +was +wasn't +way +we +we'd +we'll +we're +we've +welcome +well +went +were +weren't +what +what's +whatever +when +whence +whenever +where +where's +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +who's +whoever +whole +whom +whose +why +will +willing +wish +with +within +without +won't +wonder +would +would +wouldn't +x +y +yes +yet +you +you'd +you'll +you're +you've +your +yours +yourself +yourselves +z +zero diff --git a/fastSum/resources/ROUGE/RELEASE-1.5.5/docs/ACL2004.pdf b/fastSum/resources/ROUGE/RELEASE-1.5.5/docs/ACL2004.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4fa9701822e9309ab3152bc9c6266b25a4cb8ab5 GIT binary patch literal 351272 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 z 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 z%0A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ξ>l`$ zJKpS<9i^o7DT2ZlG&MnkOC@zd+nyd{GfL5HrUWg%y@Xqwxq*KgC?}Z)m1IQRXPB|KG&nBtws9Xr_nXyIBN0X}{FY`r3E354TUYi|w(jRd)&& z2NaBJ@o1J016a5e=Msx^iN!FC)!-6~63ekpTjwm%>S;q0IaReTYA~KcDK4p;w>tIC z{7gLBF7%6C{Cqi`AUWcsfI4jo*HTwR$mbUbVJpCw1j(V& zolCW?+AeKaJFb1GUD9NCa88@lB%&p>K5e76QxX-HC`SswV|)v2{?R?2!xZda2zRlioI0pnKLlZ;Msh+ z0QO=omV9|&pueCO(NI{j3#%{8dT!0q-q@_-{j8TztjM%NlePU3=r$B*&wCDmAXI6VeD8g{_q_K$zu)tFo@Z}^`PiK1 zl}~mmT_AY2H7kb-qaVP=?Pvfes0OtDG9wW8Gb9#9Nx+dYuOKsecxAj~GzTvTSU{3O z!;C*=EfS0Zbpq~_sdaUkSIQ)1{MgO~VQPDKYlswIfK&t2m2S=ZfYjRxQUln4ucI5& z#!48}l9)fghNjTGSKRIz1|?b&|4PtOVr!x|K__U6uj#F!dTVeElDfJ>Aql!wupBB4 zx#TjYWfAOQ+47b|Z)0;XA+KEvhk5gYD6uv%nD`>W41z5x(K{~|OelI)RuN3}ijs0Q zDio8kcQn5sbM4Jju4RMA17=tUOtn~p3HKP5k<($kI}@~B1eVYK_!*JkQ0o-QDo8V= zuy-i4N9rdT_EN}d!wl5U_F3$OT3dZXVeg6Q`H(jeE6<^EQz5DsV3?@@hz}D}3M%7q#oUTS3bMguvg1ppZoQO|;jU*_!pq8?P0_>GrbnC5KFHw$Ksvo}1aRsvN zN0(h3NChU%%X7PbQ7dY32YlW18>|Jy0b}c|UgO0z29z~m|Cq}H0?aB$UZzF^$_iw@ zMWf8OJl7yRwXgna#{MBtKMyMX6@@WHaWCqhJ6F-ai*6A9``Deu!UJeU7wf$t4!n}wK-^f*G=eVQ0lOWd4eGmy7e#{uw( zB$OORIGIdgD6G-vK>K_fC{Ix+6u^zEsm*2W_1BnxA1zx_a_GI&@L^M5F*m6jsx`nT zr<{XBh;picOSK)uYSIWiii3{P(9(FRhs@34VZuSzRFa8;B8Ragk7pNH7|{_mCn~m- zeZQiwIP0&Td%iFI4}JgjsW>0ruIm1b$Z`wZK#@|cd za8etFhu*Vs;=I$bvWoWeTki~ew-2|)uiw4;sjKVo&sIf07~Tk}6}3(Mjd_=;M`nnv zQ*z5C2G`l!nC1G{jcx35`zEGClf}EDOe6EEsex6Q(Nc@V-R3Bc(;CzpRrnk|qRqBO z9p`K#290WDP<>o|L48$yTYXOrKdWVox+b&8%$q4A94gJUc`ktL;5Yh3~iMY{(Yj%E|9;n~> z_nuVxE-w1VpKxXNH@)XB?4m5`fnASF&%cS~N8jRC(#iBU4OrauPWmqp)@akzAJo0T zXBz2{50yhFm6Y{Tw8ylA?KkzYD&QtbIty0?$tatI`9V5{uoYs#;V9JW!(-GNa<;cn zDvTA!`()b58LfHfN7Ij6AFhT0TTx10Woc? zRRjO&@|D!G;ZTrJk+#m9CYkuLC!^sF??g^iY^GBCcON`>@WWr6+24Qi;^IKy)%tKm zcK>uq%Zf#dmsY8B{xd<_sFG!Tk7>(-NmKfWw5_Fc(~527;^13*_O2Vg<_`wTD zqr5ztpWm1PCn`l_Q92s+%fAJ1it+D|AL-$VUZ?XpRO38T$xzHX4SDFpUgSVl>MShE zN^Fd!_p*2m+sRVOfjw*nlcSCqFzdjK$*+K^*Bv)T#6qD~3=u$G(gLwms23$?vjS*y zlTmc$%@Hd-*fT~I%XUUD=+>#MqLKXq4CkpthHHAaBa_5a6W!2PCXJIIM5z~nHYTf{ zVLds~-PP3&GeNYJU`fq}o!puYJ?bXl<46YHd`-j;N1{XF0RNN#{Qtp-2Tc6vlTXqo zj(B@&+m1$UM|X7;42pg0u&4k0>HhR1X7~Od@A>fHz?rkX2TlP=<~G!a!$6Yyrq^aj z@}*&GV^t^p_J-CC_Ri){cM7FP*1w-VC2eb4ziGwRN^x*YPfrJ-OQ0e{m&HLsmsx!A zq5z7a2E0Qq>&f3C^yl{p*Ia*gJ#al@v&|tj=T<))+bsdkupI#xSBIbKM5JY;UpCc6+W#HQvi$ zLN1wUVHhA7c{vxvz+|zSt%OG=;VF+65>b#89tFibK^FalLwRLUu~?`R%bZIU4lQkD z4MvN>jLkqK*Acb#Ex@Kh=>w7wm+rs=5=2g{or4<^}tbvLd1a`adMqAKG=- z)(y8cH0*1}Z#a(@H*fAfbmCh(5Ap|YE~zt~FKnn^(`pCtu3d*#9eChtk9RxOHxrZq zbI=Vx&|%VBidHi}sQrfZRo`RQ9^ZfS1HZr2Fji$1QyML;FXc*0!<97X9z6a`ScfWp z;yF<|s>pL;kJ7M*S=fsz%<@lEET&ZYimS>R|-|E_UY6Qjz)RR z*VR14{2&3HO8RD@1xKL1aT7oAc#ELfBi#QGsoyg@_*o$3^pYjh#oUgZA^hUuJx|iW zH2xbyz@Ne;yIR19_b)VrY(Q45x)G49Awb7@F?|+~XSPFMyvEKGKPf$+C};qtAM!B9 zNc@X*5t@n45mn*NW;V{Z2axXI?{I)M%@66EZBL(BL4WSJ)BaUgK>-yG^o~LqVR} zAW29bXi+;=qN<4Nxk50pmqugc*Lbi4;TCwr=!1#WOjUQvT@4a|1=JBrL+@G_vQie@ zEUxBCmQ?4l1GkU8)Pw7WhSF~g4GC{K?~lWa-c1HdZo4oB_u>LkKm9CrnHFg!$;{tI zbDQgg7;xmtH^ZJ%}O zlcg6dG;3ZREtT*eY z_4B%*+b(xZr+f`XiwyuVd)d7)U7}Z(TArA+k-M`{Ei{N4aznwxXr%?JLaJ%P8Zr!6 z%UCp%nGbEhrom38azo&Ku!gDP;IqrNMpcFiH4WA=oR2KL_jo(4mQ`~vs0?hno1UtQ zRzVzKoMVAV*UzmpWa|~ z1X#VDWrdfXKyG-#W!}8lJTsn)D1+)NG+||d5KW#ZrrTx?QvqPo*<&>89r~cowdmLa zY=T@UNn$cHX%|pJqD~2k5lTo@DIw8AxxhCZJ4V@vZpwy!Cbo8p`$Zy#THL*E;wBnk zmKo+S!@P`PPG)9pKSRBo0S+?2WjVmJwvPd}*`1*d^ed=OlU5QaZ)Tpfkg}DSe@~f4 zv!cx5uCL1tcsV&&6}hY3^eBOq!R|UqW>20>i|KDN(&?X*Ewc?|B;AyQ%~+F4U`=b} zi}p%Wi7LyLUWG@J1xYv|3Lr`(3vn^tFJb8tpRdCs@&S7DJVnh@)E$7jneX5S`C*>7 zAh`(#WYm8lQ^TmJOnf|Jqcb*@jE#qJVgGdp+KzT3j^ZI`Ql5v?{ZArv@9wfcK-Y6(-?{MIn+O;W#UzD53bGcz+m&F9n&{f|N>- zQZa$bU~o7{dV@IVEdxQlXKPGyGLu{~^Vd0mf+QtiWrI* zWsu7hsHM3mL`8*FTL5l7{dE&s`6vW)Spj9Xb%CH#pPkF#rc`u+j8gEIBj>eHQ6X}} zT3kw2`%v{t`lh59(URAOAH^}e3imlXotGz_kpnMbYw7~dci#Qe8Rvr22c*ew@izQp zC*eHh9CbP;ar=>vofq(0?85r5QXX%1?k_&jJ%huZS;v$C>=poo6-rdinF}`Ksj)a}NfNXxRaH?qjz9`% zBD77&6*uGkFe+R!f;3>A#twrRG~x!0xQph2(P0c5;|6cQxErt)U5VRjFO;ez{-teb z8aN>rZzlT*A@oW)G-9PJQCJ;9VU{ArEIA5UaxmA2K5gAIZc(REJ;M65nHyCB+9jwA z?DTdN!rGmUD{W{YB`o?k4d0_NX8tHsgJcaX+qu9K+0r=d2Qv&)Gn92j=f^VBkT27i zx#5cCD1j5VZ*8*`r8rnC!vUFp?s%{k?qTy>PD0tK#`*qRSHp?rAa^|dyUVz!)xPZ> z9KM)-?&BDh$(Oh$r{UW@U+%}pu8*V-%vXNul25_}QGkl@sC~zPdtec1!*?5B_wcHg^s z?|aWV-_NlVEb(@{iiP`GtCLhEuSMvLiVFV>E9SGKm6f(uwJg4DcY-D^#&82;xPdlq zU~Fw{U+l%$;g}o)ik;sJvo3vw%_kM45;DqG;9f*K+*dfb0DT{>^xC+?5P#a|vBbg0P6?)+9eBaZyql8oN(cH3EPW_i zmXel4Av^nUZ8-R#50{Qkw2vtABCcLMN5O+jeV98@giB26D0UKIVDTu8_EZnju5q-w zW-l=J4CkiAS@A{MPG^T9gN8A)infC(m50d*{%0q92Mn>f9Ldc|)c7+cHI1`*NywJL z_M0GP$!Z2s2necC+Dsky)IM7C$2X|&1@{zn^2g|HV<%32LfiAN{|>U_fJ?u1oMvBs z);)H{{fT>^`FcF|q*eD_4I@IogfOxq;g`$(@-u0Lg1Px%~R9!{SG8~XBg z^#qhXG|PV0&}*991D}p(sdpV{?B!M9X#K!Z!4ZWji2TZ8+2Q`1nN&-`sjoVIFSc54 zVo7>LNdgq~6^;C=W1*lnjJk|`#a=W(jVX$PI}O!~p`l~S)X4B%l-kzKw3WY)*s$;c0$P`jTaNcnG)*=* z*I>j29?-ZPmsk*5qXrA`IH5t91!W#18ih{FB#mgC5}8SZ41Qrj$AVD<h-}FrmDeUH5;+qzK6X&5 zcaJVgRAkWc4@fut=I))lQKxRu>4MOyPUv<6#4n0?p@{c`Zq*`Ai}+P|l<$jp`h?E% zG7--tIPsbgw}Q?FIq#IOl_~L{z~A=pmD1Pw3RyBVVboZ2ems(7nW-Qjp)h_y*@7v6 zpfZy+hQKY-hygGK!3)Iib>eqGTg`*rL5u4~P}dDuK-V-zHG?qC&fpNKx7 zV;~nUqsc&m$_?-bTy#C;2zck^}Qp%3HLBt>|k-n;SPERKtOPAm@hDAhP8q5z*|;ZCZo5u(B~Ie@_zsVX)5O69`}Y;6tSgQeHxI}GwgUF8{27wd zbYzWy_+F=ReW|`qzf0!}0C53u!PzH}4e%d7@QGV+FOcq$?f3Kh0P0bB+4}S&c)q=$ zX2^)M^fQ*4Glhs~E-^u>~~QQD+; zN}YPYG@y^Nf9jgVB?cZpBKiOxIDULG9@F%ors)!sxabbeqE840WidkstkMnmnRCWr zc!-%yj;R`F@D0qlV4Es=FAn{-pU&#F)QcYbeQ23O0#mYpEcmQIGg-tJk)Ts}MI0ih zc5ERXIT}h(iVj0*6W@Aum|k{0Qg-Y^de%+A-sdmn`wskp)l>Hl14_#7~RH@F>0uqoU;P~fODoW!b&vNA6H8H3uEJHQBo2%;}(sFEg>-^k%i8V z3R{>R6(V=6xYb}e7I!Qp&E3{Mt6(VrB{|2AY>ym{oQg>MBIhC_5h()M)vNn6;eO}< zB0IwxE*7>C1j06&R#;4)@h}Y!upBA1hl+WY>#*M!lNFj0R2G`oct?f+juHOSX|VV} zqdyof137`r ze6Qgypsy=1KA5QPt)TYLk@M*HoHa$tTg_L=E3Gxb<)Kxjt0LpXXMR!M3&;Kw;r-9} zW`73Xj3T~W`tQ^h7^gPs-L$rfR{bBa&4-(|E=ox>9%a#<7?exLze8JYlG;84ZP&rt z7X`IjKM&GAAJCwdI2eAD@-9oEe^QnFsBoOdNZlbufep+7mH-D%(}N1TY5A%{L^de9 zFrHWfIUFhEksX9&d!a7WiSvp| zgj7{1F+fzP<w*4zpA3}^^zCh;EV2>C1AgVhJ%C6yMJ zg-sw2yBqmJsIwrM4urdUZm>1D(zn64sccj9_S9DMp0azQUFJh&k6Tuqhqm6Zy7oD( z2PRkB@Md1I-mn-^Ywob9WrZs3>4&GY=@pe~O=Uo(0h4*HP>4oqT8uWFZP{{1pH?$7 zh*e@^M>8RPZM^?rO>L&ZrUXhSZcFy8nN_q__=X?rf+<)6Ou_3AIsurV02mi;qF`w; zT%@G2IWxj2VR3efonxHcJYz~3fM1N}umpxL18C2y7dVN%47j@tKmpnq&85*ez&2{3 zXJwk38)t_@K}8M2J7j%ec5_oEm8@2j5Olb3qX<*UByH(k^S7NRPCoO^U;p;(=`-p6 zXLoJRbyYR&-Ei-ZH~-@P@*n2^F7J5m)qBr(J-9#MKeP9F_amuu`_}dc+B+X}@9gQm z|5x|j@$>@hcx8|^=Xnb7xV(24WISS?>GQ)=iyk9D(5Hh6;xYe4b=Af;b)DgJ?m73K z`)OZa+ldn!+ab0?7KtQHLNMavs)ayUm9ehlOIQT9m5(wtp@RZyMFw3mU@DVXfv&V= zTL_ABSI?WOtQZ!_5g)$z59hT*4grmW#BET7g$(xtdI;im8)1)4ykB-CJED8f6@9-S9Diko4YOaV&ILyYoUYDw*yC_ zr=x!kor?}eN2Bg%QK|_eR3@^#g}3qZ?jZX#WLQCB1{11Ks1^!_EdVPU^|7lBiLHS! zhUAzcJKjjh_b{wjh>sCL^x*n)-$LvR6LB<9Cn^!eF5{qa#5iq?8miF|Wy+7eaF&iu zSTc!g7KUyvCm*oqF&QC>BsIq`#G3n2lo5Dfk|yWKAox^ABxHwymG_AWQ2EC6yXBE( z0qPR?5YSlWa8dvhZ3;C-QAEn3s3#~L(a^4+Zun^1k^HgMPi^=a&+U7&>*ojV{GCtu z(f9ZMVdU2^?<@m6ICYt-;+vAe$0Oz_TY5W&|=^4`xWjN0cKHdoEGO z*uelxK(xPOxXazrF6c8LB^L0?jT~`EgeX86zhwT0tw7kCdAu z=7_~+(){4a!jX@m^gBRAW`GVe^04m#S&6B3C=9qX#vqVf`TVdb`r-S2K2Sy>bNJi= zYLZx8i66j~A@CXq$UukCj$=G`=K|cL7slLCxQ9iT4iI(ps*HL1iP8c{ebt|dt8#_T zR_H8eDO_4ijs&N+6C+So5#qdEfUq$!0;oFAp zDynW6To(cx=MltQWHl88LWLk8!zvS)RKYF`unXf`Fum%k!Wq#x(@Y^W^K})rgbKr+ zaJ29mcm>a>FO=uI(ICJaz#hu;>&Iq3e%BxZuo3}x`gBr0wXtC;1c?u8z97* z;AOP<*Hd)o%cqpgDOUN#5cg>R?KaG(2SNRB^PHj)Fj%;Tl*+Ek>m>xSTLzBX1*$cP z+J2)^W#rm|3xnH(s%lQLhAg&&_h~z=U3Opfi@CGbUu=C1U!^^6txayWHz&0!Ap23U zNwCp#e$|9@^F%#y5J+fDm=sHt2i?R3Q%OvsvGVdrO3h?Xj1C_Q0->@6YjwezjiK>FTMj|~r)pgSGB`1@TZk*Dk8>e=s zl+=LoD5;g5JnY_lpdM|wFmA&#O(N)bofr!+k_YvN6kh121sX-ok5n~9F*S}mvuK?H z&Rhet)Rfj-uBCZO6XSbc-9zj4JbUJ)?vtCk=3f|?{Ee@@UTi!5+;iW(@}c^{^DCCV z@qEX7J)L`_ff-NFdv-uMEEZ3GEZjghzHnoPceJqW9jwZ1@QxZj6RPqE!DPQ3lKmX; zY==}pUA_sFdfa-CooBa{|LW@6*xHKDcu%}v8&I|76)V|VZJn_)xGt(KV9V9z#)9DT zsG4_MywaW4f2CMj{RaQ;;R9MA-A3Bs@wi zxU6YK#~d>X~t;{P_~v(tU+3n zs{avQ?ZHu1XZ)OVpL@?{-*=yP@9t)kYvKk7j|3vMT!dC0LTLe&N*D;VS~?>El}G3Z zjHN&+)S&`Hn6{%urJVwigtwyz6^I>M`jEC$Mk2}ZP$DQ15ZJr@&ek@ju}v;;3_CG2gNlz9^_RT?61-wM!|IObg&~R1}BH^ zksAmDUr)c7;R2GWM}Xyp^&sbgyLeI7)_`na(S?|A^27Dp?ZxJRI!?jQV9Su)ulKcL6@lVPT>u8 zzjTPUlata(^%VV=dP}(Jq6+nvL}utYp!px2k3Mu_s`BWmmALu5wKXX)t&eXHXYN3R&|gF7O4yu~|mH)MVJqCa2XzW!fC?IA3EKO)VxWmqZ5lEL=!`_a65GTt5%VNYOhvZEW8uoZ(MMko! zA0gGCF~SAs04u+6*zmx7x!+sCiqp%)IA!;}yez$JxXG|m^oCe%c~h)Rz4nmWVFfQf z=PiJ|pKOxD;L-rGL0JS1j+(~7LY@nFFs^ePF<3=bu!=M=GSbFrqr(u5$;q_2z+7pz zm>s4x1&o)?qvlmps$U4j*@vh11R2xWta3ro!iNkBFvm${gYvFKI;n5JXZF#?2(V!jx&_r$KnO~9h z%TV{iMXV~gM>cNx#!HhU%ZHiJMGI~p8HWtCm!!ybZ$8}ohw(b z;?g@ zak<=#ni^0woCWy#ESy)+Msy9-P15!f+!(?rlt6Se_zLy;%GCq+^r<1~7_pcdf^!>C z51dQb9@3G#mLy3LUO{m3zGJBWZO8iGwgH`mQ*IfL z>K=`8dB0!w8(u?5yd-}DyDN&n0nfrFa<{_&?LI^@+$}~!3K!*VFo7g-)PC@X;$m@) zD3q!(w`&vg&DLFa*XK?h1@g`9KQBZSIrb>6KwO zxX<3r-1uTY*J;yC-;F+EgAopD?nZB|a*f=@bi}AUOeTZ6eR+0^737#@b~F%HXn=-l zaae&%Q1jO!U5(UYfR|iu)hbjU%;*_^E!S@3KEaVKWk{15B5rb``6HLHaru*HUP?Xo zy{+3@-+t}FF()b=-sOy#>s9z~Y!kgn@IFfra1gT`GG_P<`S`4#J9R1Z^{rhm6d?+j=N*$iSoBx6T^=S(_D|!X~Fq)iLgvwO4kVM+&jbjWwni0fx!S-_Uv)l!HH5X;$a3zGMeIj8bDP>MJ1+Mm%G24a2xV?$_rs$Q>V7 zF@q~S={N}ZB1gwH=01LqJY@Uz2_ZKH=OMzJg$6vpnx(6!$h-ALK<}4{-{|h0HG6x9 zw@p>FOz`_G)k>9%@B8k~XZsxcY@dJ5N$g9U*oGty3E;%3 znNOodV~m9UZa@tYg{cfpglr@Hv?WCp3Kb-3RZu5ELRCgriIp-0DQp533<6nf=Omg&J)lie@S^o<%k+Fh2!| zhWT1+EC^`U!~(WZiq!J3(IkJ0s}{p$I%ELegI^SMyw2^d02dXy$b$E;4ITL1`NE$H zH}ZMv$&+k7)norwyB*cyvn(@LU_mSvCPy0g^VV zzAp@*8fjK9s1de|!|is^07#MQurdYmIduEj^j}M(mYt1Sb`^65tA7UAFk&PH$Dgu{ zL2#Mn5P}a34?<)&z@JXr$$2}mcQZ?+%}LEU4i<_kTAwzm9oMG8Liu!6y;r$DHU;a3 zDOkmlrQ&S(t#EvY!2`iZrd&-J3R5sPu_3o#2`aZut6NqsFt>N@FOx7F(@NrH>XsrY z)<#!Mk*ZR}X>$WWh>s~(K%)Q=V1tO%izrlW!pp?~albZleR)1L^n=62JNcp?HEQ09 zXD`27e1>ct9$EG{3KUmXs8^Xn-CuSat)Ng&@FewTkQmA8=eQ;~&pv%!bV&g?Z!tUX zBeI&TEV+`PhZDe+_`W7(gd2rvrVbF6NsFN=Rm4@LR}EHOt`ck(N~N$M$X2Tk^UYNp zZ0V!2f{BIWaibj*CR0qFY{z8E8s^rJdu6K2J+K>=N9FUfMThXbd{Y+WF{&DND(ON4 z0tVC4zgcTRP-MtKFlA`?4T6HO2~PYDLl_e1N`VM?xr;DPAYtmjODXm$KT!zT;TYpQlsr6xWgi;+e@?V%6jVaJ>bN6PGeIYG7(~6fpb}a_!`T+*QMuunOT| z(8)ssxx!8>rJNTH+-E1{l1uv%r$C4VtX*40PizFL*{0igTic}&3E{dMrwE97m(JY-@ z;@t$4>0rX7gKL#c7HtPNA$va_%|{Y%&D&W~xp>kQ z;V<#j#Sh_TgnyGi$4~PjzsT=hBg@t>&JTtnV;z<*iP(tEr)2sSC=2u-K#ct>ax2O` zg6U$eveGk!OeWKs$&O>!5bTy{NuxaO#yT+YQXPr%PwhB1)p4x!od6H483vrW~MPw z9Te&s6MDQl6y!Bt^r(J5A}5!Xor|oQr#rBi^is{Rpj0Dz zX>?3Q3!Pz{sHa|S@Abp*X zmX?=BeiTdmqZlOn4s9y8~vB;SF*vL;L6~(pb!i;hRBs!oWU*Oc#aD-I>1Z)(r$0`!u~{v7tmU%jW$^hD6v`v zA*@xfduu^24JQ)yNbQ@ow04mct2eDqJu0#rn_aIb^^Ye4vEV8a}P7C4b?Snk7)5!D=8v2NGam30h+f&g%rma{#p3pHUO*} zyd8cvF3bV9Ik)6HqxBYxFYW>I_o)&JfDqNY-}aq8@Y55&dNsFm-w$8jw*Fw|%md`y z-=^|?2a13Hyx2<)&06=tp}x&SKaXsCuy^13(=9W}U;aD#-iFAz=YBn1W`0ozezlP< z!`>pI7zyyfxL;Rv93v)a3TawRJB#X%P)=xFEQTb6fA3)y76Pq>%W4<2<{%ODN@pAb%?E2SuDfl<;1MoH6nfML=kUg;t6NN75X5)y$<#P%B(1a#u* z1_FBI+WoZ+xP!j}YVxY1(NyK7bkit#X8Hl1(%lDGL_9pQ-{>k^r_Len;imFZrFywz z^Y_DV7iY9CSO6wsq2^Sb&p-ZA<6eK&5Z3i8FweT=A7(Jz?}j>WrF{qOSKYp#ozqUk z{$cVL{qQ|bM>;$3E;GStI}Mpxz#NFNf`07sf%+6uX9eNaVLczuAhj@qO)ciSW}hic z8R+ED^|)5`*rCJXW@zJa-Kvw(*daU`=v+sapN41aWg{?oU@kUSm_4Ri-T*+B??Z7E z$sMPZj)n-Pwtn@w<5jg1Ap%AfZn^_Hwn{gjNjF~&H~*nF4Eqx80Uz}+eLshgpt%x| z@Yta+w_5Pm1b;^G-}3E>5T4*3uqCl=imIpJG2au4$CT*PAo^5OeNAvp6`rOT%r0At z3{_FUzB^d2o?&{NX^JWWi(A{_`FuG%dij1K(y1ntsK(LJCU2ySeTN*_i1&oX1c4(f zVodMo(6AE??8#__?Z`Kl*+!r}&S!F}nAun{bF35m6aM-is()YeeDCAWKJnzEYrd)- z9{-v0^IO09`1!Uy4=#Hh^cfmWt7s=#3TCzzu7{5WMeY^5i#^4Uisy@3d!{4T(cC^+ zP4_mLiH6>m!i)r8pV*WTiS2e%fz4NVkHVGhT-e5>lAFfzcYQ>|MPr>o#dh8Ku4r-B zyPMpt?iE*ahxqaRR<Vx`wx~f0!h`=UAx8we`W391ct)T@z(~c8p$67;q z@Gzz=$(w_U%}tOuo6!0CrV5Vi&J5K_4UN)`BNPo$J1b)R_=|gQ4dAqdZCyRWUk03> zgw8!cs&Fl|*NPvDUkfE`2(p!SGMTajH&Q%cNXvC^G7`bS3Uy~vi=9b*E@je*e93s& zfj^#+F4%!#VF1I&!$uYl8+klwr16x2<7*y)Fp`LZk-#WMBSC6#Bjz-t+z|LY@E7|l z{2u=vPPA=Ya%A4mGJcvfa__E|$=fU6C@dah-VZ;ki0+kJ&%VtEYpbrlyi9yh_m%P;tS#OecDqjK^f-Oad(JWEilbA7 zsVes%_0uTzNy@vVq!ZuU7T(v+Q?6a)Y%qV__9lBPwAc`TcE8jEYv}eF!rO{f!$P1j z2rRA=;#Q;^wD_DV2md)tW5mVay(}JDJyxHkSP(P>Em1s-sKm9XpxlszC_3V^R}@X@ad9woEFW}#e zFXAeM*Fr?JwpM=x5Ow*|usuwzPxYkwQvE3nkra-!MZq-^g>A|HFJ|HSU zF7WP81TjLKj2GUz>ED%(h!~gv7A5z?5-iL97#3O$QOIVk1b7*zU>T{B^zk+_F~Okt zizT+{j@hRbCfZH)AA`-`8ZL?A($3Q4(?5y#jH`r za;V*RIqvdUxjf-u&}>(!(Hm92q2wB=F7B)F=3%#|wM-YMF|^}3K%f|;Grlasf){BJ zEwvRzAAgE3{p*d|U#i2k1+ZInX!pwg!!@uy)h)MK|Ik&Fjijmd#=)`1BuS9`Z^$+INoS+MzGHptJ&hxx_% zzPy&_c3=f@BI3>&i#z9L+&Pg6x5$Je{^h24+9Bj8(vX@vQIOd7qc~@Fj@A>APL&+P z?c!+_-jaHvi+NhZL?W;tgDfRt&O{n;)_kMFzr&aO?PBfy>Ypo+hk@_zc(*pL&adE* zv!%A{&D#ULzg+&4R;3BZ11fa@G;EBtKEvJ*v+a2>i272aIK>0&AA$H+v`Je&n=#NF5o04~?huDDn`Q5^hHbm8R-NrN(t*GN;Y%nnEd2wKqE(ns@tO^#4eV_|YR80bzs(4gOky-7VIK#QG2hZaa6B zF~h|n!^Q6n7r(=!XT&f}5{-E%5llH8^C?X^1$P~np&)KzW)uW?T#r)EGXDlAQ4nNt z9;KQ+9^7(uYz}4fL;?~FEOs;Cec#nMI)`e|JYThFRIDNNH8+6sQSMnO$9jr0HRGI= zlX-&fp;MI7%MeJIymrib?U?o2G3&KsVvk|TnDqz4p|^2fb1ZIrs$v$%y*VatK0!cU zRQ>(4Xm$8?`{L?A73xirOpt(qN6Jhc7^K)?1`Hvc5?=p3L@XEw1LE*pWwP>*%FW8* zc!g=5BS0>_SGoP(-|w)hdIpxl&dSr3H!3ezo?_tGeRrSme&xf;pP>_yU_x)@9M)Qd zDes(g3O0}~>5sKqn>)W|{j zL35_f#piD0m8#=Y2DngAxlmBKP(Y^R`brn;zv9TF^VI7+IO`e+K{^oK&=X86w721x zD`V--#cj|w(FW;^?enuqZ4)Q8eK?^V#R+W_*Kdarfo!fsY?nGzLlLpy&q^V%A5;O!lM1@k*+ethO{J{&3^QGt*nQ zR{nY8)W>^&34T}yKY@&Ie)x@dube)4{$I$alk9L^%n_Y5ku-F;-FkLWR#+{|Mp~9) zMj@Tnn+n7eDd?(|k$kvhNya^t!np8D5=cj58FaFBi2j(@iB_jFbXC<#(mXZ0b=D2y z-fKWKLrXC6-9D3rELSkN{VZ;ZWOZ?Y+!Gb0o>wmM>XNSt{`#uS0`M;v#y;8c*}1XL z2$fHFobf?XNCvYso5-17%K=+phiF60fuzC?Ay2>|-muu{K(o(rNL)=hpvXoao3F3R z7DyPZ=c|O_@v=iM;xVIOZ`kqd7&@hZ>4N;S~7F)RxvEe2bY z!sC_o$HmR^AbxX3yXw0qAx027C%dr)t5gHXI~eJ#v5v*U;p@bu_ufIe-Np zx=ncZDRy61zgSPaCM!l(zzVT(R1mnV7eE*OBCwZKps3h*hf~4{!jB83yb?G~cxp6p zvqlp#rwOx06PI}j(z;J$!3{Tq_lVPedW617e@ADSy1z%|b&NrT847f5P%bFQRa{^w z_-vfCW)#pBh%2C&Mjw}6#;kF3M|nYSbM?=x0jGwsYVGmrLp#uin+wUR2VkF~85F$9 z09eA+ormUsbLg?(elPT0p;ye!KU3+4&sE-mb0EN-yLWC0cNv;Kz|b?s(R7fZDcrlm z(0>cd$Wl1r_T(jCOU?$(Xx1n#D)pDPl*UVMmQ+%Tmll`SmG+b-N;9SZl;qBEZ*pJw z#pI#z50jp*ViA{#n_EOwzh4h{Mv8^je5kcGPbJBZ*HXc6g#3QP4u`W=C}dfoL^7F8 zr9-Jyno312XNQ>Ni(w^HqJh&rwc>d^@ch-FxUbwX%yHR5EKMpd0XVicI$Ax#UA4Z%jVVc zT;0_5-R)!X)v{^#1lV8oM9|IQo1JI-jH{So_Cr3}Q~eS9JTKi>@PExX&(4k2z|VpO z5f51zl*?me3<3-v*t=M?@+q&!%b-7O2h)@x2CI*h$4k?}?j^Zgp1sp4ZȠNF5Y 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