summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/perl/lib
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2003-12-03 02:43:04 +0000
committermillert <millert@openbsd.org>2003-12-03 02:43:04 +0000
commit8500990981f885cbe5e6a4958549cacc238b5ae6 (patch)
tree459d709ffae0599d6d549087d270bfb6d2fcf5e6 /gnu/usr.bin/perl/lib
parentsync (diff)
downloadwireguard-openbsd-8500990981f885cbe5e6a4958549cacc238b5ae6.tar.xz
wireguard-openbsd-8500990981f885cbe5e6a4958549cacc238b5ae6.zip
perl 5.8.2 from CPAN
Diffstat (limited to 'gnu/usr.bin/perl/lib')
-rw-r--r--gnu/usr.bin/perl/lib/Attribute/Handlers.pm18
-rw-r--r--gnu/usr.bin/perl/lib/Attribute/Handlers/Changes8
-rw-r--r--gnu/usr.bin/perl/lib/Attribute/Handlers/README28
-rw-r--r--gnu/usr.bin/perl/lib/Attribute/Handlers/t/multi.t17
-rw-r--r--gnu/usr.bin/perl/lib/AutoLoader.t142
-rw-r--r--gnu/usr.bin/perl/lib/Benchmark.t148
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/META.yml11
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/PAUSE2003.pub31
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/SIGNATURE45
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/bin/cpan203
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/t/Nox.t9
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/t/loadme.t5
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/t/mirroredby.t1
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/t/signature.t16
-rw-r--r--gnu/usr.bin/perl/lib/CPAN/t/vcmp.t5
-rw-r--r--gnu/usr.bin/perl/lib/Class/Struct.t100
-rw-r--r--gnu/usr.bin/perl/lib/Config.t61
-rw-r--r--gnu/usr.bin/perl/lib/Digest.pm10
-rw-r--r--gnu/usr.bin/perl/lib/Digest.t9
-rw-r--r--gnu/usr.bin/perl/lib/DirHandle.t13
-rw-r--r--gnu/usr.bin/perl/lib/English.t8
-rw-r--r--gnu/usr.bin/perl/lib/Exporter.t20
-rw-r--r--gnu/usr.bin/perl/lib/Exporter/Heavy.pm52
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/Changes473
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/Command/MM.pm208
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/Constant.pm188
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/Installed.pm55
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/Liblist/Kid.pm78
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MANIFEST.SKIP28
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/META.yml14
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_Any.pm763
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_BeOS.pm30
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm135
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_DOS.pm13
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_MacOS.pm396
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_NW5.pm239
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_UWIN.pm15
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MM_Win95.pm174
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/FAQ.pod257
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/Tutorial.pod179
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/bytes.pm39
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/vmsish.pm40
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/NOTES102
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/PATCHING180
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/README57
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/TODO76
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/00compile.t42
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/00setup_dummy.t30
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Command.t250
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Constant.t969
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Embed.t12
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/INST.t2
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/INST_PREFIX.t112
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Install.t112
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Installed.t18
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Liblist.t36
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_Any.t33
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_BeOS.t15
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_Cygwin.t73
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_NW5.t25
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_OS2.t26
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_Unix.t33
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_VMS.t4
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/MM_Win32.t109
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/Manifest.t68
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/basic.t233
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/bytes.t30
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/hints.t8
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/oneliner.t51
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/postamble.t65
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/prefixify.t10
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/prereq_print.t66
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/prompt.t56
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/recurs.t113
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/split_command.t66
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/vmsish.t17
-rw-r--r--gnu/usr.bin/perl/lib/ExtUtils/t/zz_cleanup_dummy.t6
-rw-r--r--gnu/usr.bin/perl/lib/File/Find/t/find.t36
-rw-r--r--gnu/usr.bin/perl/lib/File/Path.t10
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec.pm44
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Cygwin.pm72
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Epoc.pm25
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Functions.pm6
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Mac.pm56
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/OS2.pm131
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Unix.pm122
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/VMS.pm97
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/Win32.pm144
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/t/Functions.t21
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/t/Spec.t214
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/t/crossplatform.t96
-rw-r--r--gnu/usr.bin/perl/lib/File/Spec/t/rel2abs2rel.t37
-rw-r--r--gnu/usr.bin/perl/lib/File/Temp/t/mktemp.t11
-rw-r--r--gnu/usr.bin/perl/lib/File/Temp/t/object.t107
-rw-r--r--gnu/usr.bin/perl/lib/File/Temp/t/posix.t12
-rw-r--r--gnu/usr.bin/perl/lib/File/Temp/t/security.t16
-rw-r--r--gnu/usr.bin/perl/lib/File/Temp/t/tempfile.t19
-rw-r--r--gnu/usr.bin/perl/lib/FileCache/t/01open.t26
-rw-r--r--gnu/usr.bin/perl/lib/FileCache/t/02maxopen.t36
-rw-r--r--gnu/usr.bin/perl/lib/FileCache/t/03append.t47
-rw-r--r--gnu/usr.bin/perl/lib/FileCache/t/04twoarg.t24
-rw-r--r--gnu/usr.bin/perl/lib/FileCache/t/05override.t21
-rw-r--r--gnu/usr.bin/perl/lib/FileHandle.t4
-rw-r--r--gnu/usr.bin/perl/lib/Getopt/Long/CHANGES122
-rw-r--r--gnu/usr.bin/perl/lib/Getopt/Long/README24
-rw-r--r--gnu/usr.bin/perl/lib/Getopt/Long/t/gol-basic.t10
-rw-r--r--gnu/usr.bin/perl/lib/Getopt/Long/t/gol-compat.t6
-rw-r--r--gnu/usr.bin/perl/lib/Getopt/Long/t/gol-linkage.t6
-rw-r--r--gnu/usr.bin/perl/lib/Getopt/Long/t/gol-oo.t10
-rw-r--r--gnu/usr.bin/perl/lib/Hash/Util.pm56
-rw-r--r--gnu/usr.bin/perl/lib/Hash/Util.t81
-rw-r--r--gnu/usr.bin/perl/lib/I18N/LangTags.pm28
-rw-r--r--gnu/usr.bin/perl/lib/I18N/LangTags/ChangeLog23
-rw-r--r--gnu/usr.bin/perl/lib/I18N/LangTags/List.pm247
-rw-r--r--gnu/usr.bin/perl/lib/I18N/LangTags/README2
-rw-r--r--gnu/usr.bin/perl/lib/I18N/LangTags/t/01test.t101
-rw-r--r--gnu/usr.bin/perl/lib/I18N/LangTags/t/02decency.t30
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Codes/t/languages.t2
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Country.pm3
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Currency.pm3
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Language.pm7
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext.pm358
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext.pod35
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/ChangeLog30
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/Guts.pm295
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/GutsLoader.pm47
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/README9
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/t/00about.t29
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/t/01make.t34
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/t/02get.t69
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/t/03http.t102
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Maketext/t/90utf8.t39
-rw-r--r--gnu/usr.bin/perl/lib/Locale/Script.pm3
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigFloat.pm1107
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/Calc.pm762
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/Scalar.pm242
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbf.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbi.t4
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mif.t4
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.inc237
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bigintc.t209
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.inc244
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/bigints.t126
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/biglog.t133
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/calling.t12
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/config.t94
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/constant.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/inf_nan.t6
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/mbi_rand.t31
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.inc368
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.t39
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf0.t37
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf1.t37
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfa.t37
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfi.t37
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfn.t37
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfw.t45
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/require.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbf.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbi.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mif.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/trap.t81
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.inc22
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/use_mbfw.t52
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigInt/t/with_sub.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat.pm566
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/big_ap.t100
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/bigrat.t49
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.inc69
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.t2
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/bigratup.t38
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/requirer.t41
-rw-r--r--gnu/usr.bin/perl/lib/Math/BigRat/t/trap.t86
-rw-r--r--gnu/usr.bin/perl/lib/Math/Trig.t31
-rw-r--r--gnu/usr.bin/perl/lib/Memoize/t/errors.t3
-rw-r--r--gnu/usr.bin/perl/lib/NEXT.pm268
-rw-r--r--gnu/usr.bin/perl/lib/NEXT/Changes30
-rw-r--r--gnu/usr.bin/perl/lib/NEXT/README24
-rw-r--r--gnu/usr.bin/perl/lib/NEXT/t/actual.t29
-rw-r--r--gnu/usr.bin/perl/lib/NEXT/t/actuns.t23
-rw-r--r--gnu/usr.bin/perl/lib/NEXT/t/unseen.t38
-rw-r--r--gnu/usr.bin/perl/lib/Net/ChangeLog.libnet185
-rw-r--r--gnu/usr.bin/perl/lib/Net/Cmd.pm119
-rw-r--r--gnu/usr.bin/perl/lib/Net/Domain.pm12
-rw-r--r--gnu/usr.bin/perl/lib/Net/FTP/A.pm6
-rw-r--r--gnu/usr.bin/perl/lib/Net/POP3.pm23
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/Changes139
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/110_icmp_inst.t2
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/150_syn_inst.t22
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/190_alarm.t54
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/200_ping_tcp.t4
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/250_ping_hires.t6
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/300_ping_stream.t45
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/400_ping_syn.t101
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/410_syn_host.t105
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/450_service.t186
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/500_ping_icmp.t29
-rw-r--r--gnu/usr.bin/perl/lib/Net/Ping/t/510_ping_udp.t22
-rw-r--r--gnu/usr.bin/perl/lib/Net/README.libnet2
-rw-r--r--gnu/usr.bin/perl/lib/Net/SMTP.pm147
-rw-r--r--gnu/usr.bin/perl/lib/Net/hostent.t4
-rw-r--r--gnu/usr.bin/perl/lib/Net/libnetFAQ.pod6
-rw-r--r--gnu/usr.bin/perl/lib/PerlIO.pm111
-rw-r--r--gnu/usr.bin/perl/lib/PerlIO/via/QuotedPrint.pm15
-rw-r--r--gnu/usr.bin/perl/lib/PerlIO/via/t/QuotedPrint.t18
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Checker.pm78
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Find.pm16
-rw-r--r--gnu/usr.bin/perl/lib/Pod/ParseUtils.pm35
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Parser.pm18
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc.pm1743
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/BaseTo.pm28
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/GetOptsOO.pm106
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToChecker.pm72
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToMan.pm175
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToNroff.pm100
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToPod.pm90
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToRtf.pm85
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToText.pm91
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToTk.pm129
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/ToXml.pm63
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/t/checkerbasic.t9
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/t/perldocbasic.t9
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Perldoc/t/textbasic.t9
-rw-r--r--gnu/usr.bin/perl/lib/Pod/PlainText.pm700
-rw-r--r--gnu/usr.bin/perl/lib/Pod/Usage.pm7
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/Functions.t11
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/basic.t4
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/htmlview.pod2
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/htmlview.t18
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/man.t49
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/pod2html-lib.pl46
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/pod2latex.t392
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/text-options.t144
-rw-r--r--gnu/usr.bin/perl/lib/Pod/t/utils.t10
-rw-r--r--gnu/usr.bin/perl/lib/Shell.t70
-rw-r--r--gnu/usr.bin/perl/lib/Switch.pm22
-rw-r--r--gnu/usr.bin/perl/lib/Symbol.t12
-rw-r--r--gnu/usr.bin/perl/lib/Term/ANSIColor/ChangeLog29
-rw-r--r--gnu/usr.bin/perl/lib/Term/ANSIColor/README59
-rw-r--r--gnu/usr.bin/perl/lib/Test.pm448
-rw-r--r--gnu/usr.bin/perl/lib/Test/Builder.pm168
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/Changes64
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/Straps.pm154
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/t/assert.t4
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/t/callback.t5
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/t/pod.t23
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/t/strap-analyze.t28
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/t/strap.t28
-rw-r--r--gnu/usr.bin/perl/lib/Test/Harness/t/test-harness.t66
-rw-r--r--gnu/usr.bin/perl/lib/Test/More.pm11
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple.pm2
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/Changes20
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/details.t93
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/exit.t15
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/fork.t25
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/has_plan.t23
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/has_plan2.t30
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/ok_obj.t29
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/plan.t2
-rw-r--r--gnu/usr.bin/perl/lib/Test/Simple/t/threads.t2
-rw-r--r--gnu/usr.bin/perl/lib/Test/Tutorial.pod20
-rw-r--r--gnu/usr.bin/perl/lib/Test/t/fail.t11
-rw-r--r--gnu/usr.bin/perl/lib/Test/t/mix.t10
-rw-r--r--gnu/usr.bin/perl/lib/Test/t/todo.t21
-rw-r--r--gnu/usr.bin/perl/lib/Text/Abbrev.t10
-rw-r--r--gnu/usr.bin/perl/lib/Text/Balanced.pm229
-rw-r--r--gnu/usr.bin/perl/lib/Text/Balanced/Changes38
-rw-r--r--gnu/usr.bin/perl/lib/Text/Balanced/README11
-rw-r--r--gnu/usr.bin/perl/lib/Text/Balanced/t/extcbk.t6
-rw-r--r--gnu/usr.bin/perl/lib/Text/Balanced/t/extvar.t3
-rw-r--r--gnu/usr.bin/perl/lib/Text/Balanced/t/gentag.t5
-rw-r--r--gnu/usr.bin/perl/lib/Text/TabsWrap/t/wrap.t8
-rw-r--r--gnu/usr.bin/perl/lib/Thread/Semaphore.pm17
-rw-r--r--gnu/usr.bin/perl/lib/Tie/Array.pm6
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File.pm705
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/00_version.t3
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/01_gen.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/04_splice.t1
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/05_size.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/09_gen_rs.t25
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/16_handle.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/19_cache.t8
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/21_win32.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/24_cache_loop.t1
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/25_gen_nocache.t1
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/26_twrite.t2
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/27_iwrite.t235
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/28_mtwrite.t295
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/29_downcopy.t363
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/29a_upcopy.t211
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/30_defer.t79
-rw-r--r--gnu/usr.bin/perl/lib/Tie/File/t/42_offset.t74
-rw-r--r--gnu/usr.bin/perl/lib/Tie/RefHash.t12
-rw-r--r--gnu/usr.bin/perl/lib/Time/Local.t39
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate.pm1578
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/Changes78
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/README34
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/keys.txt2788
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/contract.t146
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/hangtype.t56
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/hangul.t234
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/index.t403
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/normal.t205
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/test.t489
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/trailwt.t229
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/variable.t108
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/Collate/t/version.t61
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/UCD.pm41
-rw-r--r--gnu/usr.bin/perl/lib/Unicode/UCD.t39
-rw-r--r--gnu/usr.bin/perl/lib/Win32.pod109
-rw-r--r--gnu/usr.bin/perl/lib/attributes.pm8
-rw-r--r--gnu/usr.bin/perl/lib/base/t/base.t80
-rw-r--r--gnu/usr.bin/perl/lib/base/t/fields-base.t196
-rw-r--r--gnu/usr.bin/perl/lib/base/t/fields.t112
-rw-r--r--gnu/usr.bin/perl/lib/bigint.pm58
-rw-r--r--gnu/usr.bin/perl/lib/bignum.pm181
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/bigint.t20
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/bignum.t27
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/bigrat.t26
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/biinfnan.t22
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/bn_lite.t30
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/bninfnan.t39
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/br_lite.t30
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/brinfnan.t22
-rw-r--r--gnu/usr.bin/perl/lib/bignum/t/infnan.inc35
-rw-r--r--gnu/usr.bin/perl/lib/bigrat.pm46
-rw-r--r--gnu/usr.bin/perl/lib/bytes.pm26
-rw-r--r--gnu/usr.bin/perl/lib/bytes.t44
-rw-r--r--gnu/usr.bin/perl/lib/bytes_heavy.pl32
-rw-r--r--gnu/usr.bin/perl/lib/charnames.pm386
-rw-r--r--gnu/usr.bin/perl/lib/charnames.t278
-rw-r--r--gnu/usr.bin/perl/lib/constant.t4
-rw-r--r--gnu/usr.bin/perl/lib/dumpvar.t311
-rw-r--r--gnu/usr.bin/perl/lib/fields.pm384
-rw-r--r--gnu/usr.bin/perl/lib/filetest.pm11
-rw-r--r--gnu/usr.bin/perl/lib/filetest.t41
-rw-r--r--gnu/usr.bin/perl/lib/h2xs.t28
-rw-r--r--gnu/usr.bin/perl/lib/if.pm12
-rw-r--r--gnu/usr.bin/perl/lib/if.t7
-rw-r--r--gnu/usr.bin/perl/lib/lib.t5
-rw-r--r--gnu/usr.bin/perl/lib/lib_pm.PL43
-rw-r--r--gnu/usr.bin/perl/lib/locale.t15
-rw-r--r--gnu/usr.bin/perl/lib/open.pm22
-rw-r--r--gnu/usr.bin/perl/lib/open.t13
-rw-r--r--gnu/usr.bin/perl/lib/overload.t33
-rw-r--r--gnu/usr.bin/perl/lib/sort.pm106
-rw-r--r--gnu/usr.bin/perl/lib/sort.t23
-rw-r--r--gnu/usr.bin/perl/lib/strict.t22
-rw-r--r--gnu/usr.bin/perl/lib/unicore/ArabLink.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicore/ArabLnkGrp.pl12
-rw-r--r--gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt56
-rw-r--r--gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt10
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Bidirectional.pl130
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Blocks.pl15
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Blocks.txt24
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Canonical.pl103
-rw-r--r--gnu/usr.bin/perl/lib/unicore/CaseFolding.txt14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Category.pl143
-rw-r--r--gnu/usr.bin/perl/lib/unicore/CombiningClass.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt8
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Decomposition.pl91
-rw-r--r--gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt1234
-rw-r--r--gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt841
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Lbrk.pl153
-rw-r--r--gnu/usr.bin/perl/lib/unicore/LineBreak.txt1556
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Name.pl1226
-rw-r--r--gnu/usr.bin/perl/lib/unicore/NamesList.txt2124
-rw-r--r--gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt43
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Number.pl76
-rw-r--r--gnu/usr.bin/perl/lib/unicore/PropList.txt125
-rw-r--r--gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt181
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Properties24
-rw-r--r--gnu/usr.bin/perl/lib/unicore/PropertyAliases.txt32
-rw-r--r--gnu/usr.bin/perl/lib/unicore/README.perl18
-rw-r--r--gnu/usr.bin/perl/lib/unicore/ReadMe.txt25
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Scripts.pl72
-rw-r--r--gnu/usr.bin/perl/lib/unicore/Scripts.txt154
-rw-r--r--gnu/usr.bin/perl/lib/unicore/SpecialCasing.txt23
-rw-r--r--gnu/usr.bin/perl/lib/unicore/StandardizedVariants.txt114
-rw-r--r--gnu/usr.bin/perl/lib/unicore/To/Digit.pl40
-rw-r--r--gnu/usr.bin/perl/lib/unicore/To/Fold.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/To/Lower.pl5
-rw-r--r--gnu/usr.bin/perl/lib/unicore/To/Title.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicore/To/Upper.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/UnicodeData.txt1330
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Alnum.pl111
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Alpha.pl74
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Alphabet.pl66
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Arabic.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Assigned.pl118
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Bengali.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiAL.pl9
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiBN.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiET.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiL.pl54
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiNSM.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiON.pl38
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiR.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/BidiWS.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Blank.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Braille.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/C.pl119
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Cf.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Cn.pl118
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Cntrl.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Common.pl67
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Compat.pl22
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Cypriot.pl18
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Cyrillic.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCcircle.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCcompat.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCfont.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCsquare.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCsub.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCsuper.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/DCvertic.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Dash.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Deprecat.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Deseret.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Devanaga.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Diacriti.pl11
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Digit.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Graph.pl133
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Grapheme.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Greek.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Gujarati.pl5
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Gurmukhi.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/IdContin.pl77
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/IdStart.pl51
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InAegean.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InCyprio.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InKhmerS.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InLimbu.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InLinea2.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InLinear.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InMisce3.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InMisce4.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InMisce5.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InOsmany.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InPhonet.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InShavia.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InTaiLe.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InTaiXua.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InUgarit.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InVaria2.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/InYijing.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Kannada.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/L.pl51
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/L_.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Latin.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Limbu.pl16
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/LinearB.pl19
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Ll.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Lm.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Lo.pl35
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Lower.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Lowercas.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Lu.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/M.pl17
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Math.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Mc.pl7
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Mn.pl17
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/N.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Nd.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/No.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Oriya.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Osmanya.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/OtherAlp.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/OtherDef.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/OtherGra.pl15
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/OtherIdS.pl15
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/OtherLow.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/OtherMat.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/P.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Pc.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Pd.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Pe.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Po.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Print.pl137
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Ps.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Punct.pl10
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/S.pl39
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Sc.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Shavian.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Sk.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/So.pl33
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/SoftDott.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Space.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/SpacePer.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Syriac.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/TaiLe.pl14
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Terminal.pl3
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Ugaritic.pl13
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Upper.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Uppercas.pl4
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/WhiteSpa.pl2
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Word.pl90
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Yi.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Z.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/Zs.pl1
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/_CaseIgn.pl17
-rw-r--r--gnu/usr.bin/perl/lib/unicore/lib/_CombAbo.pl6
-rw-r--r--gnu/usr.bin/perl/lib/unicore/mktables45
-rw-r--r--gnu/usr.bin/perl/lib/unicore/version2
-rw-r--r--gnu/usr.bin/perl/lib/utf8.pm108
-rw-r--r--gnu/usr.bin/perl/lib/utf8_heavy.pl83
-rw-r--r--gnu/usr.bin/perl/lib/vmsish.pm4
-rw-r--r--gnu/usr.bin/perl/lib/vmsish.t29
-rw-r--r--gnu/usr.bin/perl/lib/warnings.pm24
-rw-r--r--gnu/usr.bin/perl/lib/warnings.t5
513 files changed, 38221 insertions, 9207 deletions
diff --git a/gnu/usr.bin/perl/lib/Attribute/Handlers.pm b/gnu/usr.bin/perl/lib/Attribute/Handlers.pm
index 4199d9db013..b41a332a1c6 100644
--- a/gnu/usr.bin/perl/lib/Attribute/Handlers.pm
+++ b/gnu/usr.bin/perl/lib/Attribute/Handlers.pm
@@ -2,7 +2,7 @@ package Attribute::Handlers;
use 5.006;
use Carp;
use warnings;
-$VERSION = '0.77';
+$VERSION = '0.78';
# $DB::single=1;
my %symcache;
@@ -103,12 +103,12 @@ sub AUTOLOAD {
my ($class) = $AUTOLOAD =~ m/(.*)::/g;
$AUTOLOAD =~ m/_ATTR_(.*?)_(.*)/ or
croak "Can't locate class method '$AUTOLOAD' via package '$class'";
- croak "Attribute handler '$3' doesn't handle $2 attributes";
+ croak "Attribute handler '$2' doesn't handle $1 attributes";
}
sub DESTROY {}
-my $builtin = qr/lvalue|method|locked/;
+my $builtin = qr/lvalue|method|locked|unique|shared/;
sub _gen_handler_AH_() {
return sub {
@@ -137,7 +137,8 @@ sub _gen_handler_AH_() {
%lastattr=(pkg=>$pkg,ref=>$ref,type=>$data);
}
else {
- my $handler = $pkg->can($attr);
+ my $type = ref $ref;
+ my $handler = $pkg->can("_ATTR_${type}_${attr}");
next unless $handler;
my $decl = [$pkg, $ref, $attr, $data,
$raw{$handler}, $phase{$handler}];
@@ -217,8 +218,8 @@ Attribute::Handlers - Simpler definition of attribute handlers
=head1 VERSION
-This document describes version 0.77 of Attribute::Handlers,
-released June 8, 2002.
+This document describes version 0.78 of Attribute::Handlers,
+released October 5, 2002.
=head1 SYNOPSIS
@@ -602,11 +603,14 @@ C<__CALLER__>, which may be specified as the qualifier of an attribute:
package Tie::Me::Kangaroo:Down::Sport;
- use Attribute::Handlers autotie => { __CALLER__::Roo => __PACKAGE__ };
+ use Attribute::Handlers autotie => { '__CALLER__::Roo' => __PACKAGE__ };
This causes Attribute::Handlers to define the C<Roo> attribute in the package
that imports the Tie::Me::Kangaroo:Down::Sport module.
+Note that it is important to quote the __CALLER__::Roo identifier because
+a bug in perl 5.8 will refuse to parse it and cause an unknown error.
+
=head3 Passing the tied object to C<tie>
Occasionally it is important to pass a reference to the object being tied
diff --git a/gnu/usr.bin/perl/lib/Attribute/Handlers/Changes b/gnu/usr.bin/perl/lib/Attribute/Handlers/Changes
index d2dcce68392..593d190b63a 100644
--- a/gnu/usr.bin/perl/lib/Attribute/Handlers/Changes
+++ b/gnu/usr.bin/perl/lib/Attribute/Handlers/Changes
@@ -92,3 +92,11 @@ Revision history for Perl extension Attribute::Handlers
- [#15945] Do not warn about too late CHECK and INIT block if
A::H is pulled in using a require.
+0.78 Sat Oct 5 07:18:09 CEST 2002
+
+ - [#17940] Includes :unique and :shared in the builtin types
+
+ - From perl 5.8 { __CALLER__::foo => __PACKAGE } is missparsed,
+ the proper approach is to use { '__CALLER__::foo' => __PACKAGE }.
+ The documentation is updated to reflect this.
+ Reported by Dave Cross
diff --git a/gnu/usr.bin/perl/lib/Attribute/Handlers/README b/gnu/usr.bin/perl/lib/Attribute/Handlers/README
index 2931c352380..b5247e9fda8 100644
--- a/gnu/usr.bin/perl/lib/Attribute/Handlers/README
+++ b/gnu/usr.bin/perl/lib/Attribute/Handlers/README
@@ -1,5 +1,5 @@
==============================================================================
- Release of version 0.77 of Attribute::Handlers
+ Release of version 0.78 of Attribute::Handlers
==============================================================================
@@ -44,32 +44,20 @@ AUTHOR
Damian Conway (damian@conway.org)
COPYRIGHT
- Copyright (c) 2001, Damian Conway. All Rights Reserved.
+ Copyright (c) 2001-2002, Damian Conway. All Rights Reserved.
This module is free software. It may be used, redistributed
and/or modified under the same terms as Perl itself.
==============================================================================
-0.77 Sat Jun 8 22:58:56 CEST 2002
-
- - Since Attribute::Handlers now is core, I will refer to changes
- with their patch number, please read Porting/repository.pod from
- your a perl tarball for more information.
-
- - Brought up to date with perl 5.8RC1 version
- will be 5.8 if no more changes come in
-
- - [#13686] This changes the behaviour of lexical attributes.
- Prior to this lexical attributes were done at a compile time,
- and they would loose their attribute on the next run over them.
- Now perl 5.8 calls the attribute handler runtime whenever it hits my.
-
- - [#14448] Fixes cases with too high refcounts on lexical attributes
-
- - [#15945] Do not warn about too late CHECK and INIT block if
- A::H is pulled in using a require.
+0.78 Sat Oct 5 07:18:09 CEST 2002
+
+ - [#17940] Includes :unique and :shared in the builtin types
+ - From perl 5.8 { __CALLER__::foo => __PACKAGE } is missparsed,
+ the proper approach is to use { '__CALLER__::foo' => __PACKAGE }.
+ The documentation is updated to reflect this.
==============================================================================
diff --git a/gnu/usr.bin/perl/lib/Attribute/Handlers/t/multi.t b/gnu/usr.bin/perl/lib/Attribute/Handlers/t/multi.t
index cddab911532..db00b1c9332 100644
--- a/gnu/usr.bin/perl/lib/Attribute/Handlers/t/multi.t
+++ b/gnu/usr.bin/perl/lib/Attribute/Handlers/t/multi.t
@@ -184,3 +184,20 @@ ok(1,52 ,"# Skip, no difference between lexical handlers and normal handlers pri
ok( $match, 52 );
}
+
+# The next two check for the phase invariance that Marcel spotted.
+# Subject: Attribute::Handlers phase variance
+# Message-Id: <54EDDB80-FD75-11D6-A18D-00039379E28A@noug.at>
+
+my ($code_applied, $scalar_applied);
+sub Scotty :ATTR(CODE,BEGIN) { $code_applied = $_[5] }
+{
+no warnings 'redefine';
+sub Scotty :ATTR(SCALAR,CHECK) { $scalar_applied = $_[5] }
+}
+
+sub warp_coil :Scotty {}
+my $photon_torpedo :Scotty;
+
+ok( $code_applied eq 'BEGIN', 53, "# phase variance" );
+ok( $scalar_applied eq 'CHECK', 54 );
diff --git a/gnu/usr.bin/perl/lib/AutoLoader.t b/gnu/usr.bin/perl/lib/AutoLoader.t
index f2fae7f309d..408b281126e 100644
--- a/gnu/usr.bin/perl/lib/AutoLoader.t
+++ b/gnu/usr.bin/perl/lib/AutoLoader.t
@@ -1,26 +1,29 @@
-#!./perl
+#!./perl -w
BEGIN {
chdir 't' if -d 't';
- if ($^O eq 'MacOS') {
- $dir = ":auto-$$";
- $sep = ":";
- } else {
- $dir = "auto-$$";
- $sep = "/";
- }
- @INC = $dir;
- push @INC, '../lib';
+ @INC = '../lib';
}
-print "1..11\n";
+use strict;
+use File::Spec;
+use File::Path;
+
+my $dir;
+BEGIN
+{
+ $dir = File::Spec->catdir( "auto-$$" );
+ unshift @INC, $dir;
+}
+
+use Test::More tests => 14;
# First we must set up some autoloader files
-mkdir $dir, 0755 or die "Can't mkdir $dir: $!";
-mkdir "$dir${sep}auto", 0755 or die "Can't mkdir: $!";
-mkdir "$dir${sep}auto${sep}Foo", 0755 or die "Can't mkdir: $!";
+my $fulldir = File::Spec->catdir( $dir, 'auto', 'Foo' );
+mkpath( $fulldir ) or die "Can't mkdir '$fulldir': $!";
-open(FOO, ">$dir${sep}auto${sep}Foo${sep}foo.al") or die;
+open(FOO, '>', File::Spec->catfile( $fulldir, 'foo.al' ))
+ or die "Can't open foo file: $!";
print FOO <<'EOT';
package Foo;
sub foo { shift; shift || "foo" }
@@ -28,7 +31,8 @@ sub foo { shift; shift || "foo" }
EOT
close(FOO);
-open(BAR, ">$dir${sep}auto${sep}Foo${sep}bar.al") or die;
+open(BAR, '>', File::Spec->catfile( $fulldir, 'bar.al' ))
+ or die "Can't open bar file: $!";
print BAR <<'EOT';
package Foo;
sub bar { shift; shift || "bar" }
@@ -36,7 +40,8 @@ sub bar { shift; shift || "bar" }
EOT
close(BAR);
-open(BAZ, ">$dir${sep}auto${sep}Foo${sep}bazmarkhian.al") or die;
+open(BAZ, '>', File::Spec->catfile( $fulldir, 'bazmarkhian.al' ))
+ or die "Can't open bazmarkhian file: $!";
print BAZ <<'EOT';
package Foo;
sub bazmarkhianish { shift; shift || "baz" }
@@ -44,85 +49,112 @@ sub bazmarkhianish { shift; shift || "baz" }
EOT
close(BAZ);
+open(BLECH, '>', File::Spec->catfile( $fulldir, 'blechanawilla.al' ))
+ or die "Can't open blech file: $!";
+print BLECH <<'EOT';
+package Foo;
+sub blechanawilla { compilation error (
+EOT
+close(BLECH);
+
+# This is just to keep the old SVR3 systems happy; they may fail
+# to find the above file so we duplicate it where they should find it.
+open(BLECH, '>', File::Spec->catfile( $fulldir, 'blechanawil.al' ))
+ or die "Can't open blech file: $!";
+print BLECH <<'EOT';
+package Foo;
+sub blechanawilla { compilation error (
+EOT
+close(BLECH);
+
# Let's define the package
package Foo;
require AutoLoader;
-@ISA=qw(AutoLoader);
+AutoLoader->import( 'AUTOLOAD' );
sub new { bless {}, shift };
package main;
-$foo = new Foo;
+my $foo = new Foo;
-print "not " unless $foo->foo eq 'foo'; # autoloaded first time
-print "ok 1\n";
+is( $foo->foo, 'foo', 'autoloaded first time' );
+is( $foo->foo, 'foo', 'regular call' );
-print "not " unless $foo->foo eq 'foo'; # regular call
-print "ok 2\n";
-
-# Try an undefined method
eval {
$foo->will_fail;
};
-print "not " unless $@ =~ /^Can't locate/;
-print "ok 3\n";
+like( $@, qr/^Can't locate/, 'undefined method' );
# Used to be trouble with this
eval {
my $foo = new Foo;
die "oops";
};
-print "not " unless $@ =~ /oops/;
-print "ok 4\n";
+like( $@, qr/oops/, 'indirect method call' );
# Pass regular expression variable to autoloaded function. This used
# to go wrong because AutoLoader used regular expressions to generate
# autoloaded filename.
-"foo" =~ /(\w+)/;
-print "not " unless $1 eq 'foo';
-print "ok 5\n";
-
-print "not " unless $foo->bar($1) eq 'foo';
-print "ok 6\n";
-
-print "not " unless $foo->bar($1) eq 'foo';
-print "ok 7\n";
+'foo' =~ /(\w+)/;
-print "not " unless $foo->bazmarkhianish($1) eq 'foo';
-print "ok 8\n";
+is( $foo->bar($1), 'foo', 'autoloaded method should not stomp match vars' );
+is( $foo->bar($1), 'foo', '(again)' );
+is( $foo->bazmarkhianish($1), 'foo', 'for any method call' );
+is( $foo->bazmarkhianish($1), 'foo', '(again)' );
-print "not " unless $foo->bazmarkhianish($1) eq 'foo';
-print "ok 9\n";
+# Used to retry long subnames with shorter filenames on any old
+# exception, including compilation error. Now AutoLoader only
+# tries shorter filenames if it can't find the long one.
+eval {
+ $foo->blechanawilla;
+};
+like( $@, qr/syntax error/, 'require error propagates' );
# test recursive autoloads
-open(F, ">$dir${sep}auto${sep}Foo${sep}a.al") or die;
+open(F, '>', File::Spec->catfile( $fulldir, 'a.al'))
+ or die "Cannot make 'a' file: $!";
print F <<'EOT';
package Foo;
BEGIN { b() }
-sub a { print "ok 11\n"; }
+sub a { ::ok( 1, 'adding a new autoloaded method' ); }
1;
EOT
close(F);
-open(F, ">$dir${sep}auto${sep}Foo${sep}b.al") or die;
+open(F, '>', File::Spec->catfile( $fulldir, 'b.al'))
+ or die "Cannot make 'b' file: $!";
print F <<'EOT';
package Foo;
-sub b { print "ok 10\n"; }
+sub b { ::ok( 1, 'adding a new autoloaded method' ) }
1;
EOT
close(F);
Foo::a();
+package Bar;
+AutoLoader->import();
+::ok( ! defined &AUTOLOAD, 'AutoLoader should not export AUTOLOAD by default' );
+
+package Foo;
+AutoLoader->unimport();
+eval { Foo->baz() };
+::like( $@, qr/locate object method "baz"/,
+ 'unimport() should remove imported AUTOLOAD()' );
+
+package Baz;
+
+sub AUTOLOAD { 'i am here' }
+
+AutoLoader->import();
+AutoLoader->unimport();
+
+::is( Baz->AUTOLOAD(), 'i am here', '... but not non-imported AUTOLOAD()' );
+
+package main;
+
# cleanup
END {
-return unless $dir && -d $dir;
-unlink "$dir${sep}auto${sep}Foo${sep}foo.al";
-unlink "$dir${sep}auto${sep}Foo${sep}bar.al";
-unlink "$dir${sep}auto${sep}Foo${sep}bazmarkhian.al";
-unlink "$dir${sep}auto${sep}Foo${sep}a.al";
-unlink "$dir${sep}auto${sep}Foo${sep}b.al";
-rmdir "$dir${sep}auto${sep}Foo";
-rmdir "$dir${sep}auto";
-rmdir "$dir";
+ return unless $dir && -d $dir;
+ rmtree $dir;
}
diff --git a/gnu/usr.bin/perl/lib/Benchmark.t b/gnu/usr.bin/perl/lib/Benchmark.t
index d7533c3d97c..80814767857 100644
--- a/gnu/usr.bin/perl/lib/Benchmark.t
+++ b/gnu/usr.bin/perl/lib/Benchmark.t
@@ -2,13 +2,13 @@
BEGIN {
chdir 't' if -d 't';
- @INC = '../lib';
+ @INC = ('../lib');
}
use warnings;
use strict;
use vars qw($foo $bar $baz $ballast);
-use Test::More tests => 159;
+use Test::More tests => 193;
use Benchmark qw(:all);
@@ -22,14 +22,14 @@ sub fib {
}
$ballast = 15;
-my $all_pattern =
+my $All_Pattern =
qr/(\d+) +wallclock secs? +\( *(-?\d+\.\d\d) +usr +(-?\d+\.\d\d) +sys +\+ +(-?\d+\.\d\d) +cusr +(-?\d+\.\d\d) +csys += +(-?\d+\.\d\d) +CPU\)/;
-my $noc_pattern =
+my $Noc_Pattern =
qr/(\d+) +wallclock secs? +\( *(-?\d+\.\d\d) +usr +\+ +(-?\d+\.\d\d) +sys += +(-?\d+\.\d\d) +CPU\)/;
-my $nop_pattern =
+my $Nop_Pattern =
qr/(\d+) +wallclock secs? +\( *(-?\d+\.\d\d) +cusr +\+ +(-?\d+\.\d\d) +csys += +\d+\.\d\d +CPU\)/;
# Please don't trust the matching parenthises to be useful in this :-)
-my $default_pattern = qr/$all_pattern|$noc_pattern/;
+my $Default_Pattern = qr/$All_Pattern|$Noc_Pattern/;
my $t0 = new Benchmark;
isa_ok ($t0, 'Benchmark', "Ensure we can create a benchmark object");
@@ -102,10 +102,10 @@ is ($auto, $default, 'timestr ($diff, "auto") matches timestr ($diff)');
{
my $all = timestr ($diff, 'all');
- like ($all, $all_pattern, 'timestr ($diff, "all")');
+ like ($all, $All_Pattern, 'timestr ($diff, "all")');
print "# $all\n";
- my ($wallclock, $usr, $sys, $cusr, $csys, $cpu) = $all =~ $all_pattern;
+ my ($wallclock, $usr, $sys, $cusr, $csys, $cpu) = $all =~ $All_Pattern;
is (timestr ($diff, 'none'), '', "none supresses output");
@@ -138,7 +138,7 @@ is ($foo, $iterations, "benchmarked code was run $iterations times");
$got = $out->read();
like ($got, qr/^timethis $iterations/, 'default title');
-like ($got, $default_pattern, 'default format is all or noc');
+like ($got, $Default_Pattern, 'default format is all or noc');
$bar = 0;
select(OUT);
@@ -149,7 +149,7 @@ is ($bar, $iterations, "benchmarked code was run $iterations times");
$got = $out->read();
like ($got, qr/^timethis $iterations/, 'default title');
-like ($got, $default_pattern, 'default format is all or noc');
+like ($got, $Default_Pattern, 'default format is all or noc');
my $title = 'lies, damn lies and benchmarks';
$foo = 0;
@@ -161,7 +161,7 @@ is ($foo, $iterations, "benchmarked code was run $iterations times");
$got = $out->read();
like ($got, qr/^$title:/, 'specify title');
-like ($got, $default_pattern, 'default format is all or noc');
+like ($got, $Default_Pattern, 'default format is all or noc');
# default is auto, which is all or noc. nop can never match the default
$foo = 0;
@@ -173,7 +173,7 @@ is ($foo, $iterations, "benchmarked code was run $iterations times");
$got = $out->read();
like ($got, qr/^$title:/, 'specify title');
-like ($got, $nop_pattern, 'specify format as nop');
+like ($got, $Nop_Pattern, 'specify format as nop');
{
$foo = 0;
@@ -218,7 +218,42 @@ like ($got, qr/timing $iterations iterations of\s+Bar\W+Baz\W+Foo\W*?\.\.\./s,
# Remove the title
$got =~ s/.*\.\.\.//s;
like ($got, qr/\bBar\b.*\bBaz\b.*\bFoo\b/s, 'check output is in sorted order');
-like ($got, $default_pattern, 'should find default format somewhere');
+like ($got, $Default_Pattern, 'should find default format somewhere');
+
+
+{ # ensure 'use strict' does not leak from Benchmark.pm into benchmarked code
+ no strict;
+ select OUT;
+
+ eval {
+ timethese( 1,
+ { undeclared_var => q{ $i++; $i-- },
+ symbolic_ref => q{ $bar = 42;
+ $foo = 'bar';
+ $q = ${$foo} },
+ },
+ 'none'
+ );
+
+ };
+ is( $@, '', q{no strict leakage in name => 'code'} );
+
+ eval {
+ timethese( 1,
+ { undeclared_var => sub { $i++; $i-- },
+ symbolic_ref => sub { $bar = 42;
+ $foo = 'bar';
+ return ${$foo} },
+ },
+ 'none'
+ );
+ };
+ is( $@, '', q{no strict leakage in name => sub { code }} );
+
+ # clear out buffer
+ $out->read;
+}
+
my $code_to_test = { Foo => sub {$foo+=fib($ballast-2)},
Bar => sub {$bar+=fib($ballast)}};
@@ -292,8 +327,8 @@ sub check_graph_consistency {
(my $fastslow = $fastslowt) =~ s!%!!;
if ($slowrate < $fastrate) {
pass ("slow rate is less than fast rate");
- unless (ok ($slowfast < 0 && $slowfast >= -100,
- "slowfast should be less than zero, and >= -100")) {
+ unless (ok ($slowfast <= 0 && $slowfast >= -100,
+ "slowfast should be less than or equal to zero, and >= -100")) {
print STDERR "# slowfast $slowfast\n";
$all_passed = 0;
}
@@ -305,10 +340,12 @@ sub check_graph_consistency {
$all_passed
&= is ($slowrate, $fastrate,
"slow rate isn't less than fast rate, so should be the same");
+ # In OpenBSD the $slowfast is sometimes a really, really, really
+ # small number less than zero, and this gets stringified as -0.
$all_passed
- &= is ($slowfast, 0, "slowfast should be zero");
+ &= like ($slowfast, qr/^-?0$/, "slowfast should be zero");
$all_passed
- &= is ($fastslow, 0, "fastslow should be zero");
+ &= like ($fastslow, qr/^-?0$/, "fastslow should be zero");
}
return $all_passed;
}
@@ -346,7 +383,7 @@ sub check_graph {
{
select(OUT);
my $start = times;
- my $chart = cmpthese( -0.1, { a => "++\$i", b => "\$i = sqrt(\$i++)" } ) ;
+ my $chart = cmpthese( -0.1, { a => "++\$i", b => "\$i = sqrt(\$i++)" }, "auto" ) ;
my $end = times;
select(STDOUT);
ok (($end - $start) > 0.05, "benchmarked code ran for over 0.05 seconds");
@@ -359,7 +396,29 @@ sub check_graph {
'check title');
# Remove the title
$got =~ s/.*\.\.\.//s;
- like ($got, $default_pattern, 'should find default format somewhere');
+ like ($got, $Default_Pattern, 'should find default format somewhere');
+ like ($got, $graph_dissassembly, "Should find the output graph somewhere");
+ check_graph_vs_output ($chart, $got);
+}
+
+# Not giving auto should suppress timethese results.
+{
+ select(OUT);
+ my $start = times;
+ my $chart = cmpthese( -0.1, { a => "++\$i", b => "\$i = sqrt(\$i++)" } ) ;
+ my $end = times;
+ select(STDOUT);
+ ok (($end - $start) > 0.05, "benchmarked code ran for over 0.05 seconds");
+
+ $got = $out->read();
+ # Remove any warnings about having too few iterations.
+ $got =~ s/\(warning:[^\)]+\)//gs;
+
+ unlike ($got, qr/running\W+a\W+b.*?for at least 0\.1 CPU second/s,
+ 'should not have title');
+ # Remove the title
+ $got =~ s/.*\.\.\.//s;
+ unlike ($got, $Default_Pattern, 'should not find default format somewhere');
like ($got, $graph_dissassembly, "Should find the output graph somewhere");
check_graph_vs_output ($chart, $got);
}
@@ -379,7 +438,7 @@ sub check_graph {
'check title');
# Remove the title
$got =~ s/.*\.\.\.//s;
- like ($got, $nop_pattern, 'specify format as nop');
+ like ($got, $Nop_Pattern, 'specify format as nop');
like ($got, $graph_dissassembly, "Should find the output graph somewhere");
check_graph_vs_output ($chart, $got);
}
@@ -470,26 +529,65 @@ untie *STDERR;
# being used, merely what's become cached.
clearallcache();
-my @before_keys = keys %Benchmark::cache;
+my @before_keys = keys %Benchmark::Cache;
$bar = 0;
isa_ok(timeit(5, '++$bar'), 'Benchmark', "timeit eval");
is ($bar, 5, "benchmarked code was run 5 times");
-my @after5_keys = keys %Benchmark::cache;
+my @after5_keys = keys %Benchmark::Cache;
$bar = 0;
isa_ok(timeit(10, '++$bar'), 'Benchmark', "timeit eval");
is ($bar, 10, "benchmarked code was run 10 times");
-ok (!eq_array ([keys %Benchmark::cache], \@after5_keys), "10 differs from 5");
+ok (!eq_array ([keys %Benchmark::Cache], \@after5_keys), "10 differs from 5");
clearcache(10);
# Hash key order will be the same if there are the same keys.
-is_deeply ([keys %Benchmark::cache], \@after5_keys,
+is_deeply ([keys %Benchmark::Cache], \@after5_keys,
"cleared 10, only cached results for 5 should remain");
clearallcache();
-is_deeply ([keys %Benchmark::cache], \@before_keys,
+is_deeply ([keys %Benchmark::Cache], \@before_keys,
"back to square 1 when we clear the cache again?");
+{ # Check usage error messages
+ my %usage = %Benchmark::_Usage;
+ delete $usage{runloop}; # not public, not worrying about it just now
+
+ my @takes_no_args = qw(clearallcache disablecache enablecache);
+
+ my %cmpthese = ('forgot {}' => 'cmpthese( 42, foo => sub { 1 } )',
+ 'not result' => 'cmpthese(42)',
+ 'array ref' => 'cmpthese( 42, [ foo => sub { 1 } ] )',
+ );
+ while( my($name, $code) = each %cmpthese ) {
+ eval $code;
+ is( $@, $usage{cmpthese}, "cmpthese usage: $name" );
+ }
+
+ my %timethese = ('forgot {}' => 'timethese( 42, foo => sub { 1 } )',
+ 'no code' => 'timethese(42)',
+ 'array ref' => 'timethese( 42, [ foo => sub { 1 } ] )',
+ );
+
+ while( my($name, $code) = each %timethese ) {
+ eval $code;
+ is( $@, $usage{timethese}, "timethese usage: $name" );
+ }
+
+
+ while( my($func, $usage) = each %usage ) {
+ next if grep $func eq $_, @takes_no_args;
+ eval "$func()";
+ is( $@, $usage, "$func usage: no args" );
+ }
+
+ foreach my $func (@takes_no_args) {
+ eval "$func(42)";
+ is( $@, $usage{$func}, "$func usage: with args" );
+ }
+}
+
+
package TieOut;
sub TIEHANDLE {
diff --git a/gnu/usr.bin/perl/lib/CPAN/META.yml b/gnu/usr.bin/perl/lib/CPAN/META.yml
new file mode 100644
index 00000000000..658d5c64b45
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/CPAN/META.yml
@@ -0,0 +1,11 @@
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: CPAN
+version: 1.76
+version_from: lib/CPAN.pm
+installdirs: perl
+requires:
+ Test::More: 0
+ File::Spec: 0
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.12
diff --git a/gnu/usr.bin/perl/lib/CPAN/PAUSE2003.pub b/gnu/usr.bin/perl/lib/CPAN/PAUSE2003.pub
new file mode 100644
index 00000000000..7817562962d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/CPAN/PAUSE2003.pub
@@ -0,0 +1,31 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: OpenKeyServer v1.2
+Comment: Extracted from belgium.keyserver.net
+
+mQGiBD4+cJARBACxOByY0SJBBuJoFrH2hoqRFny423gY6V3jq1uTgGY/PPaxP+Sq
+r3RzxPct4vJcsoo48pwBsMHLrWfORq26zb6eKgmMq/CQo2gzaRbeRxCi3ke4KBmu
+aREi6RjaZSU94yABtDmspUBrpYV8zfZMv5ZIQlg9W1Tu66BFOUrrNeDpKwCgosCp
+9dtNAMhHkzxs8UJH5i3Uzb0D/0VLoAE8sOfUXqjc38rxiHuGBFSNC70Ih4mzGUCJ
+MGT4z1X3K6uUawnXMoc8XqPaYnEgOzztMymydtr+urjUwcGnuXDSpV6nulE5irxh
+zlikSTJy/42QzTMcrdRynffmJo9PRgymMI8GgWaYG5g3zzGAhi5BA6G8JKfC93IV
+xiRPBACXJpLBYQljqJY9UDNJuq8nHhKiWHBXdZzrC3LM0FSF3PKuP/ugc+KBIKXm
+clNPNFKla/SRbH6dMHsGIy8wnGPI5AtTS0roNQrttv3/ghRT7+OKXrGmBxZ/KHVr
+v3PVgiRA5MDr1mIsovfuc9WQnFu2TkgnN/F3pDcrVVSi5b+rZLQzUEFVU0UgQmF0
+Y2ggU2lnbmluZyBLZXkgMjAwMyA8cGF1c2VAcGF1c2UucGVybC5vcmc+iF8EExEC
+AB8FAj4+cJAFCQPCZwAECwcDAgMVAgMDFgIBAh4BAheAAAoJEDKNqGdFD4nsd4sA
+n3gYvr37VkUycx61wm5t4BoSO904AJ9dkl/zU5BbDnXEPKk0FNWFSnwnxbkCDQQ+
+PnCyEAgAjAKDcvpogvJvSrg3rkstDhxP4O+JZvfxzrdL9Qk0FPBlb31ECxPMBf2z
+KObrwGKwxgD3+lSb/y9SgOYnAsuwztn6BqjQ8AVKiI0MFDTa+tLrtY5860X7TxJD
+9bzMx/A4gEsYoFZYR4s/alGAzcqFcdQ2IiFnKE4KPtNXEMQ67lCEw5zdYSoJta9J
+UKsCX3KI/DOne1NnjNZL2dQadqjsEc8mjvUOTXSG1sCawzTP5tNoPHg13GeyJ0XG
+HbHY35BbF33yr9kP76+zQFaiMyLDUnyQAU/0P+rm/I6Ts6q4OZwKK/tC5LD0SPDe
+08uAzkb4krRqxheo6seHdT7HjdDbKwADBgf/RGpQhhZc+F9o79S9aLV4XnY5CFev
+4EJvUqq6TF9V0rvZg148mbO/b8EtOfcBSdvAfo3H8w6wcC7X8Kt/6Pl69UZKuQOt
+354092gTrjJyg1uZBK9Ey/LSh0k+BNCfIw04+6W8ijARkpdoBrU3CwDKTyroWYkS
+FDkkzLvJRTkMpVpqyI0xIEExPXZTf67Abv1dzceTDciblLJfQcsfDyWYv8D12ELE
+zLYQnFM1s6yD6Q51Xk/XQ6MJ59bB3uuFO8VpkCMEvqIxZXsLjgqyQgo73y1qFizs
+KnFG+TTvooBdG3yqSt9OsLSoRrJkZbMX3PKpbT0ceWL8dULc1v2ol4fJGohMBBgR
+AgAMBQI+PnCyBQkDwmcAAAoJEDKNqGdFD4nsS44An14sFX5E2jJc87HFJeqPmeas
+hdayAKCCmOqjo0CW5uepN19pXdP7BujUOw==
+=ocE3
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gnu/usr.bin/perl/lib/CPAN/SIGNATURE b/gnu/usr.bin/perl/lib/CPAN/SIGNATURE
new file mode 100644
index 00000000000..b890132750e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/CPAN/SIGNATURE
@@ -0,0 +1,45 @@
+This file contains message digests of all files listed in MANIFEST,
+signed via the Module::Signature module, version 0.26.
+
+To verify the content in this distribution, first make sure you have
+Module::Signature installed, then type:
+
+ % cpansign -v
+
+It would check each file's integrity, as well as the signature's
+validity. If "==> Signature verified OK! <==" is not displayed,
+the distribution may already have been compromised, and you should
+not run its Makefile.PL or Build.PL.
+
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+SHA1 efbe8e6882a2caa0d741b113959a706830ab5882 BUNDLE/Test/Builder.pm
+SHA1 ae1d68262bedc2475e2c6fd478d99b259b4fb109 BUNDLE/Test/More.pm
+SHA1 2b02ead396d701c16a93a54b0f15f7073addb407 ChangeLog
+SHA1 a029ffa2f2252bb8914eb658666244710994d256 Changes.old
+SHA1 ed0c9e6c6b83e39e3822cf71aeed81f829386dd9 MANIFEST
+SHA1 21e313600b36ee8adb724a43c247ee0f873b5b81 MANIFEST.SKIP
+SHA1 1b0753e38574181a9d0e041cb9082d09c32f0fbf META.yml
+SHA1 441f9a3ec80bfa266d889d5c56a9a75eeb119626 Makefile.PL
+SHA1 37e858c51409a297ef5d3fb35dc57cd3b57f9a4d PAUSE2003.pub
+SHA1 0006bf6573858fbeb094d0becc5030c36d41a46d README
+SHA1 9e6e9cf9ae517d91ef3bda61f2c5d0c6409073d6 Todo
+SHA1 859ee1f3ba026d269c44b29d715d9af1e35333bc lib/Bundle/CPAN.pm
+SHA1 3aaaaf913748abe1cfa3f89ccf70d8f6315e5fe8 lib/CPAN.pm
+SHA1 e00d87017076b26de7696ae8b75d397bee737bbb lib/CPAN/Admin.pm
+SHA1 536e9720a6161510b50a2948c768d1daabc87dcd lib/CPAN/FirstTime.pm
+SHA1 33dd610c4b5d679bbcf3e61df290e33b460feaab lib/CPAN/Nox.pm
+SHA1 0a7b5d987e699afe63d9e314f1aa456214c8e1d0 scripts/cpan
+SHA1 1ef040435bd29f7d46db02c079fcb79cc279780c t/Nox.t
+SHA1 6a3fa699be244f587ef1d14e4c345bc57affd0c8 t/loadme.t
+SHA1 d765dc589a77265e305ef27ff386e31f562ad70b t/mirroredby.t
+SHA1 44ee216f4a129193a62fc1cd61088fd2de8e9538 t/signature.t
+SHA1 ada872f52e59a537c444e12ca9d79e4df4bd18c4 t/vcmp.t
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.2 (GNU/Linux)
+
+iD8DBQE/KTBH7IA58KMXwV0RAvwzAKDqt5FPLl5zA2RkWRoLz/ASslZqKACfV1pg
+VUyR6PLFLNoGHDZXCzmn1co=
+=8wMs
+-----END PGP SIGNATURE-----
diff --git a/gnu/usr.bin/perl/lib/CPAN/bin/cpan b/gnu/usr.bin/perl/lib/CPAN/bin/cpan
new file mode 100644
index 00000000000..438aba6e490
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/CPAN/bin/cpan
@@ -0,0 +1,203 @@
+#!/usr/bin/perl
+# $Id: cpan,v 1.1.1.1 2003/12/03 02:44:01 millert Exp $
+use strict;
+
+=head1 NAME
+
+cpan - easily interact with CPAN from the command line
+
+=head1 SYNOPSIS
+
+ # with arguments, installs specified modules
+ cpan module_name [ module_name ... ]
+
+ # with switches, installs modules with extra behavior
+ cpan [-cimt] module_name [ module_name ... ]
+
+ # without arguments, starts CPAN shell
+ cpan
+
+ # without arguments, but some switches
+ cpan [-ahrv]
+
+=head1 DESCRIPTION
+
+This script provides a command interface (not a shell) to CPAN.pm.
+
+=head2 Meta Options
+
+These options are mutually exclusive, and the script processes
+them in this order: [ahvr]. Once the script finds one, it ignores
+the others, and then exits after it finishes the task. The script
+ignores any other command line options.
+
+=over 4
+
+=item -a
+
+Creates the CPAN.pm autobundle with CPAN::Shell->autobundle.
+
+=item -h
+
+Prints a help message.
+
+=item -r
+
+Recompiles dynamically loaded modules with CPAN::Shell->recompile.
+
+=item -v
+
+Print the script version and CPAN.pm version.
+
+=back
+
+=head2 Module options
+
+These options are mutually exclusive, and the script processes
+them in alphabetical order.
+
+=over 4
+
+=item c
+
+Runs a `make clean` in the specified module's directories.
+
+=item i
+
+Installed the specified modules.
+
+=item m
+
+Makes the specified modules.
+
+=item t
+
+Runs a `make test` on the specified modules.
+
+=back
+
+=head2 Examples
+
+ # print a help message
+ cpan -h
+
+ # print the version numbers
+ cpan -v
+
+ # create an autobundle
+ cpan -a
+
+ # recompile modules
+ cpan -r
+
+ # install modules
+ cpan -i Netscape::Booksmarks Business::ISBN
+
+=head1 TO DO
+
+* add options for other CPAN::Shell functions
+autobundle, clean, make, recompile, test
+
+=head1 BUGS
+
+* none noted
+
+=head1 SEE ALSO
+
+Most behaviour, including environment variables and configuration,
+comes directly from CPAN.pm.
+
+=head1 AUTHOR
+
+brian d foy <bdfoy@cpan.org>
+
+=cut
+
+use CPAN ();
+use Getopt::Std;
+
+my $VERSION =
+ sprintf "%d.%02d", q$Revision: 1.1.1.1 $ =~ m/ (\d+) \. (\d+) /xg;
+
+my $Default = 'default';
+
+my $META_OPTIONS = 'ahvr';
+
+my %CPAN_METHODS = (
+ $Default => 'install',
+ 'c' => 'clean',
+ 'i' => 'install',
+ 'm' => 'make',
+ 't' => 'test',
+ );
+
+my @cpan_options = grep { $_ ne $Default } sort keys %CPAN_METHODS;
+
+my $arg_count = @ARGV;
+my %options;
+
+Getopt::Std::getopts(
+ join( '', @cpan_options, $META_OPTIONS ), \%options );
+
+if( $options{h} )
+ {
+ print STDERR "Printing help message -- ignoring other arguments\n"
+ if $arg_count > 1;
+
+ print STDERR "Use perldoc to read the documentation\n";
+ exit 0;
+ }
+elsif( $options{v} )
+ {
+ print STDERR "Printing version message -- ignoring other arguments\n"
+
+ if $arg_count > 1;
+
+ my $CPAN_VERSION = CPAN->VERSION;
+ print STDERR "cpan script version $VERSION\n" .
+ "CPAN.pm version $CPAN_VERSION\n";
+ exit 0;
+ }
+elsif( $options{a} )
+ {
+ print "Creating autobundle in ", $CPAN::Config->{cpan_home},
+ "/Bundle\n";
+ print STDERR "Creating autobundle -- ignoring other arguments\n"
+ if $arg_count > 1;
+
+ CPAN::Shell->autobundle;
+ exit 0;
+ }
+elsif( $options{r} )
+ {
+ print STDERR "Creating autobundle -- ignoring other arguments\n"
+ if $arg_count > 1;
+
+ CPAN::Shell->recompile;
+ }
+else
+ {
+ my $switch = '';
+
+ foreach my $option ( @cpan_options )
+ {
+ next unless $options{$option};
+ $switch = $option;
+ last;
+ }
+
+ if( not $switch and @ARGV ) { $switch = $Default; }
+ elsif( not $switch and not @ARGV ) { CPAN::shell(); exit 0; }
+ elsif( $switch and not @ARGV )
+ { die "Nothing to $CPAN_METHODS{$switch}!\n"; }
+
+ my $method = $CPAN_METHODS{$switch};
+ die "CPAN.pm cannot $method!\n" unless CPAN::Shell->can( $method );
+
+ foreach my $arg ( @ARGV )
+ {
+ CPAN::Shell->$method( $arg );
+ }
+ }
+
+1;
diff --git a/gnu/usr.bin/perl/lib/CPAN/t/Nox.t b/gnu/usr.bin/perl/lib/CPAN/t/Nox.t
index 3d5565b157d..4006771081a 100644
--- a/gnu/usr.bin/perl/lib/CPAN/t/Nox.t
+++ b/gnu/usr.bin/perl/lib/CPAN/t/Nox.t
@@ -1,14 +1,13 @@
#!./perl
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
-}
-
+use lib "BUNDLE";
use Test::More tests => 8;
# use this first to $CPAN::term can be undefined
use_ok( 'CPAN' );
+$CPAN::Suppress_readline = $CPAN::Suppress_readline; # silence
+$CPAN::META = $CPAN::META; # silence
+$CPAN::term = $CPAN::term; # silence
undef $CPAN::term;
# this kicks off all the magic
diff --git a/gnu/usr.bin/perl/lib/CPAN/t/loadme.t b/gnu/usr.bin/perl/lib/CPAN/t/loadme.t
index dce7e1081d9..fd0b67989d5 100644
--- a/gnu/usr.bin/perl/lib/CPAN/t/loadme.t
+++ b/gnu/usr.bin/perl/lib/CPAN/t/loadme.t
@@ -1,11 +1,6 @@
#!/usr/bin/perl -w
BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
-}
-
-BEGIN {
print "1..1\n";
}
use strict;
diff --git a/gnu/usr.bin/perl/lib/CPAN/t/mirroredby.t b/gnu/usr.bin/perl/lib/CPAN/t/mirroredby.t
index 91bd3962004..f383be82bcd 100644
--- a/gnu/usr.bin/perl/lib/CPAN/t/mirroredby.t
+++ b/gnu/usr.bin/perl/lib/CPAN/t/mirroredby.t
@@ -8,6 +8,7 @@ BEGIN {
}
use strict;
+use lib "BUNDLE";
use Test::More tests => 6;
use_ok( 'CPAN::FirstTime' );
diff --git a/gnu/usr.bin/perl/lib/CPAN/t/signature.t b/gnu/usr.bin/perl/lib/CPAN/t/signature.t
new file mode 100644
index 00000000000..cf81f88800a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/CPAN/t/signature.t
@@ -0,0 +1,16 @@
+# -*- mode: cperl -*-
+
+use strict;
+print "1..1\n";
+
+if (!eval { require Module::Signature; 1 }) {
+ print "ok 1 # skip - no Module::Signature found\n";
+}
+elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) {
+ print "ok 1 # skip - Cannot connect to the keyserver";
+}
+else {
+ (Module::Signature::verify() == Module::Signature::SIGNATURE_OK())
+ or print "not ";
+ print "ok 1 # Valid signature\n";
+}
diff --git a/gnu/usr.bin/perl/lib/CPAN/t/vcmp.t b/gnu/usr.bin/perl/lib/CPAN/t/vcmp.t
index 290fc3d2063..daed9795703 100644
--- a/gnu/usr.bin/perl/lib/CPAN/t/vcmp.t
+++ b/gnu/usr.bin/perl/lib/CPAN/t/vcmp.t
@@ -1,10 +1,5 @@
# -*- Mode: cperl; coding: utf-8; -*-
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
-}
-
use strict;
use CPAN;
use vars qw($D $N);
diff --git a/gnu/usr.bin/perl/lib/Class/Struct.t b/gnu/usr.bin/perl/lib/Class/Struct.t
index 914132c7764..694d622d4d2 100644
--- a/gnu/usr.bin/perl/lib/Class/Struct.t
+++ b/gnu/usr.bin/perl/lib/Class/Struct.t
@@ -5,85 +5,99 @@ BEGIN {
@INC = '../lib';
}
-print "1..12\n";
-
+#
+# A couple of simple classes to use as struct elements.
+#
package aClass;
-
sub new { bless {}, shift }
-
sub meth { 42 }
package RecClass;
-
sub new { bless {}, shift }
+#
+# The first of our Class::Struct based objects.
+#
package MyObj;
-
use Class::Struct;
use Class::Struct 'struct'; # test out both forms
-
use Class::Struct SomeClass => { SomeElem => '$' };
struct( s => '$', a => '@', h => '%', c => 'aClass' );
-my $obj = MyObj->new;
+#
+# The second Class::Struct objects:
+# test the 'compile-time without package name' feature.
+#
+package MyOther;
+use Class::Struct s => '$', a => '@', h => '%', c => 'aClass';
-$obj->s('foo');
+#
+# back to main...
+#
+package main;
-print "not " unless $obj->s() eq 'foo';
-print "ok 1\n";
+use Test::More tests => 24;
-my $arf = $obj->a;
+my $obj = MyObj->new;
+isa_ok $obj, 'MyObj';
-print "not " unless ref $arf eq 'ARRAY';
-print "ok 2\n";
+$obj->s('foo');
+is $obj->s(), 'foo';
+isa_ok $obj->a, 'ARRAY';
$obj->a(2, 'secundus');
+is $obj->a(2), 'secundus';
-print "not " unless $obj->a(2) eq 'secundus';
-print "ok 3\n";
-
-my $hrf = $obj->h;
-
-print "not " unless ref $hrf eq 'HASH';
-print "ok 4\n";
+$obj->a([4,5,6]);
+is $obj->a(1), 5;
+isa_ok $obj->h, 'HASH';
$obj->h('x', 10);
+is $obj->h('x'), 10;
-print "not " unless $obj->h('x') == 10;
-print "ok 5\n";
-
-my $orf = $obj->c;
+$obj->h({h=>7,r=>8,f=>9});
+is $obj->h('r'), 8;
-print "not " if defined($orf);
-print "ok 6\n";
+is $obj->c, undef;
$obj = MyObj->new( c => aClass->new );
-$orf = $obj->c;
-
-print "not " if ref $orf ne 'aClass';
-print "ok 7\n";
+isa_ok $obj->c, 'aClass';
+is $obj->c->meth(), 42;
-print "not " unless $obj->c->meth() == 42;
-print "ok 8\n";
-my $obk = SomeClass->new();
+$obj = MyOther->new;
+isa_ok $obj, 'MyOther';
-$obk->SomeElem(123);
+$obj->s('foo');
+is $obj->s(), 'foo';
-print "not " unless $obk->SomeElem() == 123;
-print "ok 9\n";
+isa_ok $obj->a, 'ARRAY';
+$obj->a(2, 'secundus');
+is $obj->a(2), 'secundus';
$obj->a([4,5,6]);
+is $obj->a(1), 5;
-print "not " unless $obj->a(1) == 5;
-print "ok 10\n";
+isa_ok $obj->h, 'HASH';
+$obj->h('x', 10);
+is $obj->h('x'), 10;
$obj->h({h=>7,r=>8,f=>9});
+is $obj->h('r'), 8;
-print "not " unless $obj->h('r') == 8;
-print "ok 11\n";
+is $obj->c, undef;
+
+$obj = MyOther->new( c => aClass->new );
+isa_ok $obj->c, 'aClass';
+is $obj->c->meth(), 42;
+
+
+
+my $obk = SomeClass->new();
+$obk->SomeElem(123);
+is $obk->SomeElem(), 123;
-my $recobj = RecClass->new() or print "not ";
-print "ok 12\n";
+my $recobj = RecClass->new();
+isa_ok $recobj, 'RecClass';
diff --git a/gnu/usr.bin/perl/lib/Config.t b/gnu/usr.bin/perl/lib/Config.t
index afc3c4a41c4..6e4b47cfa86 100644
--- a/gnu/usr.bin/perl/lib/Config.t
+++ b/gnu/usr.bin/perl/lib/Config.t
@@ -1,10 +1,12 @@
+#!./perl
+
BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
require "./test.pl";
}
-plan tests => 23;
+plan tests => 36;
use_ok('Config');
@@ -16,6 +18,16 @@ ok(each %Config);
is($Config{PERL_REVISION}, 5, "PERL_REVISION is 5");
+# Check that old config variable names are aliased to their new ones.
+my %grandfathers = ( PERL_VERSION => 'PATCHLEVEL',
+ PERL_SUBVERSION => 'SUBVERSION',
+ PERL_CONFIG_SH => 'CONFIG'
+ );
+while( my($new, $old) = each %grandfathers ) {
+ isnt($Config{$new}, undef, "$new is defined");
+ is($Config{$new}, $Config{$old}, "$new is aliased to $old");
+}
+
ok( exists $Config{cc}, "has cc");
ok( exists $Config{ccflags}, "has ccflags");
@@ -40,13 +52,21 @@ ok(exists $Config{ccflags_nolargefiles}, "has ccflags_nolargefiles");
# Utility functions.
-like(Config::myconfig(), qr/cc='$Config{cc}'/, "myconfig");
-
-SKIP: {
- skip "cc is tied in $^O", 1 if $^O eq 'MacOS';
- like(Config::config_sh(), qr/cc='$Config{cc}'/, "config_sh");
+{
+ # make sure we can export what we say we can export.
+ package Foo;
+ my @exports = qw(myconfig config_sh config_vars config_re);
+ Config->import(@exports);
+ foreach my $func (@exports) {
+ ::ok( __PACKAGE__->can($func), "$func exported" );
+ }
}
+like(Config::myconfig(), qr/osname=\Q$Config{osname}\E/, "myconfig");
+like(Config::config_sh(), qr/osname='\Q$Config{osname}\E'/, "config_sh");
+like(join("\n", Config::config_re('c.*')),
+ qr/^c.*?=/, 'config_re' );
+
my $out = tie *STDOUT, 'FakeOut';
Config::config_vars('cc');
@@ -59,7 +79,7 @@ $out->clear;
untie *STDOUT;
-like($out1, qr/^cc='$Config{cc}';/, "config_vars cc");
+like($out1, qr/^cc='\Q$Config{cc}\E';/, "config_vars cc");
like($out2, qr/^d_bork='UNKNOWN';/, "config_vars d_bork is UNKNOWN");
# Read-only.
@@ -82,18 +102,25 @@ like($@, qr/Config is read-only/, "no CLEAR");
ok( exists $Config{d_fork}, "still d_fork");
-package FakeOut;
+{
+ package FakeOut;
-sub TIEHANDLE {
- bless(\(my $text), $_[0]);
-}
+ sub TIEHANDLE {
+ bless(\(my $text), $_[0]);
+ }
-sub clear {
- ${ $_[0] } = '';
-}
+ sub clear {
+ ${ $_[0] } = '';
+ }
-sub PRINT {
- my $self = shift;
- $$self .= join('', @_);
+ sub PRINT {
+ my $self = shift;
+ $$self .= join('', @_);
+ }
}
+# Signal-related variables
+# (this is actually a regression test for Configure.)
+
+is($Config{sig_num_init} =~ tr/,/,/, $Config{sig_size}, "sig_num_init size");
+is($Config{sig_name_init} =~ tr/,/,/, $Config{sig_size}, "sig_name_init size");
diff --git a/gnu/usr.bin/perl/lib/Digest.pm b/gnu/usr.bin/perl/lib/Digest.pm
index 9727a1c4b9e..8ebf61a4870 100644
--- a/gnu/usr.bin/perl/lib/Digest.pm
+++ b/gnu/usr.bin/perl/lib/Digest.pm
@@ -3,7 +3,7 @@ package Digest;
use strict;
use vars qw($VERSION %MMAP $AUTOLOAD);
-$VERSION = "1.00";
+$VERSION = "1.02";
%MMAP = (
"SHA-1" => "Digest::SHA1",
@@ -129,6 +129,11 @@ reset the state the object to the state of a newly created object. No
new object is created in this case, and the return value is the
reference to the object (i.e. $ctx).
+=item $other_ctx = $ctx->clone
+
+The clone method creates a copy of the digest state object and returns
+a reference to the copy.
+
=item $ctx->reset
This is just an alias for $ctx->new.
@@ -151,7 +156,8 @@ Return the binary digest for the message.
Note that the C<digest> operation is effectively a destructive,
read-once operation. Once it has been performed, the $ctx object is
automatically C<reset> and can be used to calculate another digest
-value.
+value. Call $ctx->clone->digest if you want to calculate the digest
+without reseting the digest state.
=item $ctx->hexdigest
diff --git a/gnu/usr.bin/perl/lib/Digest.t b/gnu/usr.bin/perl/lib/Digest.t
index 5741b777fe2..fbc2dac8056 100644
--- a/gnu/usr.bin/perl/lib/Digest.t
+++ b/gnu/usr.bin/perl/lib/Digest.t
@@ -1,13 +1,9 @@
print "1..3\n";
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
-}
-
use Digest;
-my $hexdigest = "900150983cd24fb0d6963f7d28e17f72";
+my $hexdigest = "900150983cd24fb0d6963f7d28e17f72"; # ASCII
+
if (ord('A') == 193) { # EBCDIC
$hexdigest = "fe4ea0d98f9cd8d1d27f102a93cb0bb0"; # IBM-1047
}
@@ -19,6 +15,7 @@ print "not " unless Digest->MD5->add("abc")->hexdigest eq $hexdigest;
print "ok 2\n";
eval {
+ # Not yet EBCDICified.
print "not " unless Digest->new("HMAC-MD5" => "Jefe")->add("what do ya want for nothing?")->hexdigest eq "750c783e6ab0b503eaa86e310a5db738";
print "ok 3\n";
};
diff --git a/gnu/usr.bin/perl/lib/DirHandle.t b/gnu/usr.bin/perl/lib/DirHandle.t
index e83ea134965..b654f6d384a 100644
--- a/gnu/usr.bin/perl/lib/DirHandle.t
+++ b/gnu/usr.bin/perl/lib/DirHandle.t
@@ -11,24 +11,25 @@ BEGIN {
}
use DirHandle;
+require './test.pl';
-print "1..5\n";
+plan(5);
$dot = new DirHandle ($^O eq 'MacOS' ? ':' : '.');
-print defined($dot) ? "ok" : "not ok", " 1\n";
+ok(defined($dot));
@a = sort <*>;
do { $first = $dot->read } while defined($first) && $first =~ /^\./;
-print +(grep { $_ eq $first } @a) ? "ok" : "not ok", " 2\n";
+ok(+(grep { $_ eq $first } @a));
@b = sort($first, (grep {/^[^.]/} $dot->read));
-print +(join("\0", @a) eq join("\0", @b)) ? "ok" : "not ok", " 3\n";
+ok(+(join("\0", @a) eq join("\0", @b)));
$dot->rewind;
@c = sort grep {/^[^.]/} $dot->read;
-print +(join("\0", @b) eq join("\0", @c)) ? "ok" : "not ok", " 4\n";
+cmp_ok(+(join("\0", @b), 'eq', join("\0", @c)));
$dot->close;
$dot->rewind;
-print defined($dot->read) ? "not ok" : "ok", " 5\n";
+ok(!defined($dot->read));
diff --git a/gnu/usr.bin/perl/lib/English.t b/gnu/usr.bin/perl/lib/English.t
index 49819fc9b2f..d7466c2d3b8 100644
--- a/gnu/usr.bin/perl/lib/English.t
+++ b/gnu/usr.bin/perl/lib/English.t
@@ -6,7 +6,7 @@ BEGIN {
@INC = '../lib';
}
-use Test::More tests => 54;
+use Test::More tests => 55;
use English qw( -no_match_vars ) ;
use Config;
@@ -142,6 +142,12 @@ main::is( $PREMATCH, 'a', '$PREMATCH defined' );
main::is( $MATCH, 'b', '$MATCH defined' );
main::is( $POSTMATCH, 'c', '$POSTMATCH defined' );
+{
+ my $s = "xyz";
+ $s =~ s/y/t$MATCH/;
+ main::is( $s, "xtyz", '$MATCH defined in right side of s///' );
+}
+
package C;
use English qw( -no_match_vars ) ;
diff --git a/gnu/usr.bin/perl/lib/Exporter.t b/gnu/usr.bin/perl/lib/Exporter.t
index d2a9289c61c..54150685a75 100644
--- a/gnu/usr.bin/perl/lib/Exporter.t
+++ b/gnu/usr.bin/perl/lib/Exporter.t
@@ -21,7 +21,7 @@ sub ok ($;$) {
}
-print "1..24\n";
+print "1..26\n";
require Exporter;
ok( 1, 'Exporter compiled' );
@@ -178,3 +178,21 @@ BEGIN {
::ok( !$warnings, 'Unused variables can be exported without warning' ) ||
print "# $warnings\n";
+package Moving::Target;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw (foo);
+
+sub foo {"foo"};
+sub bar {"bar"};
+
+package Moving::Target::Test;
+
+Moving::Target->import (foo);
+
+::ok (foo eq "foo", "imported foo before EXPORT_OK changed");
+
+push @Moving::Target::EXPORT_OK, 'bar';
+
+Moving::Target->import (bar);
+
+::ok (bar eq "bar", "imported bar after EXPORT_OK changed");
diff --git a/gnu/usr.bin/perl/lib/Exporter/Heavy.pm b/gnu/usr.bin/perl/lib/Exporter/Heavy.pm
index 3bdc4b4f204..232238686dd 100644
--- a/gnu/usr.bin/perl/lib/Exporter/Heavy.pm
+++ b/gnu/usr.bin/perl/lib/Exporter/Heavy.pm
@@ -6,7 +6,6 @@ no strict 'refs';
# On one line so MakeMaker will see it.
require Exporter; our $VERSION = $Exporter::VERSION;
$Carp::Internal{"Exporter::Heavy"} = 1;
-our $Verbose;
=head1 NAME
@@ -27,6 +26,17 @@ No user-serviceable parts inside.
# because Carp requires Exporter, and something has to give.
#
+sub _rebuild_cache {
+ my ($pkg, $exports, $cache) = @_;
+ s/^&// foreach @$exports;
+ @{$cache}{@$exports} = (1) x @$exports;
+ my $ok = \@{"${pkg}::EXPORT_OK"};
+ if (@$ok) {
+ s/^&// foreach @$ok;
+ @{$cache}{@$ok} = (1) x @$ok;
+ }
+}
+
sub heavy_export {
# First make import warnings look like they're coming from the "use".
@@ -49,19 +59,14 @@ sub heavy_export {
};
my($pkg, $callpkg, @imports) = @_;
- my($type, $sym, $oops);
+ my($type, $sym, $cache_is_current, $oops);
my($exports, $export_cache) = (\@{"${pkg}::EXPORT"},
- \%{"${pkg}::EXPORT"});
+ $Exporter::Cache{$pkg} ||= {});
if (@imports) {
if (!%$export_cache) {
- s/^&// foreach @$exports;
- @{$export_cache}{@$exports} = (1) x @$exports;
- my $ok = \@{"${pkg}::EXPORT_OK"};
- if (@$ok) {
- s/^&// foreach @$ok;
- @{$export_cache}{@$ok} = (1) x @$ok;
- }
+ _rebuild_cache ($pkg, $exports, $export_cache);
+ $cache_is_current = 1;
}
if ($imports[0] =~ m#^[/!:]#){
@@ -97,7 +102,7 @@ sub heavy_export {
}
warn "Import ".($remove ? "del":"add").": @names "
- if $Verbose;
+ if $Exporter::Verbose;
if ($remove) {
foreach $sym (@names) { delete $imports{$sym} }
@@ -127,10 +132,21 @@ sub heavy_export {
last;
}
} elsif ($sym !~ s/^&// || !$export_cache->{$sym}) {
- # accumulate the non-exports
- push @carp,
- qq["$sym" is not exported by the $pkg module\n];
- $oops++;
+ # Last chance - see if they've updated EXPORT_OK since we
+ # cached it.
+
+ unless ($cache_is_current) {
+ %$export_cache = ();
+ _rebuild_cache ($pkg, $exports, $export_cache);
+ $cache_is_current = 1;
+ }
+
+ if (!$export_cache->{$sym}) {
+ # accumulate the non-exports
+ push @carp,
+ qq["$sym" is not exported by the $pkg module\n];
+ $oops++;
+ }
}
}
}
@@ -144,7 +160,7 @@ sub heavy_export {
}
my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"},
- \%{"${pkg}::EXPORT_FAIL"});
+ $Exporter::FailCache{$pkg} ||= {});
if (@$fail) {
if (!%$fail_cache) {
@@ -152,7 +168,7 @@ sub heavy_export {
# barewords twice... both with and without a leading &.
# (Technique could be applied to $export_cache at cost of memory)
my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @$fail;
- warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Verbose;
+ warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Exporter::Verbose;
@{$fail_cache}{@expanded} = (1) x @expanded;
}
my @failed;
@@ -172,7 +188,7 @@ sub heavy_export {
}
warn "Importing into $callpkg from $pkg: ",
- join(", ",sort @imports) if $Verbose;
+ join(", ",sort @imports) if $Exporter::Verbose;
foreach $sym (@imports) {
# shortcut for the common case of no type character
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/Changes b/gnu/usr.bin/perl/lib/ExtUtils/Changes
index 39bd0c8555f..3cbeddb84b2 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/Changes
+++ b/gnu/usr.bin/perl/lib/ExtUtils/Changes
@@ -1,3 +1,474 @@
+6.17 Sun Sep 14 20:52:45 PDT 2003
+ - Fixing LD so it can be set properly on Win32. (Orton Yves)
+ * Fixing the init_PERL() "tack $Config{exe_ext} onto $^X" logic so
+ it works on VMS allowing $^X to be found.
+ * Fixing make install UNINST=1 on Windows so it can search PERL5LIB
+ (Orton Yves)
+ - Fixing "could not open MANIFEST" test for OS/2 (and probably others)
+ where a read-only file cannot be deleted.
+ - Hacking around the fact that when built for debugging, VMS creates
+ ndbgperl.exe.
+ - Eliminating the never implemented "help" argument.
+
+6.16 Mon Aug 18 01:39:51 PDT 2003
+ * Fixing the max exec length for Windows to account for old
+ versions of nmake (the one you can download for free from MS).
+ - Hack to normalize //foo//bar paths in ExtUtils::Installed.
+ [Sreeji K Das]
+ * Adding Module::Build utility files to MANIFEST.SKIP
+ - PREREQ_PRINT is supposed to exit after dumping. (Wolfgang Friebel
+ bleadperl@20530)
+ - maniadd() was trying to open the MANIFEST even if it didn't need to
+ causing unnecessary errors for read-only MANIFESTs (rt.cpan.org 3180)
+
+6.15 Sun Aug 3 16:41:05 PDT 2003
+ - Make FIXIN on Win32 use the new pl2bat rather than an already
+ installed one when building the core (Mattia Barbon)
+
+6.14 Sun Aug 3 16:23:27 PDT 2003
+ - Adding a reference to the Module::Build META.yml spec in the META.yml
+ itself and the metafile documentation.
+ - Removed Begin/End comments from manifypods that were getting in the
+ way of users adding code to the manifypods target.
+ - Putting a POD2MAN macro back as an alias to POD2MAN_EXE and using
+ it instead of POD2MAN. This allows people to generate their own man
+ installation targets in a backwards compatible way.
+ * Adding reference to the Module::Build META file spec in the docs.
+
+6.13 Thu Jul 31 16:48:01 PDT 2003
+ - Generated META.yml now has the prereqs in sorted order (Andy Lester)
+ - Arguments to child Makefile.PLs were still having .. prepended. This
+ was exposed by the earlier fix of rt.perl.org 4345.
+ - extralibs.ld (for static builds) wasn't being cleaned up.
+
+6.12 Tue Jul 29 22:19:38 PDT 2003
+ - Should any of your prefixes be /, MakeMaker might lose this and
+ prepend your prefix as "prefixyour/directory" rather than
+ "prefix/your/directory" (Ed Moy bleadperl 20283)
+ - Reversing "realclean was duplicating work already done by clean"
+ (CVS 1.124 MM_Unix.pm). Turns out it wasn't a duplication and this
+ was causing INST_* files to be left behind if your INST_LIB wasn't
+ blib/* as in the perl core. realclean now removes the files copied
+ to INST_*.
+ - Eliminating xsubpp_version(). No longer relevant. It was checking
+ for a feature added to xsubpp before 5.003_07 and doing it in a
+ really bizarre way.
+
+6.11 Thu Jul 24 01:24:37 PDT 2003
+ - Small grammatical doc touch up by Sean Burke
+ - Making basic.t clean up better after itself so it can be run
+ twice without setting up and cleaning up Big-Dummy again.
+ * Noting where to find make in the README
+ * Noting that MakeMaker does not produce a GNU make compatible Makefile
+ on Windows.
+
+6.10_08 Mon Jul 21 18:17:06 PDT 2003
+ * $Config{installvendorman*dir} was being ignored and our default
+ always used. [rt.cpan.org #2949]
+ * Setting NORECURS to true was still resulting in a Makefile which
+ tried to recurse into subdirectories which contained a Makefile.PL
+ (it simply wouldn't have run them to generate Makefile's).
+ This appears to be a rather old bug.
+ [rt.cpan.org #2951]
+ * [rt.perl.org #4345] Arguments passed to WriteMakefile() would get
+ stopped upon by $self->{PARENT} in recursive builds in the process
+ of prepending a .. onto it.
+ - Command.t now using its own temp directory when testing
+ expand_wildcards() so no stray files confuse it.
+ * No longer warning about 'postamble' attribute.
+ - Added installvars() to list INSTALL* variables so we don't keep
+ repeating the list all over the code.
+ - Added init_DEST() to create DESTINSTALL* variables for installing
+ with DESTDIR set.
+ * DESTDIR + PREFIX now does not duplicate DESTDIR. [Redhat #91892
+ and part of rt.cpan.org #2954]
+ * DESTDIR is now not directly prepended to the INSTALL* variables.
+ installation targets now use DESTINSTALL* instead. This prevents
+ the DESTDIR from showing up in places it shouldn't like perllocal.pod.
+ DESTDIR is still appearing in .packlist (bug). [rt.cpan.org #2954]
+ - MM_VMS->prefixify() wasn't honoring the %Config_Override causing
+ some MakeMaker generated config variables to be ignored.
+ - MM_VMS->prefixify() was only VMSifying part of its filepaths causing
+ internal comparisions to get confused and think it had to prefixify
+ when it didn't.
+
+6.10_07 Sat Jul 5 16:12:52 PDT 2003
+ * Fixing location of perllocal.pod so its always in INSTALLARCHLIB
+ instead of one for each perl, site and vendor.
+ - Sun's make treats escaped newlines oddly. Switching oneliner() back
+ to using multiple -e's.
+ * Bug in libscan() meant that any .pm containing RCS or CVS or SCCS
+ in its name (for example, RCS.pm) would be skipped.
+ - Command.t was getting confused in the core because it was reading
+ files from the core t/ directory, not MakeMaker's t/ directry.
+ - MM_OS2 PERL_ARCHIVE_AFTER test wrong for a.out systems (Ilya)
+ - Fixing perllocal.pod and XS installation on VMS. An extraneous
+ newline was introduced when changing the install macros over to
+ $(ECHO).
+ - Added $(ECHO_N) macro to emulate 'echo -n'
+
+6.10_06 Sat Jun 7 00:55:29 PDT 2003
+ - Whoops, Liblist.t busted on VMS after I turned strict on in
+ ExtUtils::Liblist::Kid. Merely a test bug, not a real bug.
+ - Fixed metafile_addtomanifest failure so the proper error shows.
+ - Fixed metafile_addtomanifest failure diagnostic leaking out during
+ the basic.t test on Windows.
+
+6.10_05 Fri Jun 6 18:15:30 PDT 2003
+ * Documenting META.yml, NO_META
+ * Documenting the fact that distdir will auto generate META.yml and
+ alter your manifest.
+ * Adding META.yml autogeneration to the FAQ
+ - Recognizing comments with leading whitespace in MANIFESTs better.
+ - Small ExtUtils::Liblist::Kid problem on VMS (Craig Berry)
+ * Fixed "make install UNINST=1". Appears to have been broken somewhere
+ around 6.06_01.
+ - Documented the fourth argument to ExtUtils::Install::install()
+ - install() will now honor a PERL5LIB change between ExtUtils::Install
+ loading and install() running when uninstalling shadows.
+ - META.yml generation deals gracefully when the MANIFEST is read-only
+ (Slaven rt.cpan.org 2723)
+ - Fixing tests on limited dir depth VMS systems by moving the
+ dummy-install dir one level up (Craig Berry rt.cpan.org 2747)
+
+6.10_04 Fri May 23 01:13:04 PDT 2003
+ - Working around BSD threaading bug in version check. [from bleadperl]
+ - Added the Makefile to the dist dependencies. (Slaven Rezic)
+ - Reversing the find_perl() version check failure warning introced in
+ 6.10_03. Too talkative, warned when nothing was wrong.
+ * Fixing META.yml auto-addition when there's no newline at the end
+ of the MANIFEST [rt.cpan.org 2444]
+ * Making it a bit more obvious in the MANIFEST where META.yml comes from.
+ - Fixed $_ clobbering in ExtUtils::Manifest functions.
+ - [rt.cpan.org 2591] some LD_RUN_PATH thing (Marek Rouchal)
+ - Added core.\d+ files to 'make clean' [rt.cpan.org 2543] (Slaven Rezic)
+ - INST_* targets were expanded too early (Stas Bekman)
+ - Adding ExtUtils::MakeMaker::bytes (bytes.pm backwards compat wrapper)
+ - Fixing MM_MacOS so it will compile on 5.5.x machines (use bytes wrapper)
+ * Reducing perldepend set of CORE/*.h dependencies to what 5.5.3 has.
+ 5.5.3 should be able to compile XS again.
+ * Eliminating fakethr.h and perlsfio.h from VMS's perldepend as they
+ sometimes don't get installed.
+ - ExtUtils::Install was making a few directories even with the
+ "don't really do it" switch on (Slaven Rezic)
+ * can build static linked perl binaries again. Probably damaged in
+ 6.06_01 when $self->{MAKEFILE} became FIRST_MAKEFILE. (Nick Clark)
+
+6.10_03 Fri Apr 11 00:21:25 PDT 2003
+ * Added NO_META WriteMakefile() option to suppress generation of
+ META.yml. (Spoon, rt.cpan.org 2359)
+ - Spurious linebreak in uninstall_from_sitedirs on VMS (Craig Berry)
+ * A bit after 6.05 man page names would come out as lib::Foo::Bar
+ if the module name didn't contain a ::. Found with podulators.
+ Fixed.
+ * Skipping installation of RCS ,v files.
+ * 'make ci' was busted between 6.05 and 6.06_01. Fixed. (Andreas)
+ - 'make test' was broken when there's no tests. Introduced in 6.06_03.
+ (Stas Bekman)
+ - Solving some directory depth problems in tests on oldish VMS systems.
+ (Craig Berry)
+ - Fixing MM_MacOS so it compiles on UTF-8 systems. (Jarkko)
+ - Making find_perl() more talkative when the version check fails
+ miserably.
+ - Fixing PERL_ARCHIVE on VMS so XS can compile again (Craig Berry)
+
+6.10_02 Mon Apr 7 00:57:15 PDT 2003
+ * Removed 2>&1 experiment introduced in 6.10_01 for all non-Unixen
+ except for OS/2. Thought Perl might emulate `... 2>&1`. It doesn't.
+ Just on OS/2.
+
+6.10_01 Sun Apr 6 19:31:42 PDT 2003
+ - Making install "Skip ... (unchanged)" message happen consistently
+ - Checking file sizes as well as modification times when deciding
+ to skip installing a file.
+ - OS/2 was using $(RM) instead of $(RM_F) (Ilya)
+ - OS/2 needs .dll removed on failed build (Ilya)
+ - fixin() was assuming that rename() can overwrite the target (Ilya)
+ - manifypods target was empty if there are no pods to manify. Put in
+ at least $(NOECHO) $(NOOP)
+ - Cygwin test to check for finding pod2man when building the perl core
+ removed. No longer relevent.
+ - Small fixes for dmake (Mattia Barbon)
+ * Added "Reporting bugs" section to the PATCHING doc.
+ - Minor bug in compile test missed ExtUtils::Liblist::Kid
+ - Removing $(VERSION_FROM) from Makefile dependency. It was too
+ annoying to rebuild the Makefile every time the module changed.
+ Mentioned it in the FAQ instead.
+ - Fixing PERL_ARCHIVE macro on VMS. Apparently it never appeared
+ properly before. (Craig Berry)
+ - Fixing ECHO on dmake.
+ - Adding os_flavor() and os_flavor_is()
+ - Making basic.t error output combine STDOUT & STDERR for easier
+ reading.
+ * ExtUtils::Manifest will now work case insensitively.
+ - Fixed 'subroutine redefined' warnings in 00compile.t
+ - Fixed it so typemaps are only looked for in the perl core library.
+ * Hacking around VMS filesystem problems reconstructing package names
+ from filenames in ExtUtils::Installed. (Jesper Naur)
+
+# There was no 6.06, I jumped straight to 6.10_XX because there's been
+# so much change between 6.05 and now.
+
+6.06_05 Mon Mar 31 02:44:11 PST 2003
+ - Syncing into bleadperl. Minor nits revealed...
+ - AutoSplit open filehandle bug was fixed in bleadperl. Averted a
+ warning because of this.
+ - hint files were only being loaded if . happened to be in @INC.
+ A bug/feature of File::Spec was stripping off the current dir from
+ the front of hintfile paths causing Perl to look for them in @INC.
+ Worked around.
+ - Now checking $! for errors if a hint file returns undef
+ - compile test was testing all of perl! Scaling back to just ExtUtils/
+
+6.06_04 Sun Mar 30 20:34:39 PST 2003
+ - Now looking for ExtUtils::xsubpp through @INC rather than just
+ the perl core directories. This helps ExtUtils::ParseXS.
+ - Systems which don't put their libraries under their $Config{prefix}
+ (OS X, Debian) weren't putting their libraries in the spot declared
+ in Config. It was going under $Config{prefix}.
+ - Prerequisites check now deals better with X.Y_Z style alpha versions
+ - ExtUtils::Liblist->ext() was using $Config{perllibs} which is a 5.6.1
+ thing. Falling back to $Config{libs} if perllibs isn't there.
+ - ExtUtils::Command::MM now reads from @ARGV if called with no
+ args. Makes the one liner a bit simpler.
+ * Restored ExtUtils::Liblist::ext() for backwards compatibility.
+ Missing since 5.6.1.
+ - Switching to relative dirs for self-building to shorten
+ command line lengths.
+ - Fixing minor test warning on VMS when compiling ExtUtils::Manifest
+ - Skipping STDIN read prompt() tests on 5.5.3. Can't test due to
+ eof() not honor tied handles.
+ - Config.pm on 5.5.3 doesn't have any concept of vendor*. This was
+ causing warnings when generating the Makefile.
+
+6.06_03 Sat Mar 29 19:44:53 PST 2003
+ - Added AUTHOR and ABSTRACT_FROM info for ppd generation.
+ - Added echo() method to portably echo text to a file.
+ - Worked around 5.8.0 eval 'require Foo::Bar' bug causing MakeMaker
+ to think modules weren't installed.
+ - Modernized VMS doc_*_install targets
+ - Changed some $(PERL) -e "print ..." code to use $(ECHO).
+ - Replaced uses of Delete/NoLog/NoConfirm with $(RM_F) in MM_VMS
+ - Fixed some duplicate macros making MMS happy.
+ - Fixed $ExtUtils::MM_VMS::Revision. It was just the $VERSION before.
+ - Fixed ExtUtils::Command::MM::perllocal_install(), uninstall(),
+ warn_if_old_packlist().
+ * Pulling File::Spec::VMS::fixpath() and eliminate_macros() into MM_VMS
+ as the new cannonical location. They never should have been in F::S
+ in the first place.
+ * ExtUtils::Command::eqtime() would truncate the file being equalized!
+ Holdover from exclusive .exists usage.
+ - Cleaned up hard coded 'echo' and '@' to $(ECHO) and $(NOECHO)
+ - $(SAY) is now $(ECHO) on VMS
+ - Moved rogue initializations from tools_other() to init_others()
+ - Normalized MM_VMS's tools_other() to mostly use its superclass.
+ - split_command() was off-by-one when calculating max command line
+ lengths causing it to run over on VMS
+ - made split_command() a bit smarter, taking into account some macro
+ expansion
+ - Fixed initialization of OBJECT, DISTNAME and LDFROM on VMS
+ - Fixed *_install target uses of File::Spec.
+ - Added ExtUtils::MakeMaker::vmsish wrapper around vmsish so MM_VMS
+ can be compiled on non-VMS machines. For testing.
+ * Added ExtUtils::MakeMaker::Tutorial about writing modules with
+ MakeMaker.
+ - Removed "always use h2xs" dogma.
+ - Added compile & POD test
+ * 'make distdir' now generates META.yml module meta-data file.
+ Proof of concept. Have to syncronize with Module::Build.
+ * Added maniadd() to ExtUtils::Manifest to add entries to the MANIFEST
+ * ExtUtils::Command::chmod was not interpreting file permissions as
+ octal. Also, docs & tests slightly wrong (thanks Stas Bekman).
+ - ExtUtils::Install was hard coding blib/lib and blib/arch, unportable
+ [perl #21526]
+
+6.06_02 Mon Dec 23 20:39:57 PST 2002
+ * Lots of Win32 fixes busted between 6.05 and 6.06_01.
+ * split_command() tests still not happy on Win32. Problems with
+ shell vs Makefile escaping makes testing difficult.
+ * VMS still broken. Need to convert File::Spec method calls back to
+ object method calls so the weird FS::VMS->eliminate_macros() and
+ fixpath() work again.
+
+6.06_01 Thu Dec 19 00:14:49 PST 2002
+ - Andreas found that when building the core it is desirable for
+ MakeMaker to use a relative path to perl.
+ - File::Spec->catfile() has a bug where the resulting file may not be
+ canonicalized. This was causing problems when generating manpaths.
+ MakeMaker now uses its own fixed override for catfile().
+ - Fixed the POD recognition regex to properly catch /=head\d/ tags.
+ * Added a PATCHING guideline document.
+ - Updated the class hierarchy in NOTES.
+ - Installed.t now cleans up after itself better.
+ - Steve Purkis rewrote the manifypods system to use Pod::Man
+ rather than pod2man. Its now portable and manifypods() moved from
+ MM_Unix to MM_Any. As a result, lots of icky and redudant code went
+ away. This also removes the POD2MAN macro, but noone should be
+ using that.
+ - "make manifypods" now works on Win32
+ - "make manifypods" is now be faster
+ - Made MM_Unix->find_perl more portable. Eliminated MM_Win32->find_perl
+ override. MM_VMS->find_perl remains.
+ * find_perl() can now handle filenames with spaces in them (RT448)
+ * find_perl() on Win32 no longer produces spurious "File Creation error"
+ messages (perlbug ID 20020709.001)
+ - Removed unfinished and unused maybe_command_in_dirs()
+ - Removed dead SelfLoader cruft from MM_Unix.
+ - Fixed PPD generation when the ppd contains quotes (RT1473)
+ - Fixed PPD generation on VMS
+ - Moved Win9x specific subdir_x() code from MM_Unix to MM_Win95
+ * Craig Berry fixed hint files on VMS
+ - Added the perl_onliner() method to generate portable, safe one-liners
+ - Changing hardcoded $self->{MAKEFILE} to $(FIRST_MAKEFILE).
+ * Rafael Garcia-Suarez made MakeMaker ignore Subversion control files
+ by default.
+ - Added MAKEFILE_OLD macro.
+ * No longer generating man pages by default on VMS.
+ - Improved DISTNAME docs
+ * Documented DISTVNAME and VERSION_SYM
+ * Documented dist()
+ - Seperated dist_core() into dist, tardist, uutardist, tarfile,
+ zipdist, zipfile and shdist_target methods. Allows elimination
+ of redundant code in MM_VMS.
+ - Replaced WARN_IF_OLD_PACKLIST, DOC_INSTALL and UNINSTALL
+ one-liners with ExtUtils::Command::MM functions
+ - Replaced VMS hand-rolled perl code for TOUCH, CHMOD, RM_F and RM_RF
+ with ExtUtils::Command functions. Added TEST_F.
+ - Adding clean_subdirs target and clean_subdirs_target() method to
+ generate same. This allows easier overriding of an unportable part
+ of the clean target.
+ - Defined DEV_NULL for MacOS
+ - Removed ROOTEXT from MM_MacOS, apparently unused
+ - Added $(DIRFILESEP) macro and init_DIRFILESEP to avoid
+ hardcoding / or \. Reduces code duplication in the MM_* modules.
+ - Added init_platform() and platform_constants() for OS specific
+ macros. Moved OS specific macros from constants() overrides there.
+ - Added init_VERSION() to setup various *VERSION* macros.
+ - Added default wraplist() to make porting easier.
+ - Added makemakerdflt_target() to guarantee 'all' is the default
+ target.
+ - Added special_targets() to handle things like .PHONY and make sure
+ they come first.
+ - Added init_linker() to initialize linker relatied macros.
+ - MM_MacOS constants() disolves
+ Moved MACPERL_SRC, MACPERL_LIB, MACPERL_INC from init_main() to
+ init_platform().
+ Moved DEFINE and INC tweaking from constants() to init_main()
+ Moved DEFINE_VERSION & XS_DEFINE_VERSION from constants() to
+ init_VERSION().
+ Eliminated MODULES. Unused and its the same as TO_INST_PM
+ Moved .INCLUDE from constants() to special_targets()
+
+ - MM_NW5 constants() & init_others() disolves
+ Moved LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH from
+ init_others() to init_platform()
+ Moved INCLUDE and PATH definitions from constants() to
+ init_platform()
+ Moved BOOT_SYMBOL, NLM_SHORT_NAME, PATH and INCLUDE from
+ constants() to init_platform()
+
+ - MM_Unix constants() goes on a diet
+ Moved all macro definitions to init_* methods.
+ Added MM_REVISION for completeness
+ Using wraplist() instead of manual joining
+ Moved .NO_CONFIG_REC, .SUFFIXES and .PHONY to special_targets()
+ Moved makemakerdflt: to makemakerdeflt_target()
+ Moved INST_{STATIC,DYNAMIC,BOOT} to init_INST()
+ Moved EXPORT_LIST, PERL_ARCHIVE & PERL_ARCHIVE_AFTER to init_linker().
+ Moved PERL_MALLOC_DEF to init_platform()
+
+ - MM_VMS constants() goes on a diet
+ Moved DEFINE from constants() to init_main()
+ Moved OBJECT & LDFROM from constants() to init_others()
+ Moved MM_VMS_REVISION and PERL_VMS to init_platform
+ Added MM_VMS_VERSION
+ Moved DEFINE_VERSION, XS_DEFINE_VERSION and MAKEMAKER changes to
+ init_VERSION
+ Moved .SUFFIXES changes to special_targets() override.
+ Eliminated $self->{PM_TO_BLIB}. Its redundant with $self->{PM}.
+ constants() now consists only of fixpath() calls.
+
+ - MM_Win32 constants() goes away
+ Moved .USESHELL to special_targets() override.
+ Everything else was redundant.
+
+ - Added $(VERSION_FROM) to $(MAKEFILE) dependencies. Helpful for
+ XS builds where the version number is very sensitive.
+ - export_list(), perl_archive() and perl_archive_after() consolodated
+ into init_linker().
+ - Added MM_NW5_VERSION, MM_Unix_VERSION, MM_Win32_VERSION,
+ MM_VMS_VERSION.
+ - Eliminated duplicate code in constants() overrides
+ - Added all_target() for easier customization of what's run by default
+ - Eliminated duplicate top_targets() overrides
+ - Made tool_autosplit() method portable. Moved to MM_Any. Eliminated
+ overrides.
+ - Adding realclean_subdirs target and realclean_subdirs_target()
+ method to generate same. This allows easier overriding of an
+ unportable part of the realclean target.
+ - Added oneliner() to create portable perl one-liners.
+ - Craig Berry found some typos in ExtUtils::Liblist::Kid's VMS part
+ * ExtUtils::Install did not work on MacPerl due to a hardcoded '.'
+ * prompt() will now read from STDIN.
+ - Craig Berry made sure extliblist() is always called even if LIBS
+ is explicitly set to empty.
+ * Added DESTDIR to make repacking easier.
+ * $(*PREFIX) are returned to the INSTALL* variables.
+ * Split $(PREFIX) into $(PERLPREFIX) and $(PREFIX). The former
+ holds the location of the core libraries. The latter is the
+ optional override prefix supplied by the user.
+ * PREFIX overrides all other *PREFIXes when set in the Makefile.PL.
+ This restores "make install PREFIX=foo".
+ - Added quote_literal() to handle some shell quoting.
+ - ExtUtils::MM_VMS now compilable on non-VMS platforms.
+ - J. D. Laub made MakeMaker honor $Config{installstyle}
+ - Renaming on OS/2 requires the target file to be removed.
+ Partially fixed by Ilya, should be applied universally later.
+ - Default MANIFEST.SKIP not catching files in subdirs. Fixed by Ilya.
+ - Ilya fixed ExtUtils::Liblist->ext when called outside MakeMaker.
+ - realclean was duplicating work already done by clean
+ - Adding an explicit LICENSE
+ - Cleaning up ExtUtils::Install docs.
+ - ExtUtils::Install::uninstall() now has default verbose and
+ dont_execute arguments.
+ - Added some basic ExtUtils::Install tests
+ - Fixed ExtUtils::Install::install() for relative dirs
+ - Added split_command() and max_exec_len() to deal with long
+ commands.
+ - Seperated escape_newlines() from quote_literal(). This may
+ be pointless.
+ - pm_to_blib() now generated with split_command(). 3x speedup.
+ - added init_dist() to initialize distribution constants
+ - ExtUtils::Install::pm_to_blib() working around open filehandle
+ bug in AutoSplit for systems with mandatory file locking.
+
+6.05 Tue Aug 27 16:09:51 PDT 2002
+ - Output format of the hint file verbose diagnostic is now in
+ a format native to the OS, so it broke a test on non-Unixen.
+
+6.04 Mon Aug 26 18:31:11 PDT 2002
+ - Little fix for pre-5.8 Cygwin test to get the shared library names
+ right.
+ * disttest on Win9X broken because of forgotten tabs
+ * WriteMakefile argument verification should now be accurate
+ - Documented the LD flag.
+ * Documented prompt()
+ * vendor install was not adding to packlist or updating perllocal.
+ - Supporting $Config{vendorarchexp} and $Config{vendorlibexp}.
+ - Fixed conflict on VMS between logical names and directories
+ (bleadperl 17488)
+ - Fixed space-vs-tab bug on Netware (bleadperl 17579)
+ - Mysterious NetWare fix from Ananth (bleadperl 17376)
+ - Support OPTIMIZE in MacOS (bleadperl 17347)
+ - Support hints in MacOS (mutation of bleadperl 17347)
+ * Default man installation directories were using $(MAN*EXT) to
+ generate the directory name. This turned out to be wrong more
+ often than right, so we'll use man1 and man3 hard-coded.
+ - Debian folks fixed the doc_install targets so the Appending
+ diagnostic gives the correct directory for perllocal.pod
+ * Added ExtUtils::MakeMaker::FAQ
+ - Quieted some warnings on MacOS (bleadperl 17669)
+
6.03 Wed Jun 19 17:06:14 EDT 2002
- Documented that we're clamping down on cargo-cult MakeMaker
programming.
@@ -289,7 +760,7 @@
5.50_01 Mon Mar 4 23:44:48 EST 2002
[[ API Changes ]]
- htmlifypods and all HTML targets have been removed. It didn't
+ - htmlifypods and all HTML targets have been removed. It didn't
work properly. A target for HTMLifying of docs will be
added sometime in the future (read: send a patch).
- Deprecated ROOTEXT variable removed (its been deprecated for
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/Command/MM.pm b/gnu/usr.bin/perl/lib/ExtUtils/Command/MM.pm
index 9eb7d292993..a597cc48a96 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/Command/MM.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/Command/MM.pm
@@ -7,8 +7,11 @@ require Exporter;
use vars qw($VERSION @ISA @EXPORT);
@ISA = qw(Exporter);
-@EXPORT = qw(test_harness);
-$VERSION = '0.01';
+@EXPORT = qw(test_harness pod2man perllocal_install uninstall
+ warn_if_old_packlist);
+$VERSION = '0.03';
+
+my $Is_VMS = $^O eq 'VMS';
=head1 NAME
@@ -16,7 +19,7 @@ ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
=head1 SYNOPSIS
- perl -MExtUtils::Command::MM -e "function" files...
+ perl "-MExtUtils::Command::MM" -e "function" "--" arguments...
=head1 DESCRIPTION
@@ -26,8 +29,6 @@ B<FOR INTERNAL USE ONLY!> The interface is not stable.
ExtUtils::Command::MM encapsulates code which would otherwise have to
be done with large "one" liners.
-They all read their input from @ARGV unless otherwise noted.
-
Any $(FOO) used in the examples are make variables, not Perl.
=over 4
@@ -54,6 +55,203 @@ sub test_harness {
Test::Harness::runtests(sort { lc $a cmp lc $b } @ARGV);
}
+
+
+=item B<pod2man>
+
+ pod2man( '--option=value',
+ $podfile1 => $manpage1,
+ $podfile2 => $manpage2,
+ ...
+ );
+
+ # or args on @ARGV
+
+pod2man() is a function performing most of the duties of the pod2man
+program. Its arguments are exactly the same as pod2man as of 5.8.0
+with the addition of:
+
+ --perm_rw octal permission to set the resulting manpage to
+
+And the removal of:
+
+ --verbose/-v
+ --help/-h
+
+If no arguments are given to pod2man it will read from @ARGV.
+
+=cut
+
+sub pod2man {
+ require Pod::Man;
+ require Getopt::Long;
+
+ my %options = ();
+
+ # We will cheat and just use Getopt::Long. We fool it by putting
+ # our arguments into @ARGV. Should be safe.
+ local @ARGV = @_ ? @_ : @ARGV;
+ Getopt::Long::config ('bundling_override');
+ Getopt::Long::GetOptions (\%options,
+ 'section|s=s', 'release|r=s', 'center|c=s',
+ 'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
+ 'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l',
+ 'name|n=s', 'perm_rw:i'
+ );
+
+ # If there's no files, don't bother going further.
+ return 0 unless @ARGV;
+
+ # Official sets --center, but don't override things explicitly set.
+ if ($options{official} && !defined $options{center}) {
+ $options{center} = 'Perl Programmers Reference Guide';
+ }
+
+ # This isn't a valid Pod::Man option and is only accepted for backwards
+ # compatibility.
+ delete $options{lax};
+
+ my $parser = Pod::Man->new(%options);
+
+ do {{ # so 'next' works
+ my ($pod, $man) = splice(@ARGV, 0, 2);
+
+ next if ((-e $man) &&
+ (-M $man < -M $pod) &&
+ (-M $man < -M "Makefile"));
+
+ print "Manifying $man\n";
+
+ $parser->parse_from_file($pod, $man)
+ or do { warn("Could not install $man\n"); next };
+
+ if (length $options{perm_rw}) {
+ chmod(oct($options{perm_rw}), $man)
+ or do { warn("chmod $options{perm_rw} $man: $!\n"); next };
+ }
+ }} while @ARGV;
+
+ return 1;
+}
+
+
+=item B<warn_if_old_packlist>
+
+ perl "-MExtUtils::Command::MM" -e warn_if_old_packlist <somefile>
+
+Displays a warning that an old packlist file was found. Reads the
+filename from @ARGV.
+
+=cut
+
+sub warn_if_old_packlist {
+ my $packlist = $ARGV[0];
+
+ return unless -f $packlist;
+ print <<"PACKLIST_WARNING";
+WARNING: I have found an old package in
+ $packlist.
+Please make sure the two installations are not conflicting
+PACKLIST_WARNING
+
+}
+
+
+=item B<perllocal_install>
+
+ perl "-MExtUtils::Command::MM" -e perllocal_install
+ <type> <module name> <key> <value> ...
+
+ # VMS only, key/value pairs come on STDIN
+ perl "-MExtUtils::Command::MM" -e perllocal_install
+ <type> <module name> < <key> <value> ...
+
+Prints a fragment of POD suitable for appending to perllocal.pod.
+Arguments are read from @ARGV.
+
+'type' is the type of what you're installing. Usually 'Module'.
+
+'module name' is simply the name of your module. (Foo::Bar)
+
+Key/value pairs are extra information about the module. Fields include:
+
+ installed into which directory your module was out into
+ LINKTYPE dynamic or static linking
+ VERSION module version number
+ EXE_FILES any executables installed in a space seperated
+ list
+
+=cut
+
+sub perllocal_install {
+ my($type, $name) = splice(@ARGV, 0, 2);
+
+ # VMS feeds args as a piped file on STDIN since it usually can't
+ # fit all the args on a single command line.
+ @ARGV = split /\|/, <STDIN> if $Is_VMS;
+
+ my $pod;
+ $pod = sprintf <<POD, scalar localtime;
+ =head2 %s: C<$type> L<$name|$name>
+
+ =over 4
+
+POD
+
+ do {
+ my($key, $val) = splice(@ARGV, 0, 2);
+
+ $pod .= <<POD
+ =item *
+
+ C<$key: $val>
+
+POD
+
+ } while(@ARGV);
+
+ $pod .= "=back\n\n";
+ $pod =~ s/^ //mg;
+ print $pod;
+
+ return 1;
+}
+
+=item B<uninstall>
+
+ perl "-MExtUtils::Command::MM" -e uninstall <packlist>
+
+A wrapper around ExtUtils::Install::uninstall(). Warns that
+uninstallation is deprecated and doesn't actually perform the
+uninstallation.
+
+=cut
+
+sub uninstall {
+ my($packlist) = shift;
+
+ require ExtUtils::Install;
+
+ print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+We will show what would have been done.
+
+WARNING
+
+ ExtUtils::Install::uninstall($packlist, 1, 1);
+
+ print <<'WARNING';
+
+Uninstall is unsafe and deprecated, the uninstallation was not performed.
+Please check the list above carefully, there may be errors.
+Remove the appropriate files manually.
+Sorry for the inconvenience.
+
+WARNING
+
+}
+
=back
=cut
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/Constant.pm b/gnu/usr.bin/perl/lib/ExtUtils/Constant.pm
index 1268ce02ba9..9730d910735 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/Constant.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/Constant.pm
@@ -1,6 +1,6 @@
package ExtUtils::Constant;
use vars qw (@ISA $VERSION %XS_Constant %XS_TypeSet @EXPORT_OK %EXPORT_TAGS);
-$VERSION = '0.12';
+$VERSION = '0.14';
=head1 NAME
@@ -94,8 +94,11 @@ if ($] >= 5.006) {
eval "use warnings; 1" or die $@;
}
use strict;
+use vars '$is_perl56';
use Carp;
+$is_perl56 = ($] < 5.007 && $] > 5.005_50);
+
use Exporter;
use Text::Wrap;
$Text::Wrap::huge = 'overflow';
@@ -150,7 +153,12 @@ characters.
sub C_stringify {
local $_ = shift;
return unless defined $_;
- confess "Wide character in '$_' intended as a C identifier" if tr/\0-\377//c;
+ # grr 5.6.1
+ confess "Wide character in '$_' intended as a C identifier"
+ if tr/\0-\377// != length;
+ # grr 5.6.1 moreso because its regexps will break on data that happens to
+ # be utf8, which includes my 8 bit test cases.
+ $_ = pack 'C*', unpack 'U*', $_ . pack 'U*' if $is_perl56;
s/\\/\\\\/g;
s/([\"\'])/\\$1/g; # Grr. fix perl mode.
s/\n/\\n/g; # Ensure newlines don't end up in octal
@@ -189,13 +197,27 @@ sub perl_stringify {
s/\t/\\t/g;
s/\f/\\f/g;
s/\a/\\a/g;
- s/([^\0-\177])/sprintf "\\x{%X}", ord $1/ge;
unless ($] < 5.006) {
+ if ($] > 5.007) {
+ s/([^\0-\177])/sprintf "\\x{%X}", ord $1/ge;
+ } else {
+ # Grr 5.6.1. And I don't think I can use utf8; to force the regexp
+ # because 5.005_03 will fail.
+ # This is grim, but I also can't split on //
+ my $copy;
+ foreach my $index (0 .. length ($_) - 1) {
+ my $char = substr ($_, $index, 1);
+ $copy .= ($char le "\177") ? $char : sprintf "\\x{%X}", ord $char;
+ }
+ $_ = $copy;
+ }
# This will elicit a warning on 5.005_03 about [: :] being reserved unless
# I cheat
my $cheat = '([[:^print:]])';
s/$cheat/sprintf "\\%03o", ord $1/ge;
} else {
+ # Turns out "\x{}" notation only arrived with 5.6
+ s/([^\0-\177])/sprintf "\\x%02X", ord $1/ge;
require POSIX;
s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
}
@@ -241,6 +263,11 @@ is equal to the C variable C<name>. If I<CHECKED_AT> is defined, then it
is used to avoid C<memEQ> for short names, or to generate a comment to
highlight the position of the character in the C<switch> statement.
+If I<CHECKED_AT> is a reference to a scalar, then instead it gives
+the characters pre-checked at the beginning, (and the number of chars by
+which the C variable name has been advanced. These need to be chopped from
+the front of I<NAME>).
+
=cut
sub memEQ_clause {
@@ -248,6 +275,14 @@ sub memEQ_clause {
# Which could actually be a character comparison or even ""
my ($name, $checked_at, $indent) = @_;
$indent = ' ' x ($indent || 4);
+ my $front_chop;
+ if (ref $checked_at) {
+ # regexp won't work on 5.6.1 without use utf8; in turn that won't work
+ # on 5.005_03.
+ substr ($name, 0, length $$checked_at,) = '';
+ $front_chop = C_stringify ($$checked_at);
+ undef $checked_at;
+ }
my $len = length $name;
if ($len < 2) {
@@ -267,12 +302,38 @@ sub memEQ_clause {
return $indent . "if (name[$check] == '$char') {\n";
}
}
- # Could optimise a memEQ on 3 to 2 single character checks here
+ if (($len == 2 and !defined $checked_at)
+ or ($len == 3 and defined ($checked_at) and $checked_at == 2)) {
+ my $char1 = C_stringify (substr $name, 0, 1);
+ my $char2 = C_stringify (substr $name, 1, 1);
+ return $indent . "if (name[0] == '$char1' && name[1] == '$char2') {\n";
+ }
+ if (($len == 3 and defined ($checked_at) and $checked_at == 1)) {
+ my $char1 = C_stringify (substr $name, 0, 1);
+ my $char2 = C_stringify (substr $name, 2, 1);
+ return $indent . "if (name[0] == '$char1' && name[2] == '$char2') {\n";
+ }
+
+ my $pointer = '^';
+ my $have_checked_last = defined ($checked_at) && $len == $checked_at + 1;
+ if ($have_checked_last) {
+ # Checked at the last character, so no need to memEQ it.
+ $pointer = C_stringify (chop $name);
+ $len--;
+ }
+
$name = C_stringify ($name);
my $body = $indent . "if (memEQ(name, \"$name\", $len)) {\n";
- $body .= $indent . "/* ". (' ' x $checked_at) . '^'
- . (' ' x ($len - $checked_at + length $len)) . " */\n"
- if defined $checked_at;
+ # Put a little ^ under the letter we checked at
+ # Screws up for non printable and non-7 bit stuff, but that's too hard to
+ # get right.
+ if (defined $checked_at) {
+ $body .= $indent . "/* ". (' ' x $checked_at) . $pointer
+ . (' ' x ($len - $checked_at + length $len)) . " */\n";
+ } elsif (defined $front_chop) {
+ $body .= $indent . "/* $front_chop"
+ . (' ' x ($len + 1 + length $len)) . " */\n";
+ }
return $body;
}
@@ -433,7 +494,7 @@ sub match_clause {
$body .= $indent . " } else {\n";
$body .= return_clause ($no, 4 + length $indent);
}
- $body .= $indent . " }";
+ $body .= $indent . " }\n";
} else {
$body .= return_clause ($item, 2 + length $indent);
}
@@ -466,7 +527,11 @@ sub switch_clause {
}
my @safe_names = @names;
foreach (@safe_names) {
- next unless tr/A-Za-z0-9_//c;
+ confess sprintf "Name '$_' is length %d, not $namelen", length
+ unless length == $namelen;
+ # Argh. 5.6.1
+ # next unless tr/A-Za-z0-9_//c;
+ next if tr/A-Za-z0-9_// == length;
$_ = '"' . perl_stringify ($_) . '"';
# Ensure that the enclosing C comment doesn't end
# by turning */ into *" . "/
@@ -478,12 +543,20 @@ sub switch_clause {
# Figure out what to switch on.
# (RMS, Spread of jump table, Position, Hashref)
my @best = (1e38, ~0);
- foreach my $i (0 .. ($namelen - 1)) {
+ # Prefer the last character over the others. (As it lets us shortern the
+ # memEQ clause at no cost).
+ foreach my $i ($namelen - 1, 0 .. ($namelen - 2)) {
my ($min, $max) = (~0, 0);
my %spread;
+ if ($is_perl56) {
+ # Need proper Unicode preserving hash keys for bytes in range 128-255
+ # here too, for some reason. grr 5.6.1 yet again.
+ tie %spread, 'ExtUtils::Constant::Aaargh56Hash';
+ }
foreach (@names) {
my $char = substr $_, $i, 1;
my $ord = ord $char;
+ confess "char $ord is out of range" if $ord > 255;
$max = $ord if $ord > $max;
$min = $ord if $ord < $min;
push @{$spread{$char}}, $_;
@@ -501,6 +574,8 @@ sub switch_clause {
# the string wins. Because if that passes but the memEQ fails, it may
# only need the start of the string to bin the choice.
# I think. But I'm micro-optimising. :-)
+ # OK. Trump that. Now favour the last character of the string, before the
+ # rest.
my $ss;
$ss += @$_ * @$_ foreach values %spread;
my $rms = sqrt ($ss / keys %spread);
@@ -508,18 +583,31 @@ sub switch_clause {
@best = ($rms, $max - $min, $i, \%spread);
}
}
- die "Internal error. Failed to pick a switch point for @names"
+ confess "Internal error. Failed to pick a switch point for @names"
unless defined $best[2];
# use Data::Dumper; print Dumper (@best);
my ($offset, $best) = @best[2,3];
$body .= $indent . "/* Offset $offset gives the best switch position. */\n";
- $body .= $indent . "switch (name[$offset]) {\n";
+
+ my $do_front_chop = $offset == 0 && $namelen > 2;
+ if ($do_front_chop) {
+ $body .= $indent . "switch (*name++) {\n";
+ } else {
+ $body .= $indent . "switch (name[$offset]) {\n";
+ }
foreach my $char (sort keys %$best) {
+ confess sprintf "'$char' is %d bytes long, not 1", length $char
+ if length ($char) != 1;
+ confess sprintf "char %#X is out of range", ord $char if ord ($char) > 255;
$body .= $indent . "case '" . C_stringify ($char) . "':\n";
foreach my $name (sort @{$best->{$char}}) {
my $thisone = $items->{$name};
# warn "You are here";
- $body .= match_clause ($thisone, $offset, 2 + length $indent);
+ if ($do_front_chop) {
+ $body .= match_clause ($thisone, \$char, 2 + length $indent);
+ } else {
+ $body .= match_clause ($thisone, $offset, 2 + length $indent);
+ }
}
$body .= $indent . " break;\n";
}
@@ -581,7 +669,11 @@ sub dump_names {
next if $_->{utf8} eq 'no';
# Copy the hashref, as we don't want to mess with the caller's hashref.
$_ = {%$_};
- utf8::decode ($_->{name});
+ unless ($is_perl56) {
+ utf8::decode ($_->{name});
+ } else {
+ $_->{name} = pack 'U*', unpack 'U0U*', $_->{name};
+ }
delete $_->{utf8};
}
} else {
@@ -589,7 +681,9 @@ sub dump_names {
$type = $default_type;
}
$used_types{$type}++;
- if ($type eq $default_type and 0 == ($_->{name} =~ tr/A-Za-z0-9_//c)
+ if ($type eq $default_type
+ # grr 5.6.1
+ and length $_->{name} == ($_->{name} =~ tr/A-Za-z0-9_//)
and !defined ($_->{macro}) and !defined ($_->{value})
and !defined ($_->{default}) and !defined ($_->{pre})
and !defined ($_->{post}) and !defined ($_->{def_pre})
@@ -836,6 +930,11 @@ sub C_constant {
# be a hashref, and pinch %$items from our parent to save recalculation.
($namelen, $items) = @$breakout;
} else {
+ if ($is_perl56) {
+ # Need proper Unicode preserving hash keys.
+ $items = {};
+ tie %$items, 'ExtUtils::Constant::Aaargh56Hash';
+ }
$breakout ||= 3;
$default_type ||= 'IV';
if (!ref $what) {
@@ -870,7 +969,10 @@ sub C_constant {
$what->{$default_type} = 1;
}
warn "ExtUtils::Constant doesn't know how to handle values of type $_ used in macro $name" unless defined $XS_Constant{$item->{type}};
- if ($name !~ tr/\0-\177//c) {
+ # tr///c is broken on 5.6.1 for utf8, so my original tr/\0-\177//c
+ # doesn't work. Upgrade to 5.8
+ # if ($name !~ tr/\0-\177//c || $] < 5.005_50) {
+ if ($name =~ tr/\0-\177// == length $name || $] < 5.005_50) {
# No characters outside 7 bit ASCII.
if (exists $items->{$name}) {
die "Multiple definitions for macro $name";
@@ -881,7 +983,12 @@ sub C_constant {
if (exists $items->{$name} and ref $items->{$name} ne 'ARRAY') {
confess "Unexpected ASCII definition for macro $name";
}
- if ($name !~ tr/\0-\377//c) {
+ # Again, 5.6.1 tr broken, so s/5\.6.*/5\.8\.0/;
+ # if ($name !~ tr/\0-\377//c) {
+ if ($name =~ tr/\0-\377// == length $name) {
+# if ($] < 5.007) {
+# $name = pack "C*", unpack "U*", $name;
+# }
$item->{utf8} = 'no';
$items->{$name}[1] = $item;
push @new_items, $item;
@@ -889,7 +996,13 @@ sub C_constant {
$item = {%$item};
}
# Encode the name as utf8 bytes.
- utf8::encode($name);
+ unless ($is_perl56) {
+ utf8::encode($name);
+ } else {
+# warn "Was >$name< " . length ${name};
+ $name = pack 'C*', unpack 'C*', $name . pack 'U*';
+# warn "Now '${name}' " . length ${name};
+ }
if ($items->{$name}[0]) {
die "Multiple definitions for macro $name";
}
@@ -936,7 +1049,18 @@ sub C_constant {
next unless $by_length[$i]; # None of this length
$body .= " case $i:\n";
if (@{$by_length[$i]} == 1) {
- $body .= match_clause ($by_length[$i]->[0]);
+ my $only_thing = $by_length[$i]->[0];
+ if ($only_thing->{utf8}) {
+ if ($only_thing->{utf8} eq 'yes') {
+ # With utf8 on flag item is passed in element 0
+ $body .= match_clause ([$only_thing]);
+ } else {
+ # With utf8 off flag item is passed in element 1
+ $body .= match_clause ([undef, $only_thing]);
+ }
+ } else {
+ $body .= match_clause ($only_thing);
+ }
} elsif (@{$by_length[$i]} < $breakout) {
$body .= switch_clause (4, '', $i, $items, @{$by_length[$i]});
} else {
@@ -1224,7 +1348,7 @@ EOT
Writes a file of C code and a file of XS code which you should C<#include>
and C<INCLUDE> in the C and XS sections respectively of your module's XS
-code. You probaby want to do this in your C<Makefile.PL>, so that you can
+code. You probably want to do this in your C<Makefile.PL>, so that you can
easily edit the list of constants without touching the rest of your module.
The attributes supported are
@@ -1301,7 +1425,7 @@ sub WriteConstants {
print $c_fh constant_types(); # macro defs
print $c_fh "\n";
- # indent is still undef. Until anyone implents indent style rules with it.
+ # indent is still undef. Until anyone implements indent style rules with it.
foreach (C_constant ($ARGS{NAME}, $ARGS{C_SUBNAME}, $ARGS{DEFAULT_TYPE},
$types, undef, $ARGS{BREAKOUT_AT}, @{$ARGS{NAMES}})) {
print $c_fh $_, "\n"; # C constant subs
@@ -1313,6 +1437,28 @@ sub WriteConstants {
close $xs_fh or warn "Error closing $ARGS{XS_FILE}: $!";
}
+package ExtUtils::Constant::Aaargh56Hash;
+# A support module (hack) to provide sane Unicode hash keys on 5.6.x perl
+use strict;
+require Tie::Hash if $ExtUtils::Constant::is_perl56;
+use vars '@ISA';
+@ISA = 'Tie::StdHash';
+
+#my $a;
+# Storing the values as concatenated BER encoded numbers is actually going to
+# be terser than using UTF8 :-)
+# And the tests are slightly faster. Ops are bad, m'kay
+sub to_key {pack "w*", unpack "U*", ($_[0] . pack "U*")};
+sub from_key {defined $_[0] ? pack "U*", unpack 'w*', $_[0] : undef};
+
+sub STORE { $_[0]->{to_key($_[1])} = $_[2] }
+sub FETCH { $_[0]->{to_key($_[1])} }
+sub FIRSTKEY { my $a = scalar keys %{$_[0]}; from_key (each %{$_[0]}) }
+sub NEXTKEY { from_key (each %{$_[0]}) }
+sub EXISTS { exists $_[0]->{to_key($_[1])} }
+sub DELETE { delete $_[0]->{to_key($_[1])} }
+
+#END {warn "$a accesses";}
1;
__END__
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/Installed.pm b/gnu/usr.bin/perl/lib/ExtUtils/Installed.pm
index 1375a8299fd..8b0c53c4811 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/Installed.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/Installed.pm
@@ -9,21 +9,28 @@ use Config;
use File::Find;
use File::Basename;
use File::Spec;
-require VMS::Filespec if $^O eq 'VMS';
-
-use vars qw($VERSION);
-$VERSION = '0.06';
+my $Is_VMS = $^O eq 'VMS';
my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
+require VMS::Filespec if $Is_VMS;
+
+use vars qw($VERSION);
+$VERSION = '0.08';
+
sub _is_prefix {
my ($self, $path, $prefix) = @_;
return unless defined $prefix && defined $path;
- if( $^O eq 'VMS' ) {
+ if( $Is_VMS ) {
$prefix = VMS::Filespec::unixify($prefix);
$path = VMS::Filespec::unixify($path);
}
+
+ # Sloppy Unix path normalization.
+ $prefix =~ s{/+}{/}g;
+ $path =~ s{/+}{/}g;
+
return 1 if substr($path, 0, length($prefix)) eq $prefix;
if ($DOSISH) {
@@ -78,7 +85,7 @@ sub new {
my $sitearch = $Config{sitearchexp};
# File::Find does not know how to deal with VMS filepaths.
- if( $^O eq 'VMS' ) {
+ if( $Is_VMS ) {
$archlib = VMS::Filespec::unixify($archlib);
$sitearch = VMS::Filespec::unixify($sitearch);
}
@@ -96,7 +103,7 @@ sub new {
# Read the module packlists
my $sub = sub {
# Only process module .packlists
- return if ($_) ne ".packlist" || $File::Find::dir eq $archlib;
+ return if $_ ne ".packlist" || $File::Find::dir eq $archlib;
# Hack of the leading bits of the paths & convert to a module name
my $module = $File::Find::name;
@@ -110,7 +117,9 @@ sub new {
$self->{$module}{version} = '';
foreach my $dir (@INC) {
my $p = File::Spec->catfile($dir, $modfile);
- if (-f $p) {
+ if (-r $p) {
+ $module = _module_name($p, $module) if $Is_VMS;
+
require ExtUtils::MM;
$self->{$module}{version} = MM->parse_version($p);
last;
@@ -128,6 +137,36 @@ sub new {
return(bless($self, $class));
}
+# VMS's non-case preserving file-system means the package name can't
+# be reconstructed from the filename.
+sub _module_name {
+ my($file, $orig_module) = @_;
+
+ my $module = '';
+ if (open PACKFH, $file) {
+ while (<PACKFH>) {
+ if (/package\s+(\S+)\s*;/) {
+ my $pack = $1;
+ # Make a sanity check, that lower case $module
+ # is identical to lowercase $pack before
+ # accepting it
+ if (lc($pack) eq lc($orig_module)) {
+ $module = $pack;
+ last;
+ }
+ }
+ }
+ close PACKFH;
+ }
+
+ print STDERR "Couldn't figure out the package name for $file\n"
+ unless $module;
+
+ return $module;
+}
+
+
+
sub modules {
my ($self) = @_;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/Liblist/Kid.pm b/gnu/usr.bin/perl/lib/ExtUtils/Liblist/Kid.pm
index a7e4c2d6f65..65445092509 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/Liblist/Kid.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/Liblist/Kid.pm
@@ -8,8 +8,9 @@ package ExtUtils::Liblist::Kid;
use 5.00503;
# Broken out of MakeMaker from version 4.11
+use strict;
use vars qw($VERSION);
-$VERSION = 1.29;
+$VERSION = 1.30;
use Config;
use Cwd 'cwd';
@@ -24,6 +25,8 @@ sub ext {
sub _unix_os2_ext {
my($self,$potential_libs, $verbose, $give_libs) = @_;
+ $verbose ||= 0;
+
if ($^O =~ 'os2' and $Config{perllibs}) {
# Dynamic libraries are not transitive, so we may need including
# the libraries linked against perl.dll again.
@@ -34,8 +37,8 @@ sub _unix_os2_ext {
return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
warn "Potential libraries are '$potential_libs':\n" if $verbose;
- my($so) = $Config{'so'};
- my($libs) = $Config{'perllibs'};
+ my($so) = $Config{so};
+ my($libs) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs};
my $Config_libext = $Config{lib_ext} || ".a";
@@ -146,9 +149,6 @@ sub _unix_os2_ext {
next;
}
warn "'-l$thislib' found at $fullname\n" if $verbose;
- my($fullnamedir) = dirname($fullname);
- push @ld_run_path, $fullnamedir
- unless $ld_run_path_seen{$fullnamedir}++;
push @libs, $fullname unless $libs_seen{$fullname}++;
$found++;
$found_lib++;
@@ -157,7 +157,14 @@ sub _unix_os2_ext {
# what do we know about this library...
my $is_dyna = ($fullname !~ /\Q$Config_libext\E\z/);
- my $in_perl = ($libs =~ /\B-l\Q$ {thislib}\E\b/s);
+ my $in_perl = ($libs =~ /\B-l\Q${thislib}\E\b/s);
+
+ # include the path to the lib once in the dynamic linker path
+ # but only if it is a dynamic lib and not in Perl itself
+ my($fullnamedir) = dirname($fullname);
+ push @ld_run_path, $fullnamedir
+ if $is_dyna && !$in_perl &&
+ !$ld_run_path_seen{$fullnamedir}++;
# Do not add it into the list if it is already linked in
# with the main perl executable.
@@ -212,6 +219,7 @@ sub _win32_ext {
require Text::ParseWords;
my($self, $potential_libs, $verbose, $give_libs) = @_;
+ $verbose ||= 0;
# If user did not supply a list, we punt.
# (caller should probably use the list in $Config{libs})
@@ -340,7 +348,7 @@ sub _win32_ext {
# give up
warn "Note (probably harmless): "
- ."No library found for '$thislib'\n"
+ ."No library found for $thislib\n"
unless $found_lib>0;
}
@@ -364,9 +372,11 @@ sub _win32_ext {
sub _vms_ext {
my($self, $potential_libs,$verbose,$give_libs) = @_;
+ $verbose ||= 0;
+
my(@crtls,$crtlstr);
my($dbgqual) = $self->{OPTIMIZE} || $Config{'optimize'} ||
- $self->{CCFLAS} || $Config{'ccflags'};
+ $self->{CCFLAGS} || $Config{'ccflags'};
@crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '')
. 'PerlShr/Share' );
push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'});
@@ -398,8 +408,8 @@ sub _vms_ext {
my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
my $cwd = cwd();
my($so,$lib_ext,$obj_ext) = @Config{'so','lib_ext','obj_ext'};
- # List of common Unix library names and there VMS equivalents
- # (VMS equivalent of '' indicates that the library is automatially
+ # List of common Unix library names and their VMS equivalents
+ # (VMS equivalent of '' indicates that the library is automatically
# searched by the linker, and should be skipped here.)
my(@flibs, %libs_seen);
my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
@@ -447,7 +457,7 @@ sub _vms_ext {
$lib = $libmap{$lib};
}
- my(@variants,$variant,$name,$test,$cand);
+ my(@variants,$variant,$cand);
my($ctype) = '';
# If we don't have a file type, consider it a possibly abbreviated name and
@@ -461,44 +471,49 @@ sub _vms_ext {
push(@variants,$lib);
warn "Looking for $lib\n" if $verbose;
foreach $variant (@variants) {
+ my($fullname, $name);
+
foreach $dir (@dirs) {
my($type);
$name = "$dir$variant";
warn "\tChecking $name\n" if $verbose > 2;
- if (-f ($test = VMS::Filespec::rmsexpand($name))) {
+ $fullname = VMS::Filespec::rmsexpand($name);
+ if (defined $fullname and -f $fullname) {
# It's got its own suffix, so we'll have to figure out the type
- if ($test =~ /(?:$so|exe)$/i) { $type = 'SHR'; }
- elsif ($test =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
- elsif ($test =~ /(?:$obj_ext|obj)$/i) {
+ if ($fullname =~ /(?:$so|exe)$/i) { $type = 'SHR'; }
+ elsif ($fullname =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
+ elsif ($fullname =~ /(?:$obj_ext|obj)$/i) {
warn "Note (probably harmless): "
- ."Plain object file $test found in library list\n";
+ ."Plain object file $fullname found in library list\n";
$type = 'OBJ';
}
else {
warn "Note (probably harmless): "
- ."Unknown library type for $test; assuming shared\n";
+ ."Unknown library type for $fullname; assuming shared\n";
$type = 'SHR';
}
}
- elsif (-f ($test = VMS::Filespec::rmsexpand($name,$so)) or
- -f ($test = VMS::Filespec::rmsexpand($name,'.exe'))) {
+ elsif (-f ($fullname = VMS::Filespec::rmsexpand($name,$so)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.exe'))) {
$type = 'SHR';
- $name = $test unless $test =~ /exe;?\d*$/i;
+ $name = $fullname unless $fullname =~ /exe;?\d*$/i;
}
- elsif (not length($ctype) and # If we've got a lib already, don't bother
- ( -f ($test = VMS::Filespec::rmsexpand($name,$lib_ext)) or
- -f ($test = VMS::Filespec::rmsexpand($name,'.olb')))) {
+ elsif (not length($ctype) and # If we've got a lib already,
+ # don't bother
+ ( -f ($fullname = VMS::Filespec::rmsexpand($name,$lib_ext)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.olb')))) {
$type = 'OLB';
- $name = $test unless $test =~ /olb;?\d*$/i;
+ $name = $fullname unless $fullname =~ /olb;?\d*$/i;
}
- elsif (not length($ctype) and # If we've got a lib already, don't bother
- ( -f ($test = VMS::Filespec::rmsexpand($name,$obj_ext)) or
- -f ($test = VMS::Filespec::rmsexpand($name,'.obj')))) {
+ elsif (not length($ctype) and # If we've got a lib already,
+ # don't bother
+ ( -f ($fullname = VMS::Filespec::rmsexpand($name,$obj_ext)) or
+ -f ($fullname = VMS::Filespec::rmsexpand($name,'.obj')))) {
warn "Note (probably harmless): "
- ."Plain object file $test found in library list\n";
+ ."Plain object file $fullname found in library list\n";
$type = 'OBJ';
- $name = $test unless $test =~ /obj;?\d*$/i;
+ $name = $fullname unless $fullname =~ /obj;?\d*$/i;
}
if (defined $type) {
$ctype = $type; $cand = $name;
@@ -509,7 +524,8 @@ sub _vms_ext {
# This has to precede any other CRTLs, so just make it first
if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }
else { push @{$found{$ctype}}, $cand; }
- warn "\tFound as $cand (really $test), type $ctype\n" if $verbose > 1;
+ warn "\tFound as $cand (really $fullname), type $ctype\n"
+ if $verbose > 1;
push @flibs, $name unless $libs_seen{$fullname}++;
next LIB;
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MANIFEST.SKIP b/gnu/usr.bin/perl/lib/ExtUtils/MANIFEST.SKIP
index 61dde53cedb..62b78eea268 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MANIFEST.SKIP
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MANIFEST.SKIP
@@ -1,17 +1,17 @@
-# Avoid version control files.
-\bRCS\b
+\.ppd$
\bCVS\b
-,v$
-
-# Avoid Makemaker generated and utility files.
-^MANIFEST\.bak
-^Makefile$
-^blib/
-^MakeMaker-\d
-^pm_to_blib$
-
-# Avoid temp and backup files.
~$
+t/lib/File/
+t/Big-Dummy
+t/Problem-Module
+.gz$
+.bak$
+Makefile$
+MANIFEST.perl$
\.old$
-\#$
-^\.#
+merge_bleadperl$
+^blib/
+^pm_to_blib
+.DS_Store
+\#
+^bleadperl\.patch$
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/META.yml b/gnu/usr.bin/perl/lib/ExtUtils/META.yml
new file mode 100644
index 00000000000..c8515482daa
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/META.yml
@@ -0,0 +1,14 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: ExtUtils-MakeMaker
+version: 6.17
+version_from: lib/ExtUtils/MakeMaker.pm
+installdirs: perl
+requires:
+ DirHandle: 0
+ File::Basename: 0
+ File::Spec: 0.8
+ Pod::Man: 0
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.17
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_Any.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_Any.pm
index fb48ae2831a..5d8d640b682 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_Any.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_Any.pm
@@ -2,7 +2,8 @@ package ExtUtils::MM_Any;
use strict;
use vars qw($VERSION @ISA);
-$VERSION = 0.04;
+$VERSION = 0.07;
+@ISA = qw(File::Spec);
use Config;
use File::Spec;
@@ -10,7 +11,7 @@ use File::Spec;
=head1 NAME
-ExtUtils::MM_Any - Platform agnostic MM methods
+ExtUtils::MM_Any - Platform-agnostic MM methods
=head1 SYNOPSIS
@@ -41,95 +42,418 @@ B<THIS MAY BE TEMPORARY!>
These are methods which are by their nature cross-platform and should
always be cross-platform.
-=head2 File::Spec wrappers B<DEPRECATED>
-
-The following methods are deprecated wrappers around File::Spec
-functions. They exist from before File::Spec did and in fact are from
-which File::Spec sprang.
+=over 4
-They are all deprecated. Please use File::Spec directly.
+=item installvars
-=over 4
+ my @installvars = $mm->installvars;
-=item canonpath
+A list of all the INSTALL* variables without the INSTALL prefix. Useful
+for iteration or building related variable sets.
=cut
-sub canonpath {
- shift;
- return File::Spec->canonpath(@_);;
+sub installvars {
+ return qw(PRIVLIB SITELIB VENDORLIB
+ ARCHLIB SITEARCH VENDORARCH
+ BIN SITEBIN VENDORBIN
+ SCRIPT
+ MAN1DIR SITEMAN1DIR VENDORMAN1DIR
+ MAN3DIR SITEMAN3DIR VENDORMAN3DIR
+ );
}
-=item catdir
+=item os_flavor_is
+
+ $mm->os_flavor_is($this_flavor);
+ $mm->os_flavor_is(@one_of_these_flavors);
+
+Checks to see if the current operating system is one of the given flavors.
+
+This is useful for code like:
+
+ if( $mm->os_flavor_is('Unix') ) {
+ $out = `foo 2>&1`;
+ }
+ else {
+ $out = `foo`;
+ }
=cut
-sub catdir {
- shift;
- return File::Spec->catdir(@_);
+sub os_flavor_is {
+ my $self = shift;
+ my %flavors = map { ($_ => 1) } $self->os_flavor;
+ return (grep { $flavors{$_} } @_) ? 1 : 0;
}
+=back
+
+=head2 File::Spec wrappers
+
+ExtUtils::MM_Any is a subclass of File::Spec. The methods noted here
+override File::Spec.
+
+=over 4
+
=item catfile
+File::Spec <= 0.83 has a bug where the file part of catfile is not
+canonicalized. This override fixes that bug.
+
=cut
sub catfile {
- shift;
- return File::Spec->catfile(@_);
+ my $self = shift;
+ return $self->canonpath($self->SUPER::catfile(@_));
+}
+
+=back
+
+=head1 Thought To Be Cross-Platform Methods
+
+These are methods which are thought to be cross-platform by virtue of
+having been written in a way to avoid incompatibilities. They may
+require partial overrides.
+
+=over 4
+
+=item B<split_command>
+
+ my @cmds = $MM->split_command($cmd, @args);
+
+Most OS have a maximum command length they can execute at once. Large
+modules can easily generate commands well past that limit. Its
+necessary to split long commands up into a series of shorter commands.
+
+split_command() will return a series of @cmds each processing part of
+the args. Collectively they will process all the arguments. Each
+individual line in @cmds will not be longer than the
+$self->max_exec_len being careful to take into account macro expansion.
+
+$cmd should include any switches and repeated initial arguments.
+
+If no @args are given, no @cmds will be returned.
+
+Pairs of arguments will always be preserved in a single command, this
+is a heuristic for things like pm_to_blib and pod2man which work on
+pairs of arguments. This makes things like this safe:
+
+ $self->split_command($cmd, %pod2man);
+
+
+=cut
+
+sub split_command {
+ my($self, $cmd, @args) = @_;
+
+ my @cmds = ();
+ return(@cmds) unless @args;
+
+ # If the command was given as a here-doc, there's probably a trailing
+ # newline.
+ chomp $cmd;
+
+ # set aside 20% for macro expansion.
+ my $len_left = int($self->max_exec_len * 0.80);
+ $len_left -= length $self->_expand_macros($cmd);
+
+ do {
+ my $arg_str = '';
+ my @next_args;
+ while( @next_args = splice(@args, 0, 2) ) {
+ # Two at a time to preserve pairs.
+ my $next_arg_str = "\t ". join ' ', @next_args, "\n";
+
+ if( !length $arg_str ) {
+ $arg_str .= $next_arg_str
+ }
+ elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
+ unshift @args, @next_args;
+ last;
+ }
+ else {
+ $arg_str .= $next_arg_str;
+ }
+ }
+ chop $arg_str;
+
+ push @cmds, $self->escape_newlines("$cmd\n$arg_str");
+ } while @args;
+
+ return @cmds;
+}
+
+
+sub _expand_macros {
+ my($self, $cmd) = @_;
+
+ $cmd =~ s{\$\((\w+)\)}{
+ defined $self->{$1} ? $self->{$1} : "\$($1)"
+ }e;
+ return $cmd;
+}
+
+
+=item B<echo>
+
+ my @commands = $MM->echo($text);
+ my @commands = $MM->echo($text, $file);
+ my @commands = $MM->echo($text, $file, $appending);
+
+Generates a set of @commands which print the $text to a $file.
+
+If $file is not given, output goes to STDOUT.
+
+If $appending is true the $file will be appended to rather than
+overwritten.
+
+=cut
+
+sub echo {
+ my($self, $text, $file, $appending) = @_;
+ $appending ||= 0;
+
+ my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) }
+ split /\n/, $text;
+ if( $file ) {
+ my $redirect = $appending ? '>>' : '>';
+ $cmds[0] .= " $redirect $file";
+ $_ .= " >> $file" foreach @cmds[1..$#cmds];
+ }
+
+ return @cmds;
+}
+
+
+=item init_VERSION
+
+ $mm->init_VERSION
+
+Initialize macros representing versions of MakeMaker and other tools
+
+MAKEMAKER: path to the MakeMaker module.
+
+MM_VERSION: ExtUtils::MakeMaker Version
+
+MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards
+ compat)
+
+VERSION: version of your module
+
+VERSION_MACRO: which macro represents the version (usually 'VERSION')
+
+VERSION_SYM: like version but safe for use as an RCS revision number
+
+DEFINE_VERSION: -D line to set the module version when compiling
+
+XS_VERSION: version in your .xs file. Defaults to $(VERSION)
+
+XS_VERSION_MACRO: which macro represents the XS version.
+
+XS_DEFINE_VERSION: -D line to set the xs version when compiling.
+
+Called by init_main.
+
+=cut
+
+sub init_VERSION {
+ my($self) = shift;
+
+ $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename;
+ $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
+ $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
+ $self->{VERSION_FROM} ||= '';
+
+ if ($self->{VERSION_FROM}){
+ $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
+ if( $self->{VERSION} eq 'undef' ) {
+ require Carp;
+ Carp::carp("WARNING: Setting VERSION via file ".
+ "'$self->{VERSION_FROM}' failed\n");
+ }
+ }
+
+ # strip blanks
+ if (defined $self->{VERSION}) {
+ $self->{VERSION} =~ s/^\s+//;
+ $self->{VERSION} =~ s/\s+$//;
+ }
+ else {
+ $self->{VERSION} = '';
+ }
+
+
+ $self->{VERSION_MACRO} = 'VERSION';
+ ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
+ $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
+
+
+ # Graham Barr and Paul Marquess had some ideas how to ensure
+ # version compatibility between the *.pm file and the
+ # corresponding *.xs file. The bottomline was, that we need an
+ # XS_VERSION macro that defaults to VERSION:
+ $self->{XS_VERSION} ||= $self->{VERSION};
+
+ $self->{XS_VERSION_MACRO} = 'XS_VERSION';
+ $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
+
}
-=item curdir
+=item wraplist
+
+Takes an array of items and turns them into a well-formatted list of
+arguments. In most cases this is simply something like:
+
+ FOO \
+ BAR \
+ BAZ
=cut
-my $Curdir = File::Spec->curdir;
-sub curdir {
- return $Curdir;
+sub wraplist {
+ my $self = shift;
+ return join " \\\n\t", @_;
}
-=item file_name_is_absolute
+=item manifypods
+
+Defines targets and routines to translate the pods into manpages and
+put them into the INST_* directories.
=cut
-sub file_name_is_absolute {
- shift;
- return File::Spec->file_name_is_absolute(@_);
+sub manifypods {
+ my $self = shift;
+
+ my $POD2MAN_macro = $self->POD2MAN_macro();
+ my $manifypods_target = $self->manifypods_target();
+
+ return <<END_OF_TARGET;
+
+$POD2MAN_macro
+
+$manifypods_target
+
+END_OF_TARGET
+
}
-=item path
+
+=item manifypods_target
+
+ my $manifypods_target = $self->manifypods_target;
+
+Generates the manifypods target. This target generates man pages from
+all POD files in MAN1PODS and MAN3PODS.
=cut
-sub path {
- return File::Spec->path();
+sub manifypods_target {
+ my($self) = shift;
+
+ my $man1pods = '';
+ my $man3pods = '';
+ my $dependencies = '';
+
+ # populate manXpods & dependencies:
+ foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
+ $dependencies .= " \\\n\t$name";
+ }
+
+ foreach my $name (keys %{$self->{MAN3PODS}}) {
+ $dependencies .= " \\\n\t$name"
+ }
+
+ my $manify = <<END;
+manifypods : pure_all $dependencies
+END
+
+ my @man_cmds;
+ foreach my $section (qw(1 3)) {
+ my $pods = $self->{"MAN${section}PODS"};
+ push @man_cmds, $self->split_command(<<CMD, %$pods);
+ \$(NOECHO) \$(POD2MAN) --section=$section --perm_rw=\$(PERM_RW)
+CMD
+ }
+
+ $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds;
+ $manify .= join '', map { "$_\n" } @man_cmds;
+
+ return $manify;
}
-=item rootdir
+
+=item makemakerdflt_target
+
+ my $make_frag = $mm->makemakerdflt_target
+
+Returns a make fragment with the makemakerdeflt_target specified.
+This target is the first target in the Makefile, is the default target
+and simply points off to 'all' just in case any make variant gets
+confused or something gets snuck in before the real 'all' target.
=cut
-my $Rootdir = File::Spec->rootdir;
-sub rootdir {
- return $Rootdir;
+sub makemakerdflt_target {
+ return <<'MAKE_FRAG';
+makemakerdflt: all
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+
}
-=item updir
+
+=item special_targets
+
+ my $make_frag = $mm->special_targets
+
+Returns a make fragment containing any targets which have special
+meaning to make. For example, .SUFFIXES and .PHONY.
=cut
-my $Updir = File::Spec->updir;
-sub updir {
- return $Updir;
+sub special_targets {
+ my $make_frag = <<'MAKE_FRAG';
+.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+
+.PHONY: all config static dynamic test linkext manifest
+
+MAKE_FRAG
+
+ $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
+.NO_CONFIG_REC: Makefile
+
+MAKE_FRAG
+
+ return $make_frag;
}
-=back
+=item POD2MAN_macro
-=head1 Thought To Be Cross-Platform Methods
+ my $pod2man_macro = $self->POD2MAN_macro
-These are methods which are thought to be cross-platform by virtue of
-having been written in a way to avoid incompatibilities.
+Returns a definition for the POD2MAN macro. This is a program
+which emulates the pod2man utility. You can add more switches to the
+command by simply appending them on the macro.
+
+Typical usage:
+
+ $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
+
+=cut
+
+sub POD2MAN_macro {
+ my $self = shift;
+
+# Need the trailing '--' so perl stops gobbling arguments and - happens
+# to be an alternative end of line seperator on VMS so we quote it
+ return <<'END_OF_DEF';
+POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
+POD2MAN = $(POD2MAN_EXE)
+END_OF_DEF
+}
-=over 4
=item test_via_harness
@@ -167,12 +491,361 @@ sub test_via_script {
return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
}
+=item libscan
+
+ my $wanted = $self->libscan($path);
+
+Takes a path to a file or dir and returns an empty string if we don't
+want to include this file in the library. Otherwise it returns the
+the $path unchanged.
+
+Mainly used to exclude RCS, CVS, and SCCS directories from
+installation.
+
+=cut
+
+sub libscan {
+ my($self,$path) = @_;
+ my($dirs,$file) = ($self->splitpath($path))[1,2];
+ return '' if grep /^(?:RCS|CVS|SCCS|\.svn)$/,
+ $self->splitdir($dirs), $file;
+
+ return $path;
+}
+
+=item tool_autosplit
+
+Defines a simple perl call that runs autosplit. May be deprecated by
+pm_to_blib soon.
+
+=cut
+
+sub tool_autosplit {
+ my($self, %attribs) = @_;
+
+ my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};'
+ : '';
+
+ my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
+use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
+PERL_CODE
+
+ return sprintf <<'MAKE_FRAG', $asplit;
+# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
+AUTOSPLITFILE = %s
+
+MAKE_FRAG
+
+}
+
+
+=item all_target
+
+Generate the default target 'all'.
+
+=cut
+
+sub all_target {
+ my $self = shift;
+
+ return <<'MAKE_EXT';
+all :: pure_all
+ $(NOECHO) $(NOOP)
+MAKE_EXT
+
+}
+
+
+=item metafile_target
+
+ my $target = $mm->metafile_target;
+
+Generate the metafile target.
+
+Writes the file META.yml, YAML encoded meta-data about the module. The
+format follows Module::Build's as closely as possible. Additionally, we
+include:
+
+ version_from
+ installdirs
+
+=cut
+
+sub metafile_target {
+ my $self = shift;
+
+ return <<'MAKE_FRAG' if $self->{NO_META};
+metafile:
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+
+ my $prereq_pm = '';
+ foreach my $mod ( sort { lc $a cmp lc $b } keys %{$self->{PREREQ_PM}} ) {
+ my $ver = $self->{PREREQ_PM}{$mod};
+ $prereq_pm .= sprintf " %-30s %s\n", "$mod:", $ver;
+ }
+
+ my $meta = <<YAML;
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: $self->{DISTNAME}
+version: $self->{VERSION}
+version_from: $self->{VERSION_FROM}
+installdirs: $self->{INSTALLDIRS}
+requires:
+$prereq_pm
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION
+YAML
+
+ my @write_meta = $self->echo($meta, 'META.yml');
+ return sprintf <<'MAKE_FRAG', join "\n\t", @write_meta;
+metafile :
+ %s
+MAKE_FRAG
+
+}
+
+
+=item metafile_addtomanifest_target
+
+ my $target = $mm->metafile_addtomanifest_target
+
+Adds the META.yml file to the MANIFEST.
+
+=cut
+
+sub metafile_addtomanifest_target {
+ my $self = shift;
+
+ return <<'MAKE_FRAG' if $self->{NO_META};
+metafile_addtomanifest:
+ $(NOECHO) $(NOOP)
+MAKE_FRAG
+
+ my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
+eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) }
+ or print "Could not add META.yml to MANIFEST: $${'@'}\n"
+CODE
+
+ return sprintf <<'MAKE_FRAG', $add_meta;
+metafile_addtomanifest:
+ $(NOECHO) %s
+MAKE_FRAG
+
+}
+
+
+=back
+
+=head2 Abstract methods
+
+Methods which cannot be made cross-platform and each subclass will
+have to do their own implementation.
+
+=over 4
+
+=item oneliner
+
+ my $oneliner = $MM->oneliner($perl_code);
+ my $oneliner = $MM->oneliner($perl_code, \@switches);
+
+This will generate a perl one-liner safe for the particular platform
+you're on based on the given $perl_code and @switches (a -e is
+assumed) suitable for using in a make target. It will use the proper
+shell quoting and escapes.
+
+$(PERLRUN) will be used as perl.
+
+Any newlines in $perl_code will be escaped. Leading and trailing
+newlines will be stripped. Makes this idiom much easier:
+
+ my $code = $MM->oneliner(<<'CODE', [...switches...]);
+some code here
+another line here
+CODE
+
+Usage might be something like:
+
+ # an echo emulation
+ $oneliner = $MM->oneliner('print "Foo\n"');
+ $make = '$oneliner > somefile';
+
+All dollar signs must be doubled in the $perl_code if you expect them
+to be interpreted normally, otherwise it will be considered a make
+macro. Also remember to quote make macros else it might be used as a
+bareword. For example:
+
+ # Assign the value of the $(VERSION_FROM) make macro to $vf.
+ $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
+
+Its currently very simple and may be expanded sometime in the figure
+to include more flexible code and switches.
+
+
+=item B<quote_literal>
+
+ my $safe_text = $MM->quote_literal($text);
+
+This will quote $text so it is interpreted literally in the shell.
+
+For example, on Unix this would escape any single-quotes in $text and
+put single-quotes around the whole thing.
+
+
+=item B<escape_newlines>
+
+ my $escaped_text = $MM->escape_newlines($text);
+
+Shell escapes newlines in $text.
+
+
+=item max_exec_len
+
+ my $max_exec_len = $MM->max_exec_len;
+
+Calculates the maximum command size the OS can exec. Effectively,
+this is the max size of a shell command line.
+
+=for _private
+$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
+
+=item B<init_others>
+
+ $MM->init_others();
+
+Initializes the macro definitions used by tools_other() and places them
+in the $MM object.
+
+If there is no description, its the same as the parameter to
+WriteMakefile() documented in ExtUtils::MakeMaker.
+
+Defines at least these macros.
+
+ Macro Description
+
+ NOOP Do nothing
+ NOECHO Tell make not to display the command itself
+
+ MAKEFILE
+ FIRST_MAKEFILE
+ MAKEFILE_OLD
+ MAKE_APERL_FILE File used by MAKE_APERL
+
+ SHELL Program used to run
+ shell commands
+
+ ECHO Print text adding a newline on the end
+ RM_F Remove a file
+ RM_RF Remove a directory
+ TOUCH Update a file's timestamp
+ TEST_F Test for a file's existence
+ CP Copy a file
+ MV Move a file
+ CHMOD Change permissions on a
+ file
+
+ UMASK_NULL Nullify umask
+ DEV_NULL Supress all command output
+
+=item init_DIRFILESEP
+
+ $MM->init_DIRFILESEP;
+ my $dirfilesep = $MM->{DIRFILESEP};
+
+Initializes the DIRFILESEP macro which is the seperator between the
+directory and filename in a filepath. ie. / on Unix, \ on Win32 and
+nothing on VMS.
+
+For example:
+
+ # instead of $(INST_ARCHAUTODIR)/extralibs.ld
+ $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
+
+Something of a hack but it prevents a lot of code duplication between
+MM_* variants.
+
+Do not use this as a seperator between directories. Some operating
+systems use different seperators between subdirectories as between
+directories and filenames (for example: VOLUME:[dir1.dir2]file on VMS).
+
+=item init_linker
+
+ $mm->init_linker;
+
+Initialize macros which have to do with linking.
+
+PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
+extensions.
+
+PERL_ARCHIVE_AFTER: path to a library which should be put on the
+linker command line I<after> the external libraries to be linked to
+dynamic extensions. This may be needed if the linker is one-pass, and
+Perl includes some overrides for C RTL functions, such as malloc().
+
+EXPORT_LIST: name of a file that is passed to linker to define symbols
+to be exported.
+
+Some OSes do not need these in which case leave it blank.
+
+
+=item init_platform
+
+ $mm->init_platform
+
+Initialize any macros which are for platform specific use only.
+
+A typical one is the version number of your OS specific mocule.
+(ie. MM_Unix_VERSION or MM_VMS_VERSION).
+
+=item platform_constants
+
+ my $make_frag = $mm->platform_constants
+
+Returns a make fragment defining all the macros initialized in
+init_platform() rather than put them in constants().
+
+=cut
+
+sub init_platform {
+ return '';
+}
+
+sub platform_constants {
+ return '';
+}
+
+=item os_flavor
+
+ my @os_flavor = $mm->os_flavor;
+
+@os_flavor is the style of operating system this is, usually
+corresponding to the MM_*.pm file we're using.
+
+The first element of @os_flavor is the major family (ie. Unix,
+Windows, VMS, OS/2, MacOS, etc...) and the rest are sub families.
+
+Some examples:
+
+ Cygwin98 ('Unix', 'Cygwin', 'Cygwin9x')
+ Windows NT ('Win32', 'WinNT')
+ Win98 ('Win32', 'Win9x')
+ Linux ('Unix', 'Linux')
+ MacOS Classic ('MacOS', 'MacOS Classic')
+ MacOS X ('Unix', 'Darwin', 'MacOS', 'MacOS X')
+ OS/2 ('OS/2')
+
+This is used to write code for styles of operating system.
+See os_flavor_is() for use.
+
+
=back
=head1 AUTHOR
-Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
-and ExtUtils::MM_Win32.
+Michael G Schwern <schwern@pobox.com> and the denizens of
+makemaker@perl.org with code from ExtUtils::MM_Unix and
+ExtUtils::MM_Win32.
=cut
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_BeOS.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_BeOS.pm
index 5118747bae7..e0b3390b0f0 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_BeOS.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_BeOS.pm
@@ -25,21 +25,33 @@ require ExtUtils::MM_Unix;
use vars qw(@ISA $VERSION);
@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-$VERSION = 1.03;
+$VERSION = 1.04;
-=item perl_archive
+=item os_flavor (o)
-This is internal method that returns path to libperl.a equivalent
-to be linked to dynamic extensions. UNIX does not have one, but at
-least BeOS has one.
+BeOS is BeOS.
=cut
-sub perl_archive
- {
- return File::Spec->catdir('$(PERL_INC)',$Config{libperl});
- }
+sub os_flavor {
+ return('BeOS');
+}
+
+=item init_linker
+
+libperl.a equivalent to be linked to dynamic extensions.
+
+=cut
+
+sub init_linker {
+ my($self) = shift;
+
+ $self->{PERL_ARCHIVE} ||=
+ File::Spec->catdir('$(PERL_INC)',$Config{libperl});
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+}
=back
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm
index 3c37ffd9f7e..4529895fa0a 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_Cygwin.pm
@@ -10,7 +10,38 @@ require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-$VERSION = 1.04;
+$VERSION = 1.06;
+
+
+=head1 NAME
+
+ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
+
+=head1 DESCRIPTION
+
+See ExtUtils::MM_Unix for a documentation of the methods provided there.
+
+=over 4
+
+=item os_flavor (o)
+
+We're Unix and Cygwin.
+
+=cut
+
+sub os_flavor {
+ return('Unix', 'Cygwin');
+}
+
+=item cflags (o)
+
+if configured for dynamic loading, triggers #define EXT in EXTERN.h
+
+=cut
sub cflags {
my($self,$libperl)=@_;
@@ -31,97 +62,45 @@ PERLTYPE = $self->{PERLTYPE}
}
-sub manifypods {
- my($self, %attribs) = @_;
- return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
- %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
- my($dist);
- my($pod2man_exe);
- if (defined $self->{PERL_SRC}) {
- $pod2man_exe = File::Spec->catfile($self->{PERL_SRC},'pod','pod2man');
- } else {
- $pod2man_exe = File::Spec->catfile($Config{scriptdirexp},'pod2man');
- }
- unless ($self->perl_script($pod2man_exe)) {
- # No pod2man but some MAN3PODS to be installed
- print <<END;
-Warning: I could not locate your pod2man program. Please make sure,
- your pod2man program is in your PATH before you execute 'make'
+=item replace_manpage_separator (o)
-END
- $pod2man_exe = "-S pod2man";
- }
- my(@m) = ();
- push @m,
-qq[POD2MAN_EXE = $pod2man_exe\n],
-qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n],
-q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "],
- $self->{MAKEFILE}, q[";' \\
--e 'print "Manifying $$m{$$_}\n"; $$m{$$_} =~ s/::/./g;' \\
--e 'system(qq[$(PERLRUN) $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
--e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}'
-];
- push @m, "\nmanifypods : pure_all ";
- push @m, join " \\\n\t", keys %{$self->{MAN1PODS}},
- keys %{$self->{MAN3PODS}};
-
- push(@m,"\n");
- if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
- grep { $self->{MAN1PODS}{$_} =~ s/::/./g } keys %{$self->{MAN1PODS}};
- grep { $self->{MAN3PODS}{$_} =~ s/::/./g } keys %{$self->{MAN3PODS}};
- push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
- push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
- }
- join('', @m);
+replaces strings '::' with '.' in MAN*POD man page names
+
+=cut
+
+sub replace_manpage_separator {
+ my($self, $man) = @_;
+ $man =~ s{/+}{.}g;
+ return $man;
}
-sub perl_archive {
+=item init_linker
+
+points to libperl.a
+
+=cut
+
+sub init_linker {
+ my $self = shift;
+
if ($Config{useshrplib} eq 'true') {
my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
if( $] >= 5.007 ) {
$libperl =~ s/a$/dll.a/;
}
- return $libperl;
+ $self->{PERL_ARCHIVE} = $libperl;
} else {
- return '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
+ $self->{PERL_ARCHIVE} =
+ '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
}
-}
-
-1;
-__END__
-=head1 NAME
-
-ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
-
-=head1 SYNOPSIS
-
- use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
-
-=head1 DESCRIPTION
-
-See ExtUtils::MM_Unix for a documentation of the methods provided there.
-
-=over 4
-
-=item canonpath
-
-replaces backslashes with forward ones. then acts as *nixish.
-
-=item cflags
-
-if configured for dynamic loading, triggers #define EXT in EXTERN.h
-
-=item manifypods
-
-replaces strings '::' with '.' in man page names
-
-=item perl_archive
-
-points to libperl.a
+ $self->{PERL_ARCHIVE_AFTER} ||= '';
+ $self->{EXPORT_LIST} ||= '';
+}
=back
=cut
+1;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_DOS.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_DOS.pm
index 7af868eeca4..b985d00ca69 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_DOS.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_DOS.pm
@@ -3,7 +3,7 @@ package ExtUtils::MM_DOS;
use strict;
use vars qw($VERSION @ISA);
-$VERSION = 0.01;
+$VERSION = 0.02;
require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
@@ -30,8 +30,18 @@ Unless otherwise stated, it works just like ExtUtils::MM_Unix
=over 4
+=item os_flavor
+
+=cut
+
+sub os_flavor {
+ return('DOS');
+}
+
=item B<replace_manpage_separator>
+Generates Foo__Bar.3 style man page names
+
=cut
sub replace_manpage_separator {
@@ -52,4 +62,5 @@ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
L<ExtUtils::MM_Unix>, L<ExtUtils::MakeMaker>
=cut
+
1;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_MacOS.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_MacOS.pm
index 576d7447303..6dcf8206247 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_MacOS.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_MacOS.pm
@@ -12,13 +12,12 @@ require ExtUtils::MM_Unix;
@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
use vars qw($VERSION);
-$VERSION = '1.03';
+$VERSION = '1.07';
use Config;
use Cwd 'cwd';
require Exporter;
use File::Basename;
-use File::Spec;
use vars qw(%make_data);
my $Mac_FS = eval { require Mac::FileSpec::Unixish };
@@ -37,6 +36,8 @@ ExtUtils::MM_MacOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
MM_MacOS currently only produces an approximation to the correct Makefile.
+=over 4
+
=cut
sub new {
@@ -51,7 +52,7 @@ sub new {
mkdir("Obj", 0777) unless -d "Obj";
- $self = {} unless (defined $self);
+ $self = {} unless defined $self;
check_hints($self);
@@ -61,7 +62,8 @@ sub new {
if (ref $self->{CONFIGURE} eq 'CODE') {
$self = { %$self, %{&{$self->{CONFIGURE}}}};
} else {
- Carp::croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
+ require Carp;
+ Carp::croak("Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n");
}
}
@@ -78,7 +80,7 @@ sub new {
}
$ExtUtils::MakeMaker::Recognized_Att_Keys{$_} = 1
- for map { $_ . 'Optimize' } qw(MWC MWCPPC MWC68K MPW MRC MRC SC);
+ for map { $_ . 'Optimize' } qw(MWC MWCPPC MWC68K MPW MRC MRC SC);
if (defined $ExtUtils::MakeMaker::Parent[-2]){
$self->{PARENT} = $ExtUtils::MakeMaker::Parent[-2];
@@ -86,7 +88,7 @@ sub new {
for $key (@ExtUtils::MakeMaker::Prepend_parent) {
next unless defined $self->{PARENT}{$key};
$self->{$key} = $self->{PARENT}{$key};
- unless ($^O eq 'VMS' && $key =~ /PERL$/) {
+ if ($key !~ /PERL$/) {
$self->{$key} = $self->catdir("..",$self->{$key})
unless $self->file_name_is_absolute($self->{$key});
} else {
@@ -130,7 +132,7 @@ sub new {
# This Makefile is for the $self->{NAME} extension to perl.
#
# It was generated automatically by MakeMaker version
-# $VERSION (Revision: $Revision) from the contents of
+# $ExtUtils::MakeMaker::VERSION (Revision: $ExtUtils::MakeMaker::Revision) from the contents of
# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
#
# ANY CHANGES MADE HERE WILL BE LOST!
@@ -158,10 +160,10 @@ END
pasthru c_o xs_c xs_o top_targets linkext
dynamic_bs dynamic_lib static_lib manifypods
installbin subdirs dist_basics dist_core
- dist_dir dist_test dist_ci install force perldepend makefile
- staticmake test pm_to_blib selfdocument
+ distdir dist_test dist_ci install force perldepend makefile
+ staticmake test pm_to_blib selfdocument
const_loadlibs const_cccmd
- /)
+ /)
{
$self->{SKIPHASH}{$_} = 2;
}
@@ -169,7 +171,7 @@ END
unless grep /rulez/, @ExtUtils::MakeMaker::MM_Sections;
if ($self->{PARENT}) {
- for (qw/install dist dist_basics dist_core dist_dir dist_test dist_ci/) {
+ for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
$self->{SKIPHASH}{$_} = 1;
}
}
@@ -182,7 +184,8 @@ END
my $section;
foreach $section ( @ExtUtils::MakeMaker::MM_Sections ){
- next if ($self->{SKIPHASH}{$section} == 2);
+ next if defined $self->{SKIPHASH}{$section} &&
+ $self->{SKIPHASH}{$section} == 2;
print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
$self->{ABSTRACT_FROM} = macify($self->{ABSTRACT_FROM})
if $self->{ABSTRACT_FROM};
@@ -242,7 +245,7 @@ sub guess_name {
=item macify
-Translate relative path names into Mac names.
+Translate relative Unix filepaths into Mac names.
=cut
@@ -262,20 +265,21 @@ sub macify {
}
push(@mac, $_);
}
-
+
return "@mac";
}
=item patternify
-Translate to Mac names & patterns
+Translate Unix filepaths and shell globs to Mac style.
=cut
sub patternify {
my($unix) = @_;
my(@mac);
-
+ use ExtUtils::MakeMaker::bytes; # Non-UTF-8 high bytes below.
+
foreach (split(/[ \t\n]+/, $unix)) {
if (m|/|) {
$_ = ":$_";
@@ -285,13 +289,13 @@ sub patternify {
push(@mac, $_);
}
}
-
+
return "@mac";
}
=item init_main
-Initializes some of NAME, FULLEXT, BASEEXT, ROOTEXT, DLBASE, PERL_SRC,
+Initializes some of NAME, FULLEXT, BASEEXT, DLBASE, PERL_SRC,
PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
@@ -306,14 +310,10 @@ sub init_main {
# NAME = The perl module name for this extension (eg DBD::Oracle).
# FULLEXT = Pathname for extension directory (eg DBD/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
- # ROOTEXT = Directory part of FULLEXT with trailing :.
($self->{FULLEXT} =
$self->{NAME}) =~ s!::!:!g ; #eg. BSD:Foo:Socket
($self->{BASEEXT} =
$self->{NAME}) =~ s!.*::!! ; #eg. Socket
- ($self->{ROOTEXT} =
- $self->{FULLEXT}) =~ s#:?\Q$self->{BASEEXT}\E$## ; #eg. BSD:Foo
- $self->{ROOTEXT} .= ":" if ($self->{ROOTEXT});
# --- Initialize PERL_LIB, INST_LIB, PERL_SRC
@@ -339,21 +339,15 @@ sub init_main {
}
}
if ($self->{PERL_SRC}){
- $self->{MACPERL_SRC} = File::Spec->catdir("$self->{PERL_SRC}","macos:");
- $self->{MACPERL_LIB} ||= File::Spec->catdir("$self->{MACPERL_SRC}","lib");
- $self->{PERL_LIB} ||= File::Spec->catdir("$self->{PERL_SRC}","lib");
+ $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
$self->{PERL_ARCHLIB} = $self->{PERL_LIB};
$self->{PERL_INC} = $self->{PERL_SRC};
- $self->{MACPERL_INC} = $self->{MACPERL_SRC};
} else {
# hmmmmmmm ... ?
- $self->{PERL_LIB} ||= "$ENV{MACPERL}site_perl";
- $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
- $self->{PERL_INC} = $ENV{MACPERL};
-# die <<END;
-#On MacOS, we need to build under the Perl source directory or have the MacPerl SDK
-#installed in the MacPerl folder.
-#END
+ $self->{PERL_LIB} ||= "$ENV{MACPERL}site_perl";
+ $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
+ $self->{PERL_INC} = $ENV{MACPERL};
+ $self->{PERL_SRC} = '';
}
$self->{INSTALLDIRS} = "perl";
@@ -368,12 +362,13 @@ sub init_main {
# hm ... do we really care? at all?
# warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
# (Exporter.pm not found)"
-# unless -f File::Spec->catfile("$self->{PERL_LIB}","Exporter.pm") ||
+# unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
# $self->{NAME} eq "ExtUtils::MakeMaker";
# Determine VERSION and VERSION_FROM
($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
if ($self->{VERSION_FROM}){
+ # XXX replace with parse_version() override
local *FH;
open(FH,macify($self->{VERSION_FROM})) or
die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
@@ -410,18 +405,32 @@ sub init_main {
# XS_VERSION macro that defaults to VERSION:
$self->{XS_VERSION} ||= $self->{VERSION};
+
+ $self->{DEFINE} .= " \$(XS_DEFINE_VERSION) \$(DEFINE_VERSION)";
+
+ # Preprocessor definitions may be useful
+ $self->{DEFINE} =~ s/-D/-d /g;
+
+ # UN*X includes probably are not useful
+ $self->{DEFINE} =~ s/-I\S+/_include($1)/eg;
+
+
+ if ($self->{INC}) {
+ # UN*X includes probably are not useful
+ $self->{INC} =~ s/-I(\S+)/_include($1)/eg;
+ }
+
+
# --- Initialize Perl Binary Locations
# Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
# will be working versions of perl 5. miniperl has priority over perl
# for PERL to ensure that $(PERL) is usable while building ./ext/*
my ($component,@defpath);
- foreach $component ($self->{PERL_SRC}, File::Spec->path(), $Config::Config{binexp}) {
+ foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
push @defpath, $component if defined $component;
}
$self->{PERL} = "$self->{PERL_SRC}miniperl";
- $self->{FULLPERL} = "$self->{PERL_SRC}perl";
- $self->{MAKEFILE} = "Makefile.mk";
}
=item init_others
@@ -457,6 +466,51 @@ sub init_others { # --- Initialize Other Attributes
}
}
$self->{SOURCE} = $src;
+ $self->{FULLPERL} = "$self->{PERL_SRC}perl";
+ $self->{MAKEFILE} = "Makefile.mk";
+ $self->{FIRST_MAKEFILE} = $self->{MAKEFILE};
+ $self->{MAKEFILE_OLD} = $self->{MAKEFILE}.'.old';
+
+ $self->{'DEV_NULL'} ||= ' \xB3 Dev:Null';
+
+ return 1;
+}
+
+=item init_platform
+
+Add MACPERL_SRC MACPERL_LIB
+
+=item platform_constants
+
+Add MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
+MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
+
+XXX Few are initialized. How many of these are ever used?
+
+=cut
+
+sub init_platform {
+ my $self = shift;
+
+ $self->{MACPERL_SRC} = $self->catdir("$self->{PERL_SRC}","macos:");
+ $self->{MACPERL_LIB} ||= $self->catdir("$self->{MACPERL_SRC}","lib");
+ $self->{MACPERL_INC} = $self->{MACPERL_SRC};
+}
+
+
+
+sub platform_constants {
+ my $self = shift;
+
+ foreach my $macro (qw(MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC
+ MACLIBS_SC MACLIBS_MRC MACLIBS_ALL_68K
+ MACLIBS_ALL_PPC MACLIBS_SHARED))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
+
+ return $make_frag;
}
@@ -474,7 +528,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
# in case we don't find it below!
if ($self->{VERSION_FROM}) {
my $version_from = macify($self->{VERSION_FROM});
- $pm{$version_from} = File::Spec->catfile('$(INST_LIBDIR)',
+ $pm{$version_from} = $self->catfile('$(INST_LIBDIR)',
$version_from);
}
@@ -483,6 +537,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
next if ($name =~ /^\./ or $ignore{$name});
next unless $self->libscan($name);
if (-d $name){
+ next if $self->{NORECURS};
$dir{$name} = $name if (-f ":$name:Makefile.PL");
} elsif ($name =~ /\.xs$/){
my($c); ($c = $name) =~ s/\.xs$/.c/;
@@ -494,7 +549,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
} elsif ($name =~ /\.h$/i){
$h{$name} = 1;
} elsif ($name =~ /\.(p[ml]|pod)$/){
- $pm{$name} = File::Spec->catfile('$(INST_LIBDIR)',$name);
+ $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
} elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
($pl_files{$name} = $name) =~ s/\.PL$// ;
}
@@ -523,8 +578,8 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
#
# In this way the 'lib' directory is seen as the root of the actual
# perl library whereas the others are relative to INST_LIBDIR
- # (which includes ROOTEXT). This is a subtle distinction but one
- # that's important for nested modules.
+ # This is a subtle distinction but one that's important for nested
+ # modules.
$self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
unless $self->{PMLIBDIRS};
@@ -544,7 +599,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
require File::Find;
File::Find::find(sub {
if (-d $_){
- if ($_ eq "CVS" || $_ eq "RCS"){
+ unless ($self->libscan($_)){
$File::Find::prune = 1;
}
return;
@@ -553,7 +608,7 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
my($striplibpath,$striplibname);
$prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:);
($striplibname,$striplibpath) = fileparse($striplibpath);
- my($inst) = File::Spec->catfile($prefix,$striplibpath,$striplibname);
+ my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
local($_) = $inst; # for backwards compatibility
$inst = $self->libscan($inst);
print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
@@ -578,103 +633,39 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
}
}
-=item libscan (o)
-Takes a path to a file that is found by init_dirscan and returns false
-if we don't want to include this file in the library. Mainly used to
-exclude RCS, CVS, and SCCS directories from installation.
+=item init_VERSION (o)
-=cut
-
-# ';
-
-sub libscan {
- my($self,$path) = @_;
- return '' if $path =~ m/:(RCS|CVS|SCCS):/ ;
- $path;
-}
-
-=item constants (o)
-
-Initializes lots of constants and .SUFFIXES and .PHONY
+Change DEFINE_VERSION and XS_DEFINE_VERSION
=cut
-sub constants {
- my($self) = @_;
- my(@m,$tmp);
-
- for $tmp (qw/
- NAME DISTNAME NAME_SYM VERSION VERSION_SYM XS_VERSION
- INST_LIB INST_ARCHLIB PERL_LIB PERL_SRC MACPERL_SRC MACPERL_LIB PERL FULLPERL
- XSPROTOARG MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED SOURCE TYPEMAPS
- / ) {
- next unless defined $self->{$tmp};
- if ($tmp eq 'TYPEMAPS' && ref $self->{$tmp}) {
- push @m, sprintf "$tmp = %s\n", join " ", @{$self->{$tmp}};
- } else {
- push @m, "$tmp = $self->{$tmp}\n";
- }
- }
+sub init_VERSION {
+ my $self = shift;
- push @m, q{
-MODULES = }.join(" \\\n\t", sort keys %{$self->{PM}})."\n";
- push @m, "PMLIBDIRS = @{$self->{PMLIBDIRS}}\n" if @{$self->{PMLIBDIRS}};
+ $self->SUPER::init_VERSION;
- push @m, '
+ $self->{DEFINE_VERSION} = '-d $(VERSION_MACRO)="¶"$(VERSION)¶""';
+ $self->{XS_DEFINE_VERSION} = '-d $(XS_VERSION_MACRO)="¶"$(XS_VERSION)¶""';
+}
-.INCLUDE : $(MACPERL_SRC)BuildRules.mk
-';
+=item special_targets (o)
- push @m, qq{
-VERSION_MACRO = VERSION
-DEFINE_VERSION = -d \$(VERSION_MACRO)="¶"\$(VERSION)¶""
-XS_VERSION_MACRO = XS_VERSION
-XS_DEFINE_VERSION = -d \$(XS_VERSION_MACRO)="¶"\$(XS_VERSION)¶""
-};
+Add .INCLUDE
- $self->{DEFINE} .= " \$(XS_DEFINE_VERSION) \$(DEFINE_VERSION)";
+=cut
- push @m, qq{
-MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
-MM_VERSION = $ExtUtils::MakeMaker::VERSION
-};
-
- push @m, q{
-# FULLEXT = Pathname for extension directory (eg DBD:Oracle).
-# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
-# ROOTEXT = Directory part of FULLEXT (eg DBD)
-# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
-};
-
- if ($self->{DEFINE}) {
- $self->{DEFINE} =~ s/-D/-d /g; # Preprocessor definitions may be useful
- $self->{DEFINE} =~ s/-I\S+/_include($1)/eg; # UN*X includes probably are not useful
- }
- if ($self->{INC}) {
- $self->{INC} =~ s/-I(\S+)/_include($1)/eg; # UN*X includes probably are not useful
- }
- for $tmp (qw/
- FULLEXT BASEEXT ROOTEXT DEFINE INC
- / ) {
- next unless defined $self->{$tmp};
- push @m, "$tmp = $self->{$tmp}\n";
- }
+sub special_targets {
+ my $self = shift;
- push @m, "
-# Handy lists of source code files:
-XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
-C_FILES = ".join(" \\\n\t", @{$self->{C}})."
-H_FILES = ".join(" \\\n\t", @{$self->{H}})."
-";
+ my $make_frag = $self->SUPER::special_targets;
- push @m, '
+ return $make_frag . <<'MAKE_FRAG';
+.INCLUDE : $(MACPERL_SRC)BuildRules.mk $(MACPERL_SRC)ExtBuildRules.mk
-.INCLUDE : $(MACPERL_SRC)ExtBuildRules.mk
-';
+MAKE_FRAG
- join('',@m);
}
=item static (o)
@@ -765,32 +756,56 @@ sub clean {
# 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 :: clean_subdirs
');
- # clean subdirectories first
- for $dir (@{$self->{DIR}}) {
- push @m,
-" Set OldEcho \{Echo\}
- Set Echo 0
- Directory $dir
- If \"\`Exists -f $self->{MAKEFILE}\`\" != \"\"
- \$(MAKE) clean
- End
- Set Echo \{OldEcho\}
- ";
- }
my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
push(@otherfiles, patternify($attribs{FILES})) if $attribs{FILES};
push @m, "\t\$(RM_RF) @otherfiles\n";
# See realclean and ext/utils/make_ext for usage of Makefile.old
push(@m,
- "\t\$(MV) $self->{MAKEFILE} $self->{MAKEFILE}.old\n");
+ "\t\$(MV) \$(FIRST_MAKEFILE) \$(MAKEFILE_OLD)\n");
push(@m,
"\t$attribs{POSTOP}\n") if $attribs{POSTOP};
join("", @m);
}
+=item clean_subdirs_target
+
+MacOS semantics for changing directories and checking for existence
+very different than everyone else.
+
+=cut
+
+sub clean_subdirs_target {
+ my($self) = shift;
+
+ # No subdirectories, no cleaning.
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+clean_subdirs :
+ $(NOECHO)$(NOOP)
+NOOP_FRAG
+
+
+ my $clean = "clean_subdirs :\n";
+
+ for my $dir (@{$self->{DIR}}) {
+ $clean .= sprintf <<'MAKE_FRAG', $dir;
+ Set OldEcho {Echo}
+ Set Echo 0
+ Directory %s
+ If "`Exists -f $(FIRST_MAKEFILE)`" != ""
+ $(MAKE) clean
+ End
+ Set Echo {OldEcho}
+
+MAKE_FRAG
+ }
+
+ return $clean;
+}
+
+
=item realclean (o)
Defines the realclean target.
@@ -804,28 +819,50 @@ sub realclean {
# Delete temporary files (via clean) and also delete installed files
realclean purge :: clean
');
- # realclean subdirectories first (already cleaned)
- my $sub =
-" Set OldEcho \{Echo\}
+
+ my(@otherfiles) = ('$(FIRST_MAKEFILE)', '$(MAKEFILE_OLD)'); # Makefiles last
+ push(@otherfiles, patternify($attribs{FILES})) if $attribs{FILES};
+ push(@m, "\t\$(RM_RF) @otherfiles\n") if @otherfiles;
+ push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
+ join("", @m);
+}
+
+
+=item realclean_subdirs_target
+
+MacOS semantics for changing directories and checking for existence
+very different than everyone else.
+
+=cut
+
+sub realclean_subdirs_target {
+ my $self = shift;
+
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+realclean_subdirs :
+ $(NOECHO)$(NOOP)
+NOOP_FRAG
+
+ my $rclean = "realclean_subdirs :\n";
+
+ foreach my $dir (@{$self->{DIR}}){
+ $rclean .= sprintf <<'RCLEAN', $dir,
+ Set OldEcho \{Echo\}
Set Echo 0
Directory %s
- If \"\`Exists -f %s\`\" != \"\"
+ If \"\`Exists -f $(FIRST_MAKEFILE)\`\" != \"\"
\$(MAKE) realclean
End
Set Echo \{OldEcho\}
- ";
- foreach(@{$self->{DIR}}){
- push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
- push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
+
+RCLEAN
+
}
- my(@otherfiles) = ($self->{MAKEFILE},
- "$self->{MAKEFILE}.old"); # Makefiles last
- push(@otherfiles, patternify($attribs{FILES})) if $attribs{FILES};
- push(@m, "\t\$(RM_RF) @otherfiles\n") if @otherfiles;
- push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
- join("", @m);
+
+ return $rclean;
}
+
=item rulez (o)
=cut
@@ -840,11 +877,6 @@ install install_static install_dynamic ::
';
}
-sub xsubpp_version
-{
- return $ExtUtils::MakeMaker::Version;
-}
-
=item processPL (o)
@@ -863,7 +895,7 @@ sub processPL {
foreach $target (@$list) {
push @m, "
ProcessPL :: $target
-\t$self->{NOECHO}\$(NOOP)
+\t$(NOECHO)\$(NOOP)
$target :: $plfile
\t\$(PERL) -I\$(MACPERL_LIB) -I\$(PERL_LIB) $plfile $target
@@ -875,15 +907,16 @@ $target :: $plfile
sub cflags {
my($self,$libperl) = @_;
- my $optimize;
+ my $optimize = '';
for (map { $_ . "Optimize" } qw(MWC MWCPPC MWC68K MPW MRC MRC SC)) {
- $optimize .= "$_ = $self->{$_}" if exists $self->{$_};
+ $optimize .= "$_ = $self->{$_}" if exists $self->{$_};
}
return $self->{CFLAGS} = $optimize;
}
+
sub _include { # for Unix-style includes, with -I instead of -i
my($inc) = @_;
require File::Spec::Unix;
@@ -896,45 +929,18 @@ sub _include { # for Unix-style includes, with -I instead of -i
}
}
-# yes, these are just copies of the same routines in
-# MakeMaker.pm, but with paths changed.
-sub check_hints {
- my($self) = @_;
- # We allow extension-specific hints files.
-
- return unless -d ":hints";
-
- # First we look for the best hintsfile we have
- my($hint)="${^O}_$Config{osvers}";
- $hint =~ s/\./_/g;
- $hint =~ s/_$//;
- return unless $hint;
+=item os_flavor
- # Also try without trailing minor version numbers.
- while (1) {
- last if -f ":hints:$hint.pl"; # found
- } continue {
- last unless $hint =~ s/_[^_]*$//; # nothing to cut off
- }
- my $hint_file = ":hints:$hint.pl";
+MacOS Classic is MacOS and MacOS Classic.
- return unless -f $hint_file; # really there
+=cut
- _run_hintfile($self, $hint_file);
+sub os_flavor {
+ return('MacOS', 'MacOS Classic');
}
-sub _run_hintfile {
- no strict 'vars';
- local($self) = shift; # make $self available to the hint file.
- my($hint_file) = shift;
+=back
- local $@;
- print STDERR "Processing hints file $hint_file\n";
- my $ret = do $hint_file;
- unless( defined $ret ) {
- print STDERR $@ if $@;
- }
-}
-1;
+=cut
-__END__
+1;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_NW5.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_NW5.pm
index 7f13dd0ee70..82c2d66dbc9 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_NW5.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_NW5.pm
@@ -23,7 +23,7 @@ use Config;
use File::Basename;
use vars qw(@ISA $VERSION);
-$VERSION = '2.05';
+$VERSION = '2.06';
require ExtUtils::MM_Win32;
@ISA = qw(ExtUtils::MM_Win32);
@@ -37,17 +37,45 @@ my $GCC = 1 if $Config{'cc'} =~ /^gcc/i;
my $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
-sub init_others {
- my ($self) = @_;
- $self->SUPER::init_others(@_);
+=item os_flavor
+
+We're Netware in addition to being Windows.
+
+=cut
+
+sub os_flavor {
+ my $self = shift;
+ return ($self->SUPER::os_flavor, 'Netware');
+}
+
+=item init_platform (o)
+
+Add Netware macros.
+
+LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH, BOOT_SYMBOL,
+NLM_SHORT_NAME, INCLUDE, PATH, MM_NW5_REVISION
+
+
+=item platform_constants
+
+Add Netware macros initialized above to the Makefile.
+
+=cut
+
+sub init_platform {
+ my($self) = shift;
+
+ # To get Win32's setup.
+ $self->SUPER::init_platform;
# incpath is copied to makefile var INCLUDE in constants sub, here just
# make it empty
my $libpth = $Config{'libpth'};
$libpth =~ s( )(;);
$self->{'LIBPTH'} = $libpth;
+
$self->{'BASE_IMPORT'} = $Config{'base_import'};
-
+
# Additional import file specified from Makefile.pl
if($self->{'base_import'}) {
$self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
@@ -56,188 +84,61 @@ sub init_others {
$self->{'NLM_VERSION'} = $Config{'nlm_version'};
$self->{'MPKTOOL'} = $Config{'mpktool'};
$self->{'TOOLPATH'} = $Config{'toolpath'};
-}
-
-
-=item constants (o)
-
-Initializes lots of constants and .SUFFIXES and .PHONY
-
-=cut
-
-sub const_cccmd {
- my($self,$libperl)=@_;
- return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
- return '' unless $self->needs_linking();
- return $self->{CONST_CCCMD} = <<'MAKE_FRAG';
-CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \
- $(PERLTYPE) $(MPOLLUTE) -o $@ \
- -DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\"
-MAKE_FRAG
-
-}
-
-sub constants {
- my($self) = @_;
- my(@m,$tmp);
-
-# Added LIBPTH, BASE_IMPORT, ABSTRACT, NLM_VERSION BOOT_SYMBOL, NLM_SHORT_NAME
-# for NETWARE
-
- for $tmp (qw/
-
- AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
- VERSION_SYM XS_VERSION INST_BIN INST_LIB
- INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
- INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
- INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
- PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
- FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
- PERL_INC PERL FULLPERL LIBPTH BASE_IMPORT PERLRUN
- FULLPERLRUN PERLRUNINST FULLPERLRUNINST
- FULL_AR PERL_CORE NLM_VERSION MPKTOOL TOOLPATH
-
- / ) {
- next unless defined $self->{$tmp};
- push @m, "$tmp = $self->{$tmp}\n";
- }
(my $boot = $self->{'NAME'}) =~ s/:/_/g;
$self->{'BOOT_SYMBOL'}=$boot;
- push @m, "BOOT_SYMBOL = $self->{'BOOT_SYMBOL'}\n";
# If the final binary name is greater than 8 chars,
# truncate it here.
if(length($self->{'BASEEXT'}) > 8) {
$self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
- push @m, "NLM_SHORT_NAME = $self->{'NLM_SHORT_NAME'}\n";
}
- push @m, qq{
-VERSION_MACRO = VERSION
-DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
-XS_VERSION_MACRO = XS_VERSION
-XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
-};
-
# Get the include path and replace the spaces with ;
# Copy this to makefile as INCLUDE = d:\...;d:\;
- (my $inc = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
-
- # Get the additional include path from the user through the command prompt
- # and append to INCLUDE
-# $self->{INC} = '';
- push @m, "INC = $self->{'INC'}\n";
-
- push @m, qq{
-INCLUDE = $inc;
-};
+ ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
# Set the path to CodeWarrior binaries which might not have been set in
# any other place
- push @m, qq{
-PATH = \$(PATH);\$(TOOLPATH)
-};
-
- push @m, qq{
-MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
-MM_VERSION = $ExtUtils::MakeMaker::VERSION
-};
-
- push @m, q{
-# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
-# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
-# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
-# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
-};
-
- for $tmp (qw/
- FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
- LDFROM LINKTYPE
- / ) {
- next unless defined $self->{$tmp};
- push @m, "$tmp = $self->{$tmp}\n";
- }
-
- push @m, "
-# Handy lists of source code files:
-XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
-C_FILES = ".join(" \\\n\t", @{$self->{C}})."
-O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
-H_FILES = ".join(" \\\n\t", @{$self->{H}})."
-MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
-MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
-";
-
- for $tmp (qw/
- INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
- INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
- /) {
- next unless defined $self->{$tmp};
- push @m, "$tmp = $self->{$tmp}\n";
- }
-
- push @m, qq{
-.USESHELL :
-} if $DMAKE;
-
- push @m, q{
-.NO_CONFIG_REC: Makefile
-} if $ENV{CLEARCASE_ROOT};
-
- # why not q{} ? -- emacs
- push @m, qq{
-# work around a famous dec-osf make(1) feature(?):
-makemakerdflt: all
+ $self->{PATH} = '$(PATH);$(TOOLPATH)';
-.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
+ $self->{MM_NW5_VERSION} = $VERSION;
+}
-.PHONY: all config static dynamic test linkext manifest
+sub platform_constants {
+ my($self) = shift;
+ my $make_frag = '';
-# Where is the Config information that we are using/depend on
-CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
-};
+ # Setup Win32's constants.
+ $make_frag .= $self->SUPER::platform_constants;
- my @parentdir = split(/::/, $self->{PARENT_NAME});
- push @m, q{
-# Where to put things:
-INST_LIBDIR = }. File::Spec->catdir('$(INST_LIB)',@parentdir) .q{
-INST_ARCHLIBDIR = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir) .q{
+ foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL
+ TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH
+ MM_NW5_VERSION
+ ))
+ {
+ next unless defined $self->{$macro};
+ $make_frag .= "$macro = $self->{$macro}\n";
+ }
-INST_AUTODIR = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
-INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
-};
+ return $make_frag;
+}
- if ($self->has_link_code()) {
- push @m, '
-INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
-INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
-INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
-';
- } else {
- push @m, '
-INST_STATIC =
-INST_DYNAMIC =
-INST_BOOT =
-';
- }
- $tmp = $self->export_list;
- push @m, "
-EXPORT_LIST = $tmp
-";
- $tmp = $self->perl_archive;
- push @m, "
-PERL_ARCHIVE = $tmp
-";
+=item const_cccmd (o)
- push @m, q{
-TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
+=cut
-PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
-};
+sub const_cccmd {
+ my($self,$libperl)=@_;
+ return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
+ return '' unless $self->needs_linking();
+ return $self->{CONST_CCCMD} = <<'MAKE_FRAG';
+CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \
+ $(PERLTYPE) $(MPOLLUTE) -o $@ \
+ -DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\"
+MAKE_FRAG
- join('',@m);
}
@@ -251,7 +152,7 @@ sub static_lib {
return '' unless $self->has_link_code;
my $m = <<'END';
-$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
+$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
$(RM_RF) $@
END
@@ -274,12 +175,12 @@ END
$m .= sprintf <<'END', $ar_arg;
$(AR) %s
- $(NOECHO)echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
$(CHMOD) 755 $@
END
$m .= <<'END' if $self->{PERL_SRC};
- $(NOECHO)echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
+ $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
END
@@ -313,16 +214,16 @@ INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
# Create xdc data for an MT safe NLM in case of mpk build
$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
- @echo Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def
- @echo $(BASE_IMPORT) >> $(BASEEXT).def
- @echo Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def
+ $(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def
+ $(NOECHO) $(ECHO) $(BASE_IMPORT) >> $(BASEEXT).def
+ $(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def
MAKE_FRAG
if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
$m .= <<'MAKE_FRAG';
$(MPKTOOL) $(XDCFLAGS) $(BASEEXT).xdc
- @echo xdcdata $(BASEEXT).xdc >> $(BASEEXT).def
+ $(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> $(BASEEXT).def
MAKE_FRAG
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_UWIN.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_UWIN.pm
index 59384a22841..1667d552c8f 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_UWIN.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_UWIN.pm
@@ -2,7 +2,7 @@ package ExtUtils::MM_UWIN;
use strict;
use vars qw($VERSION @ISA);
-$VERSION = 0.01;
+$VERSION = 0.02;
require ExtUtils::MM_Unix;
@ISA = qw(ExtUtils::MM_Unix);
@@ -28,6 +28,17 @@ Unless otherwise stated it works just like ExtUtils::MM_Unix
=over 4
+=item os_flavor
+
+In addition to being Unix, we're U/WIN.
+
+=cut
+
+sub os_flavor {
+ return('Unix', 'U/WIN');
+}
+
+
=item B<replace_manpage_separator>
=cut
@@ -49,4 +60,6 @@ Michael G Schwern <schwern@pobox.com> with code from ExtUtils::MM_Unix
L<ExtUtils::MM_Win32>, L<ExtUtils::MakeMaker>
+=cut
+
1;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MM_Win95.pm b/gnu/usr.bin/perl/lib/ExtUtils/MM_Win95.pm
index 010900f5c36..68c2ac85881 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/MM_Win95.pm
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MM_Win95.pm
@@ -1,11 +1,15 @@
package ExtUtils::MM_Win95;
use vars qw($VERSION @ISA);
-$VERSION = 0.02;
+$VERSION = 0.03;
require ExtUtils::MM_Win32;
@ISA = qw(ExtUtils::MM_Win32);
+
use Config;
+my $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
+my $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
+
=head1 NAME
@@ -20,6 +24,18 @@ ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
This is a subclass of ExtUtils::MM_Win32 containing changes necessary
to get MakeMaker playing nice with command.com and other Win9Xisms.
+=head2 Overriden methods
+
+Most of these make up for limitations in the Win9x command shell.
+Namely the lack of && and that a chdir is global, so you have to chdir
+back at the end.
+
+=over 4
+
+=item dist_test
+
+&& and chdir problem.
+
=cut
sub dist_test {
@@ -34,38 +50,176 @@ disttest : distdir
};
}
+=item subdir_x
+
+&& and chdir problem.
+
+Also, dmake has an odd way of making a command series silent.
+
+=cut
+
+sub subdir_x {
+ my($self, $subdir) = @_;
+
+ # Win-9x has nasty problem in command.com that can't cope with
+ # &&. Also, Dmake has an odd way of making a commandseries silent:
+ if ($DMAKE) {
+ return sprintf <<'EOT', $subdir;
+
+subdirs ::
+@[
+ cd %s
+ $(MAKE) all $(PASTHRU)
+ cd ..
+]
+EOT
+ }
+ else {
+ return sprintf <<'EOT', $subdir;
+
+subdirs ::
+ $(NOECHO)cd %s
+ $(NOECHO)$(MAKE) all $(PASTHRU)
+ $(NOECHO)cd ..
+EOT
+ }
+}
+
+=item xs_c
+
+The && problem.
+
+=cut
+
sub xs_c {
my($self) = shift;
return '' unless $self->needs_linking();
'
.xs.c:
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
- $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+ $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
'
}
+
+=item xs_cpp
+
+The && problem
+
+=cut
+
sub xs_cpp {
my($self) = shift;
return '' unless $self->needs_linking();
'
.xs.cpp:
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
- $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
+ $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
';
}
-# many makes are too dumb to use xs_c then c_o
+=item xs_o
+
+The && problem.
+
+=cut
+
sub xs_o {
my($self) = shift;
return '' unless $self->needs_linking();
- # having to choose between .xs -> .c -> .o and .xs -> .o confuses dmake
- return '' if $Config{make} eq 'dmake';
+ # Having to choose between .xs -> .c -> .o and .xs -> .o confuses dmake.
+ return '' if $DMAKE;
'
.xs$(OBJ_EXT):
- $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
- $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
+ $(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
$(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
';
}
+=item clean_subdirs_target
+
+&& and chdir problem.
+
+=cut
+
+sub clean_subdirs_target {
+ my($self) = shift;
+
+ # No subdirectories, no cleaning.
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+clean_subdirs :
+ $(NOECHO)$(NOOP)
+NOOP_FRAG
+
+
+ my $clean = "clean_subdirs :\n";
+
+ for my $dir (@{$self->{DIR}}) {
+ $clean .= sprintf <<'MAKE_FRAG', $dir;
+ cd %s
+ $(TEST_F) $(FIRST_MAKEFILE)
+ $(MAKE) clean
+ cd ..
+MAKE_FRAG
+ }
+
+ return $clean;
+}
+
+
+=item realclean_subdirs_target
+
+&& and chdir problem.
+
+=cut
+
+sub realclean_subdirs_target {
+ my $self = shift;
+
+ return <<'NOOP_FRAG' unless @{$self->{DIR}};
+realclean_subdirs :
+ $(NOECHO)$(NOOP)
+NOOP_FRAG
+
+ my $rclean = "realclean_subdirs :\n";
+
+ foreach my $dir (@{$self->{DIR}}){
+ $rclean .= sprintf <<'RCLEAN', $dir;
+ -cd %s
+ -$(PERLRUN) -e "exit unless -f shift; system q{$(MAKE) realclean}" $(FIRST_MAKEFILE)
+ -cd ..
+RCLEAN
+
+ }
+
+ return $rclean;
+}
+
+
+=item os_flavor
+
+Win95 and Win98 and WinME are collectively Win9x and Win32
+
+=cut
+
+sub os_flavor {
+ my $self = shift;
+ return ($self->SUPER::os_flavor, 'Win9x');
+}
+
+
+=back
+
+
+=head1 AUTHOR
+
+Code originally inside MM_Win32. Original author unknown.
+
+Currently maintained by Michael G Schwern <schwern@pobox.com>.
+
+Send patches and ideas to <F<makemaker@perl.org>>.
+
+See http://www.makemaker.org.
+
+=cut
+
+
1;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/FAQ.pod b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/FAQ.pod
new file mode 100644
index 00000000000..a8e9bf2e997
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/FAQ.pod
@@ -0,0 +1,257 @@
+package ExtUtils::MakeMaker::FAQ;
+
+(our $VERSION) = sprintf "%03d", q$Revision: 1.1.1.1 $ =~ /Revision:\s+(\S+)/;
+
+1;
+__END__
+
+=head1 NAME
+
+ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About MakeMaker
+
+=head1 DESCRIPTION
+
+FAQs, tricks and tips for C<ExtUtils::MakeMaker>.
+
+=head2 Philosophy and History
+
+=over 4
+
+=item Why not just use <insert other build config tool here>?
+
+Why did MakeMaker reinvent the build configuration wheel? Why not
+just use autoconf or automake or ppm or Ant or ...
+
+There are many reasons, but the major one is cross-platform
+compatibility.
+
+Perl is one of the most ported pieces of software ever. It works on
+operating systems I've never even heard of (see perlport for details).
+It needs a build tool that can work on all those platforms and with
+any wacky C compilers they might have.
+
+No such build tool existed at the time and I only know of one now
+(Module::Build).
+
+
+=item What's Module::Build and how does it relate to MakeMaker?
+
+Module::Build is a project by Ken Williams to supplant MakeMaker.
+Its primary advantages are:
+
+=over 8
+
+=item * pure perl. no make, no shell commands
+
+=item * easier to customize
+
+=item * cleaner internals
+
+=item * less cruft
+
+=back
+
+Module::Build is the official heir apparent to MakeMaker and we
+encourage people to work on M::B rather than spending time improving
+MakeMaker.
+
+=back
+
+=head2 Module Writing
+
+=over 4
+
+=item How do I keep my $VERSION up to date without resetting it manually?
+
+Often you want to manually set the $VERSION in the main module
+distribution because this is the version that everybody sees on CPAN
+and maybe you want to customize it a bit. But for all the other
+modules in your dist, $VERSION is really just bookkeeping and all that's
+important is it goes up every time the module is changed. Doing this
+by hand is a pain and you often forget.
+
+Simplest way to do it automatically is to use your version control
+system's revision number (you are using version control, right?).
+
+In CVS and RCS you use $Z<>Revision$ writing it like so:
+
+ $VERSION = sprintf "%d.%03d", q$Revision: 1.1.1.1 $ =~ /(\d+)/g;
+
+Every time the file is checked in the $Z<>Revision$ will be updated,
+updating your $VERSION.
+
+In CVS version 1.9 is followed by 1.10. Since CPAN compares version
+numbers numerically we use a sprintf() to convert 1.9 to 1.009 and
+1.10 to 1.010 which compare properly.
+
+If branches are involved (ie. $Z<>Revision: 1.5.3.4) its a little more
+complicated.
+
+ # must be all on one line or MakeMaker will get confused.
+ $VERSION = do { my @r = (q$Revision: 1.1.1.1 $ =~ /\d+/g); sprintf "%d."."%03d" x $#r, @r };
+
+=item What's this F<META.yml> thing and how did it get in my F<MANIFEST>?!
+
+F<META.yml> is a module meta-data file pioneered by Module::Build and
+automatically generated as part of the 'distdir' target (and thus
+'dist'). See L<ExtUtils::MakeMaker/"Module Meta-Data">.
+
+To shut off its generation, pass the C<NO_META> flag to C<WriteMakefile()>.
+
+=back
+
+=head2 XS
+
+=over 4
+
+=item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors?
+
+XS code is very sensitive to the module version number and will
+complain if the version number in your Perl module doesn't match. If
+you change your module's version # without reruning Makefile.PL the old
+version number will remain in the Makefile causing the XS code to be built
+with the wrong number.
+
+To avoid this, you can force the Makefile to be rebuilt whenever you
+change the module containing the version number by adding this to your
+WriteMakefile() arguments.
+
+ depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' }
+
+
+=item How do I make two or more XS files coexist in the same directory?
+
+Sometimes you need to have two and more XS files in the same package.
+One way to go is to put them into separate directories, but sometimes
+this is not the most suitable solution. The following technique allows
+you to put two (and more) XS files in the same directory.
+
+Let's assume that we have a package C<Cool::Foo>, which includes
+C<Cool::Foo> and C<Cool::Bar> modules each having a separate XS
+file. First we use the following I<Makefile.PL>:
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => 'Cool::Foo',
+ VERSION_FROM => 'Foo.pm',
+ OBJECT => q/$(O_FILES)/,
+ # ... other attrs ...
+ );
+
+Notice the C<OBJECT> attribute. MakeMaker generates the following
+variables in I<Makefile>:
+
+ # Handy lists of source code files:
+ XS_FILES= Bar.xs \
+ Foo.xs
+ C_FILES = Bar.c \
+ Foo.c
+ O_FILES = Bar.o \
+ Foo.o
+
+Therefore we can use the C<O_FILES> variable to tell MakeMaker to use
+these objects into the shared library.
+
+That's pretty much it. Now write I<Foo.pm> and I<Foo.xs>, I<Bar.pm>
+and I<Bar.xs>, where I<Foo.pm> bootstraps the shared library and
+I<Bar.pm> simply loading I<Foo.pm>.
+
+The only issue left is to how to bootstrap I<Bar.xs>. This is done
+from I<Foo.xs>:
+
+ MODULE = Cool::Foo PACKAGE = Cool::Foo
+
+ BOOT:
+ # boot the second XS file
+ boot_Cool__Bar(aTHX_ cv);
+
+If you have more than two files, this is the place where you should
+boot extra XS files from.
+
+The following four files sum up all the details discussed so far.
+
+ Foo.pm:
+ -------
+ package Cool::Foo;
+
+ require DynaLoader;
+
+ our @ISA = qw(DynaLoader);
+ our $VERSION = '0.01';
+ bootstrap Cool::Foo $VERSION;
+
+ 1;
+
+ Bar.pm:
+ -------
+ package Cool::Bar;
+
+ use Cool::Foo; # bootstraps Bar.xs
+
+ 1;
+
+ Foo.xs:
+ -------
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ MODULE = Cool::Foo PACKAGE = Cool::Foo
+
+ BOOT:
+ # boot the second XS file
+ boot_Cool__Bar(aTHX_ cv);
+
+ MODULE = Cool::Foo PACKAGE = Cool::Foo PREFIX = cool_foo_
+
+ void
+ cool_foo_perl_rules()
+
+ CODE:
+ fprintf(stderr, "Cool::Foo says: Perl Rules\n");
+
+ Bar.xs:
+ -------
+ #include "EXTERN.h"
+ #include "perl.h"
+ #include "XSUB.h"
+
+ MODULE = Cool::Bar PACKAGE = Cool::Bar PREFIX = cool_bar_
+
+ void
+ cool_bar_perl_rules()
+
+ CODE:
+ fprintf(stderr, "Cool::Bar says: Perl Rules\n");
+
+And of course a very basic test:
+
+ test.pl:
+ --------
+ use Test;
+ BEGIN { plan tests => 1 };
+ use Cool::Foo;
+ use Cool::Bar;
+ Cool::Foo::perl_rules();
+ Cool::Bar::perl_rules();
+ ok 1;
+
+This tip has been brought to you by Nick Ing-Simmons and Stas Bekman.
+
+=back
+
+=head1 PATCHING
+
+If you have a question you'd like to see added to the FAQ (whether or
+not you have the answer) please send it to makemaker@perl.org.
+
+=head1 AUTHOR
+
+The denizens of makemaker@perl.org.
+
+=head1 SEE ALSO
+
+L<ExtUtils::MakeMaker>
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/Tutorial.pod b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/Tutorial.pod
new file mode 100644
index 00000000000..fbfcf8abcc4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/Tutorial.pod
@@ -0,0 +1,179 @@
+package ExtUtils::MakeMaker::Tutorial;
+
+use vars qw($VERSION);
+$VERSION = 0.01;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
+
+=head1 SYNOPSIS
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => 'Your::Module',
+ VERSION_FROM => 'lib/Your/Module.pm'
+ );
+
+=head1 DESCRIPTION
+
+This is a short tutorial on writing a simple module with MakeMaker.
+Its really not that hard.
+
+
+=head2 The Mantra
+
+MakeMaker modules are installed using this simple mantra
+
+ perl Makefile.PL
+ make
+ make test
+ make install
+
+There are lots more commands and options, but the above will do it.
+
+
+=head2 The Layout
+
+The basic files in a module look something like this.
+
+ Makefile.PL
+ MANIFEST
+ lib/Your/Module.pm
+
+That's all that's strictly necessary. There's additional files you might
+want:
+
+ lib/Your/Other/Module.pm
+ t/some_test.t
+ t/some_other_test.t
+ Changes
+ README
+ INSTALL
+ MANIFEST.SKIP
+ bin/some_program
+
+=over 4
+
+=item Makefile.PL
+
+When you run Makefile.PL, it makes a Makefile. That's the whole point of
+MakeMaker. The Makefile.PL is a simple module which loads
+ExtUtils::MakeMaker and runs the WriteMakefile() function with a few
+simple arguments.
+
+Here's an example of what you need for a simple module:
+
+ use ExtUtils::MakeMaker;
+
+ WriteMakefile(
+ NAME => 'Your::Module',
+ VERSION_FROM => 'lib/Your/Module.pm'
+ );
+
+NAME is the top-level namespace of your module. VERSION_FROM is the file
+which contains the $VERSION variable for the entire distribution. Typically
+this is the same as your top-level module.
+
+
+=item MANIFEST
+
+A simple listing of all the files in your distribution.
+
+ Makefile.PL
+ MANIFEST
+ lib/Your/Module.pm
+
+Filepaths in a MANIFEST always use Unix conventions (ie. /) even if you're
+not on Unix.
+
+You can write this by hand or generate it with 'make manifest'.
+
+
+=item lib/
+
+This is the directory where your .pm and .pod files you wish to have
+installed go. They are layed out according to namespace. So Foo::Bar
+is lib/Foo/Bar.pm.
+
+
+=item t/
+
+Tests for your modules go here. Each test filename ends with a .t.
+So t/foo.t. 'make test' will run these tests. The directory is flat,
+you cannot, for example, have t/foo/bar.t run by 'make test'.
+
+Tests are run from the top level of your distribution. So inside a test
+you would refer to ./lib to enter the lib directory, for example.
+
+
+=item Changes
+
+A log of changes you've made to this module. The layout is free-form.
+Here's an example:
+
+ 1.01 Fri Apr 11 00:21:25 PDT 2003
+ - thing() does some stuff now
+ - fixed the wiggy bug in withit()
+
+ 1.00 Mon Apr 7 00:57:15 PDT 2003
+ - "Rain of Frogs" now supported
+
+
+=item README
+
+A short description of your module, what it does, why someone would use it
+and its limitations. CPAN automatically pulls your README file out of
+the archive and makes it available to CPAN users, it is the first thing
+they will read to decide if your module is right for them.
+
+
+=item INSTALL
+
+Instructions on how to install your module along with any dependencies.
+Suggested information to include here:
+
+ any extra modules required for use
+ the minimum version of Perl required
+ if only works on certain operating systems
+
+
+=item MANIFEST.SKIP
+
+A file full of regular expressions to exclude when using 'make
+manifest' to generate the MANIFEST. These regular expressions
+are checked against each filepath found in the distribution (so
+you're matching against "t/foo.t" not "foo.t").
+
+Here's a sample:
+
+ ~$ # ignore emacs and vim backup files
+ .bak$ # ignore manual backups
+ \# # ignore CVS old revision files and emacs temp files
+
+Since # can be used for comments, # must be escaped.
+
+MakeMaker comes with a default MANIFEST.SKIP to avoid things like
+version control directories and backup files. Specifying your own
+will override this default.
+
+
+=item bin/
+
+
+=back
+
+=head1 SEE ALSO
+
+L<perlmodstyle> gives stylistic help writing a module.
+
+L<perlnewmod> gives more information about how to write a module.
+
+There are modules to help you through the process of writing a module:
+L<ExtUtils::ModuleMaker>, L<Module::Install>, L<PAR>
+
+=cut
+
+1;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/bytes.pm b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/bytes.pm
new file mode 100644
index 00000000000..7b7e8544201
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/bytes.pm
@@ -0,0 +1,39 @@
+package ExtUtils::MakeMaker::bytes;
+
+use vars qw($VERSION);
+$VERSION = 0.01;
+
+my $Have_Bytes = eval q{require bytes; 1;};
+
+sub import {
+ return unless $Have_Bytes;
+
+ shift;
+ unshift @_, 'bytes';
+
+ goto &bytes::import;
+}
+
+1;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::bytes - Version agnostic bytes.pm
+
+=head1 SYNOPSIS
+
+ use just like bytes.pm
+
+=head1 DESCRIPTION
+
+bytes.pm was introduced with 5.6. This means any code which has 'use
+bytes' in it won't even compile on 5.5.X. Since bytes is a lexical
+pragma and must be used at compile time we can't simply wrap it in
+a BEGIN { eval 'use bytes' } block.
+
+ExtUtils::MakeMaker::bytes is just a very thin wrapper around bytes
+which works just like it when bytes.pm exists and everywhere else it
+does nothing.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/vmsish.pm b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/vmsish.pm
new file mode 100644
index 00000000000..5380ba569a3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/MakeMaker/vmsish.pm
@@ -0,0 +1,40 @@
+package ExtUtils::MakeMaker::vmsish;
+
+use vars qw($VERSION);
+$VERSION = 0.01;
+
+my $IsVMS = $^O eq 'VMS';
+
+require vmsish if $IsVMS;
+
+
+sub import {
+ return unless $IsVMS;
+
+ shift;
+ unshift @_, 'vmsish';
+
+ goto &vmsish::import;
+}
+
+1;
+
+
+=head1 NAME
+
+ExtUtils::MakeMaker::vmsish - Platform agnostic vmsish.pm
+
+=head1 SYNOPSIS
+
+ use just like vmsish.pm
+
+=head1 DESCRIPTION
+
+Until 5.8.0, vmsish.pm is only installed on VMS. This means any code
+which has 'use vmsish' in it won't even compile outside VMS. This
+makes ExtUtils::MM_VMS very hard to test.
+
+ExtUtils::MakeMaker::vmsish is just a very thin wrapper around vmsish
+which works just like it on VMS and everywhere else it does nothing.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/NOTES b/gnu/usr.bin/perl/lib/ExtUtils/NOTES
new file mode 100644
index 00000000000..837167c026d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/NOTES
@@ -0,0 +1,102 @@
+The Simplified MakeMaker class hierarchy
+****************************************
+
+What most people need to know.
+
+(Subclasses on top.)
+
+ MY
+ |
+ ExtUtils::MakeMaker
+ |
+ ExtUtils::MM_{Current OS}
+ |
+ ExtUtils::MM_Unix
+ |
+ ExtUtils::MM_Any
+
+The object actually used is of the class MY which allows you to
+override bits of MakeMaker inside your Makefile.PL by declaring
+MY::foo() methods.
+
+
+The Real MakeMaker class hierarchy
+**********************************
+
+You wish it was that simple.
+
+Here's how it really works.
+
+ PACK### (created each call to ExtUtils::MakeMaker->new)
+ . |
+ (mixin) |
+ . |
+ MY (created by ExtUtils::MY) |
+ | |
+ ExtUtils::MY MM (created by ExtUtils::MM)
+ | | |
+ ExtUtils::MM ExtUtils::MM_{Current OS}
+ | | .
+ | |
+ ExtUtils::Liblist ExtUtils::MakeMaker .
+ |
+ ExtUtils::Liblist::Kid .
+
+ (variable subclass)
+
+ .
+
+ ExtUtils::MM_{NonUnix}. . . . . . . . . . . . . . . .
+ |
+ ExtUtils::MM_Unix . . . . . . . . . . . . . . . . . .
+ |
+ ExtUtils::MM_Any
+
+
+NOTE: Yes, this is a mess. See
+http://archive.develooper.com/makemaker@perl.org/msg00134.html
+for some history.
+
+NOTE: When ExtUtils::MM is loaded it chooses a superclass for MM from
+amongst the ExtUtils::MM_* modules based on the current operating
+system.
+
+NOTE: ExtUtils::MM_{Current OS} represents one of the ExtUtils::MM_*
+modules except ExtUtils::MM_Any.
+
+NOTE: ExtUtils::MM_{NonUnix} represents all of the ExtUtils::MM_*
+modules except ExtUtils::MM_Any and ExtUtils::MM_Unix.
+
+NOTE: The main object used by MakeMaker is a PACK### object, *not*
+ExtUtils::MakeMaker. It is, effectively, a subclass of MY,
+ExtUtils::Makemaker, ExtUtils::Liblist and an ExtUtils::MM_* class
+appropriate for your operating system.
+
+NOTE: The methods in MY are simply copied into PACK### rather than
+MY being a superclass of PACK###. I don't remember the rationale.
+
+NOTE: ExtUtils::Liblist should be removed from the inheritence hiearchy
+and simply be called as functions.
+
+NOTE: Modules like File::Spec and Exporter have been omitted for clarity.
+
+
+The MM_* hierarchy
+******************
+
+ MM_Win95 MM_NW5
+ \ /
+MM_BeOS MM_Cygwin MM_OS2 MM_VMS MM_Win32 MM_DOS MM_MacOS MM_UWIN
+ \ | | | / / / /
+ ---------------------------------------------------------
+ | |
+ MM_Unix |
+ | |
+ MM_Any
+
+NOTE: Each direct MM_Unix subclass is also an MM_Any subclass. This
+is a temporary hack because MM_Unix overrides some MM_Any methods with
+Unix specific code. It allows the non-Unix modules to see the
+original MM_Any implementations.
+
+NOTE: Modules like File::Spec and Exporter have been omitted for clarity.
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/PATCHING b/gnu/usr.bin/perl/lib/ExtUtils/PATCHING
new file mode 100644
index 00000000000..9c3da45d26c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/PATCHING
@@ -0,0 +1,180 @@
+This is a short set of guidelines for those patching
+ExtUtils::MakeMaker. Its not an iron-clad set of rules, but just
+things which make life easier when reading and integrating a patch.
+
+Lots of information can be found in makemaker.org.
+
+MakerMaker is being maintained until something else can replace it.
+Bugs will be fixed and compatibility improved, but I would like to
+avoid new features. If you want to add something to MakeMaker,
+consider instead working on Module::Build, MakeMaker's heir apparent.
+
+
+Reporting bugs
+
+- Often the only information we have for fixing a bug is contained in your
+ report. So...
+
+- Please report your bugs via http://rt.cpan.org or by mailing to
+ makemaker@perl.org. RT is preferred.
+
+- Please report your bug immediately upon encountering it. Do not wait
+ until you have a patch to fix the bug. Patches are good, but not at
+ the expense of timely bug reports.
+
+- Please be as verbose as possible. Include the complete output of
+ your 'make test' or even 'make test TEST_VERBOSE=1' and a copy of the
+ generated Makefile. Err on the side of verbosity. The more data we
+ have to work with, the faster we can diagnose the problem.
+
+- If you find an undocumented feature, or if a feature has changed/been
+ added which causes a problem, report it. Do not assume it was done
+ deliberately. Even if it was done deliberately, we still want to hear
+ if it caused problems.
+
+- If you're testing MakeMaker against a development version of Perl,
+ please also check it against the latest stable version. This makes it
+ easier to figure out if its MakeMaker or Perl at fault.
+
+
+Patching details
+
+- Please use unified diffs. (diff -u)
+
+- Patches against the latest development snapshot from makemaker.org are
+ preferred. Patches against the latest CPAN version are ok, too.
+
+- Post your patch to makemaker@perl.org.
+
+
+Code formatting
+
+- No literal tabs (except where necessary inside Makefile code, obviously).
+
+- 4 character indentation.
+
+- this_style is prefered instead of studlyCaps.
+
+- Private subroutine names (ie. those used only in the same package
+ they're declared in) should start with an underscore (_sekret_method).
+
+- Protected subroutines (ie. ones intended to be used by other modules in
+ ExtUtils::*) should be named normally (no leading underscore) but
+ documented as protected (see Documentation below).
+
+- Do not use indirect object syntax (ie. new Foo::Bar (@args))
+
+- make variables use dollar signs like Perl scalars. This causes problems
+ when you have to mix them both in a string. If you find yourself
+ backwacking lots of dollar signs because you have one interpolated
+ perl variable, like this:
+
+ return <<'EOT'
+
+subdirs ::
+ \$(NOECHO)cd $subdir && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
+EOT
+
+ or are switching quoting contexts:
+
+ return <<q{
+subdirs ::
+ $(NOECHO)cd }.$subdir.q{ && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
+};
+
+ consider using sprintf instead.
+
+ return sprintf <<'EOT', $subdir;
+
+subdirs ::
+ $(NOECHO)cd %s && $(MAKE) -f $(FIRST_MAKEFILE) all $(PASTHRU)
+EOT
+
+
+Refactoring and Cleanup
+
+- MakeMaker is a mess. We like patches which clean things up.
+
+
+Backwards Compatibility
+
+- MakeMaker must be backwards compatible to 5.5.3 (5.005_03). Avoid any
+ obvious 5.6-isms (threads, warnings.pm, Unicode, our, v1.2.3, attributes
+ open my $fh, lvalue subroutines, any new core modules, etc...).
+
+- MakeMaker should avoid having module dependencies. Avoid using modules
+ which didn't come with 5.5.3 and avoid using features from newer
+ versions. Sometimes this is unavoidable.
+
+
+Cross-Platform Compatibility
+
+- MakeMaker must work on all architectures Perl works on (see perlport.pod)
+ and with many different versions of make. This means all Unixen
+ (including Cygwin and MacOS X), Windows (including DOS), MacOS Classic
+ and VMS.
+
+- Often when you patch ExtUtils::MM_Unix, similar patches must be done
+ to the other MM_* modules. If you can, please do this extra work
+ otherwise I have to. If you can't, that's ok. We can help.
+
+- If possible, please test your patch on two Very Different architectures.
+ Unix, Windows, MacOS Classic and VMS being Very Different. Note: Cygwin
+ and OS X are Unixen for our purposes.
+
+- If nothing else, at least try it on two different Unixen or Windows
+ machines (ie. Linux and IRIX or WinNT and Win95).
+
+- HP's TestDrive (www.testdrive.compaq.com) and SourceForge's
+ compile farm (www.sourceforge.net) are good sources of testing
+ machines of many different architectures and platforms. Accounts are
+ free.
+
+- If you find yourself writing "do_this if $^O eq 'That'" (ie. checks on
+ the OS type) perhaps your code belongs in one of the non-Unix MM_*
+ modules (ie. MM_Win32, MM_VMS, etc...). If one does not exist, consider
+ creating one. Its ok to have an MM_* module with only one method.
+
+- Some shells have very small buffers. This means command lines must
+ be as small as possible. If your command is just too long, consider
+ making it an ExtUtils::Command::MM function. If your command might
+ receive many arguments (such as pod2man or pm_to_blib) consider
+ using split_command() to split it into several, shorter calls.
+
+- Most shells quote differently. If you need to put a perl one-liner
+ in the Makefile, please use oneliner() to generate it.
+
+
+Tests
+
+- Tests would be nice, but I'm not going to pretend testing MakeMaker
+ is easy. If nothing else, let us know how you tested your patch by
+ hand.
+
+
+Documentation
+
+- Documentation would be nice.
+
+- If the new feature/method is private, please document it with POD
+ wrapped in "=begin/end private" tags. That way it will be documented,
+ but won't be displayed (future versions of perldoc may have options
+ to display).
+
+ =begin private
+
+ =item _foo_bar
+
+ $mm->_foo_bar
+
+ Blah blah blah
+
+ =end private
+
+ =cut
+
+ sub _foo_bar {
+ ...
+
+- If you're overriding a method, document that its an override and
+ *why* its being overridden. Don't repeat the original documentation.
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/README b/gnu/usr.bin/perl/lib/ExtUtils/README
new file mode 100644
index 00000000000..4d6eed77c5f
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/README
@@ -0,0 +1,57 @@
+This is a CPAN distribution of the venerable MakeMaker module. It has been
+backported to work with Perl 5.005_03 and up.
+
+If you do not have a make program, several can be found...
+
+Most Unixen: The make utility which comes with your operating system
+should work fine. If you don't have one, GNU make is recommended,
+most others (Sun, BSD, etc...) will work fine as well.
+
+Windows: nmake or dmake will work. GNU make will *not*.
+ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe
+http://search.cpan.org/author/GSAR/dmake-4.1pl1-win32/
+
+VMS: MMS or the free MadGoat MaKe utility (MMK) will work.
+http://www.madgoat.com/mmk.html
+
+If all else fails there is a pure Perl version of make available on
+CPAN which should work on most Unixen.
+http://search.cpan.org/author/NI-S/Make-1.00/
+
+
+PLEASE NOTE: This distribution does not include the xsubpp or typemap
+programs. They are extremely specific to your version or Perl, so
+MakeMaker will simply use the one which came with your copy of Perl.
+Do not delete your old ExtUtils/ directory. An upgraded version of xsubpp
+can be found in the ExtUtils::ParseXS module.
+
+Known Good Systems:
+
+Every stable MakeMaker release is tested at least on:
+
+MacOS X
+Linux/x86
+ActivePerl on Windows 98
+Cygwin on Windows 98
+OpenVMS
+
+Covering the major portability flavors MakeMaker has to cover.
+(I'm always on the lookout for DJGPP, Solaris, *BSD and OS/2 users)
+
+
+Known Problems:
+
+(See http://rt.cpan.org for a full list of open problems.)
+
+ActivePerl likely broken if installed in C:\Program Files or other
+prefix with a space in the name.
+
+Using the MMS utility on VMS causes lots of extra newlines. Unknown
+why this is so, might be a bug in MMS. Problem not seen with MMK.
+
+MacOS Classic is likely broken.
+
+
+See TODO for details.
+
+Please report any bugs via http://rt.cpan.org or to makemaker@perl.org.
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/TODO b/gnu/usr.bin/perl/lib/ExtUtils/TODO
new file mode 100644
index 00000000000..3ff020c79a1
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/TODO
@@ -0,0 +1,76 @@
+Rethink MM_Win32 tests.
+
+Investigate one method per make target.
+
+Test MM_Any and pull some redundant tests out of MM_*.t
+
+Create a way to init MM objects. (XXX What's wrong with MakeMaker->new?)
+
+Move instmodsh to utils/ in the core.
+
+Handle config files (ie. /etc) and their special PREFIX needs
+(ie. PREFIX=/usr, INSTALLCONFIGDIR=/etc).
+
+Make sure PDL builds
+
+Fix find_perl on Amiga trg@privat.utfors.se
+
+Fix appending of .. when DIRS contains directories not immediately
+below the cwd.
+
+Fill in the IMPORTS docs.
+
+Document "make install UNINST=1"
+
+Remove tar -I Sun-ism from instmodsh.
+
+Consider adding a timeout option to prompt() and env variable.
+
+Unify VMS->find_perl
+
+Consider if VMS->find_perl needs to have pieces put into maybe_command()
+
+Add a MM_Any->init_others() using ExtUtils::Command.
+
+Figure out and document the 4th arg to ExtUtils::Install::install()
+
+Consider if adding a nativize() routine to replace macify() and
+fixpath() is useful.
+
+Eliminate eliminate_macros() from inside FS::VMS->catfile and catdir.
+Make into MM_VMS wrappers.
+
+Test ExtUtils::Command::MM
+
+Finish ExtUtils::MakeMaker::Tutorial
+
+Add 'how to install additional files' to ExtUtils::MakeMaker::FAQ.
+
+Fix NORECUSE bug continuing to set DIR
+
+Give typemap location its own macro.
+
+Merge MM_VMS->tool_xsubpp
+
+Initialize PERL_SRC to '' instead of leaving undef when outside the source
+tree
+
+Reinstate HTMLification to use the new HTML Config info.
+
+split manifypods target into more generic docifypods target which depends on
+manifypods
+
+Add target to generate native Win32 help files (or whatever Win32 likes
+to use for help files these days)
+
+Add target to generate native VMS help files.
+
+On VMS, write PM_FILTERs to a temp file and run from there avoiding command
+line lengths. Worth the trouble given the Unixy nature of PM_FILTER?
+
+Move oneliner() and friends into a seperate module for general consumption.
+
+Make out of date check on 'make dist' more useful
+http://archive.develooper.com/makemaker@perl.org/msg01075.html
+
+Make maniadd() return a tied, case-insensitive hash on VMS.
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/00compile.t b/gnu/usr.bin/perl/lib/ExtUtils/t/00compile.t
new file mode 100644
index 00000000000..5eb015b13dd
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/00compile.t
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use File::Find;
+use File::Spec;
+use Test::More;
+
+my $Has_Test_Pod;
+BEGIN {
+ $Has_Test_Pod = eval 'use Test::Pod 0.95; 1';
+}
+
+chdir File::Spec->updir;
+my $manifest = File::Spec->catfile('MANIFEST');
+open(MANIFEST, $manifest) or die "Can't open $manifest: $!";
+my @modules = map { m{^lib/(\S+)}; $1 }
+ grep { m{^lib/ExtUtils/\S*\.pm} } <MANIFEST>;
+chomp @modules;
+close MANIFEST;
+
+chdir 'lib';
+plan tests => scalar @modules * 2;
+foreach my $file (@modules) {
+ # 5.8.0 has a bug about require alone in an eval. Thus the extra
+ # statement.
+ eval { require($file); 1 };
+ is( $@, '', "require $file" );
+
+ SKIP: {
+ skip "Test::Pod not installed", 1 unless $Has_Test_Pod;
+ pod_file_ok($file);
+ }
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/00setup_dummy.t b/gnu/usr.bin/perl/lib/ExtUtils/t/00setup_dummy.t
index 2d5b1ee5c1b..0b9e58d056a 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/00setup_dummy.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/00setup_dummy.t
@@ -16,24 +16,50 @@ use File::Basename;
use File::Path;
use File::Spec;
+if( $^O eq 'VMS' ) {
+ # On older systems we might exceed the 8-level directory depth limit
+ # imposed by RMS. We get around this with a rooted logical, but we
+ # can't create logical names with attributes in Perl, so we do it
+ # in a DCL subprocess and put it in the job table so the parent sees it.
+ open( BFDTMP, '>bfdtesttmp.com' ) || die "Error creating command file; $!";
+ print BFDTMP <<'COMMAND';
+$ BFD_TEST_ROOT = F$PARSE("SYS$DISK:[-]",,,,"NO_CONCEAL")-".][000000"-"]["-"].;"+".]"
+$ DEFINE/JOB/NOLOG/TRANSLATION=CONCEALED BFD_TEST_ROOT 'BFD_TEST_ROOT'
+COMMAND
+ close BFDTMP;
+
+ system '@bfdtesttmp.com';
+ 1 while unlink 'bfdtesttmp.com';
+}
+
+
my %Files = (
'Big-Dummy/lib/Big/Dummy.pm' => <<'END',
package Big::Dummy;
$VERSION = 0.01;
+=head1 NAME
+
+Big::Dummy - Try "our" hot dog's
+
+=cut
+
1;
END
'Big-Dummy/Makefile.PL' => <<'END',
use ExtUtils::MakeMaker;
-printf "Current package is: %s\n", __PACKAGE__;
+# This will interfere with the PREREQ_PRINT tests.
+printf "Current package is: %s\n", __PACKAGE__ unless "@ARGV" =~ /PREREQ/;
WriteMakefile(
NAME => 'Big::Dummy',
VERSION_FROM => 'lib/Big/Dummy.pm',
- PREREQ_PM => {},
+ PREREQ_PM => { strict => 0 },
+ ABSTRACT_FROM => 'lib/Big/Dummy.pm',
+ AUTHOR => 'Michael G Schwern <schwern@pobox.com>',
);
END
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Command.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Command.t
index ff9eec1da42..bf7d177889f 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/Command.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Command.t
@@ -12,98 +12,96 @@ BEGIN {
chdir 't';
BEGIN {
- 1 while unlink 'ecmdfile';
- # forcibly remove ecmddir/temp2, but don't import mkpath
- use File::Path ();
- File::Path::rmtree( 'ecmddir' );
+ $Testfile = 'testfile.foo';
}
BEGIN {
- use Test::More tests => 24;
- use File::Spec;
+ 1 while unlink $Testfile, 'newfile';
+ # forcibly remove ecmddir/temp2, but don't import mkpath
+ use File::Path ();
+ File::Path::rmtree( 'ecmddir' );
}
-{
- # bad neighbor, but test_f() uses exit()
- *CORE::GLOBAL::exit = ''; # quiet 'only once' warning.
- *CORE::GLOBAL::exit = sub { return @_ };
+BEGIN {
+ use Test::More tests => 26;
+ use File::Spec;
+}
- use_ok( 'ExtUtils::Command' );
+BEGIN {
+ # bad neighbor, but test_f() uses exit()
+ *CORE::GLOBAL::exit = ''; # quiet 'only once' warning.
+ *CORE::GLOBAL::exit = sub { return @_ };
+ use_ok( 'ExtUtils::Command' );
+}
- # get a file in the current directory, replace last char with wildcard
- my $file;
- {
- local *DIR;
- opendir(DIR, File::Spec->curdir());
- while ($file = readdir(DIR)) {
- $file =~ s/\.\z// if $^O eq 'VMS';
- last if $file =~ /^\w/;
- }
- }
+{
+ # concatenate this file with itself
+ # be extra careful the regex doesn't match itself
+ use TieOut;
+ my $out = tie *STDOUT, 'TieOut';
+ my $self = $0;
+ unless (-f $self) {
+ my ($vol, $dirs, $file) = File::Spec->splitpath($self);
+ my @dirs = File::Spec->splitdir($dirs);
+ unshift(@dirs, File::Spec->updir);
+ $dirs = File::Spec->catdir(@dirs);
+ $self = File::Spec->catpath($vol, $dirs, $file);
+ }
+ @ARGV = ($self, $self);
+ cat();
+ is( scalar( $$out =~ s/use_ok\( 'ExtUtils::Command'//g), 2,
+ 'concatenation worked' );
- # % means 'match one character' on VMS. Everything else is ?
- my $match_char = $^O eq 'VMS' ? '%' : '?';
- ($ARGV[0] = $file) =~ s/.\z/$match_char/;
+ # the truth value here is reversed -- Perl true is C false
+ @ARGV = ( $Testfile );
+ ok( test_f(), 'testing non-existent file' );
- # this should find the file
- ExtUtils::Command::expand_wildcards();
+ @ARGV = ( $Testfile );
+ cmp_ok( ! test_f(), '==', (-f $Testfile), 'testing non-existent file' );
- is( scalar @ARGV, 1, 'found one file' );
- like( $ARGV[0], qr/$file/, 'expanded wildcard ? successfully' );
+ # these are destructive, have to keep setting @ARGV
+ @ARGV = ( $Testfile );
+ touch();
- # try it with the asterisk now
- ($ARGV[0] = $file) =~ s/.{3}\z/\*/;
- ExtUtils::Command::expand_wildcards();
+ @ARGV = ( $Testfile );
+ ok( test_f(), 'now creating that file' );
- ok( (grep { qr/$file/ } @ARGV), 'expanded wildcard * successfully' );
+ @ARGV = ( $Testfile );
+ ok( -e $ARGV[0], 'created!' );
- # concatenate this file with itself
- # be extra careful the regex doesn't match itself
- use TieOut;
- my $out = tie *STDOUT, 'TieOut';
- my $self = $0;
- unless (-f $self) {
- my ($vol, $dirs, $file) = File::Spec->splitpath($self);
- my @dirs = File::Spec->splitdir($dirs);
- unshift(@dirs, File::Spec->updir);
- $dirs = File::Spec->catdir(@dirs);
- $self = File::Spec->catpath($vol, $dirs, $file);
- }
- @ARGV = ($self, $self);
-
- cat();
- is( scalar( $$out =~ s/use_ok\( 'ExtUtils::Command'//g), 2,
- 'concatenation worked' );
-
- # the truth value here is reversed -- Perl true is C false
- @ARGV = ( 'ecmdfile' );
- ok( test_f(), 'testing non-existent file' );
-
- @ARGV = ( 'ecmdfile' );
- cmp_ok( ! test_f(), '==', (-f 'ecmdfile'), 'testing non-existent file' );
-
- # these are destructive, have to keep setting @ARGV
- @ARGV = ( 'ecmdfile' );
- touch();
-
- @ARGV = ( 'ecmdfile' );
- ok( test_f(), 'now creating that file' );
-
- @ARGV = ( 'ecmdfile' );
- ok( -e $ARGV[0], 'created!' );
-
- my ($now) = time;
- utime ($now, $now, $ARGV[0]);
+ my ($now) = time;
+ utime ($now, $now, $ARGV[0]);
sleep 2;
- # Just checking modify time stamp, access time stamp is set
- # to the beginning of the day in Win95.
+ # Just checking modify time stamp, access time stamp is set
+ # to the beginning of the day in Win95.
# There's a small chance of a 1 second flutter here.
my $stamp = (stat($ARGV[0]))[9];
- cmp_ok( abs($now - $stamp), '<=', 1, 'checking modify time stamp' ) ||
+ cmp_ok( abs($now - $stamp), '<=', 1, 'checking modify time stamp' ) ||
diag "mtime == $stamp, should be $now";
+ @ARGV = qw(newfile);
+ touch();
+
+ my $new_stamp = (stat('newfile'))[9];
+ cmp_ok( abs($new_stamp - $stamp), '>=', 2, 'newer file created' );
+
+ @ARGV = ('newfile', $Testfile);
+ eqtime();
+
+ $stamp = (stat($Testfile))[9];
+ cmp_ok( abs($new_stamp - $stamp), '<=', 1, 'eqtime' );
+
+ # eqtime use to clear the contents of the file being equalized!
+ open(FILE, ">>$Testfile") || die $!;
+ print FILE "Foo";
+ close FILE;
+
+ @ARGV = ('newfile', $Testfile);
+ eqtime();
+ ok( -s $Testfile, "eqtime doesn't clear the file being equalized" );
+
SKIP: {
if ($^O eq 'amigaos' || $^O eq 'os2' || $^O eq 'MSWin32' ||
$^O eq 'NetWare' || $^O eq 'dos' || $^O eq 'cygwin' ||
@@ -113,80 +111,104 @@ BEGIN {
}
# change a file to execute-only
- @ARGV = ( 0100, 'ecmdfile' );
+ @ARGV = ( '0100', $Testfile );
ExtUtils::Command::chmod();
- is( ((stat('ecmdfile'))[2] & 07777) & 0700,
+ is( ((stat($Testfile))[2] & 07777) & 0700,
0100, 'change a file to execute-only' );
# change a file to read-only
- @ARGV = ( 0400, 'ecmdfile' );
+ @ARGV = ( '0400', $Testfile );
ExtUtils::Command::chmod();
- is( ((stat('ecmdfile'))[2] & 07777) & 0700,
+ is( ((stat($Testfile))[2] & 07777) & 0700,
($^O eq 'vos' ? 0500 : 0400), 'change a file to read-only' );
# change a file to write-only
- @ARGV = ( 0200, 'ecmdfile' );
+ @ARGV = ( '0200', $Testfile );
ExtUtils::Command::chmod();
- is( ((stat('ecmdfile'))[2] & 07777) & 0700,
+ is( ((stat($Testfile))[2] & 07777) & 0700,
($^O eq 'vos' ? 0700 : 0200), 'change a file to write-only' );
}
# change a file to read-write
- @ARGV = ( 0600, 'ecmdfile' );
- ExtUtils::Command::chmod();
+ @ARGV = ( '0600', $Testfile );
+ ExtUtils::Command::chmod();
- is( ((stat('ecmdfile'))[2] & 07777) & 0700,
+ is( ((stat($Testfile))[2] & 07777) & 0700,
($^O eq 'vos' ? 0700 : 0600), 'change a file to read-write' );
- # mkpath
- @ARGV = ( File::Spec->join( 'ecmddir', 'temp2' ) );
- ok( ! -e $ARGV[0], 'temp directory not there yet' );
+ # mkpath
+ @ARGV = ( File::Spec->join( 'ecmddir', 'temp2' ) );
+ ok( ! -e $ARGV[0], 'temp directory not there yet' );
+
+ mkpath();
+ ok( -e $ARGV[0], 'temp directory created' );
+
+ # copy a file to a nested subdirectory
+ unshift @ARGV, $Testfile;
+ cp();
+
+ ok( -e File::Spec->join( 'ecmddir', 'temp2', $Testfile ), 'copied okay' );
- mkpath();
- ok( -e $ARGV[0], 'temp directory created' );
+ # cp should croak if destination isn't directory (not a great warning)
+ @ARGV = ( $Testfile ) x 3;
+ eval { cp() };
- # copy a file to a nested subdirectory
- unshift @ARGV, 'ecmdfile';
- cp();
+ like( $@, qr/Too many arguments/, 'cp croaks on error' );
- ok( -e File::Spec->join( 'ecmddir', 'temp2', 'ecmdfile' ), 'copied okay' );
+ # move a file to a subdirectory
+ @ARGV = ( $Testfile, 'ecmddir' );
+ mv();
- # cp should croak if destination isn't directory (not a great warning)
- @ARGV = ( 'ecmdfile' ) x 3;
- eval { cp() };
+ ok( ! -e $Testfile, 'moved file away' );
+ ok( -e File::Spec->join( 'ecmddir', $Testfile ), 'file in new location' );
- like( $@, qr/Too many arguments/, 'cp croaks on error' );
+ # mv should also croak with the same wacky warning
+ @ARGV = ( $Testfile ) x 3;
- # move a file to a subdirectory
- @ARGV = ( 'ecmdfile', 'ecmddir' );
- mv();
+ eval { mv() };
+ like( $@, qr/Too many arguments/, 'mv croaks on error' );
- ok( ! -e 'ecmdfile', 'moved file away' );
- ok( -e File::Spec->join( 'ecmddir', 'ecmdfile' ), 'file in new location' );
+ # Test expand_wildcards()
+ {
+ my $file = $Testfile;
+ @ARGV = ();
+ chdir 'ecmddir';
- # mv should also croak with the same wacky warning
- @ARGV = ( 'ecmdfile' ) x 3;
+ # % means 'match one character' on VMS. Everything else is ?
+ my $match_char = $^O eq 'VMS' ? '%' : '?';
+ ($ARGV[0] = $file) =~ s/.\z/$match_char/;
- eval { mv() };
- like( $@, qr/Too many arguments/, 'mv croaks on error' );
+ # this should find the file
+ ExtUtils::Command::expand_wildcards();
+
+ is_deeply( \@ARGV, [$file], 'expanded wildcard ? successfully' );
+
+ # try it with the asterisk now
+ ($ARGV[0] = $file) =~ s/.{3}\z/\*/;
+ ExtUtils::Command::expand_wildcards();
+
+ is_deeply( \@ARGV, [$file], 'expanded wildcard * successfully' );
+
+ chdir File::Spec->updir;
+ }
- # remove some files
- my @files = @ARGV = ( File::Spec->catfile( 'ecmddir', 'ecmdfile' ),
- File::Spec->catfile( 'ecmddir', 'temp2', 'ecmdfile' ) );
- rm_f();
+ # remove some files
+ my @files = @ARGV = ( File::Spec->catfile( 'ecmddir', $Testfile ),
+ File::Spec->catfile( 'ecmddir', 'temp2', $Testfile ) );
+ rm_f();
- ok( ! -e $_, "removed $_ successfully" ) for (@ARGV);
+ ok( ! -e $_, "removed $_ successfully" ) for (@ARGV);
- # rm_f dir
- @ARGV = my $dir = File::Spec->catfile( 'ecmddir' );
- rm_rf();
- ok( ! -e $dir, "removed $dir successfully" );
+ # rm_f dir
+ @ARGV = my $dir = File::Spec->catfile( 'ecmddir' );
+ rm_rf();
+ ok( ! -e $dir, "removed $dir successfully" );
}
END {
- 1 while unlink 'ecmdfile';
- File::Path::rmtree( 'ecmddir' );
+ 1 while unlink $Testfile, 'newfile';
+ File::Path::rmtree( 'ecmddir' );
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Constant.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Constant.t
index 25d705585e2..af637673fb7 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/Constant.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Constant.t
@@ -1,191 +1,349 @@
#!/usr/bin/perl -w
-print "1..51\n";
-
BEGIN {
if( $ENV{PERL_CORE} ) {
chdir 't' if -d 't';
@INC = '../lib';
}
+ use Config;
+ unless ($Config{usedl}) {
+ print "1..0 # no usedl, skipping\n";
+ exit 0;
+ }
}
# use warnings;
use strict;
use ExtUtils::MakeMaker;
use ExtUtils::Constant qw (constant_types C_constant XS_constant autoload);
-use Config;
-use File::Spec::Functions qw(catfile rel2abs);
+use File::Spec;
+use Cwd;
+
+my $do_utf_tests = $] > 5.006;
+my $better_than_56 = $] > 5.007;
+# For debugging set this to 1.
+my $keep_files = 0;
+$| = 1;
+
# Because were are going to be changing directory before running Makefile.PL
-my $perl;
-$perl = rel2abs( $^X ) unless $] < 5.006; # Hack. Until 5.00503 has rel2abs
+my $perl = $^X;
+# 5.005 doesn't have new enough File::Spec to have rel2abs. But actually we
+# only need it when $^X isn't absolute, which is going to be 5.8.0 or later
+# (where ExtUtils::Constant is in the core, and tests against the uninstalled
+# perl)
+$perl = File::Spec->rel2abs ($perl) unless $] < 5.006;
# ExtUtils::Constant::C_constant uses $^X inside a comment, and we want to
# compare output to ensure that it is the same. We were probably run as ./perl
# whereas we will run the child with the full path in $perl. So make $^X for
# us the same as our child will see.
$^X = $perl;
-
+my $lib = $ENV{PERL_CORE} ? '../../../lib' : '../../blib/lib';
+my $runperl = "$perl \"-I$lib\"";
print "# perl=$perl\n";
-my $runperl = "$perl \"-I../../lib\"";
-$| = 1;
+my $make = $Config{make};
+$make = $ENV{MAKE} if exists $ENV{MAKE};
+if ($^O eq 'MSWin32' && $make eq 'nmake') { $make .= " -nologo"; }
+
+# Renamed by make clean
+my $makefile = ($^O eq 'VMS' ? 'descrip' : 'Makefile');
+my $makefile_ext = ($^O eq 'VMS' ? '.mms' : '');
+my $makefile_rename = $makefile . ($^O eq 'VMS' ? '.mms' : '.old');
+my $output = "output";
+my $package = "ExtTest";
my $dir = "ext-$$";
-my @files;
+my $subdir = 0;
+# The real test counter.
+my $realtest = 1;
+
+my $orig_cwd = cwd;
+my $updir = File::Spec->updir;
+die "Can't get current directory: $!" unless defined $orig_cwd;
print "# $dir being created...\n";
mkdir $dir, 0777 or die "mkdir: $!\n";
-my $output = "output";
-
-# For debugging set this to 1.
-my $keep_files = 0;
-
END {
+ if (defined $orig_cwd and length $orig_cwd) {
+ chdir $orig_cwd or die "Can't chdir back to '$orig_cwd': $!";
use File::Path;
print "# $dir being removed...\n";
rmtree($dir) unless $keep_files;
+ } else {
+ # Can't get here.
+ die "cwd at start was empty, but directory '$dir' was created" if $dir;
+ }
}
-my $package = "ExtTest";
+chdir $dir or die $!;
+push @INC, '../../lib', '../../../lib';
-# Test the code that generates 1 and 2 letter name comparisons.
-my %compass = (
-N => 0, 'NE' => 45, E => 90, SE => 135, S => 180, SW => 225, W => 270, NW => 315
-);
+sub check_for_bonus_files {
+ my $dir = shift;
+ my %expect = map {($^O eq 'VMS' ? lc($_) : $_), 1} @_;
-my $parent_rfc1149 =
- 'A Standard for the Transmission of IP Datagrams on Avian Carriers';
-# Check that 8 bit and unicode names don't cause problems.
-my $pound;
-if (ord('A') == 193) { # EBCDIC platform
- $pound = chr 177; # A pound sign. (Currency)
-} else { # ASCII platform
- $pound = chr 163; # A pound sign. (Currency)
-}
-my $inf = chr 0x221E;
-# Check that we can distiguish the pathological case of a string, and the
-# utf8 representation of that string.
-my $pound_bytes = my $pound_utf8 = $pound . '1';
-utf8::encode ($pound_bytes);
-
-my @names = ("FIVE", {name=>"OK6", type=>"PV",},
- {name=>"OK7", type=>"PVN",
- value=>['"not ok 7\\n\\0ok 7\\n"', 15]},
- {name => "FARTHING", type=>"NV"},
- {name => "NOT_ZERO", type=>"UV", value=>"~(UV)0"},
- {name => "OPEN", type=>"PV", value=>'"/*"', macro=>1},
- {name => "CLOSE", type=>"PV", value=>'"*/"',
- macro=>["#if 1\n", "#endif\n"]},
- {name => "ANSWER", default=>["UV", 42]}, "NOTDEF",
- {name => "Yes", type=>"YES"},
- {name => "No", type=>"NO"},
- {name => "Undef", type=>"UNDEF"},
-# OK. It wasn't really designed to allow the creation of dual valued constants.
-# It was more for INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
- {name=>"RFC1149", type=>"SV", value=>"sv_2mortal(temp_sv)",
- pre=>"SV *temp_sv = newSVpv(RFC1149, 0); "
- . "(void) SvUPGRADE(temp_sv,SVt_PVIV); SvIOK_on(temp_sv); "
- . "SvIVX(temp_sv) = 1149;"},
- {name=>"perl", type=>"PV",},
-);
+ my $fail;
+ opendir DIR, $dir or die "opendir '$dir': $!";
+ while (defined (my $entry = readdir DIR)) {
+ $entry =~ s/\.$// if $^O eq 'VMS'; # delete trailing dot that indicates no extension
+ next if $expect{$entry};
+ print "# Extra file '$entry'\n";
+ $fail = 1;
+ }
-push @names, $_ foreach keys %compass;
+ closedir DIR or warn "closedir '.': $!";
+ if ($fail) {
+ print "not ok $realtest\n";
+ } else {
+ print "ok $realtest\n";
+ }
+ $realtest++;
+}
-# Automatically compile the list of all the macro names, and make them
-# exported constants.
-my @names_only = map {(ref $_) ? $_->{name} : $_} @names;
+sub build_and_run {
+ my ($tests, $expect, $files) = @_;
+ my $core = $ENV{PERL_CORE} ? ' PERL_CORE=1' : '';
+ my @perlout = `$runperl Makefile.PL $core`;
+ if ($?) {
+ print "not ok $realtest # $runperl Makefile.PL failed: $?\n";
+ print "# $_" foreach @perlout;
+ exit($?);
+ } else {
+ print "ok $realtest\n";
+ }
+ $realtest++;
-# Exporter::Heavy (currently) isn't able to export these names:
-push @names, ({name=>"*/", type=>"PV", value=>'"CLOSE"', macro=>1},
- {name=>"/*", type=>"PV", value=>'"OPEN"', macro=>1},
- {name=>$pound, type=>"PV", value=>'"Sterling"', macro=>1},
- {name=>$inf, type=>"PV", value=>'"Infinity"', macro=>1},
- {name=>$pound_utf8, type=>"PV", value=>'"1 Pound"', macro=>1},
- {name=>$pound_bytes, type=>"PV", value=>'"1 Pound (as bytes)"',
- macro=>1},
- );
+ if (-f "$makefile$makefile_ext") {
+ print "ok $realtest\n";
+ } else {
+ print "not ok $realtest\n";
+ }
+ $realtest++;
-=pod
+ my @makeout;
-The above set of names seems to produce a suitably bad set of compile
-problems on a Unicode naive version of ExtUtils::Constant (ie 0.11):
+ if ($^O eq 'VMS') { $make .= ' all'; }
-nick@thinking-cap 15439-32-utf$ PERL_CORE=1 ./perl lib/ExtUtils/t/Constant.t
-1..33
-# perl=/stuff/perl5/15439-32-utf/perl
-# ext-30370 being created...
-Wide character in print at lib/ExtUtils/t/Constant.t line 140.
-ok 1
-ok 2
-# make = 'make'
-ExtTest.xs: In function `constant_1':
-ExtTest.xs:80: warning: multi-character character constant
-ExtTest.xs:80: warning: case value out of range
-ok 3
+ print "# make = '$make'\n";
+ @makeout = `$make`;
+ if ($?) {
+ print "not ok $realtest # $make failed: $?\n";
+ print "# $_" foreach @makeout;
+ exit($?);
+ } else {
+ print "ok $realtest\n";
+ }
+ $realtest++;
-=cut
+ if ($^O eq 'VMS') { $make =~ s{ all}{}; }
-my $types = {};
-my $constant_types = constant_types(); # macro defs
-my $C_constant = join "\n",
- C_constant ($package, undef, "IV", $types, undef, undef, @names);
-my $XS_constant = XS_constant ($package, $types); # XS for ExtTest::constant
-
-################ Header
-my $header = catfile($dir, "test.h");
-push @files, "test.h";
-open FH, ">$header" or die "open >$header: $!\n";
-print FH <<"EOT";
-#define FIVE 5
-#define OK6 "ok 6\\n"
-#define OK7 1
-#define FARTHING 0.25
-#define NOT_ZERO 1
-#define Yes 0
-#define No 1
-#define Undef 1
-#define RFC1149 "$parent_rfc1149"
-#undef NOTDEF
-#define perl "rules"
-EOT
+ if ($Config{usedl}) {
+ print "ok $realtest # This is dynamic linking, so no need to make perl\n";
+ } else {
+ my $makeperl = "$make perl";
+ print "# make = '$makeperl'\n";
+ @makeout = `$makeperl`;
+ if ($?) {
+ print "not ok $realtest # $makeperl failed: $?\n";
+ print "# $_" foreach @makeout;
+ exit($?);
+ } else {
+ print "ok $realtest\n";
+ }
+ }
+ $realtest++;
-while (my ($point, $bearing) = each %compass) {
- print FH "#define $point $bearing\n"
+ my $maketest = "$make test";
+ print "# make = '$maketest'\n";
+
+ @makeout = `$maketest`;
+
+ if (open OUTPUT, "<$output") {
+ local $/; # Slurp it - faster.
+ print <OUTPUT>;
+ close OUTPUT or print "# Close $output failed: $!\n";
+ } else {
+ # Harness will report missing test results at this point.
+ print "# Open <$output failed: $!\n";
+ }
+
+ $realtest += $tests;
+ if ($?) {
+ print "not ok $realtest # $maketest failed: $?\n";
+ print "# $_" foreach @makeout;
+ } else {
+ print "ok $realtest - maketest\n";
+ }
+ $realtest++;
+
+ # -x is busted on Win32 < 5.6.1, so we emulate it.
+ my $regen;
+ if( $^O eq 'MSWin32' && $] <= 5.006001 ) {
+ open(REGENTMP, ">regentmp") or die $!;
+ open(XS, "$package.xs") or die $!;
+ my $saw_shebang;
+ while(<XS>) {
+ $saw_shebang++ if /^#!.*/i ;
+ print REGENTMP $_ if $saw_shebang;
+ }
+ close XS; close REGENTMP;
+ $regen = `$runperl regentmp`;
+ unlink 'regentmp';
+ }
+ else {
+ $regen = `$runperl -x $package.xs`;
+ }
+ if ($?) {
+ print "not ok $realtest # $runperl -x $package.xs failed: $?\n";
+ } else {
+ print "ok $realtest - regen\n";
+ }
+ $realtest++;
+
+ if ($expect eq $regen) {
+ print "ok $realtest - regen worked\n";
+ } else {
+ print "not ok $realtest - regen worked\n";
+ # open FOO, ">expect"; print FOO $expect;
+ # open FOO, ">regen"; print FOO $regen; close FOO;
+ }
+ $realtest++;
+
+ my $makeclean = "$make clean";
+ print "# make = '$makeclean'\n";
+ @makeout = `$makeclean`;
+ if ($?) {
+ print "not ok $realtest # $make failed: $?\n";
+ print "# $_" foreach @makeout;
+ } else {
+ print "ok $realtest\n";
+ }
+ $realtest++;
+
+ check_for_bonus_files ('.', @$files, $output, $makefile_rename, '.', '..');
+
+ rename $makefile_rename, $makefile
+ or die "Can't rename '$makefile_rename' to '$makefile': $!";
+
+ unlink $output or warn "Can't unlink '$output': $!";
+
+ # Need to make distclean to remove ../../lib/ExtTest.pm
+ my $makedistclean = "$make distclean";
+ print "# make = '$makedistclean'\n";
+ @makeout = `$makedistclean`;
+ if ($?) {
+ print "not ok $realtest # $make failed: $?\n";
+ print "# $_" foreach @makeout;
+ } else {
+ print "ok $realtest\n";
+ }
+ $realtest++;
+
+ check_for_bonus_files ('.', @$files, '.', '..');
+
+ unless ($keep_files) {
+ foreach (@$files) {
+ unlink $_ or warn "unlink $_: $!";
+ }
+ }
+
+ check_for_bonus_files ('.', '.', '..');
}
-close FH or die "close $header: $!\n";
-################ XS
-my $xs = catfile($dir, "$package.xs");
-push @files, "$package.xs";
-open FH, ">$xs" or die "open >$xs: $!\n";
+sub Makefile_PL {
+ my $package = shift;
+ ################ Makefile.PL
+ # We really need a Makefile.PL because make test for a no dynamic linking perl
+ # will run Makefile.PL again as part of the "make perl" target.
+ my $makefilePL = "Makefile.PL";
+ open FH, ">$makefilePL" or die "open >$makefilePL: $!\n";
+ print FH <<"EOT";
+#!$perl -w
+use ExtUtils::MakeMaker;
+WriteMakefile(
+ 'NAME' => "$package",
+ 'VERSION_FROM' => "$package.pm", # finds \$VERSION
+ (\$] >= 5.005 ?
+ (#ABSTRACT_FROM => "$package.pm", # XXX add this
+ AUTHOR => "$0") : ())
+ );
+EOT
-print FH <<'EOT';
+ close FH or die "close $makefilePL: $!\n";
+ return $makefilePL;
+}
+
+sub MANIFEST {
+ my (@files) = @_;
+ ################ MANIFEST
+ # We really need a MANIFEST because make distclean checks it.
+ my $manifest = "MANIFEST";
+ push @files, $manifest;
+ open FH, ">$manifest" or die "open >$manifest: $!\n";
+ print FH "$_\n" foreach @files;
+ close FH or die "close $manifest: $!\n";
+ return @files;
+}
+
+sub write_and_run_extension {
+ my ($name, $items, $export_names, $package, $header, $testfile, $num_tests)
+ = @_;
+ my $types = {};
+ my $constant_types = constant_types(); # macro defs
+ my $C_constant = join "\n",
+ C_constant ($package, undef, "IV", $types, undef, undef, @$items);
+ my $XS_constant = XS_constant ($package, $types); # XS for ExtTest::constant
+
+ my $expect = $constant_types . $C_constant .
+ "\n#### XS Section:\n" . $XS_constant;
+
+ print "# $name\n# $dir/$subdir being created...\n";
+ mkdir $subdir, 0777 or die "mkdir: $!\n";
+ chdir $subdir or die $!;
+
+ my @files;
+
+ ################ Header
+ my $header_name = "test.h";
+ push @files, $header_name;
+ open FH, ">$header_name" or die "open >$header_name: $!\n";
+ print FH $header or die $!;
+ close FH or die "close $header_name: $!\n";
+
+ ################ XS
+ my $xs = "$package.xs";
+ push @files, $xs;
+ open FH, ">$xs" or die "open >$xs: $!\n";
+
+ print FH <<'EOT';
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
EOT
-print FH "#include \"test.h\"\n\n";
-print FH $constant_types;
-print FH $C_constant, "\n";
-print FH "MODULE = $package PACKAGE = $package\n";
-print FH "PROTOTYPES: ENABLE\n";
-print FH $XS_constant;
-close FH or die "close $xs: $!\n";
+ # XXX Here doc these:
+ print FH "#include \"$header_name\"\n\n";
+ print FH $constant_types;
+ print FH $C_constant, "\n";
+ print FH "MODULE = $package PACKAGE = $package\n";
+ print FH "PROTOTYPES: ENABLE\n";
+ print FH $XS_constant;
+ close FH or die "close $xs: $!\n";
-################ PM
-my $pm = catfile($dir, "$package.pm");
-push @files, "$package.pm";
-open FH, ">$pm" or die "open >$pm: $!\n";
-print FH "package $package;\n";
-print FH "use $];\n";
+ ################ PM
+ my $pm = "$package.pm";
+ push @files, $pm;
+ open FH, ">$pm" or die "open >$pm: $!\n";
+ print FH "package $package;\n";
+ print FH "use $];\n";
-print FH <<'EOT';
+ print FH <<'EOT';
use strict;
EOT
-printf FH "use warnings;\n" unless $] < 5.006;
-print FH <<'EOT';
+ printf FH "use warnings;\n" unless $] < 5.006;
+ print FH <<'EOT';
use Carp;
require Exporter;
@@ -194,47 +352,156 @@ use vars qw ($VERSION @ISA @EXPORT_OK $AUTOLOAD);
$VERSION = '0.01';
@ISA = qw(Exporter DynaLoader);
-@EXPORT_OK = qw(
EOT
+ # Having this qw( in the here doc confuses cperl mode far too much to be
+ # helpful. And I'm using cperl mode to edit this, even if you're not :-)
+ print FH "\@EXPORT_OK = qw(\n";
+
+ # Print the names of all our autoloaded constants
+ print FH "\t$_\n" foreach (@$export_names);
+ print FH ");\n";
+ # Print the AUTOLOAD subroutine ExtUtils::Constant generated for us
+ print FH autoload ($package, $]);
+ print FH "bootstrap $package \$VERSION;\n1;\n__END__\n";
+ close FH or die "close $pm: $!\n";
+
+ ################ test.pl
+ my $testpl = "test.pl";
+ push @files, $testpl;
+ open FH, ">$testpl" or die "open >$testpl: $!\n";
+ # Standard test header (need an option to suppress this?)
+ print FH <<"EOT" or die $!;
+use strict;
+use $package qw(@$export_names);
-# Print the names of all our autoloaded constants
-print FH "\t$_\n" foreach (@names_only);
-print FH ");\n";
-# Print the AUTOLOAD subroutine ExtUtils::Constant generated for us
-print FH autoload ($package, $]);
-print FH "bootstrap $package \$VERSION;\n1;\n__END__\n";
-close FH or die "close $pm: $!\n";
-
-################ test.pl
-my $testpl = catfile($dir, "test.pl");
-push @files, "test.pl";
-open FH, ">$testpl" or die "open >$testpl: $!\n";
-
-print FH "use strict;\n";
-print FH "use $package qw(@names_only);\n";
-print FH <<"EOT";
-
-use utf8;
-
-print "1..1\n";
+print "1..2\n";
if (open OUTPUT, ">$output") {
print "ok 1\n";
select OUTPUT;
} else {
- print "not ok 1 # Failed to open '$output': $!\n";
+ print "not ok 1 # Failed to open '$output': \$!\n";
exit 1;
}
EOT
+ print FH $testfile or die $!;
+ print FH <<"EOT" or die $!;
+select STDOUT;
+if (close OUTPUT) {
+ print "ok 2\n";
+} else {
+ print "not ok 2 # Failed to close '$output': \$!\n";
+}
+EOT
+ close FH or die "close $testpl: $!\n";
+
+ push @files, Makefile_PL($package);
+ @files = MANIFEST (@files);
+
+ build_and_run ($num_tests, $expect, \@files);
+
+ chdir $updir or die "chdir '$updir': $!";
+ ++$subdir;
+}
+# Tests are arrayrefs of the form
+# $name, [items], [export_names], $package, $header, $testfile, $num_tests
+my @tests;
+my $before_tests = 4; # Number of "ok"s emitted to build extension
+my $after_tests = 8; # Number of "ok"s emitted after make test run
+my $dummytest = 1;
+
+my $here;
+sub start_tests {
+ $dummytest += $before_tests;
+ $here = $dummytest;
+}
+sub end_tests {
+ my ($name, $items, $export_names, $header, $testfile) = @_;
+ push @tests, [$name, $items, $export_names, $package, $header, $testfile,
+ $dummytest - $here];
+ $dummytest += $after_tests;
+}
+
+my $pound;
+if (ord('A') == 193) { # EBCDIC platform
+ $pound = chr 177; # A pound sign. (Currency)
+} else { # ASCII platform
+ $pound = chr 163; # A pound sign. (Currency)
+}
+my @common_items = (
+ {name=>"perl", type=>"PV",},
+ {name=>"*/", type=>"PV", value=>'"CLOSE"', macro=>1},
+ {name=>"/*", type=>"PV", value=>'"OPEN"', macro=>1},
+ {name=>$pound, type=>"PV", value=>'"Sterling"', macro=>1},
+ );
+
+{
+ # Simple tests
+ start_tests();
+ my $parent_rfc1149 =
+ 'A Standard for the Transmission of IP Datagrams on Avian Carriers';
+ # Test the code that generates 1 and 2 letter name comparisons.
+ my %compass = (
+ N => 0, 'NE' => 45, E => 90, SE => 135,
+ S => 180, SW => 225, W => 270, NW => 315
+ );
+
+ my $header = << "EOT";
+#define FIVE 5
+#define OK6 "ok 6\\n"
+#define OK7 1
+#define FARTHING 0.25
+#define NOT_ZERO 1
+#define Yes 0
+#define No 1
+#define Undef 1
+#define RFC1149 "$parent_rfc1149"
+#undef NOTDEF
+#define perl "rules"
+EOT
-print FH << 'EOT';
+ while (my ($point, $bearing) = each %compass) {
+ $header .= "#define $point $bearing\n"
+ }
+ my @items = ("FIVE", {name=>"OK6", type=>"PV",},
+ {name=>"OK7", type=>"PVN",
+ value=>['"not ok 7\\n\\0ok 7\\n"', 15]},
+ {name => "FARTHING", type=>"NV"},
+ {name => "NOT_ZERO", type=>"UV", value=>"~(UV)0"},
+ {name => "OPEN", type=>"PV", value=>'"/*"', macro=>1},
+ {name => "CLOSE", type=>"PV", value=>'"*/"',
+ macro=>["#if 1\n", "#endif\n"]},
+ {name => "ANSWER", default=>["UV", 42]}, "NOTDEF",
+ {name => "Yes", type=>"YES"},
+ {name => "No", type=>"NO"},
+ {name => "Undef", type=>"UNDEF"},
+ # OK. It wasn't really designed to allow the creation of dual valued
+ # constants.
+ # It was more for INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
+ {name=>"RFC1149", type=>"SV", value=>"sv_2mortal(temp_sv)",
+ pre=>"SV *temp_sv = newSVpv(RFC1149, 0); "
+ . "(void) SvUPGRADE(temp_sv,SVt_PVIV); SvIOK_on(temp_sv); "
+ . "SvIVX(temp_sv) = 1149;"},
+ );
+
+ push @items, $_ foreach keys %compass;
+
+ # Automatically compile the list of all the macro names, and make them
+ # exported constants.
+ my @export_names = map {(ref $_) ? $_->{name} : $_} @items;
+
+ # Exporter::Heavy (currently) isn't able to export the last 3 of these:
+ push @items, @common_items;
+
+ # XXX there are hardwired still.
+ my $test_body = <<'EOT';
# What follows goes to the temporary file.
# IV
my $five = FIVE;
if ($five == 5) {
print "ok 5\n";
} else {
- print "not ok 5 # $five\n";
+ print "not ok 5 # \$five\n";
}
# PV
@@ -323,7 +590,6 @@ unless (defined $undef) {
print "not ok 16 # \$undef='$undef'\n";
}
-
# invalid macro (chosen to look like a mix up between No and SW)
$notdef = eval { &ExtTest::So };
if (defined $notdef) {
@@ -348,10 +614,10 @@ my %compass = (
EOT
while (my ($point, $bearing) = each %compass) {
- print FH "'$point' => $bearing, "
+ $test_body .= "'$point' => $bearing, "
}
-print FH <<'EOT';
+$test_body .= <<'EOT';
);
@@ -377,7 +643,7 @@ if ($fail) {
EOT
-print FH <<"EOT";
+$test_body .= <<"EOT";
my \$rfc1149 = RFC1149;
if (\$rfc1149 ne "$parent_rfc1149") {
print "not ok 20 # '\$rfc1149' ne '$parent_rfc1149'\n";
@@ -393,7 +659,7 @@ if (\$rfc1149 != 1149) {
EOT
-print FH <<'EOT';
+$test_body .= <<'EOT';
# test macro=>1
my $open = OPEN;
if ($open eq '/*') {
@@ -402,26 +668,80 @@ if ($open eq '/*') {
print "not ok 22 # \$open='$open'\n";
}
EOT
+$dummytest+=18;
+
+ end_tests("Simple tests", \@items, \@export_names, $header, $test_body);
+}
+
+if ($do_utf_tests) {
+ # utf8 tests
+ start_tests();
+ my ($inf, $pound_bytes, $pound_utf8);
-# Do this in 7 bit in case someone is testing with some settings that cause
-# 8 bit files incapable of storing this character.
-my @values
- = map {"'" . join (",", unpack "U*", $_) . "'"}
- ($pound, $inf, $pound_bytes, $pound_utf8);
-# Values is a list of strings, such as ('194,163,49', '163,49')
+ $inf = chr 0x221E;
+ # Check that we can distiguish the pathological case of a string, and the
+ # utf8 representation of that string.
+ $pound_utf8 = $pound . '1';
+ if ($better_than_56) {
+ $pound_bytes = $pound_utf8;
+ utf8::encode ($pound_bytes);
+ } else {
+ # Must have that "U*" to generate a zero length UTF string that forces
+ # top bit set chars (such as the pound sign) into UTF8, so that the
+ # unpack 'C*' then gets the byte form of the UTF8.
+ $pound_bytes = pack 'C*', unpack 'C*', $pound_utf8 . pack "U*";
+ }
-print FH <<'EOT';
+ my @items = (@common_items,
+ {name=>$inf, type=>"PV", value=>'"Infinity"', macro=>1},
+ {name=>$pound_utf8, type=>"PV", value=>'"1 Pound"', macro=>1},
+ {name=>$pound_bytes, type=>"PV", value=>'"1 Pound (as bytes)"',
+ macro=>1},
+ );
-# I can see that this child test program might be about to use parts of
-# Test::Builder
+=pod
+
+The above set of names seems to produce a suitably bad set of compile
+problems on a Unicode naive version of ExtUtils::Constant (ie 0.11):
+
+nick@thinking-cap 15439-32-utf$ PERL_CORE=1 ./perl lib/ExtUtils/t/Constant.t
+1..33
+# perl=/stuff/perl5/15439-32-utf/perl
+# ext-30370 being created...
+Wide character in print at lib/ExtUtils/t/Constant.t line 140.
+ok 1
+ok 2
+# make = 'make'
+ExtTest.xs: In function `constant_1':
+ExtTest.xs:80: warning: multi-character character constant
+ExtTest.xs:80: warning: case value out of range
+ok 3
+
+=cut
+
+# Grr `
+
+ # Do this in 7 bit in case someone is testing with some settings that cause
+ # 8 bit files incapable of storing this character.
+ my @values
+ = map {"'" . join (",", unpack "U*", $_ . pack "U*") . "'"}
+ ($pound, $inf, $pound_bytes, $pound_utf8);
+ # Values is a list of strings, such as ('194,163,49', '163,49')
+
+ my $test_body .= "my \$test = $dummytest;\n";
+ $dummytest += 7 * 3; # 3 tests for each of the 7 things:
+
+ $test_body .= << 'EOT';
+
+use utf8;
+my $better_than_56 = $] > 5.007;
-my $test = 23;
my ($pound, $inf, $pound_bytes, $pound_utf8) = map {eval "pack 'U*', $_"}
EOT
-print FH join ",", @values;
+ $test_body .= join ",", @values;
-print FH << 'EOT';
+ $test_body .= << 'EOT';
;
foreach (["perl", "rules", "rules"],
@@ -437,12 +757,19 @@ foreach (["perl", "rules", "rules"],
(my $name = $string) =~ s/([^ -~])/sprintf '\x{%X}', ord $1/ges;
print "# \"$name\" => \'$expect\'\n";
# Try to force this to be bytes if possible.
- utf8::downgrade ($string, 1);
+ if ($better_than_56) {
+ utf8::downgrade ($string, 1);
+ } else {
+ if ($string =~ tr/0-\377// == length $string) {
+ # No chars outside range 0-255
+ $string = pack 'C*', unpack 'U*', ($string . pack 'U*');
+ }
+ }
EOT
-print FH "my (\$error, \$got) = ${package}::constant (\$string);\n";
+ $test_body .= "my (\$error, \$got) = ${package}::constant (\$string);\n";
-print FH <<'EOT';
+ $test_body .= <<'EOT';
if ($error or $got ne $expect) {
print "not ok $test # error '$error', got '$got'\n";
} else {
@@ -450,12 +777,16 @@ print FH <<'EOT';
}
$test++;
print "# Now upgrade '$name' to utf8\n";
- utf8::upgrade ($string);
+ if ($better_than_56) {
+ utf8::upgrade ($string);
+ } else {
+ $string = pack ('U*') . $string;
+ }
EOT
-print FH "my (\$error, \$got) = ${package}::constant (\$string);\n";
+ $test_body .= "my (\$error, \$got) = ${package}::constant (\$string);\n";
-print FH <<'EOT';
+ $test_body .= <<'EOT';
if ($error or $got ne $expect) {
print "not ok $test # error '$error', got '$got'\n";
} else {
@@ -465,12 +796,16 @@ print FH <<'EOT';
if (defined $expect_bytes) {
print "# And now with the utf8 byte sequence for name\n";
# Try the encoded bytes.
- utf8::encode ($string);
+ if ($better_than_56) {
+ utf8::encode ($string);
+ } else {
+ $string = pack 'C*', unpack 'C*', $string . pack "U*";
+ }
EOT
-print FH "my (\$error, \$got) = ${package}::constant (\$string);\n";
+ $test_body .= "my (\$error, \$got) = ${package}::constant (\$string);\n";
-print FH <<'EOT';
+ $test_body .= <<'EOT';
if (ref $expect_bytes) {
# Error expected.
if ($error) {
@@ -488,216 +823,100 @@ print FH <<'EOT';
}
EOT
-close FH or die "close $testpl: $!\n";
-
-# This is where the test numbers carry on after the test number above are
-# relayed
-my $test = 44;
-
-################ Makefile.PL
-# We really need a Makefile.PL because make test for a no dynamic linking perl
-# will run Makefile.PL again as part of the "make perl" target.
-my $makefilePL = catfile($dir, "Makefile.PL");
-push @files, "Makefile.PL";
-open FH, ">$makefilePL" or die "open >$makefilePL: $!\n";
-print FH <<"EOT";
-#!$perl -w
-use ExtUtils::MakeMaker;
-WriteMakefile(
- 'NAME' => "$package",
- 'VERSION_FROM' => "$package.pm", # finds \$VERSION
- (\$] >= 5.005 ?
- (#ABSTRACT_FROM => "$package.pm", # XXX add this
- AUTHOR => "$0") : ())
- );
-EOT
-
-close FH or die "close $makefilePL: $!\n";
-
-################ MANIFEST
-# We really need a MANIFEST because make distclean checks it.
-my $manifest = catfile($dir, "MANIFEST");
-push @files, "MANIFEST";
-open FH, ">$manifest" or die "open >$manifest: $!\n";
-print FH "$_\n" foreach @files;
-close FH or die "close $manifest: $!\n";
-
-chdir $dir or die $!; push @INC, '../../lib';
-END {chdir ".." or warn $!};
-
-my @perlout = `$runperl Makefile.PL PERL_CORE=1`;
-if ($?) {
- print "not ok 1 # $runperl Makefile.PL failed: $?\n";
- print "# $_" foreach @perlout;
- exit($?);
-} else {
- print "ok 1\n";
-}
-
-
-my $makefile = ($^O eq 'VMS' ? 'descrip' : 'Makefile');
-my $makefile_ext = ($^O eq 'VMS' ? '.mms' : '');
-if (-f "$makefile$makefile_ext") {
- print "ok 2\n";
-} else {
- print "not ok 2\n";
-}
-
-# Renamed by make clean
-my $makefile_rename = $makefile . ($^O eq 'VMS' ? '.mms' : '.old');
-
-my $make = $Config{make};
-
-$make = $ENV{MAKE} if exists $ENV{MAKE};
-
-if ($^O eq 'MSWin32' && $make eq 'nmake') { $make .= " -nologo"; }
-
-my @makeout;
-
-if ($^O eq 'VMS') { $make .= ' all'; }
-print "# make = '$make'\n";
-@makeout = `$make`;
-if ($?) {
- print "not ok 3 # $make failed: $?\n";
- print "# $_" foreach @makeout;
- exit($?);
-} else {
- print "ok 3\n";
+ end_tests("utf8 tests", \@items, [], "#define perl \"rules\"\n", $test_body);
}
-if ($^O eq 'VMS') { $make =~ s{ all}{}; }
+# XXX I think that I should merge this into the utf8 test above.
+sub explict_call_constant {
+ my ($string, $expect) = @_;
+ # This does assume simple strings suitable for ''
+ my $test_body = <<"EOT";
+{
+ my (\$error, \$got) = ${package}::constant ('$string');\n;
+EOT
-if ($Config{usedl}) {
- print "ok 4\n";
-} else {
- my $makeperl = "$make perl";
- print "# make = '$makeperl'\n";
- @makeout = `$makeperl`;
- if ($?) {
- print "not ok 4 # $makeperl failed: $?\n";
- print "# $_" foreach @makeout;
- exit($?);
+ if (defined $expect) {
+ # No error expected
+ $test_body .= <<"EOT";
+ if (\$error or \$got ne "$expect") {
+ print "not ok $dummytest # error '\$error', expect '$expect', got '\$got'\n";
+ } else {
+ print "ok $dummytest\n";
+ }
+ }
+EOT
+ } else {
+ # Error expected.
+ $test_body .= <<"EOT";
+ if (\$error) {
+ print "ok $dummytest # error='\$error' (as expected)\n";
} else {
- print "ok 4\n";
+ print "not ok $dummytest # expected error, got no error and '\$got'\n";
}
+EOT
+ }
+ $dummytest++;
+ return $test_body . <<'EOT';
}
-
-my $maketest = "$make test";
-print "# make = '$maketest'\n";
-
-@makeout = `$maketest`;
-
-if (open OUTPUT, "<$output") {
- print while <OUTPUT>;
- close OUTPUT or print "# Close $output failed: $!\n";
-} else {
- # Harness will report missing test results at this point.
- print "# Open <$output failed: $!\n";
+EOT
}
-if ($?) {
- print "not ok $test # $maketest failed: $?\n";
- print "# $_" foreach @makeout;
+# Simple tests to verify bits of the switch generation system work.
+sub simple {
+ start_tests();
+ # Deliberately leave $name in @_, so that it is indexed from 1.
+ my ($name, @items) = @_;
+ my $test_header;
+ my $test_body = "my \$value;\n";
+ foreach my $counter (1 .. $#_) {
+ my $thisname = $_[$counter];
+ $test_header .= "#define $thisname $counter\n";
+ $test_body .= <<"EOT";
+\$value = $thisname;
+if (\$value == $counter) {
+ print "ok $dummytest\n";
} else {
- print "ok $test - maketest\n";
+ print "not ok $dummytest # $thisname gave \$value\n";
}
-$test++;
-
-
-# -x is busted on Win32 < 5.6.1, so we emulate it.
-my $regen;
-if( $^O eq 'MSWin32' && $] <= 5.006001 ) {
- open(REGENTMP, ">regentmp") or die $!;
- open(XS, "$package.xs") or die $!;
- my $saw_shebang;
- while(<XS>) {
- $saw_shebang++ if /^#!.*/i ;
- print REGENTMP $_ if $saw_shebang;
+EOT
+ ++$dummytest;
+ # Yes, the last time round the loop appends a z to the string.
+ for my $i (0 .. length $thisname) {
+ my $copyname = $thisname;
+ substr ($copyname, $i, 1) = 'z';
+ $test_body .= explict_call_constant ($copyname,
+ $copyname eq $thisname
+ ? $thisname : undef);
}
- close XS; close REGENTMP;
- $regen = `$runperl regentmp`;
- unlink 'regentmp';
-}
-else {
- $regen = `$runperl -x $package.xs`;
-}
-if ($?) {
- print "not ok $test # $runperl -x $package.xs failed: $?\n";
-} else {
- print "ok $test - regen\n";
-}
-$test++;
-
-my $expect = $constant_types . $C_constant .
- "\n#### XS Section:\n" . $XS_constant;
-
-if ($expect eq $regen) {
- print "ok $test - regen worked\n";
-} else {
- print "not ok $test - regen worked\n";
- # open FOO, ">expect"; print FOO $expect;
- # open FOO, ">regen"; print FOO $regen; close FOO;
-}
-$test++;
-
-my $makeclean = "$make clean";
-print "# make = '$makeclean'\n";
-@makeout = `$makeclean`;
-if ($?) {
- print "not ok $test # $make failed: $?\n";
- print "# $_" foreach @makeout;
-} else {
- print "ok $test\n";
-}
-$test++;
-
-sub check_for_bonus_files {
- my $dir = shift;
- my %expect = map {($^O eq 'VMS' ? lc($_) : $_), 1} @_;
-
- my $fail;
- opendir DIR, $dir or die "opendir '$dir': $!";
- while (defined (my $entry = readdir DIR)) {
- $entry =~ s/\.$// if $^O eq 'VMS'; # delete trailing dot that indicates no extension
- next if $expect{$entry};
- print "# Extra file '$entry'\n";
- $fail = 1;
}
-
- closedir DIR or warn "closedir '.': $!";
- if ($fail) {
- print "not ok $test\n";
- } else {
- print "ok $test\n";
- }
- $test++;
+ # Ho. This seems to be buggy in 5.005_03:
+ # # Now remove $name from @_:
+ # shift @_;
+ end_tests($name, \@items, \@items, $test_header, $test_body);
}
-check_for_bonus_files ('.', @files, $output, $makefile_rename, '.', '..');
+# Check that the memeq clauses work correctly when there isn't a switch
+# statement to bump off a character
+simple ("Singletons", "A", "AB", "ABC", "ABCD", "ABCDE");
+# Check the three code.
+simple ("Three start", qw(Bea kea Lea lea nea pea rea sea tea Wea yea Zea));
+# There were 162 2 letter words in /usr/share/dict/words on FreeBSD 4.6, which
+# I felt was rather too many. So I used words with 2 vowels.
+simple ("Twos and three middle", qw(aa ae ai ea eu ie io oe era eta));
+# Given the choice go for the end, else the earliest point
+simple ("Three end and four symetry", qw(ean ear eat barb marm tart));
-rename $makefile_rename, $makefile
- or die "Can't rename '$makefile_rename' to '$makefile': $!";
-unlink $output or warn "Can't unlink '$output': $!";
+# Need this if the single test below is rolled into @tests :
+# --$dummytest;
+print "1..$dummytest\n";
-# Need to make distclean to remove ../../lib/ExtTest.pm
-my $makedistclean = "$make distclean";
-print "# make = '$makedistclean'\n";
-@makeout = `$makedistclean`;
-if ($?) {
- print "not ok $test # $make failed: $?\n";
- print "# $_" foreach @makeout;
-} else {
- print "ok $test\n";
-}
-$test++;
-
-check_for_bonus_files ('.', @files, '.', '..');
+write_and_run_extension @$_ foreach @tests;
-unless ($keep_files) {
- foreach (@files) {
- unlink $_ or warn "unlink $_: $!";
- }
-}
+# This was causing an assertion failure (a C<confess>ion)
+# Any single byte > 128 should do it.
+C_constant ($package, undef, undef, undef, undef, undef, chr 255);
+print "ok $realtest\n"; $realtest++;
-check_for_bonus_files ('.', '.', '..');
+print STDERR "# You were running with \$keep_files set to $keep_files\n"
+ if $keep_files;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Embed.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Embed.t
index 5460a254bd6..fc0ed3cbc17 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/Embed.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Embed.t
@@ -102,7 +102,7 @@ if ($^O eq 'VMS') {
# Everyone needs libperl copied if it's not found by '-lperl'.
$testlib = $Config{'libperl'};
my $srclib = $testlib;
- $testlib =~ s/^[^.]+/libperl/;
+ $testlib =~ s/.+(?=\.[^.]*)/libperl/;
$testlib = File::Spec::->catfile($lib, $testlib);
$srclib = File::Spec::->catfile($lib, $srclib);
if (-f $srclib) {
@@ -151,11 +151,15 @@ __END__
#define my_puts(a) if(puts(a) < 0) exit(666)
-static char *cmds[] = { "perl","-e", "print qq[ok 5\\n]", NULL };
+static char *cmds[] = { "perl","-e", "$|=1; print qq[ok 5\\n]", NULL };
int main(int argc, char **argv, char **env)
{
- PerlInterpreter *my_perl = perl_alloc();
+ PerlInterpreter *my_perl;
+
+ PERL_SYS_INIT3(&argc,&argv,&env);
+
+ my_perl = perl_alloc();
my_puts("ok 2");
@@ -181,5 +185,7 @@ int main(int argc, char **argv, char **env)
my_puts("ok 8");
+ PERL_SYS_TERM();
+
return 0;
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/INST.t b/gnu/usr.bin/perl/lib/ExtUtils/t/INST.t
index d6780ac6744..3639acd11b3 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/INST.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/INST.t
@@ -60,7 +60,7 @@ is( $mm->{VERSION}, 0.01, 'VERSION' );
my $config_prefix = $Config{installprefixexp} || $Config{installprefix} ||
$Config{prefixexp} || $Config{prefix};
-is( $mm->{PREFIX}, $config_prefix, 'PREFIX' );
+is( $mm->{PERLPREFIX}, $config_prefix, 'PERLPREFIX' );
is( !!$mm->{PERL_CORE}, !!$ENV{PERL_CORE}, 'PERL_CORE' );
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/INST_PREFIX.t b/gnu/usr.bin/perl/lib/ExtUtils/t/INST_PREFIX.t
index 8af8c307fa8..2d90a8c472a 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/INST_PREFIX.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/INST_PREFIX.t
@@ -16,7 +16,7 @@ BEGIN {
}
use strict;
-use Test::More tests => 26;
+use Test::More tests => 36;
use MakeMaker::Test::Utils;
use ExtUtils::MakeMaker;
use File::Spec;
@@ -38,15 +38,15 @@ my $Updir = File::Spec->updir;
ok( chdir 'Big-Dummy', "chdir'd to Big-Dummy" ) ||
diag("chdir failed: $!");
-my $PREFIX = File::Spec->catdir('foo', 'bar');
my $stdout = tie *STDOUT, 'TieOut' or die;
+
my $mm = WriteMakefile(
NAME => 'Big::Dummy',
VERSION_FROM => 'lib/Big/Dummy.pm',
PREREQ_PM => {},
PERL_CORE => $ENV{PERL_CORE},
- PREFIX => $PREFIX,
);
+
like( $stdout->read, qr{
Writing\ $Makefile\ for\ Big::Liar\n
Big::Liar's\ vars\n
@@ -54,16 +54,41 @@ like( $stdout->read, qr{
INST_ARCHLIB\ =\ \S+\n
Writing\ $Makefile\ for\ Big::Dummy\n
}x );
-undef $stdout;
-untie *STDOUT;
isa_ok( $mm, 'ExtUtils::MakeMaker' );
is( $mm->{NAME}, 'Big::Dummy', 'NAME' );
is( $mm->{VERSION}, 0.01, 'VERSION' );
+foreach my $prefix (qw(PREFIX PERLPREFIX SITEPREFIX VENDORPREFIX)) {
+ unlike( $mm->{$prefix}, qr/\$\(PREFIX\)/ );
+}
+
+
+my $PREFIX = File::Spec->catdir('foo', 'bar');
+$mm = WriteMakefile(
+ NAME => 'Big::Dummy',
+ VERSION_FROM => 'lib/Big/Dummy.pm',
+ PREREQ_PM => {},
+ PERL_CORE => $ENV{PERL_CORE},
+ PREFIX => $PREFIX,
+);
+like( $stdout->read, qr{
+ Writing\ $Makefile\ for\ Big::Liar\n
+ Big::Liar's\ vars\n
+ INST_LIB\ =\ \S+\n
+ INST_ARCHLIB\ =\ \S+\n
+ Writing\ $Makefile\ for\ Big::Dummy\n
+}x );
+undef $stdout;
+untie *STDOUT;
+
is( $mm->{PREFIX}, $PREFIX, 'PREFIX' );
+foreach my $prefix (qw(PERLPREFIX SITEPREFIX VENDORPREFIX)) {
+ is( $mm->{$prefix}, '$(PREFIX)', "\$(PREFIX) overrides $prefix" );
+}
+
is( !!$mm->{PERL_CORE}, !!$ENV{PERL_CORE}, 'PERL_CORE' );
my($perl_src, $mm_perl_src);
@@ -80,41 +105,36 @@ is( $mm_perl_src, $perl_src, 'PERL_SRC' );
# Every INSTALL* variable must start with some PREFIX.
-my @Perl_Install = qw(archlib privlib bin script
- man1dir man3dir);
-my @Site_Install = qw(sitearch sitelib sitebin
- siteman1dir siteman3dir);
-my @Vend_Install = qw(vendorarch vendorlib vendorbin
- vendorman1dir vendorman3dir);
-
-foreach my $var (@Perl_Install) {
- my $prefix = $Is_VMS ? '[.foo.bar' : File::Spec->catdir(qw(foo bar));
-
- # support for man page skipping
- $prefix = 'none' if $var =~ /man/ && !$Config{"install$var"};
- like( $mm->{uc "install$var"}, qr/^\Q$prefix\E/, "PREFIX + $var" );
-}
+my %Install_Vars = (
+ PERL => [qw(archlib privlib bin man1dir man3dir script)],
+ SITE => [qw(sitearch sitelib sitebin siteman1dir siteman3dir)],
+ VENDOR => [qw(vendorarch vendorlib vendorbin vendorman1dir vendorman3dir)]
+);
-foreach my $var (@Site_Install) {
- my $prefix = $Is_VMS ? '[.foo.bar' : File::Spec->catdir(qw(foo bar));
+while( my($type, $vars) = each %Install_Vars) {
- like( $mm->{uc "install$var"}, qr/^\Q$prefix\E/,
- "SITEPREFIX + $var" );
-}
+ SKIP: foreach my $var (@$vars) {
+ skip "VMS must expand macros in INSTALL* vars", scalar @$vars
+ if $Is_VMS;
-foreach my $var (@Vend_Install) {
- my $prefix = $Is_VMS ? '[.foo.bar' : File::Spec->catdir(qw(foo bar));
+ my $prefix = '$('.$type.'PREFIX)';
- like( $mm->{uc "install$var"}, qr/^\Q$prefix\E/,
- "VENDORPREFIX + $var" );
+ # support for man page skipping
+ $prefix = 'none' if $type eq 'PERL' &&
+ $var =~ /man/ &&
+ !$Config{"install$var"};
+ like( $mm->{uc "install$var"}, qr/^\Q$prefix\E/, "$prefix + $var" );
+ }
}
-
# Check that when installman*dir isn't set in Config no man pages
# are generated.
{
undef *ExtUtils::MM_Unix::Config;
+ undef *ExtUtils::MM_Unix::Config_Override;
%ExtUtils::MM_Unix::Config = %Config;
+ *ExtUtils::MM_VMS::Config = \%ExtUtils::MM_Unix::Config;
+
$ExtUtils::MM_Unix::Config{installman1dir} = '';
$ExtUtils::MM_Unix::Config{installman3dir} = '';
@@ -132,3 +152,37 @@ foreach my $var (@Vend_Install) {
is( $mm->{INSTALLMAN1DIR}, $wibble );
is( $mm->{INSTALLMAN3DIR}, 'none' );
}
+
+# Check that when installvendorman*dir is set in Config it is honored
+# [rt.cpan.org 2949]
+{
+ undef *ExtUtils::MM_Unix::Config;
+ undef *ExtUtils::MM_Unix::Config_Override;
+ undef *ExtUtils::MM_VMS::Config;
+
+ %ExtUtils::MM_Unix::Config = %Config;
+ *ExtUtils::MM_VMS::Config = \%ExtUtils::MM_Unix::Config;
+
+ $ExtUtils::MM_Unix::Config{installvendorman1dir} =
+ File::Spec->catdir('foo','bar');
+ $ExtUtils::MM_Unix::Config{installvendorman3dir} = '';
+ $ExtUtils::MM_Unix::Config{usevendorprefix} = 1;
+ $ExtUtils::MM_Unix::Config{vendorprefixexp} = 'something';
+
+ my $stdout = tie *STDOUT, 'TieOut' or die;
+ my $mm = WriteMakefile(
+ NAME => 'Big::Dummy',
+ VERSION_FROM => 'lib/Big/Dummy.pm',
+ PREREQ_PM => {},
+ PERL_CORE => $ENV{PERL_CORE},
+
+ # In case the local installation doesn't have man pages.
+ INSTALLMAN1DIR=> 'foo/bar/baz',
+ INSTALLMAN3DIR=> 'foo/bar/baz',
+ );
+
+ is( $mm->{INSTALLVENDORMAN1DIR}, File::Spec->catdir('foo','bar'),
+ 'installvendorman1dir (in %Config) not modified' );
+ isnt( $mm->{INSTALLVENDORMAN3DIR}, '',
+ 'installvendorman3dir (not in %Config) set' );
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Install.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Install.t
new file mode 100644
index 00000000000..13b3a6779ca
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Install.t
@@ -0,0 +1,112 @@
+#!/usr/bin/perl -w
+
+# Test ExtUtils::Install.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ @INC = ('../../lib', '../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use strict;
+use TieOut;
+use File::Path;
+use File::Spec;
+
+use Test::More tests => 29;
+
+BEGIN { use_ok('ExtUtils::Install') }
+
+# Check exports.
+foreach my $func (qw(install uninstall pm_to_blib install_default)) {
+ can_ok(__PACKAGE__, $func);
+}
+
+
+chdir 'Big-Dummy';
+
+my $stdout = tie *STDOUT, 'TieOut';
+pm_to_blib( { 'lib/Big/Dummy.pm' => 'blib/lib/Big/Dummy.pm' },
+ 'blib/lib/auto'
+ );
+END { rmtree 'blib' }
+
+ok( -d 'blib/lib', 'pm_to_blib created blib dir' );
+ok( -r 'blib/lib/Big/Dummy.pm', ' copied .pm file' );
+ok( -r 'blib/lib/auto', ' created autosplit dir' );
+is( $stdout->read, "cp lib/Big/Dummy.pm blib/lib/Big/Dummy.pm\n" );
+
+pm_to_blib( { 'lib/Big/Dummy.pm' => 'blib/lib/Big/Dummy.pm' },
+ 'blib/lib/auto'
+ );
+ok( -d 'blib/lib', 'second run, blib dir still there' );
+ok( -r 'blib/lib/Big/Dummy.pm', ' .pm file still there' );
+ok( -r 'blib/lib/auto', ' autosplit still there' );
+is( $stdout->read, "Skip blib/lib/Big/Dummy.pm (unchanged)\n" );
+
+install( { 'blib/lib' => 'install-test/lib/perl',
+ read => 'install-test/packlist',
+ write => 'install-test/packlist'
+ },
+ 0, 1);
+ok( ! -d 'install-test/lib/perl', 'install made dir (dry run)');
+ok( ! -r 'install-test/lib/perl/Big/Dummy.pm',
+ ' .pm file installed (dry run)');
+ok( ! -r 'install-test/packlist', ' packlist exists (dry run)');
+
+install( { 'blib/lib' => 'install-test/lib/perl',
+ read => 'install-test/packlist',
+ write => 'install-test/packlist'
+ } );
+ok( -d 'install-test/lib/perl', 'install made dir' );
+ok( -r 'install-test/lib/perl/Big/Dummy.pm', ' .pm file installed' );
+ok( -r 'install-test/packlist', ' packlist exists' );
+
+open(PACKLIST, 'install-test/packlist' );
+my %packlist = map { chomp; ($_ => 1) } <PACKLIST>;
+close PACKLIST;
+
+# On case-insensitive filesystems (ie. VMS), the keys of the packlist might
+# be lowercase. :(
+my $native_dummy = File::Spec->catfile(qw(install-test lib perl Big Dummy.pm));
+is( keys %packlist, 1 );
+is( lc((keys %packlist)[0]), lc $native_dummy, 'packlist written' );
+
+
+# Test UNINST=1 preserving same versions in other dirs.
+install( { 'blib/lib' => 'install-test/other_lib/perl',
+ read => 'install-test/packlist',
+ write => 'install-test/packlist'
+ },
+ 0, 0, 1);
+ok( -d 'install-test/other_lib/perl', 'install made other dir' );
+ok( -r 'install-test/other_lib/perl/Big/Dummy.pm', ' .pm file installed' );
+ok( -r 'install-test/packlist', ' packlist exists' );
+ok( -r 'install-test/lib/perl/Big/Dummy.pm', ' UNINST=1 preserved same' );
+
+
+
+# Test UNINST=1 removing other versions in other dirs.
+chmod 0644, 'blib/lib/Big/Dummy.pm' or die $!;
+open(DUMMY, ">>blib/lib/Big/Dummy.pm") or die $!;
+print DUMMY "Extra stuff\n";
+close DUMMY;
+
+{
+ local @INC = ('install-test/lib/perl');
+ local $ENV{PERL5LIB} = '';
+ install( { 'blib/lib' => 'install-test/other_lib/perl',
+ read => 'install-test/packlist',
+ write => 'install-test/packlist'
+ },
+ 0, 0, 1);
+ ok( -d 'install-test/other_lib/perl', 'install made other dir' );
+ ok( -r 'install-test/other_lib/perl/Big/Dummy.pm', ' .pm file installed' );
+ ok( -r 'install-test/packlist', ' packlist exists' );
+ ok( !-r 'install-test/lib/perl/Big/Dummy.pm',
+ ' UNINST=1 removed different' );
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Installed.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Installed.t
index d62afba4348..30dfcb3d66b 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/Installed.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Installed.t
@@ -9,7 +9,9 @@ BEGIN {
unshift @INC, 't/lib/';
}
}
-chdir 't';
+
+my $Is_VMS = $^O eq 'VMS';
+chdir($Is_VMS ? 'BFD_TEST_ROOT:[t]' : 't');
use strict;
@@ -54,7 +56,7 @@ my $prefix = $Config{prefix} || $Config{prefixexp};
# You can concatenate /foo but not foo:, which defaults in the current
# directory
-$prefix = VMS::Filespec::unixify($prefix) if $^O eq 'VMS';
+$prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
# ActivePerl 5.6.1/631 has $Config{prefixexp} as 'p:' for some reason
$prefix = $Config{prefix} if $prefix eq 'p:' && $^O eq 'MSWin32';
@@ -80,11 +82,9 @@ ok( !$ei->_is_under('foo', @under), '... should find no file not under dirs');
ok( $ei->_is_under('baz', @under), '... should find file under dir' );
-my $wrotelist;
-
rmtree 'auto/FakeMod';
ok( mkpath('auto/FakeMod') );
-END { rmtree 'auto/FakeMod' }
+END { rmtree 'auto' }
ok(open(PACKLIST, '>auto/FakeMod/.packlist'));
print PACKLIST 'list';
@@ -230,14 +230,6 @@ is( ${ $ei->packlist('yesmod') }, 102,
is( $ei->version('yesmod'), 101,
'version() should report installed mod version' );
-END {
- if ($wrotelist) {
- for my $file (qw( .packlist FakePak.pm )) {
- 1 while unlink $file;
- }
- File::Path::rmtree('auto') or warn "Couldn't rmtree auto: $!";
- }
-}
package Fakepak;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Liblist.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Liblist.t
new file mode 100644
index 00000000000..0ee90be2eed
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Liblist.t
@@ -0,0 +1,36 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use strict;
+use Test::More tests => 6;
+use Data::Dumper;
+
+BEGIN {
+ use_ok( 'ExtUtils::Liblist' );
+}
+
+ok( defined &ExtUtils::Liblist::ext,
+ 'ExtUtils::Liblist::ext() defined for backwards compat' );
+
+{
+ my @warn;
+ local $SIG{__WARN__} = sub {push @warn, [@_]};
+
+ my $ll = bless {}, 'ExtUtils::Liblist';
+ my @out = $ll->ext('-ln0tt43r3_perl');
+ is( @out, 4, 'enough output' );
+ unlike( $out[2], qr/-ln0tt43r3_perl/, 'bogus library not added' );
+ ok( @warn, 'had warning');
+
+ is( grep(/\QNote (probably harmless): No library found for \E(-l)?n0tt43r3_perl/, map { @$_ } @warn), 1 ) || diag Dumper @warn;
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Any.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Any.t
new file mode 100644
index 00000000000..0326274fe70
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Any.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+chdir 't';
+
+use Test::More tests => 7;
+BEGIN { use_ok('ExtUtils::MM') }
+
+
+### OS Flavor methods
+
+can_ok( 'MM', 'os_flavor', 'os_flavor_is' );
+
+# Can't really know what the flavors are going to be, so we just
+# make sure it returns something.
+my @flavors = MM->os_flavor;
+ok( @flavors, 'os_flavor() returned something' );
+
+ok( MM->os_flavor_is($flavors[rand @flavors]),
+ 'os_flavor_is() one flavor' );
+ok( MM->os_flavor_is($flavors[rand @flavors], 'BogusOS'),
+ ' many flavors' );
+ok( !MM->os_flavor_is('BogusOS'), ' wrong flavor' );
+ok( !MM->os_flavor_is(), ' no flavor' );
+
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_BeOS.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_BeOS.t
index 870e8d47fe7..3161176cadf 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_BeOS.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_BeOS.t
@@ -40,9 +40,16 @@ use File::Basename;
require_ok( 'ExtUtils::MM_BeOS' );
-# perl_archive()
+
+# init_linker
{
- my $libperl = $Config{libperl} || 'libperl.a';
- is( MM->perl_archive(), File::Spec->catfile('$(PERL_INC)', $libperl ),
- 'perl_archive() should respect libperl setting' );
+ my $libperl = File::Spec->catfile('$(PERL_INC)',
+ $Config{libperl} || 'libperl.a' );
+ my $export = '';
+ my $after = '';
+ $MM->init_linker;
+
+ is( $MM->{PERL_ARCHIVE}, $libperl, 'PERL_ARCHIVE' );
+ is( $MM->{PERL_ARCHIVE_AFTER}, $after, 'PERL_ARCHIVE_AFTER' );
+ is( $MM->{EXPORT_LIST}, $export, 'EXPORT_LIST' );
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Cygwin.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Cygwin.t
index 03641d33f22..5b0b04f6c63 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Cygwin.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Cygwin.t
@@ -11,11 +11,12 @@ BEGIN {
}
chdir 't';
+use strict;
use Test::More;
BEGIN {
if ($^O =~ /cygwin/i) {
- plan tests => 13;
+ plan tests => 11;
} else {
plan skip_all => "This is not cygwin";
}
@@ -33,83 +34,69 @@ is( MM->canonpath('/a/../../c'), $path,
'canonpath() method should work just like the one in File::Spec' );
# test cflags, with the fake package below
-my $args = bless({
+my $MM = bless({
CFLAGS => 'fakeflags',
CCFLAGS => '',
-}, MM);
+}, 'MM');
# with CFLAGS set, it should be returned
-is( $args->cflags(), 'fakeflags',
+is( $MM->cflags(), 'fakeflags',
'cflags() should return CFLAGS member data, if set' );
-delete $args->{CFLAGS};
+delete $MM->{CFLAGS};
# ExtUtils::MM_Cygwin::cflags() calls this, fake the output
{
local $SIG{__WARN__} = sub {
- # no warnings 'redefine';
warn @_ unless $_[0] =~ /^Subroutine .* redefined/;
};
- sub ExtUtils::MM_Unix::cflags { return $_[1] };
+ *ExtUtils::MM_Unix::cflags = sub { return $_[1] };
}
# respects the config setting, should ignore whitespace around equal sign
my $ccflags = $Config{useshrplib} eq 'true' ? ' -DUSEIMPORTLIB' : '';
{
- local $args->{NEEDS_LINKING} = 1;
- $args->cflags(<<FLAGS);
+ local $MM->{NEEDS_LINKING} = 1;
+ $MM->cflags(<<FLAGS);
OPTIMIZE = opt
PERLTYPE =pt
FLAGS
}
-like( $args->{CFLAGS}, qr/OPTIMIZE = opt/, '... should set OPTIMIZE' );
-like( $args->{CFLAGS}, qr/PERLTYPE = pt/, '... should set PERLTYPE' );
-like( $args->{CFLAGS}, qr/CCFLAGS = $ccflags/, '... should set CCFLAGS' );
+like( $MM->{CFLAGS}, qr/OPTIMIZE = opt/, '... should set OPTIMIZE' );
+like( $MM->{CFLAGS}, qr/PERLTYPE = pt/, '... should set PERLTYPE' );
+like( $MM->{CFLAGS}, qr/CCFLAGS = $ccflags/, '... should set CCFLAGS' );
# test manifypods
-$args = bless({
+$MM = bless({
NOECHO => 'noecho',
MAN3PODS => {},
MAN1PODS => {},
MAKEFILE => 'Makefile',
}, 'MM');
-like( $args->manifypods(), qr/pure_all\n\tnoecho/,
+unlike( $MM->manifypods(), qr/foo/,
'manifypods() should return without PODS values set' );
-$args->{MAN3PODS} = { foo => 1 };
-my $out = tie *STDOUT, 'FakeOut';
+$MM->{MAN3PODS} = { foo => 'foo.1' };
+my $res = $MM->manifypods();
+like( $res, qr/pure_all.*foo.*foo.1/s, '... should add MAN3PODS targets' );
+
+
+# init_linker
{
- local $SIG{__WARN__} = sub {
- # no warnings 'redefine';
- warn @_ unless $_[0] =~ /used only once/;
- };
- no warnings 'once';
- local *MM::perl_script = sub { return };
- my $res = $args->manifypods();
- like( $$out, qr/could not locate your pod2man/,
- '... should warn if pod2man cannot be located' );
- like( $res, qr/POD2MAN_EXE = -S pod2man/,
- '... should use default pod2man target' );
- like( $res, qr/pure_all.+foo/, '... should add MAN3PODS targets' );
-}
+ my $libperl = $Config{libperl} || 'libperl.a';
+ $libperl =~ s/\.a/.dll.a/ if $] >= 5.007;
+ $libperl = "\$(PERL_INC)/$libperl";
+
+ my $export = '';
+ my $after = '';
+ $MM->init_linker;
-SKIP: {
- skip "Only relevent in the core", 2 unless $ENV{PERL_CORE};
- $args->{PERL_SRC} = File::Spec->updir;
- $args->{MAN1PODS} = { bar => 1 };
- $$out = '';
- $res = $args->manifypods();
- is( $$out, '', '... should not warn if PERL_SRC provided' );
- like( $res, qr/bar \\\n\t1 \\\n\tfoo/,
- '... should join MAN1PODS and MAN3PODS');
+ is( $MM->{PERL_ARCHIVE}, $libperl, 'PERL_ARCHIVE' );
+ is( $MM->{PERL_ARCHIVE_AFTER}, $after, 'PERL_ARCHIVE_AFTER' );
+ is( $MM->{EXPORT_LIST}, $export, 'EXPORT_LIST' );
}
-# test perl_archive
-my $libperl = $Config{libperl} || 'libperl.a';
-$libperl =~ s/\.a/.dll.a/;
-is( $args->perl_archive(), "\$(PERL_INC)/$libperl",
- 'perl_archive() should respect libperl setting' );
package FakeOut;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_NW5.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_NW5.t
index d2046eeebbf..13359d17fbc 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_NW5.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_NW5.t
@@ -172,19 +172,20 @@ delete $ENV{PATH} unless $had_path;
'clean() Makefile target' );
}
-# perl_archive()
+
+# init_linker
{
my $libperl = $Config{libperl} || 'libperl.a';
- is( $MM->perl_archive(), File::Spec->catfile('$(PERL_INC)', $libperl ),
- 'perl_archive() should respect libperl setting' );
-}
+ my $export = '$(BASEEXT).def';
+ my $after = '';
+ $MM->init_linker;
-# export_list
-{
- my $mm_w32 = bless { BASEEXT => 'someext' }, 'MM';
- is( $mm_w32->export_list(), 'someext.def', 'export_list()' );
+ is( $MM->{PERL_ARCHIVE}, $libperl, 'PERL_ARCHIVE' );
+ is( $MM->{PERL_ARCHIVE_AFTER}, $after, 'PERL_ARCHIVE_AFTER' );
+ is( $MM->{EXPORT_LIST}, $export, 'EXPORT_LIST' );
}
+
# canonpath()
{
my $path = 'SYS:/TEMP';
@@ -272,14 +273,6 @@ unlink "${script_name}$script_ext" if -f "${script_name}$script_ext";
# xs_o() should look into that
# top_targets() should look into that
-# manifypods()
-{
- my $mm_w32 = bless { NOECHO => '' }, 'MM';
- like( $mm_w32->manifypods(),
- qr/^\nmanifypods :\n\t\$\Q(NOOP)\E\n$/,
- 'manifypods() Makefile target' );
-}
-
# dist_ci() should look into that
# dist_core() should look into that
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_OS2.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_OS2.t
index 53b83f3f855..c09f68a4473 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_OS2.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_OS2.t
@@ -247,26 +247,30 @@ ok( ExtUtils::MM_OS2->file_name_is_absolute( '\foo' ),
ok( ! ExtUtils::MM_OS2->file_name_is_absolute( 'arduk' ),
'... but not for paths with no leading slash or volume' );
-# perl_archive
-is( ExtUtils::MM_OS2->perl_archive(), '$(PERL_INC)/libperl$(LIB_EXT)',
- 'perl_archive() should return a static string' );
-# perl_archive_after
+$mm->init_linker;
+
+# PERL_ARCHIVE
+is( $mm->{PERL_ARCHIVE}, '$(PERL_INC)/libperl$(LIB_EXT)', 'PERL_ARCHIVE' );
+
+# PERL_ARCHIVE_AFTER
{
my $aout = 0;
local *OS2::is_aout;
*OS2::is_aout = \$aout;
- isnt( ExtUtils::MM_OS2->perl_archive_after(), '',
- 'perl_archive_after() should return string without $is_aout set' );
+ $mm->init_linker;
+ isnt( $mm->{PERL_ARCHIVE_AFTER}, '',
+ 'PERL_ARCHIVE_AFTER should be empty without $is_aout set' );
$aout = 1;
- is( ExtUtils::MM_OS2->perl_archive_after(), '',
- '... and blank string if it is set' );
+ is( $mm->{PERL_ARCHIVE_AFTER},
+ '$(PERL_INC)/libperl_override$(LIB_EXT)',
+ '... and has libperl_override if it is set' );
}
-# export_list
-is( ExtUtils::MM_OS2::export_list({ BASEEXT => 'foo' }), 'foo.def',
- 'export_list() should add .def to BASEEXT member' );
+# EXPORT_LIST
+is( $mm->{EXPORT_LIST}, '$(BASEEXT).def',
+ 'EXPORT_LIST should add .def to BASEEXT member' );
END {
use File::Path;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Unix.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Unix.t
index 1e47f1bc370..6683761995b 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Unix.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Unix.t
@@ -2,7 +2,7 @@
BEGIN {
if( $ENV{PERL_CORE} ) {
- chdir 't' if -d 't';
+ chdir 't';
@INC = '../lib';
}
else {
@@ -18,7 +18,7 @@ BEGIN {
plan skip_all => 'Non-Unix platform';
}
else {
- plan tests => 112;
+ plan tests => 115;
}
}
@@ -79,14 +79,13 @@ foreach ( qw /
dist_basics
dist_ci
dist_core
- dist_dir
+ distdir
dist_test
dlsyms
dynamic
dynamic_bs
dynamic_lib
exescan
- export_list
extliblist
find_perl
fixin
@@ -103,7 +102,6 @@ foreach ( qw /
makeaperl
makefile
manifypods
- maybe_command_in_dirs
needs_linking
pasthru
perldepend
@@ -129,7 +127,6 @@ foreach ( qw /
xs_c
xs_cpp
xs_o
- xsubpp_version
/ )
{
can_ok($class, $_);
@@ -165,10 +162,14 @@ is ($t->has_link_code(),1); is ($t->{HAS_LINK_CODE},1);
###############################################################################
# libscan
-is ($t->libscan('RCS'),'','libscan on RCS');
-is ($t->libscan('CVS'),'','libscan on CVS');
-is ($t->libscan('SCCS'),'','libscan on SCCS');
-is ($t->libscan('Fatty'),'Fatty','libscan on something not RCS, CVS or SCCS');
+is ($t->libscan('foo/RCS/bar'), '', 'libscan on RCS');
+is ($t->libscan('CVS/bar/car'), '', 'libscan on CVS');
+is ($t->libscan('SCCS'), '', 'libscan on SCCS');
+is ($t->libscan('.svn/something'), '', 'libscan on Subversion');
+is ($t->libscan('foo/b~r'), 'foo/b~r', 'libscan on file with ~');
+is ($t->libscan('foo/RCS.pm'), 'foo/RCS.pm', 'libscan on file with RCS');
+
+is ($t->libscan('Fatty'), 'Fatty', 'libscan on something not a VC file' );
###############################################################################
# maybe_command
@@ -214,6 +215,7 @@ is ($t->perl_script($self_name),$self_name, 'we pass as a perl_script()');
###############################################################################
# perm_rw perm_rwx
+$t->init_PERM;
is ($t->perm_rw(),'644', 'perm_rw() is 644');
is ($t->perm_rwx(),'755', 'perm_rwx() is 755');
@@ -231,12 +233,13 @@ foreach (qw/ post_constants postamble post_initialize/)
is ($t->replace_manpage_separator('Foo/Bar'),'Foo::Bar','manpage_separator');
###############################################################################
-# export_list, perl_archive, perl_archive_after
-foreach (qw/ export_list perl_archive perl_archive_after/)
- {
- is ($t->$_(),'',"$_() is empty string on Unix");
- }
+$t->init_linker;
+foreach (qw/ EXPORT_LIST PERL_ARCHIVE PERL_ARCHIVE_AFTER /)
+{
+ ok( exists $t->{$_}, "$_ was defined" );
+ is( $t->{$_}, '', "$_ is empty on Unix");
+}
{
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_VMS.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_VMS.t
index 303a599798d..dcc5ed6230a 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_VMS.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_VMS.t
@@ -19,7 +19,6 @@ BEGIN {
find_perl
path
maybe_command
- maybe_command_in_dirs
perl_script
file_name_is_absolute
replace_manpage_separator
@@ -30,7 +29,6 @@ BEGIN {
pm_to_blib
tool_autosplit
tool_xsubpp
- xsubpp_version
tools_other
dist
c_o
@@ -49,7 +47,7 @@ BEGIN {
realclean
dist_basics
dist_core
- dist_dir
+ distdir
dist_test
install
perldepend
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Win32.t b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Win32.t
index 8e2b52c03c4..e980b1a84e6 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Win32.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/MM_Win32.t
@@ -16,7 +16,7 @@ use Test::More;
BEGIN {
if ($^O =~ /MSWin32/i) {
- plan tests => 40;
+ plan tests => 42;
} else {
plan skip_all => 'This is not Win32';
}
@@ -84,7 +84,7 @@ delete $ENV{PATHEXT} unless $had_pathext;
{
my $my_perl = $1 if $^X =~ /(.*)/; # are we in -T or -t?
my( $perl, $path ) = fileparse( $my_perl );
- like( $MM->find_perl( $], [ $perl ], [ $path ] ),
+ like( $MM->find_perl( $], [ $perl ], [ $path ], 0 ),
qr/^\Q$my_perl\E$/i, 'find_perl() finds this perl' );
}
@@ -112,7 +112,7 @@ delete $ENV{PATHEXT} unless $had_pathext;
# init_others(): check if all keys are created and set?
# qw( TOUCH CHMOD CP RM_F RM_RF MV NOOP TEST_F LD AR LDLOADLIBS DEV_NUL )
{
- my $mm_w32 = bless( {}, 'MM' );
+ my $mm_w32 = bless( { BASEEXT => 'Foo' }, 'MM' );
$mm_w32->init_others();
my @keys = qw( TOUCH CHMOD CP RM_F RM_RF MV NOOP
TEST_F LD AR LDLOADLIBS DEV_NULL );
@@ -122,32 +122,44 @@ delete $ENV{PATHEXT} unless $had_pathext;
}
# constants()
+# XXX this test is probably useless now that we can call individual
+# init_* methods and check the keys in $mm_w32 directly
{
my $mm_w32 = bless {
NAME => 'TestMM_Win32',
VERSION => '1.00',
- VERSION_FROM => 'TestMM_Win32',
PM => { 'MM_Win32.pm' => 1 },
}, 'MM';
# XXX Hack until we have a proper init method.
# Flesh out some necessary keys in the MM object.
- foreach my $key (qw(XS C O_FILES H HTMLLIBPODS HTMLSCRIPTPODS
- MAN1PODS MAN3PODS PARENT_NAME)) {
- $mm_w32->{$key} = '';
- }
+ @{$mm_w32}{qw(XS MAN1PODS MAN3PODS)} = ({}) x 3;
+ @{$mm_w32}{qw(C O_FILES H)} = ([]) x 3;
+ @{$mm_w32}{qw(PARENT_NAME)} = ('') x 3;
+ $mm_w32->{FULLEXT} = 'TestMM_Win32';
+ $mm_w32->{BASEEXT} = 'TestMM_Win32';
+
+ $mm_w32->init_VERSION;
+ $mm_w32->init_linker;
+ $mm_w32->init_INST;
+ $mm_w32->init_xs;
+
my $s_PM = join( " \\\n\t", sort keys %{$mm_w32->{PM}} );
my $k_PM = join( " \\\n\t", %{$mm_w32->{PM}} );
- like( $mm_w32->constants(),
- qr|^NAME\ =\ TestMM_Win32\s+VERSION\ =\ 1\.00.+
- MAKEMAKER\ =\ \Q$INC{'ExtUtils/MakeMaker.pm'}\E\s+
- MM_VERSION\ =\ \Q$ExtUtils::MakeMaker::VERSION\E.+
- VERSION_FROM\ =\ TestMM_Win32.+
- TO_INST_PM\ =\ \Q$s_PM\E\s+
- PM_TO_BLIB\ =\ \Q$k_PM\E
- |xs, 'constants()' );
-
+ my $constants = $mm_w32->constants;
+
+ foreach my $regex (
+ qr|^NAME \s* = \s* TestMM_Win32 \s* $|xms,
+ qr|^VERSION \s* = \s* 1\.00 \s* $|xms,
+ qr|^MAKEMAKER \s* = \s* \Q$INC{'ExtUtils/MakeMaker.pm'}\E \s* $|xms,
+ qr|^MM_VERSION \s* = \s* \Q$ExtUtils::MakeMaker::VERSION\E \s* $|xms,
+ qr|^TO_INST_PM \s* = \s* \Q$s_PM\E \s* $|xms,
+ qr|^PM_TO_BLIB \s* = \s* \Q$k_PM\E \s* $|xms,
+ )
+ {
+ like( $constants, $regex, 'constants() check' );
+ }
}
# path()
@@ -172,17 +184,17 @@ delete $ENV{PATH} unless $had_path;
'clean() Makefile target' );
}
-# perl_archive()
+# init_linker
{
- my $libperl = $Config{libperl} || 'libperl.a';
- is( $MM->perl_archive(), File::Spec->catfile('$(PERL_INC)', $libperl ),
- 'perl_archive() should respect libperl setting' );
-}
-
-# export_list
-{
- my $mm_w32 = bless { BASEEXT => 'someext' }, 'MM';
- is( $mm_w32->export_list(), 'someext.def', 'export_list()' );
+ my $libperl = File::Spec->catfile('$(PERL_INC)',
+ $Config{libperl} || 'libperl.a');
+ my $export = '$(BASEEXT).def';
+ my $after = '';
+ $MM->init_linker;
+
+ is( $MM->{PERL_ARCHIVE}, $libperl, 'PERL_ARCHIVE' );
+ is( $MM->{PERL_ARCHIVE_AFTER}, $after, 'PERL_ARCHIVE_AFTER' );
+ is( $MM->{EXPORT_LIST}, $export, 'EXPORT_LIST' );
}
# canonpath()
@@ -234,52 +246,9 @@ EOSCRIPT
unlink "${script_name}$script_ext" if -f "${script_name}$script_ext";
-# pm_to_blib()
-{
- like( $MM->pm_to_blib(),
- qr/^pm_to_blib: \Q$(TO_INST_PM)\E.+\Q$(TOUCH) \E\$@\s+$/ms,
- 'pm_to_blib' );
-}
-
-# tool_autosplit()
-{
- my %attribs = ( MAXLEN => 255 );
- like( $MM->tool_autosplit( %attribs ),
- qr/^\#\ Usage:\ \$\(AUTOSPLITFILE\)
- \ FileToSplit\ AutoDirToSplitInto.+
- AUTOSPLITFILE\ =\ \$\(PERLRUN\)\ .+
- \$AutoSplit::Maxlen=$attribs{MAXLEN};
- /xms,
- 'tool_autosplit()' );
-}
-
-# tools_other()
-{
- ( my $mm_w32 = bless { }, 'MM' )->init_others();
-
- my $bin_sh = ( $Config{make} =~ /^dmake/i
- ? "" : ($Config{sh} || 'cmd /c') . "\n" );
- $bin_sh = "SHELL = $bin_sh" if $bin_sh;
-
- my $tools = join "\n", map "$_ = $mm_w32->{ $_ }"
- => qw(CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL);
-
- like( $mm_w32->tools_other(),
- qr/^\Q$bin_sh$tools/m,
- 'tools_other()' );
-};
-
# xs_o() should look into that
# top_targets() should look into that
-# manifypods()
-{
- my $mm_w32 = bless { NOECHO => '' }, 'MM';
- like( $mm_w32->manifypods(),
- qr/^\nmanifypods :\n\t\$\Q(NOOP)\E\n$/,
- 'manifypods() Makefile target' );
-}
-
# dist_ci() should look into that
# dist_core() should look into that
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/Manifest.t b/gnu/usr.bin/perl/lib/ExtUtils/t/Manifest.t
index 7a488be0937..215a24b14e4 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/Manifest.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/Manifest.t
@@ -14,7 +14,7 @@ chdir 't';
use strict;
# these files help the test run
-use Test::More tests => 33;
+use Test::More tests => 41;
use Cwd;
# these files are needed for the module itself
@@ -26,14 +26,14 @@ use File::Path;
@INC = map { File::Spec->rel2abs($_) } @INC;
# keep track of everything added so it can all be deleted
-my %files;
+my %Files;
sub add_file {
- my ($file, $data) = @_;
- $data ||= 'foo';
- unlink $file; # or else we'll get multiple versions on VMS
- open( T, '>'.$file) or return;
- print T $data;
- ++$files{$file};
+ my ($file, $data) = @_;
+ $data ||= 'foo';
+ 1 while unlink $file; # or else we'll get multiple versions on VMS
+ open( T, '>'.$file) or return;
+ print T $data;
+ ++$Files{$file};
close T;
}
@@ -58,7 +58,7 @@ sub remove_dir {
BEGIN {
use_ok( 'ExtUtils::Manifest',
qw( mkmanifest manicheck filecheck fullcheck
- maniread manicopy skipcheck ) );
+ maniread manicopy skipcheck maniadd) );
}
my $cwd = Cwd::getcwd();
@@ -127,10 +127,12 @@ ok( exists( ExtUtils::Manifest::manifind()->{'moretest/quux'} ),
"manifind found moretest/quux" );
# only MANIFEST and foo are in the manifest
+$_ = 'foo';
my $files = maniread();
is( keys %$files, 2, 'two files found' );
is( join(' ', sort { lc($a) cmp lc($b) } keys %$files), 'foo MANIFEST',
'both files found' );
+is( $_, 'foo', q{maniread() doesn't clobber $_} );
# poison the manifest, and add a comment that should be reported
add_file( 'MANIFEST', 'none #none' );
@@ -158,7 +160,7 @@ like($warn, qr/^Skipping MANIFEST.SKIP/i, 'warned about MANIFEST.SKIP' );
like( $warn, qr/Added to albatross: /, 'using a new manifest file' );
# add the new file to the list of files to be deleted
- $files{'albatross'}++;
+ $Files{'albatross'}++;
}
@@ -173,21 +175,59 @@ like( $warn, qr{^Skipping moretest/quux$}i, 'got skipping warning again' );
# There was a bug where entries in MANIFEST would be blotted out
# by MANIFEST.SKIP rules.
add_file( 'MANIFEST.SKIP' => 'foo' );
-add_file( 'MANIFEST' => 'foobar' );
+add_file( 'MANIFEST' => "foobar\n" );
add_file( 'foobar' => '123' );
($res, $warn) = catch_warning( \&manicheck );
is( $res, '', 'MANIFEST overrides MANIFEST.SKIP' );
is( $warn, undef, 'MANIFEST overrides MANIFEST.SKIP, no warnings' );
+$files = maniread;
+ok( !$files->{wibble}, 'MANIFEST in good state' );
+maniadd({ wibble => undef });
+maniadd({ yarrow => "hock" });
+$files = maniread;
+is( $files->{wibble}, '', 'maniadd() with undef comment' );
+is( $files->{yarrow}, 'hock',' with comment' );
+is( $files->{foobar}, '', ' preserved old entries' );
+
+add_file('MANIFEST' => 'Makefile.PL');
+maniadd({ foo => 'bar' });
+$files = maniread;
+# VMS downcases the MANIFEST. We normalize it here to match.
+%$files = map { (lc $_ => $files->{$_}) } keys %$files;
+my %expect = ( 'makefile.pl' => '',
+ 'foo' => 'bar'
+ );
+is_deeply( $files, \%expect, 'maniadd() vs MANIFEST without trailing newline');
+
+add_file('MANIFEST' => 'Makefile.PL');
+maniadd({ foo => 'bar' });
+
+SKIP: {
+ chmod( 0400, 'MANIFEST' );
+ skip "Can't make MANIFEST read-only", 2 if -w 'MANIFEST';
+
+ eval {
+ maniadd({ 'foo' => 'bar' });
+ };
+ is( $@, '', "maniadd() won't open MANIFEST if it doesn't need to" );
+
+ eval {
+ maniadd({ 'grrrwoof' => 'yippie' });
+ };
+ like( $@, qr/^\Qmaniadd() could not open MANIFEST:\E/,
+ "maniadd() dies if it can't open the MANIFEST" );
+
+ chmod( 0600, 'MANIFEST' );
+}
+
END {
- # the args are evaluated in scalar context
- is( unlink( keys %files ), keys %files, 'remove all added files' );
+ is( unlink( keys %Files ), keys %Files, 'remove all added files' );
remove_dir( 'moretest', 'copy' );
# now get rid of the parent directory
ok( chdir( $cwd ), 'return to parent directory' );
- unlink('mantest/MANIFEST');
remove_dir( 'mantest' );
}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/basic.t b/gnu/usr.bin/perl/lib/ExtUtils/t/basic.t
index 9080434333c..960a75dfdf9 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/basic.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/basic.t
@@ -14,40 +14,22 @@ BEGIN {
}
use strict;
-use Test::More tests => 17;
+use Config;
+
+use Test::More tests => 73;
use MakeMaker::Test::Utils;
+use File::Find;
use File::Spec;
-use TieOut;
+use File::Path;
-my $perl = which_perl();
+# 'make disttest' sets a bunch of environment variables which interfere
+# with our testing.
+delete @ENV{qw(PREFIX LIB MAKEFLAGS)};
-my $root_dir = 't';
-
-if( $^O eq 'VMS' ) {
- # On older systems we might exceed the 8-level directory depth limit
- # imposed by RMS. We get around this with a rooted logical, but we
- # can't create logical names with attributes in Perl, so we do it
- # in a DCL subprocess and put it in the job table so the parent sees it.
- open( BFDTMP, '>bfdtesttmp.com' ) || die "Error creating command file; $!";
- print BFDTMP <<'COMMAND';
-$ IF F$TRNLNM("PERL_CORE") .EQS. "" .AND. F$TYPE(PERL_CORE) .EQS. ""
-$ THEN
-$! building CPAN version
-$ BFD_TEST_ROOT = F$PARSE("SYS$DISK:[]",,,,"NO_CONCEAL")-".][000000"-"]["-"].;"+".]"
-$ ELSE
-$! we're in the core
-$ BFD_TEST_ROOT = F$PARSE("SYS$DISK:[-]",,,,"NO_CONCEAL")-".][000000"-"]["-"].;"+".]"
-$ ENDIF
-$ DEFINE/JOB/NOLOG/TRANSLATION=CONCEALED BFD_TEST_ROOT 'BFD_TEST_ROOT'
-COMMAND
- close BFDTMP;
-
- system '@bfdtesttmp.com';
- END { 1 while unlink 'bfdtesttmp.com' }
- $root_dir = 'BFD_TEST_ROOT:[t]';
-}
+my $perl = which_perl();
+my $Is_VMS = $^O eq 'VMS';
-chdir $root_dir;
+chdir($Is_VMS ? 'BFD_TEST_ROOT:[t]' : 't');
perl_lib;
@@ -56,10 +38,11 @@ my $Touch_Time = calibrate_mtime();
$| = 1;
-ok( chdir 'Big-Dummy', "chdir'd to Big-Dummy" ) ||
+ok( chdir('Big-Dummy'), "chdir'd to Big-Dummy" ) ||
diag("chdir failed: $!");
-my @mpl_out = `$perl Makefile.PL PREFIX=dummy-install`;
+my @mpl_out = run(qq{$perl Makefile.PL "PREFIX=../dummy-install"});
+END { rmtree '../dummy-install'; }
cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
diag(@mpl_out);
@@ -86,36 +69,188 @@ my $make = make_run();
{
# Supress 'make manifest' noise
local $ENV{PERL_MM_MANIFEST_VERBOSE} = 0;
- my $manifest_out = `$make manifest`;
+ my $manifest_out = run("$make manifest");
ok( -e 'MANIFEST', 'make manifest created a MANIFEST' );
ok( -s 'MANIFEST', ' its not empty' );
}
END { unlink 'MANIFEST'; }
-my $test_out = `$make test`;
+
+my $ppd_out = run("$make ppd");
+is( $?, 0, ' exited normally' ) || diag $ppd_out;
+ok( open(PPD, 'Big-Dummy.ppd'), ' .ppd file generated' );
+my $ppd_html;
+{ local $/; $ppd_html = <PPD> }
+close PPD;
+like( $ppd_html, qr{^<SOFTPKG NAME="Big-Dummy" VERSION="0,01,0,0">}m,
+ ' <SOFTPKG>' );
+like( $ppd_html, qr{^\s*<TITLE>Big-Dummy</TITLE>}m, ' <TITLE>' );
+like( $ppd_html, qr{^\s*<ABSTRACT>Try "our" hot dog's</ABSTRACT>}m,
+ ' <ABSTRACT>');
+like( $ppd_html,
+ qr{^\s*<AUTHOR>Michael G Schwern &lt;schwern\@pobox.com&gt;</AUTHOR>}m,
+ ' <AUTHOR>' );
+like( $ppd_html, qr{^\s*<IMPLEMENTATION>}m, ' <IMPLEMENTATION>');
+like( $ppd_html, qr{^\s*<DEPENDENCY NAME="strict" VERSION="0,0,0,0" />}m,
+ ' <DEPENDENCY>' );
+like( $ppd_html, qr{^\s*<OS NAME="$Config{osname}" />}m,
+ ' <OS>' );
+like( $ppd_html, qr{^\s*<ARCHITECTURE NAME="$Config{archname}" />}m,
+ ' <ARCHITECTURE>');
+like( $ppd_html, qr{^\s*<CODEBASE HREF="" />}m, ' <CODEBASE>');
+like( $ppd_html, qr{^\s*</IMPLEMENTATION>}m, ' </IMPLEMENTATION>');
+like( $ppd_html, qr{^\s*</SOFTPKG>}m, ' </SOFTPKG>');
+END { unlink 'Big-Dummy.ppd' }
+
+
+my $test_out = run("$make test");
like( $test_out, qr/All tests successful/, 'make test' );
-is( $?, 0 );
+is( $?, 0, ' exited normally' ) ||
+ diag $test_out;
# Test 'make test TEST_VERBOSE=1'
my $make_test_verbose = make_macro($make, 'test', TEST_VERBOSE => 1);
-$test_out = `$make_test_verbose`;
+$test_out = run("$make_test_verbose");
like( $test_out, qr/ok \d+ - TEST_VERBOSE/, 'TEST_VERBOSE' );
-like( $test_out, qr/All tests successful/, ' successful' );
-is( $?, 0 );
+like( $test_out, qr/All tests successful/, ' successful' );
+is( $?, 0, ' exited normally' ) ||
+ diag $test_out;
+
+
+my $install_out = run("$make install");
+is( $?, 0, 'install' ) || diag $install_out;
+like( $install_out, qr/^Installing /m );
+like( $install_out, qr/^Writing /m );
+
+ok( -r '../dummy-install', ' install dir created' );
+my %files = ();
+find( sub {
+ # do it case-insensitive for non-case preserving OSs
+ $files{lc $_} = $File::Find::name;
+}, '../dummy-install' );
+ok( $files{'dummy.pm'}, ' Dummy.pm installed' );
+ok( $files{'liar.pm'}, ' Liar.pm installed' );
+ok( $files{'.packlist'}, ' packlist created' );
+ok( $files{'perllocal.pod'},' perllocal.pod created' );
+
+
+SKIP: {
+ skip "VMS install targets do not preserve $(PREFIX)", 8 if $Is_VMS;
+
+ $install_out = run("$make install PREFIX=elsewhere");
+ is( $?, 0, 'install with PREFIX override' ) || diag $install_out;
+ like( $install_out, qr/^Installing /m );
+ like( $install_out, qr/^Writing /m );
+
+ ok( -r 'elsewhere', ' install dir created' );
+ %files = ();
+ find( sub { $files{$_} = $File::Find::name; }, 'elsewhere' );
+ ok( $files{'Dummy.pm'}, ' Dummy.pm installed' );
+ ok( $files{'Liar.pm'}, ' Liar.pm installed' );
+ ok( $files{'.packlist'}, ' packlist created' );
+ ok( $files{'perllocal.pod'},' perllocal.pod created' );
+ rmtree('elsewhere');
+}
+
+
+SKIP: {
+ skip "VMS install targets do not preserve $(DESTDIR)", 10 if $Is_VMS;
+
+ $install_out = run("$make install PREFIX= DESTDIR=other");
+ is( $?, 0, 'install with DESTDIR' ) ||
+ diag $install_out;
+ like( $install_out, qr/^Installing /m );
+ like( $install_out, qr/^Writing /m );
+
+ ok( -d 'other', ' destdir created' );
+ %files = ();
+ my $perllocal;
+ find( sub {
+ $files{$_} = $File::Find::name;
+ }, 'other' );
+ ok( $files{'Dummy.pm'}, ' Dummy.pm installed' );
+ ok( $files{'Liar.pm'}, ' Liar.pm installed' );
+ ok( $files{'.packlist'}, ' packlist created' );
+ ok( $files{'perllocal.pod'},' perllocal.pod created' );
+
+ ok( open(PERLLOCAL, $files{'perllocal.pod'} ) ) ||
+ diag("Can't open $files{'perllocal.pod'}: $!");
+ { local $/;
+ unlike(<PERLLOCAL>, qr/other/, 'DESTDIR should not appear in perllocal');
+ }
+ close PERLLOCAL;
+
+# TODO not available in the min version of Test::Harness we require
+# ok( open(PACKLIST, $files{'.packlist'} ) ) ||
+# diag("Can't open $files{'.packlist'}: $!");
+# { local $/;
+# local $TODO = 'DESTDIR still in .packlist';
+# unlike(<PACKLIST>, qr/other/, 'DESTDIR should not appear in .packlist');
+# }
+# close PACKLIST;
+
+ rmtree('other');
+}
+
+
+SKIP: {
+ skip "VMS install targets do not preserve $(PREFIX)", 9 if $Is_VMS;
+
+ $install_out = run("$make install PREFIX=elsewhere DESTDIR=other/");
+ is( $?, 0, 'install with PREFIX override and DESTDIR' ) ||
+ diag $install_out;
+ like( $install_out, qr/^Installing /m );
+ like( $install_out, qr/^Writing /m );
+
+ ok( !-d 'elsewhere', ' install dir not created' );
+ ok( -d 'other/elsewhere', ' destdir created' );
+ %files = ();
+ find( sub { $files{$_} = $File::Find::name; }, 'other/elsewhere' );
+ ok( $files{'Dummy.pm'}, ' Dummy.pm installed' );
+ ok( $files{'Liar.pm'}, ' Liar.pm installed' );
+ ok( $files{'.packlist'}, ' packlist created' );
+ ok( $files{'perllocal.pod'},' perllocal.pod created' );
+ rmtree('other');
+}
+
-my $dist_test_out = `$make disttest`;
+my $dist_test_out = run("$make disttest");
is( $?, 0, 'disttest' ) || diag($dist_test_out);
+# Test META.yml generation
+use ExtUtils::Manifest qw(maniread);
+ok( -f 'META.yml', 'META.yml written' );
+my $manifest = maniread();
+# VMS is non-case preserving, so we can't know what the MANIFEST will
+# look like. :(
+_normalize($manifest);
+is( $manifest->{'meta.yml'}, 'Module meta-data (added by MakeMaker)' );
+
+# Test NO_META META.yml suppression
+unlink 'META.yml';
+ok( !-f 'META.yml', 'META.yml deleted' );
+@mpl_out = run(qq{$perl Makefile.PL "NO_META=1"});
+cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) || diag(@mpl_out);
+my $metafile_out = run("$make metafile");
+is( $?, 0, 'metafile' ) || diag($metafile_out);
+ok( !-f 'META.yml', 'META.yml generation suppressed by NO_META' );
+
+# Test if MANIFEST is read-only.
+chmod 0444, 'MANIFEST';
+@mpl_out = run(qq{$perl Makefile.PL});
+cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) || diag(@mpl_out);
+$metafile_out = run("$make metafile_addtomanifest");
+is( $?, 0, q{metafile_addtomanifest didn't die with locked MANIFEST} ) ||
+ diag($metafile_out);
+
# Make sure init_dirscan doesn't go into the distdir
-@mpl_out = `$perl Makefile.PL "PREFIX=dummy-install"`;
+@mpl_out = run(qq{$perl Makefile.PL "PREFIX=../dummy-install"});
-cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
- diag(@mpl_out);
+cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) || diag(@mpl_out);
-ok( grep(/^Writing $makefile for Big::Dummy/,
- @mpl_out) == 1,
+ok( grep(/^Writing $makefile for Big::Dummy/, @mpl_out) == 1,
'init_dirscan skipped distdir') ||
diag(@mpl_out);
@@ -124,8 +259,18 @@ ok( grep(/^Writing $makefile for Big::Dummy/,
open(SAVERR, ">&STDERR") or die $!;
open(STDERR, ">".File::Spec->devnull) or die $!;
-my $realclean_out = `$make realclean`;
+my $realclean_out = run("$make realclean");
is( $?, 0, 'realclean' ) || diag($realclean_out);
open(STDERR, ">&SAVERR") or die $!;
close SAVERR;
+
+
+sub _normalize {
+ my $hash = shift;
+
+ while(my($k,$v) = each %$hash) {
+ delete $hash->{$k};
+ $hash->{lc $k} = $v;
+ }
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/bytes.t b/gnu/usr.bin/perl/lib/ExtUtils/t/bytes.t
new file mode 100644
index 00000000000..e566831cc21
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/bytes.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 4;
+
+use_ok('ExtUtils::MakeMaker::bytes');
+
+SKIP: {
+ skip "bytes.pm appeared in 5.6", 3 if $] < 5.006;
+
+ my $chr = chr(400);
+ is( length $chr, 1 );
+
+ {
+ use ExtUtils::MakeMaker::bytes;
+ is( length $chr, 2, 'byte.pm in effect' );
+ }
+
+ is( length $chr, 1, ' score is lexical' );
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/hints.t b/gnu/usr.bin/perl/lib/ExtUtils/t/hints.t
index 62608d7bbb6..b74690fe0ab 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/hints.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/hints.t
@@ -11,10 +11,16 @@ BEGIN {
}
chdir 't';
+use File::Spec;
+
use Test::More tests => 3;
+# Having the CWD in @INC masked a bug in finding hint files
+my $curdir = File::Spec->curdir;
+@INC = grep { $_ ne $curdir && $_ ne '.' } @INC;
+
mkdir('hints', 0777);
-my $hint_file = "hints/$^O.pl";
+my $hint_file = File::Spec->catfile('hints', "$^O.pl");
open(HINT, ">$hint_file") || die "Can't write dummy hints file $hint_file: $!";
print HINT <<'CLOO';
$self->{CCFLAGS} = 'basset hounds got long ears';
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/oneliner.t b/gnu/usr.bin/perl/lib/ExtUtils/t/oneliner.t
new file mode 100644
index 00000000000..5e0521b45f4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/oneliner.t
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+chdir 't';
+
+use MakeMaker::Test::Utils;
+use Test::More tests => 6;
+use File::Spec;
+
+my $TB = Test::More->builder;
+
+BEGIN { use_ok('ExtUtils::MM') }
+
+my $mm = bless { NAME => "Foo" }, 'MM';
+isa_ok($mm, 'ExtUtils::MakeMaker');
+isa_ok($mm, 'ExtUtils::MM_Any');
+
+
+sub try_oneliner {
+ my($code, $switches, $expect, $name) = @_;
+ my $cmd = $mm->oneliner($code, $switches);
+ $cmd =~ s{\$\(PERLRUN\)}{$^X};
+
+ # VMS likes to put newlines at the end of commands if there isn't
+ # one already.
+ $expect =~ s/([^\n])\z/$1\n/ if $^O eq 'VMS';
+
+ $TB->is_eq(scalar `$cmd`, $expect, $name) || $TB->diag("oneliner:\n$cmd");
+}
+
+# Lets see how it deals with quotes.
+try_oneliner(q{print "foo'o", ' bar"ar'}, [], q{foo'o bar"ar}, 'quotes');
+
+# How about dollar signs?
+try_oneliner(q{$PATH = 'foo'; print $PATH},[], q{foo}, 'dollar signs' );
+
+# switches?
+try_oneliner(q{print 'foo'}, ['-l'], "foo\n", 'switches' );
+
+# XXX gotta rethink the newline test. The Makefile does newline
+# escaping, then the shell.
+
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/postamble.t b/gnu/usr.bin/perl/lib/ExtUtils/t/postamble.t
new file mode 100644
index 00000000000..b8c049277fc
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/postamble.t
@@ -0,0 +1,65 @@
+#!/usr/bin/perl -w
+
+# Wherein we ensure that postamble works ok.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 5;
+use MakeMaker::Test::Utils;
+use ExtUtils::MakeMaker;
+use TieOut;
+
+chdir 't';
+perl_lib;
+$| = 1;
+
+my $Makefile = makefile_name;
+
+ok( chdir 'Big-Dummy', q{chdir'd to Big-Dummy} ) ||
+ diag("chdir failed: $!");
+
+{
+ my $warnings = '';
+ local $SIG{__WARN__} = sub {
+ $warnings = join '', @_;
+ };
+
+ my $stdout = tie *STDOUT, 'TieOut' or die;
+ my $mm = WriteMakefile(
+ NAME => 'Big::Dummy',
+ VERSION_FROM => 'lib/Big/Dummy.pm',
+ postamble => {
+ FOO => 1,
+ BAR => "fugawazads"
+ }
+ );
+ is( $warnings, '', 'postamble argument not warned about' );
+}
+
+sub MY::postamble {
+ my($self, %extra) = @_;
+
+ is_deeply( \%extra, { FOO => 1, BAR => 'fugawazads' },
+ 'postamble args passed' );
+
+ return <<OUT;
+# This makes sure the postamble gets written
+OUT
+
+}
+
+
+ok( open(MAKEFILE, $Makefile) ) or diag "Can't open $Makefile: $!";
+{ local $/;
+ like( <MAKEFILE>, qr/^\# This makes sure the postamble gets written\n/m,
+ 'postamble added to the Makefile' );
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/prefixify.t b/gnu/usr.bin/perl/lib/ExtUtils/t/prefixify.t
index 0f92a4a8b24..644bc00e8aa 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/prefixify.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/prefixify.t
@@ -17,18 +17,24 @@ if( $^O eq 'VMS' ) {
plan skip_all => 'prefixify works differently on VMS';
}
else {
- plan tests => 2;
+ plan tests => 3;
}
+use Config;
use File::Spec;
use ExtUtils::MM;
my $mm = bless {}, 'MM';
my $default = File::Spec->catdir(qw(this that));
+
$mm->prefixify('installbin', 'wibble', 'something', $default);
+is( $mm->{INSTALLBIN}, $Config{installbin},
+ 'prefixify w/defaults');
+$mm->{ARGS}{PREFIX} = 'foo';
+$mm->prefixify('installbin', 'wibble', 'something', $default);
is( $mm->{INSTALLBIN}, File::Spec->catdir('something', $default),
- 'prefixify w/defaults');
+ 'prefixify w/defaults and PREFIX');
{
undef *ExtUtils::MM_Unix::Config;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/prereq_print.t b/gnu/usr.bin/perl/lib/ExtUtils/t/prereq_print.t
new file mode 100644
index 00000000000..78dc6e8e1f3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/prereq_print.t
@@ -0,0 +1,66 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Config;
+
+use Test::More tests => 8;
+use MakeMaker::Test::Utils;
+
+# 'make disttest' sets a bunch of environment variables which interfere
+# with our testing.
+delete @ENV{qw(PREFIX LIB MAKEFLAGS)};
+
+my $Perl = which_perl();
+my $Makefile = makefile_name();
+my $Is_VMS = $^O eq 'VMS';
+
+chdir($Is_VMS ? 'BFD_TEST_ROOT:[t]' : 't');
+perl_lib;
+
+$| = 1;
+
+ok( chdir('Big-Dummy'), "chdir'd to Big-Dummy" ) ||
+ diag("chdir failed: $!");
+
+unlink $Makefile;
+my $prereq_out = run(qq{$Perl Makefile.PL "PREREQ_PRINT=1"});
+ok( !-r $Makefile, "PREREQ_PRINT produces no $Makefile" );
+is( $?, 0, ' exited normally' );
+{
+ package _Prereq::Print;
+ no strict;
+ $PREREQ_PM = undef; # shut up "used only once" warning.
+ eval $prereq_out;
+ ::is_deeply( $PREREQ_PM, { strict => 0 }, 'prereqs dumped' );
+ ::is( $@, '', ' without error' );
+}
+
+
+$prereq_out = run(qq{$Perl Makefile.PL "PRINT_PREREQ=1"});
+ok( !-r $Makefile, "PRINT_PREREQ produces no $Makefile" );
+is( $?, 0, ' exited normally' );
+::like( $prereq_out, qr/^perl\(strict\) \s* >= \s* 0 \s*$/x,
+ 'prereqs dumped' );
+
+
+# Currently a bug.
+#my $prereq_out = run(qq{$Perl Makefile.PL "PREREQ_PRINT=0"});
+#ok( -r $Makefile, "PREREQ_PRINT=0 produces a $Makefile" );
+#is( $?, 0, ' exited normally' );
+#unlink $Makefile;
+
+# Currently a bug.
+#my $prereq_out = run(qq{$Perl Makefile.PL "PRINT_PREREQ=1"});
+#ok( -r $Makefile, "PRINT_PREREQ=0 produces a $Makefile" );
+#is( $?, 0, ' exited normally' );
+#unlink $Makefile;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/prompt.t b/gnu/usr.bin/perl/lib/ExtUtils/t/prompt.t
new file mode 100644
index 00000000000..ec9aa10036e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/prompt.t
@@ -0,0 +1,56 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 11;
+use ExtUtils::MakeMaker;
+use TieOut;
+use TieIn;
+
+eval q{
+ prompt();
+};
+like( $@, qr/^Not enough arguments for ExtUtils::MakeMaker::prompt/,
+ 'no args' );
+
+eval {
+ prompt(undef);
+};
+like( $@, qr/^prompt function called without an argument/,
+ 'undef message' );
+
+my $stdout = tie *STDOUT, 'TieOut' or die;
+
+
+$ENV{PERL_MM_USE_DEFAULT} = 1;
+is( prompt("Foo?"), '', 'no default' );
+like( $stdout->read, qr/^Foo\?\s*\n$/, ' question' );
+
+is( prompt("Foo?", undef), '', 'undef default' );
+like( $stdout->read, qr/^Foo\?\s*\n$/, ' question' );
+
+is( prompt("Foo?", 'Bar!'), 'Bar!', 'default' );
+like( $stdout->read, qr/^Foo\? \[Bar!\]\s+Bar!\n$/, ' question' );
+
+
+SKIP: {
+ skip "eof() doesn't honor ties in 5.5.3", 3 if $] < 5.006;
+
+ $ENV{PERL_MM_USE_DEFAULT} = 0;
+ close STDIN;
+ my $stdin = tie *STDIN, 'TieIn' or die;
+ $stdin->write("From STDIN");
+ ok( !-t STDIN, 'STDIN not a tty' );
+
+ is( prompt("Foo?", 'Bar!'), 'From STDIN', 'from STDIN' );
+ like( $stdout->read, qr/^Foo\? \[Bar!\]\s*$/, ' question' );
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/recurs.t b/gnu/usr.bin/perl/lib/ExtUtils/t/recurs.t
new file mode 100644
index 00000000000..9ec4f4ce28c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/recurs.t
@@ -0,0 +1,113 @@
+#!/usr/bin/perl -w
+
+# This tests MakeMaker against recursive builds
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Config;
+
+use Test::More tests => 25;
+use MakeMaker::Test::Utils;
+use MakeMaker::Test::Setup::Recurs;
+
+# 'make disttest' sets a bunch of environment variables which interfere
+# with our testing.
+delete @ENV{qw(PREFIX LIB MAKEFLAGS)};
+
+my $perl = which_perl();
+my $Is_VMS = $^O eq 'VMS';
+
+chdir('t');
+
+perl_lib;
+
+my $Touch_Time = calibrate_mtime();
+
+$| = 1;
+
+ok( setup_recurs(), 'setup' );
+END {
+ ok( chdir File::Spec->updir );
+ ok( teardown_recurs(), 'teardown' );
+}
+
+ok( chdir('Recurs'), q{chdir'd to Recurs} ) ||
+ diag("chdir failed: $!");
+
+
+# Check recursive Makefile building.
+my @mpl_out = run(qq{$perl Makefile.PL});
+
+cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
+ diag(@mpl_out);
+
+my $makefile = makefile_name();
+
+ok( -e $makefile, 'Makefile written' );
+ok( -e File::Spec->catfile('prj2',$makefile), 'sub Makefile written' );
+
+my $make = make_run();
+
+run("$make");
+is( $?, 0, 'recursive make exited normally' );
+
+ok( chdir File::Spec->updir );
+ok( teardown_recurs(), 'cleaning out recurs' );
+ok( setup_recurs(), ' setting up fresh copy' );
+ok( chdir('Recurs'), q{chdir'd to Recurs} ) ||
+ diag("chdir failed: $!");
+
+
+# Check NORECURS
+@mpl_out = run(qq{$perl Makefile.PL "NORECURS=1"});
+
+cmp_ok( $?, '==', 0, 'Makefile.PL NORECURS=1 exited with zero' ) ||
+ diag(@mpl_out);
+
+$makefile = makefile_name();
+
+ok( -e $makefile, 'Makefile written' );
+ok( !-e File::Spec->catfile('prj2',$makefile), 'sub Makefile not written' );
+
+$make = make_run();
+
+run("$make");
+is( $?, 0, 'recursive make exited normally' );
+
+
+ok( chdir File::Spec->updir );
+ok( teardown_recurs(), 'cleaning out recurs' );
+ok( setup_recurs(), ' setting up fresh copy' );
+ok( chdir('Recurs'), q{chdir'd to Recurs} ) ||
+ diag("chdir failed: $!");
+
+
+# Check that arguments aren't stomped when they have .. prepended
+# [rt.perl.org 4345]
+@mpl_out = run(qq{$perl Makefile.PL "INST_SCRIPT=cgi"});
+
+cmp_ok( $?, '==', 0, 'Makefile.PL exited with zero' ) ||
+ diag(@mpl_out);
+
+$makefile = makefile_name();
+my $submakefile = File::Spec->catfile('prj2',$makefile);
+
+ok( -e $makefile, 'Makefile written' );
+ok( -e $submakefile, 'sub Makefile written' );
+
+my $inst_script = File::Spec->catdir(File::Spec->updir, 'cgi');
+ok( open(MAKEFILE, $submakefile) ) || diag("Can't open $submakefile: $!");
+{ local $/;
+ like( <MAKEFILE>, qr/^\s*INST_SCRIPT\s*=\s*\Q$inst_script\E/m,
+ 'prepend .. not stomping WriteMakefile args' )
+}
+close MAKEFILE;
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/split_command.t b/gnu/usr.bin/perl/lib/ExtUtils/t/split_command.t
new file mode 100644
index 00000000000..49e2629cfbf
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/split_command.t
@@ -0,0 +1,66 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+chdir 't';
+
+use ExtUtils::MM;
+use MakeMaker::Test::Utils;
+
+my $Is_VMS = $^O eq 'VMS';
+my $Is_Win32 = $^O eq 'MSWin32';
+
+use Test::More tests => 7;
+
+my $perl = which_perl;
+my $mm = bless { NAME => "Foo" }, "MM";
+
+# I don't expect anything to have a length shorter than 256 chars.
+cmp_ok( $mm->max_exec_len, '>=', 256, 'max_exec_len' );
+
+my $echo = $mm->oneliner(q{print @ARGV}, ['-l']);
+
+# Force a short command length to make testing split_command easier.
+$mm->{_MAX_EXEC_LEN} = length($echo) + 15;
+is( $mm->max_exec_len, $mm->{_MAX_EXEC_LEN}, ' forced a short max_exec_len' );
+
+my @test_args = qw(foo bar baz yar car har ackapicklerootyjamboree);
+my @cmds = $mm->split_command($echo, @test_args);
+isnt( @cmds, 0 );
+
+@results = _run(@cmds);
+is( join('', @results), join('', @test_args));
+
+
+my %test_args = ( foo => 42, bar => 23, car => 'har' );
+$even_args = $mm->oneliner(q{print !(@ARGV % 2)});
+@cmds = $mm->split_command($even_args, %test_args);
+isnt( @cmds, 0 );
+
+@results = _run(@cmds);
+like( join('', @results ), qr/^1+$/, 'pairs preserved' );
+
+is( $mm->split_command($echo), 0, 'no args means no commands' );
+
+
+sub _run {
+ my @cmds = @_;
+
+ s{\$\(PERLRUN\)}{$perl} foreach @cmds;
+ if( $Is_VMS ) {
+ s{-\n}{} foreach @cmds
+ }
+ elsif( $Is_Win32 ) {
+ s{\\\n}{} foreach @cmds;
+ }
+
+ return map { s/\n+$//; $_ } map { `$_` } @cmds
+}
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/vmsish.t b/gnu/usr.bin/perl/lib/ExtUtils/t/vmsish.t
new file mode 100644
index 00000000000..6195a0d5c11
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/vmsish.t
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't' if -d 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+use Test::More tests => 1;
+
+use_ok('ExtUtils::MakeMaker::vmsish');
+
diff --git a/gnu/usr.bin/perl/lib/ExtUtils/t/zz_cleanup_dummy.t b/gnu/usr.bin/perl/lib/ExtUtils/t/zz_cleanup_dummy.t
index 69738445966..1b01f0a5d02 100644
--- a/gnu/usr.bin/perl/lib/ExtUtils/t/zz_cleanup_dummy.t
+++ b/gnu/usr.bin/perl/lib/ExtUtils/t/zz_cleanup_dummy.t
@@ -8,14 +8,16 @@ BEGIN {
unshift @INC, 't/lib';
}
}
-chdir 't';
+chdir($^O eq 'VMS' ? 'BFD_TEST_ROOT:[t]' : 't');
use strict;
-use Test::More tests => 2;
+use Test::More tests => 3;
use File::Path;
rmtree('Big-Dummy');
ok(!-d 'Big-Dummy', 'Big-Dummy cleaned up');
rmtree('Problem-Module');
ok(!-d 'Problem-Module', 'Problem-Module cleaned up');
+rmtree('dummy-install');
+ok(!-d 'dummy-install', 'dummy-install cleaned up');
diff --git a/gnu/usr.bin/perl/lib/File/Find/t/find.t b/gnu/usr.bin/perl/lib/File/Find/t/find.t
index c28183348f3..c55b4a9aac0 100644
--- a/gnu/usr.bin/perl/lib/File/Find/t/find.t
+++ b/gnu/usr.bin/perl/lib/File/Find/t/find.t
@@ -15,8 +15,8 @@ BEGIN {
$SIG{'__WARN__'} = sub { $warn_msg = $_[0]; warn "# $_[0]"; }
}
-if ( $symlink_exists ) { print "1..188\n"; }
-else { print "1..78\n"; }
+if ( $symlink_exists ) { print "1..189\n"; }
+else { print "1..79\n"; }
# Uncomment this to see where File::Find is chdir'ing to. Helpful for
# debugging its little jaunts around the filesystem.
@@ -51,12 +51,23 @@ BEGIN {
cleanup();
-find({wanted => sub { print "ok 1\n" if $_ eq 'commonsense.t'; } },
+$::count_commonsense = 0;
+find({wanted => sub { ++$::count_commonsense if $_ eq 'commonsense.t'; } },
File::Spec->curdir);
+if ($::count_commonsense == 1) {
+ print "ok 1\n";
+} else {
+ print "not ok 1 # found $::count_commonsense files named 'commonsense.t'\n";
+}
-finddepth({wanted => sub { print "ok 2\n" if $_ eq 'commonsense.t'; } },
+$::count_commonsense = 0;
+finddepth({wanted => sub { ++$::count_commonsense if $_ eq 'commonsense.t'; } },
File::Spec->curdir);
-
+if ($::count_commonsense == 1) {
+ print "ok 2\n";
+} else {
+ print "not ok 2 # found $::count_commonsense files named 'commonsense.t'\n";
+}
my $case = 2;
my $FastFileTests_OK = 0;
@@ -473,6 +484,18 @@ File::Find::find( {wanted => \&noop_wanted,
Check( scalar(keys %Expect_Dir) == 0 );
+{
+ print "# checking argument localization\n";
+
+ ### this checks the fix of perlbug [19977] ###
+ my @foo = qw( a b c d e f );
+ my %pre = map { $_ => } @foo;
+
+ File::Find::find( sub { } , 'fa' ) for @foo;
+ delete $pre{$_} for @foo;
+
+ Check( scalar( keys %pre ) == 0 );
+}
if ( $symlink_exists ) {
print "# --- symbolic link tests --- \n";
@@ -750,5 +773,4 @@ if ( $symlink_exists ) {
Check( scalar(keys %Expect_File) == 0 );
unlink file_path('fa', 'faa_sl');
-}
-
+}
diff --git a/gnu/usr.bin/perl/lib/File/Path.t b/gnu/usr.bin/perl/lib/File/Path.t
index 86b280dc198..84575d707e7 100644
--- a/gnu/usr.bin/perl/lib/File/Path.t
+++ b/gnu/usr.bin/perl/lib/File/Path.t
@@ -17,14 +17,14 @@ print "1..4\n";
# first check for stupid permissions second for full, so we clean up
# behind ourselves
for my $perm (0111,0777) {
- my $path = catdir(curdir(), "foo", "bar");
+ my $path = catdir(curdir(), "mhx", "bar");
mkpath($path);
- chmod $perm, "foo", $path;
+ chmod $perm, "mhx", $path;
- print "not " unless -d "foo" && -d $path;
+ print "not " unless -d "mhx" && -d $path;
print "ok ", ++$count, "\n";
- rmtree("foo");
- print "not " if -e "foo";
+ rmtree("mhx");
+ print "not " if -e "mhx";
print "ok ", ++$count, "\n";
}
diff --git a/gnu/usr.bin/perl/lib/File/Spec.pm b/gnu/usr.bin/perl/lib/File/Spec.pm
index 529e34fe84a..a0f5752a0b9 100644
--- a/gnu/usr.bin/perl/lib/File/Spec.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec.pm
@@ -1,9 +1,9 @@
package File::Spec;
use strict;
-our(@ISA, $VERSION);
+use vars qw(@ISA $VERSION);
-$VERSION = 0.83 ;
+$VERSION = '0.86';
my %module = (MacOS => 'Mac',
MSWin32 => 'Win32',
@@ -125,10 +125,10 @@ Returns a string representation of the root directory.
=item tmpdir
Returns a string representation of the first writable directory from a
-list of possible temporary directories. Returns "" if no writable
-temporary directories are found. The list of directories checked
-depends on the platform; e.g. File::Spec::Unix checks $ENV{TMPDIR} and
-/tmp.
+list of possible temporary directories. Returns the current directory
+if no writable temporary directories are found. The list of directories
+checked depends on the platform; e.g. File::Spec::Unix checks $ENV{TMPDIR}
+(unless taint is on) and /tmp.
$tmpdir = File::Spec->tmpdir();
@@ -164,7 +164,8 @@ Mac OS (Classic). It does consult the working environment for VMS
=item path
-Takes no argument, returns the environment variable PATH as an array.
+Takes no argument, returns the environment variable PATH (or the local
+platform's equivalent) as a list.
@PATH = File::Spec->path();
@@ -175,7 +176,7 @@ join is the same as catfile.
=item splitpath
Splits a path in to volume, directory, and filename portions. On systems
-with no concept of volume, returns undef for volume.
+with no concept of volume, returns '' for volume.
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
@@ -207,7 +208,7 @@ on some OSs.
=item catpath()
Takes volume, directory and file portions and returns an entire path. Under
-Unix, $volume is ignored, and directory and file are catenated. A '/' is
+Unix, $volume is ignored, and directory and file are concatenated. A '/' is
inserted if need be. On other OSs, $volume is significant.
$full_path = File::Spec->catpath( $volume, $directory, $file );
@@ -220,12 +221,16 @@ from the base path to the destination path:
$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;
-If $base is not present or '', then L<cwd()|Cwd> is used. If $base is relative,
-then it is converted to absolute form using L</rel2abs()>. This means that it
-is taken to be relative to L<cwd()|Cwd>.
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
-On systems with the concept of a volume, this assumes that both paths
-are on the $destination volume, and ignores the $base volume.
+On systems with the concept of volume, if $path and $base appear to be
+on two different volumes, we will not attempt to resolve the two
+paths, and we will instead simply return $path. Note that previous
+versions of this module ignored the volume of $base, which resulted in
+garbage results part of the time.
On systems that have a grammar that indicates filenames, this ignores the
$base filename as well. Otherwise all path components are assumed to be
@@ -251,8 +256,11 @@ If $base is not present or '', then L<cwd()|Cwd> is used. If $base is relative,
then it is converted to absolute form using L</rel2abs()>. This means that it
is taken to be relative to L<cwd()|Cwd>.
-On systems with the concept of a volume, this assumes that both paths
-are on the $base volume, and ignores the $path volume.
+On systems with the concept of volume, if $path and $base appear to be
+on two different volumes, we will not attempt to resolve the two
+paths, and we will instead simply return $path. Note that previous
+versions of this module ignored the volume of $base, which resulted in
+garbage results part of the time.
On systems that have a grammar that indicates filenames, this ignores the
$base filename as well. Otherwise all path components are assumed to be
@@ -281,7 +289,7 @@ L<ExtUtils::MakeMaker>
=head1 AUTHORS
Kenneth Albanowski <kjahds@kjahds.com>, Andy Dougherty
-<doughera@lafcol.lafayette.edu>, Andreas KE<ouml>nig
+<doughera@lafayette.edu>, Andreas KE<ouml>nig
<A.Koenig@franz.ww.TU-Berlin.DE>, Tim Bunce <Tim.Bunce@ig.co.uk.
VMS support by Charles Bailey <bailey@newman.upenn.edu>.
OS/2 support by Ilya Zakharevich <ilya@math.ohio-state.edu>.
@@ -290,3 +298,5 @@ Mac support by Paul Schinder <schinder@pobox.com>, and Thomas Wegner
Yamaguchi <shigio@tamacom.com>, modified by Barrie Slaymaker
<barries@slaysys.com>. splitpath(), splitdir(), catpath() and
catdir() by Barrie Slaymaker.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Cygwin.pm b/gnu/usr.bin/perl/lib/File/Spec/Cygwin.pm
index 877328898dd..0712add8e6a 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Cygwin.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Cygwin.pm
@@ -4,38 +4,84 @@ use strict;
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '1.0';
+$VERSION = '1.1';
@ISA = qw(File::Spec::Unix);
+=head1 NAME
+
+File::Spec::Cygwin - methods for Cygwin file specs
+
+=head1 SYNOPSIS
+
+ require File::Spec::Cygwin; # Done internally by File::Spec if needed
+
+=head1 DESCRIPTION
+
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+This module is still in beta. Cygwin-knowledgeable folks are invited
+to offer patches and suggestions.
+
+=cut
+
+=pod
+
+=over 4
+
+=item canonpath
+
+Any C<\> (backslashes) are converted to C</> (forward slashes),
+and then File::Spec::Unix canonpath() is called on the result.
+
+=cut
+
sub canonpath {
my($self,$path) = @_;
$path =~ s|\\|/|g;
return $self->SUPER::canonpath($path);
}
+=pod
+
+=item file_name_is_absolute
+
+True is returned if the file name begins with C<drive_letter:>,
+and if not, File::Spec::Unix file_name_is_absolute() is called.
+
+=cut
+
+
sub file_name_is_absolute {
my ($self,$file) = @_;
return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test
return $self->SUPER::file_name_is_absolute($file);
}
-1;
-__END__
+=item tmpdir (override)
-=head1 NAME
+Returns a string representation of the first existing directory
+from the following list:
-File::Spec::Cygwin - methods for Cygwin file specs
+ $ENV{TMPDIR}
+ /tmp
+ C:/temp
-=head1 SYNOPSIS
+Since Perl 5.8.0, if running under taint mode, and if the environment
+variables are tainted, they are not used.
- require File::Spec::Cygwin; # Done internally by File::Spec if needed
+=cut
-=head1 DESCRIPTION
+my $tmpdir;
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ my $self = shift;
+ $tmpdir = $self->_tmpdir( $ENV{TMPDIR}, "/tmp", 'C:/temp' );
+}
-See File::Spec::Unix for a documentation of the methods provided
-there. This package overrides the implementation of these methods, not
-the semantics.
+=back
-This module is still in beta. Cygwin-knowledgeable folks are invited
-to offer patches and suggestions.
+=cut
+
+1;
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm b/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm
index fc9c8ffc146..89ca0b99d9c 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Epoc.pm
@@ -1,10 +1,10 @@
package File::Spec::Epoc;
-our $VERSION = '1.00';
-
use strict;
-use Cwd;
-use vars qw(@ISA);
+use vars qw($VERSION @ISA);
+
+$VERSION = '1.1';
+
require File::Spec::Unix;
@ISA = qw(File::Spec::Unix);
@@ -23,20 +23,28 @@ there. This package overrides the implementation of these methods, not
the semantics.
This package is still work in progress ;-)
-o.flebbe@gmx.de
+=head1 AUTHORS
-=over 4
+o.flebbe@gmx.de
+
+=cut
sub case_tolerant {
return 1;
}
+=pod
+
+=over 4
+
=item canonpath()
No physical check on the filesystem, but a logical cleanup of a
path. On UNIX eliminated successive slashes and successive "/.".
+=back
+
=cut
sub canonpath {
@@ -50,11 +58,12 @@ sub canonpath {
return $path;
}
-=back
+=pod
=head1 SEE ALSO
-L<File::Spec>
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
=cut
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Functions.pm b/gnu/usr.bin/perl/lib/File/Spec/Functions.pm
index dad7aa3d0f5..1c36e8b9460 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Functions.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Functions.pm
@@ -3,9 +3,9 @@ package File::Spec::Functions;
use File::Spec;
use strict;
-our (@ISA,@EXPORT,@EXPORT_OK,%EXPORT_TAGS,$VERSION);
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
-$VERSION = '1.2';
+$VERSION = '1.3';
require Exporter;
@@ -31,6 +31,7 @@ require Exporter;
catpath
abs2rel
rel2abs
+ case_tolerant
);
%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
@@ -88,6 +89,7 @@ The following functions are exported only by request.
catpath
abs2rel
rel2abs
+ case_tolerant
All the functions may be imported using the C<:ALL> tag.
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Mac.pm b/gnu/usr.bin/perl/lib/File/Spec/Mac.pm
index 000da91b1af..34a7a015f26 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Mac.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Mac.pm
@@ -4,16 +4,18 @@ use strict;
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '1.3';
+$VERSION = '1.4';
@ISA = qw(File::Spec::Unix);
-use Cwd;
my $macfiles;
if ($^O eq 'MacOS') {
$macfiles = eval { require Mac::Files };
}
+sub case_tolerant { 1 }
+
+
=head1 NAME
File::Spec::Mac - File::Spec for Mac OS (Classic)
@@ -361,20 +363,18 @@ sub rootdir {
=item tmpdir
-Returns the contents of $ENV{TMPDIR}, if that directory exits or the current working
-directory otherwise. Under MacPerl, $ENV{TMPDIR} will contain a path like
-"MacintoshHD:Temporary Items:", which is a hidden directory on your startup volume.
+Returns the contents of $ENV{TMPDIR}, if that directory exits or the
+current working directory otherwise. Under MacPerl, $ENV{TMPDIR} will
+contain a path like "MacintoshHD:Temporary Items:", which is a hidden
+directory on your startup volume.
=cut
my $tmpdir;
sub tmpdir {
return $tmpdir if defined $tmpdir;
- $tmpdir = $ENV{TMPDIR} if -d $ENV{TMPDIR};
- unless (defined($tmpdir)) {
- $tmpdir = cwd();
- }
- return $tmpdir;
+ my $self = shift;
+ $tmpdir = $self->_tmpdir( $ENV{TMPDIR} );
}
=item updir
@@ -442,7 +442,7 @@ sub path {
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
-Splits a path in to volume, directory, and filename portions.
+Splits a path into volume, directory, and filename portions.
On Mac OS, assumes that the last part of the path is a filename unless
$no_file is true or a trailing separator ":" is present.
@@ -585,10 +585,16 @@ sub catpath {
return $file ;
}
+ # We look for a volume in $volume, then in $directory, but not both
+
+ my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1);
+
+ $volume = $dir_volume unless length $volume;
my $path = $volume; # may be ''
$path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
if ($directory) {
+ $directory = $dir_dirs if $volume;
$directory =~ s/^://; # remove leading ':' if any
$path .= $directory;
$path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':'
@@ -617,11 +623,13 @@ If $base is not present or '', then the current working directory is used.
If $base is relative, then it is converted to absolute form using C<rel2abs()>.
This means that it is taken to be relative to the current working directory.
-Since Mac OS has the concept of volumes, this assumes that both paths
-are on the $destination volume, and ignores the $base volume (!).
+If $path and $base appear to be on two different volumes, we will not
+attempt to resolve the two paths, and we will instead simply return
+$path. Note that previous versions of this module ignored the volume
+of $base, which resulted in garbage results part of the time.
If $base doesn't have a trailing colon, the last element of $base is
-assumed to be a filename. This filename is ignored (!). Otherwise all path
+assumed to be a filename. This filename is ignored. Otherwise all path
components are assumed to be directories.
If $path is relative, it is converted to absolute form using C<rel2abs()>.
@@ -656,7 +664,7 @@ sub abs2rel {
# Figure out the effective $base and clean it up.
if ( !defined( $base ) || $base eq '' ) {
- $base = cwd();
+ $base = $self->_cwd();
}
elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
@@ -666,11 +674,11 @@ sub abs2rel {
$base = _resolve_updirs( $base );
}
- # Split up paths
- my ( $path_dirs, $path_file ) = ($self->splitpath( $path ))[1,2] ;
+ # Split up paths - ignore $base's file
+ my ( $path_vol, $path_dirs, $path_file ) = $self->splitpath( $path );
+ my ( $base_vol, $base_dirs ) = $self->splitpath( $base );
- # ignore $base's volume and file
- my $base_dirs = ($self->splitpath( $base ))[1] ;
+ return $path unless lc( $path_vol ) eq lc( $base_vol );
# Now, remove all leading components that are the same
my @pathchunks = $self->splitdir( $path_dirs );
@@ -709,7 +717,7 @@ using C<rel2abs()>. This means that it is taken to be relative to the
current working directory.
If $base doesn't have a trailing colon, the last element of $base is
-assumed to be a filename. This filename is ignored (!). Otherwise all path
+assumed to be a filename. This filename is ignored. Otherwise all path
components are assumed to be directories.
If $path is already absolute, it is returned and $base is ignored.
@@ -724,7 +732,7 @@ sub rel2abs {
if ( ! $self->file_name_is_absolute($path) ) {
# Figure out the effective $base and clean it up.
if ( !defined( $base ) || $base eq '' ) {
- $base = cwd();
+ $base = $self->_cwd();
}
elsif ( ! $self->file_name_is_absolute($base) ) {
$base = $self->rel2abs($base) ;
@@ -736,7 +744,7 @@ sub rel2abs {
my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ;
# ignore $base's file part
- my ( $base_vol, $base_dirs, undef ) = $self->splitpath($base) ;
+ my ( $base_vol, $base_dirs ) = $self->splitpath($base) ;
# Glom them together
$path_dirs = ':' if ($path_dirs eq '');
@@ -756,10 +764,10 @@ sub rel2abs {
See the authors list in I<File::Spec>. Mac OS support by Paul Schinder
<schinder@pobox.com> and Thomas Wegner <wegner_thomas@yahoo.com>.
-
=head1 SEE ALSO
-L<File::Spec>
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
=cut
diff --git a/gnu/usr.bin/perl/lib/File/Spec/OS2.pm b/gnu/usr.bin/perl/lib/File/Spec/OS2.pm
index b494e2cbf28..47dc0a6ad61 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/OS2.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/OS2.pm
@@ -4,7 +4,7 @@ use strict;
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '1.1';
+$VERSION = '1.2';
@ISA = qw(File::Spec::Unix);
@@ -29,35 +29,30 @@ sub path {
return @path;
}
+sub _cwd {
+ # In OS/2 the "require Cwd" is unnecessary bloat.
+ return Cwd::sys_cwd();
+}
+
my $tmpdir;
sub tmpdir {
return $tmpdir if defined $tmpdir;
my $self = shift;
- my @dirlist = ( @ENV{qw(TMPDIR TEMP TMP)}, qw(/tmp /) );
- {
- no strict 'refs';
- if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0
- require Scalar::Util;
- @dirlist = grep { ! Scalar::Util::tainted $_ } @dirlist;
- }
- }
- foreach (@dirlist) {
- next unless defined && -d;
- $tmpdir = $_;
- last;
- }
- $tmpdir = '' unless defined $tmpdir;
- $tmpdir =~ s:\\:/:g;
- $tmpdir = $self->canonpath($tmpdir);
- return $tmpdir;
+ $tmpdir = $self->_tmpdir( @ENV{qw(TMPDIR TEMP TMP)},
+ '/tmp',
+ '/' );
}
-=item canonpath
-
-No physical check on the filesystem, but a logical cleanup of a
-path. On UNIX eliminated successive slashes and successive "/.".
-
-=cut
+sub catdir {
+ my $self = shift;
+ my @args = @_;
+ foreach (@args) {
+ tr[\\][/];
+ # append a backslash to each argument unless it has one there
+ $_ .= "/" unless m{/$};
+ }
+ return $self->canonpath(join('', @args));
+}
sub canonpath {
my ($self,$path) = @_;
@@ -68,27 +63,11 @@ sub canonpath {
$path =~ s|^(\./)+(?=[^/])||s; # ./xx -> xx
$path =~ s|/\Z(?!\n)||
unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/ -> xx
+ $path =~ s{^/\.\.$}{/}; # /.. -> /
+ 1 while $path =~ s{^/\.\.}{}; # /../xx -> /xx
return $path;
}
-=item splitpath
-
- ($volume,$directories,$file) = File::Spec->splitpath( $path );
- ($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
-
-Splits a path in to volume, directory, and filename portions. Assumes that
-the last file is a path unless the path ends in '/', '/.', '/..'
-or $no_file is true. On Win32 this means that $no_file true makes this return
-( $volume, $path, undef ).
-
-Separators accepted are \ and /.
-
-Volumes can be drive letters or UNC sharenames (\\server\share).
-
-The results can be passed to L</catpath> to get back a path equivalent to
-(usually identical to) the original path.
-
-=cut
sub splitpath {
my ($self,$path, $nofile) = @_;
@@ -119,42 +98,12 @@ sub splitpath {
}
-=item splitdir
-
-The opposite of L<catdir()|File::Spec/catdir()>.
-
- @dirs = File::Spec->splitdir( $directories );
-
-$directories must be only the directory portion of the path on systems
-that have the concept of a volume or that have path syntax that differentiates
-files from directories.
-
-Unlike just splitting the directories on the separator, leading empty and
-trailing directory entries can be returned, because these are significant
-on some OSs. So,
-
- File::Spec->splitdir( "/a/b//c/" );
-
-Yields:
-
- ( '', 'a', 'b', '', 'c', '' )
-
-=cut
-
sub splitdir {
my ($self,$directories) = @_ ;
split m|[\\/]|, $directories, -1;
}
-=item catpath
-
-Takes volume, directory and file portions and returns an entire path. Under
-Unix, $volume is ignored, and this is just like catfile(). On other OSs,
-the $volume become significant.
-
-=cut
-
sub catpath {
my ($self,$volume,$directory,$file) = @_;
@@ -196,7 +145,7 @@ sub abs2rel {
# Figure out the effective $base and clean it up.
if ( !defined( $base ) || $base eq '' ) {
- $base = Cwd::sys_cwd() ;
+ $base = $self->_cwd();
} elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
} else {
@@ -204,10 +153,9 @@ sub abs2rel {
}
# Split up paths
- my ( undef, $path_directories, $path_file ) =
- $self->splitpath( $path, 1 ) ;
-
- my $base_directories = ($self->splitpath( $base, 1 ))[1] ;
+ my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ;
+ my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ;
+ return $path unless $path_volume eq $base_volume;
# Now, remove all leading components that are the same
my @pathchunks = $self->splitdir( $path_directories );
@@ -254,7 +202,7 @@ sub rel2abs {
if ( ! $self->file_name_is_absolute( $path ) ) {
if ( !defined( $base ) || $base eq '' ) {
- $base = Cwd::sys_cwd() ;
+ $base = $self->_cwd();
}
elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
@@ -292,6 +240,27 @@ File::Spec::OS2 - methods for OS/2 file specs
=head1 DESCRIPTION
-See File::Spec::Unix for a documentation of the methods provided
-there. This package overrides the implementation of these methods, not
-the semantics.
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+Amongst the changes made for OS/2 are...
+
+=over 4
+
+=item tmpdir
+
+Modifies the list of places temp directory information is looked for.
+
+ $ENV{TMPDIR}
+ $ENV{TEMP}
+ $ENV{TMP}
+ /tmp
+ /
+
+=item splitpath
+
+Volumes can be drive letters or UNC sharenames (\\server\share).
+
+=back
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Unix.pm b/gnu/usr.bin/perl/lib/File/Spec/Unix.pm
index 87ee5051022..349757b6827 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Unix.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Unix.pm
@@ -1,11 +1,9 @@
package File::Spec::Unix;
use strict;
-our($VERSION);
+use vars qw($VERSION);
-$VERSION = '1.4';
-
-use Cwd;
+$VERSION = '1.5';
=head1 NAME
@@ -71,12 +69,8 @@ trailing slash :-)
sub catdir {
my $self = shift;
- my @args = @_;
- foreach (@args) {
- # append a slash to each argument unless it has one there
- $_ .= "/" if $_ eq '' || substr($_,-1) ne "/";
- }
- return $self->canonpath(join('', @args));
+
+ $self->canonpath(join('/', @_, '')); # '' because need a trailing '/'
}
=item catfile
@@ -88,7 +82,7 @@ complete path ending with a filename
sub catfile {
my $self = shift;
- my $file = pop @_;
+ my $file = $self->canonpath(pop @_);
return $file unless @_;
my $dir = $self->catdir(@_);
$dir .= "/" unless substr($dir,-1) eq "/";
@@ -101,9 +95,7 @@ Returns a string representation of the current directory. "." on UNIX.
=cut
-sub curdir {
- return ".";
-}
+sub curdir () { '.' }
=item devnull
@@ -111,9 +103,7 @@ Returns a string representation of the null device. "/dev/null" on UNIX.
=cut
-sub devnull {
- return "/dev/null";
-}
+sub devnull () { '/dev/null' }
=item rootdir
@@ -121,14 +111,13 @@ Returns a string representation of the root directory. "/" on UNIX.
=cut
-sub rootdir {
- return "/";
-}
+sub rootdir () { '/' }
=item tmpdir
-Returns a string representation of the first writable directory
-from the following list or "" if none are writable:
+Returns a string representation of the first writable directory from
+the following list or the current directory if none from the list are
+writable:
$ENV{TMPDIR}
/tmp
@@ -139,14 +128,15 @@ is tainted, it is not used.
=cut
my $tmpdir;
-sub tmpdir {
+sub _tmpdir {
return $tmpdir if defined $tmpdir;
- my @dirlist = ($ENV{TMPDIR}, "/tmp");
+ my $self = shift;
+ my @dirlist = @_;
{
no strict 'refs';
if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0
require Scalar::Util;
- shift @dirlist if Scalar::Util::tainted($ENV{TMPDIR});
+ @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist;
}
}
foreach (@dirlist) {
@@ -154,19 +144,24 @@ sub tmpdir {
$tmpdir = $_;
last;
}
- $tmpdir = '' unless defined $tmpdir;
+ $tmpdir = $self->curdir unless defined $tmpdir;
+ $tmpdir = defined $tmpdir && $self->canonpath($tmpdir);
return $tmpdir;
}
+sub tmpdir {
+ return $tmpdir if defined $tmpdir;
+ my $self = shift;
+ $tmpdir = $self->_tmpdir( $ENV{TMPDIR}, "/tmp" );
+}
+
=item updir
Returns a string representation of the parent directory. ".." on UNIX.
=cut
-sub updir {
- return "..";
-}
+sub updir () { '..' }
=item no_upwards
@@ -187,9 +182,7 @@ is not or is significant when comparing file specifications.
=cut
-sub case_tolerant {
- return 0;
-}
+sub case_tolerant () { 0 }
=item file_name_is_absolute
@@ -213,6 +206,7 @@ Takes no argument, returns the environment variable PATH as an array.
=cut
sub path {
+ return () unless exists $ENV{PATH};
my @path = split(':', $ENV{PATH});
foreach (@path) { $_ = '.' if $_ eq '' }
return @path;
@@ -234,8 +228,8 @@ sub join {
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
-Splits a path in to volume, directory, and filename portions. On systems
-with no concept of volume, returns undef for volume.
+Splits a path into volume, directory, and filename portions. On systems
+with no concept of volume, returns '' for volume.
For systems with no syntax differentiating filenames from directories,
assumes that the last file is a path unless $no_file is true or a
@@ -292,31 +286,14 @@ Yields:
=cut
sub splitdir {
- my ($self,$directories) = @_ ;
- #
- # split() likes to forget about trailing null fields, so here we
- # check to be sure that there will not be any before handling the
- # simple case.
- #
- if ( $directories !~ m|/\Z(?!\n)| ) {
- return split( m|/|, $directories );
- }
- else {
- #
- # since there was a trailing separator, add a file name to the end,
- # then do the split, then replace it with ''.
- #
- my( @directories )= split( m|/|, "${directories}dummy" ) ;
- $directories[ $#directories ]= '' ;
- return @directories ;
- }
+ return split m|/|, $_[1], -1; # Preserve trailing fields
}
=item catpath()
Takes volume, directory and file portions and returns an entire path. Under
-Unix, $volume is ignored, and directory and file are catenated. A '/' is
+Unix, $volume is ignored, and directory and file are concatenated. A '/' is
inserted if needed (though if the directory portion doesn't start with
'/' it is not added). On other OSs, $volume is significant.
@@ -347,15 +324,13 @@ from the base path to the destination path:
$rel_path = File::Spec->abs2rel( $path ) ;
$rel_path = File::Spec->abs2rel( $path, $base ) ;
-If $base is not present or '', then L<cwd()|Cwd> is used. If $base is relative,
-then it is converted to absolute form using L</rel2abs()>. This means that it
-is taken to be relative to L<cwd()|Cwd>.
-
-On systems with the concept of a volume, this assumes that both paths
-are on the $destination volume, and ignores the $base volume.
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
On systems that have a grammar that indicates filenames, this ignores the
-$base filename as well. Otherwise all path components are assumed to be
+$base filename. Otherwise all path components are assumed to be
directories.
If $path is relative, it is converted to absolute form using L</rel2abs()>.
@@ -382,7 +357,7 @@ sub abs2rel {
# Figure out the effective $base and clean it up.
if ( !defined( $base ) || $base eq '' ) {
- $base = cwd() ;
+ $base = $self->_cwd();
}
elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
@@ -426,15 +401,13 @@ Converts a relative path to an absolute path.
$abs_path = File::Spec->rel2abs( $path ) ;
$abs_path = File::Spec->rel2abs( $path, $base ) ;
-If $base is not present or '', then L<cwd()|Cwd> is used. If $base is relative,
-then it is converted to absolute form using L</rel2abs()>. This means that it
-is taken to be relative to L<cwd()|Cwd>.
-
-On systems with the concept of a volume, this assumes that both paths
-are on the $base volume, and ignores the $path volume.
+If $base is not present or '', then L<cwd()|Cwd> is used. If $base is
+relative, then it is converted to absolute form using
+L</rel2abs()>. This means that it is taken to be relative to
+L<cwd()|Cwd>.
-On systems that have a grammar that indicates filenames, this ignores the
-$base filename as well. Otherwise all path components are assumed to be
+On systems that have a grammar that indicates filenames, this ignores
+the $base filename. Otherwise all path components are assumed to be
directories.
If $path is absolute, it is cleaned up and returned using L</canonpath()>.
@@ -454,7 +427,7 @@ sub rel2abs {
if ( ! $self->file_name_is_absolute( $path ) ) {
# Figure out the effective $base and clean it up.
if ( !defined( $base ) || $base eq '' ) {
- $base = cwd() ;
+ $base = $self->_cwd();
}
elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
@@ -470,7 +443,6 @@ sub rel2abs {
return $self->canonpath( $path ) ;
}
-
=back
=head1 SEE ALSO
@@ -479,4 +451,12 @@ L<File::Spec>
=cut
+# Internal routine to File::Spec, no point in making this public since
+# it is the standard Cwd interface. Most of the platform-specific
+# File::Spec subclasses use this.
+sub _cwd {
+ require Cwd;
+ Cwd::cwd();
+}
+
1;
diff --git a/gnu/usr.bin/perl/lib/File/Spec/VMS.pm b/gnu/usr.bin/perl/lib/File/Spec/VMS.pm
index f21ff5eceee..362cdaa2a8f 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/VMS.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/VMS.pm
@@ -4,11 +4,10 @@ use strict;
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '1.2';
+$VERSION = '1.4';
@ISA = qw(File::Spec::Unix);
-use Cwd;
use File::Basename;
use VMS::Filespec;
@@ -164,6 +163,7 @@ sub canonpath {
$path =~ s/([\[<])(-+)/$1 . "\cx" x length($2)/e; # encode leading '-'s
$path =~ s/([\[<\.])([^\[<\.\cx]+)\.-\.?/$1/g; # bar.-.foo ==> foo
$path =~ s/([\[<])(\cx+)/$1 . '-' x length($2)/e; # then decode
+ $path =~ s/^[\[<\]>]{2}//; # []foo ==> foo
return $path;
}
}
@@ -211,7 +211,7 @@ VMS-syntax file specification.
sub catfile {
my ($self,@files) = @_;
- my $file = pop @files;
+ my $file = $self->canonpath(pop @files);
@files = grep($_,@files);
my $rslt;
if (@files) {
@@ -277,21 +277,8 @@ is tainted, it is not used.
my $tmpdir;
sub tmpdir {
return $tmpdir if defined $tmpdir;
- my @dirlist = ('sys$scratch:', $ENV{TMPDIR});
- {
- no strict 'refs';
- if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0
- require Scalar::Util;
- pop @dirlist if Scalar::Util::tainted($ENV{TMPDIR});
- }
- }
- foreach (@dirlist) {
- next unless defined && -d && -w _;
- $tmpdir = $_;
- last;
- }
- $tmpdir = '' unless defined $tmpdir;
- return $tmpdir;
+ my $self = shift;
+ $tmpdir = $self->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} );
}
=item updir (override)
@@ -380,6 +367,12 @@ Construct a complete filespec using VMS syntax
sub catpath {
my($self,$dev,$dir,$file) = @_;
+
+ # We look for a volume in $dev, then in $dir, but not both
+ my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir);
+ $dev = $dir_volume unless length $dev;
+ $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) : $dir_dir;
+
if ($dev =~ m|^/+([^/]+)|) { $dev = "$1:"; }
else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; }
if (length($dev) or length($dir)) {
@@ -397,46 +390,29 @@ Use VMS syntax when converting filespecs.
sub abs2rel {
my $self = shift;
-
return vmspath(File::Spec::Unix::abs2rel( $self, @_ ))
- if ( join( '', @_ ) =~ m{/} ) ;
+ if grep m{/}, @_;
my($path,$base) = @_;
-
- # Note: we use '/' to glue things together here, then let canonpath()
- # clean them up at the end.
-
- # Clean up $path
- if ( ! $self->file_name_is_absolute( $path ) ) {
- $path = $self->rel2abs( $path ) ;
- }
- else {
- $path = $self->canonpath( $path ) ;
- }
-
- # Figure out the effective $base and clean it up.
- if ( !defined( $base ) || $base eq '' ) {
- $base = cwd() ;
- $base = $self->canonpath( $base ) ;
- }
- elsif ( ! $self->file_name_is_absolute( $base ) ) {
- $base = $self->rel2abs( $base ) ;
- }
- else {
- $base = $self->canonpath( $base ) ;
- }
-
- # Split up paths
- my ( $path_directories, $path_file ) =
- ($self->splitpath( $path, 1 ))[1,2] ;
-
- $path_directories = $1
- if $path_directories =~ /^\[(.*)\]\Z(?!\n)/s ;
-
- my $base_directories = ($self->splitpath( $base, 1 ))[1] ;
-
- $base_directories = $1
- if $base_directories =~ /^\[(.*)\]\Z(?!\n)/s ;
+ $base = $self->_cwd() unless defined $base and length $base;
+
+ for ($path, $base) { $_ = $self->canonpath($_) }
+
+ # Are we even starting $path on the same (node::)device as $base? Note that
+ # logical paths or nodename differences may be on the "same device"
+ # but the comparison that ignores device differences so as to concatenate
+ # [---] up directory specs is not even a good idea in cases where there is
+ # a logical path difference between $path and $base nodename and/or device.
+ # Hence we fall back to returning the absolute $path spec
+ # if there is a case blind device (or node) difference of any sort
+ # and we do not even try to call $parse() or consult %ENV for $trnlnm()
+ # (this module needs to run on non VMS platforms after all).
+
+ my ($path_volume, $path_directories, $path_file) = $self->splitpath($path);
+ my ($base_volume, $base_directories, $base_file) = $self->splitpath($base);
+ return $path unless lc($path_volume) eq lc($base_volume);
+
+ for ($path, $base) { $_ = $self->rel2abs($_) }
# Now, remove all leading components that are the same
my @pathchunks = $self->splitdir( $path_directories );
@@ -454,8 +430,7 @@ sub abs2rel {
# @basechunks now contains the directories to climb out of,
# @pathchunks now has the directories to descend in to.
- $path_directories = '-.' x @basechunks . join( '.', @pathchunks ) ;
- $path_directories =~ s{\.\Z(?!\n)}{} ;
+ $path_directories = join '.', ('-' x @basechunks, @pathchunks) ;
return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ;
}
@@ -476,7 +451,7 @@ sub rel2abs {
if ( ! $self->file_name_is_absolute( $path ) ) {
# Figure out the effective $base and clean it up.
if ( !defined( $base ) || $base eq '' ) {
- $base = cwd() ;
+ $base = $self->_cwd;
}
elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
@@ -513,7 +488,11 @@ sub rel2abs {
=head1 SEE ALSO
-L<File::Spec>
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
+
+An explanation of VMS file specs can be found at
+L<"http://h71000.www7.hp.com/doc/731FINAL/4506/4506pro_014.html#apps_locating_naming_files">.
=cut
diff --git a/gnu/usr.bin/perl/lib/File/Spec/Win32.pm b/gnu/usr.bin/perl/lib/File/Spec/Win32.pm
index 186052bb4d8..1a91b95a5b1 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/Win32.pm
+++ b/gnu/usr.bin/perl/lib/File/Spec/Win32.pm
@@ -1,11 +1,11 @@
package File::Spec::Win32;
use strict;
-use Cwd;
+
use vars qw(@ISA $VERSION);
require File::Spec::Unix;
-$VERSION = '1.3';
+$VERSION = '1.4';
@ISA = qw(File::Spec::Unix);
@@ -48,7 +48,8 @@ from the following list:
/tmp
/
-The SYS:/temp is preferred in Novell NetWare.
+The SYS:/temp is preferred in Novell NetWare (the File::Spec::Win32
+is used also for NetWare).
Since Perl 5.8.0, if running under taint mode, and if the environment
variables are tainted, they are not used.
@@ -59,22 +60,11 @@ my $tmpdir;
sub tmpdir {
return $tmpdir if defined $tmpdir;
my $self = shift;
- my @dirlist = (@ENV{qw(TMPDIR TEMP TMP)}, qw(C:/temp /tmp /));
- {
- no strict 'refs';
- if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0
- require Scalar::Util;
- @dirlist = grep { ! Scalar::Util::tainted $_ } @dirlist;
- }
- }
- foreach (@dirlist) {
- next unless defined && -d;
- $tmpdir = $_;
- last;
- }
- $tmpdir = '' unless defined $tmpdir;
- $tmpdir = $self->canonpath($tmpdir);
- return $tmpdir;
+ $tmpdir = $self->_tmpdir( @ENV{qw(TMPDIR TEMP TMP)},
+ 'SYS:/temp',
+ 'C:/temp',
+ '/tmp',
+ '/' );
}
sub case_tolerant {
@@ -95,13 +85,24 @@ complete path ending with a filename
sub catfile {
my $self = shift;
- my $file = pop @_;
+ my $file = $self->canonpath(pop @_);
return $file unless @_;
my $dir = $self->catdir(@_);
$dir .= "\\" unless substr($dir,-1) eq "\\";
return $dir.$file;
}
+sub catdir {
+ my $self = shift;
+ my @args = @_;
+ foreach (@args) {
+ tr[/][\\];
+ # append a backslash to each argument unless it has one there
+ $_ .= "\\" unless m{\\$};
+ }
+ return $self->canonpath(join('', @args));
+}
+
sub path {
my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
my @path = split(';',$path);
@@ -113,18 +114,54 @@ sub path {
No physical check on the filesystem, but a logical cleanup of a
path. On UNIX eliminated successive slashes and successive "/.".
+On Win32 makes
+
+ dir1\dir2\dir3\..\..\dir4 -> \dir\dir4 and even
+ dir1\dir2\dir3\...\dir4 -> \dir\dir4
=cut
sub canonpath {
my ($self,$path) = @_;
+ my $orig_path = $path;
$path =~ s/^([a-z]:)/\u$1/s;
$path =~ s|/|\\|g;
$path =~ s|([^\\])\\+|$1\\|g; # xx\\\\xx -> xx\xx
$path =~ s|(\\\.)+\\|\\|g; # xx\.\.\xx -> xx\xx
$path =~ s|^(\.\\)+||s unless $path eq ".\\"; # .\xx -> xx
$path =~ s|\\\Z(?!\n)||
- unless $path =~ m#^([A-Z]:)?\\\Z(?!\n)#s; # xx\ -> xx
+ unless $path =~ m{^([A-Z]:)?\\\Z(?!\n)}s; # xx\ -> xx
+ # xx1/xx2/xx3/../../xx -> xx1/xx
+ $path =~ s|\\\.\.\.\\|\\\.\.\\\.\.\\|g; # \...\ is 2 levels up
+ $path =~ s|^\.\.\.\\|\.\.\\\.\.\\|g; # ...\ is 2 levels up
+ return $path if $path =~ m|^\.\.|; # skip relative paths
+ return $path unless $path =~ /\.\./; # too few .'s to cleanup
+ return $path if $path =~ /\.\.\.\./; # too many .'s to cleanup
+ $path =~ s{^\\\.\.$}{\\}; # \.. -> \
+ 1 while $path =~ s{^\\\.\.}{}; # \..\xx -> \xx
+
+ my ($vol,$dirs,$file) = $self->splitpath($path);
+ my @dirs = $self->splitdir($dirs);
+ my (@base_dirs, @path_dirs);
+ my $dest = \@base_dirs;
+ for my $dir (@dirs){
+ $dest = \@path_dirs if $dir eq $self->updir;
+ push @$dest, $dir;
+ }
+ # for each .. in @path_dirs pop one item from
+ # @base_dirs
+ while (my $dir = shift @path_dirs){
+ unless ($dir eq $self->updir){
+ unshift @path_dirs, $dir;
+ last;
+ }
+ pop @base_dirs;
+ }
+ $path = $self->catpath(
+ $vol,
+ $self->catdir(@base_dirs, @path_dirs),
+ $file
+ );
return $path;
}
@@ -133,10 +170,10 @@ sub canonpath {
($volume,$directories,$file) = File::Spec->splitpath( $path );
($volume,$directories,$file) = File::Spec->splitpath( $path, $no_file );
-Splits a path in to volume, directory, and filename portions. Assumes that
+Splits a path into volume, directory, and filename portions. Assumes that
the last file is a path unless the path ends in '\\', '\\.', '\\..'
or $no_file is true. On Win32 this means that $no_file true makes this return
-( $volume, $path, undef ).
+( $volume, $path, '' ).
Separators accepted are \ and /.
@@ -259,31 +296,20 @@ sub catpath {
sub abs2rel {
my($self,$path,$base) = @_;
+ $base = $self->_cwd() unless defined $base and length $base;
- # Clean up $path
- if ( ! $self->file_name_is_absolute( $path ) ) {
- $path = $self->rel2abs( $path ) ;
- }
- else {
- $path = $self->canonpath( $path ) ;
- }
+ for ($path, $base) { $_ = $self->canonpath($_) }
- # Figure out the effective $base and clean it up.
- if ( !defined( $base ) || $base eq '' ) {
- $base = cwd() ;
- }
- elsif ( ! $self->file_name_is_absolute( $base ) ) {
- $base = $self->rel2abs( $base ) ;
- }
- else {
- $base = $self->canonpath( $base ) ;
- }
+ my ($path_volume) = $self->splitpath($path, 1);
+ my ($base_volume) = $self->splitpath($base, 1);
- # Split up paths
- my ( undef, $path_directories, $path_file ) =
- $self->splitpath( $path, 1 ) ;
+ # Can't relativize across volumes
+ return $path unless $path_volume eq $base_volume;
- my $base_directories = ($self->splitpath( $base, 1 ))[1] ;
+ for ($path, $base) { $_ = $self->rel2abs($_) }
+
+ my $path_directories = ($self->splitpath($path, 1))[1];
+ my $base_directories = ($self->splitpath($base, 1))[1];
# Now, remove all leading components that are the same
my @pathchunks = $self->splitdir( $path_directories );
@@ -297,30 +323,9 @@ sub abs2rel {
shift @basechunks ;
}
- # No need to catdir, we know these are well formed.
- $path_directories = CORE::join( '\\', @pathchunks );
- $base_directories = CORE::join( '\\', @basechunks );
-
- # $base_directories now contains the directories the resulting relative
- # path must ascend out of before it can descend to $path_directory. So,
- # replace all names with $parentDir
-
- #FA Need to replace between backslashes...
- $base_directories =~ s|[^\\]+|..|g ;
-
- # Glue the two together, using a separator if necessary, and preventing an
- # empty result.
-
- #FA Must check that new directories are not empty.
- if ( $path_directories ne '' && $base_directories ne '' ) {
- $path_directories = "$base_directories\\$path_directories" ;
- } else {
- $path_directories = "$base_directories$path_directories" ;
- }
+ my $result_dirs = $self->catdir( ($self->updir) x @basechunks, @pathchunks );
- return $self->canonpath(
- $self->catpath( "", $path_directories, $path_file )
- ) ;
+ return $self->canonpath( $self->catpath('', $result_dirs, '') );
}
@@ -330,7 +335,7 @@ sub rel2abs {
if ( ! $self->file_name_is_absolute( $path ) ) {
if ( !defined( $base ) || $base eq '' ) {
- $base = cwd() ;
+ $base = $self->_cwd() ;
}
elsif ( ! $self->file_name_is_absolute( $base ) ) {
$base = $self->rel2abs( $base ) ;
@@ -363,7 +368,8 @@ Novell NetWare inherits its File::Spec behaviour from File::Spec::Win32.
=head1 SEE ALSO
-L<File::Spec>
+See L<File::Spec> and L<File::Spec::Unix>. This package overrides the
+implementation of these methods, not the semantics.
=cut
diff --git a/gnu/usr.bin/perl/lib/File/Spec/t/Functions.t b/gnu/usr.bin/perl/lib/File/Spec/t/Functions.t
index 926812248c2..457f53cb6fa 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/t/Functions.t
+++ b/gnu/usr.bin/perl/lib/File/Spec/t/Functions.t
@@ -1,17 +1,10 @@
-#!./perl
+#!/usr/bin/perl -w
-BEGIN {
- $^O = '';
- chdir 't' if -d 't';
- @INC = '../lib';
-}
+use Test;
+use File::Spec::Functions qw/:ALL/;
+plan tests => 2;
-print "1..1\n";
+ok catfile('a','b','c'), File::Spec->catfile('a','b','c');
-use File::Spec::Functions;
-
-if (catfile('a','b','c') eq 'a/b/c') {
- print "ok 1\n";
-} else {
- print "not ok 1\n";
-}
+# seems to return 0 or 1, so see if we can call it - 2003-07-07 tels
+ok case_tolerant(), '/^0|1$/';
diff --git a/gnu/usr.bin/perl/lib/File/Spec/t/Spec.t b/gnu/usr.bin/perl/lib/File/Spec/t/Spec.t
index 3f18a352775..182daf1da89 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/t/Spec.t
+++ b/gnu/usr.bin/perl/lib/File/Spec/t/Spec.t
@@ -1,12 +1,7 @@
-#!./perl
+#!/usr/bin/perl -w
+
+use Test;
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
- if ($^O eq 'MacOS') {
- push @INC, "::lib:$MacPerl::Architecture";
- }
-}
# Grab all of the plain routines from File::Spec
use File::Spec @File::Spec::EXPORT_OK ;
@@ -35,10 +30,12 @@ require File::Spec::VMS ;
require File::Spec::OS2 ;
require File::Spec::Mac ;
+require File::Spec::Epoc ;
+require File::Spec::Cygwin ;
# $root is only needed by Mac OS tests; these particular
# tests are skipped on other OSs
-my $root;
+my $root = '';
if ($^O eq 'MacOS') {
$root = File::Spec::Mac->rootdir();
}
@@ -50,7 +47,13 @@ if ($^O eq 'MacOS') {
@tests = (
# [ Function , Expected , Platform ]
-[ "Unix->catfile('a','b','c')", 'a/b/c' ],
+[ "Unix->case_tolerant()", '0' ],
+
+[ "Unix->catfile('a','b','c')", 'a/b/c' ],
+[ "Unix->catfile('a','b','./c')", 'a/b/c' ],
+[ "Unix->catfile('./a','b','c')", 'a/b/c' ],
+[ "Unix->catfile('c')", 'c' ],
+[ "Unix->catfile('./c')", 'c' ],
[ "Unix->splitpath('file')", ',,file' ],
[ "Unix->splitpath('/d1/d2/d3/')", ',/d1/d2/d3/,' ],
@@ -87,8 +90,6 @@ if ($^O eq 'MacOS') {
[ "Unix->catdir('','d1','d2','d3')", '/d1/d2/d3' ],
[ "Unix->catdir('d1','d2','d3')", 'd1/d2/d3' ],
-[ "Unix->catfile('a','b','c')", 'a/b/c' ],
-
[ "Unix->canonpath('')", '' ],
[ "Unix->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ],
[ "Unix->canonpath('/.')", '/' ],
@@ -115,6 +116,8 @@ if ($^O eq 'MacOS') {
[ "Unix->rel2abs('../t4','/t1/t2/t3')", '/t1/t2/t3/../t4' ],
[ "Unix->rel2abs('/t1','/t1/t2/t3')", '/t1' ],
+[ "Win32->case_tolerant()", '1' ],
+
[ "Win32->splitpath('file')", ',,file' ],
[ "Win32->splitpath('\\d1/d2\\d3/')", ',\\d1/d2\\d3/,' ],
[ "Win32->splitpath('d1/d2\\d3/')", ',d1/d2\\d3/,' ],
@@ -168,7 +171,15 @@ if ($^O eq 'MacOS') {
[ "Win32->catdir()", '' ],
[ "Win32->catdir('')", '\\' ],
[ "Win32->catdir('/')", '\\' ],
+[ "Win32->catdir('/', '../')", '\\' ],
+[ "Win32->catdir('/', '..\\')", '\\' ],
+[ "Win32->catdir('\\', '../')", '\\' ],
+[ "Win32->catdir('\\', '..\\')", '\\' ],
[ "Win32->catdir('//d1','d2')", '\\\\d1\\d2' ],
+[ "Win32->catdir('\\d1\\','d2')", '\\d1\\d2' ],
+[ "Win32->catdir('\\d1','d2')", '\\d1\\d2' ],
+[ "Win32->catdir('\\d1','\\d2')", '\\d1\\d2' ],
+[ "Win32->catdir('\\d1','\\d2\\')", '\\d1\\d2' ],
[ "Win32->catdir('','/d1','d2')", '\\\\d1\\d2' ],
[ "Win32->catdir('','','/d1','d2')", '\\\\\\d1\\d2' ],
[ "Win32->catdir('','//d1','d2')", '\\\\\\d1\\d2' ],
@@ -183,48 +194,77 @@ if ($^O eq 'MacOS') {
#[ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\d2\\d3' ],
[ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\B:\\d2\\d3' ],
[ "Win32->catdir('A:/')", 'A:\\' ],
+[ "Win32->catdir('\\', 'foo')", '\\foo' ],
+
+[ "Win32->catfile('a','b','c')", 'a\\b\\c' ],
+[ "Win32->catfile('a','b','.\\c')", 'a\\b\\c' ],
+[ "Win32->catfile('.\\a','b','c')", 'a\\b\\c' ],
+[ "Win32->catfile('c')", 'c' ],
+[ "Win32->catfile('.\\c')", 'c' ],
-[ "Win32->catfile('a','b','c')", 'a\\b\\c' ],
[ "Win32->canonpath('')", '' ],
[ "Win32->canonpath('a:')", 'A:' ],
[ "Win32->canonpath('A:f')", 'A:f' ],
+[ "Win32->canonpath('A:/')", 'A:\\' ],
[ "Win32->canonpath('//a\\b//c')", '\\\\a\\b\\c' ],
[ "Win32->canonpath('/a/..../c')", '\\a\\....\\c' ],
[ "Win32->canonpath('//a/b\\c')", '\\\\a\\b\\c' ],
[ "Win32->canonpath('////')", '\\\\\\' ],
[ "Win32->canonpath('//')", '\\' ],
[ "Win32->canonpath('/.')", '\\.' ],
-[ "Win32->canonpath('//a/b/../../c')", '\\\\a\\b\\..\\..\\c' ],
-[ "Win32->canonpath('//a/../../c')", '\\\\a\\..\\..\\c' ],
-
-## Hmmm, we should test missing and relative base paths some day...
-## would need to cd to a known place, get the cwd() and use it I
-## think.
-[ "Win32->abs2rel('/t1/t2/t3','/t1/t2/t3')", '' ],
-[ "Win32->abs2rel('/t1/t2/t4','/t1/t2/t3')", '..\\t4' ],
-[ "Win32->abs2rel('/t1/t2','/t1/t2/t3')", '..' ],
-[ "Win32->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ],
-[ "Win32->abs2rel('/t4/t5/t6','/t1/t2/t3')", '..\\..\\..\\t4\\t5\\t6' ],
-#[ "Win32->abs2rel('../t4','/t1/t2/t3')", '\\t1\\t2\\t3\\..\\t4' ],
-[ "Win32->abs2rel('/','/t1/t2/t3')", '..\\..\\..' ],
-[ "Win32->abs2rel('///','/t1/t2/t3')", '..\\..\\..' ],
-[ "Win32->abs2rel('/.','/t1/t2/t3')", '..\\..\\..\\.' ],
-[ "Win32->abs2rel('/./','/t1/t2/t3')", '..\\..\\..' ],
-[ "Win32->abs2rel('\\\\a/t1/t2/t4','/t2/t3')", '..\\t4' ],
-[ "Win32->abs2rel('//a/t1/t2/t4','/t2/t3')", '..\\t4' ],
-[ "Win32->abs2rel('A:/t1/t2/t3','B:/t1/t2/t3')",'' ],
-[ "Win32->abs2rel('A:/t1/t2/t3/t4','B:/t1/t2/t3')",'t4' ],
-
-[ "Win32->rel2abs('temp','C:/')", 'C:\\temp' ],
-[ "Win32->rel2abs('temp','C:/a')", 'C:\\a\\temp' ],
-[ "Win32->rel2abs('temp','C:/a/')", 'C:\\a\\temp' ],
-[ "Win32->rel2abs('../','C:/')", 'C:\\..' ],
-[ "Win32->rel2abs('../','C:/a')", 'C:\\a\\..' ],
-[ "Win32->rel2abs('temp','//prague_main/work/')", '\\\\prague_main\\work\\temp' ],
-[ "Win32->rel2abs('../temp','//prague_main/work/')", '\\\\prague_main\\work\\..\\temp' ],
-[ "Win32->rel2abs('temp','//prague_main/work')", '\\\\prague_main\\work\\temp' ],
-[ "Win32->rel2abs('../','//prague_main/work')", '\\\\prague_main\\work\\..' ],
+[ "Win32->canonpath('//a/b/../../c')", '\\\\a\\b\\c' ],
+[ "Win32->canonpath('//a/b/c/../d')", '\\\\a\\b\\d' ],
+[ "Win32->canonpath('//a/b/c/../../d')",'\\\\a\\b\\d' ],
+[ "Win32->canonpath('//a/b/c/.../d')", '\\\\a\\b\\d' ],
+[ "Win32->canonpath('/a/b/c/../../d')", '\\a\\d' ],
+[ "Win32->canonpath('/a/b/c/.../d')", '\\a\\d' ],
+[ "Win32->canonpath('\\../temp\\')", '\\temp' ],
+[ "Win32->canonpath('\\../')", '\\' ],
+[ "Win32->canonpath('\\..\\')", '\\' ],
+[ "Win32->canonpath('/../')", '\\' ],
+[ "Win32->canonpath('/..\\')", '\\' ],
+[ "Win32->can('_cwd')", qr/CODE/ ],
+
+# FakeWin32 subclass (see below) just sets CWD to C:\one\two
+
+[ "FakeWin32->abs2rel('/t1/t2/t3','/t1/t2/t3')", '' ],
+[ "FakeWin32->abs2rel('/t1/t2/t4','/t1/t2/t3')", '..\\t4' ],
+[ "FakeWin32->abs2rel('/t1/t2','/t1/t2/t3')", '..' ],
+[ "FakeWin32->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ],
+[ "FakeWin32->abs2rel('/t4/t5/t6','/t1/t2/t3')", '..\\..\\..\\t4\\t5\\t6' ],
+[ "FakeWin32->abs2rel('../t4','/t1/t2/t3')", '..\\..\\..\\one\\t4' ],
+[ "FakeWin32->abs2rel('/','/t1/t2/t3')", '..\\..\\..' ],
+[ "FakeWin32->abs2rel('///','/t1/t2/t3')", '..\\..\\..' ],
+[ "FakeWin32->abs2rel('/.','/t1/t2/t3')", '..\\..\\..' ],
+[ "FakeWin32->abs2rel('/./','/t1/t2/t3')", '..\\..\\..' ],
+[ "FakeWin32->abs2rel('\\\\a/t1/t2/t4','/t2/t3')", '\\\\a\\t1\\t2\\t4' ],
+[ "FakeWin32->abs2rel('//a/t1/t2/t4','/t2/t3')", '\\\\a\\t1\\t2\\t4' ],
+[ "FakeWin32->abs2rel('A:/t1/t2/t3','A:/t1/t2/t3')", '' ],
+[ "FakeWin32->abs2rel('A:/t1/t2/t3/t4','A:/t1/t2/t3')", 't4' ],
+[ "FakeWin32->abs2rel('A:/t1/t2/t3','A:/t1/t2/t3/t4')", '..' ],
+[ "FakeWin32->abs2rel('A:/t1/t2/t3','B:/t1/t2/t3')", 'A:\\t1\\t2\\t3' ],
+[ "FakeWin32->abs2rel('A:/t1/t2/t3/t4','B:/t1/t2/t3')", 'A:\\t1\\t2\\t3\\t4' ],
+[ "FakeWin32->abs2rel('E:/foo/bar/baz')", 'E:\\foo\\bar\\baz' ],
+[ "FakeWin32->abs2rel('C:/one/two/three')", 'three' ],
+
+[ "FakeWin32->rel2abs('temp','C:/')", 'C:\\temp' ],
+[ "FakeWin32->rel2abs('temp','C:/a')", 'C:\\a\\temp' ],
+[ "FakeWin32->rel2abs('temp','C:/a/')", 'C:\\a\\temp' ],
+[ "FakeWin32->rel2abs('../','C:/')", 'C:\\' ],
+[ "FakeWin32->rel2abs('../','C:/a')", 'C:\\' ],
+[ "FakeWin32->rel2abs('temp','//prague_main/work/')", '\\\\prague_main\\work\\temp' ],
+[ "FakeWin32->rel2abs('../temp','//prague_main/work/')", '\\\\prague_main\\work\\temp' ],
+[ "FakeWin32->rel2abs('temp','//prague_main/work')", '\\\\prague_main\\work\\temp' ],
+[ "FakeWin32->rel2abs('../','//prague_main/work')", '\\\\prague_main\\work' ],
+
+[ "VMS->case_tolerant()", '1' ],
+
+[ "VMS->catfile('a','b','c')", '[.a.b]c' ],
+[ "VMS->catfile('a','b','[]c')", '[.a.b]c' ],
+[ "VMS->catfile('[.a]','b','c')", '[.a.b]c' ],
+[ "VMS->catfile('c')", 'c' ],
+[ "VMS->catfile('[]c')", 'c' ],
[ "VMS->splitpath('file')", ',,file' ],
[ "VMS->splitpath('[d1.d2.d3]')", ',[d1.d2.d3],' ],
@@ -245,6 +285,7 @@ if ($^O eq 'MacOS') {
[ "VMS->catpath('','[.d1.d2.d3]','file')", '[.d1.d2.d3]file' ],
[ "VMS->catpath('','d1/d2/d3','file')", '[.d1.d2.d3]file' ],
[ "VMS->catpath('v','d1/d2/d3','file')", 'v:[.d1.d2.d3]file' ],
+[ "VMS->catpath('v','w:[d1.d2.d3]','file')", 'v:[d1.d2.d3]file' ],
[ "VMS->catpath('node::volume:','[d1.d2.d3]','')", 'node::volume:[d1.d2.d3]' ],
[ "VMS->catpath('node::volume:','[d1.d2.d3]','file')", 'node::volume:[d1.d2.d3]file' ],
[ "VMS->catpath('node\"access_spec\"::volume:','[d1.d2.d3]','')", 'node"access_spec"::volume:[d1.d2.d3]' ],
@@ -274,16 +315,21 @@ if ($^O eq 'MacOS') {
[ "VMS->catdir('[.name]')", '[.name]' ],
[ "VMS->catdir('[.name]','[.name]')", '[.name.name]'],
-[ "VMS->abs2rel('node::volume:[t1.t2.t3]','[t1.t2.t3]')", '' ],
-[ "VMS->abs2rel('node::volume:[t1.t2.t4]','[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('node::volume:[t1.t2.t3]','node::volume:[t1.t2.t3]')", '' ],
+[ "VMS->abs2rel('node::volume:[t1.t2.t3]','[t1.t2.t3]')", 'node::volume:[t1.t2.t3]' ],
+[ "VMS->abs2rel('node::volume:[t1.t2.t4]','node::volume:[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('node::volume:[t1.t2.t4]','[t1.t2.t3]')", 'node::volume:[t1.t2.t4]' ],
[ "VMS->abs2rel('[t1.t2.t3]','[t1.t2.t3]')", '' ],
[ "VMS->abs2rel('[t1.t2.t3]file','[t1.t2.t3]')", 'file' ],
+[ "VMS->abs2rel('[t1.t2.t3]file','[t1.t2]')", '[.t3]file' ],
+[ "VMS->abs2rel('v:[t1.t2.t3]file','v:[t1.t2]')", '[.t3]file' ],
[ "VMS->abs2rel('[t1.t2.t4]','[t1.t2.t3]')", '[-.t4]' ],
[ "VMS->abs2rel('[t1.t2]file','[t1.t2.t3]')", '[-]file' ],
-[ "VMS->abs2rel('[t1.t2.t3.t4]','[t1.t2.t3]')", '[t4]' ],
+[ "VMS->abs2rel('[t1.t2.t3.t4]','[t1.t2.t3]')", '[.t4]' ],
[ "VMS->abs2rel('[t4.t5.t6]','[t1.t2.t3]')", '[---.t4.t5.t6]' ],
[ "VMS->abs2rel('[000000]','[t1.t2.t3]')", '[---]' ],
-[ "VMS->abs2rel('a:[t1.t2.t4]','[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('a:[t1.t2.t4]','a:[t1.t2.t3]')", '[-.t4]' ],
+[ "VMS->abs2rel('a:[t1.t2.t4]','[t1.t2.t3]')", 'a:[t1.t2.t4]' ],
[ "VMS->abs2rel('[a.-.b.c.-]','[t1.t2.t3]')", '[---.b]' ],
[ "VMS->rel2abs('[.t4]','[t1.t2.t3]')", '[t1.t2.t3.t4]' ],
@@ -293,9 +339,22 @@ if ($^O eq 'MacOS') {
[ "VMS->rel2abs('[-.t4]','[t1.t2.t3]')", '[t1.t2.t4]' ],
[ "VMS->rel2abs('[t1]','[t1.t2.t3]')", '[t1]' ],
+[ "OS2->case_tolerant()", '1' ],
+
[ "OS2->catdir('A:/d1','B:/d2','d3','')", 'A:/d1/B:/d2/d3' ],
+
[ "OS2->catfile('a','b','c')", 'a/b/c' ],
+[ "OS2->catfile('a','b','./c')", 'a/b/c' ],
+[ "OS2->catfile('./a','b','c')", 'a/b/c' ],
+[ "OS2->catfile('c')", 'c' ],
+[ "OS2->catfile('./c')", 'c' ],
+[ "OS2->catdir('/', '../')", '/' ],
+[ "OS2->catdir('/', '..\\')", '/' ],
+[ "OS2->catdir('\\', '../')", '/' ],
+[ "OS2->catdir('\\', '..\\')", '/' ],
+
+[ "Mac->case_tolerant()", '1' ],
[ "Mac->catpath('','','')", '' ],
[ "Mac->catpath('',':','')", ':' ],
@@ -318,6 +377,7 @@ if ($^O eq 'MacOS') {
[ "Mac->catpath('hd:','d1','file')", 'hd:d1:file' ],
[ "Mac->catpath('hd:',':d1:',':file')", 'hd:d1:file' ],
+[ "Mac->catpath('hd:','hd:d1','')", 'hd:d1:' ],
[ "Mac->catpath('','d1','')", ':d1:' ],
[ "Mac->catpath('',':d1','')", ':d1:' ],
@@ -468,7 +528,7 @@ if ($^O eq 'MacOS') {
[ "Mac->abs2rel('hd:d3:','hd:d1:d2:')", ':::d3:' ], # same as above
[ "Mac->abs2rel('hd:d1:d2:d3:','hd:d1:d2:')", ':d3:' ],
[ "Mac->abs2rel('hd:d1:d2:d3::','hd:d1:d2:')", ':d3::' ],
-[ "Mac->abs2rel('hd1:d3:d4:d5:','hd2:d1:d2:')", ':::d3:d4:d5:' ], # ignore base's volume
+[ "Mac->abs2rel('hd1:d3:d4:d5:','hd2:d1:d2:')", 'hd1:d3:d4:d5:'], # volume mismatch
[ "Mac->abs2rel('hd:','hd:d1:d2:')", ':::' ],
[ "Mac->rel2abs(':d3:','hd:d1:d2:')", 'hd:d1:d2:d3:' ],
@@ -482,12 +542,29 @@ if ($^O eq 'MacOS') {
[ "Mac->rel2abs('hd:','hd:d1:d2:')", 'hd:' ], # path already absolute
[ "Mac->rel2abs('hd:d3:file','hd:d1:d2:')", 'hd:d3:file' ],
[ "Mac->rel2abs('hd:d3:','hd:d1:file')", 'hd:d3:' ],
+
+[ "Epoc->case_tolerant()", '1' ],
+
+[ "Epoc->canonpath('')", '' ],
+[ "Epoc->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ],
+[ "Epoc->canonpath('/./')", '/' ],
+[ "Epoc->canonpath('/a/./')", '/a' ],
+
+# XXX Todo, copied from Unix, but fail. Should they? 2003-07-07 Tels
+#[ "Epoc->canonpath('/a/.')", '/a' ],
+#[ "Epoc->canonpath('/.')", '/' ],
+
+[ "Cygwin->case_tolerant()", '0' ],
+
) ;
+plan tests => scalar @tests;
-print "1..", scalar( @tests ), "\n" ;
+{
+ @File::Spec::FakeWin32::ISA = qw(File::Spec::Win32);
+ sub File::Spec::FakeWin32::_cwd { 'C:\\one\\two' }
+}
-my $current_test= 1 ;
# Test out the class methods
for ( @tests ) {
@@ -505,36 +582,23 @@ sub tryfunc {
my $platform = shift ;
if ($platform && $^O ne $platform) {
- print "ok $current_test # skipped: $function\n" ;
- ++$current_test ;
+ skip("skip $function", 1);
return;
}
$function =~ s#\\#\\\\#g ;
-
- my $got ;
- if ( $function =~ /^[^\$].*->/ ) {
- $got = eval( "join( ',', File::Spec::$function )" ) ;
- }
- else {
- $got = eval( "join( ',', $function )" ) ;
- }
+ $function =~ s/^([^\$].*->)/File::Spec::$1/;
+ my $got = join ',', eval $function;
if ( $@ ) {
- if ( substr( $@, 0, length $skip_exception ) eq $skip_exception ) {
- chomp $@ ;
- print "ok $current_test # skip $function: $@\n" ;
- }
- else {
- chomp $@ ;
- print "not ok $current_test # $function: $@\n" ;
- }
- }
- elsif ( !defined( $got ) || $got ne $expected ) {
- print "not ok $current_test # $function: got '$got', expected '$expected'\n" ;
+ if ( $@ =~ /^\Q$skip_exception/ ) {
+ skip "skip $function: $skip_exception", 1;
+ }
+ else {
+ ok $@, '', $function;
+ }
+ return;
}
- else {
- print "ok $current_test # $function\n" ;
- }
- ++$current_test ;
+
+ ok $got, $expected, $function;
}
diff --git a/gnu/usr.bin/perl/lib/File/Spec/t/crossplatform.t b/gnu/usr.bin/perl/lib/File/Spec/t/crossplatform.t
new file mode 100644
index 00000000000..a98e091b3a4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/File/Spec/t/crossplatform.t
@@ -0,0 +1,96 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More;
+use File::Spec;
+local $|=1;
+
+my @platforms = qw(Cygwin Epoc Mac OS2 Unix VMS Win32);
+my $tests_per_platform = 7;
+
+plan tests => 1 + @platforms * $tests_per_platform;
+
+my %volumes = (
+ Mac => 'Macintosh HD',
+ OS2 => 'A:',
+ Win32 => 'A:',
+ VMS => 'v',
+ );
+my %other_vols = (
+ Mac => 'Mounted Volume',
+ OS2 => 'B:',
+ Win32 => 'B:',
+ VMS => 'w',
+ );
+
+ok 1, "Loaded";
+
+foreach my $platform (@platforms) {
+ my $module = "File::Spec::$platform";
+
+ SKIP:
+ {
+ eval "require $module; 1";
+
+ skip "Can't load $module", $tests_per_platform
+ if $@;
+
+ my $v = $volumes{$platform} || '';
+ my $other_v = $other_vols{$platform} || '';
+
+ # Fake out the rootdir on MacOS
+ no strict 'refs';
+ my $save_w = $^W;
+ $^W = 0;
+ local *{"File::Spec::Mac::rootdir"} = sub { "Macintosh HD:" };
+ $^W = $save_w;
+ use strict 'refs';
+
+ my ($file, $base, $result);
+
+ $base = $module->catpath($v, $module->catdir('', 'foo'), '');
+ $base = $module->catdir($module->rootdir, 'foo');
+
+ is $module->file_name_is_absolute($base), 1, "$base is absolute on $platform";
+
+
+ # abs2rel('A:/foo/bar', 'A:/foo') -> 'bar'
+ $file = $module->catpath($v, $module->catdir($module->rootdir, 'foo', 'bar'), 'file');
+ $base = $module->catpath($v, $module->catdir($module->rootdir, 'foo'), '');
+ $result = $module->catfile('bar', 'file');
+ is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
+
+ # abs2rel('A:/foo/bar', 'B:/foo') -> 'A:/foo/bar'
+ $base = $module->catpath($other_v, $module->catdir($module->rootdir, 'foo'), '');
+ $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
+ is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
+
+ # abs2rel('A:/foo/bar', '/foo') -> 'A:/foo/bar'
+ $base = $module->catpath('', $module->catdir($module->rootdir, 'foo'), '');
+ $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
+ is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
+
+ # abs2rel('/foo/bar', 'A:/foo') -> '/foo/bar'
+ $file = $module->catpath('', $module->catdir($module->rootdir, 'foo', 'bar'), 'file');
+ $base = $module->catpath($v, $module->catdir($module->rootdir, 'foo'), '');
+ $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
+ is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
+
+ # abs2rel('/foo/bar', 'B:/foo') -> '/foo/bar'
+ $base = $module->catpath($other_v, $module->catdir($module->rootdir, 'foo'), '');
+ $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file');
+ is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
+
+ # abs2rel('/foo/bar', '/foo') -> 'bar'
+ $base = $module->catpath('', $module->catdir($module->rootdir, 'foo'), '');
+ $result = $module->catfile('bar', 'file');
+ is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)";
+ }
+}
+
+sub volumes_differ {
+ my ($module, $one, $two) = @_;
+ my ($one_v) = $module->splitpath( $module->rel2abs($one) );
+ my ($two_v) = $module->splitpath( $module->rel2abs($two) );
+ return $one_v ne $two_v;
+}
diff --git a/gnu/usr.bin/perl/lib/File/Spec/t/rel2abs2rel.t b/gnu/usr.bin/perl/lib/File/Spec/t/rel2abs2rel.t
index 4c2e2bb9934..7af1042c0b5 100644
--- a/gnu/usr.bin/perl/lib/File/Spec/t/rel2abs2rel.t
+++ b/gnu/usr.bin/perl/lib/File/Spec/t/rel2abs2rel.t
@@ -1,26 +1,27 @@
-#!./perl -w
+#!/usr/bin/perl -w
-# Herein we apply abs2rel, rel2abs and canonpath against various real
-# world files and make sure it all actually works.
+# Here we make sure File::Spec can properly deal with executables.
+# VMS has some trouble with these.
+
+use Test::More (-x $^X
+ ? (tests => 5)
+ : (skip_all => "Can't find an executable file")
+ );
-BEGIN {
- chdir 't';
- @INC = '../lib';
-}
BEGIN { # Set up a tiny script file
+ local *F;
open(F, ">rel2abs2rel$$.pl")
or die "Can't open rel2abs2rel$$.pl file for script -- $!\n";
print F qq(print "ok\\n"\n);
close(F);
}
END {
- unlink("rel2abs2rel$$.pl");
- unlink("rel2abs2rel$$.tmp");
+ 1 while unlink("rel2abs2rel$$.pl");
+ 1 while unlink("rel2abs2rel$$.tmp");
}
use Config;
-use Test::More tests => 5;
use File::Spec;
# Change 'perl' to './perl' so the shell doesn't go looking through PATH.
@@ -43,6 +44,8 @@ sub sayok{
system($perl, "rel2abs2rel$$.pl");
open(STDOUT, '>&STDOUTDUP');
close(STDOUTDUP);
+
+ local *F;
open(F, "rel2abs2rel$$.tmp");
local $/ = undef;
my $output = <F>;
@@ -50,19 +53,19 @@ sub sayok{
return $output;
}
-# Here we make sure File::Spec can properly deal with executables.
-# VMS has some trouble with these.
+print "# Checking manipulations of \$^X=$^X\n";
+
my $perl = safe_rel($^X);
-is( sayok($perl), "ok\n", '`` works' );
+is( sayok($perl), "ok\n", "`$perl rel2abs2rel$$.pl` works" );
$perl = File::Spec->rel2abs($^X);
-is( sayok($perl), "ok\n", '`` works' );
+is( sayok($perl), "ok\n", "`$perl rel2abs2rel$$.pl` works" );
$perl = File::Spec->canonpath($perl);
-is( sayok($perl), "ok\n", 'rel2abs($^X)' );
+is( sayok($perl), "ok\n", "canonpath(rel2abs($^X)) = $perl" );
$perl = safe_rel(File::Spec->abs2rel($perl));
-is( sayok($perl), "ok\n", 'canonpath on abs executable' );
+is( sayok($perl), "ok\n", "safe_rel(abs2rel(canonpath(rel2abs($^X)))) = $perl" );
$perl = safe_rel(File::Spec->canonpath($^X));
-is(sayok($perl), "ok\n", 'canonpath on rel executable' );
+is( sayok($perl), "ok\n", "safe_rel(canonpath($^X)) = $perl" );
diff --git a/gnu/usr.bin/perl/lib/File/Temp/t/mktemp.t b/gnu/usr.bin/perl/lib/File/Temp/t/mktemp.t
index 4e31d01a3f8..2014e30717d 100644
--- a/gnu/usr.bin/perl/lib/File/Temp/t/mktemp.t
+++ b/gnu/usr.bin/perl/lib/File/Temp/t/mktemp.t
@@ -1,16 +1,11 @@
-#!/usr/bin/perl -w
+#!/usr/local/bin/perl -w
# Test for mktemp family of commands in File::Temp
# Use STANDARD safe level for these tests
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
- require Test; import Test;
- plan(tests => 9);
-}
-
use strict;
+use Test;
+BEGIN { plan tests => 9 }
use File::Spec;
use File::Path;
diff --git a/gnu/usr.bin/perl/lib/File/Temp/t/object.t b/gnu/usr.bin/perl/lib/File/Temp/t/object.t
new file mode 100644
index 00000000000..5828866f0fd
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/File/Temp/t/object.t
@@ -0,0 +1,107 @@
+#!/usr/local/bin/perl -w
+# Test for File::Temp - OO interface
+
+use strict;
+use Test::More tests => 18;
+use File::Spec;
+
+# Will need to check that all files were unlinked correctly
+# Set up an END block here to do it
+
+# Arrays containing list of dirs/files to test
+my (@files, @dirs, @still_there);
+
+# And a test for files that should still be around
+# These are tidied up
+END {
+ foreach (@still_there) {
+ ok( -f $_, "Check $_ exists" );
+ ok( unlink( $_ ), "Unlinked $_" );
+ ok( !(-f $_), "$_ no longer there");
+ }
+}
+
+# Loop over an array hoping that the files dont exist
+END { foreach (@files) { ok( !(-e $_), "File $_ should not be there" )} }
+
+# And a test for directories
+END { foreach (@dirs) { ok( !(-d $_), "Directory $_ should not be there" ) } }
+
+# Need to make sure that the END blocks are setup before
+# the ones that File::Temp configures since END blocks are evaluated
+# in reverse order and we need to check the files *after* File::Temp
+# removes them
+BEGIN {use_ok( "File::Temp" ); }
+
+# Tempfile
+# Open tempfile in some directory, unlink at end
+my $fh = new File::Temp( SUFFIX => '.txt' );
+
+ok( (-f "$fh"), "File $fh exists" );
+# Should still be around after closing
+ok( close( $fh ), "Close file $fh" );
+ok( (-f "$fh"), "File $fh still exists after close" );
+# Check again at exit
+push(@files, "$fh");
+
+# TEMPDIR test
+# Create temp directory in current dir
+my $template = 'tmpdirXXXXXX';
+print "# Template: $template\n";
+my $tempdir = File::Temp::tempdir( $template ,
+ DIR => File::Spec->curdir,
+ CLEANUP => 1,
+ );
+
+print "# TEMPDIR: $tempdir\n";
+
+ok( (-d $tempdir), "Does $tempdir directory exist" );
+push(@dirs, $tempdir);
+
+# Create file in the temp dir
+$fh = new File::Temp(
+ DIR => $tempdir,
+ SUFFIX => '.dat',
+ );
+
+print "# TEMPFILE: Created $fh\n";
+
+ok( (-f "$fh"), "File $fh exists in tempdir?");
+push(@files, "$fh");
+
+# Test tempfile
+# ..and again (without unlinking it)
+$fh = new File::Temp( DIR => $tempdir, UNLINK => 0 );
+
+print "# TEMPFILE: Created $fh\n";
+ok( (-f "$fh" ), "Second file $fh exists in tempdir [nounlink]?");
+push(@files, "$fh");
+
+# and another (with template)
+
+$fh = new File::Temp( TEMPLATE => 'helloXXXXXXX',
+ DIR => $tempdir,
+ SUFFIX => '.dat',
+ );
+
+print "# TEMPFILE: Created $fh\n";
+
+ok( (-f "$fh"), "File $fh exists? [from template]" );
+push(@files, "$fh");
+
+
+# Create a temporary file that should stay around after
+# it has been closed
+$fh = new File::Temp( TEMPLATE => 'permXXXXXXX', UNLINK => 0);
+
+print "# TEMPFILE: Created $fh\n";
+ok( -f "$fh", "File $fh exists?" );
+ok( close( $fh ), "Close file $fh" );
+push( @still_there, "$fh"); # check at END
+
+# Make sure destructors run
+undef $fh;
+
+# Now END block will execute to test the removal of directories
+print "# End of tests. Execute END blocks\n";
+
diff --git a/gnu/usr.bin/perl/lib/File/Temp/t/posix.t b/gnu/usr.bin/perl/lib/File/Temp/t/posix.t
index 0a5e86061be..b63fb29140b 100644
--- a/gnu/usr.bin/perl/lib/File/Temp/t/posix.t
+++ b/gnu/usr.bin/perl/lib/File/Temp/t/posix.t
@@ -1,18 +1,12 @@
-#!/usr/bin/perl -w
+#!/usr/local/bin/perl -w
# Test for File::Temp - POSIX functions
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
- require Test; import Test;
- plan(tests => 7);
-}
-
use strict;
+use Test;
+BEGIN { plan tests => 7}
use File::Temp qw/ :POSIX unlink0 /;
use FileHandle;
-
ok(1);
# TMPNAM - scalar
diff --git a/gnu/usr.bin/perl/lib/File/Temp/t/security.t b/gnu/usr.bin/perl/lib/File/Temp/t/security.t
index e0cf85b23f3..736854f0549 100644
--- a/gnu/usr.bin/perl/lib/File/Temp/t/security.t
+++ b/gnu/usr.bin/perl/lib/File/Temp/t/security.t
@@ -5,12 +5,8 @@
# Test a simple open in the cwd and tmpdir foreach of the
# security levels
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
- require Test; import Test;
- plan(tests => 13);
-}
+use Test;
+BEGIN { plan tests => 13 }
use strict;
use File::Spec;
@@ -108,7 +104,9 @@ sub test_security {
ok( (-e $fname1) );
push(@files, $fname1); # store for end block
} elsif (File::Temp->safe_level() != File::Temp::STANDARD) {
- my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'";
+ chomp($@);
+ my $skip2 = "Skip: " . File::Spec->tmpdir() . " possibly insecure: $@. " .
+ "See INSTALL under 'make test'";
skip($skip2, 1);
# plus we need an end block so the tests come out in the right order
eval q{ END { skip($skip2,1); } 1; } || die;
@@ -129,7 +127,9 @@ sub test_security {
push(@files, $fname2); # store for end block
close($fh2);
} elsif (File::Temp->safe_level() != File::Temp::STANDARD) {
- my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'";
+ chomp($@);
+ my $skip2 = "Skip: current directory possibly insecure: $@. " .
+ "See INSTALL under 'make test'";
skip($skip2, 1);
# plus we need an end block so the tests come out in the right order
eval q{ END { skip($skip2,1); } 1; } || die;
diff --git a/gnu/usr.bin/perl/lib/File/Temp/t/tempfile.t b/gnu/usr.bin/perl/lib/File/Temp/t/tempfile.t
index ed59765a757..c8739bf5310 100644
--- a/gnu/usr.bin/perl/lib/File/Temp/t/tempfile.t
+++ b/gnu/usr.bin/perl/lib/File/Temp/t/tempfile.t
@@ -1,14 +1,9 @@
#!/usr/local/bin/perl -w
# Test for File::Temp - tempfile function
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
- require Test; import Test;
- plan(tests => 20);
-}
-
use strict;
+use Test;
+BEGIN { plan tests => 22}
use File::Spec;
# Will need to check that all files were unlinked correctly
@@ -93,6 +88,16 @@ push(@files, $tempfile);
ok( (-f $tempfile ));
push(@files, $tempfile);
+# Test tempfile
+# ..and another with changed permissions (read-only)
+($fh, $tempfile) = tempfile(
+ DIR => $tempdir,
+ );
+chmod 0444, $tempfile;
+
+ok( (-f $tempfile ));
+push(@files, $tempfile);
+
print "# TEMPFILE: Created $tempfile\n";
# and another (with template)
diff --git a/gnu/usr.bin/perl/lib/FileCache/t/01open.t b/gnu/usr.bin/perl/lib/FileCache/t/01open.t
new file mode 100644
index 00000000000..fa7f5f0e08a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/FileCache/t/01open.t
@@ -0,0 +1,26 @@
+#!./perl
+use FileCache;
+use vars qw(@files);
+BEGIN {
+ @files = qw(foo bar baz quux Foo_Bar);
+ chdir 't' if -d 't';
+
+ #For tests within the perl distribution
+ @INC = '../lib' if -d '../lib';
+ END;
+}
+END{
+ 1 while unlink @files;
+}
+
+
+print "1..1\n";
+
+{# Test 1: that we can open files
+ for my $path ( @files ){
+ cacheout $path;
+ print $path "$path 1\n";
+ }
+ print "not " unless scalar map({ -f } @files) == scalar @files;
+ print "ok 1\n";
+}
diff --git a/gnu/usr.bin/perl/lib/FileCache/t/02maxopen.t b/gnu/usr.bin/perl/lib/FileCache/t/02maxopen.t
new file mode 100644
index 00000000000..603edebc7f5
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/FileCache/t/02maxopen.t
@@ -0,0 +1,36 @@
+#!./perl
+use FileCache maxopen=>2;
+use Test;
+use vars qw(@files);
+BEGIN {
+ @files = qw(foo bar baz quux);
+ chdir 't' if -d 't';
+
+ #For tests within the perl distribution
+ @INC = '../lib' if -d '../lib';
+ END;
+ plan tests=>5;
+}
+END{
+ 1 while unlink @files;
+}
+
+{# Test 2: that we actually adhere to maxopen
+ for my $path ( @files ){
+ cacheout $path;
+ print $path "$path 1\n";
+ }
+
+ my @cat;
+ for my $path ( @files ){
+ ok(fileno($path) || $path =~ /^(?:foo|bar)$/);
+ next unless fileno($path);
+ print $path "$path 2\n";
+ close($path);
+ open($path, $path);
+ <$path>;
+ push @cat, <$path>;
+ close($path);
+ }
+ ok( grep(/^(?:baz|quux) 2$/, @cat) == 2 );
+}
diff --git a/gnu/usr.bin/perl/lib/FileCache/t/03append.t b/gnu/usr.bin/perl/lib/FileCache/t/03append.t
new file mode 100644
index 00000000000..a6ba6f3aac4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/FileCache/t/03append.t
@@ -0,0 +1,47 @@
+#!./perl
+use FileCache maxopen=>2;
+use vars qw(@files);
+BEGIN {
+ @files = qw(foo bar baz quux Foo_Bar);
+ chdir 't' if -d 't';
+
+ #For tests within the perl distribution
+ @INC = '../lib' if -d '../lib';
+ END;
+}
+END{
+ 1 while unlink @files;
+}
+
+print "1..2\n";
+
+{# Test 3: that we open for append on second viewing
+ my @cat;
+ for my $path ( @files ){
+ cacheout $path;
+ print $path "$path 3\n";
+ }
+ for my $path ( @files ){
+ cacheout $path;
+ print $path "$path 33\n";
+ }
+ for my $path ( @files ){
+ open($path, '<', $path);
+ push @cat, do{ local $/; <$path>};
+ close($path);
+ }
+ print 'not ' unless scalar grep(/\b3$/m, @cat) == scalar @files;
+ print "ok 1\n";
+ @cat = ();
+ for my $path ( @files ){
+ cacheout $path;
+ print $path "$path 333\n";
+ }
+ for my $path ( @files ){
+ open($path, '<', $path);
+ push @cat, do{ local $/; <$path>};
+ close($path);
+ }
+ print 'not ' unless scalar grep(/\b33$/m, @cat) == scalar @files;
+ print "ok 2\n";
+}
diff --git a/gnu/usr.bin/perl/lib/FileCache/t/04twoarg.t b/gnu/usr.bin/perl/lib/FileCache/t/04twoarg.t
new file mode 100644
index 00000000000..a2a70be2b61
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/FileCache/t/04twoarg.t
@@ -0,0 +1,24 @@
+#!./perl
+BEGIN {
+ use FileCache;
+ chdir 't' if -d 't';
+
+ #For tests within the perl distribution
+ @INC = '../lib' if -d '../lib';
+ END;
+}
+END{
+ unlink('foo');
+}
+
+print "1..1\n";
+
+{# Test 4: that 2 arg format works, and that we cycle on mode change
+ cacheout '>', "foo";
+ print foo "foo 4\n";
+ cacheout '+>', "foo";
+ print foo "foo 44\n";
+ seek(foo, 0, 0);
+ print 'not ' unless <foo> eq "foo 44\n";
+ print "ok 1\n";
+}
diff --git a/gnu/usr.bin/perl/lib/FileCache/t/05override.t b/gnu/usr.bin/perl/lib/FileCache/t/05override.t
new file mode 100644
index 00000000000..a807c256402
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/FileCache/t/05override.t
@@ -0,0 +1,21 @@
+#!./perl
+BEGIN {
+ use FileCache;
+ chdir 't' if -d 't';
+
+ #For tests within the perl distribution
+ @INC = '../lib' if -d '../lib';
+ END;
+}
+END{
+ unlink("Foo_Bar");
+}
+print "1..1\n";
+
+{# Test 5: that close is overridden properly within the caller
+ cacheout local $_ = "Foo_Bar";
+ print $_ "Hello World\n";
+ close($_);
+ print 'not ' if fileno($_);
+ print "ok 1\n";
+}
diff --git a/gnu/usr.bin/perl/lib/FileHandle.t b/gnu/usr.bin/perl/lib/FileHandle.t
index c994c8b4485..ddbd94474ee 100644
--- a/gnu/usr.bin/perl/lib/FileHandle.t
+++ b/gnu/usr.bin/perl/lib/FileHandle.t
@@ -22,7 +22,7 @@ autoflush STDOUT 1;
$mystdout = new_from_fd FileHandle 1,"w";
$| = 1;
autoflush $mystdout;
-print "1..11\n";
+print "1..12\n";
print $mystdout "ok ".fileno($mystdout)."\n";
@@ -93,3 +93,5 @@ else {
exit(0);
}
}
+
+print FileHandle->new('','r') ? "not ok 12\n" : "ok 12\n";
diff --git a/gnu/usr.bin/perl/lib/Getopt/Long/CHANGES b/gnu/usr.bin/perl/lib/Getopt/Long/CHANGES
index 5ed7d90928f..a06357d2225 100644
--- a/gnu/usr.bin/perl/lib/Getopt/Long/CHANGES
+++ b/gnu/usr.bin/perl/lib/Getopt/Long/CHANGES
@@ -1,3 +1,92 @@
+Changes in version 2.34
+-----------------------
+
+* Auto-vivification of array and hash refs
+
+ If an option is specified to require an array or hash ref, and a
+ scalar reference is passed, this is auto-vivified to array or hash
+ ref.
+
+ Example:
+
+ @ARGV = qw(--foo=xx);
+ GetOptions("foo=s@", \$var);
+ # Now $var->[0] eq "xx"
+
+* Auto-supplied verbose and help options are no longer taken into
+ account when determining option ambiguity. This eliminates the
+ common problem that you suddenly get an ambiguous option warning
+ when you have an option "verbose" and run your program with "-v".
+
+* Cosmetic changes in some error messages.
+
+Changes in version 2.33
+-----------------------
+
+**************** WARNING -- EXPERIMENTAL CODE AHEAD ****************
+
+The following new features are marked experimental. This means that if
+you are going to use them you _must_ watch out for the next release of
+Getopt::Long to see if the API has changed.
+
+* Getopt::Long can automatically handle --version and --help options
+ if the calling program did not specify a handler explicitly.
+
+ Two configuration parameters have been added: 'auto_help' (or
+ 'help') and 'auto_version' (or 'version'). If set, Getopt::Long will
+ itself take care of --help and --version options. Otherwise,
+ everything is exactly as it was before.
+
+ The new features will be enabled by default for programs that
+ explicitly require version 2.3203 or later.
+
+ Getopt::Long uses module Pod::Usage to produce the help message from
+ the SYNOPSIS section of the program's POD.
+
+ Using a --help (or -?) command line option will write the SYNOPSIS
+ section of the program's POD to STDOUT, and exit with status 0.
+ However, an illegal option will produce the help text to STDERR,
+ and exit with status 2. This is in accordance with current
+ conventions.
+
+* Two subroutines can be exported on demand:
+
+ - VersionMessage
+
+ This subroutine prints the standard version message.
+
+ - HelpMessage
+
+ This subroutine prints the standard help message.
+
+ Both subroutines take the same arguments as Pod::Usage::pod2usage,
+ see its documentation for details.
+
+ Example:
+
+ use Getopt::Long 2.33 qw(GetOptions HelpMessage);
+ GetOptions(...) or HelpMessage(2);
+
+**************** END EXPERIMENTAL CODE ****************
+
+* Subroutine Configure can now be exported on demand.
+
+* Negatable options (with "!") now also support the "no-" prefix.
+ On request of Ed Avis.
+
+* Some fixes with hashes and bundling.
+ Thanks to Anders Johnson and Andrei Gnepp.
+ Mandatory/optional status for hash values is now effective.
+ String valued options with no value now default to the empty string
+ instead of 1 (one).
+ NOTE: The hash options still remain more or less experimental.
+
+* Fix a pass_through bug where the options terminator (normally "--")
+ was not passed through in @ARGV.
+ Thanks to Philippe Verdret.
+
+* Add FAQ: I "use GetOpt::Long;" (Windows) and now it doesn't work.
+
Changes in version 2.32
-----------------------
@@ -7,12 +96,26 @@ was not used for value of a hash option.
* Remove 5.005 thread safety code. Getopt::Long is completely thread
safe when using the 5.8 ithreads.
+Changes in version 2.31
+-----------------------
+
+* Fix a bug where calling the configure method on a
+ Getopt::Long::Parser object would bail out with
+ Undefined subroutine &Getopt::Long::Parser::Configure called at
+ Getopt/Long.pm line 186.
+
+Changes in version 2.30
+-----------------------
+
+* Fix a problem where a 'die' from a 'warn' via a localized
+ $SIG{__WARN__} was not properly propagated from a callback.
+ Thanks to Diab Jerius.
+
Changes in version 2.29
-----------------------
* Fix a problem where options were not recognized when both
- auto_abbrev and ignore_case were disabled. Thanks to Seth Robertson
- <seth@systemdetection.com>.
+ auto_abbrev and ignore_case were disabled. Thanks to Seth Robertson.
* Remove Carp.
@@ -54,11 +157,11 @@ Changes in version 2.27
* Avoid errors on references when an option is found in error, e.g.
GetOptions('fo$@#' => \$var).
- Thanks to Wolfgang Laun <Wolfgang.Laun@alcatel.at>.
+ Thanks to Wolfgang Laun.
* When an option is specified more than once, an error is now
generated. E.g., GetOptions('foo', 'foo').
- Thanks to Wolfgang Laun <Wolfgang.Laun@alcatel.at>.
+ Thanks to Wolfgang Laun.
* Lots of internal restructoring to make room for extensions.
@@ -78,17 +181,6 @@ Changes in version 2.26
* Remove $VERSION_STRING for production versions.
-Changes in version 2.26
------------------------
-
-* New option type: 'o'. It accepts all kinds of integral numbers in
- Perl style, including decimal (24), octal (012), hexadecimal (0x2f)
- and binary (0b1001).
-
-* Fix problem with getopt_compat not matching +foo=bar.
-
-* Remove $VERSION_STRING for production versions.
-
Changes in version 2.25
-----------------------
diff --git a/gnu/usr.bin/perl/lib/Getopt/Long/README b/gnu/usr.bin/perl/lib/Getopt/Long/README
index 7870b8b7fc0..691253ded6d 100644
--- a/gnu/usr.bin/perl/lib/Getopt/Long/README
+++ b/gnu/usr.bin/perl/lib/Getopt/Long/README
@@ -80,14 +80,24 @@ command line options and how they must be handled:
- by entering the option name and the value in an associative array
(hash) or object (if it is a blessed hash);
- by calling a user-specified subroutine with the option name and
- the value as arguments;
+ the value as arguments (for hash options: the name, key and value);
- combinations of the above.
* Customization:
-The module contains a special method, Getopt::Long::Configure, to
-control configuration variables to activate (or de-activate) specific
-behavior. It can be called with one or more names of options:
+The module can be customized by specifying settings in the 'use'
+directive, or by calling a special method, Getopt::Long::Configure.
+For example, the following two cases are functionally equal:
+
+ use Getopt::Long qw(:config bundling no_ignore_case);
+
+and
+
+ use Getopt::Long;
+ Getopt::Long::Configure qw(bundling no_ignore_case);
+
+Some of the possible customizations. Most of them take a "no_" prefix
+to reverse the effect:
- default
@@ -164,8 +174,8 @@ behavior. It can be called with one or more names of options:
Using the object oriented interface, multiple parser objects can be
instantiated, each having their own configuration settings:
- $p1 = new Getopt::Long::Parser (config => ["posix"]);
- $p2 = new Getopt::Long::Parser (config => ["no_posix"]);
+ $p1 = new Getopt::Long::Parser (config => ["bundling"]);
+ $p2 = new Getopt::Long::Parser (config => ["posix"]);
if ($p1->getoptions(...options descriptions...)) ...
AVAILABILITY
@@ -182,7 +192,7 @@ Or use the CPAN search engine:
COPYRIGHT AND DISCLAIMER
========================
-Module Getopt::Long is Copyright 2002,1990 by Johan Vromans.
+Module Getopt::Long is Copyright 2003,1990 by Johan Vromans.
This program is free software; you can redistribute it and/or
modify it under the terms of the Perl Artistic License or the
GNU General Public License as published by the Free Software
diff --git a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-basic.t b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-basic.t
index c5d857d5b8d..f1916b291c0 100644
--- a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-basic.t
+++ b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-basic.t
@@ -1,14 +1,16 @@
#!./perl -w
BEGIN {
- chdir('t') if -d 't';
- @INC = '../lib';
+ if ($ENV{PERL_CORE}) {
+ @INC = '../lib';
+ chdir 't';
+ }
}
use Getopt::Long qw(:config no_ignore_case);
-die("Getopt::Long version 2.24 required--this is only version ".
+die("Getopt::Long version 2.23_03 required--this is only version ".
$Getopt::Long::VERSION)
- unless $Getopt::Long::VERSION >= 2.24;
+ unless $Getopt::Long::VERSION ge "2.24";
print "1..9\n";
diff --git a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-compat.t b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-compat.t
index 0bbe386846e..e211eeaec76 100644
--- a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-compat.t
+++ b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-compat.t
@@ -1,8 +1,10 @@
#!./perl -w
BEGIN {
- chdir('t') if -d 't';
- @INC = '../lib';
+ if ($ENV{PERL_CORE}) {
+ @INC = '../lib';
+ chdir 't';
+ }
}
require "newgetopt.pl";
diff --git a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-linkage.t b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-linkage.t
index 3bd81a35528..a3047cfc193 100644
--- a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-linkage.t
+++ b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-linkage.t
@@ -1,8 +1,10 @@
#!./perl -w
BEGIN {
- chdir('t') if -d 't';
- @INC = '../lib';
+ if ($ENV{PERL_CORE}) {
+ @INC = '../lib';
+ chdir 't';
+ }
}
use Getopt::Long;
diff --git a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-oo.t b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-oo.t
index 98f3eaadb9b..f8191d1db1c 100644
--- a/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-oo.t
+++ b/gnu/usr.bin/perl/lib/Getopt/Long/t/gol-oo.t
@@ -1,14 +1,16 @@
#!./perl -w
BEGIN {
- chdir('t') if -d 't';
- @INC = '../lib';
+ if ($ENV{PERL_CORE}) {
+ @INC = '../lib';
+ chdir 't';
+ }
}
use Getopt::Long;
-die("Getopt::Long version 2.24 required--this is only version ".
+die("Getopt::Long version 2.23_03 required--this is only version ".
$Getopt::Long::VERSION)
- unless $Getopt::Long::VERSION >= 2.24;
+ unless $Getopt::Long::VERSION ge "2.24";
print "1..9\n";
@ARGV = qw(-Foo -baR --foo bar);
diff --git a/gnu/usr.bin/perl/lib/Hash/Util.pm b/gnu/usr.bin/perl/lib/Hash/Util.pm
index f6dcd7e0a75..3d65ee0b116 100644
--- a/gnu/usr.bin/perl/lib/Hash/Util.pm
+++ b/gnu/usr.bin/perl/lib/Hash/Util.pm
@@ -7,9 +7,9 @@ use Carp;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(lock_keys unlock_keys lock_value unlock_value
- lock_hash unlock_hash
+ lock_hash unlock_hash hash_seed
);
-our $VERSION = 0.04;
+our $VERSION = 0.05;
=head1 NAME
@@ -17,9 +17,10 @@ Hash::Util - A selection of general-utility hash subroutines
=head1 SYNOPSIS
- use Hash::Util qw(lock_keys unlock_keys
+ use Hash::Util qw(lock_keys unlock_keys
lock_value unlock_value
- lock_hash unlock_hash);
+ lock_hash unlock_hash
+ hash_seed);
%hash = (foo => 42, bar => 23);
lock_keys(%hash);
@@ -32,6 +33,8 @@ Hash::Util - A selection of general-utility hash subroutines
lock_hash (%hash);
unlock_hash(%hash);
+ my $hashes_are_randomised = hash_seed() != 0;
+
=head1 DESCRIPTION
C<Hash::Util> contains special functions for manipulating hashes that
@@ -59,10 +62,13 @@ This is intended to largely replace the deprecated pseudo-hashes.
Restricts the given %hash's set of keys to @keys. If @keys is not
given it restricts it to its current keyset. No more keys can be
-added. delete() and exists() will still work, but it does not effect
-the set of allowed keys.
+added. delete() and exists() will still work, but will not alter
+the set of allowed keys. B<Note>: the current implementation prevents
+the hash from being bless()ed while it is in a locked state. Any attempt
+to do so will raise an exception. Of course you can still bless()
+the hash before you call lock_keys() so this shouldn't be a problem.
- unlock_keys(%hash;)
+ unlock_keys(%hash);
Removes the restriction on the %hash's keyset.
@@ -108,8 +114,8 @@ sub unlock_keys (\%) {
=item unlock_value
- lock_key (%hash, $key);
- unlock_key(%hash, $key);
+ lock_value (%hash, $key);
+ unlock_value(%hash, $key);
Locks and unlocks an individual key of a hash. The value of a locked
key cannot be changed.
@@ -173,8 +179,37 @@ sub unlock_hash (\%) {
}
+=item B<hash_seed>
+
+ my $hash_seed = hash_seed();
+
+hash_seed() returns the seed number used to randomise hash ordering.
+Zero means the "traditional" random hash ordering, non-zero means the
+new even more random hash ordering introduced in Perl 5.8.1.
+
+B<Note that the hash seed is sensitive information>: by knowing it one
+can craft a denial-of-service attack against Perl code, even remotely,
+see L<perlsec/"Algorithmic Complexity Attacks"> for more information.
+B<Do not disclose the hash seed> to people who don't need to know it.
+See also L<perlrun/PERL_HASH_SEED_DEBUG>.
+
+=cut
+
+sub hash_seed () {
+ Internals::rehash_seed();
+}
+
=back
+=head1 CAVEATS
+
+Note that the trapping of the restricted operations is not atomic:
+for example
+
+ eval { %hash = (illegal_key => 1) }
+
+leaves the C<%hash> empty rather than with its original contents.
+
=head1 AUTHOR
Michael G Schwern <schwern@pobox.com> on top of code by Nick
@@ -182,7 +217,8 @@ Ing-Simmons and Jeffrey Friedl.
=head1 SEE ALSO
-L<Scalar::Util>, L<List::Util>, L<Hash::Util>
+L<Scalar::Util>, L<List::Util>, L<Hash::Util>,
+and L<perlsec/"Algorithmic Complexity Attacks">.
=cut
diff --git a/gnu/usr.bin/perl/lib/Hash/Util.t b/gnu/usr.bin/perl/lib/Hash/Util.t
index 20efb443efc..48cbc7c0070 100644
--- a/gnu/usr.bin/perl/lib/Hash/Util.t
+++ b/gnu/usr.bin/perl/lib/Hash/Util.t
@@ -6,7 +6,7 @@ BEGIN {
chdir 't';
}
}
-use Test::More tests => 61;
+use Test::More tests => 157;
use strict;
my @Exported_Funcs;
@@ -14,6 +14,7 @@ BEGIN {
@Exported_Funcs = qw(lock_keys unlock_keys
lock_value unlock_value
lock_hash unlock_hash
+ hash_seed
);
use_ok 'Hash::Util', @Exported_Funcs;
}
@@ -74,21 +75,12 @@ $hash{locked} = 42;
is( $hash{locked}, 42, 'unlock_value' );
-TODO: {
-# local $TODO = 'assigning to a hash screws with locked keys';
-
+{
my %hash = ( foo => 42, locked => 23 );
lock_keys(%hash);
- lock_value(%hash, 'locked');
eval { %hash = ( wubble => 42 ) }; # we know this will bomb
- like( $@, qr/^Attempt to clear a restricted hash/ );
-
- eval { unlock_value(%hash, 'locked') }; # but this shouldn't
- is( $@, '', 'unlock_value() after denied assignment' );
-
- is_deeply( \%hash, { foo => 42, locked => 23 },
- 'hash should not be altered by denied assignment' );
+ like( $@, qr/^Attempt to access disallowed key 'wubble'/ );
unlock_keys(%hash);
}
@@ -98,16 +90,14 @@ TODO: {
lock_value(%hash, 'RO');
eval { %hash = (KEY => 1) };
- like( $@, qr/^Attempt to clear a restricted hash/ );
+ like( $@, qr/^Attempt to delete readonly key 'RO' from a restricted hash/ );
}
-# TODO: This should be allowed but it might require putting extra
-# code into aassign.
{
my %hash = (KEY => 1, RO => 2);
lock_keys(%hash);
eval { %hash = (KEY => 1, RO => 2) };
- like( $@, qr/^Attempt to clear a restricted hash/ );
+ is( $@, '');
}
@@ -227,3 +217,62 @@ like( $@, qr/^Attempt to access disallowed key 'I_DONT_EXIST' in a restricted ha
is ($hash{nowt}, undef,
"undef values should not be misunderstood as placeholders (again)");
}
+
+{
+ # perl #18651 - tim@consultix-inc.com found a rather nasty data dependant
+ # bug whereby hash iterators could lose hash keys (and values, as the code
+ # is common) for restricted hashes.
+
+ my @keys = qw(small medium large);
+
+ # There should be no difference whether it is restricted or not
+ foreach my $lock (0, 1) {
+ # Try setting all combinations of the 3 keys
+ foreach my $usekeys (0..7) {
+ my @usekeys;
+ for my $bits (0,1,2) {
+ push @usekeys, $keys[$bits] if $usekeys & (1 << $bits);
+ }
+ my %clean = map {$_ => length $_} @usekeys;
+ my %target;
+ lock_keys ( %target, @keys ) if $lock;
+
+ while (my ($k, $v) = each %clean) {
+ $target{$k} = $v;
+ }
+
+ my $message
+ = ($lock ? 'locked' : 'not locked') . ' keys ' . join ',', @usekeys;
+
+ is (scalar keys %target, scalar keys %clean, "scalar keys for $message");
+ is (scalar values %target, scalar values %clean,
+ "scalar values for $message");
+ # Yes. All these sorts are necessary. Even for "identical hashes"
+ # Because the data dependency of the test involves two of the strings
+ # colliding on the same bucket, so the iterator order (output of keys,
+ # values, each) depends on the addition order in the hash. And locking
+ # the keys of the hash involves behind the scenes key additions.
+ is_deeply( [sort keys %target] , [sort keys %clean],
+ "list keys for $message");
+ is_deeply( [sort values %target] , [sort values %clean],
+ "list values for $message");
+
+ is_deeply( [sort %target] , [sort %clean],
+ "hash in list context for $message");
+
+ my (@clean, @target);
+ while (my ($k, $v) = each %clean) {
+ push @clean, $k, $v;
+ }
+ while (my ($k, $v) = each %target) {
+ push @target, $k, $v;
+ }
+
+ is_deeply( [sort @target] , [sort @clean],
+ "iterating with each for $message");
+ }
+ }
+}
+
+my $hash_seed = hash_seed();
+ok($hash_seed >= 0, "hash_seed $hash_seed");
diff --git a/gnu/usr.bin/perl/lib/I18N/LangTags.pm b/gnu/usr.bin/perl/lib/I18N/LangTags.pm
index ab5ef38245e..d64058fb1a3 100644
--- a/gnu/usr.bin/perl/lib/I18N/LangTags.pm
+++ b/gnu/usr.bin/perl/lib/I18N/LangTags.pm
@@ -1,5 +1,5 @@
-# Time-stamp: "2002-02-02 20:43:03 MST"
+# Time-stamp: "2003-10-10 17:43:04 ADT"
# Sean M. Burke <sburke@cpan.org>
require 5.000;
@@ -17,7 +17,7 @@ require Exporter;
);
%EXPORT_TAGS = ('ALL' => \@EXPORT_OK);
-$VERSION = "0.27";
+$VERSION = "0.29";
=head1 NAME
@@ -333,7 +333,7 @@ More importantly, you assume I<at your peril> that superordinates of
$lang1 are mutually intelligible with $lang1. Consider this
carefully.
-=cut
+=cut
sub super_languages {
my $lang1 = $_[0];
@@ -388,7 +388,7 @@ tags. Think REAL hard about how you use this. YOU HAVE BEEN WARNED.
The output is untainted. If you don't know what tainting is,
don't worry about it.
-=cut
+=cut
sub locale2language_tag {
my $lang =
@@ -529,9 +529,16 @@ sub encode_language_tag {
# we can just handle them here with regexps.
$tag =~ s/^iw\b/he/i; # Hebrew
$tag =~ s/^in\b/id/i; # Indonesian
+ $tag =~ s/^cre\b/cr/i; # Cree
+ $tag =~ s/^jw\b/jv/i; # Javanese
$tag =~ s/^[ix]-lux\b/lb/i; # Luxemburger
$tag =~ s/^[ix]-navajo\b/nv/i; # Navajo
$tag =~ s/^ji\b/yi/i; # Yiddish
+ # SMB 2003 -- Hm. There's a bunch of new XXX->YY variances now,
+ # but maybe they're all so obscure I can ignore them. "Obscure"
+ # meaning either that the language is obscure, and/or that the
+ # XXX form was extant so briefly that it's unlikely it was ever
+ # used. I hope.
#
# These go FROM the simplex to complex form, to get
# similarity-comparison right. And that's okay, since
@@ -764,25 +771,22 @@ Character Sets and Languages".
Value and Encoded Word Extensions: Character Sets, Languages, and
Continuations".
-* RFC 2482, C<ftp://ftp.isi.edu/in-notes/rfc2482.txt>,
+* RFC 2482, C<ftp://ftp.isi.edu/in-notes/rfc2482.txt>,
"Language Tagging in Unicode Plain Text".
* Locale::Codes, in
C<http://www.perl.com/CPAN/modules/by-module/Locale/>
-* ISO 639, "Code for the representation of names of languages",
-C<http://www.indigo.ie/egt/standards/iso639/iso639-1-en.html>
-
* ISO 639-2, "Codes for the representation of names of languages",
-including three-letter codes,
-C<http://lcweb.loc.gov/standards/iso639-2/bibcodes.html>
+including two-letter and three-letter codes,
+C<http://www.loc.gov/standards/iso639-2/langcodes.html>
* The IANA list of registered languages (hopefully up-to-date),
-C<ftp://ftp.isi.edu/in-notes/iana/assignments/languages/>
+C<http://www.iana.org/assignments/language-tags>
=head1 COPYRIGHT
-Copyright (c) 1998-2001 Sean M. Burke. All rights reserved.
+Copyright (c) 1998-2003 Sean M. Burke. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
diff --git a/gnu/usr.bin/perl/lib/I18N/LangTags/ChangeLog b/gnu/usr.bin/perl/lib/I18N/LangTags/ChangeLog
index f3608f7125e..ec76c0c9a09 100644
--- a/gnu/usr.bin/perl/lib/I18N/LangTags/ChangeLog
+++ b/gnu/usr.bin/perl/lib/I18N/LangTags/ChangeLog
@@ -1,6 +1,27 @@
Revision history for Perl module I18N::LangTags.
- Time-stamp: "2002-02-02 20:45:47 MST"
+ Time-stamp: "2003-10-10 17:07:55 ADT"
+2003-10-10 Sean M. Burke sburke@cpan.org
+
+ * Release 0.29
+
+ Minor bugfix to I18N::LangTags::List code. Addition of the
+ is_decent function, and the 02decency.t test for it.
+
+ Better Makefile. Thanks to everyone who told me about the
+ INSTALLDIRS trick.
+
+
+
+2003-07-20 Sean M. Burke sburke@cpan.org
+
+ * Release 0.28
+ Doc fixes in I18N::LangTags, plus a few added variances (jw/jv,
+ cre/cr, etc.)
+ Lots of updates to I18N::LangTags::List
+ Deleted rfc3066.txt from dist.
+ Moved test.pl to t/01test.t and added more tests.
+
2002-02-02 Sean M. Burke sburke@cpan.org
* Release 0.27 -- minor mods to ::List:
diff --git a/gnu/usr.bin/perl/lib/I18N/LangTags/List.pm b/gnu/usr.bin/perl/lib/I18N/LangTags/List.pm
index 2dbd19a5d78..37ded04eef0 100644
--- a/gnu/usr.bin/perl/lib/I18N/LangTags/List.pm
+++ b/gnu/usr.bin/perl/lib/I18N/LangTags/List.pm
@@ -1,10 +1,10 @@
require 5;
package I18N::LangTags::List;
-# Time-stamp: "2002-02-02 20:13:58 MST"
+# Time-stamp: "2003-10-10 17:39:45 ADT"
use strict;
-use vars qw(%Name $Debug $VERSION);
-$VERSION = '0.25';
+use vars qw(%Name %Is_Disrec $Debug $VERSION);
+$VERSION = '0.29';
# POD at the end.
#----------------------------------------------------------------------
@@ -12,18 +12,23 @@ $VERSION = '0.25';
# read the table out of our own POD!
my $seeking = 1;
my $count = 0;
- my($tag,$name);
+ my($disrec,$tag,$name);
+ my $last_name = '';
while(<I18N::LangTags::List::DATA>) {
if($seeking) {
$seeking = 0 if m/=for woohah/;
- } else {
- next unless ($tag, $name) =
- m/\{([-0-9a-zA-Z]+)\}(?:\s*:)?\s*([^\[\]]+)/;
+ } elsif( ($disrec, $tag, $name) =
+ m/(\[?)\{([-0-9a-zA-Z]+)\}(?:\s*:)?\s*([^\[\]]+)/
+ ) {
$name =~ s/\s*[;\.]*\s*$//g;
next unless $name;
++$count;
print "<$tag> <$name>\n" if $Debug;
- $Name{$tag} = $name;
+ $last_name = $Name{$tag} = $name;
+ $Is_Disrec{$tag} = 1 if $disrec;
+ } elsif (m/[Ff]ormerly \"([-a-z0-9]+)\"/) {
+ $Name{$1} = "$last_name (old tag)" if $last_name;
+ $Is_Disrec{$1} = 1;
}
}
die "No tags read??" unless $count;
@@ -71,6 +76,42 @@ sub name {
return "$name (Subform \"$subform\")";
}
+#--------------------------------------------------------------------------
+
+sub is_decent {
+ my $tag = lc($_[0] || return 0);
+ #require I18N::LangTags;
+
+ return 0 unless
+ $tag =~
+ /^(?: # First subtag
+ [xi] | [a-z]{2,3}
+ )
+ (?: # Subtags thereafter
+ - # separator
+ [a-z0-9]{1,8} # subtag
+ )*
+ $/xs;
+
+ my @supers = ();
+ foreach my $bit (split('-', $tag)) {
+ push @supers,
+ scalar(@supers) ? ($supers[-1] . '-' . $bit) : $bit;
+ }
+ return 0 unless @supers;
+ shift @supers if $supers[0] =~ m<^(i|x|sgn)$>s;
+ return 0 unless @supers;
+
+ foreach my $f ($tag, @supers) {
+ return 0 if $Is_Disrec{$f};
+ return 2 if $Name{$f};
+ # so that decent subforms of indecent tags are decent
+ }
+ return 2 if $Name{$tag}; # not only is it decent, it's known!
+ return 1;
+}
+
+#--------------------------------------------------------------------------
1;
__DATA__
@@ -95,7 +136,7 @@ prints:
=head1 DESCRIPTION
-This module provides a function
+This module provides a function
C<I18N::LangTags::List::name( I<langtag> ) > that takes
a language tag (see L<I18N::LangTags|I18N::LangTags>)
and returns the best attempt at an English name for it, or
@@ -103,6 +144,13 @@ undef if it can't make sense of the tag.
The function I18N::LangTags::List::name(...) is not exported.
+This module also provides a function
+C<I18N::LangTags::List::is_decent( I<langtag> )> that returns true iff
+the language tag is syntactically valid and is for general use (like
+"fr" or "fr-ca", below). That is, it returns false for tags that are
+syntactically invalid and for tags, like "aus", that are listed in
+brackets below. This function is not exported.
+
The map of tags-to-names that it uses is accessable as
%I18N::LangTags::List::Name, and it's the same as the list
that follows in this documentation, which should be useful
@@ -114,7 +162,7 @@ Internet language tags, as defined in RFC 3066, are a formalism
for denoting human languages. The two-letter ISO 639-1 language
codes are well known (as "en" for English), as are their forms
when qualified by a country code ("en-US"). Less well-known are the
-arbitrary-length non-ISO codes (like "i-mingo"), and the
+arbitrary-length non-ISO codes (like "i-mingo"), and the
recently (in 2001) introduced three-letter ISO-639-2 codes.
Remember these important facts:
@@ -195,6 +243,10 @@ eq Abkhaz
=item {ada} : Adangme
+=item {ady} : Adyghe
+
+eq Adygei
+
=item {aa} : Afar
=item {afh} : Afrihili
@@ -205,7 +257,9 @@ eq Abkhaz
=item [{afa} : Afro-Asiatic (Other)]
-=item {aka} : Akan
+=item {ak} : Akan
+
+(Formerly "aka".)
=item {akk} : Akkadian
@@ -264,8 +318,14 @@ NOT Amharic! NOT Samaritan Aramaic!
=item {hy} : Armenian
+=item {an} : Aragonese
+
=item [{art} : Artificial (Other)]
+=item {ast} : Asturian
+
+eq Bable.
+
=item {as} : Assamese
=item [{ath} : Athapascan languages]
@@ -276,7 +336,9 @@ eq Athabaskan. eq Athapaskan. eq Athabascan.
=item [{map} : Austronesian (Other)]
-=item {ava} : Avaric
+=item {av} : Avaric
+
+(Formerly "ava".)
=item {ae} : Avestan
@@ -290,13 +352,20 @@ eq Zend
eq Azeri
+Notable forms:
+{az-Arab} Azerbaijani in Arabic script;
+{az-Cyrl} Azerbaijani in Cyrillic script;
+{az-Latn} Azerbaijani in Latin script.
+
=item {ban} : Balinese
=item [{bat} : Baltic (Other)]
=item {bal} : Baluchi
-=item {bam} : Bambara
+=item {bm} : Bambara
+
+(Formerly "bam".)
=item [{bai} : Bamileke languages]
@@ -403,14 +472,16 @@ eq Nyanja. eq Chinyanja.
=item {zh} : Chinese
Many forms are mutually un-intelligible in spoken media.
-Notable subforms:
+Notable forms:
+{zh-Hans} Chinese, in simplified script;
+{zh-Hant} Chinese, in traditional script;
+{zh-tw} Taiwan Chinese;
{zh-cn} PRC Chinese;
-{zh-hk} Hong Kong Chinese;
-{zh-mo} Macau Chinese;
{zh-sg} Singapore Chinese;
-{zh-tw} Taiwan Chinese;
+{zh-mo} Macau Chinese;
+{zh-hk} Hong Kong Chinese;
{zh-guoyu} Mandarin [Putonghua/Guoyu];
-{zh-hakka} Hakka [formerly i-hakka];
+{zh-hakka} Hakka [formerly "i-hakka"];
{zh-min} Hokkien;
{zh-min-nan} Southern Hokkien;
{zh-wuu} Shanghaiese;
@@ -447,9 +518,9 @@ eq Trukese. eq Chuuk. eq Truk. eq Ruk.
eq Corse.
-=item {cre} : Cree
+=item {cr} : Cree
-NOT Creek!
+NOT Creek! (Formerly "cre".)
=item {mus} : Creek
@@ -477,6 +548,8 @@ eq Nakota. eq Latoka.
=item {da} : Danish
+=item {dar} : Dargwa
+
=item {day} : Dayak
=item {i-default} : Default (Fallthru) Language
@@ -491,7 +564,9 @@ messages, for example.
=item {din} : Dinka
-=item {div} : Divehi
+=item {dv} : Divehi
+
+eq Maldivian. (Formerly "div".)
=item {doi} : Dogri
@@ -555,13 +630,19 @@ Notable forms:
eq Anglo-Saxon. (Historical)
+=item {i-enochian} : Enochian (Artificial)
+
+=item {myv} : Erzya
+
=item {eo} : Esperanto
(Artificial)
=item {et} : Estonian
-=item {ewe} : Ewe
+=item {ee} : Ewe
+
+(Formerly "ewe".)
=item {ewo} : Ewondo
@@ -603,7 +684,9 @@ Notable forms:
=item {fur} : Friulian
-=item {ful} : Fulah
+=item {ff} : Fulah
+
+(Formerly "ful".)
=item {gaa} : Ga
@@ -615,7 +698,9 @@ NOT Scots!
eq Galician
-=item {lug} : Ganda
+=item {lg} : Ganda
+
+(Formerly "lug".)
=item {gay} : Gayo
@@ -679,6 +764,10 @@ eq Gwichin
=item {hai} : Haida
+=item {ht} : Haitian
+
+eq Haitian Creole
+
=item {ha} : Hausa
=item {haw} : Hawaiian
@@ -716,7 +805,13 @@ Hawai'ian
=item {is} : Icelandic
-=item {ibo} : Igbo
+=item {io} : Ido
+
+(Artificial)
+
+=item {ig} : Igbo
+
+(Formerly "ibo".)
=item {ijo} : Ijo
@@ -733,6 +828,8 @@ Hawai'ian
=for etc
{in} Indonesian (old tag)
+=item {inh} : Ingush
+
=item {ia} : Interlingua (International Auxiliary Language Association)
(Artificial) NOT Interlingue!
@@ -773,12 +870,16 @@ Notable forms:
(NOT "jp"!)
-=item {jw} : Javanese
+=item {jv} : Javanese
+
+(Formerly "jw" because of a typo.)
=item {jrb} : Judeo-Arabic
=item {jpr} : Judeo-Persian
+=item {kbd} : Kabardian
+
=item {kab} : Kabyle
=item {kac} : Kachin
@@ -787,13 +888,19 @@ Notable forms:
eq Greenlandic "Eskimo"
+=item {xal} : Kalmyk
+
=item {kam} : Kamba
=item {kn} : Kannada
eq Kanarese. NOT Canadian!
-=item {kau} : Kanuri
+=item {kr} : Kanuri
+
+(Formerly "kau".)
+
+=item {krc} : Karachay-Balkar
=item {kaa} : Kara-Kalpak
@@ -801,6 +908,10 @@ eq Kanarese. NOT Canadian!
=item {ks} : Kashmiri
+=item {csb} : Kashubian
+
+eq Kashub
+
=item {kaw} : Kawi
=item {kk} : Kazakh
@@ -829,7 +940,9 @@ eq Gikuyu.
=item {kv} : Komi
-=item {kon} : Kongo
+=item {kg} : Kongo
+
+(Formerly "kon".)
=item {kok} : Konkani
@@ -877,13 +990,17 @@ eq Lettish.
=item {lb} : Letzeburgesch
-eq Luxemburgian, eq Luxemburger. (Formerly i-lux.)
+eq Luxemburgian, eq Luxemburger. (Formerly "i-lux".)
=for etc
{i-lux} Letzeburgesch (old tag)
=item {lez} : Lezghian
+=item {li} : Limburgish
+
+eq Limburger, eq Limburgan. NOT Letzeburgesch!
+
=item {ln} : Lingala
=item {lt} : Lithuanian
@@ -892,9 +1009,13 @@ eq Luxemburgian, eq Luxemburger. (Formerly i-lux.)
eq Low Saxon. eq Low German. eq Low Saxon.
+=item {art-lojban} : Lojban (Artificial)
+
=item {loz} : Lozi
-=item {lub} : Luba-Katanga
+=item {lu} : Luba-Katanga
+
+(Formerly "lub".)
=item {lua} : Luba-Lulua
@@ -985,6 +1106,8 @@ Don't use this.
=item {moh} : Mohawk
+=item {mdf} : Moksha
+
=item {mo} : Moldavian
eq Moldovan.
@@ -1007,11 +1130,13 @@ Not for normal use.
=item {nah} : Nahuatl
+=item {nap} : Neapolitan
+
=item {na} : Nauru
=item {nv} : Navajo
-eq Navaho. (Formerly i-navajo.)
+eq Navaho. (Formerly "i-navajo".)
=for etc
{i-navajo} Navajo (old tag)
@@ -1038,6 +1163,8 @@ eq Nepalese. Notable forms:
=item {niu} : Niuean
+=item {nog} : Nogai
+
=item {non} : Old Norse
(Historical)
@@ -1046,24 +1173,20 @@ eq Nepalese. Notable forms:
Do not use this.
-=item {se} : Northern Sami
-
-eq Lappish. eq Lapp. eq (Northern) Saami.
-
=item {no} : Norwegian
Note the two following forms:
=item {nb} : Norwegian Bokmal
-eq BokmE<aring>l, (A form of Norwegian.) (Formerly no-bok.)
+eq BokmE<aring>l, (A form of Norwegian.) (Formerly "no-bok".)
=for etc
{no-bok} Norwegian Bokmal (old tag)
=item {nn} : Norwegian Nynorsk
-(A form of Norwegian.) (Formerly no-nyn.)
+(A form of Norwegian.) (Formerly "no-nyn".)
=for etc
{no-nyn} Norwegian Nynorsk (old tag)
@@ -1082,9 +1205,9 @@ eq BokmE<aring>l, (A form of Norwegian.) (Formerly no-bok.)
eq ProvenE<ccedil>al, eq Provencal
-=item {oji} : Ojibwa
+=item {oj} : Ojibwa
-eq Ojibwe.
+eq Ojibwe. (Formerly "oji".)
=item {or} : Oriya
@@ -1202,6 +1325,18 @@ Large language group.
NOT Aramaic!
+=item {se} : Northern Sami
+
+eq Lappish. eq Lapp. eq (Northern) Saami.
+
+=item {sma} : Southern Sami
+
+=item {smn} : Inari Sami
+
+=item {smj} : Lule Sami
+
+=item {sms} : Skolt Sami
+
=item [{smi} : Sami languages (Other)]
=item {sm} : Samoan
@@ -1234,6 +1369,10 @@ NOT Scots Gaelic!
eq Serb. NOT Sorbian.
+Notable forms:
+{sr-Cyrl} : Serbian in Cyrillic script;
+{sr-Latn} : Serbian in Latin script.
+
=item {srr} : Serer
=item {shn} : Shan
@@ -1250,6 +1389,8 @@ Always use with a subtag. Notable forms:
{sgn-ni} Nicaraguan Sign Language (ISN);
{sgn-us} American Sign Language (ASL).
+(And so on with other country codes as the subtag.)
+
=item {bla} : Siksika
eq Blackfoot. eq Pikanii.
@@ -1422,6 +1563,8 @@ Same as Setswana.
=item {tum} : Tumbuka
+=item [{tup} : Tupi languages]
+
=item {tr} : Turkish
(Typically in Roman script)
@@ -1430,6 +1573,10 @@ Same as Setswana.
(Typically in Arabic script) (Historical)
+=item {crh} : Crimean Turkish
+
+eq Crimean Tatar
+
=item {tk} : Turkmen
eq Turkmeni.
@@ -1442,6 +1589,8 @@ eq Tuvan. eq Tuvin.
=item {tw} : Twi
+=item {udm} : Udmurt
+
=item {uga} : Ugaritic
NOT Ugric!
@@ -1462,11 +1611,15 @@ Not a tag for normal use.
eq E<Ouml>zbek
+Notable forms:
+{uz-Cyrl} Uzbek in Cyrillic script;
+{uz-Latn} Uzbek in Latin script.
+
=item {vai} : Vai
-=item {ven} : Venda
+=item {ve} : Venda
-NOT Wendish! NOT Wend! NOT Avestan!
+NOT Wendish! NOT Wend! NOT Avestan! (Formerly "ven".)
=item {vi} : Vietnamese
@@ -1482,6 +1635,8 @@ eq Votian. eq Vod.
=item [{wak} : Wakashan languages]
+=item {wa} : Walloon
+
=item {wal} : Walamo
eq Wolaytta.
@@ -1517,12 +1672,14 @@ or IANA. Example, x-double-dutch
eq Yap
+=item {ii} : Sichuan Yi
+
=item {yi} : Yiddish
-Formerly "ji". Sometimes in Roman script, sometimes in Hebrew script.
+Formerly "ji". Usually in Hebrew script.
-=for etc
-{ji} Yiddish (old tag)
+Notable forms:
+{yi-latn} Yiddish in Latin script
=item {yo} : Yoruba
@@ -1558,7 +1715,7 @@ L<I18N::LangTags|I18N::LangTags> and its "See Also" section.
=head1 COPYRIGHT AND DISCLAIMER
-Copyright (c) 2001,2002 Sean M. Burke. All rights reserved.
+Copyright (c) 2001,2002,2003 Sean M. Burke. All rights reserved.
You can redistribute and/or
modify this document under the same terms as Perl itself.
diff --git a/gnu/usr.bin/perl/lib/I18N/LangTags/README b/gnu/usr.bin/perl/lib/I18N/LangTags/README
index fbae05f43d3..2ac60530167 100644
--- a/gnu/usr.bin/perl/lib/I18N/LangTags/README
+++ b/gnu/usr.bin/perl/lib/I18N/LangTags/README
@@ -61,7 +61,7 @@ AVAILABILITY
The latest version of I18N::LangTags is available from the
Comprehensive Perl Archive Network (CPAN). Visit
-<http://www.cpan.org/> to find a CPAN site near you.
+<http://www.perl.com/CPAN/> to find a CPAN site near you.
COPYRIGHT
diff --git a/gnu/usr.bin/perl/lib/I18N/LangTags/t/01test.t b/gnu/usr.bin/perl/lib/I18N/LangTags/t/01test.t
new file mode 100644
index 00000000000..86e251778f7
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/I18N/LangTags/t/01test.t
@@ -0,0 +1,101 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl test.pl'
+
+######################### We start with some black magic to print on failure.
+require 5;
+ # Time-stamp: "2003-07-20 07:36:49 ADT"
+use strict;
+use Test;
+BEGIN { plan tests => 64 };
+BEGIN { ok 1 }
+use I18N::LangTags (':ALL');
+
+print "# Perl v$], I18N::LangTags v$I18N::LangTags::VERSION\n";
+
+ok !is_language_tag('');
+ok is_language_tag('fr');
+ok is_language_tag('fr-ca');
+ok is_language_tag('fr-CA');
+ok !is_language_tag('fr-CA-');
+ok !is_language_tag('fr_CA');
+ok is_language_tag('fr-ca-joual');
+ok !is_language_tag('frca');
+ok is_language_tag('nav'); # (not actual tag)
+ok is_language_tag('nav-shiprock'); # (not actual tag)
+ok !is_language_tag('nav-ceremonial'); # subtag too long
+ok !is_language_tag('x');
+ok !is_language_tag('i');
+ok is_language_tag('i-borg'); # NB: fictitious tag
+ok is_language_tag('x-borg');
+ok is_language_tag('x-borg-prot5123');
+ok same_language_tag('x-borg-prot5123', 'i-BORG-Prot5123' );
+ok !same_language_tag('en', 'en-us' );
+
+ok 0 == similarity_language_tag('en-ca', 'fr-ca');
+ok 1 == similarity_language_tag('en-ca', 'en-us');
+ok 2 == similarity_language_tag('en-us-southern', 'en-us-western');
+ok 2 == similarity_language_tag('en-us-southern', 'en-us');
+
+ok grep $_ eq 'hi', panic_languages('kok');
+ok grep $_ eq 'en', panic_languages('x-woozle-wuzzle');
+ok ! grep $_ eq 'mr', panic_languages('it');
+ok grep $_ eq 'es', panic_languages('it');
+ok grep $_ eq 'it', panic_languages('es');
+
+
+print "# Now the ::List tests...\n";
+print "# Perl v$], I18N::LangTags::List v$I18N::LangTags::List::VERSION\n";
+
+use I18N::LangTags::List;
+foreach my $lt (qw(
+ en
+ en-us
+ en-kr
+ el
+ elx
+ i-mingo
+ i-mingo-tom
+ x-mingo-tom
+ it
+ it-it
+ it-IT
+ it-FR
+ ak
+ aka
+ jv
+ jw
+ no
+ no-nyn
+ nn
+ i-lux
+ lb
+ wa
+ yi
+ ji
+ den-syllabic
+ den-syllabic-western
+ den-western
+ den-latin
+ cre-syllabic
+ cre-syllabic-western
+ cre-western
+ cre-latin
+ cr-syllabic
+ cr-syllabic-western
+ cr-western
+ cr-latin
+)) {
+ my $name = I18N::LangTags::List::name($lt);
+ if($name) {
+ ok(1);
+ print "# $lt -> $name\n";
+ } else {
+ ok(0);
+ print "# Failed lookup on $lt\n";
+ }
+}
+
+
+
+print "# So there!\n";
+
diff --git a/gnu/usr.bin/perl/lib/I18N/LangTags/t/02decency.t b/gnu/usr.bin/perl/lib/I18N/LangTags/t/02decency.t
new file mode 100644
index 00000000000..a56a798a333
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/I18N/LangTags/t/02decency.t
@@ -0,0 +1,30 @@
+
+require 5;
+ # Time-stamp: "2003-10-10 17:37:34 ADT"
+use strict;
+use Test;
+BEGIN { plan tests => 17 };
+BEGIN { ok 1 }
+use I18N::LangTags::List;
+
+print "# Perl v$], I18N::LangTags::List v$I18N::LangTags::List::VERSION\n";
+
+ok I18N::LangTags::List::name('fr'), 'French';
+ok I18N::LangTags::List::name('fr-fr');
+ok !I18N::LangTags::List::name('El Zorcho');
+ok !I18N::LangTags::List::name();
+
+
+ok !I18N::LangTags::List::is_decent();
+ok I18N::LangTags::List::is_decent('fr');
+ok I18N::LangTags::List::is_decent('fr-blorch');
+ok !I18N::LangTags::List::is_decent('El Zorcho');
+ok !I18N::LangTags::List::is_decent('sgn');
+ok I18N::LangTags::List::is_decent('sgn-us');
+ok !I18N::LangTags::List::is_decent('i');
+ok I18N::LangTags::List::is_decent('i-mingo');
+ok I18N::LangTags::List::is_decent('i-mingo-tom');
+ok !I18N::LangTags::List::is_decent('cel');
+ok I18N::LangTags::List::is_decent('cel-gaulish');
+
+ok 1; # one for the road
diff --git a/gnu/usr.bin/perl/lib/Locale/Codes/t/languages.t b/gnu/usr.bin/perl/lib/Locale/Codes/t/languages.t
index c643f3a3073..92ccf4d27ec 100644
--- a/gnu/usr.bin/perl/lib/Locale/Codes/t/languages.t
+++ b/gnu/usr.bin/perl/lib/Locale/Codes/t/languages.t
@@ -47,7 +47,7 @@ no utf8; # we contain Latin-1
'code2language("nd") eq "Ndebele, North"',
'code2language("ng") eq "Ndonga"',
'code2language("nn") eq "Norwegian Nynorsk"',
- 'code2language("nb") eq "Norwegian Bokmål"',
+ 'code2language("nb") eq "Norwegian Bokmal"',
'code2language("ny") eq "Chichewa; Nyanja"',
'code2language("oc") eq "Occitan (post 1500)"',
'code2language("os") eq "Ossetian; Ossetic"',
diff --git a/gnu/usr.bin/perl/lib/Locale/Country.pm b/gnu/usr.bin/perl/lib/Locale/Country.pm
index 07ae83325cd..eab7249684c 100644
--- a/gnu/usr.bin/perl/lib/Locale/Country.pm
+++ b/gnu/usr.bin/perl/lib/Locale/Country.pm
@@ -17,7 +17,7 @@ use Locale::Constants;
# Public Global Variables
#-----------------------------------------------------------------------
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
-$VERSION = sprintf("%d.%02d", q$Revision: 2.6 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.61 $ =~ /(\d+)\.(\d+)/);
@ISA = qw(Exporter);
@EXPORT = qw(code2country country2code
all_country_codes all_country_names
@@ -267,6 +267,7 @@ sub _code2codeset
my ($alpha2, $alpha3, $numeric);
my ($country, @countries);
+ local $_;
while (<DATA>)
{
diff --git a/gnu/usr.bin/perl/lib/Locale/Currency.pm b/gnu/usr.bin/perl/lib/Locale/Currency.pm
index 34b85917ddb..8a94838886b 100644
--- a/gnu/usr.bin/perl/lib/Locale/Currency.pm
+++ b/gnu/usr.bin/perl/lib/Locale/Currency.pm
@@ -15,7 +15,7 @@ require Exporter;
# Public Global Variables
#-----------------------------------------------------------------------
use vars qw($VERSION @ISA @EXPORT);
-$VERSION = sprintf("%d.%02d", q$Revision: 2.2 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.21 $ =~ /(\d+)\.(\d+)/);
@ISA = qw(Exporter);
@EXPORT = qw(&code2currency &currency2code
&all_currency_codes &all_currency_names );
@@ -108,6 +108,7 @@ sub all_currency_names
my $code;
my $currency;
+ local $_;
while (<DATA>)
{
diff --git a/gnu/usr.bin/perl/lib/Locale/Language.pm b/gnu/usr.bin/perl/lib/Locale/Language.pm
index f47e523fc22..838e7e14b0f 100644
--- a/gnu/usr.bin/perl/lib/Locale/Language.pm
+++ b/gnu/usr.bin/perl/lib/Locale/Language.pm
@@ -14,7 +14,7 @@ require Exporter;
# Public Global Variables
#-----------------------------------------------------------------------
use vars qw($VERSION @ISA @EXPORT);
-$VERSION = sprintf("%d.%02d", q$Revision: 2.2 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.21 $ =~ /(\d+)\.(\d+)/);
@ISA = qw(Exporter);
@EXPORT = qw(&code2language &language2code
&all_language_codes &all_language_names );
@@ -107,6 +107,7 @@ sub all_language_names
my $code;
my $language;
+ local $_;
while (<DATA>)
{
@@ -231,7 +232,7 @@ mt:Maltese
my:Burmese
na:Nauru
-nb:Norwegian Bokmål
+nb:Norwegian Bokmal
nd:Ndebele, North
ne:Nepali
ng:Ndonga
@@ -300,7 +301,7 @@ ur:Urdu
uz:Uzbek
vi:Vietnamese
-vo:Volapük
+vo:Volapuk
wo:Wolof
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext.pm b/gnu/usr.bin/perl/lib/Locale/Maketext.pm
index 24bb2fa1f06..b978312d8f0 100644
--- a/gnu/usr.bin/perl/lib/Locale/Maketext.pm
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext.pm
@@ -1,5 +1,5 @@
-# Time-stamp: "2001-06-21 23:09:33 MDT"
+# Time-stamp: "2003-06-21 23:41:57 AHDT"
require 5;
package Locale::Maketext;
@@ -14,7 +14,7 @@ use I18N::LangTags 0.21 ();
BEGIN { unless(defined &DEBUG) { *DEBUG = sub () {0} } }
# define the constant 'DEBUG' at compile-time
-$VERSION = "1.03";
+$VERSION = "1.06";
@ISA = ();
$MATCH_SUPERS = 1;
@@ -252,11 +252,8 @@ sub get_handle { # This is a constructor and, yes, it CAN FAIL.
unless(@languages) { # Calling with no args is magical! wooo, magic!
if(length( $ENV{'REQUEST_METHOD'} || '' )) { # I'm a CGI
- my $in = $ENV{'HTTP_ACCEPT_LANGUAGE'} || '';
- # supposedly that works under mod_perl, too.
- $in =~ s<\([\)]*\)><>g; # Kill parens'd things -- just a hack.
- @languages = &I18N::LangTags::extract_language_tags($in) if length $in;
- # ...which untaints, incidentally.
+ @languages = $base_class->_http_accept_langs;
+ # it's off in its own routine because it's complicated
} else { # Not running as a CGI: try to puzzle out from the environment
if(length( $ENV{'LANG'} || '' )) {
@@ -331,281 +328,60 @@ sub get_handle { # This is a constructor and, yes, it CAN FAIL.
#
###########################################################################
-sub _compile {
- # This big scarp routine compiles an entry.
- # It returns either a coderef if there's brackety bits in this, or
- # otherwise a ref to a scalar.
-
- my $target = ref($_[0]) || $_[0];
-
- my(@code);
- my(@c) = (''); # "chunks" -- scratch.
- my $call_count = 0;
- my $big_pile = '';
- {
- my $in_group = 0; # start out outside a group
- my($m, @params); # scratch
-
- while($_[1] =~ # Iterate over chunks.
- m<\G(
- [^\~\[\]]+ # non-~[] stuff
- |
- ~. # ~[, ~], ~~, ~other
- |
- \[ # [ presumably opening a group
- |
- \] # ] presumably closing a group
- |
- ~ # terminal ~ ?
- |
- $
- )>xgs
- ) {
- print " \"$1\"\n" if DEBUG > 2;
-
- if($1 eq '[' or $1 eq '') { # "[" or end
- # Whether this is "[" or end, force processing of any
- # preceding literal.
- if($in_group) {
- if($1 eq '') {
- $target->_die_pointing($_[1], "Unterminated bracket group");
- } else {
- $target->_die_pointing($_[1], "You can't nest bracket groups");
- }
- } else {
- if($1 eq '') {
- print " [end-string]\n" if DEBUG > 2;
- } else {
- $in_group = 1;
- }
- die "How come \@c is empty?? in <$_[1]>" unless @c; # sanity
- if(length $c[-1]) {
- # Now actually processing the preceding literal
- $big_pile .= $c[-1];
- if($USE_LITERALS and (
- (ord('A') == 65)
- ? $c[-1] !~ m<[^\x20-\x7E]>s
- # ASCII very safe chars
- : $c[-1] !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
- # EBCDIC very safe chars
- )) {
- # normal case -- all very safe chars
- $c[-1] =~ s/'/\\'/g;
- push @code, q{ '} . $c[-1] . "',\n";
- $c[-1] = ''; # reuse this slot
- } else {
- push @code, ' $c[' . $#c . "],\n";
- push @c, ''; # new chunk
- }
- }
- # else just ignore the empty string.
- }
-
- } elsif($1 eq ']') { # "]"
- # close group -- go back in-band
- if($in_group) {
- $in_group = 0;
-
- print " --Closing group [$c[-1]]\n" if DEBUG > 2;
-
- # And now process the group...
-
- if(!length($c[-1]) or $c[-1] =~ m/^\s+$/s) {
- DEBUG > 2 and print " -- (Ignoring)\n";
- $c[-1] = ''; # reset out chink
- next;
- }
-
- #$c[-1] =~ s/^\s+//s;
- #$c[-1] =~ s/\s+$//s;
- ($m,@params) = split(",", $c[-1], -1); # was /\s*,\s*/
-
- # A bit of a hack -- we've turned "~,"'s into DELs, so turn
- # 'em into real commas here.
- if (ord('A') == 65) { # ASCII, etc
- foreach($m, @params) { tr/\x7F/,/ }
- } else { # EBCDIC (1047, 0037, POSIX-BC)
- # Thanks to Peter Prymmer for the EBCDIC handling
- foreach($m, @params) { tr/\x07/,/ }
- }
-
- # Special-case handling of some method names:
- if($m eq '_*' or $m =~ m<^_(-?\d+)$>s) {
- # Treat [_1,...] as [,_1,...], etc.
- unshift @params, $m;
- $m = '';
- } elsif($m eq '*') {
- $m = 'quant'; # "*" for "times": "4 cars" is 4 times "cars"
- } elsif($m eq '#') {
- $m = 'numf'; # "#" for "number": [#,_1] for "the number _1"
- }
-
- # Most common case: a simple, legal-looking method name
- if($m eq '') {
- # 0-length method name means to just interpolate:
- push @code, ' (';
- } elsif($m =~ m<^\w+(?:\:\:\w+)*$>s
- and $m !~ m<(?:^|\:)\d>s
- # exclude starting a (sub)package or symbol with a digit
- ) {
- # Yes, it even supports the demented (and undocumented?)
- # $obj->Foo::bar(...) syntax.
- $target->_die_pointing(
- $_[1], "Can't (yet?) use \"SUPER::\" in a bracket-group method",
- 2 + length($c[-1])
- )
- if $m =~ m/^SUPER::/s;
- # Because for SUPER:: to work, we'd have to compile this into
- # the right package, and that seems just not worth the bother,
- # unless someone convinces me otherwise.
-
- push @code, ' $_[0]->' . $m . '(';
- } else {
- # TODO: implement something? or just too icky to consider?
- $target->_die_pointing(
- $_[1],
- "Can't use \"$m\" as a method name in bracket group",
- 2 + length($c[-1])
- );
- }
-
- pop @c; # we don't need that chunk anymore
- ++$call_count;
-
- foreach my $p (@params) {
- if($p eq '_*') {
- # Meaning: all parameters except $_[0]
- $code[-1] .= ' @_[1 .. $#_], ';
- # and yes, that does the right thing for all @_ < 3
- } elsif($p =~ m<^_(-?\d+)$>s) {
- # _3 meaning $_[3]
- $code[-1] .= '$_[' . (0 + $1) . '], ';
- } elsif($USE_LITERALS and (
- (ord('A') == 65)
- ? $p !~ m<[^\x20-\x7E]>s
- # ASCII very safe chars
- : $p !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
- # EBCDIC very safe chars
- )) {
- # Normal case: a literal containing only safe characters
- $p =~ s/'/\\'/g;
- $code[-1] .= q{'} . $p . q{', };
- } else {
- # Stow it on the chunk-stack, and just refer to that.
- push @c, $p;
- push @code, ' $c[' . $#c . "], ";
- }
- }
- $code[-1] .= "),\n";
-
- push @c, '';
- } else {
- $target->_die_pointing($_[1], "Unbalanced ']'");
- }
-
- } elsif(substr($1,0,1) ne '~') {
- # it's stuff not containing "~" or "[" or "]"
- # i.e., a literal blob
- $c[-1] .= $1;
-
- } elsif($1 eq '~~') { # "~~"
- $c[-1] .= '~';
-
- } elsif($1 eq '~[') { # "~["
- $c[-1] .= '[';
-
- } elsif($1 eq '~]') { # "~]"
- $c[-1] .= ']';
-
- } elsif($1 eq '~,') { # "~,"
- if($in_group) {
- # This is a hack, based on the assumption that no-one will actually
- # want a DEL inside a bracket group. Let's hope that's it's true.
- if (ord('A') == 65) { # ASCII etc
- $c[-1] .= "\x7F";
- } else { # EBCDIC (cp 1047, 0037, POSIX-BC)
- $c[-1] .= "\x07";
- }
- } else {
- $c[-1] .= '~,';
- }
-
- } elsif($1 eq '~') { # possible only at string-end, it seems.
- $c[-1] .= '~';
-
- } else {
- # It's a "~X" where X is not a special character.
- # Consider it a literal ~ and X.
- $c[-1] .= $1;
- }
- }
- }
+use Locale::Maketext::GutsLoader;
- if($call_count) {
- undef $big_pile; # Well, nevermind that.
- } else {
- # It's all literals! Ahwell, that can happen.
- # So don't bother with the eval. Return a SCALAR reference.
- return \$big_pile;
- }
-
- die "Last chunk isn't null??" if @c and length $c[-1]; # sanity
- print scalar(@c), " chunks under closure\n" if DEBUG;
- if(@code == 0) { # not possible?
- print "Empty code\n" if DEBUG;
- return \'';
- } elsif(@code > 1) { # most cases, presumably!
- unshift @code, "join '',\n";
- }
- unshift @code, "use strict; sub {\n";
- push @code, "}\n";
+sub _http_accept_langs {
+ # Deal with HTTP "Accept-Language:" stuff. Hassle.
+ # This code is more lenient than RFC 3282, which you must read.
+ # Hm. Should I just move this into I18N::LangTags at some point?
+ no integer;
- print @code if DEBUG;
- my $sub = eval(join '', @code);
- die "$@ while evalling" . join('', @code) if $@; # Should be impossible.
- return $sub;
-}
+ my $in = (@_ > 1) ? $_[1] : $ENV{'HTTP_ACCEPT_LANGUAGE'};
+ # (always ends up untainting)
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ return() unless defined $in and length $in;
-sub _die_pointing {
- # This is used by _compile to throw a fatal error
- my $target = shift; # class name
- # ...leaving $_[0] the error-causing text, and $_[1] the error message
+ $in =~ s/\([^\)]*\)//g; # nix just about any comment
- my $i = index($_[0], "\n");
-
- my $pointy;
- my $pos = pos($_[0]) - (defined($_[2]) ? $_[2] : 0) - 1;
- if($pos < 1) {
- $pointy = "^=== near there\n";
- } else { # we need to space over
- my $first_tab = index($_[0], "\t");
- if($pos > 2 and ( -1 == $first_tab or $first_tab > pos($_[0]))) {
- # No tabs, or the first tab is harmlessly after where we will point to,
- # AND we're far enough from the margin that we can draw a proper arrow.
- $pointy = ('=' x $pos) . "^ near there\n";
- } else {
- # tabs screw everything up!
- $pointy = substr($_[0],0,$pos);
- $pointy =~ tr/\t //cd;
- # make everything into whitespace, but preseving tabs
- $pointy .= "^=== near there\n";
- }
+ if( $in =~ m/^\s*([a-zA-Z][-a-zA-Z]+)\s*$/s ) {
+ # Very common case: just one language tag
+ return lc $1;
+ } elsif( $in =~ m/^\s*[a-zA-Z][-a-zA-Z]+(?:\s*,\s*[a-zA-Z][-a-zA-Z]+)*\s*$/s ) {
+ # Common case these days: just "foo, bar, baz"
+ return map lc($_), $in =~ m/([a-zA-Z][-a-zA-Z]+)/g;
}
+
+ # Else it's complicated...
+
+ $in =~ s/\s+//g; # Yes, we can just do without the WS!
+ my @in = $in =~ m/([^,]+)/g;
+ my %pref;
- my $errmsg = "$_[1], in\:\n$_[0]";
-
- if($i == -1) {
- # No newline.
- $errmsg .= "\n" . $pointy;
- } elsif($i == (length($_[0]) - 1) ) {
- # Already has a newline at end.
- $errmsg .= $pointy;
- } else {
- # don't bother with the pointy bit, I guess.
+ my $q;
+ foreach my $tag (@in) {
+ next unless $tag =~
+ m/^([a-zA-Z][-a-zA-Z]+)
+ (?:
+ ;q=
+ (
+ \d* # a bit too broad of a RE, but so what.
+ (?:
+ \.\d+
+ )?
+ )
+ )?
+ $
+ /sx
+ ;
+ $q = (defined $2 and length $2) ? $2 : 1;
+ #print "$1 with q=$q\n";
+ push @{ $pref{$q} }, lc $1;
}
- Carp::croak( "$errmsg via $target, as used" );
+
+ return # Read off %pref, in descending key order...
+ map @{$pref{$_}},
+ sort {$b <=> $a}
+ keys %pref;
}
###########################################################################
@@ -673,3 +449,37 @@ sub clear_isa_scan { %isa_scan = (); return; } # end on a note of simplicity!
###########################################################################
1;
+__END__
+
+HEY YOU! You need some FOOD!
+
+
+ ~~ Tangy Moroccan Carrot Salad ~~
+
+* 6 to 8 medium carrots, peeled and then sliced in 1/4-inch rounds
+* 1/4 teaspoon chile powder (cayenne, chipotle, ancho, or the like)
+* 1 tablespoon ground cumin
+* 1 tablespoon honey
+* The juice of about a half a big lemon, or of a whole smaller one
+* 1/3 cup olive oil
+* 1 tablespoon of fresh dill, washed and chopped fine
+* Pinch of salt, maybe a pinch of pepper
+
+Cook the carrots in a pot of boiling water until just tender -- roughly
+six minutes. (Just don't let them get mushy!) Drain the carrots.
+
+In a largish bowl, combine the lemon juice, the cumin, the chile
+powder, and the honey. Mix well.
+Add the olive oil and whisk it together well. Add the dill and stir.
+
+Add the warm carrots to the bowl and toss it all to coat the carrots
+well. Season with salt and pepper, to taste.
+
+Serve warm or at room temperature.
+
+The measurements here are very approximate, and you should feel free to
+improvise and experiment. It's a very forgiving recipe. For example,
+you could easily halve or double the amount of cumin, or use chopped mint
+leaves instead of dill, or lime juice instead of lemon, et cetera.
+
+[end]
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext.pod b/gnu/usr.bin/perl/lib/Locale/Maketext.pod
index 916fd34b199..781e4bb2bd7 100644
--- a/gnu/usr.bin/perl/lib/Locale/Maketext.pod
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext.pod
@@ -1,9 +1,9 @@
-# Time-stamp: "2001-06-21 23:12:39 MDT"
+# Time-stamp: "2003-04-02 11:10:32 AHST"
=head1 NAME
-Locale::Maketext -- framework for localization
+Locale::Maketext - framework for localization
=head1 SYNOPSIS
@@ -110,7 +110,7 @@ These are to do with constructing a language handle:
=over
-=item *
+=item *
$lh = YourProjClass->get_handle( ...langtags... ) || die "lg-handle?";
@@ -146,7 +146,7 @@ those were the languages passed as parameters to C<get_handle>.
Otherwise (i.e., if not a CGI), this tries various OS-specific ways
to get the language-tags for the current locale/language, and then
-pretends that those were the value(s) passed to C<cet_handle>.
+pretends that those were the value(s) passed to C<get_handle>.
Currently this OS-specific stuff consists of looking in the environment
variables "LANG" and "LANGUAGE"; and on MSWin machines (where those
@@ -325,7 +325,7 @@ This is generally meant to be called from inside Bracket Notation
"Your search matched [quant,_1,document]!"
It's for I<quantifying> a noun (i.e., saying how much of it there is,
-while giving the currect form of it). The behavior of this method is
+while giving the correct form of it). The behavior of this method is
handy for English and a few other Western European languages, and you
should override it for languages where it's not suitable. You can feel
free to read the source, but the current implementation is basically
@@ -347,7 +347,7 @@ So for English (with Bracket Notation)
C<"...[quant,_1,file]..."> is fine (for 0 it returns "0 files",
for 1 it returns "1 file", and for more it returns "2 files", etc.)
-But for "directory", you'd want C<"[quant,_1,direcory,directories]">
+But for "directory", you'd want C<"[quant,_1,directory,directories]">
so that our elementary C<quant> method doesn't think that the
plural of "directory" is "directorys". And you might find that the
output may sound better if you specify a negative form, as in:
@@ -511,7 +511,7 @@ or putting into a GUI widget.
While the key must be a string value (since that's a basic
restriction that Perl places on hash keys), the value in
-the lexicon can currenly be of several types:
+the lexicon can currently be of several types:
a defined scalar, scalarref, or coderef. The use of these is
explained above, in the section 'The "maketext" Method', and
Bracket Notation for strings is discussed in the next section.
@@ -570,7 +570,7 @@ a command-line program might returns when given an unknown switch,
I often just use a key "_USAGE_MESSAGE". At that point I then go
and immediately to define that lexicon entry in the
ProjectClass::L10N::en lexicon (since English is always my "project
-lanuage"):
+language"):
'_USAGE_MESSAGE' => <<'EOSTUFF',
...long long message...
@@ -755,7 +755,7 @@ as just the interpolation of all its items:
),
Examples: "[_1]" and "[,_1]", which are synonymous; and
-"[,ID-(,_4,-,_2,)]", which compiles as
+"C<[,ID-(,_4,-,_2,)]>", which compiles as
C<join "", "ID-(", $_[4], "-", $_[2], ")">.
=item *
@@ -811,7 +811,7 @@ you get it with "~~".
Currently, an unescaped "~" before a character
other than a bracket or a comma is taken to mean just a "~" and that
-charecter. I.e., "~X" means the same as "~~X" -- i.e., one literal tilde,
+character. I.e., "~X" means the same as "~~X" -- i.e., one literal tilde,
and then one literal "X". However, by using "~X", you are assuming that
no future version of Maketext will use "~X" as a magic escape sequence.
In practice this is not a great problem, since first off you can just
@@ -888,7 +888,7 @@ but since you anticipate localizing this, you write:
my $lh = ThisProject::I18N->get_handle();
# For the moment, assume that things are set up so
# that we load class ThisProject::I18N::en
- # and that's the class that $lh belongs to.
+ # and that that's the class that $lh belongs to.
...
if(-e $filename) {
go_process_file($filename)
@@ -1004,7 +1004,7 @@ careful, you'll just have to wrap every call to $lh->maketext in an
S<eval { }>. However, I want programmers to reserve the right (via
the "fail" attribute) to treat lookup failure as something other than
an exception of the same level of severity as a config file being
-unreadable, or some essential resource being inaccessable.
+unreadable, or some essential resource being inaccessible.
One possibly useful value for the "fail" attribute is the method name
"failure_handler_auto". This is a method defined in class
@@ -1199,10 +1199,10 @@ Remember to ask your translators about numeral formatting in their
language, so that you can override the C<numf> method as
appropriate. Typical variables in number formatting are: what to
use as a decimal point (comma? period?); what to use as a thousands
-separator (space? nonbreakinng space? comma? period? small
+separator (space? nonbreaking space? comma? period? small
middot? prime? apostrophe?); and even whether the so-called "thousands
separator" is actually for every third digit -- I've heard reports of
-two hundred thousand being expressable as "2,00,000" for some Indian
+two hundred thousand being expressible as "2,00,000" for some Indian
(Subcontinental) languages, besides the less surprising "S<200 000>",
"200.000", "200,000", and "200'000". Also, using a set of numeral
glyphs other than the usual ASCII "0"-"9" might be appreciated, as via
@@ -1275,7 +1275,8 @@ Maketext is better than the plain old approach of just having
message catalogs that are just databases of sprintf formats.
L<File::Findgrep|File::Findgrep> is a sample application/module
-that uses Locale::Maketext to localize its messages.
+that uses Locale::Maketext to localize its messages. For a larger
+internationalized system, see also L<Apache::MP3>.
L<I18N::LangTags|I18N::LangTags>.
@@ -1303,7 +1304,7 @@ shorter than its documentation!
=head1 COPYRIGHT AND DISCLAIMER
-Copyright (c) 1999-2001 Sean M. Burke. All rights reserved.
+Copyright (c) 1999-2003 Sean M. Burke. All rights reserved.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
@@ -1317,5 +1318,3 @@ merchantability or fitness for a particular purpose.
Sean M. Burke C<sburke@cpan.org>
=cut
-
-# Zing!
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/ChangeLog b/gnu/usr.bin/perl/lib/Locale/Maketext/ChangeLog
index f50e5b97f62..a801c2f4a81 100644
--- a/gnu/usr.bin/perl/lib/Locale/Maketext/ChangeLog
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/ChangeLog
@@ -1,6 +1,34 @@
Revision history for Perl suite Locale::Maketext
- Time-stamp: "2001-06-21 23:18:31 MDT"
+ Time-stamp: "2003-06-21 23:38:38 AHDT"
+2003-06-21 Sean M. Burke sburke@cpan.org
+ * Release 1.06: Now has "use utf8" to make the things work
+ happily. Some fancy footwork is required to make this work under
+ pre-utf8 perl versions.
+
+2003-04-18 Sean M. Burke sburke@cpan.org
+ * Release 1.05: Different Makefile.PL, same .pm code.
+
+ Jesse Vincent, Hugo van der Sanden, and Jarkko Hietaniemi
+ encourage me to add this to the makefile:
+ ($] < 5.008) ? () : ( INSTALLDIRS => 'perl'),
+ so that when you install this on a recent version of perl (5.8 or
+ later), the installation will overwrite the Maketext.pm in your
+ core library directory. Email me if this produces trouble for any
+ of you folks out there, okay?
+
+2003-04-02 Sean M. Burke sburke@cpan.org
+ * Release 1.04: Implementing proper HTTP "tag;q=rank" parsing for
+ get_handle. This should make all the difference for users/victims
+ of the current version of Safari, which uses that syntax as well
+ as inserts random languages with low q numbers.
+ Thanks to Jesse Vincent and the whole RT junta for finding this.
+
+ * Added more tests, now in t/
+
+ * Lots of typo fixes to Maketext.pm. Thanks to Evan A. Zacks for
+ patient help in finding them all.
+
2001-06-21 Sean M. Burke sburke@cpan.org
* Release 1.03: basically cosmetic tweaks to the docs and the
test.pl.
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/Guts.pm b/gnu/usr.bin/perl/lib/Locale/Maketext/Guts.pm
new file mode 100644
index 00000000000..72f0c9b3a19
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/Guts.pm
@@ -0,0 +1,295 @@
+
+package Locale::Maketext::Guts;
+BEGIN { *zorp = sub { return scalar @_ } unless defined &zorp; }
+ # Just so we're nice and define SOMETHING in "our" package.
+
+package Locale::Maketext;
+use strict;
+use vars qw($USE_LITERALS $GUTSPATH);
+
+BEGIN {
+ $GUTSPATH = __FILE__;
+ *DEBUG = sub () {0} unless defined &DEBUG;
+}
+
+use utf8;
+
+sub _compile {
+ # This big scary routine compiles an entry.
+ # It returns either a coderef if there's brackety bits in this, or
+ # otherwise a ref to a scalar.
+
+ my $target = ref($_[0]) || $_[0];
+
+ my(@code);
+ my(@c) = (''); # "chunks" -- scratch.
+ my $call_count = 0;
+ my $big_pile = '';
+ {
+ my $in_group = 0; # start out outside a group
+ my($m, @params); # scratch
+
+ while($_[1] =~ # Iterate over chunks.
+ m<\G(
+ [^\~\[\]]+ # non-~[] stuff
+ |
+ ~. # ~[, ~], ~~, ~other
+ |
+ \[ # [ presumably opening a group
+ |
+ \] # ] presumably closing a group
+ |
+ ~ # terminal ~ ?
+ |
+ $
+ )>xgs
+ ) {
+ print " \"$1\"\n" if DEBUG > 2;
+
+ if($1 eq '[' or $1 eq '') { # "[" or end
+ # Whether this is "[" or end, force processing of any
+ # preceding literal.
+ if($in_group) {
+ if($1 eq '') {
+ $target->_die_pointing($_[1], "Unterminated bracket group");
+ } else {
+ $target->_die_pointing($_[1], "You can't nest bracket groups");
+ }
+ } else {
+ if($1 eq '') {
+ print " [end-string]\n" if DEBUG > 2;
+ } else {
+ $in_group = 1;
+ }
+ die "How come \@c is empty?? in <$_[1]>" unless @c; # sanity
+ if(length $c[-1]) {
+ # Now actually processing the preceding literal
+ $big_pile .= $c[-1];
+ if($USE_LITERALS and (
+ (ord('A') == 65)
+ ? $c[-1] !~ m<[^\x20-\x7E]>s
+ # ASCII very safe chars
+ : $c[-1] !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
+ # EBCDIC very safe chars
+ )) {
+ # normal case -- all very safe chars
+ $c[-1] =~ s/'/\\'/g;
+ push @code, q{ '} . $c[-1] . "',\n";
+ $c[-1] = ''; # reuse this slot
+ } else {
+ push @code, ' $c[' . $#c . "],\n";
+ push @c, ''; # new chunk
+ }
+ }
+ # else just ignore the empty string.
+ }
+
+ } elsif($1 eq ']') { # "]"
+ # close group -- go back in-band
+ if($in_group) {
+ $in_group = 0;
+
+ print " --Closing group [$c[-1]]\n" if DEBUG > 2;
+
+ # And now process the group...
+
+ if(!length($c[-1]) or $c[-1] =~ m/^\s+$/s) {
+ DEBUG > 2 and print " -- (Ignoring)\n";
+ $c[-1] = ''; # reset out chink
+ next;
+ }
+
+ #$c[-1] =~ s/^\s+//s;
+ #$c[-1] =~ s/\s+$//s;
+ ($m,@params) = split(",", $c[-1], -1); # was /\s*,\s*/
+
+ # A bit of a hack -- we've turned "~,"'s into DELs, so turn
+ # 'em into real commas here.
+ if (ord('A') == 65) { # ASCII, etc
+ foreach($m, @params) { tr/\x7F/,/ }
+ } else { # EBCDIC (1047, 0037, POSIX-BC)
+ # Thanks to Peter Prymmer for the EBCDIC handling
+ foreach($m, @params) { tr/\x07/,/ }
+ }
+
+ # Special-case handling of some method names:
+ if($m eq '_*' or $m =~ m<^_(-?\d+)$>s) {
+ # Treat [_1,...] as [,_1,...], etc.
+ unshift @params, $m;
+ $m = '';
+ } elsif($m eq '*') {
+ $m = 'quant'; # "*" for "times": "4 cars" is 4 times "cars"
+ } elsif($m eq '#') {
+ $m = 'numf'; # "#" for "number": [#,_1] for "the number _1"
+ }
+
+ # Most common case: a simple, legal-looking method name
+ if($m eq '') {
+ # 0-length method name means to just interpolate:
+ push @code, ' (';
+ } elsif($m =~ m<^\w+(?:\:\:\w+)*$>s
+ and $m !~ m<(?:^|\:)\d>s
+ # exclude starting a (sub)package or symbol with a digit
+ ) {
+ # Yes, it even supports the demented (and undocumented?)
+ # $obj->Foo::bar(...) syntax.
+ $target->_die_pointing(
+ $_[1], "Can't (yet?) use \"SUPER::\" in a bracket-group method",
+ 2 + length($c[-1])
+ )
+ if $m =~ m/^SUPER::/s;
+ # Because for SUPER:: to work, we'd have to compile this into
+ # the right package, and that seems just not worth the bother,
+ # unless someone convinces me otherwise.
+
+ push @code, ' $_[0]->' . $m . '(';
+ } else {
+ # TODO: implement something? or just too icky to consider?
+ $target->_die_pointing(
+ $_[1],
+ "Can't use \"$m\" as a method name in bracket group",
+ 2 + length($c[-1])
+ );
+ }
+
+ pop @c; # we don't need that chunk anymore
+ ++$call_count;
+
+ foreach my $p (@params) {
+ if($p eq '_*') {
+ # Meaning: all parameters except $_[0]
+ $code[-1] .= ' @_[1 .. $#_], ';
+ # and yes, that does the right thing for all @_ < 3
+ } elsif($p =~ m<^_(-?\d+)$>s) {
+ # _3 meaning $_[3]
+ $code[-1] .= '$_[' . (0 + $1) . '], ';
+ } elsif($USE_LITERALS and (
+ (ord('A') == 65)
+ ? $p !~ m<[^\x20-\x7E]>s
+ # ASCII very safe chars
+ : $p !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s
+ # EBCDIC very safe chars
+ )) {
+ # Normal case: a literal containing only safe characters
+ $p =~ s/'/\\'/g;
+ $code[-1] .= q{'} . $p . q{', };
+ } else {
+ # Stow it on the chunk-stack, and just refer to that.
+ push @c, $p;
+ push @code, ' $c[' . $#c . "], ";
+ }
+ }
+ $code[-1] .= "),\n";
+
+ push @c, '';
+ } else {
+ $target->_die_pointing($_[1], "Unbalanced ']'");
+ }
+
+ } elsif(substr($1,0,1) ne '~') {
+ # it's stuff not containing "~" or "[" or "]"
+ # i.e., a literal blob
+ $c[-1] .= $1;
+
+ } elsif($1 eq '~~') { # "~~"
+ $c[-1] .= '~';
+
+ } elsif($1 eq '~[') { # "~["
+ $c[-1] .= '[';
+
+ } elsif($1 eq '~]') { # "~]"
+ $c[-1] .= ']';
+
+ } elsif($1 eq '~,') { # "~,"
+ if($in_group) {
+ # This is a hack, based on the assumption that no-one will actually
+ # want a DEL inside a bracket group. Let's hope that's it's true.
+ if (ord('A') == 65) { # ASCII etc
+ $c[-1] .= "\x7F";
+ } else { # EBCDIC (cp 1047, 0037, POSIX-BC)
+ $c[-1] .= "\x07";
+ }
+ } else {
+ $c[-1] .= '~,';
+ }
+
+ } elsif($1 eq '~') { # possible only at string-end, it seems.
+ $c[-1] .= '~';
+
+ } else {
+ # It's a "~X" where X is not a special character.
+ # Consider it a literal ~ and X.
+ $c[-1] .= $1;
+ }
+ }
+ }
+
+ if($call_count) {
+ undef $big_pile; # Well, nevermind that.
+ } else {
+ # It's all literals! Ahwell, that can happen.
+ # So don't bother with the eval. Return a SCALAR reference.
+ return \$big_pile;
+ }
+
+ die "Last chunk isn't null??" if @c and length $c[-1]; # sanity
+ print scalar(@c), " chunks under closure\n" if DEBUG;
+ if(@code == 0) { # not possible?
+ print "Empty code\n" if DEBUG;
+ return \'';
+ } elsif(@code > 1) { # most cases, presumably!
+ unshift @code, "join '',\n";
+ }
+ unshift @code, "use strict; sub {\n";
+ push @code, "}\n";
+
+ print @code if DEBUG;
+ my $sub = eval(join '', @code);
+ die "$@ while evalling" . join('', @code) if $@; # Should be impossible.
+ return $sub;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _die_pointing {
+ # This is used by _compile to throw a fatal error
+ my $target = shift; # class name
+ # ...leaving $_[0] the error-causing text, and $_[1] the error message
+
+ my $i = index($_[0], "\n");
+
+ my $pointy;
+ my $pos = pos($_[0]) - (defined($_[2]) ? $_[2] : 0) - 1;
+ if($pos < 1) {
+ $pointy = "^=== near there\n";
+ } else { # we need to space over
+ my $first_tab = index($_[0], "\t");
+ if($pos > 2 and ( -1 == $first_tab or $first_tab > pos($_[0]))) {
+ # No tabs, or the first tab is harmlessly after where we will point to,
+ # AND we're far enough from the margin that we can draw a proper arrow.
+ $pointy = ('=' x $pos) . "^ near there\n";
+ } else {
+ # tabs screw everything up!
+ $pointy = substr($_[0],0,$pos);
+ $pointy =~ tr/\t //cd;
+ # make everything into whitespace, but preseving tabs
+ $pointy .= "^=== near there\n";
+ }
+ }
+
+ my $errmsg = "$_[1], in\:\n$_[0]";
+
+ if($i == -1) {
+ # No newline.
+ $errmsg .= "\n" . $pointy;
+ } elsif($i == (length($_[0]) - 1) ) {
+ # Already has a newline at end.
+ $errmsg .= $pointy;
+ } else {
+ # don't bother with the pointy bit, I guess.
+ }
+ Carp::croak( "$errmsg via $target, as used" );
+}
+
+1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/GutsLoader.pm b/gnu/usr.bin/perl/lib/Locale/Maketext/GutsLoader.pm
new file mode 100644
index 00000000000..5cce12e37b5
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/GutsLoader.pm
@@ -0,0 +1,47 @@
+
+package Locale::Maketext::GutsLoader;
+use strict;
+sub zorp { return scalar @_ }
+
+BEGIN {
+ $Locale::Maketext::GutsLoader::GUTSPATH = __FILE__;
+ *Locale::Maketext::DEBUG = sub () {0}
+ unless defined &Locale::Maketext::DEBUG;
+}
+
+#
+# This whole drama is so that we can load the utf8'd code
+# in Locale::Maketext::Guts, but if that fails, snip the
+# utf8 and then try THAT.
+#
+
+$Locale::Maketext::GUTSPATH = '';
+Locale::Maketext::DEBUG and print "Requiring Locale::Maketext::Guts...\n";
+eval 'require Locale::Maketext::Guts';
+
+if($@) {
+ my $path = $Locale::Maketext::GUTSPATH;
+
+ die "Can't load Locale::Maketext::Guts\nAborting" unless $path;
+
+ die "No readable file $Locale::Maketext::GutsLoader::GUTSPATH\nAborting"
+ unless -e $path and -f _ and -r _;
+
+ open(IN, $path) or die "Can't read-open $path\nAborting";
+
+ my $source;
+ { local $/; $source = <IN>; }
+ close(IN);
+ unless( $source =~ s/\b(use utf8)/# $1/ ) {
+ Locale::Maketext::DEBUG and
+ print "I didn't see 'use utf8' in $path\n";
+ }
+ eval $source;
+ die "Can't compile $path\n...The error I got was:\n$@\nAborting" if $@;
+ Locale::Maketext::DEBUG and print "Non-utf8'd Locale::Maketext::Guts fine\n";
+} else {
+ Locale::Maketext::DEBUG and print "Loaded Locale::Maketext::Guts fine\n";
+}
+
+1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/README b/gnu/usr.bin/perl/lib/Locale/Maketext/README
index 72c3bf3b4c1..5fdcae40c73 100644
--- a/gnu/usr.bin/perl/lib/Locale/Maketext/README
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/README
@@ -1,5 +1,5 @@
README for Locale::Maketext
- Time-stamp: "2001-05-25 08:15:55 MDT"
+ Time-stamp: "2003-04-02 11:06:17 AHST"
Locale::Maketext
@@ -17,7 +17,8 @@ PREREQUISITES
This suite requires Perl 5. It also requires a recent version
of I18N::LangTags. MSWin users should also get Win32::Locale.
-File::Findgrep is also useful example code.
+File::Findgrep is also useful example code, as is the rather
+larger Apache::MP3 source (even if you don't run Apache).
INSTALLATION
@@ -55,12 +56,12 @@ AVAILABILITY
The latest version of Locale::Maketext is available from the
Comprehensive Perl Archive Network (CPAN). Visit
-<http://www.cpan.org/> to find a CPAN site near you.
+<http://www.perl.com/CPAN/> to find a CPAN site near you.
COPYRIGHT
-Copyright 1999-2001, Sean M. Burke <sburke@cpan.org>, all rights
+Copyright 1999-2003, Sean M. Burke <sburke@cpan.org>, all rights
reserved. This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/t/00about.t b/gnu/usr.bin/perl/lib/Locale/Maketext/t/00about.t
new file mode 100644
index 00000000000..9b2fc859994
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/t/00about.t
@@ -0,0 +1,29 @@
+
+require 5;
+use Test;
+BEGIN { plan tests => 1; }
+use Locale::Maketext 1.01;
+
+print "#\n#\n",
+ "# Locale::Maketext v$Locale::Maketext::VERSION\n",
+ "# I18N::LangTags v", $I18N::LangTags::VERSION || "?", "\n",
+ "#\n#\n",
+;
+
+print "# Running under perl version $] for $^O",
+ (chr(65) eq 'A') ? "\n" : " in a non-ASCII world\n";
+
+print "# Win32::BuildNumber ", &Win32::BuildNumber(), "\n"
+ if defined(&Win32::BuildNumber) and defined &Win32::BuildNumber();
+
+print "# MacPerl verison $MacPerl::Version\n"
+ if defined $MacPerl::Version;
+
+printf
+ "# Current time local: %s\n# Current time GMT: %s\n",
+ scalar( gmtime($^T)), scalar(localtime($^T));
+
+print "# Using Test.pm v", $Test::VERSION || "?", "\n";
+
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/t/01make.t b/gnu/usr.bin/perl/lib/Locale/Maketext/t/01make.t
new file mode 100644
index 00000000000..d9352d03407
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/t/01make.t
@@ -0,0 +1,34 @@
+
+require 5;
+use Test;
+BEGIN { plan tests => 6; }
+use Locale::Maketext 1.01;
+print "# Hi there...\n";
+ok 1;
+
+# declare some classes...
+{
+ package Woozle;
+ @ISA = ('Locale::Maketext');
+ sub dubbil { return $_[1] * 2 }
+ sub numerate { return $_[2] . 'en' }
+}
+{
+ package Woozle::elx;
+ @ISA = ('Woozle');
+ %Lexicon = (
+ 'd2' => 'hum [dubbil,_1]',
+ 'd3' => 'hoo [quant,_1,zaz]',
+ 'd4' => 'hoo [*,_1,zaz]',
+ );
+ keys %Lexicon; # dodges the 'used only once' warning
+}
+
+ok defined( $lh = Woozle->get_handle('elx') ) && ref($lh);
+ok $lh && $lh->maketext('d2', 7), "hum 14" ;
+ok $lh && $lh->maketext('d3', 7), "hoo 7 zazen" ;
+ok $lh && $lh->maketext('d4', 7), "hoo 7 zazen" ;
+
+print "# Byebye!\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/t/02get.t b/gnu/usr.bin/perl/lib/Locale/Maketext/t/02get.t
new file mode 100644
index 00000000000..86fd4b20af5
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/t/02get.t
@@ -0,0 +1,69 @@
+
+require 5;
+use Test;
+BEGIN { plan tests => 11; }
+use Locale::Maketext 1.01;
+print "# Hi there...\n";
+ok 1;
+
+print "# --- Making sure that get_handle works ---\n";
+
+# declare some classes...
+{
+ package Woozle;
+ @ISA = ('Locale::Maketext');
+ sub dubbil { return $_[1] * 2 }
+ sub numerate { return $_[2] . 'en' }
+}
+{
+ package Woozle::eu_mt;
+ @ISA = ('Woozle');
+ %Lexicon = (
+ 'd2' => 'hum [dubbil,_1]',
+ 'd3' => 'hoo [quant,_1,zaz]',
+ 'd4' => 'hoo [*,_1,zaz]',
+ );
+ keys %Lexicon; # dodges the 'used only once' warning
+}
+
+my $lh;
+print "# Basic sanity:\n";
+ok defined( $lh = Woozle->get_handle('eu-mt') ) && ref($lh);
+ok $lh && $lh->maketext('d2', 7), "hum 14" ;
+
+
+
+print "# Make sure we can assign to ENV entries\n",
+ "# (Otherwise we can't run the subsequent tests)...\n";
+$ENV{'MYORP'} = 'Zing';
+ok $ENV{'MYORP'}, 'Zing';
+$ENV{'SWUZ'} = 'KLORTHO HOOBOY';
+ok $ENV{'SWUZ'}, 'KLORTHO HOOBOY';
+
+delete $ENV{'MYORP'};
+delete $ENV{'SWUZ'};
+
+print "# Test LANG...\n";
+$ENV{'REQUEST_METHOD'} = '';
+$ENV{'LANG'} = 'Eu_MT';
+$ENV{'LANGUAGE'} = '';
+ok defined( $lh = Woozle->get_handle() ) && ref($lh);
+
+print "# Test LANGUAGE...\n";
+$ENV{'LANG'} = '';
+$ENV{'LANGUAGE'} = 'Eu-MT';
+ok defined( $lh = Woozle->get_handle() ) && ref($lh);
+
+print "# Test HTTP_ACCEPT_LANGUAGE...\n";
+$ENV{'REQUEST_METHOD'} = 'GET';
+$ENV{'HTTP_ACCEPT_LANGUAGE'} = 'eu-MT';
+ok defined( $lh = Woozle->get_handle() ) && ref($lh);
+$ENV{'HTTP_ACCEPT_LANGUAGE'} = 'x-plorp, zaz, eu-MT, i-klung';
+ok defined( $lh = Woozle->get_handle() ) && ref($lh);
+$ENV{'HTTP_ACCEPT_LANGUAGE'} = 'x-plorp, zaz, eU-Mt, i-klung';
+ok defined( $lh = Woozle->get_handle() ) && ref($lh);
+
+
+print "# Byebye!\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/t/03http.t b/gnu/usr.bin/perl/lib/Locale/Maketext/t/03http.t
new file mode 100644
index 00000000000..98e7207a602
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/t/03http.t
@@ -0,0 +1,102 @@
+
+use Locale::Maketext;
+
+use Test;
+BEGIN { plan tests => 87 };
+
+my @in = grep m/\S/, split /\n/, q{
+
+[ sv ] sv
+[ en ] en
+[ en fi ] en, fi
+[ en-us ] en-us
+[ en-us ] en-US
+[ en-us ] EN-US
+
+[ en-au en i-klingon en-gb en-us mt-mt mt ja ] EN-au, JA;q=0.14, i-klingon;q=0.83, en-gb;q=0.71, en-us;q=0.57, mt-mt;q=0.43, mt;q=0.29, en;q=0.86
+[ en-au en i-klingon en-gb en-us mt-mt mt tli ja ] EN-au, tli;q=0.201, JA;q=0.14, i-klingon;q=0.83, en-gb;q=0.71, en-us;q=0.57, mt-mt;q=0.43, mt;q=0.29, en;q=0.86
+[ en-au en en-gb en-us ja ] en-au, ja;q=0.20, en-gb;q=0.60, en-us;q=0.40, en;q=0.80
+
+[ en-au en en-gb en-us mt-mt mt ja ] EN-au, JA;q=0.14, en-gb;q=0.71, en-us;q=0.57, mt-mt;q=0.43, mt;q=0.29, en;q=0.86
+[ en-au en en-gb en-us ja ] en-au, ja;q=0.20, en-gb;q=0.60, en-us;q=0.40, en;q=0.80
+[ en fr ] en;q=1,fr;q=.5
+[ en fr ] en;q=1,fr;q=.99
+[ en ru ko ] en, ru;q=0.7, ko;q=0.3
+[ en ru ko ] en, ru;q=0.7, KO;q=0.3
+[ en-us en ] en-us, en;q=0.50
+[ en fr ] fr ; q = 0.9, en
+[ en fr ] en,fr;q=.90
+[ ru en-uk en fr ] ru, en-UK;q=0.5, en;q=0.3, fr;q=0.1
+[ en-us fr es-mx ] en-us,fr;q=0.7,es-mx;q=0.3
+[ en-us en ] en-us, en;q=0.50
+
+[ da en-gb en ] da, en-gb;q=0.8, en;q=0.7
+[ da en-gb en ] da, en;q=0.7, en-gb;q=0.8
+[ da en-gb en ] da, en-gb;q=0.8, en;q=0.7
+[ da en-gb en ] da,en;q=0.7,en-gb;q=0.8
+[ da en-gb en ] da, en-gb ; q=0.8, en ; q=0.7
+[ da en-gb en ] da , en-gb ; q = 0.8 , en ; q =0.7
+[ da en-gb en ] da (yup, Danish) , en-gb ; q = 0.8 , en ; q =0.7
+
+[ no dk en-uk en-us ] en-UK;q=0.7, en-US;q=0.6, no;q=1.0, dk;q=0.8
+[ no dk en-uk en-us ] en-US;q=0.6, en-UK;q=0.7, no;q=1.0, dk;q=0.8
+[ no dk en-uk en-us ] en-UK;q=0.7, no;q=1.0, en-US;q=0.6, dk;q=0.8
+[ no dk en-uk en-us ] en-UK;q=0.7, no;q=1.0, dk;q=0.8, en-US;q=0.6
+
+[ fi en ] fi;q=1, en;q=0.2
+[ de-de de en en-us en-gb ] de-DE, de;q=0.80, en;q=0.60, en-US;q=0.40, en-GB;q=0.20
+[ ru ] ru; q=1, *; q=0.1
+[ ru en ] ru, en; q=0.1
+[ ja en ] ja,en;q=0.5
+[ en ] en; q=1.0
+[ ja ] ja; q=1.0
+[ ja ] ja; q=1.0
+[ en ja ] en; q=0.5, ja; q=0.5
+[ fr-ca fr en ] fr-ca, fr;q=0.8, en;q=0.7
+[ NIX ] NIX
+};
+
+foreach my $in (@in) {
+ $in =~ s/^\s*\[([^\]]+)\]\s*//s or die "Bad input: $in";
+ my @should = do { my $x = $1; $x =~ m/(\S+)/g };
+
+ if($in eq 'NIX') { $in = ''; @should = (); }
+
+ local $ENV{'HTTP_ACCEPT_LANGUAGE'};
+
+ foreach my $modus (
+ sub {
+ print "# Testing with arg...\n";
+ $ENV{'HTTP_ACCEPT_LANGUAGE'} = 'PLORK';
+ return $_[0];
+ },
+ sub {
+ print "# Testing wath HTTP_ACCEPT_LANGUAGE...\n";
+ $ENV{'HTTP_ACCEPT_LANGUAGE'} = $_[0];
+ return();
+ },
+ ) {
+ my @args = &$modus($in);
+
+ # ////////////////////////////////////////////////////
+ my @out = Locale::Maketext->_http_accept_langs(@args);
+ # \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+ if(
+ @out == @should
+ and lc( join "\e", @out ) eq lc( join "\e", @should )
+ ) {
+ print "# Happily got [@out] from [$in]\n";
+ ok 1;
+ } else {
+ ok 0;
+ print "#Got: [@out]\n",
+ "# but wanted: [@should]\n",
+ "# < \"$in\"\n#\n";
+ }
+ }
+}
+
+print "#\n#\n# Bye-bye!\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Maketext/t/90utf8.t b/gnu/usr.bin/perl/lib/Locale/Maketext/t/90utf8.t
new file mode 100644
index 00000000000..96731e2b192
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Locale/Maketext/t/90utf8.t
@@ -0,0 +1,39 @@
+
+require 5;
+use Test;
+BEGIN { plan tests => 4; }
+use Locale::Maketext 1.01;
+print "# Hi there...\n";
+ok 1;
+
+
+print "# --- Making sure that get_handle works with utf8 ---\n";
+use utf8;
+
+# declare some classes...
+{
+ package Woozle;
+ @ISA = ('Locale::Maketext');
+ sub dubbil { return $_[1] * 2 .chr(2000)}
+ sub numerate { return $_[2] . 'en' }
+}
+{
+ package Woozle::eu_mt;
+ @ISA = ('Woozle');
+ %Lexicon = (
+ 'd2' => chr(1000) . 'hum [dubbil,_1]',
+ 'd3' => chr(1000) . 'hoo [quant,_1,zaz]',
+ 'd4' => chr(1000) . 'hoo [*,_1,zaz]',
+ );
+ keys %Lexicon; # dodges the 'used only once' warning
+}
+
+my $lh;
+print "# Basic sanity:\n";
+ok defined( $lh = Woozle->get_handle('eu-mt') ) && ref($lh);
+ok $lh && $lh->maketext('d2', 7), chr(1000)."hum 14".chr(2000) ;
+
+
+print "# Byebye!\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Locale/Script.pm b/gnu/usr.bin/perl/lib/Locale/Script.pm
index d5b6751a1aa..d832b6a5093 100644
--- a/gnu/usr.bin/perl/lib/Locale/Script.pm
+++ b/gnu/usr.bin/perl/lib/Locale/Script.pm
@@ -17,7 +17,7 @@ use Locale::Constants;
# Public Global Variables
#-----------------------------------------------------------------------
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
-$VERSION = sprintf("%d.%02d", q$Revision: 2.2 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 2.21 $ =~ /(\d+)\.(\d+)/);
@ISA = qw(Exporter);
@EXPORT = qw(code2script script2code
all_script_codes all_script_names
@@ -160,6 +160,7 @@ sub all_script_names
my ($alpha2, $alpha3, $numeric);
my $script;
+ local $_;
while (<DATA>)
{
diff --git a/gnu/usr.bin/perl/lib/Math/BigFloat.pm b/gnu/usr.bin/perl/lib/Math/BigFloat.pm
index a12cf28a84d..059e1573c46 100644
--- a/gnu/usr.bin/perl/lib/Math/BigFloat.pm
+++ b/gnu/usr.bin/perl/lib/Math/BigFloat.pm
@@ -7,21 +7,21 @@ package Math::BigFloat;
# The following hash values are internally used:
# _e: exponent (BigInt)
# _m: mantissa (absolute BigInt)
-# sign: +,-,"NaN" if not a number
+# sign: +,-,+inf,-inf, or "NaN" if not a number
# _a: accuracy
# _p: precision
# _f: flags, used to signal MBI not to touch our private parts
-$VERSION = '1.35';
+$VERSION = '1.40';
require 5.005;
use Exporter;
-use File::Spec;
-# use Math::BigInt;
-@ISA = qw( Exporter Math::BigInt);
+@ISA = qw(Exporter Math::BigInt);
use strict;
use vars qw/$AUTOLOAD $accuracy $precision $div_scale $round_mode $rnd_mode/;
use vars qw/$upgrade $downgrade/;
+# the following are internal and should never be accessed from the outside
+use vars qw/$_trap_nan $_trap_inf/;
my $class = "Math::BigFloat";
use overload
@@ -32,14 +32,10 @@ use overload
;
##############################################################################
-# global constants, flags and accessory
+# global constants, flags and assorted stuff
-use constant MB_NEVER_ROUND => 0x0001;
-
-# are NaNs ok?
-my $NaNOK=1;
-# constant for easier life
-my $nan = 'NaN';
+# the following are public, but their usage is not recommended. Use the
+# accessor methods instead.
# class constants, use Class->constant_name() to access
$round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
@@ -52,6 +48,30 @@ $downgrade = undef;
my $MBI = 'Math::BigInt'; # the package we are using for our private parts
# changable by use Math::BigFloat with => 'package'
+# the following are private and not to be used from the outside:
+
+use constant MB_NEVER_ROUND => 0x0001;
+
+# are NaNs ok? (otherwise it dies when encountering an NaN) set w/ config()
+$_trap_nan = 0;
+# the same for infs
+$_trap_inf = 0;
+
+# constant for easier life
+my $nan = 'NaN';
+
+my $IMPORT = 0; # was import() called yet?
+ # used to make require work
+
+# some digits of accuracy for blog(undef,10); which we use in blog() for speed
+my $LOG_10 =
+ '2.3025850929940456840179914546843642076011014886287729760333279009675726097';
+my $LOG_10_A = length($LOG_10)-1;
+# ditto for log(2)
+my $LOG_2 =
+ '0.6931471805599453094172321214581765680755001343602552541206800094933936220';
+my $LOG_2_A = length($LOG_2)-1;
+
##############################################################################
# the old code had $rnd_mode, so we need to support it, too
@@ -60,9 +80,10 @@ sub FETCH { return $round_mode; }
sub STORE { $rnd_mode = $_[0]->round_mode($_[1]); }
BEGIN
- {
- $rnd_mode = 'even';
- tie $rnd_mode, 'Math::BigFloat';
+ {
+ # when someone set's $rnd_mode, we catch this and check the value to see
+ # whether it is valid or not.
+ $rnd_mode = 'even'; tie $rnd_mode, 'Math::BigFloat';
}
##############################################################################
@@ -75,12 +96,12 @@ BEGIN
my %methods = map { $_ => 1 }
qw / fadd fsub fmul fdiv fround ffround fsqrt fmod fstr fsstr fpow fnorm
fint facmp fcmp fzero fnan finf finc fdec flog ffac
- fceil ffloor frsft flsft fone flog
+ fceil ffloor frsft flsft fone flog froot
/;
# valid method's that can be hand-ed up (for AUTOLOAD)
my %hand_ups = map { $_ => 1 }
qw / is_nan is_inf is_negative is_positive
- accuracy precision div_scale round_mode fneg fabs babs fnot
+ accuracy precision div_scale round_mode fneg fabs fnot
objectify upgrade downgrade
bone binf bnan bzero
/;
@@ -105,6 +126,8 @@ sub new
return $class->bzero() if !defined $wanted; # default to 0
return $wanted->copy() if UNIVERSAL::isa($wanted,'Math::BigFloat');
+ $class->import() if $IMPORT == 0; # make require work
+
my $self = {}; bless $self, $class;
# shortcut for bigints and its subclasses
if ((ref($wanted)) && (ref($wanted) ne $class))
@@ -131,7 +154,11 @@ sub new
my ($mis,$miv,$mfv,$es,$ev) = Math::BigInt::_split(\$wanted);
if (!ref $mis)
{
- die "$wanted is not a number initialized to $class" if !$NaNOK;
+ if ($_trap_nan)
+ {
+ require Carp;
+ Carp::croak ("$wanted is not a number initialized to $class");
+ }
return $downgrade->bnan() if $downgrade;
@@ -153,7 +180,7 @@ sub new
if ($downgrade && $self->{_e}->{sign} eq '+')
{
-# print "downgrading $$miv$$mfv"."E$$es$$ev";
+ #print "downgrading $$miv$$mfv"."E$$es$$ev";
if ($self->{_e}->is_zero())
{
$self->{_m}->{sign} = $$mis; # negative if wanted
@@ -161,22 +188,40 @@ sub new
}
return $downgrade->new("$$mis$$miv$$mfv"."E$$es$$ev");
}
- # print "mbf new $self->{sign} $self->{_m} e $self->{_e} ",ref($self),"\n";
- $self->bnorm()->round(@r); # first normalize, then round
+ #print "mbf new $self->{sign} $self->{_m} e $self->{_e} ",ref($self),"\n";
+ $self->bnorm()->round(@r); # first normalize, then round
}
sub _bnan
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bone() to initialize number to NaN
my $self = shift;
+
+ if ($_trap_nan)
+ {
+ require Carp;
+ my $class = ref($self);
+ Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
+ }
+
+ $IMPORT=1; # call our import only once
$self->{_m} = $MBI->bzero();
$self->{_e} = $MBI->bzero();
}
sub _binf
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bone() to initialize number to +-inf
my $self = shift;
+
+ if ($_trap_inf)
+ {
+ require Carp;
+ my $class = ref($self);
+ Carp::croak ("Tried to set $self to +-inf in $class\::_binf()");
+ }
+
+ $IMPORT=1; # call our import only once
$self->{_m} = $MBI->bzero();
$self->{_e} = $MBI->bzero();
}
@@ -185,14 +230,16 @@ sub _bone
{
# used by parent class bone() to initialize number to 1
my $self = shift;
+ $IMPORT=1; # call our import only once
$self->{_m} = $MBI->bone();
$self->{_e} = $MBI->bzero();
}
sub _bzero
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bone() to initialize number to 0
my $self = shift;
+ $IMPORT=1; # call our import only once
$self->{_m} = $MBI->bzero();
$self->{_e} = $MBI->bone();
}
@@ -209,16 +256,11 @@ sub config
# return (later set?) configuration data as hash ref
my $class = shift || 'Math::BigFloat';
- my $cfg = $MBI->config();
+ my $cfg = $class->SUPER::config(@_);
- no strict 'refs';
+ # now we need only to override the ones that are different from our parent
$cfg->{class} = $class;
$cfg->{with} = $MBI;
- foreach (
- qw/upgrade downgrade precision accuracy round_mode VERSION div_scale/)
- {
- $cfg->{lc($_)} = ${"${class}::$_"};
- };
$cfg;
}
@@ -231,50 +273,46 @@ sub bstr
# Convert number from internal format to (non-scientific) string format.
# internal format is always normalized (no leading zeros, "-0" => "+0")
my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
- #my $x = shift; my $class = ref($x) || $x;
- #$x = $class->new(shift) unless ref($x);
- #die "Oups! e was $nan" if $x->{_e}->{sign} eq $nan;
- #die "Oups! m was $nan" if $x->{_m}->{sign} eq $nan;
if ($x->{sign} !~ /^[+-]$/)
{
return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
return 'inf'; # +inf
}
-
+
my $es = '0'; my $len = 1; my $cad = 0; my $dot = '.';
- my $not_zero = ! $x->is_zero();
+ # $x is zero?
+ my $not_zero = !($x->{sign} eq '+' && $x->{_m}->is_zero());
if ($not_zero)
{
$es = $x->{_m}->bstr();
$len = CORE::length($es);
- if (!$x->{_e}->is_zero())
+ my $e = $x->{_e}->numify();
+ if ($e < 0)
{
- if ($x->{_e}->sign() eq '-')
+ $dot = '';
+ # if _e is bigger than a scalar, the following will blow your memory
+ if ($e <= -$len)
{
- $dot = '';
- if ($x->{_e} <= -$len)
- {
- # print "style: 0.xxxx\n";
- my $r = $x->{_e}->copy(); $r->babs()->bsub( CORE::length($es) );
- $es = '0.'. ('0' x $r) . $es; $cad = -($len+$r);
- }
- else
- {
- # print "insert '.' at $x->{_e} in '$es'\n";
- substr($es,$x->{_e},0) = '.'; $cad = $x->{_e};
- }
+ #print "style: 0.xxxx\n";
+ my $r = abs($e) - $len;
+ $es = '0.'. ('0' x $r) . $es; $cad = -($len+$r);
}
else
{
- # expand with zeros
- $es .= '0' x $x->{_e}; $len += $x->{_e}; $cad = 0;
+ #print "insert '.' at $e in '$es'\n";
+ substr($es,$e,0) = '.'; $cad = $x->{_e};
}
}
+ elsif ($e > 0)
+ {
+ # expand with zeros
+ $es .= '0' x $e; $len += $e; $cad = 0;
+ }
} # if not zero
- $es = $x->{sign}.$es if $x->{sign} eq '-';
- # if set accuracy or precision, pad with zeros
+ $es = '-'.$es if $x->{sign} eq '-';
+ # if set accuracy or precision, pad with zeros on the right side
if ((defined $x->{_a}) && ($not_zero))
{
# 123400 => 6, 0.1234 => 4, 0.001234 => 4
@@ -282,7 +320,7 @@ sub bstr
$zeros = $x->{_a} - $len if $cad != $len;
$es .= $dot.'0' x $zeros if $zeros > 0;
}
- elsif ($x->{_p} || 0 < 0)
+ elsif ((($x->{_p} || 0) < 0))
{
# 123400 => 6, 0.1234 => 4, 0.001234 => 6
my $zeros = -$x->{_p} + $cad;
@@ -300,16 +338,15 @@ sub bsstr
#my $x = shift; my $class = ref($x) || $x;
#$x = $class->new(shift) unless ref($x);
- #die "Oups! e was $nan" if $x->{_e}->{sign} eq $nan;
- #die "Oups! m was $nan" if $x->{_m}->{sign} eq $nan;
if ($x->{sign} !~ /^[+-]$/)
{
return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
return 'inf'; # +inf
}
- my $sign = $x->{_e}->{sign}; $sign = '' if $sign eq '-';
- my $sep = 'e'.$sign;
- $x->{_m}->bstr().$sep.$x->{_e}->bstr();
+ my $esign = $x->{_e}->{sign}; $esign = '' if $esign eq '-';
+ my $sep = 'e'.$esign;
+ my $sign = $x->{sign}; $sign = '' if $sign eq '+';
+ $sign . $x->{_m}->bstr() . $sep . $x->{_e}->bstr();
}
sub numify
@@ -344,6 +381,9 @@ sub bcmp
($self,$x,$y) = objectify(2,@_);
}
+ return $upgrade->bcmp($x,$y) if defined $upgrade &&
+ ((!$x->isa($self)) || (!$y->isa($self)));
+
if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
{
# handle +-inf and NaN
@@ -407,6 +447,9 @@ sub bacmp
($self,$x,$y) = objectify(2,@_);
}
+ return $upgrade->bacmp($x,$y) if defined $upgrade &&
+ ((!$x->isa($self)) || (!$y->isa($self)));
+
# handle +-inf and NaN's
if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/)
{
@@ -610,53 +653,55 @@ sub bdec
$x->badd($self->bone('-'),$a,$p,$r); # does round
}
+sub DEBUG () { 0; }
+
sub blog
{
- my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(2,@_);
+ my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
- # http://www.efunda.com/math/taylor_series/logarithmic.cfm?search_string=log
-
- # u = x-1, v = x+1
- # _ _
- # Taylor: | u 1 u^3 1 u^5 |
- # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 0
- # |_ v 3 v^3 5 v^5 _|
-
- # This takes much more steps to calculate the result:
- # u = x-1
- # _ _
- # Taylor: | u 1 u^2 1 u^3 |
- # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 1/2
- # |_ x 2 x^2 3 x^3 _|
+ # $base > 0, $base != 1; if $base == undef default to $base == e
+ # $x >= 0
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
- my $scale = 0;
- my @params = $x->_find_round_parameters($a,$p,$r);
+ my ($scale,@params);
+ ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+ # also takes care of the "error in _find_round_parameters?" case
+ return $x->bnan() if $x->{sign} ne '+' || $x->is_zero();
+
# no rounding at all, so must use fallback
- if (scalar @params == 1)
+ if (scalar @params == 0)
{
# simulate old behaviour
- $params[1] = $self->div_scale(); # and round to it as accuracy
- $params[0] = undef;
- $scale = $params[1]+4; # at least four more for proper round
- $params[3] = $r; # round mode by caller or undef
+ $params[0] = $self->div_scale(); # and round to it as accuracy
+ $params[1] = undef; # P = undef
+ $scale = $params[0]+4; # at least four more for proper round
+ $params[2] = $r; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
}
else
{
# the 4 below is empirical, and there might be cases where it is not
# enough...
- $scale = abs($params[1] || $params[2]) + 4; # take whatever is defined
+ $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
}
return $x->bzero(@params) if $x->is_one();
- return $x->bnan() if $x->{sign} ne '+' || $x->is_zero();
- return $x->bone('+',@params) if $x->bcmp($base) == 0;
+ # base not defined => base == Euler's constant e
+ if (defined $base)
+ {
+ # make object, since we don't feed it trough objectify() to still get the
+ # case of $base == undef
+ $base = $self->new($base) unless ref($base);
+ # $base > 0; $base != 1
+ return $x->bnan() if $base->is_zero() || $base->is_one() ||
+ $base->{sign} ne '+';
+ return $x->bone('+',@params) if $x->bcmp($base) == 0;
+ }
# when user set globals, they would interfere with our calculation, so
- # disable then and later re-enable them
+ # disable them and later re-enable them
no strict 'refs';
my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
@@ -665,63 +710,33 @@ sub blog
delete $x->{_a}; delete $x->{_p};
# need to disable $upgrade in BigInt, to avoid deep recursion
local $Math::BigInt::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
+
+ # upgrade $x if $x is not a BigFloat (handle BigInt input)
+ if (!$x->isa('Math::BigFloat'))
+ {
+ $x = Math::BigFloat->new($x);
+ $self = ref($x);
+ }
+ # first calculate the log to base e (using reduction by 10 (and probably 2))
+ $self->_log_10($x,$scale);
- my ($case,$limit,$v,$u,$below,$factor,$two,$next,$over,$f);
-
- if (3 < 5)
- #if ($x <= Math::BigFloat->new("0.5"))
- {
- $case = 0;
- # print "case $case $x < 0.5\n";
- $v = $x->copy(); $v->binc(); # v = x+1
- $x->bdec(); $u = $x->copy(); # u = x-1; x = x-1
- $x->bdiv($v,$scale); # first term: u/v
- $below = $v->copy();
- $over = $u->copy();
- $u *= $u; $v *= $v; # u^2, v^2
- $below->bmul($v); # u^3, v^3
- $over->bmul($u);
- $factor = $self->new(3); $f = $self->new(2);
- }
- #else
- # {
- # $case = 1;
- # print "case 1 $x > 0.5\n";
- # $v = $x->copy(); # v = x
- # $u = $x->copy(); $u->bdec(); # u = x-1;
- # $x->bdec(); $x->bdiv($v,$scale); # first term: x-1/x
- # $below = $v->copy();
- # $over = $u->copy();
- # $below->bmul($v); # u^2, v^2
- # $over->bmul($u);
- # $factor = $self->new(2); $f = $self->bone();
- # }
- $limit = $self->new("1E-". ($scale-1));
- #my $steps = 0;
- while (3 < 5)
+ # and if a different base was requested, convert it
+ if (defined $base)
{
- # we calculate the next term, and add it to the last
- # when the next term is below our limit, it won't affect the outcome
- # anymore, so we stop
- $next = $over->copy()->bdiv($below->copy()->bmul($factor),$scale);
- last if $next->bcmp($limit) <= 0;
- $x->badd($next);
- # print "step $x\n";
- # calculate things for the next term
- $over *= $u; $below *= $v; $factor->badd($f);
- #$steps++;
+ $base = Math::BigFloat->new($base) unless $base->isa('Math::BigFloat');
+ # not ln, but some other base
+ $x->bdiv( $base->copy()->blog(undef,$scale), $scale );
}
- $x->bmul(2) if $case == 0;
- #print "took $steps steps\n";
-
+
# shortcut to not run trough _find_round_parameters again
- if (defined $params[1])
+ if (defined $params[0])
{
- $x->bround($params[1],$params[3]); # then round accordingly
+ $x->bround($params[0],$params[2]); # then round accordingly
}
else
{
- $x->bfround($params[2],$params[3]); # then round accordingly
+ $x->bfround($params[1],$params[2]); # then round accordingly
}
if ($fallback)
{
@@ -734,6 +749,251 @@ sub blog
$x;
}
+sub _log
+ {
+ # internal log function to calculate log based on Taylor.
+ # Modifies $x in place.
+ my ($self,$x,$scale) = @_;
+
+ # http://www.efunda.com/math/taylor_series/logarithmic.cfm?search_string=log
+
+ # u = x-1, v = x+1
+ # _ _
+ # Taylor: | u 1 u^3 1 u^5 |
+ # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 0
+ # |_ v 3 v^3 5 v^5 _|
+
+ # This takes much more steps to calculate the result and is thus not used
+ # u = x-1
+ # _ _
+ # Taylor: | u 1 u^2 1 u^3 |
+ # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 1/2
+ # |_ x 2 x^2 3 x^3 _|
+
+ # "normal" log algorithmn
+
+ my ($limit,$v,$u,$below,$factor,$two,$next,$over,$f);
+
+ $v = $x->copy(); $v->binc(); # v = x+1
+ $x->bdec(); $u = $x->copy(); # u = x-1; x = x-1
+ $x->bdiv($v,$scale); # first term: u/v
+ $below = $v->copy();
+ $over = $u->copy();
+ $u *= $u; $v *= $v; # u^2, v^2
+ $below->bmul($v); # u^3, v^3
+ $over->bmul($u);
+ $factor = $self->new(3); $f = $self->new(2);
+
+ my $steps = 0 if DEBUG;
+ $limit = $self->new("1E-". ($scale-1));
+ while (3 < 5)
+ {
+ # we calculate the next term, and add it to the last
+ # when the next term is below our limit, it won't affect the outcome
+ # anymore, so we stop
+
+ # calculating the next term simple from over/below will result in quite
+ # a time hog if the input has many digits, since over and below will
+ # accumulate more and more digits, and the result will also have many
+ # digits, but in the end it is rounded to $scale digits anyway. So if we
+ # round $over and $below first, we save a lot of time for the division
+ # (not with log(1.2345), but try log (123**123) to see what I mean. This
+ # can introduce a rounding error if the division result would be f.i.
+ # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but
+ # if we truncated the $over and $below we might get 0.12345. Does this
+ # matter for the end result? So we give over and below 4 more digits to be
+ # on the safe side (unscientific error handling as usual...)
+ # Makes blog(1.23) *slightly* slower, but try blog(123*123) w/o it :o)
+
+ $next = $over->copy->bround($scale+4)->bdiv(
+ $below->copy->bmul($factor)->bround($scale+4),
+ $scale);
+
+## old version:
+## $next = $over->copy()->bdiv($below->copy()->bmul($factor),$scale);
+
+ last if $next->bacmp($limit) <= 0;
+
+ delete $next->{_a}; delete $next->{_p};
+ $x->badd($next);
+ #print "step $x\n ($next - $limit = ",$next - $limit,")\n";
+ # calculate things for the next term
+ $over *= $u; $below *= $v; $factor->badd($f);
+ if (DEBUG)
+ {
+ $steps++; print "step $steps = $x\n" if $steps % 10 == 0;
+ }
+ }
+ $x->bmul($f); # $x *= 2
+ print "took $steps steps\n" if DEBUG;
+ }
+
+sub _log_10
+ {
+ # internal log function based on reducing input to the range of 0.1 .. 9.99
+ my ($self,$x,$scale) = @_;
+
+ # taking blog() from numbers greater than 10 takes a *very long* time, so we
+ # break the computation down into parts based on the observation that:
+ # blog(x*y) = blog(x) + blog(y)
+ # We set $y here to multiples of 10 so that $x is below 1 (the smaller $x is
+ # the faster it get's, especially because 2*$x takes about 10 times as long,
+ # so by dividing $x by 10 we make it at least factor 100 faster...)
+
+ # The same observation is valid for numbers smaller than 0.1 (e.g. computing
+ # log(1) is fastest, and the farther away we get from 1, the longer it takes)
+ # so we also 'break' this down by multiplying $x with 10 and subtract the
+ # log(10) afterwards to get the correct result.
+
+ # calculate nr of digits before dot
+ my $dbd = $x->{_m}->length() + $x->{_e}->numify();
+
+ # more than one digit (e.g. at least 10), but *not* exactly 10 to avoid
+ # infinite recursion
+
+ my $calc = 1; # do some calculation?
+
+ # disable the shortcut for 10, since we need log(10) and this would recurse
+ # infinitely deep
+ if ($x->{_e}->is_one() && $x->{_m}->is_one())
+ {
+ $dbd = 0; # disable shortcut
+ # we can use the cached value in these cases
+ if ($scale <= $LOG_10_A)
+ {
+ $x->bzero(); $x->badd($LOG_10);
+ $calc = 0; # no need to calc, but round
+ }
+ }
+ # disable the shortcut for 2, since we maybe have it cached
+ my $two = $self->new(2); # also used later on
+ if ($x->{_e}->is_zero() && $x->{_m}->bcmp($two) == 0)
+ {
+ $dbd = 0; # disable shortcut
+ # we can use the cached value in these cases
+ if ($scale <= $LOG_2_A)
+ {
+ $x->bzero(); $x->badd($LOG_2);
+ $calc = 0; # no need to calc, but round
+ }
+ }
+
+ # if $x = 0.1, we know the result must be 0-log(10)
+ if ($x->{_e}->is_one('-') && $x->{_m}->is_one())
+ {
+ $dbd = 0; # disable shortcut
+ # we can use the cached value in these cases
+ if ($scale <= $LOG_10_A)
+ {
+ $x->bzero(); $x->bsub($LOG_10);
+ $calc = 0; # no need to calc, but round
+ }
+ }
+
+ # default: these correction factors are undef and thus not used
+ my $l_10; # value of ln(10) to A of $scale
+ my $l_2; # value of ln(2) to A of $scale
+
+ # $x == 2 => 1, $x == 13 => 2, $x == 0.1 => 0, $x == 0.01 => -1
+ # so don't do this shortcut for 1 or 0
+ if (($dbd > 1) || ($dbd < 0))
+ {
+ # convert our cached value to an object if not already (avoid doing this
+ # at import() time, since not everybody needs this)
+ $LOG_10 = $self->new($LOG_10,undef,undef) unless ref $LOG_10;
+
+ #print "x = $x, dbd = $dbd, calc = $calc\n";
+ # got more than one digit before the dot, or more than one zero after the
+ # dot, so do:
+ # log(123) == log(1.23) + log(10) * 2
+ # log(0.0123) == log(1.23) - log(10) * 2
+
+ if ($scale <= $LOG_10_A)
+ {
+ # use cached value
+ #print "using cached value for l_10\n";
+ $l_10 = $LOG_10->copy(); # copy for mul
+ }
+ else
+ {
+ # else: slower, compute it (but don't cache it, because it could be big)
+ # also disable downgrade for this code path
+ local $Math::BigFloat::downgrade = undef;
+ #print "l_10 = $l_10 (self = $self',
+ # ", ref(l_10) = ",ref($l_10)," scale $scale)\n";
+ #print "calculating value for l_10, scale $scale\n";
+ $l_10 = $self->new(10)->blog(undef,$scale); # scale+4, actually
+ }
+ $dbd-- if ($dbd > 1); # 20 => dbd=2, so make it dbd=1
+ # make object
+ $dbd = $self->new($dbd);
+ #print "dbd $dbd\n";
+ $l_10->bmul($dbd); # log(10) * (digits_before_dot-1)
+ #print "l_10 = $l_10\n";
+ #print "x = $x";
+ $x->{_e}->bsub($dbd); # 123 => 1.23
+ #print " => $x\n";
+ #print "calculating log($x) with scale=$scale\n";
+
+ }
+
+ # Now: 0.1 <= $x < 10 (and possible correction in l_10)
+
+ ### Since $x in the range 0.5 .. 1.5 is MUCH faster, we do a repeated div
+ ### or mul by 2 (maximum times 3, since x < 10 and x > 0.1)
+
+ if ($calc != 0)
+ {
+ my $half = $self->new('0.5');
+ my $twos = 0; # default: none (0 times)
+ while ($x->bacmp($half) < 0)
+ {
+ #print "$x\n";
+ $twos--; $x->bmul($two);
+ }
+ while ($x->bacmp($two) > 0)
+ {
+ #print "$x\n";
+ $twos++; $x->bdiv($two,$scale+4); # keep all digits
+ }
+ #print "$twos\n";
+ # $twos > 0 => did mul 2, < 0 => did div 2 (never both)
+ # calculate correction factor based on ln(2)
+ if ($twos != 0)
+ {
+ $LOG_2 = $self->new($LOG_2,undef,undef) unless ref $LOG_2;
+ if ($scale <= $LOG_2_A)
+ {
+ # use cached value
+ #print "using cached value for l_10\n";
+ $l_2 = $LOG_2->copy(); # copy for mul
+ }
+ else
+ {
+ # else: slower, compute it (but don't cache it, because it could be big)
+ # also disable downgrade for this code path
+ local $Math::BigFloat::downgrade = undef;
+ #print "calculating value for l_2, scale $scale\n";
+ $l_2 = $two->blog(undef,$scale); # scale+4, actually
+ }
+ #print "$l_2 => \n";
+ $l_2->bmul($twos); # * -2 => subtract, * 2 => add
+ #print "$l_2\n";
+ }
+ }
+
+ if ($calc != 0)
+ {
+ $self->_log($x,$scale); # need to do the "normal" way
+ #print "log(x) = $x\n";
+ $x->badd($l_10) if defined $l_10; # correct it by ln(10)
+ #print "result = $x\n";
+ $x->badd($l_2) if defined $l_2; # and maybe by ln(2)
+ #print "result = $x\n";
+ }
+ # all done, $x contains now the result
+ }
+
sub blcm
{
# (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
@@ -783,9 +1043,9 @@ sub is_zero
sub is_one
{
# return true if arg (BFLOAT or num_str) is +1 or -1 if signis given
- my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+ my ($self,$x,$sign) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
- my $sign = shift || ''; $sign = '+' if $sign ne '-';
+ $sign = '+' if !defined $sign || $sign ne '-';
return 1
if ($x->{sign} eq $sign && $x->{_e}->is_zero() && $x->{_m}->is_one());
0;
@@ -876,23 +1136,25 @@ sub bdiv
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
- my $scale = 0;
- my @params = $x->_find_round_parameters($a,$p,$r,$y);
+ my (@params,$scale);
+ ($x,@params) = $x->_find_round_parameters($a,$p,$r,$y);
+
+ return $x if $x->is_nan(); # error in _find_round_parameters?
# no rounding at all, so must use fallback
- if (scalar @params == 1)
+ if (scalar @params == 0)
{
# simulate old behaviour
- $params[1] = $self->div_scale(); # and round to it as accuracy
- $scale = $params[1]+4; # at least four more for proper round
- $params[3] = $r; # round mode by caller or undef
+ $params[0] = $self->div_scale(); # and round to it as accuracy
+ $scale = $params[0]+4; # at least four more for proper round
+ $params[2] = $r; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
}
else
{
# the 4 below is empirical, and there might be cases where it is not
# enough...
- $scale = abs($params[1] || $params[2]) + 4; # take whatever is defined
+ $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
}
my $lx = $x->{_m}->length(); my $ly = $y->{_m}->length();
$scale = $lx if $lx > $scale;
@@ -915,7 +1177,6 @@ sub bdiv
# promote BigInts and it's subclasses (except when already a BigFloat)
$y = $self->new($y) unless $y->isa('Math::BigFloat');
- #print "bdiv $y ",ref($y),"\n";
# need to disable $upgrade in BigInt, to avoid deep recursion
local $Math::BigInt::upgrade = undef; # should be parent class vs MBI
@@ -929,13 +1190,15 @@ sub bdiv
}
# shortcut to not run trough _find_round_parameters again
- if (defined $params[1])
+ if (defined $params[0])
{
- $x->bround($params[1],$params[3]); # then round accordingly
+ $x->{_a} = undef; # clear before round
+ $x->bround($params[0],$params[2]); # then round accordingly
}
else
{
- $x->bfround($params[2],$params[3]); # then round accordingly
+ $x->{_p} = undef; # clear before round
+ $x->bfround($params[1],$params[2]); # then round accordingly
}
if ($fallback)
{
@@ -947,7 +1210,7 @@ sub bdiv
{
if (!$y->is_one())
{
- $rem->bmod($y,$params[1],$params[2],$params[3]); # copy already done
+ $rem->bmod($y,@params); # copy already done
}
else
{
@@ -1050,35 +1313,38 @@ sub bmod
$x->round($a,$p,$r,$y); # round and return
}
-sub bsqrt
- {
- # calculate square root; this should probably
- # use a different test to see whether the accuracy we want is...
- my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+sub broot
+ {
+ # calculate $y'th root of $x
+ my ($self,$x,$y,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(2,@_);
- return $x->bnan() if $x->{sign} eq 'NaN' || $x->{sign} =~ /^-/; # <0, NaN
- return $x if $x->{sign} eq '+inf'; # +inf
- return $x if $x->is_zero() || $x->is_one();
+ # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
+ return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
+ $y->{sign} !~ /^\+$/;
+ return $x if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
+
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
- my $scale = 0;
- my @params = $x->_find_round_parameters($a,$p,$r);
+ my (@params,$scale);
+ ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+
+ return $x if $x->is_nan(); # error in _find_round_parameters?
# no rounding at all, so must use fallback
- if (scalar @params == 1)
+ if (scalar @params == 0)
{
# simulate old behaviour
- $params[1] = $self->div_scale(); # and round to it as accuracy
- $scale = $params[1]+4; # at least four more for proper round
- $params[3] = $r; # round mode by caller or undef
+ $params[0] = $self->div_scale(); # and round to it as accuracy
+ $scale = $params[0]+4; # at least four more for proper round
+ $params[2] = $r; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
}
else
{
# the 4 below is empirical, and there might be cases where it is not
# enough...
- $scale = abs($params[1] || $params[2]) + 4; # take whatever is defined
+ $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
}
# when user set globals, they would interfere with our calculation, so
@@ -1092,65 +1358,37 @@ sub bsqrt
# need to disable $upgrade in BigInt, to avoid deep recursion
local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
- my $xas = $x->as_number();
- my $gs = $xas->copy()->bsqrt(); # some guess
+ # remember sign and make $x positive, since -4 ** (1/2) => -2
+ my $sign = 0; $sign = 1 if $x->is_negative(); $x->babs();
-# print "guess $gs\n";
- if (($x->{_e}->{sign} ne '-') # guess can't be accurate if there are
- # digits after the dot
- && ($xas->bacmp($gs * $gs) == 0)) # guess hit the nail on the head?
+ if ($y->bcmp(2) == 0) # normal square root
{
- # exact result
- $x->{_m} = $gs; $x->{_e} = $MBI->bzero(); $x->bnorm();
- # shortcut to not run trough _find_round_parameters again
- if (defined $params[1])
- {
- $x->bround($params[1],$params[3]); # then round accordingly
- }
- else
- {
- $x->bfround($params[2],$params[3]); # then round accordingly
- }
- if ($fallback)
- {
- # clear a/p after round, since user did not request it
- $x->{_a} = undef; $x->{_p} = undef;
- }
- # re-enable A and P, upgrade is taken care of by "local"
- ${"$self\::accuracy"} = $ab; ${"$self\::precision"} = $pb;
- return $x;
+ $x->bsqrt($scale+4);
}
- $gs = $self->new( $gs ); # BigInt to BigFloat
-
- my $lx = $x->{_m}->length();
- $scale = $lx if $scale < $lx;
- my $e = $self->new("1E-$scale"); # make test variable
-
- my $y = $x->copy();
- my $two = $self->new(2);
- my $diff = $e;
- # promote BigInts and it's subclasses (except when already a BigFloat)
- $y = $self->new($y) unless $y->isa('Math::BigFloat');
-
- my $rem;
- while ($diff->bacmp($e) >= 0)
+ elsif ($y->is_one('-'))
{
- $rem = $y->copy()->bdiv($gs,$scale);
- $rem = $y->copy()->bdiv($gs,$scale)->badd($gs)->bdiv($two,$scale);
- $diff = $rem->copy()->bsub($gs);
- $gs = $rem->copy();
+ # $x ** -1 => 1/$x
+ my $u = $self->bone()->bdiv($x,$scale);
+ # copy private parts over
+ $x->{_m} = $u->{_m};
+ $x->{_e} = $u->{_e};
}
- # copy over to modify $x
- $x->{_m} = $rem->{_m}; $x->{_e} = $rem->{_e};
+ else
+ {
+ my $u = $self->bone()->bdiv($y,$scale+4);
+ delete $u->{_a}; delete $u->{_p}; # otherwise it conflicts
+ $x->bpow($u,$scale+4); # el cheapo
+ }
+ $x->bneg() if $sign == 1;
# shortcut to not run trough _find_round_parameters again
- if (defined $params[1])
+ if (defined $params[0])
{
- $x->bround($params[1],$params[3]); # then round accordingly
+ $x->bround($params[0],$params[2]); # then round accordingly
}
else
{
- $x->bfround($params[2],$params[3]); # then round accordingly
+ $x->bfround($params[1],$params[2]); # then round accordingly
}
if ($fallback)
{
@@ -1162,55 +1400,40 @@ sub bsqrt
$x;
}
-sub bfac
- {
- # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
- # compute factorial numbers
- # modifies first argument
- my ($self,$x,@r) = objectify(1,@_);
+sub bsqrt
+ {
+ # calculate square root
+ my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
- return $x->bnan()
- if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN
- ($x->{_e}->{sign} ne '+')); # digits after dot?
+ return $x->bnan() if $x->{sign} !~ /^[+]/; # NaN, -inf or < 0
+ return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf
+ return $x->round($a,$p,$r) if $x->is_zero() || $x->is_one();
- return $x->bone('+',@r) if $x->is_zero() || $x->is_one(); # 0 or 1 => 1
-
- # use BigInt's bfac() for faster calc
- $x->{_m}->blsft($x->{_e},10); # un-norm m
- $x->{_e}->bzero(); # norm $x again
- $x->{_m}->bfac(); # factorial
- $x->bnorm()->round(@r);
- }
-
-sub _pow2
- {
- # Calculate a power where $y is a non-integer, like 2 ** 0.5
- my ($x,$y,$a,$p,$r) = @_;
- my $self = ref($x);
-
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
- my $scale = 0;
- my @params = $x->_find_round_parameters($a,$p,$r);
+ my (@params,$scale);
+ ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+
+ return $x if $x->is_nan(); # error in _find_round_parameters?
# no rounding at all, so must use fallback
- if (scalar @params == 1)
+ if (scalar @params == 0)
{
# simulate old behaviour
- $params[1] = $self->div_scale(); # and round to it as accuracy
- $scale = $params[1]+4; # at least four more for proper round
- $params[3] = $r; # round mode by caller or undef
+ $params[0] = $self->div_scale(); # and round to it as accuracy
+ $scale = $params[0]+4; # at least four more for proper round
+ $params[2] = $r; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
}
else
{
# the 4 below is empirical, and there might be cases where it is not
# enough...
- $scale = abs($params[1] || $params[2]) + 4; # take whatever is defined
+ $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
}
# when user set globals, they would interfere with our calculation, so
- # disable then and later re-enable them
+ # disable them and later re-enable them
no strict 'refs';
my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
@@ -1218,60 +1441,89 @@ sub _pow2
# them already into account), since these would interfere, too
delete $x->{_a}; delete $x->{_p};
# need to disable $upgrade in BigInt, to avoid deep recursion
- local $Math::BigInt::upgrade = undef;
-
- # split the second argument into its integer and fraction part
- # we calculate the result then from these two parts, like in
- # 2 ** 2.4 == (2 ** 2) * (2 ** 0.4)
- my $c = $self->new($y->as_number()); # integer part
- my $d = $y-$c; # fractional part
- my $xc = $x->copy(); # a temp. copy
-
- # now calculate binary fraction from the decimal fraction on the fly
- # f.i. 0.654:
- # 0.654 * 2 = 1.308 > 1 => 0.1 ( 1.308 - 1 = 0.308)
- # 0.308 * 2 = 0.616 < 1 => 0.10
- # 0.616 * 2 = 1.232 > 1 => 0.101 ( 1.232 - 1 = 0.232)
- # and so on...
- # The process stops when the result is exactly one, or when we have
- # enough accuracy
-
- # From the binary fraction we calculate the result as follows:
- # we assume the fraction ends in 1, and we remove this one first.
- # For each digit after the dot, assume 1 eq R and 0 eq XR, where R means
- # take square root and X multiply with the original X.
-
- my $i = 0;
- while ($i++ < 50)
+ local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
+
+ my $xas = $x->as_number();
+ my $gs = $xas->copy()->bsqrt(); # some guess
+
+ if (($x->{_e}->{sign} ne '-') # guess can't be accurate if there are
+ # digits after the dot
+ && ($xas->bacmp($gs * $gs) == 0)) # guess hit the nail on the head?
{
- $d->badd($d); # * 2
- last if $d->is_one(); # == 1
- $x->bsqrt(); # 0
- if ($d > 1)
+ # exact result
+ $x->{_m} = $gs; $x->{_e} = $MBI->bzero(); $x->bnorm();
+ # shortcut to not run trough _find_round_parameters again
+ if (defined $params[0])
+ {
+ $x->bround($params[0],$params[2]); # then round accordingly
+ }
+ else
{
- $x->bsqrt(); $x->bmul($xc); $d->bdec(); # 1
+ $x->bfround($params[1],$params[2]); # then round accordingly
}
+ if ($fallback)
+ {
+ # clear a/p after round, since user did not request it
+ $x->{_a} = undef; $x->{_p} = undef;
+ }
+ # re-enable A and P, upgrade is taken care of by "local"
+ ${"$self\::accuracy"} = $ab; ${"$self\::precision"} = $pb;
+ return $x;
}
- # assume fraction ends in 1
- $x->bsqrt(); # 1
- if (!$c->is_one())
- {
- $x->bmul( $xc->bpow($c) );
+
+ # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy
+ # of the result by multipyling the input by 100 and then divide the integer
+ # result of sqrt(input) by 10. Rounding afterwards returns the real result.
+ # this will transform 123.456 (in $x) into 123456 (in $y1)
+ my $y1 = $x->{_m}->copy();
+ # We now make sure that $y1 has the same odd or even number of digits than
+ # $x had. So when _e of $x is odd, we must shift $y1 by one digit left,
+ # because we always must multiply by steps of 100 (sqrt(100) is 10) and not
+ # steps of 10. The length of $x does not count, since an even or odd number
+ # of digits before the dot is not changed by adding an even number of digits
+ # after the dot (the result is still odd or even digits long).
+ my $length = $y1->length();
+ $y1->bmul(10) if $x->{_e}->is_odd();
+ # now calculate how many digits the result of sqrt(y1) would have
+ my $digits = int($length / 2);
+ # but we need at least $scale digits, so calculate how many are missing
+ my $shift = $scale - $digits;
+ # that should never happen (we take care of integer guesses above)
+ # $shift = 0 if $shift < 0;
+ # multiply in steps of 100, by shifting left two times the "missing" digits
+ $y1->blsft($shift*2,10);
+ # now take the square root and truncate to integer
+ $y1->bsqrt();
+ # By "shifting" $y1 right (by creating a negative _e) we calculate the final
+ # result, which is than later rounded to the desired scale.
+
+ # calculate how many zeros $x had after the '.' (or before it, depending
+ # on sign of $dat, the result should have half as many:
+ my $dat = $length + $x->{_e}->numify();
+
+ if ($dat > 0)
+ {
+ # no zeros after the dot (e.g. 1.23, 0.49 etc)
+ # preserve half as many digits before the dot than the input had
+ # (but round this "up")
+ $dat = int(($dat+1)/2);
}
- elsif (!$c->is_zero())
+ else
{
- $x->bmul( $xc );
+ $dat = int(($dat)/2);
}
- # done
+ $x->{_e}= $MBI->new( $dat - $y1->length() );
+
+ $x->{_m} = $y1;
# shortcut to not run trough _find_round_parameters again
- if (defined $params[1])
+ if (defined $params[0])
{
- $x->bround($params[1],$params[3]); # then round accordingly
+ $x->bround($params[0],$params[2]); # then round accordingly
}
else
{
- $x->bfround($params[2],$params[3]); # then round accordingly
+ $x->bfround($params[1],$params[2]); # then round accordingly
}
if ($fallback)
{
@@ -1283,6 +1535,26 @@ sub _pow2
$x;
}
+sub bfac
+ {
+ # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
+ # compute factorial numbers
+ # modifies first argument
+ my ($self,$x,@r) = objectify(1,@_);
+
+ return $x->bnan()
+ if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN
+ ($x->{_e}->{sign} ne '+')); # digits after dot?
+
+ return $x->bone('+',@r) if $x->is_zero() || $x->is_one(); # 0 or 1 => 1
+
+ # use BigInt's bfac() for faster calc
+ $x->{_m}->blsft($x->{_e},10); # un-norm m
+ $x->{_e}->bzero(); # norm $x again
+ $x->{_m}->bfac(); # factorial
+ $x->bnorm()->round(@r);
+ }
+
sub _pow
{
# Calculate a power where $y is a non-integer, like 2 ** 0.5
@@ -1292,35 +1564,41 @@ sub _pow
# if $y == 0.5, it is sqrt($x)
return $x->bsqrt($a,$p,$r,$y) if $y->bcmp('0.5') == 0;
+ # Using:
+ # a ** x == e ** (x * ln a)
+
# u = y * ln x
- # _ _
- # Taylor: | u u^2 u^3 |
- # x ** y = 1 + | --- + --- + * ----- + ... |
- # |_ 1 1*2 1*2*3 _|
+ # _ _
+ # Taylor: | u u^2 u^3 |
+ # x ** y = 1 + | --- + --- + ----- + ... |
+ # |_ 1 1*2 1*2*3 _|
# we need to limit the accuracy to protect against overflow
my $fallback = 0;
- my $scale = 0;
- my @params = $x->_find_round_parameters($a,$p,$r);
+ my ($scale,@params);
+ ($x,@params) = $x->_find_round_parameters($a,$p,$r);
+
+ return $x if $x->is_nan(); # error in _find_round_parameters?
# no rounding at all, so must use fallback
- if (scalar @params == 1)
+ if (scalar @params == 0)
{
# simulate old behaviour
- $params[1] = $self->div_scale(); # and round to it as accuracy
- $scale = $params[1]+4; # at least four more for proper round
- $params[3] = $r; # round mode by caller or undef
+ $params[0] = $self->div_scale(); # and round to it as accuracy
+ $params[1] = undef; # disable P
+ $scale = $params[0]+4; # at least four more for proper round
+ $params[2] = $r; # round mode by caller or undef
$fallback = 1; # to clear a/p afterwards
}
else
{
# the 4 below is empirical, and there might be cases where it is not
# enough...
- $scale = abs($params[1] || $params[2]) + 4; # take whatever is defined
+ $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
}
# when user set globals, they would interfere with our calculation, so
- # disable then and later re-enable them
+ # disable them and later re-enable them
no strict 'refs';
my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
@@ -1332,7 +1610,7 @@ sub _pow
my ($limit,$v,$u,$below,$factor,$next,$over);
- $u = $x->copy()->blog($scale)->bmul($y);
+ $u = $x->copy()->blog(undef,$scale)->bmul($y);
$v = $self->bone(); # 1
$factor = $self->new(2); # 2
$x->bone(); # first term: 1
@@ -1348,22 +1626,21 @@ sub _pow
# when the next term is below our limit, it won't affect the outcome
# anymore, so we stop
$next = $over->copy()->bdiv($below,$scale);
- last if $next->bcmp($limit) <= 0;
+ last if $next->bacmp($limit) <= 0;
$x->badd($next);
-# print "at $x\n";
# calculate things for the next term
$over *= $u; $below *= $factor; $factor->binc();
#$steps++;
}
# shortcut to not run trough _find_round_parameters again
- if (defined $params[1])
+ if (defined $params[0])
{
- $x->bround($params[1],$params[3]); # then round accordingly
+ $x->bround($params[0],$params[2]); # then round accordingly
}
else
{
- $x->bfround($params[2],$params[3]); # then round accordingly
+ $x->bfround($params[1],$params[2]); # then round accordingly
}
if ($fallback)
{
@@ -1543,7 +1820,10 @@ sub bround
# accuracy: preserve $N digits, and overwrite the rest with 0's
my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
- die ('bround() needs positive accuracy') if ($_[0] || 0) < 0;
+ if (($_[0] || 0) < 0)
+ {
+ require Carp; Carp::croak ('bround() needs positive accuracy');
+ }
my ($scale,$mode) = $x->_scale_a($self->accuracy(),$self->round_mode(),@_);
return $x if !defined $scale; # no-op
@@ -1675,6 +1955,7 @@ sub AUTOLOAD
$name =~ s/.*:://; # split package
no strict 'refs';
+ $class->import() if $IMPORT == 0;
if (!method_alias($name))
{
if (!defined $name)
@@ -1750,13 +2031,12 @@ sub import
my $self = shift;
my $l = scalar @_;
my $lib = ''; my @a;
+ $IMPORT=1;
for ( my $i = 0; $i < $l ; $i++)
{
-# print "at $_[$i] (",$_[$i+1]||'undef',")\n";
if ( $_[$i] eq ':constant' )
{
# this rest causes overlord er load to step in
- # print "overload @_\n";
overload::constant float => sub { $self->new(shift); };
}
elsif ($_[$i] eq 'upgrade')
@@ -1773,11 +2053,13 @@ sub import
}
elsif ($_[$i] eq 'lib')
{
+ # alternative library
$lib = $_[$i+1] || ''; # default Calc
$i++;
}
elsif ($_[$i] eq 'with')
{
+ # alternative class for our private parts()
$MBI = $_[$i+1] || 'Math::BigInt'; # default Math::BigInt
$i++;
}
@@ -1799,6 +2081,7 @@ sub import
# MBI not loaded, or with ne "Math::BigInt"
$lib .= ",$mbilib" if defined $mbilib;
$lib =~ s/^,//; # don't leave empty
+ # replacement library can handle lib statement, but also could ignore it
if ($] < 5.006)
{
# Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
@@ -1816,7 +2099,10 @@ sub import
eval $rc;
}
}
- die ("Couldn't load $MBI: $! $@") if $@;
+ if ($@)
+ {
+ require Carp; Carp::croak ("Couldn't load $MBI: $! $@");
+ }
# any non :constant stuff is handled by our parent, Exporter
# even if @_ is empty, to give it a chance
@@ -1852,7 +2138,44 @@ sub bnorm
}
##############################################################################
-# internal calculation routines
+
+sub as_hex
+ {
+ # return number as hexadecimal string (only for integers defined)
+ my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+ return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ return '0x0' if $x->is_zero();
+
+ return $nan if $x->{_e}->{sign} ne '+'; # how to do 1e-1 in hex!?
+
+ my $z = $x->{_m}->copy();
+ if (!$x->{_e}->is_zero()) # > 0
+ {
+ $z->blsft($x->{_e},10);
+ }
+ $z->{sign} = $x->{sign};
+ $z->as_hex();
+ }
+
+sub as_bin
+ {
+ # return number as binary digit string (only for integers defined)
+ my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+ return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
+ return '0b0' if $x->is_zero();
+
+ return $nan if $x->{_e}->{sign} ne '+'; # how to do 1e-1 in hex!?
+
+ my $z = $x->{_m}->copy();
+ if (!$x->{_e}->is_zero()) # > 0
+ {
+ $z->blsft($x->{_e},10);
+ }
+ $z->{sign} = $x->{sign};
+ $z->as_bin();
+ }
sub as_number
{
@@ -1929,8 +2252,10 @@ Math::BigFloat - Arbitrary size floating point math package
$x->digit($n); # return the nth digit, counting from right
$x->digit(-$n); # return the nth digit, counting from left
- # The following all modify their first argument:
-
+ # The following all modify their first argument. If you want to preserve
+ # $x, use $z = $x->copy()->bXXX($y); See under L<CAVEATS> for why this is
+ # neccessary when mixing $a = $b assigments with non-overloaded math.
+
# set
$x->bzero(); # set $i to 0
$x->bnan(); # set $i to NaN
@@ -1949,17 +2274,17 @@ Math::BigFloat - Arbitrary size floating point math package
$x->badd($y); # addition (add $y to $x)
$x->bsub($y); # subtraction (subtract $y from $x)
$x->bmul($y); # multiplication (multiply $x by $y)
- $x->bdiv($y); # divide, set $i to quotient
+ $x->bdiv($y); # divide, set $x to quotient
# return (quo,rem) or quo if scalar
- $x->bmod($y); # modulus
- $x->bpow($y); # power of arguments (a**b)
+ $x->bmod($y); # modulus ($x % $y)
+ $x->bpow($y); # power of arguments ($x ** $y)
$x->blsft($y); # left shift
$x->brsft($y); # right shift
# return (quo,rem) or quo if scalar
- $x->blog($base); # logarithm of $x, base defaults to e
- # (other bases than e not supported yet)
+ $x->blog(); # logarithm of $x to base e (Euler's number)
+ $x->blog($base); # logarithm of $x to base $base (f.i. 2)
$x->band($y); # bit-wise and
$x->bior($y); # bit-wise inclusive or
@@ -1967,21 +2292,23 @@ Math::BigFloat - Arbitrary size floating point math package
$x->bnot(); # bit-wise not (two's complement)
$x->bsqrt(); # calculate square-root
+ $x->broot($y); # $y'th root of $x (e.g. $y == 3 => cubic root)
$x->bfac(); # factorial of $x (1*2*3*4*..$x)
- $x->bround($N); # accuracy: preserver $N digits
+ $x->bround($N); # accuracy: preserve $N digits
$x->bfround($N); # precision: round to the $Nth digit
+ $x->bfloor(); # return integer less or equal than $x
+ $x->bceil(); # return integer greater or equal than $x
+
# The following do not modify their arguments:
+
bgcd(@values); # greatest common divisor
blcm(@values); # lowest common multiplicator
$x->bstr(); # return string
$x->bsstr(); # return string in scientific notation
- $x->bfloor(); # return integer less or equal than $x
- $x->bceil(); # return integer greater or equal than $x
-
$x->exponent(); # return exponent as BigInt
$x->mantissa(); # return mantissa as BigInt
$x->parts(); # return (mantissa,exponent) as BigInt
@@ -1994,8 +2321,10 @@ Math::BigFloat - Arbitrary size floating point math package
$x->accuracy(); # return A of $x (or global, if A of $x undef)
$x->accuracy($n); # set A $x to $n
- Math::BigFloat->precision(); # get/set global P for all BigFloat objects
- Math::BigFloat->accuracy(); # get/set global A for all BigFloat objects
+ # these get/set the appropriate global value for all BigFloat objects
+ Math::BigFloat->precision(); # Precision
+ Math::BigFloat->accuracy(); # Accuracy
+ Math::BigFloat->round_mode(); # rounding mode
=head1 DESCRIPTION
@@ -2047,7 +2376,7 @@ Output values are BigFloat objects (normalized), except for bstr() and bsstr().
The string output will always have leading and trailing zeros stripped and drop
a plus sign. C<bstr()> will give you always the form with a decimal point,
-while C<bsstr()> (for scientific) gives you the scientific notation.
+while C<bsstr()> (s for scientific) gives you the scientific notation.
Input bstr() bsstr()
'-0' '0' '0E1'
@@ -2060,7 +2389,9 @@ Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
C<is_nan()>) return true or false, while others (C<bcmp()>, C<bacmp()>)
return either undef, <0, 0 or >0 and are suited for sort.
-Actual math is done by using BigInts to represent the mantissa and exponent.
+Actual math is done by using the class defined with C<with => Class;> (which
+defaults to BigInts) to represent the mantissa and exponent.
+
The sign C</^[+-]$/> is stored separately. The string 'NaN' is used to
represent the result when input arguments are not numbers, as well as
the result of dividing by zero.
@@ -2093,18 +2424,31 @@ L<Math::BigInt>.
Since things like sqrt(2) or 1/3 must presented with a limited precision lest
a operation consumes all resources, each operation produces no more than
-C<Math::BigFloat::precision()> digits.
+the requested number of digits.
+
+Please refer to BigInt's documentation for the precedence rules of which
+accuracy/precision setting will be used.
+
+If there is no gloabl precision set, B<and> the operation inquestion was not
+called with a requested precision or accuracy, B<and> the input $x has no
+accuracy or precision set, then a fallback parameter will be used. For
+historical reasons, it is called C<div_scale> and can be accessed via:
+
+ $d = Math::BigFloat->div_scale(); # query
+ Math::BigFloat->div_scale($n); # set to $n digits
+
+The default value is 40 digits.
In case the result of one operation has more precision than specified,
it is rounded. The rounding mode taken is either the default mode, or the one
supplied to the operation after the I<scale>:
$x = Math::BigFloat->new(2);
- Math::BigFloat::precision(5); # 5 digits max
+ Math::BigFloat->precision(5); # 5 digits max
$y = $x->copy()->bdiv(3); # will give 0.66666
$y = $x->copy()->bdiv(3,6); # will give 0.666666
$y = $x->copy()->bdiv(3,6,'odd'); # will give 0.666667
- Math::BigFloat::round_mode('zero');
+ Math::BigFloat->round_mode('zero');
$y = $x->copy()->bdiv(3,6); # will give 0.666666
=head2 Rounding
@@ -2132,7 +2476,7 @@ significant digits count from the first non-zero after the '.'
=item fround ( -$scale ) and fround ( 0 )
-These are effetively no-ops.
+These are effectively no-ops.
=back
@@ -2140,13 +2484,13 @@ All rounding functions take as a second parameter a rounding mode from one of
the following: 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'.
The default rounding mode is 'even'. By using
-C<< Math::BigFloat::round_mode($round_mode); >> you can get and set the default
+C<< Math::BigFloat->round_mode($round_mode); >> you can get and set the default
mode for subsequent rounding. The usage of C<$Math::BigFloat::$round_mode> is
no longer supported.
The second parameter to the round functions then overrides the default
temporarily.
-The C<< as_number() >> function returns a BigInt from a Math::BigFloat. It uses
+The C<as_number()> function returns a BigInt from a Math::BigFloat. It uses
'trunc' as rounding mode to make it equivalent to:
$x = 2.5;
@@ -2214,7 +2558,15 @@ you can roll it all into one line:
use Math::BigFloat lib => 'GMP';
-Use the lib, Luke! And see L<Using Math::BigInt::Lite> for more details.
+It is also possible to just require Math::BigFloat:
+
+ require Math::BigFloat;
+
+This will load the neccessary things (like BigInt) when they are needed, and
+automatically.
+
+Use the lib, Luke! And see L<Using Math::BigInt::Lite> for more details than
+you ever wanted to know about loading a different library.
=head2 Using Math::BigInt::Lite
@@ -2236,7 +2588,9 @@ Of course, you can combine this with the C<lib> parameter.
# 3
use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
-If you want to use Math::BigInt's, too, simple add a Math::BigInt B<before>:
+There is no need for a "use Math::BigInt;" statement, even if you want to
+use Math::BigInt's, since Math::BigFloat will needs Math::BigInt and thus
+always loads it. But if you add it, add it B<before>:
# 4
use Math::BigInt;
@@ -2251,41 +2605,68 @@ it's lib will be used if the lib is available:
That would try to load Foo, Bar, Baz and Calc (in that order). Or in other
words, Math::BigFloat will try to retain previously loaded libs when you
-don't specify it one.
+don't specify it onem but if you specify one, it will try to load them.
Actually, the lib loading order would be "Bar,Baz,Calc", and then
"Foo,Bar,Baz,Calc", but independend of which lib exists, the result is the
-same as trying the latter load alone, except for the fact that Bar or Baz
-might be loaded needlessly in an intermidiate step
+same as trying the latter load alone, except for the fact that one of Bar or
+Baz might be loaded needlessly in an intermidiate step (and thus hang around
+and waste memory). If neither Bar nor Baz exist (or don't work/compile), they
+will still be tried to be loaded, but this is not as time/memory consuming as
+actually loading one of them. Still, this type of usage is not recommended due
+to these issues.
-The old way still works though:
+The old way (loading the lib only in BigInt) still works though:
# 6
use Math::BigInt lib => 'Bar,Baz';
use Math::BigFloat;
-But B<examples #3 and #4 are recommended> for usage.
+You can even load Math::BigInt afterwards:
-=head1 BUGS
+ # 7
+ use Math::BigFloat;
+ use Math::BigInt lib => 'Bar,Baz';
-=over 2
+But this has the same problems like #5, it will first load Calc
+(Math::BigFloat needs Math::BigInt and thus loads it) and then later Bar or
+Baz, depending on which of them works and is usable/loadable. Since this
+loads Calc unnecc., it is not recommended.
-=item *
+Since it also possible to just require Math::BigFloat, this poses the question
+about what libary this will use:
-The following does not work yet:
+ require Math::BigFloat;
+ my $x = Math::BigFloat->new(123); $x += 123;
- $m = $x->mantissa();
- $e = $x->exponent();
- $y = $m * ( 10 ** $e );
- print "ok\n" if $x == $y;
+It will use Calc. Please note that the call to import() is still done, but
+only when you use for the first time some Math::BigFloat math (it is triggered
+via any constructor, so the first time you create a Math::BigFloat, the load
+will happen in the background). This means:
-=item *
+ require Math::BigFloat;
+ Math::BigFloat->import ( lib => 'Foo,Bar' );
-There is no fmod() function yet.
+would be the same as:
-=back
+ use Math::BigFloat lib => 'Foo, Bar';
+
+But don't try to be clever to insert some operations in between:
+
+ require Math::BigFloat;
+ my $x = Math::BigFloat->bone() + 4; # load BigInt and Calc
+ Math::BigFloat->import( lib => 'Pari' ); # load Pari, too
+ $x = Math::BigFloat->bone()+4; # now use Pari
+
+While this works, it loads Calc needlessly. But maybe you just wanted that?
+
+B<Examples #3 is highly recommended> for daily usage.
-=head1 CAVEAT
+=head1 BUGS
+
+Please see the file BUGS in the CPAN distribution Math::BigInt for known bugs.
+
+=head1 CAVEATS
=over 1
@@ -2318,16 +2699,8 @@ Beware of:
It will not do what you think, e.g. making a copy of $x. Instead it just makes
a second reference to the B<same> object and stores it in $y. Thus anything
-that modifies $x will modify $y, and vice versa.
-
- $x->bmul(2);
- print "$x, $y\n"; # prints '10, 10'
-
-If you want a true copy of $x, use:
-
- $y = $x->copy();
-
-See also the documentation in L<overload> regarding C<=>.
+that modifies $x will modify $y (except overloaded math operators), and vice
+versa. See L<Math::BigInt> for details and how to avoid that.
=item bpow
@@ -2341,6 +2714,19 @@ C<badd()> etc. The first will modify $x, the second one won't:
=back
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well as
+L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
+
+The pragmas L<bignum>, L<bigint> and L<bigrat> might also be of interest
+because they solve the autoupgrading/downgrading issue, at least partly.
+
+The package at
+L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
+more documentation including a full version history, testcases, empty
+subclass files and benchmarks.
+
=head1 LICENSE
This program is free software; you may redistribute it and/or modify it under
@@ -2349,6 +2735,7 @@ the same terms as Perl itself.
=head1 AUTHORS
Mark Biggar, overloaded interface by Ilya Zakharevich.
-Completely rewritten by Tels http://bloodgate.com in 2001.
+Completely rewritten by Tels http://bloodgate.com in 2001, 2002, and still
+at it in 2003.
=cut
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/Calc.pm b/gnu/usr.bin/perl/lib/Math/BigInt/Calc.pm
index eb20e69b9f9..694bdd57b4c 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/Calc.pm
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/Calc.pm
@@ -8,7 +8,7 @@ require Exporter;
use vars qw/@ISA $VERSION/;
@ISA = qw(Exporter);
-$VERSION = '0.30';
+$VERSION = '0.36';
# Package to store unsigned big integers in decimal and do math with them
@@ -25,6 +25,12 @@ $VERSION = '0.30';
# The BEGIN block is used to determine which of the two variants gives the
# correct result.
+# Beware of things like:
+# $i = $i * $y + $car; $car = int($i / $MBASE); $i = $i % $MBASE;
+# This works on x86, but fails on ARM (SA1100, iPAQ) due to whoknows what
+# reasons. So, use this instead (slower, but correct):
+# $i = $i * $y + $car; $car = int($i / $MBASE); $i -= $MBASE * $car;
+
##############################################################################
# global constants, flags and accessory
@@ -33,7 +39,6 @@ my $nan = 'NaN';
my ($MBASE,$BASE,$RBASE,$BASE_LEN,$MAX_VAL,$BASE_LEN2,$BASE_LEN_SMALL);
my ($AND_BITS,$XOR_BITS,$OR_BITS);
my ($AND_MASK,$XOR_MASK,$OR_MASK);
-my ($LEN_CONVERT);
sub _base_len
{
@@ -66,23 +71,27 @@ sub _base_len
$MBASE = int("1e".$BASE_LEN_SMALL);
$RBASE = abs('1e-'.$BASE_LEN_SMALL); # see USE_MUL
$MAX_VAL = $MBASE-1;
- $LEN_CONVERT = 0;
- $LEN_CONVERT = 1 if $BASE_LEN_SMALL != $BASE_LEN;
-
+
#print "BASE_LEN: $BASE_LEN MAX_VAL: $MAX_VAL BASE: $BASE RBASE: $RBASE ";
#print "BASE_LEN_SMALL: $BASE_LEN_SMALL MBASE: $MBASE\n";
undef &_mul;
undef &_div;
- if ($caught & 1 != 0)
+ # $caught & 1 != 0 => cannot use MUL
+ # $caught & 2 != 0 => cannot use DIV
+ # The parens around ($caught & 1) were important, indeed, if we would use
+ # & here.
+ if ($caught == 2) # 2
{
- # must USE_MUL
+ # print "# use mul\n";
+ # must USE_MUL since we cannot use DIV
*{_mul} = \&_mul_use_mul;
*{_div} = \&_div_use_mul;
}
- else # $caught must be 2, since it can't be 1 nor 3
+ else # 0 or 1
{
+ # print "# use div\n";
# can USE_DIV instead
*{_mul} = \&_mul_use_div;
*{_div} = \&_div_use_div;
@@ -116,30 +125,35 @@ BEGIN
# determine how many digits fit into an integer and can be safely added
# together plus carry w/o causing an overflow
- # this below detects 15 on a 64 bit system, because after that it becomes
- # 1e16 and not 1000000 :/ I can make it detect 18, but then I get a lot of
- # test failures. Ugh! (Tomake detect 18: uncomment lines marked with *)
use integer;
- my $bi = 5; # approx. 16 bit
- $num = int('9' x $bi);
- # $num = 99999; # *
- # while ( ($num+$num+1) eq '1' . '9' x $bi) # *
- while ( int($num+$num+1) eq '1' . '9' x $bi)
- {
- $bi++; $num = int('9' x $bi);
- # $bi++; $num *= 10; $num += 9; # *
- }
- $bi--; # back off one step
+
+ ############################################################################
+ # the next block is no longer important
+
+ ## this below detects 15 on a 64 bit system, because after that it becomes
+ ## 1e16 and not 1000000 :/ I can make it detect 18, but then I get a lot of
+ ## test failures. Ugh! (Tomake detect 18: uncomment lines marked with *)
+
+ #my $bi = 5; # approx. 16 bit
+ #$num = int('9' x $bi);
+ ## $num = 99999; # *
+ ## while ( ($num+$num+1) eq '1' . '9' x $bi) # *
+ #while ( int($num+$num+1) eq '1' . '9' x $bi)
+ # {
+ # $bi++; $num = int('9' x $bi);
+ # # $bi++; $num *= 10; $num += 9; # *
+ # }
+ #$bi--; # back off one step
# by setting them equal, we ignore the findings and use the default
# one-size-fits-all approach from former versions
- $bi = $e; # XXX, this should work always
+ my $bi = $e; # XXX, this should work always
__PACKAGE__->_base_len($e,$bi); # set and store
# find out how many bits _and, _or and _xor can take (old default = 16)
# I don't think anybody has yet 128 bit scalars, so let's play safe.
local $^W = 0; # don't warn about 'nonportable number'
- $AND_BITS = 15; $XOR_BITS = 15; $OR_BITS = 15;
+ $AND_BITS = 15; $XOR_BITS = 15; $OR_BITS = 15;
# find max bits, we will not go higher than numberofbits that fit into $BASE
# to make _and etc simpler (and faster for smaller, slower for large numbers)
@@ -171,73 +185,6 @@ BEGIN
}
-##############################################################################
-# convert between the "small" and the "large" representation
-
-sub _to_large
- {
- # take an array in base $BASE_LEN_SMALL and convert it in-place to $BASE_LEN
- my ($c,$x) = @_;
-
-# print "_to_large $BASE_LEN_SMALL => $BASE_LEN\n";
-
- return $x if $LEN_CONVERT == 0 || # nothing to converconvertor
- @$x == 1; # only one element => early out
-
- # 12345 67890 12345 67890 contents
- # to 3 2 1 0 index
- # 123456 7890123 4567890 contents
-
-# # faster variant
-# my @d; my $str = '';
-# my $z = '0' x $BASE_LEN_SMALL;
-# foreach (@$x)
-# {
-# # ... . 04321 . 000321
-# $str = substr($z.$_,-$BASE_LEN_SMALL,$BASE_LEN_SMALL) . $str;
-# if (length($str) > $BASE_LEN)
-# {
-# push @d, substr($str,-$BASE_LEN,$BASE_LEN); # extract one piece
-# substr($str,-$BASE_LEN,$BASE_LEN) = ''; # remove it
-# }
-# }
-# push @d, $str if $str !~ /^0*$/; # extract last piece
-# @$x = @d;
-# $x->[-1] = int($x->[-1]); # strip leading zero
-# $x;
-
- my $ret = "";
- my $l = scalar @$x; # number of parts
- $l --; $ret .= int($x->[$l]); $l--;
- my $z = '0' x ($BASE_LEN_SMALL-1);
- while ($l >= 0)
- {
- $ret .= substr($z.$x->[$l],-$BASE_LEN_SMALL);
- $l--;
- }
- my $str = _new($c,\$ret); # make array
- @$x = @$str; # clobber contents of $x
- $x->[-1] = int($x->[-1]); # strip leading zero
- }
-
-sub _to_small
- {
- # take an array in base $BASE_LEN and convert it in-place to $BASE_LEN_SMALL
- my ($c,$x) = @_;
-
- return $x if $LEN_CONVERT == 0; # nothing to do
- return $x if @$x == 1 && length(int($x->[0])) <= $BASE_LEN_SMALL;
-
- my $d = _str($c,$x);
- my $il = length($$d)-1;
- ## this leaves '00000' instead of int 0 and will be corrected after any op
- # clobber contents of $x
- @$x = reverse(unpack("a" . ($il % $BASE_LEN_SMALL+1)
- . ("a$BASE_LEN_SMALL" x ($il / $BASE_LEN_SMALL)), $$d));
-
- $x->[-1] = int($x->[-1]); # strip leading zero
- }
-
###############################################################################
sub _new
@@ -368,7 +315,7 @@ sub _inc
{
# (ref to int_num_array, ref to int_num_array)
# routine to add 1 to a base 1eX numbers
- # This routine clobbers up array x, but not y.
+ # This routine modifies array x
my ($c,$x) = @_;
for my $i (@$x)
@@ -384,7 +331,7 @@ sub _dec
{
# (ref to int_num_array, ref to int_num_array)
# routine to add 1 to a base 1eX numbers
- # This routine clobbers up array x, but not y.
+ # This routine modifies array x
my ($c,$x) = @_;
my $MAX = $BASE-1; # since MAX_VAL based on MBASE
@@ -430,43 +377,6 @@ sub _sub
__strip_zeros($sy);
}
-sub _square_use_mul
- {
- # compute $x ** 2 or $x * $x in-place and return $x
- my ($c,$x) = @_;
-
- # From: Handbook of Applied Cryptography by A. Menezes, P. van Oorschot and
- # S. Vanstone., Chapter 14
-
- #14.16 Algorithm Multiple-precision squaring
- #INPUT: positive integer x = (xt 1 xt 2 ... x1 x0)b.
- #OUTPUT: x * x = x ** 2 in radix b representation.
- #1. For i from 0 to (2t - 1) do: wi <- 0.
- #2. For i from 0 to (t - 1) do the following:
- # 2.1 (uv)b w2i + xi * xi, w2i v, c u.
- # 2.2 For j from (i + 1)to (t - 1) do the following:
- # (uv)b <- wi+j + 2*xj * xi + c, wi+j <- v, c <- u.
- # 2.3 wi+t <- u.
- #3. Return((w2t-1 w2t-2 ... w1 w0)b).
-
-# # Note: That description is crap. Half of the symbols are not explained or
-# # used with out beeing set.
-# my $t = scalar @$x; # count
-# my ($c,$i,$j);
-# for ($i = 0; $i < $t; $i++)
-# {
-# $x->[$i] = $x->[$i*2] + $x[$i]*$x[$i];
-# $x->[$i*2] = $x[$i]; $c = $x[$i];
-# for ($j = $i+1; $j < $t; $j++)
-# {
-# $x->[$i] = $x->[$i+$j] + 2 * $x->[$i] * $x->[$j];
-# $x->[$i+$j] = $x[$j]; $c = $x[$i];
-# }
-# $x->[$i+$t] = $x[$i];
-# }
- $x;
- }
-
sub _mul_use_mul
{
# (ref to int_num_array, ref to int_num_array)
@@ -474,35 +384,38 @@ sub _mul_use_mul
# modifies first arg, second need not be different from first
my ($c,$xv,$yv) = @_;
- # shortcut for two very short numbers (improved by Nathan Zook)
- # works also if xv and yv are the same reference
- if ((@$xv == 1) && (@$yv == 1))
- {
- if (($xv->[0] *= $yv->[0]) >= $MBASE)
- {
- $xv->[0] = $xv->[0] - ($xv->[1] = int($xv->[0] * $RBASE)) * $MBASE;
- };
- return $xv;
- }
- # shortcut for result == 0
- if ( ((@$xv == 1) && ($xv->[0] == 0)) ||
- ((@$yv == 1) && ($yv->[0] == 0)) )
+ if (@$yv == 1)
{
- @$xv = (0);
+ # shortcut for two very short numbers (improved by Nathan Zook)
+ # works also if xv and yv are the same reference, and handles also $x == 0
+ if (@$xv == 1)
+ {
+ if (($xv->[0] *= $yv->[0]) >= $MBASE)
+ {
+ $xv->[0] = $xv->[0] - ($xv->[1] = int($xv->[0] * $RBASE)) * $MBASE;
+ };
+ return $xv;
+ }
+ # $x * 0 => 0
+ if ($yv->[0] == 0)
+ {
+ @$xv = (0);
+ return $xv;
+ }
+ # multiply a large number a by a single element one, so speed up
+ my $y = $yv->[0]; my $car = 0;
+ foreach my $i (@$xv)
+ {
+ $i = $i * $y + $car; $car = int($i * $RBASE); $i -= $car * $MBASE;
+ }
+ push @$xv, $car if $car != 0;
return $xv;
}
+ # shortcut for result $x == 0 => result = 0
+ return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) );
# since multiplying $x with $x fails, make copy in this case
$yv = [@$xv] if $xv == $yv; # same references?
-# $yv = [@$xv] if "$xv" eq "$yv"; # same references?
-
- # since multiplying $x with $x would fail here, use the faster squaring
-# return _square($c,$xv) if $xv == $yv; # same reference?
-
- if ($LEN_CONVERT != 0)
- {
- $c->_to_small($xv); $c->_to_small($yv);
- }
my @prod = (); my ($prod,$car,$cty,$xi,$yi);
@@ -535,15 +448,7 @@ sub _mul_use_mul
$xi = shift @prod || 0; # || 0 makes v5.005_3 happy
}
push @$xv, @prod;
- if ($LEN_CONVERT != 0)
- {
- $c->_to_large($yv);
- $c->_to_large($xv);
- }
- else
- {
- __strip_zeros($xv);
- }
+ __strip_zeros($xv);
$xv;
}
@@ -554,37 +459,41 @@ sub _mul_use_div
# modifies first arg, second need not be different from first
my ($c,$xv,$yv) = @_;
- # shortcut for two very short numbers (improved by Nathan Zook)
- # works also if xv and yv are the same reference
- if ((@$xv == 1) && (@$yv == 1))
- {
- if (($xv->[0] *= $yv->[0]) >= $MBASE)
- {
- $xv->[0] =
- $xv->[0] - ($xv->[1] = int($xv->[0] / $MBASE)) * $MBASE;
- };
- return $xv;
- }
- # shortcut for result == 0
- if ( ((@$xv == 1) && ($xv->[0] == 0)) ||
- ((@$yv == 1) && ($yv->[0] == 0)) )
+ if (@$yv == 1)
{
- @$xv = (0);
+ # shortcut for two small numbers, also handles $x == 0
+ if (@$xv == 1)
+ {
+ # shortcut for two very short numbers (improved by Nathan Zook)
+ # works also if xv and yv are the same reference, and handles also $x == 0
+ if (($xv->[0] *= $yv->[0]) >= $MBASE)
+ {
+ $xv->[0] =
+ $xv->[0] - ($xv->[1] = int($xv->[0] / $MBASE)) * $MBASE;
+ };
+ return $xv;
+ }
+ # $x * 0 => 0
+ if ($yv->[0] == 0)
+ {
+ @$xv = (0);
+ return $xv;
+ }
+ # multiply a large number a by a single element one, so speed up
+ my $y = $yv->[0]; my $car = 0;
+ foreach my $i (@$xv)
+ {
+ $i = $i * $y + $car; $car = int($i / $MBASE); $i -= $car * $MBASE;
+ }
+ push @$xv, $car if $car != 0;
return $xv;
}
+ # shortcut for result $x == 0 => result = 0
+ return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) );
-
# since multiplying $x with $x fails, make copy in this case
$yv = [@$xv] if $xv == $yv; # same references?
-# $yv = [@$xv] if "$xv" eq "$yv"; # same references?
- # since multiplying $x with $x would fail here, use the faster squaring
-# return _square($c,$xv) if $xv == $yv; # same reference?
- if ($LEN_CONVERT != 0)
- {
- $c->_to_small($xv); $c->_to_small($yv);
- }
-
my @prod = (); my ($prod,$car,$cty,$xi,$yi);
for $xi (@$xv)
{
@@ -601,15 +510,7 @@ sub _mul_use_div
$xi = shift @prod || 0; # || 0 makes v5.005_3 happy
}
push @$xv, @prod;
- if ($LEN_CONVERT != 0)
- {
- $c->_to_large($yv);
- $c->_to_large($xv);
- }
- else
- {
- __strip_zeros($xv);
- }
+ __strip_zeros($xv);
$xv;
}
@@ -617,8 +518,18 @@ sub _div_use_mul
{
# ref to array, ref to array, modify first array and return remainder if
# in list context
+
+ # see comments in _div_use_div() for more explanations
+
my ($c,$x,$yorg) = @_;
+
+ # the general div algorithmn here is about O(N*N) and thus quite slow, so
+ # we first check for some special cases and use shortcuts to handle them.
+ # This works, because we store the numbers in a chunked format where each
+ # element contains 5..7 digits (depending on system).
+
+ # if both numbers have only one element:
if (@$x == 1 && @$yorg == 1)
{
# shortcut, $yorg and $x are two small numbers
@@ -634,6 +545,8 @@ sub _div_use_mul
return $x;
}
}
+
+ # if x has more than one, but y has only one element:
if (@$yorg == 1)
{
my $rem;
@@ -653,12 +566,71 @@ sub _div_use_mul
return $x;
}
- my $y = [ @$yorg ]; # always make copy to preserve
- if ($LEN_CONVERT != 0)
+ # now x and y have more than one element
+
+ # check whether y has more elements than x, if yet, the result will be 0
+ if (@$yorg > @$x)
{
- $c->_to_small($x); $c->_to_small($y);
+ my $rem;
+ $rem = [@$x] if wantarray; # make copy
+ splice (@$x,1); # keep ref to original array
+ $x->[0] = 0; # set to 0
+ return ($x,$rem) if wantarray; # including remainder?
+ return $x; # only x, which is [0] now
+ }
+ # check whether the numbers have the same number of elements, in that case
+ # the result will fit into one element and can be computed efficiently
+ if (@$yorg == @$x)
+ {
+ my $rem;
+ # if $yorg has more digits than $x (it's leading element is longer than
+ # the one from $x), the result will also be 0:
+ if (length(int($yorg->[-1])) > length(int($x->[-1])))
+ {
+ $rem = [@$x] if wantarray; # make copy
+ splice (@$x,1); # keep ref to org array
+ $x->[0] = 0; # set to 0
+ return ($x,$rem) if wantarray; # including remainder?
+ return $x;
+ }
+ # now calculate $x / $yorg
+ if (length(int($yorg->[-1])) == length(int($x->[-1])))
+ {
+ # same length, so make full compare, and if equal, return 1
+ # hm, same lengths, but same contents? So we need to check all parts:
+ my $a = 0; my $j = scalar @$x - 1;
+ # manual way (abort if unequal, good for early ne)
+ while ($j >= 0)
+ {
+ last if ($a = $x->[$j] - $yorg->[$j]); $j--;
+ }
+ # $a contains the result of the compare between X and Y
+ # a < 0: x < y, a == 0 => x == y, a > 0: x > y
+ if ($a <= 0)
+ {
+ if (wantarray)
+ {
+ $rem = [ 0 ]; # a = 0 => x == y => rem 1
+ $rem = [@$x] if $a != 0; # a < 0 => x < y => rem = x
+ }
+ splice(@$x,1); # keep single element
+ $x->[0] = 0; # if $a < 0
+ if ($a == 0)
+ {
+ # $x == $y
+ $x->[0] = 1;
+ }
+ return ($x,$rem) if wantarray;
+ return $x;
+ }
+ # $x >= $y, proceed normally
+ }
}
+ # all other cases:
+
+ my $y = [ @$yorg ]; # always make copy to preserve
+
my ($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0);
$car = $bar = $prd = 0;
@@ -688,7 +660,7 @@ sub _div_use_mul
$u2 = 0 unless $u2;
#warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
# if $v1 == 0;
- $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
+ $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
--$q while ($v2*$q > ($u0*$MBASE+$u1-$q*$v1)*$MBASE+$u2);
if ($q)
{
@@ -705,11 +677,12 @@ sub _div_use_mul
for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi)
{
$x->[$xi] -= $MBASE
- if ($car = (($x->[$xi] += $y->[$yi] + $car) > $MBASE));
+ if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $MBASE));
}
}
}
- pop(@$x); unshift(@q, $q);
+ pop(@$x);
+ unshift(@q, $q);
}
if (wantarray)
{
@@ -730,26 +703,12 @@ sub _div_use_mul
}
@$x = @q;
my $d = \@d;
- if ($LEN_CONVERT != 0)
- {
- $c->_to_large($x); $c->_to_large($d);
- }
- else
- {
- __strip_zeros($x);
- __strip_zeros($d);
- }
+ __strip_zeros($x);
+ __strip_zeros($d);
return ($x,$d);
}
@$x = @q;
- if ($LEN_CONVERT != 0)
- {
- $c->_to_large($x);
- }
- else
- {
- __strip_zeros($x);
- }
+ __strip_zeros($x);
$x;
}
@@ -759,6 +718,13 @@ sub _div_use_div
# in list context
my ($c,$x,$yorg) = @_;
+ # the general div algorithmn here is about O(N*N) and thus quite slow, so
+ # we first check for some special cases and use shortcuts to handle them.
+
+ # This works, because we store the numbers in a chunked format where each
+ # element contains 5..7 digits (depending on system).
+
+ # if both numbers have only one element:
if (@$x == 1 && @$yorg == 1)
{
# shortcut, $yorg and $x are two small numbers
@@ -774,6 +740,7 @@ sub _div_use_div
return $x;
}
}
+ # if x has more than one, but y has only one element:
if (@$yorg == 1)
{
my $rem;
@@ -792,12 +759,70 @@ sub _div_use_div
return ($x,$rem) if wantarray;
return $x;
}
+ # now x and y have more than one element
- my $y = [ @$yorg ]; # always make copy to preserve
- if ($LEN_CONVERT != 0)
+ # check whether y has more elements than x, if yet, the result will be 0
+ if (@$yorg > @$x)
{
- $c->_to_small($x); $c->_to_small($y);
+ my $rem;
+ $rem = [@$x] if wantarray; # make copy
+ splice (@$x,1); # keep ref to original array
+ $x->[0] = 0; # set to 0
+ return ($x,$rem) if wantarray; # including remainder?
+ return $x; # only x, which is [0] now
}
+ # check whether the numbers have the same number of elements, in that case
+ # the result will fit into one element and can be computed efficiently
+ if (@$yorg == @$x)
+ {
+ my $rem;
+ # if $yorg has more digits than $x (it's leading element is longer than
+ # the one from $x), the result will also be 0:
+ if (length(int($yorg->[-1])) > length(int($x->[-1])))
+ {
+ $rem = [@$x] if wantarray; # make copy
+ splice (@$x,1); # keep ref to org array
+ $x->[0] = 0; # set to 0
+ return ($x,$rem) if wantarray; # including remainder?
+ return $x;
+ }
+ # now calculate $x / $yorg
+ if (length(int($yorg->[-1])) == length(int($x->[-1])))
+ {
+ # same length, so make full compare, and if equal, return 1
+ # hm, same lengths, but same contents? So we need to check all parts:
+ my $a = 0; my $j = scalar @$x - 1;
+ # manual way (abort if unequal, good for early ne)
+ while ($j >= 0)
+ {
+ last if ($a = $x->[$j] - $yorg->[$j]); $j--;
+ }
+ # $a contains the result of the compare between X and Y
+ # a < 0: x < y, a == 0 => x == y, a > 0: x > y
+ if ($a <= 0)
+ {
+ if (wantarray)
+ {
+ $rem = [ 0 ]; # a = 0 => x == y => rem 1
+ $rem = [@$x] if $a != 0; # a < 0 => x < y => rem = x
+ }
+ splice(@$x,1); # keep single element
+ $x->[0] = 0; # if $a < 0
+ if ($a == 0)
+ {
+ # $x == $y
+ $x->[0] = 1;
+ }
+ return ($x,$rem) if wantarray;
+ return $x;
+ }
+ # $x >= $y, so proceed normally
+ }
+ }
+
+ # all other cases:
+
+ my $y = [ @$yorg ]; # always make copy to preserve
my ($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0);
@@ -820,6 +845,10 @@ sub _div_use_div
{
push(@$x, 0);
}
+
+ # @q will accumulate the final result, $q contains the current computed
+ # part of the final result
+
@q = (); ($v2,$v1) = @$y[-2,-1];
$v2 = 0 unless $v2;
while ($#$x > $#$y)
@@ -828,7 +857,7 @@ sub _div_use_div
$u2 = 0 unless $u2;
#warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
# if $v1 == 0;
- $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
+ $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
--$q while ($v2*$q > ($u0*$MBASE+$u1-$q*$v1)*$MBASE+$u2);
if ($q)
{
@@ -845,7 +874,7 @@ sub _div_use_div
for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi)
{
$x->[$xi] -= $MBASE
- if ($car = (($x->[$xi] += $y->[$yi] + $car) > $MBASE));
+ if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $MBASE));
}
}
}
@@ -870,26 +899,12 @@ sub _div_use_div
}
@$x = @q;
my $d = \@d;
- if ($LEN_CONVERT != 0)
- {
- $c->_to_large($x); $c->_to_large($d);
- }
- else
- {
- __strip_zeros($x);
- __strip_zeros($d);
- }
+ __strip_zeros($x);
+ __strip_zeros($d);
return ($x,$d);
}
@$x = @q;
- if ($LEN_CONVERT != 0)
- {
- $c->_to_large($x);
- }
- else
- {
- __strip_zeros($x);
- }
+ __strip_zeros($x);
$x;
}
@@ -908,48 +923,35 @@ sub _acmp
my $lxy = scalar @$cx - scalar @$cy;
return -1 if $lxy < 0; # already differs, ret
return 1 if $lxy > 0; # ditto
-
+
# now calculate length based on digits, not parts
- $lxy = _len($c,$cx) - _len($c,$cy); # difference
+ # we need only the length of the last element, since both array have the
+ # same number of parts
+ $lxy = length(int($cx->[-1])) - length(int($cy->[-1]));
return -1 if $lxy < 0;
return 1 if $lxy > 0;
- # hm, same lengths, but same contents?
- my $i = 0; my $a;
- # first way takes 5.49 sec instead of 4.87, but has the early out advantage
- # so grep is slightly faster, but more inflexible. hm. $_ instead of $k
- # yields 5.6 instead of 5.5 sec huh?
+ # hm, same lengths, but same contents? So we need to check all parts:
+ my $a; my $j = scalar @$cx - 1;
# manual way (abort if unequal, good for early ne)
- my $j = scalar @$cx - 1;
while ($j >= 0)
{
last if ($a = $cx->[$j] - $cy->[$j]); $j--;
}
-# my $j = scalar @$cx;
-# while (--$j >= 0)
-# {
-# last if ($a = $cx->[$j] - $cy->[$j]);
-# }
return 1 if $a > 0;
return -1 if $a < 0;
- 0; # equal
-
- # while it early aborts, it is even slower than the manual variant
- #grep { return $a if ($a = $_ - $cy->[$i++]); } @$cx;
- # grep way, go trough all (bad for early ne)
- #grep { $a = $_ - $cy->[$i++]; } @$cx;
- #return $a;
+ 0; # numbers are equal
}
sub _len
{
- # compute number of digits in bigint, minus the sign
+ # compute number of digits
# int() because add/sub sometimes leaves strings (like '00005') instead of
# '5' in this place, thus causing length() to report wrong length
my $cx = $_[1];
- return (@$cx-1)*$BASE_LEN+length(int($cx->[-1]));
+ (@$cx-1)*$BASE_LEN+length(int($cx->[-1]));
}
sub _digit
@@ -967,7 +969,7 @@ sub _digit
my $elem = int($n / $BASE_LEN); # which array element
my $digit = $n % $BASE_LEN; # which digit in this element
$elem = '0000'.@$x[$elem]; # get element padded with 0's
- return substr($elem,-$digit-1,1);
+ substr($elem,-$digit-1,1);
}
sub _zeros
@@ -1100,6 +1102,7 @@ sub _mod
my ($xo,$rem) = _div($c,$x,$yo);
return $rem;
}
+
my $y = $yo->[0];
# both are single element arrays
if (scalar @$x == 1)
@@ -1108,7 +1111,7 @@ sub _mod
return $x;
}
- # @y is single element, but @x has more than one
+ # @y is a single element, but @x has more than one element
my $b = $BASE % $y;
if ($b == 0)
{
@@ -1166,6 +1169,14 @@ sub _rsft
# multiples of $BASE_LEN
my $dst = 0; # destination
my $src = _num($c,$y); # as normal int
+ my $xlen = (@$x-1)*$BASE_LEN+length(int($x->[-1])); # len of x in digits
+ if ($src > $xlen or ($src == $xlen and ! defined $x->[1]))
+ {
+ # 12345 67890 shifted right by more than 10 digits => 0
+ splice (@$x,1); # leave only one element
+ $x->[0] = 0; # set to zero
+ return $x;
+ }
my $rem = $src % $BASE_LEN; # remainder to shift
$src = int($src / $BASE_LEN); # source
if ($rem == 0)
@@ -1273,32 +1284,62 @@ sub _fac
$cx = [$last];
return $cx;
}
- my $n = _copy($c,$cx);
- $cx = [$last];
+ # now we must do the left over steps
- #$cx = _one();
- while (!(@$n == 1 && $n->[0] == $step))
+ # do so as long as n has more than one element
+ my $n = $cx->[0];
+ # as soon as the last element of $cx is 0, we split it up and remember how
+ # many zeors we got so far. The reason is that n! will accumulate zeros at
+ # the end rather fast.
+ my $zero_elements = 0;
+ $cx = [$last];
+ if (scalar @$cx == 1)
+ {
+ my $n = _copy($c,$cx);
+ # no need to test for $steps, since $steps is a scalar and we stop before
+ while (scalar @$n != 1)
+ {
+ if ($cx->[0] == 0)
+ {
+ $zero_elements ++; shift @$cx;
+ }
+ _mul($c,$cx,$n); _dec($c,$n);
+ }
+ $n = $n->[0]; # "convert" to scalar
+ }
+
+ # the left over steps will fit into a scalar, so we can speed it up
+ while ($n != $step)
+ {
+ if ($cx->[0] == 0)
+ {
+ $zero_elements ++; shift @$cx;
+ }
+ _mul($c,$cx,[$n]); $n--;
+ }
+ # multiply in the zeros again
+ while ($zero_elements-- > 0)
{
- _mul($c,$cx,$n); _dec($c,$n);
+ unshift @$cx, 0;
}
$cx;
}
-use constant DEBUG => 0;
-
-my $steps = 0;
-
-sub steps { $steps };
+# for debugging:
+ use constant DEBUG => 0;
+ my $steps = 0;
+ sub steps { $steps };
sub _sqrt
{
- # square-root of $x
- # ref to array, return ref to array
+ # square-root of $x in place
+ # Compute a guess of the result (by rule of thumb), then improve it via
+ # Newton's method.
my ($c,$x) = @_;
if (scalar @$x == 1)
{
- # fit's into one Perl scalar
+ # fit's into one Perl scalar, so result can be computed directly
$x->[0] = int(sqrt($x->[0]));
return $x;
}
@@ -1307,17 +1348,17 @@ sub _sqrt
# since our guess will "grow"
my $l = int((_len($c,$x)-1) / 2);
- my $lastelem = $x->[-1]; # for guess
+ my $lastelem = $x->[-1]; # for guess
my $elems = scalar @$x - 1;
# not enough digits, but could have more?
- if ((length($lastelem) <= 3) && ($elems > 1))
+ if ((length($lastelem) <= 3) && ($elems > 1))
{
# right-align with zero pad
my $len = length($lastelem) & 1;
print "$lastelem => " if DEBUG;
$lastelem .= substr($x->[-2] . '0' x $BASE_LEN,0,$BASE_LEN);
# former odd => make odd again, or former even to even again
- $lastelem = $lastelem / 10 if (length($lastelem) & 1) != $len;
+ $lastelem = $lastelem / 10 if (length($lastelem) & 1) != $len;
print "$lastelem\n" if DEBUG;
}
@@ -1325,15 +1366,14 @@ sub _sqrt
my $r = $l % $BASE_LEN; # 10000 00000 00000 00000 ($BASE_LEN=5)
$l = int($l / $BASE_LEN);
print "l = $l " if DEBUG;
-
- splice @$x,$l; # keep ref($x), but modify it
-
+
+ splice @$x,$l; # keep ref($x), but modify it
+
# we make the first part of the guess not '1000...0' but int(sqrt($lastelem))
# that gives us:
- # 14400 00000 => sqrt(14400) => 120
- # 144000 000000 => sqrt(144000) => 379
+ # 14400 00000 => sqrt(14400) => guess first digits to be 120
+ # 144000 000000 => sqrt(144000) => guess 379
- # $x->[$l--] = int('1' . '0' x $r); # old way of guessing
print "$lastelem (elems $elems) => " if DEBUG;
$lastelem = $lastelem / 10 if ($elems & 1 == 1); # odd or even?
my $g = sqrt($lastelem); $g =~ s/\.//; # 2.345 => 2345
@@ -1343,11 +1383,11 @@ sub _sqrt
$x->[$l--] = int(substr($g . '0' x $r,0,$r+1));
print "now ",$x->[-1] if DEBUG;
print " would have been ", int('1' . '0' x $r),"\n" if DEBUG;
-
+
# If @$x > 1, we could compute the second elem of the guess, too, to create
- # an even better guess. Not implemented yet.
+ # an even better guess. Not implemented yet. Does it improve performance?
$x->[$l--] = 0 while ($l >= 0); # all other digits of guess are zero
-
+
print "start x= ",${_str($c,$x)},"\n" if DEBUG;
my $two = _two();
my $last = _zero();
@@ -1360,7 +1400,7 @@ sub _sqrt
$last = _copy($c,$x);
_add($c,$x, _div($c,_copy($c,$y),$x));
_div($c,$x, $two );
- print " x= ",${_str($c,$x)},"\n" if DEBUG;
+ print " x= ",${_str($c,$x)},"\n" if DEBUG;
}
print "\nsteps in sqrt: $steps, " if DEBUG;
_dec($c,$x) if _acmp($c,$y,_mul($c,_copy($c,$x),$x)) < 0; # overshot?
@@ -1368,6 +1408,59 @@ sub _sqrt
$x;
}
+sub _root
+ {
+ # take n'th root of $x in place (n >= 3)
+ my ($c,$x,$n) = @_;
+
+ if (scalar @$x == 1)
+ {
+ if (scalar @$n > 1)
+ {
+ # result will always be smaller than 2 so trunc to 1 at once
+ $x->[0] = 1;
+ }
+ else
+ {
+ # fit's into one Perl scalar, so result can be computed directly
+ $x->[0] = int( $x->[0] ** (1 / $n->[0]) );
+ }
+ return $x;
+ }
+
+ # X is more than one element
+ # if $n is a power of two, we can repeatedly take sqrt($X) and find the
+ # proper result, because sqrt(sqrt($x)) == root($x,4)
+ my $b = _as_bin($c,$n);
+ if ($$b =~ /0b1(0+)/)
+ {
+ my $count = CORE::length($1); # 0b100 => len('00') => 2
+ my $cnt = $count; # counter for loop
+ unshift (@$x, 0); # add one element, together with one
+ # more below in the loop this makes 2
+ while ($cnt-- > 0)
+ {
+ # 'inflate' $X by adding one element, basically computing
+ # $x * $BASE * $BASE. This gives us more $BASE_LEN digits for result
+ # since len(sqrt($X)) approx == len($x) / 2.
+ unshift (@$x, 0);
+ # calculate sqrt($x), $x is now one element to big, again. In the next
+ # round we make that two, again.
+ _sqrt($c,$x);
+ }
+ # $x is now one element to big, so truncate result by removing it
+ splice (@$x,0,1);
+ }
+ else
+ {
+ # Should compute a guess of the result (by rule of thumb), then improve it
+ # via Newton's method or something similiar.
+ # XXX TODO
+ warn ('_root() not fully implemented in Calc.');
+ }
+ $x;
+ }
+
##############################################################################
# binary stuff
@@ -1486,6 +1579,13 @@ sub _as_hex
# convert a decimal number to hex (ref to array, return ref to string)
my ($c,$x) = @_;
+ # fit's into one element
+ if (@$x == 1)
+ {
+ my $t = '0x' . sprintf("%x",$x->[0]);
+ return \$t;
+ }
+
my $x1 = _copy($c,$x);
my $es = '';
@@ -1514,6 +1614,12 @@ sub _as_bin
# convert a decimal number to bin (ref to array, return ref to string)
my ($c,$x) = @_;
+ # fit's into one element
+ if (@$x == 1)
+ {
+ my $t = '0b' . sprintf("%b",$x->[0]);
+ return \$t;
+ }
my $x1 = _copy($c,$x);
my $es = '';
@@ -1600,38 +1706,35 @@ sub _from_bin
##############################################################################
# special modulus functions
-# not ready yet, since it would need to deal with unsigned numbers
-sub _modinv1
+sub _modinv
{
- # inverse modulus
- my ($c,$num,$mod) = @_;
+ # modular inverse
+ my ($c,$x,$y) = @_;
- my $u = _zero(); my $u1 = _one();
- my $a = _copy($c,$mod); my $b = _copy($c,$num);
+ my $u = _zero($c); my $u1 = _one($c);
+ my $a = _copy($c,$y); my $b = _copy($c,$x);
# Euclid's Algorithm for bgcd(), only that we calc bgcd() ($a) and the
- # result ($u) at the same time
+ # result ($u) at the same time. See comments in BigInt for why this works.
+ my $q;
+ ($a, $q, $b) = ($b, _div($c,$a,$b)); # step 1
+ my $sign = 1;
while (!_is_zero($c,$b))
{
-# print ${_str($c,$a)}, " ", ${_str($c,$b)}, " ", ${_str($c,$u)}, " ",
-# ${_str($c,$u1)}, "\n";
- ($a, my $q, $b) = ($b, _div($c,$a,$b));
-# print ${_str($c,$a)}, " ", ${_str($c,$q)}, " ", ${_str($c,$b)}, "\n";
- # original: ($u,$u1) = ($u1, $u - $u1 * $q);
- my $t = _copy($c,$u);
- $u = _copy($c,$u1);
- _mul($c,$u1,$q);
- $u1 = _sub($t,$u1);
-# print ${_str($c,$a)}, " ", ${_str($c,$b)}, " ", ${_str($c,$u)}, " ",
-# ${_str($c,$u1)}, "\n";
+ my $t = _add($c, # step 2:
+ _mul($c,_copy($c,$u1), $q) , # t = u1 * q
+ $u ); # + u
+ $u = $u1; # u = u1, u1 = t
+ $u1 = $t;
+ $sign = -$sign;
+ ($a, $q, $b) = ($b, _div($c,$a,$b)); # step 1
}
# if the gcd is not 1, then return NaN
- return undef unless _is_one($c,$a);
-
- $num = _mod($c,$u,$mod);
-# print ${_str($c,$num)},"\n";
- $num;
+ return (undef,undef) unless _is_one($c,$a);
+
+ $sign = $sign == 1 ? '+' : '-';
+ ($u1,$sign);
}
sub _modpow
@@ -1685,7 +1788,7 @@ Math::BigInt::Calc - Pure Perl module to support Math::BigInt
Provides support for big integer calculations. Not intended to be used by other
modules (except Math::BigInt::Cached). Other modules which sport the same
-functions can also be used to support Math::Bigint, like Math::BigInt::Pari.
+functions can also be used to support Math::BigInt, like Math::BigInt::Pari.
=head1 DESCRIPTION
@@ -1698,7 +1801,9 @@ follows the same API as this can be used instead by using the following:
'libname' is either the long name ('Math::BigInt::Pari'), or only the short
version like 'Pari'.
-=head1 EXPORT
+=head1 STORAGE
+
+=head1 METHODS
The following functions MUST be defined in order to support the use by
Math::BigInt:
@@ -1719,6 +1824,8 @@ Math::BigInt:
In list context, returns (result,remainder).
NOTE: this is integer math, so no
fractional part will be returned.
+ The second operand will be not be 0, so no need to
+ check for that.
_sub(obj,obj) Simple subtraction of 1 object from another
a third, optional parameter indicates that the params
are swapped. In this case, the first param needs to
@@ -1768,7 +1875,8 @@ slow) fallback routines to emulate these:
_or(obj1,obj2) OR (bit-wise) object 1 with object 2
_mod(obj,obj) Return remainder of div of the 1st by the 2nd object
- _sqrt(obj) return the square root of object (truncate to int)
+ _sqrt(obj) return the square root of object (truncated to int)
+ _root(obj) return the n'th (n >= 3) root of obj (truncated to int)
_fac(obj) return factorial of object 1 (1*2*3*4..)
_pow(obj,obj) return object 1 to the power of object 2
_gcd(obj,obj) return Greatest Common Divisor of two objects
@@ -1780,20 +1888,23 @@ slow) fallback routines to emulate these:
Input strings come in as unsigned but with prefix (i.e. as '123', '0xabc'
or '0b1101').
-Testing of input parameter validity is done by the caller, so you need not
-worry about underflow (f.i. in C<_sub()>, C<_dec()>) nor about division by
-zero or similar cases.
+So the library needs only to deal with unsigned big integers. Testing of input
+parameter validity is done by the caller, so you need not worry about
+underflow (f.i. in C<_sub()>, C<_dec()>) nor about division by zero or similar
+cases.
The first parameter can be modified, that includes the possibility that you
return a reference to a completely different object instead. Although keeping
the reference and just changing it's contents is prefered over creating and
returning a different reference.
-Return values are always references to objects or strings. Exceptions are
-C<_lsft()> and C<_rsft()>, which return undef if they can not shift the
-argument. This is used to delegate shifting of bases different than the one
-you can support back to Math::BigInt, which will use some generic code to
-calculate the result.
+Return values are always references to objects, strings, or true/false for
+comparisation routines.
+
+Exceptions are C<_lsft()> and C<_rsft()>, which return undef if they can not
+shift the argument. This is used to delegate shifting of bases different than
+the one you can support back to Math::BigInt, which will use some generic code
+to calculate the result.
=head1 WRAP YOUR OWN
@@ -1818,12 +1929,13 @@ the same terms as Perl itself.
=head1 AUTHORS
Original math code by Mark Biggar, rewritten by Tels L<http://bloodgate.com/>
-in late 2000, 2001.
+in late 2000.
Seperated from BigInt and shaped API with the help of John Peacock.
+Fixed/enhanced by Tels 2001-2002.
=head1 SEE ALSO
L<Math::BigInt>, L<Math::BigFloat>, L<Math::BigInt::BitVect>,
-L<Math::BigInt::GMP>, L<Math::BigInt::Cached> and L<Math::BigInt::Pari>.
+L<Math::BigInt::GMP>, L<Math::BigInt::FastCalc> and L<Math::BigInt::Pari>.
=cut
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/Scalar.pm b/gnu/usr.bin/perl/lib/Math/BigInt/Scalar.pm
new file mode 100644
index 00000000000..44bab5d53f4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/Scalar.pm
@@ -0,0 +1,242 @@
+###############################################################################
+# core math lib for BigInt, representing big numbers by normal int/float's
+# for testing only, will fail any bignum test if range is exceeded
+
+package Math::BigInt::Scalar;
+
+use 5.005;
+use strict;
+# use warnings; # dont use warnings for older Perls
+
+require Exporter;
+
+use vars qw/@ISA $VERSION/;
+@ISA = qw(Exporter);
+
+$VERSION = '0.11';
+
+##############################################################################
+# global constants, flags and accessory
+
+# constants for easier life
+my $nan = 'NaN';
+
+##############################################################################
+# create objects from various representations
+
+sub _new
+ {
+ # (string) return ref to num
+ my $d = $_[1];
+ my $x = $$d; # make copy
+ return \$x;
+ }
+
+sub _zero
+ {
+ my $x = 0; return \$x;
+ }
+
+sub _one
+ {
+ my $x = 1; return \$x;
+ }
+
+sub _copy
+ {
+ my $x = $_[1];
+ my $z = $$x;
+ return \$z;
+ }
+
+# catch and throw away
+sub import { }
+
+##############################################################################
+# convert back to string and number
+
+sub _str
+ {
+ # make string
+ return \"${$_[1]}";
+ }
+
+sub _num
+ {
+ # make a number
+ return ${$_[1]};
+ }
+
+
+##############################################################################
+# actual math code
+
+sub _add
+ {
+ my ($c,$x,$y) = @_;
+ $$x += $$y;
+ return $x;
+ }
+
+sub _sub
+ {
+ my ($c,$x,$y) = @_;
+ $$x -= $$y;
+ return $x;
+ }
+
+sub _mul
+ {
+ my ($c,$x,$y) = @_;
+ $$x *= $$y;
+ return $x;
+ }
+
+sub _div
+ {
+ my ($c,$x,$y) = @_;
+
+ my $u = int($$x / $$y); my $r = $$x % $$y; $$x = $u;
+ return ($x,\$r) if wantarray;
+ return $x;
+ }
+
+sub _pow
+ {
+ my ($c,$x,$y) = @_;
+ my $u = $$x ** $$y; $$x = $u;
+ return $x;
+ }
+
+sub _and
+ {
+ my ($c,$x,$y) = @_;
+ my $u = int($$x) & int($$y); $$x = $u;
+ return $x;
+ }
+
+sub _xor
+ {
+ my ($c,$x,$y) = @_;
+ my $u = int($$x) ^ int($$y); $$x = $u;
+ return $x;
+ }
+
+sub _or
+ {
+ my ($c,$x,$y) = @_;
+ my $u = int($$x) | int($$y); $$x = $u;
+ return $x;
+ }
+
+sub _inc
+ {
+ my ($c,$x) = @_;
+ my $u = int($$x)+1; $$x = $u;
+ return $x;
+ }
+
+sub _dec
+ {
+ my ($c,$x) = @_;
+ my $u = int($$x)-1; $$x = $u;
+ return $x;
+ }
+
+##############################################################################
+# testing
+
+sub _acmp
+ {
+ my ($c,$x, $y) = @_;
+ return ($$x <=> $$y);
+ }
+
+sub _len
+ {
+ return length("${$_[1]}");
+ }
+
+sub _digit
+ {
+ # return the nth digit, negative values count backward
+ # 0 is the rightmost digit
+ my ($c,$x,$n) = @_;
+
+ $n ++; # 0 => 1, 1 => 2
+ return substr($$x,-$n,1); # 1 => -1, -2 => 2 etc
+ }
+
+##############################################################################
+# _is_* routines
+
+sub _is_zero
+ {
+ # return true if arg is zero
+ my ($c,$x) = @_;
+ return ($$x == 0) <=> 0;
+ }
+
+sub _is_even
+ {
+ # return true if arg is even
+ my ($c,$x) = @_;
+ return (!($$x & 1)) <=> 0;
+ }
+
+sub _is_odd
+ {
+ # return true if arg is odd
+ my ($c,$x) = @_;
+ return ($$x & 1) <=> 0;
+ }
+
+sub _is_one
+ {
+ # return true if arg is one
+ my ($c,$x) = @_;
+ return ($$x == 1) <=> 0;
+ }
+
+###############################################################################
+# check routine to test internal state of corruptions
+
+sub _check
+ {
+ # no checks yet, pull it out from the test suite
+ my ($c,$x) = @_;
+ return "$x is not a reference" if !ref($x);
+ return 0;
+ }
+
+1;
+__END__
+
+=head1 NAME
+
+Math::BigInt::Scalar - Pure Perl module to test Math::BigInt with scalars
+
+=head1 SYNOPSIS
+
+Provides support for big integer calculations via means of 'small' int/floats.
+Only for testing purposes, since it will fail at large values. But it is simple
+enough not to introduce bugs on it's own and to serve as a testbed.
+
+=head1 DESCRIPTION
+
+Please see Math::BigInt::Calc.
+
+=head1 LICENSE
+
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=head1 AUTHOR
+
+Tels http://bloodgate.com in 2001.
+
+=head1 SEE ALSO
+
+L<Math::BigInt>, L<Math::BigInt::Calc>.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbf.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbf.t
index fbf8f055b90..1c4a97add8b 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbf.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbf.t
@@ -27,7 +27,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 1627;
+ plan tests => 1768;
}
use Math::BigFloat lib => 'BareCalc';
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbi.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbi.t
index c725e5af556..ceebc0343ba 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbi.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mbi.t
@@ -26,7 +26,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 2552;
+ plan tests => 2684;
}
use Math::BigInt lib => 'BareCalc';
@@ -37,7 +37,7 @@ use vars qw ($class $try $x $y $f @args $ans $ans1 $ans1_str $setup $CL);
$class = "Math::BigInt";
$CL = "Math::BigInt::BareCalc";
-my $version = '1.60'; # for $VERSION tests, match current release (by hand!)
+my $version = '1.61'; # for $VERSION tests, match current release (by hand!)
require 'bigintpm.inc'; # perform same tests as bigintpm
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mif.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mif.t
index faaef9db336..00629fd9a5b 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mif.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bare_mif.t
@@ -28,8 +28,8 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 617
- + 1; # our onw tests
+ plan tests => 679
+ + 1; # our own tests
}
print "# ",Math::BigInt->config()->{lib},"\n";
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.inc b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.inc
index 67bd54e164d..712caa60ec1 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.inc
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.inc
@@ -2,6 +2,8 @@
ok ($class->config()->{lib},$CL);
+use strict;
+
while (<DATA>)
{
chomp;
@@ -28,7 +30,7 @@ while (<DATA>)
{
@args = split(/:/,$_,99); $ans = pop(@args);
}
- $try = "\$x = new $class \"$args[0]\";";
+ $try = "\$x = $class->new('$args[0]');";
if ($f eq "fnorm")
{
$try .= "\$x;";
@@ -51,18 +53,14 @@ while (<DATA>)
} elsif ($f eq "mantissa") {
# ->bstr() to see if an object is returned
$try .= '$x->mantissa()->bstr();';
- } elsif ($f eq "numify") {
- $try .= "\$x->numify();";
- } elsif ($f eq "length") {
- $try .= "\$x->length();";
+ } elsif ($f =~ /^(numify|length|as_number|as_hex|as_bin)$/) {
+ $try .= "\$x->$f();";
# some unary ops (test the fxxx form, since that is done by AUTOLOAD)
} elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
$try .= "\$x->f$1();";
# some is_xxx test function
} elsif ($f =~ /^is_(zero|one|negative|positive|odd|even|nan|int)$/) {
$try .= "\$x->$f();";
- } elsif ($f eq "as_number") {
- $try .= '$x->as_number();';
} elsif ($f eq "finc") {
$try .= '++$x;';
} elsif ($f eq "fdec") {
@@ -73,20 +71,30 @@ while (<DATA>)
$try .= "$setup; \$x->ffround($args[1]);";
} elsif ($f eq "fsqrt") {
$try .= "$setup; \$x->fsqrt();";
- } elsif ($f eq "flog") {
- $try .= "$setup; \$x->flog();";
} elsif ($f eq "ffac") {
$try .= "$setup; \$x->ffac();";
+ } elsif ($f eq "flog") {
+ if ($args[1] ne '')
+ {
+ $try .= "\$y = $class->new($args[1]);";
+ $try .= "$setup; \$x->flog(\$y);";
+ }
+ else
+ {
+ $try .= "$setup; \$x->flog();";
+ }
}
else
{
- $try .= "\$y = new $class \"$args[1]\";";
+ $try .= "\$y = $class->new(\"$args[1]\");";
if ($f eq "fcmp") {
$try .= '$x <=> $y;';
} elsif ($f eq "facmp") {
$try .= '$x->facmp($y);';
} elsif ($f eq "fpow") {
$try .= '$x ** $y;';
+ } elsif ($f eq "froot") {
+ $try .= "$setup; \$x->froot(\$y);";
} elsif ($f eq "fadd") {
$try .= '$x + $y;';
} elsif ($f eq "fsub") {
@@ -158,8 +166,8 @@ ok ($y,1200); ok ($x,1200);
my $monster = '1e1234567890123456789012345678901234567890';
# new
-ok ($class->new($monster)->bsstr(),
- '1e+1234567890123456789012345678901234567890');
+ok ($class->new($monster)->bsstr(),
+ '1e+1234567890123456789012345678901234567890');
# cmp
ok ($class->new($monster) > 0,1);
@@ -189,11 +197,19 @@ ok ($class->finf('+'),'inf');
ok ($class->finf('-'),'-inf');
ok ($class->finf('-inf'),'-inf');
+$class->accuracy(undef); $class->precision(undef); # reset
+
+###############################################################################
+# bug in bsstr()/numify() showed up in after-rounding in bdiv()
+
+$x = $class->new('0.008'); $y = $class->new(2);
+$x->bdiv(3,$y);
+ok ($x,'0.0027');
+
###############################################################################
# fsqrt() with set global A/P or A/P enabled on $x, also a test whether fsqrt()
# correctly modifies $x
-$class->accuracy(undef); $class->precision(undef); # reset
$x = $class->new(12); $class->precision(-2); $x->fsqrt(); ok ($x,'3.46');
@@ -202,55 +218,32 @@ $x = $class->new(12); $class->precision(0); $x->fsqrt(); ok ($x,'3');
$class->precision(-3); $x = $class->new(12); $x->fsqrt(); ok ($x,'3.464');
-# A and P set => NaN
-${${class}.'::accuracy'} = 4; $x = $class->new(12); $x->fsqrt(3); ok ($x,'NaN');
-# supplied arg overrides set global
-$class->precision(undef); $x = $class->new(12); $x->fsqrt(3); ok ($x,'3.46');
-
-$class->accuracy(undef); $class->precision(undef); # reset for further tests
+{
+ no strict 'refs';
+ # A and P set => NaN
+ ${${class}.'::accuracy'} = 4; $x = $class->new(12);
+ $x->fsqrt(3); ok ($x,'NaN');
+ # supplied arg overrides set global
+ $class->precision(undef); $x = $class->new(12); $x->fsqrt(3); ok ($x,'3.46');
+ $class->accuracy(undef); $class->precision(undef); # reset for further tests
+}
-###############################################################################
+#############################################################################
# can we call objectify (broken until v1.52)
-$try = '@args' . " = $class" . "::objectify(2,$class,4,5);".'join(" ",@args);';
-$ans = eval $try;
-ok ($ans,"$class 4 5");
-
-###############################################################################
-# test whether an opp calls objectify properly or not (or at least does what
-# it should do given non-objects, w/ or w/o objectify())
-
-ok ($class->new(123)->badd(123),246);
-ok ($class->badd(123,321),444);
-ok ($class->badd(123,$class->new(321)),444);
-
-ok ($class->new(123)->bsub(122),1);
-ok ($class->bsub(321,123),198);
-ok ($class->bsub(321,$class->new(123)),198);
-
-ok ($class->new(123)->bmul(123),15129);
-ok ($class->bmul(123,123),15129);
-ok ($class->bmul(123,$class->new(123)),15129);
+{
+ no strict;
+ $try =
+ '@args' . " = $class" . "::objectify(2,$class,4,5);".'join(" ",@args);';
+ $ans = eval $try;
+ ok ($ans,"$class 4 5");
+}
-ok ($class->new(15129)->bdiv(123),123);
-ok ($class->bdiv(15129,123),123);
-ok ($class->bdiv(15129,$class->new(123)),123);
+#############################################################################
+# is_one('-') (broken until v1.64)
-ok ($class->new(15131)->bmod(123),2);
-ok ($class->bmod(15131,123),2);
-ok ($class->bmod(15131,$class->new(123)),2);
-
-ok ($class->new(2)->bpow(16),65536);
-ok ($class->bpow(2,16),65536);
-ok ($class->bpow(2,$class->new(16)),65536);
-
-ok ($class->new(2**15)->brsft(1),2**14);
-ok ($class->brsft(2**15,1),2**14);
-ok ($class->brsft(2**15,$class->new(1)),2**14);
-
-ok ($class->new(2**13)->blsft(1),2**14);
-ok ($class->blsft(2**13,1),2**14);
-ok ($class->blsft(2**13,$class->new(1)),2**14);
+ok ($class->new(-1)->is_one(),0);
+ok ($class->new(-1)->is_one('-'),1);
1; # all done
@@ -268,28 +261,36 @@ sub ok_undef
__DATA__
$div_scale = 40;
&flog
-0:NaN
--1:NaN
--2:NaN
-1:0
+0::NaN
+-1::NaN
+-2::NaN
+# base > 0, base != 1
+2:-1:NaN
+2:0:NaN
+2:1:NaN
+# log(1) is always 1, regardless of $base
+1::0
+1:1:0
+1:2:0
# this is too slow for the testsuite
#2:0.6931471805599453094172321214581765680755
#2.718281828:0.9999999998311266953289851340574956564911
#$div_scale = 20;
#2.718281828:0.99999999983112669533
-# too slow, too (or hangs?)
+# too slow, too
#123:4.8112184355
$div_scale = 14;
#10:0:2.302585092994
#1000:0:6.90775527898214
#100:0:4.60517018598809
-2:0:0.69314718055995
+2::0.69314718055995
#3.1415:0:1.14470039286086
+# too slow
#12345:0:9.42100640177928
#0.001:0:-6.90775527898214
# reset for further tests
$div_scale = 40;
-1:0
+1::0
&frsft
NaNfrsft:2:NaN
0:2:0
@@ -329,17 +330,61 @@ fnormNaN:NaN
-2:-2
-123.456:-123
-200:-200
+# test for bug in brsft() not handling cases that return 0
+0.000641:0
+0.0006412:0
+0.00064123:0
+0.000641234:0
+0.0006412345:0
+0.00064123456:0
+0.000641234567:0
+0.0006412345678:0
+0.00064123456789:0
+0.1:0
+0.01:0
+0.001:0
+0.0001:0
+0.00001:0
+0.000001:0
+0.0000001:0
+0.00000001:0
+0.000000001:0
+0.0000000001:0
+0.00000000001:0
+0.12345:0
+0.123456:0
+0.1234567:0
+0.12345678:0
+0.123456789:0
&finf
1:+:inf
2:-:-inf
3:abc:inf
+&as_hex
++inf:inf
+-inf:-inf
+hexNaN:NaN
+0:0x0
+5:0x5
+-5:-0x5
+&as_bin
++inf:inf
+-inf:-inf
+hexNaN:NaN
+0:0b0
+5:0b101
+-5:-0b101
&numify
+# uses bsstr() so 5 => 5e+0 to be compatible w/ Perls output
0:0e+1
+1:1e+0
1234:1234e+0
NaN:NaN
+inf:inf
-inf:-inf
+-5:-5e+0
+100:1e+2
+-100:-1e+2
&fnan
abc:NaN
2:NaN
@@ -358,7 +403,11 @@ abc::1
+inf:inf
-inf:-inf
abcfsstr:NaN
+-abcfsstr:NaN
1234.567:1234567e-3
+123:123e+0
+-5:-5e+0
+-100:-1e+2
&fstr
+inf:::inf
-inf:::-inf
@@ -382,6 +431,10 @@ abc:NaN
11111b:NaN
+1z:NaN
-1z:NaN
+0e999:0
+0e-999:0
+-0e999:0
+-0e-999:0
0:0
+0:0
+00:0
@@ -1158,6 +1211,55 @@ Nanfac:NaN
10:3628800
11:39916800
12:479001600
+&froot
+# sqrt()
++0:2:0
++1:2:1
+-1:2:NaN
+# -$x ** (1/2) => -$y, but not in froot()
+-123.456:2:NaN
++inf:2:inf
+-inf:2:NaN
+2:2:1.41421356237309504880168872420969807857
+-2:2:NaN
+4:2:2
+9:2:3
+16:2:4
+100:2:10
+123.456:2:11.11107555549866648462149404118219234119
+15241.38393:2:123.4559999756998444766131352122991626468
+1.44:2:1.2
+12:2:3.464101615137754587054892683011744733886
+0.49:2:0.7
+0.0049:2:0.07
+# invalid ones
+1:NaN:NaN
+-1:NaN:NaN
+0:NaN:NaN
+-inf:NaN:NaN
++inf:NaN:NaN
+NaN:0:NaN
+NaN:2:NaN
+NaN:inf:NaN
+NaN:inf:NaN
+12:-inf:NaN
+12:inf:NaN
++0:0:NaN
++1:0:NaN
+-1:0:NaN
+-2:0:NaN
+-123.45:0:NaN
++inf:0:NaN
+12:1:12
+-12:1:NaN
+8:-1:NaN
+-8:-1:NaN
+# cubic root
+8:3:2
+-8:3:NaN
+# fourths root
+16:4:2
+81:4:3
&fsqrt
+0:0
-1:NaN
@@ -1182,6 +1284,8 @@ nanfsqrt:NaN
144e20:120000000000
# proved to be an endless loop under 7-9
12:3.464101615137754587054892683011744733886
+0.49:0.7
+0.0049:0.07
&is_nan
123:0
abc:1
@@ -1320,6 +1424,11 @@ abc:NaN
-51:-51
-51.2:-52
12.2:12
+0.12345:0
+0.123456:0
+0.1234567:0
+0.12345678:0
+0.123456789:0
&fceil
0:0
abc:NaN
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.t
index 33614039bd7..0d73a7d99e5 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigfltpm.t
@@ -26,7 +26,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 1627
+ plan tests => 1768
+ 2; # own tests
}
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintc.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintc.t
index 26530ca6e1f..fe3b7c4259f 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintc.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintc.t
@@ -7,22 +7,19 @@ BEGIN
{
$| = 1;
chdir 't' if -d 't';
- unshift @INC, '../lib'; # for running manually
+ unshift @INC, '../lib'; # for running manually
}
use Math::BigInt::Calc;
BEGIN
{
- my $additional = 0;
- $additional = 27 if $Math::BigInt::Calc::VERSION > 0.18;
- plan tests => 80 + $additional;
+ plan tests => 258;
}
-# testing of Math::BigInt::Calc, primarily for interface/api and not for the
-# math functionality
+# testing of Math::BigInt::Calc
-my $C = 'Math::BigInt::Calc'; # pass classname to sub's
+my $C = 'Math::BigInt::Calc'; # pass classname to sub's
# _new and _str
my $x = $C->_new(\"123"); my $y = $C->_new(\"321");
@@ -61,15 +58,54 @@ my ($re,$rr) = $C->_div($x,$y);
ok (${$C->_str($re)},123); ok (${$C->_str($rr)},2);
# is_zero, _is_one, _one, _zero
-ok ($C->_is_zero($x),0);
-ok ($C->_is_one($x),0);
+ok ($C->_is_zero($x)||0,0);
+ok ($C->_is_one($x)||0,0);
-ok ($C->_is_one($C->_one()),1); ok ($C->_is_one($C->_zero()),0);
-ok ($C->_is_zero($C->_zero()),1); ok ($C->_is_zero($C->_one()),0);
+ok (${$C->_str($C->_zero())},"0");
+ok (${$C->_str($C->_one())},"1");
+
+# _two() (only used internally)
+ok (${$C->_str($C->_two())},"2");
+
+ok ($C->_is_one($C->_one()),1);
+
+ok ($C->_is_one($C->_zero()) || 0,0);
+
+ok ($C->_is_zero($C->_zero()),1);
+
+ok ($C->_is_zero($C->_one()) || 0,0);
# is_odd, is_even
-ok ($C->_is_odd($C->_one()),1); ok ($C->_is_odd($C->_zero()),0);
-ok ($C->_is_even($C->_one()),0); ok ($C->_is_even($C->_zero()),1);
+ok ($C->_is_odd($C->_one()),1); ok ($C->_is_odd($C->_zero())||0,0);
+ok ($C->_is_even($C->_one()) || 0,0); ok ($C->_is_even($C->_zero()),1);
+
+# _len
+$x = $C->_new(\"1"); ok ($C->_len($x),1);
+$x = $C->_new(\"12"); ok ($C->_len($x),2);
+$x = $C->_new(\"123"); ok ($C->_len($x),3);
+$x = $C->_new(\"1234"); ok ($C->_len($x),4);
+$x = $C->_new(\"12345"); ok ($C->_len($x),5);
+$x = $C->_new(\"123456"); ok ($C->_len($x),6);
+$x = $C->_new(\"1234567"); ok ($C->_len($x),7);
+$x = $C->_new(\"12345678"); ok ($C->_len($x),8);
+$x = $C->_new(\"123456789"); ok ($C->_len($x),9);
+
+$x = $C->_new(\"8"); ok ($C->_len($x),1);
+$x = $C->_new(\"21"); ok ($C->_len($x),2);
+$x = $C->_new(\"321"); ok ($C->_len($x),3);
+$x = $C->_new(\"4321"); ok ($C->_len($x),4);
+$x = $C->_new(\"54321"); ok ($C->_len($x),5);
+$x = $C->_new(\"654321"); ok ($C->_len($x),6);
+$x = $C->_new(\"7654321"); ok ($C->_len($x),7);
+$x = $C->_new(\"87654321"); ok ($C->_len($x),8);
+$x = $C->_new(\"987654321"); ok ($C->_len($x),9);
+
+for (my $i = 1; $i < 9; $i++)
+ {
+ my $a = "$i" . '0' x ($i-1);
+ $x = $C->_new(\$a);
+ print "# Tried len '$a'\n" unless ok ($C->_len($x),$i);
+ }
# _digit
$x = $C->_new(\"123456789");
@@ -81,8 +117,12 @@ ok ($C->_digit($x,-2),2);
ok ($C->_digit($x,-3),3);
# _copy
-$x = $C->_new(\"12356");
-ok (${$C->_str($C->_copy($x))},12356);
+foreach (qw/ 1 12 123 1234 12345 123456 1234567 12345678 123456789/)
+ {
+ $x = $C->_new(\"$_");
+ ok (${$C->_str($C->_copy($x))},"$_");
+ ok (${$C->_str($x)},"$_"); # did _copy destroy original x?
+ }
# _zeros
$x = $C->_new(\"1256000000"); ok ($C->_zeros($x),6);
@@ -105,6 +145,10 @@ ok (${$C->_str($C->_rsft($x,$y,10))},20);
$x = $C->_new(\"256"); $y = $C->_new(\"4");
ok (${$C->_str($C->_rsft($x,$y,2))},256 >> 4);
+$x = $C->_new(\"6411906467305339182857313397200584952398");
+$y = $C->_new(\"45");
+ok (${$C->_str($C->_rsft($x,$y,10))},0);
+
# _acmp
$x = $C->_new(\"123456789");
$y = $C->_new(\"987654321");
@@ -113,6 +157,27 @@ ok ($C->_acmp($y,$x),1);
ok ($C->_acmp($x,$x),0);
ok ($C->_acmp($y,$y),0);
+$x = $C->_new(\"1234567890123456789");
+$y = $C->_new(\"987654321012345678");
+ok ($C->_acmp($x,$y),1);
+ok ($C->_acmp($y,$x),-1);
+ok ($C->_acmp($x,$x),0);
+ok ($C->_acmp($y,$y),0);
+
+$x = $C->_new(\"1234");
+$y = $C->_new(\"987654321012345678");
+ok ($C->_acmp($x,$y),-1);
+ok ($C->_acmp($y,$x),1);
+ok ($C->_acmp($x,$x),0);
+ok ($C->_acmp($y,$y),0);
+
+# _modinv
+$x = $C->_new(\"8");
+$y = $C->_new(\"5033");
+my ($xmod,$sign) = $C->_modinv($x,$y);
+ok (${$C->_str($xmod)},'629'); # -629 % 5033 == 4404
+ok ($sign, '-');
+
# _div
$x = $C->_new(\"3333"); $y = $C->_new(\"1111");
ok (${$C->_str(scalar $C->_div($x,$y))},3);
@@ -122,10 +187,22 @@ $x = $C->_new(\"123"); $y = $C->_new(\"1111");
($x,$y) = $C->_div($x,$y); ok (${$C->_str($x)},0); ok (${$C->_str($y)},123);
# _num
-$x = $C->_new(\"12345"); $x = $C->_num($x); ok (ref($x)||'',''); ok ($x,12345);
+foreach (qw/1 12 123 1234 12345 1234567 12345678 123456789 1234567890/)
+ {
+ $x = $C->_new(\"$_");
+ ok (ref($x)||'','ARRAY'); ok (${$C->_str($x)},"$_");
+ $x = $C->_num($x); ok (ref($x)||'',''); ok ($x,$_);
+ }
# _sqrt
$x = $C->_new(\"144"); ok (${$C->_str($C->_sqrt($x))},'12');
+$x = $C->_new(\"144000000000000"); ok (${$C->_str($C->_sqrt($x))},'12000000');
+
+# _root
+$x = $C->_new(\"81"); my $n = $C->_new(\"3"); # 4*4*4 = 64, 5*5*5 = 125
+ok (${$C->_str($C->_root($x,$n))},'4'); # 4.xx => 4.0
+$x = $C->_new(\"81"); $n = $C->_new(\"4"); # 3*3*3*3 == 81
+ok (${$C->_str($C->_root($x,$n))},'3');
# _fac
$x = $C->_new(\"0"); ok (${$C->_str($C->_fac($x))},'1');
@@ -136,12 +213,41 @@ $x = $C->_new(\"4"); ok (${$C->_str($C->_fac($x))},'24');
$x = $C->_new(\"5"); ok (${$C->_str($C->_fac($x))},'120');
$x = $C->_new(\"10"); ok (${$C->_str($C->_fac($x))},'3628800');
$x = $C->_new(\"11"); ok (${$C->_str($C->_fac($x))},'39916800');
+$x = $C->_new(\"12"); ok (${$C->_str($C->_fac($x))},'479001600');
+
+##############################################################################
+# _inc and _dec
+foreach (qw/1 11 121 1231 12341 1234561 12345671 123456781 1234567891/)
+ {
+ $x = $C->_new(\"$_"); $C->_inc($x);
+ print "# \$x = ",${$C->_str($x)},"\n"
+ unless ok (${$C->_str($x)},substr($_,0,length($_)-1) . '2');
+ $C->_dec($x); ok (${$C->_str($x)},$_);
+ }
+foreach (qw/19 119 1219 12319 1234519 12345619 123456719 1234567819/)
+ {
+ $x = $C->_new(\"$_"); $C->_inc($x);
+ print "# \$x = ",${$C->_str($x)},"\n"
+ unless ok (${$C->_str($x)},substr($_,0,length($_)-2) . '20');
+ $C->_dec($x); ok (${$C->_str($x)},$_);
+ }
+foreach (qw/999 9999 99999 9999999 99999999 999999999 9999999999 99999999999/)
+ {
+ $x = $C->_new(\"$_"); $C->_inc($x);
+ print "# \$x = ",${$C->_str($x)},"\n"
+ unless ok (${$C->_str($x)}, '1' . '0' x (length($_)));
+ $C->_dec($x); ok (${$C->_str($x)},$_);
+ }
-# _inc
$x = $C->_new(\"1000"); $C->_inc($x); ok (${$C->_str($x)},'1001');
$C->_dec($x); ok (${$C->_str($x)},'1000');
-my $BL = Math::BigInt::Calc::_base_len();
+my $BL;
+{
+ no strict 'refs';
+ $BL = &{"$C"."::_base_len"}();
+}
+
$x = '1' . '0' x $BL;
$z = '1' . '0' x ($BL-1); $z .= '1';
$x = $C->_new(\$x); $C->_inc($x); ok (${$C->_str($x)},$z);
@@ -152,6 +258,7 @@ $x = $C->_new(\$x); $C->_dec($x); ok (${$C->_str($x)},$z);
# should not happen:
# $x = $C->_new(\"-2"); $y = $C->_new(\"4"); ok ($C->_acmp($x,$y),-1);
+###############################################################################
# _mod
$x = $C->_new(\"1000"); $y = $C->_new(\"3");
ok (${$C->_str(scalar $C->_mod($x,$y))},1);
@@ -173,6 +280,12 @@ ok (${$C->_str(scalar $C->_from_bin(\"0b10101011"))},160+11);
# _as_hex, _as_bin
ok (${$C->_str(scalar $C->_from_hex( $C->_as_hex( $C->_new(\"128"))))}, 128);
ok (${$C->_str(scalar $C->_from_bin( $C->_as_bin( $C->_new(\"128"))))}, 128);
+ok (${$C->_str(scalar $C->_from_hex( $C->_as_hex( $C->_new(\"0"))))}, 0);
+ok (${$C->_str(scalar $C->_from_bin( $C->_as_bin( $C->_new(\"0"))))}, 0);
+ok ( ${$C->_as_hex( $C->_new(\"0"))}, '0x0');
+ok ( ${$C->_as_bin( $C->_new(\"0"))}, '0b0');
+ok ( ${$C->_as_hex( $C->_new(\"12"))}, '0xc');
+ok ( ${$C->_as_bin( $C->_new(\"12"))}, '0b1100');
# _check
$x = $C->_new(\"123456789");
@@ -180,37 +293,35 @@ ok ($C->_check($x),0);
ok ($C->_check(123),'123 is not a reference');
###############################################################################
-# _to_large and _to_small (last since they toy with BASE_LEN etc)
-
-exit if $Math::BigInt::Calc::VERSION < 0.19;
-
-$C->_base_len(5,7); $x = [ qw/67890 12345 67890 12345/ ]; $C->_to_large($x);
-ok (@$x,3);
-ok ($x->[0], '4567890'); ok ($x->[1], '7890123'); ok ($x->[2], '123456');
-
-$C->_base_len(5,7); $x = [ qw/54321 54321 54321 54321/ ]; $C->_to_large($x);
-ok (@$x,3);
-ok ($x->[0], '2154321'); ok ($x->[1], '4321543'); ok ($x->[2], '543215');
-
-$C->_base_len(6,7); $x = [ qw/654321 654321 654321 654321/ ];
-$C->_to_large($x); ok (@$x,4);
-ok ($x->[0], '1654321'); ok ($x->[1], '2165432');
-ok ($x->[2], '3216543'); ok ($x->[3], '654');
-
-$C->_base_len(5,7); $C->_to_small($x); ok (@$x,5);
-ok ($x->[0], '54321'); ok ($x->[1], '43216');
-ok ($x->[2], '32165'); ok ($x->[3], '21654');
-ok ($x->[4], '6543');
-
-$C->_base_len(7,10); $x = [ qw/0000000 0000000 9999990 9999999/ ];
-$C->_to_large($x); ok (@$x,3);
-ok ($x->[0], '0000000000'); ok ($x->[1], '9999900000');
-ok ($x->[2], '99999999');
-
-$C->_base_len(7,10); $x = [ qw/0000000 0000000 9999990 9999999 99/ ];
-$C->_to_large($x); ok (@$x,3);
-ok ($x->[0], '0000000000'); ok ($x->[1], '9999900000');
-ok ($x->[2], '9999999999');
+# __strip_zeros
+
+{
+ no strict 'refs';
+ # correct empty arrays
+ $x = &{$C."::__strip_zeros"}([]); ok (@$x,1); ok ($x->[0],0);
+ # don't strip single elements
+ $x = &{$C."::__strip_zeros"}([0]); ok (@$x,1); ok ($x->[0],0);
+ $x = &{$C."::__strip_zeros"}([1]); ok (@$x,1); ok ($x->[0],1);
+ # don't strip non-zero elements
+ $x = &{$C."::__strip_zeros"}([0,1]);
+ ok (@$x,2); ok ($x->[0],0); ok ($x->[1],1);
+ $x = &{$C."::__strip_zeros"}([0,1,2]);
+ ok (@$x,3); ok ($x->[0],0); ok ($x->[1],1); ok ($x->[2],2);
+
+ # but strip leading zeros
+ $x = &{$C."::__strip_zeros"}([0,1,2,0]);
+ ok (@$x,3); ok ($x->[0],0); ok ($x->[1],1); ok ($x->[2],2);
+
+ $x = &{$C."::__strip_zeros"}([0,1,2,0,0]);
+ ok (@$x,3); ok ($x->[0],0); ok ($x->[1],1); ok ($x->[2],2);
+
+ $x = &{$C."::__strip_zeros"}([0,1,2,0,0,0]);
+ ok (@$x,3); ok ($x->[0],0); ok ($x->[1],1); ok ($x->[2],2);
+
+ # collapse multiple zeros
+ $x = &{$C."::__strip_zeros"}([0,0,0,0]);
+ ok (@$x,1); ok ($x->[0],0);
+}
# done
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.inc b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.inc
index fa5b6f0de1d..b4e9250b4f2 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.inc
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.inc
@@ -2,6 +2,8 @@
my $version = ${"$class\::VERSION"};
+use strict;
+
##############################################################################
# for testing inheritance of _swap
@@ -63,22 +65,18 @@ while (<DATA>)
$try = "\$x = $class->bnorm(\"$args[0]\");";
# some is_xxx tests
} elsif ($f =~ /^is_(zero|one|odd|even|negative|positive|nan|int)$/) {
- $try .= "\$x->$f();";
- } elsif ($f eq "as_hex") {
- $try .= '$x->as_hex();';
- } elsif ($f eq "as_bin") {
- $try .= '$x->as_bin();';
+ $try .= "\$x->$f() || 0;";
} elsif ($f eq "is_inf") {
$try .= "\$x->is_inf('$args[1]');";
} elsif ($f eq "binf") {
$try .= "\$x->binf('$args[1]');";
} elsif ($f eq "bone") {
$try .= "\$x->bone('$args[1]');";
- # some unary ops
+ # some unary ops
} elsif ($f =~ /^b(nan|floor|ceil|sstr|neg|abs|inc|dec|not|sqrt|fac)$/) {
$try .= "\$x->$f();";
- } elsif ($f eq "length") {
- $try .= '$x->length();';
+ } elsif ($f =~ /^(numify|length|stringify|as_hex|as_bin)$/) {
+ $try .= "\$x->$f();";
} elsif ($f eq "exponent"){
# ->bstr() to see if an object is returned
$try .= '$x = $x->exponent()->bstr();';
@@ -92,6 +90,7 @@ while (<DATA>)
$try .= '$e = $e->bstr(); $e = "NaN" if !defined $e;';
$try .= '"$m,$e";';
} else {
+ # binary ops
$try .= "\$y = $class->new('$args[1]');";
if ($f eq "bcmp")
{
@@ -155,6 +154,8 @@ while (<DATA>)
{
$try .= "\$x >> \$y;";
}
+ }elsif ($f eq "broot"){
+ $try .= "\$x->broot(\$y);";
}elsif ($f eq "band"){
$try .= "\$x & \$y;";
}elsif ($f eq "bior"){
@@ -430,6 +431,29 @@ $z = 1e+129; # definitely a float (may fail on UTS)
$x = $class->new($z); ok ($x->bsstr(),'1e+129');
###############################################################################
+# test for whitespace inlcuding newlines to be handled correctly
+
+# ok ($Math::BigInt::strict,1); # the default
+
+foreach my $c (
+ qw/1 12 123 1234 12345 123456 1234567 12345678 123456789 1234567890/)
+ {
+ my $m = $class->new($c);
+ ok ($class->new("$c"),$m);
+ ok ($class->new(" $c"),$m);
+ ok ($class->new("$c "),$m);
+ ok ($class->new(" $c "),$m);
+ ok ($class->new("\n$c"),$m);
+ ok ($class->new("$c\n"),$m);
+ ok ($class->new("\n$c\n"),$m);
+ ok ($class->new(" \n$c\n"),$m);
+ ok ($class->new(" \n$c \n"),$m);
+ ok ($class->new(" \n$c\n "),$m);
+ ok ($class->new(" \n$c\n1"),'NaN');
+ ok ($class->new("1 \n$c\n1"),'NaN');
+ }
+
+###############################################################################
# prime number tests, also test for **= and length()
# found on: http://www.utm.edu/research/primes/notes/by_year.html
@@ -481,9 +505,10 @@ $x = $class->new('+inf'); ok ($x,'inf');
###############################################################################
###############################################################################
-# the followin tests only make sense with Math::BigInt::Calc or BareCalc
+# the followin tests only make sense with Math::BigInt::Calc or BareCalc or
+# FastCalc
-exit if $CALC !~ /^Math::BigInt::(Calc|BareCalc)$/; # for Pari et al.
+exit if $CALC !~ /^Math::BigInt::(|Bare|Fast)Calc$/; # for Pari et al.
###############################################################################
# check proper length of internal arrays
@@ -589,6 +614,14 @@ ok ($class->binf('-'),'-inf');
ok ($class->binf('-inf'),'-inf');
###############################################################################
+# is_one('-')
+
+ok ($class->new(1)->is_one('-'),0);
+ok ($class->new(-1)->is_one('-'),1);
+ok ($class->new(1)->is_one(),1);
+ok ($class->new(-1)->is_one(),0);
+
+###############################################################################
# all tests done
1;
@@ -736,86 +769,10 @@ NaN:inf:
-inf:NaN:
NaN:-inf:
&bnorm
--0\n:0
--123\n:-123
--1234\n:-1234
--12345\n:-12345
--123456\n:-123456
--1234567\n:-1234567
--12345678\n:-12345678
--123456789\n:-123456789
--1234567890\n:-1234567890
--12345678901\n:-12345678901
-0\n:0
-123\n:123
-1234\n:1234
-12345\n:12345
-123456\n:123456
-1234567\n:1234567
-12345678\n:12345678
-123456789\n:123456789
-1234567890\n:1234567890
-12345678901\n:12345678901
-\n0:0
-\n123:123
-\n1234:1234
-\n12345:12345
-\n123456:123456
-\n1234567:1234567
-\n12345678:12345678
-\n123456789:123456789
-\n1234567890:1234567890
-\n12345678901:12345678901
-\n0\n:0
-\n123\n:123
-\n1234\n:1234
-\n12345\n:12345
-\n123456\n:123456
-\n1234567\n:1234567
-\n12345678\n:12345678
-\n123456789\n:123456789
-\n1234567890\n:1234567890
-\n12345678901\n:12345678901
-\t0\n:0
-\t123\n:123
-\t1234\n:1234
-\t12345\n:12345
-\t123456\n:123456
-\t1234567\n:1234567
-\t12345678\n:12345678
-\t123456789\n:123456789
-\t1234567890\n:1234567890
-\t12345678901\n:12345678901
-\n0\t:0
-\n123\t:123
-\n1234\t:1234
-\n12345\t:12345
-\n123456\t:123456
-\n1234567\t:1234567
-\n12345678\t:12345678
-\n123456789\t:123456789
-\n1234567890\t:1234567890
-\n12345678901\t:12345678901
-0\n\n:0
-123\n\n:123
-1234\n\n:1234
-12345\n\n:12345
-123456\n\n:123456
-1234567\n\n:1234567
-12345678\n\n:12345678
-123456789\n\n:123456789
-1234567890\n\n:1234567890
-12345678901\n\n:12345678901
-\n\n0:0
-\n\n123:123
-\n\n1234:1234
-\n\n12345:12345
-\n\n123456:123456
-\n\n1234567:1234567
-\n\n12345678:12345678
-\n\n123456789:123456789
-\n\n1234567890:1234567890
-\n\n12345678901:12345678901
+0e999:0
+0e-999:0
+-0e999:0
+-0e-999:0
123:123
# binary input
0babc:NaN
@@ -1102,10 +1059,22 @@ abc:abc:NaN
-820265627:1:2:-410132814
-205066405:1:2:-102533203
&bsstr
++inf:inf
+-inf:-inf
1e+34:1e+34
123.456E3:123456e+0
100:1e+2
-abc:NaN
+bsstrabc:NaN
+-5:-5e+0
+-100:-1e+2
+&numify
+numifyabc:NaN
++inf:inf
+-inf:-inf
+5:5
+-5:-5
+100:100
+-100:-100
&bneg
bnegNaN:NaN
+inf:-inf
@@ -1409,6 +1378,16 @@ inf:0:inf,inf
-8:0:-inf,-8
-inf:0:-inf,-inf
0:0:NaN,NaN
+# test the shortcut in Calc if @$x == @$yorg
+1234567812345678:123456712345678:10,688888898
+12345671234567:1234561234567:10,58888897
+123456123456:12345123456:10,4888896
+1234512345:123412345:10,388895
+1234567890999999999:1234567890:1000000000,999999999
+1234567890000000000:1234567890:1000000000,0
+1234567890999999999:9876543210:124999998,9503086419
+1234567890000000000:9876543210:124999998,8503086420
+96969696969696969696969696969678787878626262626262626262626262:484848484848484848484848486666666666666689898989898989898989:199,484848484848484848484848123012121211954972727272727272727451
&bdiv
abc:abc:NaN
abc:1:NaN
@@ -1488,6 +1467,21 @@ inf:0:inf
14:3:4
# bug in Calc with '99999' vs $BASE-1
10000000000000000000000000000000000000000000000000000000000000000000000000000000000:10000000375084540248994272022843165711074:999999962491547381984643365663244474111576
+# test the shortcut in Calc if @$x == @$yorg
+1234567812345678:123456712345678:10
+12345671234567:1234561234567:10
+123456123456:12345123456:10
+1234512345:123412345:10
+1234567890999999999:1234567890:1000000000
+1234567890000000000:1234567890:1000000000
+1234567890999999999:9876543210:124999998
+1234567890000000000:9876543210:124999998
+96969696969696969696969696969678787878626262626262626262626262:484848484848484848484848486666666666666689898989898989898989:199
+# bug up to v0.35 in Calc (--$q one too many)
+84696969696969696956565656566184292929292929292847474747436308080808080808086765396464646464646465:13131313131313131313131313131394949494949494949494949494943535353535353535353535:6449999999999999999
+84696969696969696943434343434871161616161616161452525252486813131313131313143230042929292929292930:13131313131313131313131313131394949494949494949494949494943535353535353535353535:6449999999999999998
+84696969696969696969696969697497424242424242424242424242385803030303030303030300750000000000000000:13131313131313131313131313131394949494949494949494949494943535353535353535353535:6450000000000000000
+84696969696969696930303030303558030303030303030057575757537318181818181818199694689393939393939395:13131313131313131313131313131394949494949494949494949494943535353535353535353535:6449999999999999997
&bmodinv
# format: number:modulus:result
# bmodinv Data errors
@@ -1499,6 +1493,8 @@ abc:5:NaN
3:5:2
-2:5:2
8:5033:4404
+1234567891:13:6
+-1234567891:13:7
324958749843759385732954874325984357439658735983745:2348249874968739:1741662881064902
## bmodinv Error cases / useless use of function
3:-5:NaN
@@ -1631,6 +1627,10 @@ abc:1:abc:NaN
123456789123456789:113:39
# bug in bmod() not modifying the variable in place
-629:5033:4404
+# bug in bmod() in Calc in the _div_use_div() shortcut code path,
+# when X == X and X was big
+111111111111111111111111111111:111111111111111111111111111111:0
+12345678901234567890:12345678901234567890:0
&bgcd
abc:abc:NaN
abc:+0:NaN
@@ -1853,6 +1853,9 @@ NaNfac:NaN
4:24
5:120
6:720
+7:5040
+8:40320
+9:362880
10:3628800
11:39916800
12:479001600
@@ -1915,6 +1918,62 @@ abc:12:NaN
10000000000000000:17
-123:3
215960156869840440586892398248:30
+&broot
+# sqrt()
++0:2:0
++1:2:1
+-1:2:NaN
+# -$x ** (1/2) => -$y, but not in froot()
+-123:2:NaN
++inf:2:inf
+-inf:2:NaN
+2:2:1
+-2:2:NaN
+4:2:2
+9:2:3
+16:2:4
+100:2:10
+123:2:11
+15241:2:123
+144:2:12
+12:2:3
+0.49:2:0
+0.0049:2:0
+# invalid ones
+1:NaN:NaN
+-1:NaN:NaN
+0:NaN:NaN
+-inf:NaN:NaN
++inf:NaN:NaN
+NaN:0:NaN
+NaN:2:NaN
+NaN:inf:NaN
+NaN:inf:NaN
+12:-inf:NaN
+12:inf:NaN
++0:0:NaN
++1:0:NaN
+-1:0:NaN
+-2:0:NaN
+-123.45:0:NaN
++inf:0:NaN
+12:1:12
+-12:1:NaN
+8:-1:NaN
+-8:-1:NaN
+# cubic root
+8:3:2
+-8:3:NaN
+# fourths root
+16:4:2
+81:4:3
+# 2 ** 32
+18446744073709551616:4:65536
+18446744073709551616:8:256
+18446744073709551616:16:16
+18446744073709551616:32:4
+18446744073709551616:64:2
+18446744073709551616:128:1
&bsqrt
145:12
144:12
@@ -1939,7 +1998,8 @@ abc:12:NaN
-2:NaN
-123:NaN
Nan:NaN
-+inf:NaN
++inf:inf
+-inf:NaN
&bround
$round_mode('trunc')
0:12:0
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.t
index b4c4f111dd3..53de9b7ecda 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigintpm.t
@@ -10,7 +10,7 @@ BEGIN
my $location = $0; $location =~ s/bigintpm.t//;
unshift @INC, $location; # to locate the testing files
chdir 't' if -d 't';
- plan tests => 2552;
+ plan tests => 2684;
}
use Math::BigInt;
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/bigints.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigints.t
new file mode 100644
index 00000000000..e7972fb78ee
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/bigints.t
@@ -0,0 +1,126 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/bigints.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ @INC = qw(../t/lib); # testing with the core distribution
+ }
+ unshift @INC, '../lib'; # for testing manually
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 51;
+ }
+
+# testing of Math::BigInt::BitVect, primarily for interface/api and not for the
+# math functionality
+
+use Math::BigInt::Scalar;
+
+my $C = 'Math::BigInt::Scalar'; # pass classname to sub's
+
+# _new and _str
+my $x = $C->_new(\"123"); my $y = $C->_new(\"321");
+ok (ref($x),'SCALAR'); ok (${$C->_str($x)},123); ok (${$C->_str($y)},321);
+
+# _add, _sub, _mul, _div
+
+ok (${$C->_str($C->_add($x,$y))},444);
+ok (${$C->_str($C->_sub($x,$y))},123);
+ok (${$C->_str($C->_mul($x,$y))},39483);
+ok (${$C->_str($C->_div($x,$y))},123);
+
+ok (${$C->_str($C->_mul($x,$y))},39483);
+ok (${$C->_str($x)},39483);
+ok (${$C->_str($y)},321);
+my $z = $C->_new(\"2");
+ok (${$C->_str($C->_add($x,$z))},39485);
+my ($re,$rr) = $C->_div($x,$y);
+
+ok (${$C->_str($re)},123); ok (${$C->_str($rr)},2);
+
+# is_zero, _is_one, _one, _zero
+ok ($C->_is_zero($x),0);
+ok ($C->_is_one($x),0);
+
+ok ($C->_is_one($C->_one()),1); ok ($C->_is_one($C->_zero()),0);
+ok ($C->_is_zero($C->_zero()),1); ok ($C->_is_zero($C->_one()),0);
+
+# is_odd, is_even
+ok ($C->_is_odd($C->_one()),1); ok ($C->_is_odd($C->_zero()),0);
+ok ($C->_is_even($C->_one()),0); ok ($C->_is_even($C->_zero()),1);
+
+# _digit
+$x = $C->_new(\"123456789");
+ok ($C->_digit($x,0),9);
+ok ($C->_digit($x,1),8);
+ok ($C->_digit($x,2),7);
+ok ($C->_digit($x,-1),1);
+ok ($C->_digit($x,-2),2);
+ok ($C->_digit($x,-3),3);
+
+# _copy
+$x = $C->_new(\"12356");
+ok (${$C->_str($C->_copy($x))},12356);
+
+# _acmp
+$x = $C->_new(\"123456789");
+$y = $C->_new(\"987654321");
+ok ($C->_acmp($x,$y),-1);
+ok ($C->_acmp($y,$x),1);
+ok ($C->_acmp($x,$x),0);
+ok ($C->_acmp($y,$y),0);
+
+# _div
+$x = $C->_new(\"3333"); $y = $C->_new(\"1111");
+ok (${$C->_str( scalar $C->_div($x,$y))},3);
+$x = $C->_new(\"33333"); $y = $C->_new(\"1111"); ($x,$y) = $C->_div($x,$y);
+ok (${$C->_str($x)},30); ok (${$C->_str($y)},3);
+$x = $C->_new(\"123"); $y = $C->_new(\"1111");
+($x,$y) = $C->_div($x,$y); ok (${$C->_str($x)},0); ok (${$C->_str($y)},123);
+
+# _num
+$x = $C->_new(\"12345"); $x = $C->_num($x); ok (ref($x)||'',''); ok ($x,12345);
+
+# _len
+$x = $C->_new(\"12345"); $x = $C->_len($x); ok (ref($x)||'',''); ok ($x,5);
+
+# _and, _or, _xor
+$x = $C->_new(\"3"); $y = $C->_new(\"4"); ok (${$C->_str( $C->_or($x,$y))},7);
+$x = $C->_new(\"1"); $y = $C->_new(\"4"); ok (${$C->_str( $C->_xor($x,$y))},5);
+$x = $C->_new(\"7"); $y = $C->_new(\"3"); ok (${$C->_str( $C->_and($x,$y))},3);
+
+# _pow
+$x = $C->_new(\"2"); $y = $C->_new(\"4"); ok (${$C->_str( $C->_pow($x,$y))},16);
+$x = $C->_new(\"2"); $y = $C->_new(\"5"); ok (${$C->_str( $C->_pow($x,$y))},32);
+$x = $C->_new(\"3"); $y = $C->_new(\"3"); ok (${$C->_str( $C->_pow($x,$y))},27);
+
+
+# should not happen:
+# $x = $C->_new(\"-2"); $y = $C->_new(\"4"); ok ($C->_acmp($x,$y),-1);
+
+# _check
+$x = $C->_new(\"123456789");
+ok ($C->_check($x),0);
+ok ($C->_check(123),'123 is not a reference');
+
+# done
+
+1;
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/biglog.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/biglog.t
new file mode 100644
index 00000000000..c7c07c108f5
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/biglog.t
@@ -0,0 +1,133 @@
+#!/usr/bin/perl -w
+
+# Test blog function (and bpow, since it uses blog).
+
+# It is too slow to be simple included in bigfltpm.inc, where it would get
+# executed 3 times. One time would be under BareCalc, which shouldn't make any
+# difference since there is no CALC->_log() function, and one time under a
+# subclass, which *should* work.
+
+# But it is better to test the numerical functionality, instead of not testing
+# it at all (which did lead to wrong answers for 0 < $x < 1 in blog() in
+# versions up to v1.63, and for bsqrt($x) when $x << 1 for instance).
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/biglog.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../lib);
+ }
+ unshift @INC, '../lib';
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 50;
+ }
+
+use Math::BigFloat;
+use Math::BigInt;
+
+my $cl = "Math::BigFloat";
+
+# these tests are now really fast, since they collapse to blog(10), basically
+# Don't attempt to run them with older versions. You are warned.
+
+# $x < 0 => NaN
+ok ($cl->new(-2)->blog(), 'NaN');
+ok ($cl->new(-1)->blog(), 'NaN');
+ok ($cl->new(-10)->blog(), 'NaN');
+ok ($cl->new(-2,2)->blog(), 'NaN');
+
+my $ten = $cl->new(10)->blog();
+
+# 10 is cached (up to 75 digits)
+ok ($cl->new(10)->blog(), '2.302585092994045684017991454684364207601');
+
+# 0.1 is using the cached value for log(10), too
+
+ok ($cl->new(0.1)->blog(), -$ten);
+ok ($cl->new(0.01)->blog(), -$ten * 2);
+ok ($cl->new(0.001)->blog(), -$ten * 3);
+ok ($cl->new(0.0001)->blog(), -$ten * 4);
+
+# also cached
+ok ($cl->new(2)->blog(), '0.6931471805599453094172321214581765680755');
+
+# These are still slow, so do them only to 10 digits
+
+ok ($cl->new('0.2')->blog(undef,10), '-1.609437912');
+ok ($cl->new('0.3')->blog(undef,10), '-1.203972804');
+ok ($cl->new('0.4')->blog(undef,10), '-0.9162907319');
+ok ($cl->new('0.5')->blog(undef,10), '-0.6931471806');
+ok ($cl->new('0.6')->blog(undef,10), '-0.5108256238');
+ok ($cl->new('0.7')->blog(undef,10), '-0.3566749439');
+ok ($cl->new('0.8')->blog(undef,10), '-0.2231435513');
+ok ($cl->new('0.9')->blog(undef,10), '-0.1053605157');
+
+ok ($cl->new('9')->blog(undef,10), '2.197224577');
+
+ok ($cl->new('10')->blog(10,10), '1.000000000');
+ok ($cl->new('20')->blog(20,10), '1.000000000');
+ok ($cl->new('100')->blog(100,10), '1.000000000');
+
+ok ($cl->new('100')->blog(10,10), '2.000000000'); # 10 ** 2 == 100
+ok ($cl->new('400')->blog(20,10), '2.000000000'); # 20 ** 2 == 400
+
+ok ($cl->new('4')->blog(2,10), '2.000000000'); # 2 ** 2 == 4
+ok ($cl->new('16')->blog(2,10), '4.000000000'); # 2 ** 4 == 16
+
+ok ($cl->new('1.2')->bpow('0.3',10), '1.056219968');
+ok ($cl->new('10')->bpow('0.6',10), '3.981071706');
+
+# blog should handle bigint input
+ok (Math::BigFloat::blog(Math::BigInt->new(100),10), 2);
+ok (Math::BigInt->new(100)->blog(10), 'NaN');
+
+# test for bug in bsqrt() not taking negative _e into account
+test_bpow ('200','0.5',10, '14.14213562');
+test_bpow ('20','0.5',10, '4.472135955');
+test_bpow ('2','0.5',10, '1.414213562');
+test_bpow ('0.2','0.5',10, '0.4472135955');
+test_bpow ('0.02','0.5',10, '0.1414213562');
+test_bpow ('0.49','0.5',undef , '0.7');
+test_bpow ('0.49','0.5',10 , '0.7000000000');
+test_bpow ('0.002','0.5',10, '0.04472135955');
+test_bpow ('0.0002','0.5',10, '0.01414213562');
+test_bpow ('0.0049','0.5',undef,'0.07');
+test_bpow ('0.0049','0.5',10 , '0.07000000000');
+test_bpow ('0.000002','0.5',10, '0.001414213562');
+test_bpow ('0.021','0.5',10, '0.1449137675');
+test_bpow ('1.2','0.5',10, '1.095445115');
+test_bpow ('1.23','0.5',10, '1.109053651');
+test_bpow ('12.3','0.5',10, '3.507135583');
+
+test_bpow ('9.9','0.5',10, '3.146426545');
+test_bpow ('9.86902225','0.5',10, '3.141500000');
+test_bpow ('9.86902225','0.5',undef, '3.1415');
+
+test_bpow ('0.2','0.41',10, '0.5169187652');
+
+sub test_bpow
+ {
+ my ($x,$y,$scale,$result) = @_;
+
+ print "# Tried: $x->bpow($y,$scale);\n"
+ unless ok ($cl->new($x)->bpow($y,$scale),$result);
+ }
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/calling.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/calling.t
index b9053853440..3b0ff41dd4c 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/calling.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/calling.t
@@ -30,10 +30,11 @@ BEGIN
unshift @INC, $location;
}
print "# INC = @INC\n";
- plan tests => 141;
+ my $tests = 161;
+ plan tests => $tests;
if ($] < 5.006)
{
- for (1..141) { skip (1,'Not supported on older Perls'); }
+ for (1..$tests) { skip (1,'Not supported on older Perls'); }
exit;
}
}
@@ -58,7 +59,7 @@ use Math::BigInt;
use Math::BigFloat;
my ($x,$y,$z,$u);
-my $version = '1.46'; # adjust manually to match latest release
+my $version = '1.61'; # adjust manually to match latest release
###############################################################################
# check whether op's accept normal strings, even when inherited by subclasses
@@ -164,6 +165,7 @@ inf:1
&bstr
5:5
10:10
+-10:-10
abc:NaN
'+inf':inf
'-inf':-inf
@@ -172,6 +174,10 @@ abc:NaN
0:0e+1
2:2e+0
200:2e+2
+-5:-5e+0
+-100:-1e+2
+abc:NaN
+'+inf':inf
&babs
-1:1
1:1
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/config.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/config.t
index da574bf3623..5c480536bdd 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/config.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/config.t
@@ -8,22 +8,52 @@ BEGIN
$| = 1;
chdir 't' if -d 't';
unshift @INC, '../lib'; # for running manually
- plan tests => 10;
+ plan tests => 51;
}
-# test whether Math::BigInt constant works
+# test whether Math::BigInt->config() and Math::BigFloat->config() works
use Math::BigInt;
+use Math::BigFloat;
-ok (Math::BigInt->can('config'));
+my $mbi = 'Math::BigInt'; my $mbf = 'Math::BigFloat';
-my $cfg = Math::BigInt->config();
+##############################################################################
+# BigInt
+
+ok ($mbi->can('config'));
+
+my $cfg = $mbi->config();
+
+ok (ref($cfg),'HASH');
+
+ok ($cfg->{lib},'Math::BigInt::Calc');
+ok ($cfg->{lib_version}, $Math::BigInt::Calc::VERSION);
+ok ($cfg->{class},$mbi);
+ok ($cfg->{upgrade}||'','');
+ok ($cfg->{div_scale},40);
+
+ok ($cfg->{precision}||0,0); # should test for undef
+ok ($cfg->{accuracy}||0,0);
+
+ok ($cfg->{round_mode},'even');
+
+ok ($cfg->{trap_nan},0);
+ok ($cfg->{trap_inf},0);
+
+##############################################################################
+# BigFloat
+
+ok ($mbf->can('config'));
+
+$cfg = $mbf->config();
ok (ref($cfg),'HASH');
ok ($cfg->{lib},'Math::BigInt::Calc');
+ok ($cfg->{with},$mbi);
ok ($cfg->{lib_version}, $Math::BigInt::Calc::VERSION);
-ok ($cfg->{class},'Math::BigInt');
+ok ($cfg->{class},$mbf);
ok ($cfg->{upgrade}||'','');
ok ($cfg->{div_scale},40);
@@ -32,5 +62,59 @@ ok ($cfg->{accuracy}||0,0);
ok ($cfg->{round_mode},'even');
+ok ($cfg->{trap_nan},0);
+ok ($cfg->{trap_inf},0);
+
+##############################################################################
+# test setting values
+
+my $test = {
+ trap_nan => 1,
+ trap_inf => 1,
+ accuracy => 2,
+ precision => 3,
+ round_mode => 'zero',
+ div_scale => '100',
+ upgrade => 'Math::BigInt::SomeClass',
+ downgrade => 'Math::BigInt::SomeClass',
+ };
+
+my $c;
+
+foreach my $key (keys %$test)
+ {
+ # see if setting in MBI works
+ eval ( "$mbi\->config( $key => '$test->{$key}' );" );
+ $c = $mbi->config(); ok ("$key = $c->{$key}", "$key = $test->{$key}");
+ $c = $mbf->config();
+ # see if setting it in MBI leaves MBF alone
+ if (($c->{$key}||0) ne $test->{$key})
+ {
+ ok (1,1);
+ }
+ else
+ {
+ ok ("$key eq $c->{$key}","$key ne $test->{$key}");
+ }
+
+ # see if setting in MBF works
+ eval ( "$mbf\->config( $key => '$test->{$key}' );" );
+ $c = $mbf->config(); ok ("$key = $c->{$key}", "$key = $test->{$key}");
+ }
+
+##############################################################################
+# test setting illegal keys (should croak)
+
+my $never_reached = 0;
+eval ("$mbi\->config( 'some_garbage' => 1 ); $never_reached = 1;");
+ok ($never_reached,0);
+
+$never_reached = 0;
+eval ("$mbf\->config( 'some_garbage' => 1 ); $never_reached = 1;");
+ok ($never_reached,0);
+
+# this does not work. Why?
+#ok (@!, "Illegal keys 'some_garbage' passed to Math::BigInt->config() at ./config.t line 104");
+
# all tests done
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/constant.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/constant.t
index 2f14de2a818..4e5a17eaa77 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/constant.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/constant.t
@@ -21,7 +21,7 @@ use Math::BigInt ':constant';
ok (2 ** 255,'57896044618658097711785492504343953926634992332820282019728792003956564819968');
{
- no warnings 'portable';
+ no warnings 'portable'; # protect against "non-portable" warnings
# hexadecimal constants
ok (0x123456789012345678901234567890,
Math::BigInt->new('0x123456789012345678901234567890'));
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/inf_nan.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/inf_nan.t
index 9e8c8d39a77..852ffed7bde 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/inf_nan.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/inf_nan.t
@@ -33,9 +33,9 @@ BEGIN
}
print "# INC = @INC\n";
- # values groups oprators classes tests
- plan tests => 7 * 6 * 5 * 4 * 2 +
- 7 * 6 * 2 * 4 * 1; # bmod
+ # values groups operators classes tests
+ plan tests => 7 * 6 * 5 * 4 * 2 +
+ 7 * 6 * 2 * 4 * 1; # bmod
}
use Math::BigInt;
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/mbi_rand.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/mbi_rand.t
index 1aeb6857ab2..dd280515f9f 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/mbi_rand.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/mbi_rand.t
@@ -14,7 +14,7 @@ BEGIN
unshift @INC, $location; # to locate the testing files
chdir 't' if -d 't';
$count = 128;
- plan tests => $count*2;
+ plan tests => $count*4;
}
use Math::BigInt;
@@ -23,9 +23,9 @@ my $c = 'Math::BigInt';
my $length = 128;
# If you get a failure here, please re-run the test with the printed seed
-# value as input: perl t/mbi_rand.t seed
+# value as input "perl t/mbi_rand.t seed" and send me the output
-my $seed = ($#ARGV == 0) ? $ARGV[0] : int(rand(65537));
+my $seed = ($#ARGV == 0) ? $ARGV[0] : int(rand(1165537));
print "# seed: $seed\n"; srand($seed);
my ($A,$B,$As,$Bs,$ADB,$AMB,$la,$lb);
@@ -35,12 +35,15 @@ for (my $i = 0; $i < $count; $i++)
# length of A and B
$la = int(rand($length)+1); $lb = int(rand($length)+1);
$As = ''; $Bs = '';
+
# we create the numbers from "patterns", e.g. get a random number and a
# random count and string them together. This means things like
# "100000999999999999911122222222" are much more likely. If we just strung
- # together digits, we would end up with "1272398823211223" etc.
+ # together digits, we would end up with "1272398823211223" etc. It also means
+ # that we get more frequently equal numbers or other special cases.
while (length($As) < $la) { $As .= int(rand(100)) x int(rand(16)); }
while (length($Bs) < $lb) { $Bs .= int(rand(100)) x int(rand(16)); }
+
$As =~ s/^0+//; $Bs =~ s/^0+//;
$As = $As || '0'; $Bs = $Bs || '0';
# print "# As $As\n# Bs $Bs\n";
@@ -48,17 +51,31 @@ for (my $i = 0; $i < $count; $i++)
# print "# A $A\n# B $B\n";
if ($A->is_zero() || $B->is_zero())
{
- ok (1,1); ok (1,1); next;
+ for (1..4) { ok (1,1); } next;
}
+
# check that int(A/B)*B + A % B == A holds for all inputs
+
# $X = ($A/$B)*$B + 2 * ($A % $B) - ($A % $B);
+
($ADB,$AMB) = $A->copy()->bdiv($B);
- print "# ". join(' ',Math::BigInt::Calc->_base_len()),"\n"
+# print "# ($A / $B, $A % $B ) = $ADB $AMB\n";
+
+ print "# seed $seed, ". join(' ',Math::BigInt::Calc->_base_len()),"\n".
+ "# tried $ADB * $B + $two*$AMB - $AMB\n"
unless ok ($ADB*$B+$two*$AMB-$AMB,$As);
+ print "# seed: $seed, \$ADB * \$B / \$B = ", $ADB * $B / $B, " != $ADB (\$B=$B)\n"
+ unless ok ($ADB*$B/$B,$ADB);
# swap 'em and try this, too
# $X = ($B/$A)*$A + $B % $A;
($ADB,$AMB) = $B->copy()->bdiv($A);
- print "# ". join(' ',Math::BigInt::Calc->_base_len()),"\n"
+ #print "check: $ADB $AMB";
+ print "# seed $seed, ". join(' ',Math::BigInt::Calc->_base_len()),"\n".
+ "# tried $ADB * $A + $two*$AMB - $AMB\n"
unless ok ($ADB*$A+$two*$AMB-$AMB,$Bs);
+# print " +$two * $AMB = ",$ADB * $A + $two * $AMB,"\n";
+# print " -$AMB = ",$ADB * $A + $two * $AMB - $AMB,"\n";
+ print "# seed $seed, \$ADB * \$A / \$A = ", $ADB * $A / $A, " != $ADB (\$A=$A)\n"
+ unless ok ($ADB*$A/$A,$ADB);
}
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.inc b/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.inc
index d33d6b54475..192b1cc4bf7 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.inc
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.inc
@@ -4,26 +4,30 @@
# Make sure you always quote any bare floating-point values, lest 123.46 will
# be stringified to 123.4599999999 due to limited float prevision.
+use strict;
my ($x,$y,$z,$u,$rc);
###############################################################################
# test defaults and set/get
-ok_undef (${"$mbi\::accuracy"});
-ok_undef (${"$mbi\::precision"});
-ok_undef ($mbi->accuracy());
-ok_undef ($mbi->precision());
-ok (${"$mbi\::div_scale"},40);
-ok (${"$mbi\::round_mode"},'even');
-ok ($mbi->round_mode(),'even');
-
-ok_undef (${"$mbf\::accuracy"});
-ok_undef (${"$mbf\::precision"});
-ok_undef ($mbf->precision());
-ok_undef ($mbf->precision());
-ok (${"$mbf\::div_scale"},40);
-ok (${"$mbf\::round_mode"},'even');
-ok ($mbf->round_mode(),'even');
+{
+ no strict 'refs';
+ ok_undef (${"$mbi\::accuracy"});
+ ok_undef (${"$mbi\::precision"});
+ ok_undef ($mbi->accuracy());
+ ok_undef ($mbi->precision());
+ ok (${"$mbi\::div_scale"},40);
+ ok (${"$mbi\::round_mode"},'even');
+ ok ($mbi->round_mode(),'even');
+
+ ok_undef (${"$mbf\::accuracy"});
+ ok_undef (${"$mbf\::precision"});
+ ok_undef ($mbf->precision());
+ ok_undef ($mbf->precision());
+ ok (${"$mbf\::div_scale"},40);
+ ok (${"$mbf\::round_mode"},'even');
+ ok ($mbf->round_mode(),'even');
+}
# accessors
foreach my $class ($mbi,$mbf)
@@ -49,44 +53,50 @@ foreach my $class ($mbi,$mbf)
ok_undef ($class->precision(undef));
}
-# accuracy
-foreach (qw/5 42 -1 0/)
- {
- ok (${"$mbf\::accuracy"} = $_,$_);
- ok (${"$mbi\::accuracy"} = $_,$_);
- }
-ok_undef (${"$mbf\::accuracy"} = undef);
-ok_undef (${"$mbi\::accuracy"} = undef);
+{
+ no strict 'refs';
+ # accuracy
+ foreach (qw/5 42 -1 0/)
+ {
+ ok (${"$mbf\::accuracy"} = $_,$_);
+ ok (${"$mbi\::accuracy"} = $_,$_);
+ }
+ ok_undef (${"$mbf\::accuracy"} = undef);
+ ok_undef (${"$mbi\::accuracy"} = undef);
-# precision
-foreach (qw/5 42 -1 0/)
- {
- ok (${"$mbf\::precision"} = $_,$_);
- ok (${"$mbi\::precision"} = $_,$_);
- }
-ok_undef (${"$mbf\::precision"} = undef);
-ok_undef (${"$mbi\::precision"} = undef);
+ # precision
+ foreach (qw/5 42 -1 0/)
+ {
+ ok (${"$mbf\::precision"} = $_,$_);
+ ok (${"$mbi\::precision"} = $_,$_);
+ }
+ ok_undef (${"$mbf\::precision"} = undef);
+ ok_undef (${"$mbi\::precision"} = undef);
-# fallback
-foreach (qw/5 42 1/)
- {
- ok (${"$mbf\::div_scale"} = $_,$_);
- ok (${"$mbi\::div_scale"} = $_,$_);
- }
-# illegal values are possible for fallback due to no accessor
+ # fallback
+ foreach (qw/5 42 1/)
+ {
+ ok (${"$mbf\::div_scale"} = $_,$_);
+ ok (${"$mbi\::div_scale"} = $_,$_);
+ }
+ # illegal values are possible for fallback due to no accessor
-# round_mode
-foreach (qw/odd even zero trunc +inf -inf/)
- {
- ok (${"$mbf\::round_mode"} = $_,$_);
- ok (${"$mbi\::round_mode"} = $_,$_);
- }
-${"$mbf\::round_mode"} = 'zero';
-ok (${"$mbf\::round_mode"},'zero');
-ok (${"$mbi\::round_mode"},'-inf'); # from above
+ # round_mode
+ foreach (qw/odd even zero trunc +inf -inf/)
+ {
+ ok (${"$mbf\::round_mode"} = $_,$_);
+ ok (${"$mbi\::round_mode"} = $_,$_);
+ }
+ ${"$mbf\::round_mode"} = 'zero';
+ ok (${"$mbf\::round_mode"},'zero');
+ ok (${"$mbi\::round_mode"},'-inf'); # from above
+
+ # reset for further tests
+ ${"$mbi\::accuracy"} = undef;
+ ${"$mbi\::precision"} = undef;
+ ${"$mbf\::div_scale"} = 40;
+}
-${"$mbi\::accuracy"} = undef;
-${"$mbi\::precision"} = undef;
# local copies
$x = $mbf->new('123.456');
ok_undef ($x->accuracy());
@@ -96,41 +106,50 @@ ok_undef ($x->precision());
ok ($x->precision(5),5);
ok_undef ($x->precision(undef),undef);
-# see if MBF changes MBIs values
-ok (${"$mbi\::accuracy"} = 42,42);
-ok (${"$mbf\::accuracy"} = 64,64);
-ok (${"$mbi\::accuracy"},42); # should be still 42
-ok (${"$mbf\::accuracy"},64); # should be now 64
+{
+ no strict 'refs';
+ # see if MBF changes MBIs values
+ ok (${"$mbi\::accuracy"} = 42,42);
+ ok (${"$mbf\::accuracy"} = 64,64);
+ ok (${"$mbi\::accuracy"},42); # should be still 42
+ ok (${"$mbf\::accuracy"},64); # should be now 64
+}
###############################################################################
# see if creating a number under set A or P will round it
-${"$mbi\::accuracy"} = 4;
-${"$mbi\::precision"} = undef;
+{
+ no strict 'refs';
+ ${"$mbi\::accuracy"} = 4;
+ ${"$mbi\::precision"} = undef;
-ok ($mbi->new(123456),123500); # with A
-${"$mbi\::accuracy"} = undef;
-${"$mbi\::precision"} = 3;
-ok ($mbi->new(123456),123000); # with P
+ ok ($mbi->new(123456),123500); # with A
+ ${"$mbi\::accuracy"} = undef;
+ ${"$mbi\::precision"} = 3;
+ ok ($mbi->new(123456),123000); # with P
-${"$mbf\::accuracy"} = 4;
-${"$mbf\::precision"} = undef;
-${"$mbi\::precision"} = undef;
+ ${"$mbf\::accuracy"} = 4;
+ ${"$mbf\::precision"} = undef;
+ ${"$mbi\::precision"} = undef;
-ok ($mbf->new('123.456'),'123.5'); # with A
-${"$mbf\::accuracy"} = undef;
-${"$mbf\::precision"} = -1;
-ok ($mbf->new('123.456'),'123.5'); # with P from MBF, not MBI!
+ ok ($mbf->new('123.456'),'123.5'); # with A
+ ${"$mbf\::accuracy"} = undef;
+ ${"$mbf\::precision"} = -1;
+ ok ($mbf->new('123.456'),'123.5'); # with P from MBF, not MBI!
-${"$mbf\::precision"} = undef; # reset
+ ${"$mbf\::precision"} = undef; # reset
+}
###############################################################################
# see if MBI leaves MBF's private parts alone
-${"$mbi\::precision"} = undef; ${"$mbf\::precision"} = undef;
-${"$mbi\::accuracy"} = 4; ${"$mbf\::accuracy"} = undef;
-ok ($mbf->new('123.456'),'123.456');
-${"$mbi\::accuracy"} = undef; # reset
+{
+ no strict 'refs';
+ ${"$mbi\::precision"} = undef; ${"$mbf\::precision"} = undef;
+ ${"$mbi\::accuracy"} = 4; ${"$mbf\::accuracy"} = undef;
+ ok ($mbf->new('123.456'),'123.456');
+ ${"$mbi\::accuracy"} = undef; # reset
+}
###############################################################################
# see if setting accuracy/precision actually rounds the number
@@ -186,21 +205,72 @@ ok_undef ($x->precision());
$x = $mbf->new(123.456); $x->accuracy(4); $x->precision(2);
$z = $x->copy(); ok_undef ($z->accuracy(),undef); ok ($z->precision(),2);
+# does $x->bdiv($y,d) work when $d > div_scale?
+$x = $mbf->new('0.008'); $x->accuracy(8);
+
+for my $e ( 4, 8, 16, 32 )
+ {
+ print "# Tried: $x->bdiv(3,$e)\n"
+ unless ok (scalar $x->copy()->bdiv(3,$e), '0.002' . ('6' x ($e-2)) . '7');
+ }
+
# does accuracy()/precision work on zeros?
-foreach my $class ($mbi,$mbf)
+foreach my $c ($mbi,$mbf)
{
- $x = $class->bzero(); $x->accuracy(5); ok ($x->{_a},5);
- $x = $class->bzero(); $x->precision(5); ok ($x->{_p},5);
- $x = $class->new(0); $x->accuracy(5); ok ($x->{_a},5);
- $x = $class->new(0); $x->precision(5); ok ($x->{_p},5);
+ $x = $c->bzero(); $x->accuracy(5); ok ($x->{_a},5);
+ $x = $c->bzero(); $x->precision(5); ok ($x->{_p},5);
+ $x = $c->new(0); $x->accuracy(5); ok ($x->{_a},5);
+ $x = $c->new(0); $x->precision(5); ok ($x->{_p},5);
- $x = $class->bzero(); $x->round(5); ok ($x->{_a},5);
- $x = $class->bzero(); $x->round(undef,5); ok ($x->{_p},5);
- $x = $class->new(0); $x->round(5); ok ($x->{_a},5);
- $x = $class->new(0); $x->round(undef,5); ok ($x->{_p},5);
+ $x = $c->bzero(); $x->round(5); ok ($x->{_a},5);
+ $x = $c->bzero(); $x->round(undef,5); ok ($x->{_p},5);
+ $x = $c->new(0); $x->round(5); ok ($x->{_a},5);
+ $x = $c->new(0); $x->round(undef,5); ok ($x->{_p},5);
# see if trying to increasing A in bzero() doesn't do something
- $x = $class->bzero(); $x->{_a} = 3; $x->round(5); ok ($x->{_a},3);
+ $x = $c->bzero(); $x->{_a} = 3; $x->round(5); ok ($x->{_a},3);
+ }
+
+###############################################################################
+# test whether an opp calls objectify properly or not (or at least does what
+# it should do given non-objects, w/ or w/o objectify())
+
+foreach my $c ($mbi,$mbf)
+ {
+# ${"$c\::precision"} = undef; # reset
+# ${"$c\::accuracy"} = undef; # reset
+
+ ok ($c->new(123)->badd(123),246);
+ ok ($c->badd(123,321),444);
+ ok ($c->badd(123,$c->new(321)),444);
+
+ ok ($c->new(123)->bsub(122),1);
+ ok ($c->bsub(321,123),198);
+ ok ($c->bsub(321,$c->new(123)),198);
+
+ ok ($c->new(123)->bmul(123),15129);
+ ok ($c->bmul(123,123),15129);
+ ok ($c->bmul(123,$c->new(123)),15129);
+
+# ok ($c->new(15129)->bdiv(123),123);
+# ok ($c->bdiv(15129,123),123);
+# ok ($c->bdiv(15129,$c->new(123)),123);
+
+ ok ($c->new(15131)->bmod(123),2);
+ ok ($c->bmod(15131,123),2);
+ ok ($c->bmod(15131,$c->new(123)),2);
+
+ ok ($c->new(2)->bpow(16),65536);
+ ok ($c->bpow(2,16),65536);
+ ok ($c->bpow(2,$c->new(16)),65536);
+
+# ok ($c->new(2**15)->brsft(1),2**14);
+# ok ($c->brsft(2**15,1),2**14);
+# ok ($c->brsft(2**15,$c->new(1)),2**14);
+
+ ok ($c->new(2**13)->blsft(1),2**14);
+ ok ($c->blsft(2**13,1),2**14);
+ ok ($c->blsft(2**13,$c->new(1)),2**14);
}
###############################################################################
@@ -250,6 +320,37 @@ $x = $mbi->new(-123401); $x->{_a} = 4; ok ($x->bneg(),123401);
$mbf->round_mode('even');
$x = $mbf->new('740.7')->fdiv('6',4,undef,'zero'); ok ($x,'123.4');
+$x = $mbi->new('123456'); $y = $mbi->new('123456'); $y->{_a} = 6;
+ok ($x->bdiv($y),1); ok ($x->{_a},6); # carried over
+
+$x = $mbi->new('123456'); $y = $mbi->new('123456'); $x->{_a} = 6;
+ok ($x->bdiv($y),1); ok ($x->{_a},6); # carried over
+
+$x = $mbi->new('123456'); $y = $mbi->new('223456'); $y->{_a} = 6;
+ok ($x->bdiv($y),0); ok ($x->{_a},6); # carried over
+
+$x = $mbi->new('123456'); $y = $mbi->new('223456'); $x->{_a} = 6;
+ok ($x->bdiv($y),0); ok ($x->{_a},6); # carried over
+
+###############################################################################
+# test that bop(0) does the same than bop(undef)
+
+$x = $mbf->new('1234567890');
+ok ($x->copy()->bsqrt(0),$x->copy()->bsqrt(undef));
+ok ($x->copy->bsqrt(0),'35136.41828644462161665823116758077037159');
+
+ok_undef ($x->{_a});
+
+# test that bsqrt() modifies $x and does not just return something else
+# (especially under BareCalc)
+$z = $x->bsqrt();
+ok ($z,$x); ok ($x,'35136.41828644462161665823116758077037159');
+
+$x = $mbf->new('1.234567890123456789');
+ok ($x->copy()->bpow('0.5',0),$x->copy()->bpow('0.5',undef));
+ok ($x->copy()->bpow('0.5',0),$x->copy()->bsqrt(undef));
+ok ($x->copy()->bpow('2',0),'1.524157875323883675019051998750190521');
+
###############################################################################
# test (also under Bare) that bfac() rounds at last step
@@ -293,7 +394,16 @@ $z = $u->copy()->bmul($y,undef,2,'odd'); ok ($z,30860);
$z = $u->copy()->bmul($y,undef,3,'odd'); ok ($z,30900);
$z = $u->copy()->bmul($y,undef,-1,'odd'); ok ($z,30862.5);
-# breakage:
+my $warn = ''; $SIG{__WARN__} = sub { $warn = shift; };
+# these should warn, since '3.17' is a NaN in BigInt and thus >= returns undef
+$warn = ''; eval "\$z = 3.17 <= \$y"; ok ($z, 1);
+print "# Got: '$warn'\n" unless
+ok ($warn =~ /^Use of uninitialized value (in numeric le \(<=\) |)at/);
+$warn = ''; eval "\$z = \$y >= 3.17"; ok ($z, 1);
+print "# Got: '$warn'\n" unless
+ok ($warn =~ /^Use of uninitialized value (in numeric ge \(>=\) |)at/);
+
+# XXX TODO breakage:
# $z = $y->copy()->bmul($u,2,0,'odd'); ok ($z,31000);
# $z = $y * $u; ok ($z,5); ok (ref($z),$mbi);
# $z = $y + $x; ok ($z,12); ok (ref($z),$mbi);
@@ -302,13 +412,16 @@ $z = $u->copy()->bmul($y,undef,-1,'odd'); ok ($z,30862.5);
###############################################################################
# rounding in bdiv with fallback and already set A or P
-${"$mbf\::accuracy"} = undef;
-${"$mbf\::precision"} = undef;
-${"$mbf\::div_scale"} = 40;
+{
+ no strict 'refs';
+ ${"$mbf\::accuracy"} = undef;
+ ${"$mbf\::precision"} = undef;
+ ${"$mbf\::div_scale"} = 40;
+}
-$x = $mbf->new(10); $x->{_a} = 4;
-ok ($x->bdiv(3),'3.333');
-ok ($x->{_a},4); # set's it since no fallback
+ $x = $mbf->new(10); $x->{_a} = 4;
+ ok ($x->bdiv(3),'3.333');
+ ok ($x->{_a},4); # set's it since no fallback
$x = $mbf->new(10); $x->{_a} = 4; $y = $mbf->new(3);
ok ($x->bdiv($y),'3.333');
@@ -323,10 +436,13 @@ $x = $mbf->new(10);
ok ($x->bdiv(3,undef,-2),'3.33');
# round in div with requested P greater than fallback
-${"$mbf\::div_scale"} = 5;
-$x = $mbf->new(10);
-ok ($x->bdiv(3,undef,-8),'3.33333333');
-${"$mbf\::div_scale"} = 40;
+{
+ no strict 'refs';
+ ${"$mbf\::div_scale"} = 5;
+ $x = $mbf->new(10);
+ ok ($x->bdiv(3,undef,-8),'3.33333333');
+ ${"$mbf\::div_scale"} = 40;
+}
$x = $mbf->new(10); $y = $mbf->new(3); $y->{_a} = 4;
ok ($x->bdiv($y),'3.333');
@@ -488,12 +604,15 @@ ok ($x+$y,'2.46'); # 1.2345+1.2300=> 2.4645 => 2.46
###############################################################################
# find out whether _find_round_parameters is doing what's it's supposed to do
-
-${"$mbi\::accuracy"} = undef;
-${"$mbi\::precision"} = undef;
-${"$mbi\::div_scale"} = 40;
-${"$mbi\::round_mode"} = 'odd';
-
+
+{
+ no strict 'refs';
+ ${"$mbi\::accuracy"} = undef;
+ ${"$mbi\::precision"} = undef;
+ ${"$mbi\::div_scale"} = 40;
+ ${"$mbi\::round_mode"} = 'odd';
+}
+
$x = $mbi->new(123);
my @params = $x->_find_round_parameters();
ok (scalar @params,1); # nothing to round
@@ -526,18 +645,23 @@ ok ($params[3],'+inf'); # round_mode
ok (scalar @params,1); # error, A and P defined
ok ($params[0],$x); # self
-${"$mbi\::accuracy"} = 1;
-@params = $x->_find_round_parameters(undef,-2);
-ok (scalar @params,1); # error, A and P defined
-ok ($params[0],$x); # self
-
-${"$mbi\::accuracy"} = undef;
-${"$mbi\::precision"} = 1;
-@params = $x->_find_round_parameters(1,undef);
-ok (scalar @params,1); # error, A and P defined
-ok ($params[0],$x); # self
-
-${"$mbi\::precision"} = undef; # reset
+{
+ no strict 'refs';
+ ${"$mbi\::accuracy"} = 1;
+ @params = $x->_find_round_parameters(undef,-2);
+ ok (scalar @params,1); # error, A and P defined
+ ok ($params[0],$x); # self
+ ok ($x->is_nan(),1); # and must be NaN
+
+ ${"$mbi\::accuracy"} = undef;
+ ${"$mbi\::precision"} = 1;
+ @params = $x->_find_round_parameters(1,undef);
+ ok (scalar @params,1); # error, A and P defined
+ ok ($params[0],$x); # self
+ ok ($x->is_nan(),1); # and must be NaN
+
+ ${"$mbi\::precision"} = undef; # reset
+}
###############################################################################
# test whether bone/bzero take additional A & P, or reset it etc
@@ -592,16 +716,18 @@ for my $c ($mbi,$mbf)
# check whether mixing A and P creates a NaN
# new with set accuracy/precision and with parameters
-
-foreach my $c ($mbi,$mbf)
- {
- ok ($c->new(123,4,-3),'NaN'); # with parameters
- ${"$c\::accuracy"} = 42;
- ${"$c\::precision"} = 2;
- ok ($c->new(123),'NaN'); # with globals
- ${"$c\::accuracy"} = undef;
- ${"$c\::precision"} = undef;
- }
+{
+ no strict 'refs';
+ foreach my $c ($mbi,$mbf)
+ {
+ ok ($c->new(123,4,-3),'NaN'); # with parameters
+ ${"$c\::accuracy"} = 42;
+ ${"$c\::precision"} = 2;
+ ok ($c->new(123),'NaN'); # with globals
+ ${"$c\::accuracy"} = undef;
+ ${"$c\::precision"} = undef;
+ }
+}
# binary ops
foreach my $class ($mbi,$mbf)
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.t
index 4a632960235..17cd712b0f6 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/mbimbf.t
@@ -31,12 +31,12 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 617
- + 16; # own tests
+ plan tests => 679
+ + 23; # own tests
}
-use Math::BigInt 1.60;
-use Math::BigFloat 1.35;
+use Math::BigInt 1.63;
+use Math::BigFloat 1.38;
use vars qw/$mbi $mbf/;
@@ -56,16 +56,20 @@ ok ($Math::BigInt::rnd_mode,'even');
ok ($Math::BigFloat::rnd_mode,'even');
my $x = eval '$mbi->round_mode("huhmbi");';
-ok ($@ =~ /^Unknown round mode huhmbi at/);
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbi' at/);
$x = eval '$mbf->round_mode("huhmbf");';
-ok ($@ =~ /^Unknown round mode huhmbf at/);
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbf' at/);
# old way (now with test for validity)
$x = eval '$Math::BigInt::rnd_mode = "huhmbi";';
-ok ($@ =~ /^Unknown round mode huhmbi at/);
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbi' at/);
$x = eval '$Math::BigFloat::rnd_mode = "huhmbf";';
-ok ($@ =~ /^Unknown round mode huhmbf at/);
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbf' at/);
# see if accessor also changes old variable
$mbi->round_mode('odd'); ok ($Math::BigInt::rnd_mode,'odd');
$mbf->round_mode('odd'); ok ($Math::BigInt::rnd_mode,'odd');
@@ -78,3 +82,22 @@ foreach my $class (qw/Math::BigInt Math::BigFloat/)
ok_undef ($class->accuracy()); # and now A must be cleared
}
+foreach my $class (qw/Math::BigInt Math::BigFloat/)
+ {
+ $class->accuracy(42);
+ my $x = $class->new(123); # $x gets A of 42, too!
+ ok ($x->accuracy(),42); # really?
+ ok ($x->accuracy(undef),42); # $x has no A, but the
+ # global is still in effect for $x
+ # so the return value of that operation should
+ # be 42, not undef
+ ok ($x->accuracy(),42); # so $x should still have A = 42
+ $class->accuracy(undef); # reset for further tests
+ $class->precision(undef);
+ }
+
+# bug with flog(Math::BigFloat,Math::BigInt)
+$x = Math::BigFloat->new(100);
+$x = $x->blog(Math::BigInt->new(10));
+
+ok ($x,2);
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf0.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf0.t
new file mode 100644
index 00000000000..af312f1b92e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf0.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+# check that simple requiring BigFloat and then bzero() works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/req_mbf0.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 1;
+ }
+
+require Math::BigFloat; my $x = Math::BigFloat->bzero(); ok ($x,0);
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf1.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf1.t
new file mode 100644
index 00000000000..b0b4aea8100
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbf1.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+# check that simple requiring BigFloat and then bone() works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/req_mbf1.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 1;
+ }
+
+require Math::BigFloat; my $x = Math::BigFloat->bone(); ok ($x,1);
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfa.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfa.t
new file mode 100644
index 00000000000..b2d2a070990
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfa.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+# check that simple requiring BigFloat and then bnan() works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/req_mbfa.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 1;
+ }
+
+require Math::BigFloat; my $x = Math::BigFloat->bnan(1); ok ($x,'NaN');
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfi.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfi.t
new file mode 100644
index 00000000000..2c0ec67b022
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfi.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+# check that simple requiring BigFloat and then binf() works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/req_mbfi.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 1;
+ }
+
+require Math::BigFloat; my $x = Math::BigFloat->binf(); ok ($x,'inf');
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfn.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfn.t
new file mode 100644
index 00000000000..e3887d41de2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfn.t
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+# check that simple requiring BigFloat and then new() works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/req_mbfn.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 1;
+ }
+
+require Math::BigFloat; my $x = Math::BigFloat->new(1); ++$x; ok ($x,2);
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfw.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfw.t
new file mode 100644
index 00000000000..b216c797d90
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/req_mbfw.t
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+
+# check that requiring BigFloat and then calling import() works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/req_mbfw.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 3;
+ }
+
+# normal require that calls import automatically (we thus have MBI afterwards)
+require Math::BigFloat; my $x = Math::BigFloat->new(1); ++$x; ok ($x,2);
+
+ok (Math::BigFloat->config()->{with}, 'Math::BigInt' );
+
+# now override
+Math::BigFloat->import ( with => 'Math::BigInt::Subclass' );
+
+ok (Math::BigFloat->config()->{with}, 'Math::BigInt::Subclass' );
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/require.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/require.t
index 2775a77a6f0..50831e611d9 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/require.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/require.t
@@ -1,5 +1,7 @@
#!/usr/bin/perl -w
+# check that simple requiring BigInt works
+
use strict;
use Test;
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbf.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbf.t
index 93c2dbf1d82..d2c19c267de 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbf.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbf.t
@@ -26,7 +26,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 1627
+ plan tests => 1768
+ 6; # + our own tests
}
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbi.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbi.t
index a68113d4f43..1e6cbf8fa13 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbi.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mbi.t
@@ -26,7 +26,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 2552
+ plan tests => 2684
+ 5; # +5 own tests
}
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mif.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mif.t
index 3db96ff97ac..cbaf06a97cf 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mif.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/sub_mif.t
@@ -28,7 +28,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 617;
+ plan tests => 679;
}
use Math::BigInt::Subclass;
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/trap.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/trap.t
new file mode 100644
index 00000000000..af454092a29
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/trap.t
@@ -0,0 +1,81 @@
+#!/usr/bin/perl -w
+
+# test that config ( trap_nan => 1, trap_inf => 1) really works/dies
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib'; # for running manually
+ plan tests => 35;
+ }
+
+use Math::BigInt;
+use Math::BigFloat;
+
+my $mbi = 'Math::BigInt'; my $mbf = 'Math::BigFloat';
+my ($cfg,$x);
+
+foreach my $class ($mbi, $mbf)
+ {
+ # can do and defaults are okay?
+ ok ($class->can('config'));
+ ok ($class->config()->{trap_nan}, 0);
+ ok ($class->config()->{trap_inf}, 0);
+
+ # can set?
+ $cfg = $class->config( trap_nan => 1 ); ok ($cfg->{trap_nan},1);
+
+ # also test that new() still works normally
+ eval ("\$x = \$class->new('42'); \$x->bnan();");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,42); # after new() never modified
+
+ # can reset?
+ $cfg = $class->config( trap_nan => 0 ); ok ($cfg->{trap_nan},0);
+
+ # can set?
+ $cfg = $class->config( trap_inf => 1 ); ok ($cfg->{trap_inf},1);
+ eval ("\$x = \$class->new('4711'); \$x->binf();");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,4711); # after new() never modified
+
+ # +$x/0 => +inf
+ eval ("\$x = \$class->new('4711'); \$x->bdiv(0);");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,4711); # after new() never modified
+
+ # -$x/0 => -inf
+ eval ("\$x = \$class->new('-0815'); \$x->bdiv(0);");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,-815); # after new() never modified
+
+ $cfg = $class->config( trap_nan => 1 );
+ # 0/0 => NaN
+ eval ("\$x = \$class->new('0'); \$x->bdiv(0);");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,0); # after new() never modified
+ }
+
+##############################################################################
+# BigInt
+
+$x = Math::BigInt->new(2);
+eval ("\$x = \$mbi->new('0.1');");
+ok ($x,2); # never modified since it dies
+eval ("\$x = \$mbi->new('0a.1');");
+ok ($x,2); # never modified since it dies
+
+
+##############################################################################
+# BigFloat
+
+$x = Math::BigFloat->new(2);
+eval ("\$x = \$mbf->new('0.1a');");
+ok ($x,2); # never modified since it dies
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.inc b/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.inc
index fc70873e0ca..0b66640649c 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.inc
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.inc
@@ -1,12 +1,12 @@
-#include this file into another for subclass testing
+# include this file into another for subclass testing
# This file is nearly identical to bigintpm.t, except that certain results
# are _requird_ to be different due to "upgrading" or "promoting" to BigFloat.
# The reverse is not true, any unmarked results can be either BigInt or
# BigFloat, depending on how good the internal optimization is (e.g. it
-# is usually desirable to have 2 ** 2 return an BigInt, not an BigFloat).
+# is usually desirable to have 2 ** 2 return a BigInt, not a BigFloat).
-# Results that are required to be BigFloat are marked with an "^" at the end.
+# Results that are required to be BigFloat are marked with C<^> at the end.
# Please note that the testcount goes up by two for each extra result marked
# with ^, since then we test whether it has the proper class and that it left
@@ -117,6 +117,8 @@ while (<DATA>)
$try .= '$x <=> $y;';
} elsif ($f eq "bround") {
$try .= "$round_mode; \$x->bround(\$y);";
+ } elsif ($f eq "broot") {
+ $try .= "\$x->broot(\$y);";
} elsif ($f eq "bacmp"){
$try .= '$x->bacmp($y);';
} elsif ($f eq "badd"){
@@ -212,6 +214,12 @@ while (<DATA>)
} # endwhile data tests
close DATA;
+my $warn = ''; $SIG{__WARN__} = sub { $warn = shift; };
+
+# these should not warn
+$warn = ''; eval "\$z = 3.17 <= \$y"; ok ($z, 1); ok ($warn, '');
+$warn = ''; eval "\$z = \$y >= 3.17"; ok ($z, 1); ok ($warn, '');
+
# all tests done
1;
@@ -1309,6 +1317,11 @@ abc:12:NaN
10000000000000000:17
-123:3
215960156869840440586892398248:30
+# broot always upgrades
+&broot
+144:2:12^
+123:2:11.09053650640941716205160010260993291846^
+# bsqrt always upgrades
&bsqrt
145:12.04159457879229548012824103037860805243^
144:12^
@@ -1333,7 +1346,8 @@ abc:12:NaN
-2:NaN
-123:NaN
Nan:NaN
-+inf:NaN
++inf:inf
+-inf:NaN
&bround
$round_mode('trunc')
0:12:0
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.t
index 28d2ce1dacb..3fc4067259c 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/upgrade.t
@@ -26,7 +26,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 2068
+ plan tests => 2082
+ 2; # our own tests
}
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/use_mbfw.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/use_mbfw.t
new file mode 100644
index 00000000000..d58de047f29
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/use_mbfw.t
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+# check that using BigFloat with "with" and "lib" at the same time works
+# broken in versions up to v1.63
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/use_mbfw.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 3;
+ }
+
+
+# the replacement lib can handle the lib statement, but it could also ignore
+# it completely, for instance, when it is a 100% replacement for BigInt, but
+# doesn't know the concept of alternative libs. But it still needs to cope
+# with "lib => ". SubClass does record it, so we test here essential if
+# BigFloat hands the lib properly down, any more is outside out testing reach.
+
+use Math::BigFloat with => 'Math::BigInt::Subclass', lib => 'BareCalc';
+
+ok (Math::BigFloat->config()->{with}, 'Math::BigInt::Subclass' );
+
+ok ($Math::BigInt::Subclass::lib, 'BareCalc' );
+
+# it never arrives here, but that is a design decision in SubClass
+ok (Math::BigInt->config->{lib}, 'Math::BigInt::Calc' );
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigInt/t/with_sub.t b/gnu/usr.bin/perl/lib/Math/BigInt/t/with_sub.t
index f70b9baced3..c4319aa5705 100644
--- a/gnu/usr.bin/perl/lib/Math/BigInt/t/with_sub.t
+++ b/gnu/usr.bin/perl/lib/Math/BigInt/t/with_sub.t
@@ -28,7 +28,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 1627
+ plan tests => 1768
+ 1;
}
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat.pm b/gnu/usr.bin/perl/lib/Math/BigRat.pm
index 41c4e10c56c..2b5796f18af 100644
--- a/gnu/usr.bin/perl/lib/Math/BigRat.pm
+++ b/gnu/usr.bin/perl/lib/Math/BigRat.pm
@@ -1,6 +1,6 @@
#
-# "Tax the rat farms."
+# "Tax the rat farms." - Lord Vetinari
#
# The following hash values are used:
@@ -19,26 +19,31 @@ use strict;
use Exporter;
use Math::BigFloat;
use vars qw($VERSION @ISA $PACKAGE @EXPORT_OK $upgrade $downgrade
- $accuracy $precision $round_mode $div_scale);
+ $accuracy $precision $round_mode $div_scale $_trap_nan $_trap_inf);
@ISA = qw(Exporter Math::BigFloat);
@EXPORT_OK = qw();
-$VERSION = '0.07';
+$VERSION = '0.10';
-use overload; # inherit from Math::BigFloat
+use overload; # inherit from Math::BigFloat
##############################################################################
# global constants, flags and accessory
-use constant MB_NEVER_ROUND => 0x0001;
-
$accuracy = $precision = undef;
$round_mode = 'even';
$div_scale = 40;
$upgrade = undef;
$downgrade = undef;
+# these are internally, and not to be used from the outside
+
+use constant MB_NEVER_ROUND => 0x0001;
+
+$_trap_nan = 0; # are NaNs ok? set w/ config()
+$_trap_inf = 0; # are infs ok? set w/ config()
+
my $nan = 'NaN';
my $class = 'Math::BigRat';
my $MBI = 'Math::BigInt';
@@ -58,10 +63,9 @@ sub _new_from_float
return $self->binf('-inf') if $f->{sign} eq '-inf';
return $self->binf('+inf') if $f->{sign} eq '+inf';
- #print "f $f caller", join(' ',caller()),"\n";
$self->{_n} = $f->{_m}->copy(); # mantissa
$self->{_d} = $MBI->bone();
- $self->{sign} = $f->{sign}; $self->{_n}->{sign} = '+';
+ $self->{sign} = $f->{sign} || '+'; $self->{_n}->{sign} = '+';
if ($f->{_e}->{sign} eq '-')
{
# something like Math::BigRat->new('0.1');
@@ -95,6 +99,7 @@ sub new
}
if ($n->isa('Math::BigInt'))
{
+ # TODO: trap NaN, inf
$self->{_n} = $n->copy(); # "mantissa" = $n
$self->{_d} = $MBI->bone();
$self->{sign} = $self->{_n}->{sign}; $self->{_n}->{sign} = '+';
@@ -102,9 +107,10 @@ sub new
}
if ($n->isa('Math::BigInt::Lite'))
{
- $self->{_n} = $MBI->new($$n); # "mantissa" = $n
+ # TODO: trap NaN, inf
+ $self->{sign} = '+'; $self->{sign} = '-' if $$n < 0;
+ $self->{_n} = $MBI->new(abs($$n),undef,undef); # "mantissa" = $n
$self->{_d} = $MBI->bone();
- $self->{sign} = $self->{_n}->{sign}; $self->{_n}->{sign} = '+';
return $self->bnorm();
}
}
@@ -112,7 +118,7 @@ sub new
if (!defined $n)
{
- $self->{_n} = $MBI->bzero(); # undef => 0
+ $self->{_n} = $MBI->bzero(); # undef => 0
$self->{_d} = $MBI->bone();
$self->{sign} = '+';
return $self->bnorm();
@@ -120,61 +126,108 @@ sub new
# string input with / delimiter
if ($n =~ /\s*\/\s*/)
{
- return Math::BigRat->bnan() if $n =~ /\/.*\//; # 1/2/3 isn't valid
- return Math::BigRat->bnan() if $n =~ /\/\s*$/; # 1/ isn't valid
+ return $class->bnan() if $n =~ /\/.*\//; # 1/2/3 isn't valid
+ return $class->bnan() if $n =~ /\/\s*$/; # 1/ isn't valid
($n,$d) = split (/\//,$n);
# try as BigFloats first
if (($n =~ /[\.eE]/) || ($d =~ /[\.eE]/))
{
# one of them looks like a float
- $self->_new_from_float(Math::BigFloat->new($n));
+ # Math::BigFloat($n,undef,undef) does not what it is supposed to do, so:
+ local $Math::BigFloat::accuracy = undef;
+ local $Math::BigFloat::precision = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
+ my $nf = Math::BigFloat->new($n);
+ $self->{sign} = '+';
+ return $self->bnan() if $nf->is_nan();
+ $self->{_n} = $nf->{_m};
# now correct $self->{_n} due to $n
- my $f = Math::BigFloat->new($d);
- if ($f->{_e}->{sign} eq '-')
+ my $f = Math::BigFloat->new($d,undef,undef);
+ $self->{_d} = $f->{_m};
+ return $self->bnan() if $f->is_nan();
+ #print "n=$nf e$nf->{_e} d=$f e$f->{_e}\n";
+ # calculate the difference between nE and dE
+ my $diff_e = $nf->{_e}->copy()->bsub ( $f->{_e} );
+ if ($diff_e->is_negative())
+ {
+ # < 0: mul d with it
+ $self->{_d}->blsft($diff_e->babs(),10);
+ }
+ elsif (!$diff_e->is_zero())
{
- # 10 / 0.1 => 100/1
- $self->{_n}->blsft($f->{_e}->copy()->babs(),10);
+ # > 0: mul n with it
+ $self->{_n}->blsft($diff_e,10);
}
- else
- {
- $self->{_d}->blsft($f->{_e},10); # 1 / 1 => 10/1
- }
}
else
{
- $self->{_n} = $MBI->new($n);
- $self->{_d} = $MBI->new($d);
- return $self->bnan() if $self->{_n}->is_nan() || $self->{_d}->is_nan();
- # inf handling is missing here
+ # both d and n are (big)ints
+ $self->{_n} = $MBI->new($n,undef,undef);
+ $self->{_d} = $MBI->new($d,undef,undef);
+ $self->{sign} = '+';
+ return $self->bnan() if $self->{_n}->{sign} eq $nan ||
+ $self->{_d}->{sign} eq $nan;
+ # handle inf and NAN cases:
+ if ($self->{_n}->is_inf() || $self->{_d}->is_inf())
+ {
+ # inf/inf => NaN
+ return $self->bnan() if
+ ($self->{_n}->is_inf() && $self->{_d}->is_inf());
+ # +-inf/123 => +-inf
+ return $self->binf($self->{sign}) if $self->{_n}->is_inf();
+ # 123/inf => 0
+ return $self->bzero();
+ }
- $self->{sign} = $self->{_n}->{sign}; $self->{_n}->{sign} = '+';
+ $self->{sign} = $self->{_n}->{sign}; $self->{_n}->babs();
# if $d is negative, flip sign
$self->{sign} =~ tr/+-/-+/ if $self->{_d}->{sign} eq '-';
- $self->{_d}->{sign} = '+'; # normalize
+ $self->{_d}->babs(); # normalize
}
+
return $self->bnorm();
}
# simple string input
if (($n =~ /[\.eE]/))
{
- # work around bug in BigFloat that makes 1.1.2 valid
- return $self->bnan() if $n =~ /\..*\./;
- # looks like a float
- $self->_new_from_float(Math::BigFloat->new($n));
+ # looks like a float, quacks like a float, so probably is a float
+ # Math::BigFloat($n,undef,undef) does not what it is supposed to do, so:
+ local $Math::BigFloat::accuracy = undef;
+ local $Math::BigFloat::precision = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
+ $self->{sign} = 'NaN';
+ $self->_new_from_float(Math::BigFloat->new($n,undef,undef));
}
else
{
- $self->{_n} = $MBI->new($n);
+ $self->{_n} = $MBI->new($n,undef,undef);
$self->{_d} = $MBI->bone();
- $self->{sign} = $self->{_n}->{sign}; $self->{_n}->{sign} = '+';
+ $self->{sign} = $self->{_n}->{sign}; $self->{_n}->babs();
return $self->bnan() if $self->{sign} eq 'NaN';
return $self->binf($self->{sign}) if $self->{sign} =~ /^[+-]inf$/;
}
$self->bnorm();
}
-###############################################################################
+##############################################################################
+
+sub config
+ {
+ # return (later set?) configuration data as hash ref
+ my $class = shift || 'Math::BigFloat';
+
+ my $cfg = $class->SUPER::config(@_);
+
+ # now we need only to override the ones that are different from our parent
+ $cfg->{class} = $class;
+ $cfg->{with} = $MBI;
+ $cfg;
+ }
+
+##############################################################################
sub bstr
{
@@ -203,7 +256,7 @@ sub bsstr
}
my $s = ''; $s = $x->{sign} if $x->{sign} ne '+'; # +3 vs 3
- return $x->{_n}->bstr() . '/' . $x->{_d}->bstr();
+ return $s . $x->{_n}->bstr() . '/' . $x->{_d}->bstr();
}
sub bnorm
@@ -212,11 +265,15 @@ sub bnorm
# don't reduce again)
my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
- # both parts must be BigInt's
- die ("n is not $MBI but (".ref($x->{_n}).')')
- if ref($x->{_n}) ne $MBI;
- die ("d is not $MBI but (".ref($x->{_d}).')')
- if ref($x->{_d}) ne $MBI;
+ # both parts must be BigInt's (or whatever we are using today)
+ if (ref($x->{_n}) ne $MBI)
+ {
+ require Carp; Carp::croak ("n is not $MBI but (".ref($x->{_n}).')');
+ }
+ if (ref($x->{_d}) ne $MBI)
+ {
+ require Carp; Carp::croak ("d is not $MBI but (".ref($x->{_d}).')');
+ }
# this is to prevent automatically rounding when MBI's globals are set
$x->{_d}->{_f} = MB_NEVER_ROUND;
@@ -242,6 +299,8 @@ sub bnorm
# reduce other numbers
# disable upgrade in BigInt, otherwise deep recursion
local $Math::BigInt::upgrade = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
my $gcd = $x->{_n}->bgcd($x->{_d});
if (!$gcd->is_one())
@@ -257,23 +316,37 @@ sub bnorm
sub _bnan
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bnan() to initialize number to NaN
my $self = shift;
+
+ if ($_trap_nan)
+ {
+ require Carp;
+ my $class = ref($self);
+ Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
+ }
$self->{_n} = $MBI->bzero();
$self->{_d} = $MBI->bzero();
}
sub _binf
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bone() to initialize number to +inf/-inf
my $self = shift;
+
+ if ($_trap_inf)
+ {
+ require Carp;
+ my $class = ref($self);
+ Carp::croak ("Tried to set $self to inf in $class\::_binf()");
+ }
$self->{_n} = $MBI->bzero();
$self->{_d} = $MBI->bzero();
}
sub _bone
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bone() to initialize number to +1/-1
my $self = shift;
$self->{_n} = $MBI->bone();
$self->{_d} = $MBI->bone();
@@ -281,7 +354,7 @@ sub _bone
sub _bzero
{
- # used by parent class bone() to initialize number to 1
+ # used by parent class bzero() to initialize number to 0
my $self = shift;
$self->{_n} = $MBI->bzero();
$self->{_d} = $MBI->bone();
@@ -293,27 +366,37 @@ sub _bzero
sub badd
{
# add two rationals
- my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+
+ # set up parameters
+ my ($self,$x,$y,@r) = (ref($_[0]),@_);
+ # objectify is costly, so avoid it
+ if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+ {
+ ($self,$x,$y,@r) = objectify(2,@_);
+ }
$x = $self->new($x) unless $x->isa($self);
$y = $self->new($y) unless $y->isa($self);
return $x->bnan() if ($x->{sign} eq 'NaN' || $y->{sign} eq 'NaN');
+ # TODO: inf handling
# 1 1 gcd(3,4) = 1 1*3 + 1*4 7
# - + - = --------- = --
# 4 3 4*3 12
- my $gcd = $x->{_d}->bgcd($y->{_d});
+ # we do not compute the gcd() here, but simple do:
+ # 5 7 5*3 + 7*4 41
+ # - + - = --------- = --
+ # 4 3 4*3 12
+
+ # the gcd() calculation and reducing is then done in bnorm()
- my $aa = $x->{_d}->copy();
- my $bb = $y->{_d}->copy();
- if ($gcd->is_one())
- {
- $bb->bdiv($gcd); $aa->bdiv($gcd);
- }
- $x->{_n}->bmul($bb); $x->{_n}->{sign} = $x->{sign};
- my $m = $y->{_n}->copy()->bmul($aa);
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
+
+ $x->{_n}->bmul($y->{_d}); $x->{_n}->{sign} = $x->{sign};
+ my $m = $y->{_n}->copy()->bmul($x->{_d});
$m->{sign} = $y->{sign}; # 2/1 - 2/1
$x->{_n}->badd($m);
@@ -322,34 +405,42 @@ sub badd
# calculate new sign
$x->{sign} = $x->{_n}->{sign}; $x->{_n}->{sign} = '+';
- $x->bnorm()->round($a,$p,$r);
+ $x->bnorm()->round(@r);
}
sub bsub
{
# subtract two rationals
- my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+ # set up parameters
+ my ($self,$x,$y,@r) = (ref($_[0]),@_);
+ # objectify is costly, so avoid it
+ if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+ {
+ ($self,$x,$y,@r) = objectify(2,@_);
+ }
+
+ # TODO: $self instead or $class??
$x = $class->new($x) unless $x->isa($class);
$y = $class->new($y) unless $y->isa($class);
return $x->bnan() if ($x->{sign} eq 'NaN' || $y->{sign} eq 'NaN');
# TODO: inf handling
- # 1 1 gcd(3,4) = 1 1*3 + 1*4 7
- # - + - = --------- = --
+ # 1 1 gcd(3,4) = 1 1*3 - 1*4 7
+ # - - - = --------- = --
# 4 3 4*3 12
+
+ # we do not compute the gcd() here, but simple do:
+ # 5 7 5*3 - 7*4 13
+ # - - - = --------- = - --
+ # 4 3 4*3 12
- my $gcd = $x->{_d}->bgcd($y->{_d});
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
- my $aa = $x->{_d}->copy();
- my $bb = $y->{_d}->copy();
- if ($gcd->is_one())
- {
- $bb->bdiv($gcd); $aa->bdiv($gcd);
- }
- $x->{_n}->bmul($bb); $x->{_n}->{sign} = $x->{sign};
- my $m = $y->{_n}->copy()->bmul($aa);
+ $x->{_n}->bmul($y->{_d}); $x->{_n}->{sign} = $x->{sign};
+ my $m = $y->{_n}->copy()->bmul($x->{_d});
$m->{sign} = $y->{sign}; # 2/1 - 2/1
$x->{_n}->bsub($m);
@@ -358,14 +449,22 @@ sub bsub
# calculate new sign
$x->{sign} = $x->{_n}->{sign}; $x->{_n}->{sign} = '+';
- $x->bnorm()->round($a,$p,$r);
+ $x->bnorm()->round(@r);
}
sub bmul
{
# multiply two rationals
- my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+
+ # set up parameters
+ my ($self,$x,$y,@r) = (ref($_[0]),@_);
+ # objectify is costly, so avoid it
+ if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+ {
+ ($self,$x,$y,@r) = objectify(2,@_);
+ }
+ # TODO: $self instead or $class??
$x = $class->new($x) unless $x->isa($class);
$y = $class->new($y) unless $y->isa($class);
@@ -392,21 +491,32 @@ sub bmul
# 1 1 2 1
# - * - = - = -
# 4 3 12 6
+
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
$x->{_n}->bmul($y->{_n});
$x->{_d}->bmul($y->{_d});
# compute new sign
$x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
- $x->bnorm()->round($a,$p,$r);
+ $x->bnorm()->round(@r);
}
sub bdiv
{
# (dividend: BRAT or num_str, divisor: BRAT or num_str) return
# (BRAT,BRAT) (quo,rem) or BRAT (only rem)
- my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
+ # set up parameters
+ my ($self,$x,$y,@r) = (ref($_[0]),@_);
+ # objectify is costly, so avoid it
+ if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+ {
+ ($self,$x,$y,@r) = objectify(2,@_);
+ }
+
+ # TODO: $self instead or $class??
$x = $class->new($x) unless $x->isa($class);
$y = $class->new($y) unless $y->isa($class);
@@ -421,16 +531,75 @@ sub bdiv
# 1 1 1 3
# - / - == - * -
# 4 3 4 1
+
+# local $Math::BigInt::accuracy = undef;
+# local $Math::BigInt::precision = undef;
$x->{_n}->bmul($y->{_d});
$x->{_d}->bmul($y->{_n});
# compute new sign
$x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
- $x->bnorm()->round($a,$p,$r);
+ $x->bnorm()->round(@r);
$x;
}
+sub bmod
+ {
+ # compute "remainder" (in Perl way) of $x / $y
+
+ # set up parameters
+ my ($self,$x,$y,@r) = (ref($_[0]),@_);
+ # objectify is costly, so avoid it
+ if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+ {
+ ($self,$x,$y,@r) = objectify(2,@_);
+ }
+
+ # TODO: $self instead or $class??
+ $x = $class->new($x) unless $x->isa($class);
+ $y = $class->new($y) unless $y->isa($class);
+
+ return $self->_div_inf($x,$y)
+ if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
+
+ return $self->_div_inf($x,$y)
+ if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
+
+ return $x if $x->is_zero(); # 0 / 7 = 0, mod 0
+
+ # compute $x - $y * floor($x/$y), keeping the sign of $x
+
+ # locally disable these, since they would interfere
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
+
+ my $u = $x->copy()->babs();
+ # first, do a "normal" division ($x/$y)
+ $u->{_d}->bmul($y->{_n});
+ $u->{_n}->bmul($y->{_d});
+
+ # compute floor
+ if (!$u->{_d}->is_one())
+ {
+ $u->{_n}->bdiv($u->{_d}); # 22/7 => 3/1 w/ truncate
+ # no need to set $u->{_d} to 1, since later we set it to $y->{_d}
+ #$x->{_n}->binc() if $x->{sign} eq '-'; # -22/7 => -4/1
+ }
+
+ # compute $y * $u
+ $u->{_d} = $y->{_d}; # 1 * $y->{_d}, see floor above
+ $u->{_n}->bmul($y->{_n});
+
+ my $xsign = $x->{sign}; $x->{sign} = '+'; # remember sign and make abs
+ # compute $x - $u
+ $x->bsub($u);
+ $x->{sign} = $xsign; # put sign back
+
+ $x->bnorm()->round(@r);
+ }
+
##############################################################################
# bdec/binc
@@ -459,8 +628,6 @@ sub bdec
}
}
$x->bnorm()->round(@r);
-
- #$x->bsub($self->bone())->round(@r);
}
sub binc
@@ -488,8 +655,6 @@ sub binc
$x->{_n}->badd($x->{_d}); # 5/2 => 7/2
}
$x->bnorm()->round(@r);
-
- #$x->badd($self->bone())->round(@r);
}
##############################################################################
@@ -501,7 +666,7 @@ sub is_int
my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't
- $x->{_d}->is_one(); # 1e-1 => no integer
+ $x->{_d}->is_one(); # x/y && y != 1 => no integer
0;
}
@@ -605,6 +770,9 @@ sub bceil
return $x unless $x->{sign} =~ /^[+-]$/;
return $x if $x->{_d}->is_one(); # 22/1 => 22, 0/1 => 0
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
$x->{_n}->bdiv($x->{_d}); # 22/7 => 3/1 w/ truncate
$x->{_d}->bone();
$x->{_n}->binc() if $x->{sign} eq '+'; # +22/7 => 4/1
@@ -619,6 +787,9 @@ sub bfloor
return $x unless $x->{sign} =~ /^[+-]$/;
return $x if $x->{_d}->is_one(); # 22/1 => 22, 0/1 => 0
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
$x->{_n}->bdiv($x->{_d}); # 22/7 => 3/1 w/ truncate
$x->{_d}->bone();
$x->{_n}->binc() if $x->{sign} eq '-'; # -22/7 => -4/1
@@ -639,7 +810,15 @@ sub bfac
sub bpow
{
- my ($self,$x,$y,@r) = objectify(2,@_);
+ # power ($x ** $y)
+
+ # set up parameters
+ my ($self,$x,$y,@r) = (ref($_[0]),@_);
+ # objectify is costly, so avoid it
+ if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
+ {
+ ($self,$x,$y,@r) = objectify(2,@_);
+ }
return $x if $x->{sign} =~ /^[+-]inf$/; # -inf/+inf ** x
return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
@@ -706,8 +885,7 @@ sub bpow
$x->bmul($pow2) unless $pow2->is_one();
# n ** -x => 1/n ** x
($x->{_d},$x->{_n}) = ($x->{_n},$x->{_d}) if $y->{sign} eq '-';
- $x;
- #$x->round(@r);
+ $x->bnorm()->round(@r);
}
sub blog
@@ -717,12 +895,39 @@ sub blog
sub bsqrt
{
- my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+ my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
+
+ return $x->bnan() if $x->{sign} !~ /^[+]/; # NaN, -inf or < 0
+ return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf
+ return $x->round(@r) if $x->is_zero() || $x->is_one();
- return $x->bnan() if $x->{sign} ne '+'; # inf, NaN, -1 etc
- $x->{_d}->bsqrt($a,$p,$r);
- $x->{_n}->bsqrt($a,$p,$r);
- $x->bnorm();
+ local $Math::BigFloat::upgrade = undef;
+ local $Math::BigFloat::downgrade = undef;
+ local $Math::BigFloat::precision = undef;
+ local $Math::BigFloat::accuracy = undef;
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigInt::precision = undef;
+ local $Math::BigInt::accuracy = undef;
+ $x->{_d} = Math::BigFloat->new($x->{_d})->bsqrt();
+ $x->{_n} = Math::BigFloat->new($x->{_n})->bsqrt();
+
+ # if sqrt(D) was not integer
+ if ($x->{_d}->{_e}->{sign} ne '+')
+ {
+ $x->{_n}->blsft($x->{_d}->{_e}->babs(),10); # 7.1/4.51 => 7.1/45.1
+ $x->{_d} = $x->{_d}->{_m}; # 7.1/45.1 => 71/45.1
+ }
+ # if sqrt(N) was not integer
+ if ($x->{_n}->{_e}->{sign} ne '+')
+ {
+ $x->{_d}->blsft($x->{_n}->{_e}->babs(),10); # 71/45.1 => 710/45.1
+ $x->{_n} = $x->{_n}->{_m}; # 710/45.1 => 710/451
+ }
+
+ # convert parts to $MBI again
+ $x->{_n} = $x->{_n}->as_number();
+ $x->{_d} = $x->{_d}->as_number();
+ $x->bnorm()->round(@r);
}
sub blsft
@@ -812,11 +1017,31 @@ sub bacmp
##############################################################################
# output conversation
+sub numify
+ {
+ # convert 17/8 => float (aka 2.125)
+ my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
+
+ return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, NaN, etc
+
+ # N/1 => N
+ return $x->{_n}->numify() if $x->{_d}->is_one();
+
+ # N/D
+ my $neg = 1; $neg = -1 if $x->{sign} ne '+';
+ $neg * $x->{_n}->numify() / $x->{_d}->numify(); # return sign * N/D
+ }
+
sub as_number
{
my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
- return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf etc
+ return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf etc
+
+ # need to disable these, otherwise bdiv() gives BigRat again
+ local $Math::BigInt::upgrade = undef;
+ local $Math::BigInt::accuracy = undef;
+ local $Math::BigInt::precision = undef;
my $t = $x->{_n}->copy()->bdiv($x->{_d}); # 22/7 => 3
$t->{sign} = $x->{sign};
$t;
@@ -890,7 +1115,10 @@ sub import
eval $rc;
}
}
- die ("Couldn't load $MBI: $! $@") if $@;
+ if ($@)
+ {
+ require Carp; Carp::croak ("Couldn't load $MBI: $! $@");
+ }
# any non :constant stuff is handled by our parent, Exporter
# even if @_ is empty, to give it a chance
@@ -908,16 +1136,17 @@ Math::BigRat - arbitrarily big rationals
=head1 SYNOPSIS
- use Math::BigRat;
+ use Math::BigRat;
- $x = Math::BigRat->new('3/7');
+ $x = Math::BigRat->new('3/7'); $x += '5/9';
- print $x->bstr(),"\n";
+ print $x->bstr(),"\n";
+ print $x ** 2,"\n";
=head1 DESCRIPTION
-This is just a placeholder until the real thing is up and running. Watch this
-space...
+Math::BigRat complements Math::BigInt and Math::BigFloat by providing support
+for arbitrarily big rationals.
=head2 MATH LIBRARY
@@ -936,15 +1165,22 @@ Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
use Math::BigRat lib => 'Foo,Math::BigInt::Bar';
Calc.pm uses as internal format an array of elements of some decimal base
-(usually 1e7, but this might be differen for some systems) with the least
+(usually 1e7, but this might be different for some systems) with the least
significant digit first, while BitVect.pm uses a bit vector of base 2, most
significant bit first. Other modules might use even different means of
representing the numbers. See the respective module documentation for further
details.
+Currently the following replacement libraries exist, search for them at CPAN:
+
+ Math::BigInt::BitVect
+ Math::BigInt::GMP
+ Math::BigInt::Pari
+ Math::BigInt::FastCalc
+
=head1 METHODS
-Any method not listed here is dervied from Math::BigFloat (or
+Any methods not listed here are dervied from Math::BigFloat (or
Math::BigInt), so make sure you check these two modules for further
information.
@@ -954,6 +1190,8 @@ information.
Create a new Math::BigRat object. Input can come in various forms:
+ $x = Math::BigRat->new(123); # scalars
+ $x = Math::BigRat->new('123.3'); # float
$x = Math::BigRat->new('1/3'); # simple string
$x = Math::BigRat->new('1 / 3'); # spaced
$x = Math::BigRat->new('1 / 0.1'); # w/ floats
@@ -982,7 +1220,10 @@ BigInts.
=head2 as_number()
-Returns a copy of the object as BigInt by truncating it to integer.
+ $x = Math::BigRat->new('13/7');
+ print $x->as_number(),"\n"; # '1'
+
+Returns a copy of the object as BigInt trunced it to integer.
=head2 bfac()
@@ -993,7 +1234,7 @@ Calculates the factorial of $x. For instance:
print Math::BigRat->new('3/1')->bfac(),"\n"; # 1*2*3
print Math::BigRat->new('5/1')->bfac(),"\n"; # 1*2*3*4*5
-Only works for integers for now.
+Works currently only for integers.
=head2 blog()
@@ -1003,10 +1244,131 @@ Is not yet implemented.
Are not yet implemented.
+=head2 bmod()
+
+ use Math::BigRat;
+ my $x = Math::BigRat->new('7/4');
+ my $y = Math::BigRat->new('4/3');
+ print $x->bmod($y);
+
+Set $x to the remainder of the division of $x by $y.
+
+=head2 is_one()
+
+ print "$x is 1\n" if $x->is_one();
+
+Return true if $x is exactly one, otherwise false.
+
+=head2 is_zero()
+
+ print "$x is 0\n" if $x->is_zero();
+
+Return true if $x is exactly zero, otherwise false.
+
+=head2 is_positive()
+
+ print "$x is >= 0\n" if $x->is_positive();
+
+Return true if $x is positive (greater than or equal to zero), otherwise
+false. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.
+
+=head2 is_negative()
+
+ print "$x is < 0\n" if $x->is_negative();
+
+Return true if $x is negative (smaller than zero), otherwise false. Please
+note that '-inf' is also negative, while 'NaN' and '+inf' aren't.
+
+=head2 is_int()
+
+ print "$x is an integer\n" if $x->is_int();
+
+Return true if $x has a denominator of 1 (e.g. no fraction parts), otherwise
+false. Please note that '-inf', 'inf' and 'NaN' aren't integer.
+
+=head2 is_odd()
+
+ print "$x is odd\n" if $x->is_odd();
+
+Return true if $x is odd, otherwise false.
+
+=head2 is_even()
+
+ print "$x is even\n" if $x->is_even();
+
+Return true if $x is even, otherwise false.
+
+=head2 bceil()
+
+ $x->bceil();
+
+Set $x to the next bigger integer value (e.g. truncate the number to integer
+and then increment it by one).
+
+=head2 bfloor()
+
+ $x->bfloor();
+
+Truncate $x to an integer value.
+
+=head2 config
+
+ use Data::Dumper;
+
+ print Dumper ( Math::BigRat->config() );
+ print Math::BigRat->config()->{lib},"\n";
+
+Returns a hash containing the configuration, e.g. the version number, lib
+loaded etc. The following hash keys are currently filled in with the
+appropriate information.
+
+ key RO/RW Description
+ Example
+ ============================================================
+ lib RO Name of the Math library
+ Math::BigInt::Calc
+ lib_version RO Version of 'lib'
+ 0.30
+ class RO The class of config you just called
+ Math::BigRat
+ version RO version number of the class you used
+ 0.10
+ upgrade RW To which class numbers are upgraded
+ undef
+ downgrade RW To which class numbers are downgraded
+ undef
+ precision RW Global precision
+ undef
+ accuracy RW Global accuracy
+ undef
+ round_mode RW Global round mode
+ even
+ div_scale RW Fallback acccuracy for div
+ 40
+ trap_nan RW Trap creation of NaN (undef = no)
+ undef
+ trap_inf RW Trap creation of +inf/-inf (undef = no)
+ undef
+
+By passing a reference to a hash you may set the configuration values. This
+works only for values that a marked with a C<RW> above, anything else is
+read-only.
=head1 BUGS
-Some things are not yet implemented, or only implemented half-way.
+Some things are not yet implemented, or only implemented half-way:
+
+=over 2
+
+=item inf handling (partial)
+
+=item NaN handling (partial)
+
+=item rounding (not implemented except for bceil/bfloor)
+
+=item $x ** $y where $y is not an integer
+
+=back
=head1 LICENSE
@@ -1018,9 +1380,11 @@ the same terms as Perl itself.
L<Math::BigFloat> and L<Math::Big> as well as L<Math::BigInt::BitVect>,
L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
-The package at
-L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigRat> may
-contain more documentation and examples as well as testcases.
+See L<http://search.cpan.org/search?dist=bignum> for a way to use
+Math::BigRat.
+
+The package at L<http://search.cpan.org/search?dist=Math%3A%3ABigRat>
+may contain more documentation and examples as well as testcases.
=head1 AUTHORS
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/big_ap.t b/gnu/usr.bin/perl/lib/Math/BigRat/t/big_ap.t
new file mode 100644
index 00000000000..c91684a4e56
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/big_ap.t
@@ -0,0 +1,100 @@
+#!/usr/bin/perl -w
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ plan tests => 17;
+ }
+
+use Math::BigInt;
+use Math::BigFloat;
+use Math::BigRat;
+
+my $r = 'Math::BigRat';
+my $proper = $r->new('12345678901234567890/2');
+my $proper_inc = $r->new('12345678901234567890/2')->binc();
+my $proper_dec = $r->new('12345678901234567890/2')->bdec();
+my $proper_int = Math::BigInt->new('12345678901234567890');
+my $proper_float = Math::BigFloat->new('12345678901234567890');
+my $proper2 = $r->new('12345678901234567890');
+
+print "# Start\n";
+
+Math::BigInt->accuracy(3);
+Math::BigFloat->accuracy(5);
+
+my ($x,$y,$z);
+
+##############################################################################
+# new()
+
+$z = $r->new('12345678901234567890/2');
+ok ($z,$proper);
+
+$z = $r->new('1234567890123456789E1');
+ok ($z,$proper2);
+
+$z = $r->new('12345678901234567890/1E0');
+ok ($z,$proper2);
+$z = $r->new('1234567890123456789e1/1');
+ok ($z,$proper2);
+$z = $r->new('1234567890123456789e1/1E0');
+ok ($z,$proper2);
+
+$z = $r->new($proper_int);
+ok ($z,$proper2);
+
+$z = $r->new($proper_float);
+ok ($z,$proper2);
+
+##############################################################################
+# bdiv
+
+$x = $r->new('12345678901234567890'); $y = Math::BigRat->new('2');
+$z = $x->copy->bdiv($y);
+ok ($z,$proper);
+
+##############################################################################
+# bmul
+
+$x = $r->new("$proper"); $y = Math::BigRat->new('1');
+$z = $x->copy->bmul($y);
+ok ($z,$proper);
+$z = $r->new('12345678901234567890/1E0');
+ok ($z,$proper2);
+
+$z = $r->new($proper_int);
+ok ($z,$proper2);
+
+$z = $r->new($proper_float);
+ok ($z,$proper2);
+
+##############################################################################
+# bdiv
+
+$x = $r->new('12345678901234567890'); $y = Math::BigRat->new('2');
+$z = $x->copy->bdiv($y);
+ok ($z,$proper);
+
+##############################################################################
+# bmul
+
+$x = $r->new("$proper"); $y = Math::BigRat->new('1');
+$z = $x->copy->bmul($y);
+ok ($z,$proper);
+
+$x = $r->new("$proper"); $y = Math::BigRat->new('2');
+$z = $x->copy->bmul($y);
+ok ($z,$proper2);
+
+##############################################################################
+# binc
+
+$x = $proper->copy()->binc(); ok ($x,$proper_inc);
+$x = $proper->copy()->bdec(); ok ($x,$proper_dec);
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigrat.t b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigrat.t
index b59d9f0aa76..ae385553f01 100644
--- a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigrat.t
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigrat.t
@@ -8,7 +8,7 @@ BEGIN
$| = 1;
chdir 't' if -d 't';
unshift @INC, '../lib'; # for running manually
- plan tests => 136;
+ plan tests => 164;
}
# testing of Math::BigRat
@@ -44,6 +44,7 @@ foreach my $func (qw/new bnorm/)
$x = $cr->$func('0.1/10'); ok ($x,'1/100');
$x = $cr->$func('0.1/0.1'); ok ($x,'1');
$x = $cr->$func('1e2/10'); ok ($x,10);
+ $x = $cr->$func('5/1e2'); ok ($x,'1/20');
$x = $cr->$func('1e2/1e1'); ok ($x,10);
$x = $cr->$func('1 / 3'); ok ($x,'1/3');
$x = $cr->$func('-1 / 3'); ok ($x,'-1/3');
@@ -54,6 +55,10 @@ foreach my $func (qw/new bnorm/)
# input ala '1+1/3' isn't parsed ok yet
$x = $cr->$func('1+1/3'); ok ($x,'NaN');
+
+ $x = $cr->$func('1/1.2'); ok ($x,'5/6');
+ $x = $cr->$func('1.3/1.2'); ok ($x,'13/12');
+ $x = $cr->$func('1.2/1'); ok ($x,'6/5');
############################################################################
# other classes as input
@@ -157,13 +162,31 @@ ok ($x*$y,'3/7');
$x = $cr->new('3/5'); $y = $cr->new('5/7');
ok ($x/$y,'21/25');
+$x = $cr->new('7/4'); $y = $cr->new('1');
+ok ($x % $y,'3/4');
+
+$x = $cr->new('7/4'); $y = $cr->new('5/13');
+ok ($x % $y,'11/52');
+
+$x = $cr->new('7/4'); $y = $cr->new('5/9');
+ok ($x % $y,'1/12');
+
$x = $cr->new('-144/9')->bsqrt(); ok ($x,'NaN');
$x = $cr->new('144/9')->bsqrt(); ok ($x,'4');
+$x = $cr->new('3/4')->bsqrt(); ok ($x,
+ '1732050807568877293527446341505872366943/'
+ .'2000000000000000000000000000000000000000');
##############################################################################
# bpow
$x = $cr->new('2/1'); $z = $x->bpow('3/1'); ok ($x,'8');
+$x = $cr->new('1/2'); $z = $x->bpow('3/1'); ok ($x,'1/8');
+$x = $cr->new('1/3'); $z = $x->bpow('4/1'); ok ($x,'1/81');
+$x = $cr->new('2/3'); $z = $x->bpow('4/1'); ok ($x,'16/81');
+
+# XXX todo:
+#$x = $cr->new('2/3'); $z = $x->bpow('5/3'); ok ($x,'32/81 ???');
##############################################################################
# bfac
@@ -190,6 +213,30 @@ $x = $cr->new('-7/7'); ok ($x->{_n}, '1'); ok ($x->{_d}, '1');
$x = $cr->new('-7/7')->bfloor(); ok ($x->{_n}, '1'); ok ($x->{_d}, '1');
##############################################################################
+# bsstr
+
+$x = $cr->new('7/5')->bsstr(); ok ($x,'7/5');
+$x = $cr->new('-7/5')->bsstr(); ok ($x,'-7/5');
+
+##############################################################################
+# numify()
+
+my @array = qw/1 2 3 4 5 6 7 8 9/;
+$x = $cr->new('8/8'); ok ($array[$x],2);
+$x = $cr->new('16/8'); ok ($array[$x],3);
+$x = $cr->new('17/8'); ok ($array[$x],3);
+$x = $cr->new('33/8'); ok ($array[$x],5);
+$x = $cr->new('-33/8'); ok ($array[$x],6);
+
+$x = $cr->new('33/8'); ok ($x->numify() * 1000, 4125);
+$x = $cr->new('-33/8'); ok ($x->numify() * 1000, -4125);
+$x = $cr->new('inf'); ok ($x->numify(), 'inf');
+$x = $cr->new('-inf'); ok ($x->numify(), '-inf');
+$x = $cr->new('NaN'); ok ($x->numify(), 'NaN');
+
+$x = $cr->new('4/3'); ok ($x->numify(), 4/3);
+
+##############################################################################
# done
1;
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.inc b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.inc
index 0f77c33adde..4e63220ff76 100644
--- a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.inc
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.inc
@@ -2,6 +2,8 @@
ok ($class->config()->{lib},$CL);
+$setup = '';
+
while (<DATA>)
{
chomp;
@@ -33,7 +35,8 @@ while (<DATA>)
{
$try .= "\$x;";
} elsif ($f eq "finf") {
- $try .= "\$x->binf('$args[1]');";
+ my $a = $args[1] || '';
+ $try .= "\$x->binf('$a');";
} elsif ($f eq "is_inf") {
$try .= "\$x->is_inf('$args[1]');";
} elsif ($f eq "fone") {
@@ -51,11 +54,9 @@ while (<DATA>)
} elsif ($f eq "denominator") {
# ->bstr() to see if an object is returned
$try .= '$x->denominator()->bstr();';
- } elsif ($f eq "numify") {
- $try .= "\$x->numify();";
- } elsif ($f eq "length") {
- $try .= "\$x->length();";
- # some unary ops (test the fxxx form, since that is done by AUTOLOAD)
+ } elsif ($f =~ /^(length|numify)$/) {
+ $try .= "\$x->$f();";
+ # some unary ops (can't test the fxxx form, since no AUTOLOAD in BigRat)
} elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
$try .= "\$x->b$1();";
# some is_xxx test function
@@ -170,17 +171,59 @@ sub ok_undef
}
__DATA__
+&as_number
+144/7:20
+NaN:NaN
++inf:inf
+-inf:-inf
+&bmod
+NaN:1:NaN
+1:NaN:NaN
+1:1:0
+2:2:0
+12:6:0
+7/4:4/14:1/28
+7/4:4/16:0
+-7/4:4/16:0
+-7/4:-4/16:0
+7/4:-4/16:0
+7/4:4/32:0
+-7/4:4/32:0
+-7/4:-4/32:0
+7/4:-4/32:0
+7/4:4/28:1/28
+-7/4:4/28:-1/28
+7/4:-4/28:1/28
+-7/4:-4/28:-1/28
+&fsqrt
+1:1
+0:0
+NaN:NaN
++inf:inf
+-inf:NaN
+144:12
+# sqrt(144) / sqrt(4) = 12/2 = 6/1
+144/4:6
+25/16:5/4
+-3:NaN
+&flog
+NaN:NaN
+0:NaN
&finf
1:+:inf
2:-:-inf
3:abc:inf
-#&numify
-#0:0e+1
-#+1:1e+0
-#1234:1234e+0
-#NaN:NaN
-#+inf:inf
-#-inf:-inf
+&numify
+0:0
++1:1
+1234:1234
+3/4:0.75
+5/2:2.5
+3/2:1.5
+5/4:1.25
+NaN:NaN
++inf:inf
+-inf:-inf
&fnan
abc:NaN
2:NaN
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.t b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.t
index 1ef0a883872..79943326e78 100644
--- a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.t
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratpm.t
@@ -26,7 +26,7 @@ BEGIN
}
print "# INC = @INC\n";
- plan tests => 491;
+ plan tests => 534;
}
use Math::BigRat;
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratup.t b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratup.t
new file mode 100644
index 00000000000..99c4dc38112
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/bigratup.t
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+# Test whether $Math::BigInt::upgrade is breaks out neck
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ plan tests => 5;
+ }
+
+use Math::BigInt upgrade => 'Math::BigRat';
+use Math::BigRat;
+
+my $rat = 'Math::BigRat';
+my ($x,$y,$z);
+
+##############################################################################
+# bceil/bfloor
+
+$x = $rat->new('49/4'); ok ($x->bfloor(),'12');
+$x = $rat->new('49/4'); ok ($x->bceil(),'13');
+
+##############################################################################
+# bsqrt
+
+$x = $rat->new('144'); ok ($x->bsqrt(),'12');
+$x = $rat->new('144/16'); ok ($x->bsqrt(),'3');
+$x = $rat->new('1/3'); ok ($x->bsqrt(),
+ '1000000000000000000000000000000000000000/1732050807568877293527446341505872366943');
+
+
+
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/requirer.t b/gnu/usr.bin/perl/lib/Math/BigRat/t/requirer.t
new file mode 100644
index 00000000000..68056586244
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/requirer.t
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -w
+
+# check that simple requiring BigRat works
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/requirer.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = qw(../t/lib);
+ }
+ unshift @INC, qw(../lib); # to locate the modules
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 1;
+ }
+
+my ($x);
+
+require Math::BigRat; $x = Math::BigRat->new(1); ++$x;
+
+ok ($x||'undef',2);
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/BigRat/t/trap.t b/gnu/usr.bin/perl/lib/Math/BigRat/t/trap.t
new file mode 100644
index 00000000000..ccd9ae8143e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Math/BigRat/t/trap.t
@@ -0,0 +1,86 @@
+#!/usr/bin/perl -w
+
+# test that config ( trap_nan => 1, trap_inf => 1) really works/dies
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib'; # for running manually
+ plan tests => 29;
+ }
+
+use Math::BigRat;
+
+my $mbi = 'Math::BigRat';
+my ($cfg,$x);
+
+foreach my $class ($mbi)
+ {
+ # can do and defaults are okay?
+ ok ($class->can('config'));
+ ok ($class->config()->{trap_nan}, 0);
+ ok ($class->config()->{trap_inf}, 0);
+
+ # can set?
+ $cfg = $class->config( trap_nan => 1 ); ok ($cfg->{trap_nan},1);
+
+ # can set via hash ref?
+ $cfg = $class->config( { trap_nan => 1 } ); ok ($cfg->{trap_nan},1);
+
+ # also test that new() still works normally
+ eval ("\$x = \$class->new('42'); \$x->bnan();");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,42); # after new() never modified
+
+ # can reset?
+ $cfg = $class->config( trap_nan => 0 ); ok ($cfg->{trap_nan},0);
+
+ # can set?
+ $cfg = $class->config( trap_inf => 1 ); ok ($cfg->{trap_inf},1);
+ eval ("\$x = \$class->new('4711'); \$x->binf();");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,4711); # after new() never modified
+
+ # +$x/0 => +inf
+ eval ("\$x = \$class->new('4711'); \$x->bdiv(0);");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,4711); # after new() never modified
+
+ # -$x/0 => -inf
+ eval ("\$x = \$class->new('-0815'); \$x->bdiv(0);");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,-815); # after new() never modified
+
+ $cfg = $class->config( trap_nan => 1 );
+ # 0/0 => NaN
+ eval ("\$x = \$class->new('0'); \$x->bdiv(0);");
+ ok ($@ =~/^Tried to set/, 1);
+ ok ($x,0); # after new() never modified
+ }
+
+##############################################################################
+# BigRat
+
+$cfg = Math::BigRat->config( trap_nan => 1 );
+
+for my $trap (qw/0.1a +inf inf -inf/)
+ {
+ my $x = Math::BigRat->new('7/4');
+
+ eval ("\$x = \$mbi->new('$trap');");
+ print "# Got: $x\n" unless
+ ok ($x,'7/4'); # never modified since it dies
+ eval ("\$x = \$mbi->new('$trap');");
+ print "# Got: $x\n" unless
+ ok ($x,'7/4'); # never modified since it dies
+ eval ("\$x = \$mbi->new('$trap/7');");
+ print "# Got: $x\n" unless
+ ok ($x,'7/4'); # never modified since it dies
+ }
+
+# all tests done
+
diff --git a/gnu/usr.bin/perl/lib/Math/Trig.t b/gnu/usr.bin/perl/lib/Math/Trig.t
index 85ff357ff23..5b1f12e95c6 100644
--- a/gnu/usr.bin/perl/lib/Math/Trig.t
+++ b/gnu/usr.bin/perl/lib/Math/Trig.t
@@ -27,10 +27,11 @@ if ($^O eq 'unicos') { # See lib/Math/Complex.pm and t/lib/complex.t.
sub near ($$;$) {
my $e = defined $_[2] ? $_[2] : $eps;
+ print "# near? $_[0] $_[1] $e\n";
$_[1] ? (abs($_[0]/$_[1] - 1) < $e) : abs($_[0]) < $e;
}
-print "1..26\n";
+print "1..29\n";
$x = 0.9;
print 'not ' unless (near(tan($x), sin($x) / cos($x)));
@@ -188,14 +189,30 @@ use Math::Trig ':radial';
# unless (near(great_circle_direction(0, 0, pi, pi), -pi()/2));
print "ok 25\n";
- # London to Tokyo.
- my @L = (deg2rad(-0.5), deg2rad(90 - 51.3));
- my @T = (deg2rad(139.8),deg2rad(90 - 35.7));
+ my @London = (deg2rad( -0.167), deg2rad(90 - 51.3));
+ my @Tokyo = (deg2rad( 139.5), deg2rad(90 - 35.7));
+ my @Berlin = (deg2rad ( 13.417), deg2rad(90 - 52.533));
+ my @Paris = (deg2rad ( 2.333), deg2rad(90 - 48.867));
- my $rad = great_circle_direction(@L, @T);
-
- print 'not ' unless (near($rad, -0.546644569997376));
+ print 'not '
+ unless (near(rad2deg(great_circle_direction(@London, @Tokyo)),
+ 31.791945393073));
+
print "ok 26\n";
+ print 'not '
+ unless (near(rad2deg(great_circle_direction(@Tokyo, @London)),
+ 336.069766430326));
+ print "ok 27\n";
+
+ print 'not '
+ unless (near(rad2deg(great_circle_direction(@Berlin, @Paris)),
+ 246.800348034667));
+
+ print "ok 28\n";
+ print 'not '
+ unless (near(rad2deg(great_circle_direction(@Paris, @Berlin)),
+ 58.2079877553156));
+ print "ok 29\n";
}
# eof
diff --git a/gnu/usr.bin/perl/lib/Memoize/t/errors.t b/gnu/usr.bin/perl/lib/Memoize/t/errors.t
index f92e5172b24..43e77b910cf 100644
--- a/gnu/usr.bin/perl/lib/Memoize/t/errors.t
+++ b/gnu/usr.bin/perl/lib/Memoize/t/errors.t
@@ -33,7 +33,8 @@ for $mod (qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File)) {
memoize(sub {}, LIST_CACHE => [HASH => \%cache ]);
};
print $@ =~ /can only store scalars/
- || $@ =~ /Can't locate.*in \@INC/ ? "ok $n\n" : "not ok $n # $@\n";
+ || $@ =~ /Can't locate.*in \@INC/
+ || $@ =~ /Can't load '.*?' for module/ ? "ok $n\n" : "not ok $n # $@\n";
1 while unlink $dummyfile, "$dummyfile.dir", "$dummyfile.pag", "$dummyfile.db";
$n++;
}
diff --git a/gnu/usr.bin/perl/lib/NEXT.pm b/gnu/usr.bin/perl/lib/NEXT.pm
index 68b3df25477..64610fed27d 100644
--- a/gnu/usr.bin/perl/lib/NEXT.pm
+++ b/gnu/usr.bin/perl/lib/NEXT.pm
@@ -1,9 +1,9 @@
package NEXT;
-$VERSION = '0.50';
+$VERSION = '0.60';
use Carp;
use strict;
-sub ancestors
+sub NEXT::ELSEWHERE::ancestors
{
my @inlist = shift;
my @outlist = ();
@@ -15,6 +15,20 @@ sub ancestors
return @outlist;
}
+sub NEXT::ELSEWHERE::ordered_ancestors
+{
+ my @inlist = shift;
+ my @outlist = ();
+ while (my $next = shift @inlist) {
+ push @outlist, $next;
+ no strict 'refs';
+ push @inlist, @{"$outlist[-1]::ISA"};
+ }
+ return sort { $a->isa($b) ? -1
+ : $b->isa($a) ? +1
+ : 0 } @outlist;
+}
+
sub AUTOLOAD
{
my ($self) = @_;
@@ -32,7 +46,8 @@ sub AUTOLOAD
unless ($NEXT::NEXT{$self,$wanted_method}) {
my @forebears =
- ancestors ref $self || $self, $wanted_class;
+ NEXT::ELSEWHERE::ancestors ref $self || $self,
+ $wanted_class;
while (@forebears) {
last if shift @forebears eq $caller_class
}
@@ -43,9 +58,11 @@ sub AUTOLOAD
@{$NEXT::NEXT{$self,$wanted_method}} =
map { (*{"${_}::AUTOLOAD"}{CODE}) ? "${_}::AUTOLOAD" : ()} @forebears
unless @{$NEXT::NEXT{$self,$wanted_method}||[]};
+ $NEXT::SEEN->{$self,*{$caller}{CODE}}++;
}
my $call_method = shift @{$NEXT::NEXT{$self,$wanted_method}};
- while ($wanted_class =~ /^NEXT:.*:UNSEEN/ && defined $call_method
+ while ($wanted_class =~ /^NEXT\b.*\b(UNSEEN|DISTINCT)\b/
+ && defined $call_method
&& $NEXT::SEEN->{$self,$call_method}++) {
$call_method = shift @{$NEXT::NEXT{$self,$wanted_method}};
}
@@ -55,7 +72,7 @@ sub AUTOLOAD
croak qq(Can't locate object method "$wanted_method" ),
qq(via package "$caller_class");
};
- return shift()->$call_method(@_) if ref $call_method eq 'CODE';
+ return $self->$call_method(@_[1..$#_]) if ref $call_method eq 'CODE';
no strict 'refs';
($wanted_method=${$caller_class."::AUTOLOAD"}) =~ s/.*:://
if $wanted_method eq 'AUTOLOAD';
@@ -65,9 +82,77 @@ sub AUTOLOAD
no strict 'vars';
package NEXT::UNSEEN; @ISA = 'NEXT';
+package NEXT::DISTINCT; @ISA = 'NEXT';
package NEXT::ACTUAL; @ISA = 'NEXT';
package NEXT::ACTUAL::UNSEEN; @ISA = 'NEXT';
+package NEXT::ACTUAL::DISTINCT; @ISA = 'NEXT';
package NEXT::UNSEEN::ACTUAL; @ISA = 'NEXT';
+package NEXT::DISTINCT::ACTUAL; @ISA = 'NEXT';
+
+package EVERY::LAST; @ISA = 'EVERY';
+package EVERY; @ISA = 'NEXT';
+sub AUTOLOAD
+{
+ my ($self) = @_;
+ my $caller = (caller(1))[3];
+ my $wanted = $EVERY::AUTOLOAD || 'EVERY::AUTOLOAD';
+ undef $EVERY::AUTOLOAD;
+ my ($wanted_class, $wanted_method) = $wanted =~ m{(.*)::(.*)}g;
+
+ local $NEXT::ALREADY_IN_EVERY{$self,$wanted_method} =
+ $NEXT::ALREADY_IN_EVERY{$self,$wanted_method};
+
+ return if $NEXT::ALREADY_IN_EVERY{$self,$wanted_method}++;
+
+ my @forebears = NEXT::ELSEWHERE::ordered_ancestors ref $self || $self,
+ $wanted_class;
+ @forebears = reverse @forebears if $wanted_class =~ /\bLAST\b/;
+ no strict 'refs';
+ my %seen;
+ my @every = map { my $sub = "${_}::$wanted_method";
+ !*{$sub}{CODE} || $seen{$sub}++ ? () : $sub
+ } @forebears
+ unless $wanted_method eq 'AUTOLOAD';
+
+ my $want = wantarray;
+ if (@every) {
+ if ($want) {
+ return map {($_, [$self->$_(@_[1..$#_])])} @every;
+ }
+ elsif (defined $want) {
+ return { map {($_, scalar($self->$_(@_[1..$#_])))}
+ @every
+ };
+ }
+ else {
+ $self->$_(@_[1..$#_]) for @every;
+ return;
+ }
+ }
+
+ @every = map { my $sub = "${_}::AUTOLOAD";
+ !*{$sub}{CODE} || $seen{$sub}++ ? () : "${_}::AUTOLOAD"
+ } @forebears;
+ if ($want) {
+ return map { $$_ = ref($self)."::EVERY::".$wanted_method;
+ ($_, [$self->$_(@_[1..$#_])]);
+ } @every;
+ }
+ elsif (defined $want) {
+ return { map { $$_ = ref($self)."::EVERY::".$wanted_method;
+ ($_, scalar($self->$_(@_[1..$#_])))
+ } @every
+ };
+ }
+ else {
+ for (@every) {
+ $$_ = ref($self)."::EVERY::".$wanted_method;
+ $self->$_(@_[1..$#_]);
+ }
+ return;
+ }
+}
+
1;
@@ -75,7 +160,7 @@ __END__
=head1 NAME
-NEXT.pm - Provide a pseudo-class NEXT that allows method redispatch
+NEXT.pm - Provide a pseudo-class NEXT (et al) that allows method redispatch
=head1 SYNOPSIS
@@ -112,21 +197,22 @@ NEXT.pm - Provide a pseudo-class NEXT that allows method redispatch
# Clean-up calls D::DESTROY, B::DESTROY, A::DESTROY, C::DESTROY
+
=head1 DESCRIPTION
NEXT.pm adds a pseudoclass named C<NEXT> to any program
-that uses it. If a method C<m> calls C<$self->NEXT::m()>, the call to
+that uses it. If a method C<m> calls C<$self-E<gt>NEXT::m()>, the call to
C<m> is redispatched as if the calling method had not originally been found.
-In other words, a call to C<$self->NEXT::m()> resumes the depth-first,
+In other words, a call to C<$self-E<gt>NEXT::m()> resumes the depth-first,
left-to-right search of C<$self>'s class hierarchy that resulted in the
original call to C<m>.
-Note that this is not the same thing as C<$self->SUPER::m()>, which
+Note that this is not the same thing as C<$self-E<gt>SUPER::m()>, which
begins a new dispatch that is restricted to searching the ancestors
-of the current class. C<$self->NEXT::m()> can backtrack
+of the current class. C<$self-E<gt>NEXT::m()> can backtrack
past the current class -- to look for a suitable method in other
-ancestors of C<$self> -- whereas C<$self->SUPER::m()> cannot.
+ancestors of C<$self> -- whereas C<$self-E<gt>SUPER::m()> cannot.
A typical use would be in the destructors of a class hierarchy,
as illustrated in the synopsis above. Each class in the hierarchy
@@ -239,30 +325,31 @@ call each method only once during a sequence of redispatches.
To cover such cases, you can redispatch methods via:
- $self->NEXT::UNSEEN::method();
+ $self->NEXT::DISTINCT::method();
rather than:
$self->NEXT::method();
-This causes the redispatcher to skip any classes in the hierarchy that it has
-already visited in an earlier redispatch. So, for example, if the
+This causes the redispatcher to only visit each distinct C<method> method
+once. That is, to skip any classes in the hierarchy that it has
+already visited during redispatch. So, for example, if the
previous example were rewritten:
package A;
- sub foo { print "called A::foo\n"; shift->NEXT::UNSEEN::foo() }
+ sub foo { print "called A::foo\n"; shift->NEXT::DISTINCT::foo() }
package B;
- sub foo { print "called B::foo\n"; shift->NEXT::UNSEEN::foo() }
+ sub foo { print "called B::foo\n"; shift->NEXT::DISTINCT::foo() }
package C; @ISA = qw( A );
- sub foo { print "called C::foo\n"; shift->NEXT::UNSEEN::foo() }
+ sub foo { print "called C::foo\n"; shift->NEXT::DISTINCT::foo() }
package D; @ISA = qw(A B);
- sub foo { print "called D::foo\n"; shift->NEXT::UNSEEN::foo() }
+ sub foo { print "called D::foo\n"; shift->NEXT::DISTINCT::foo() }
package E; @ISA = qw(C D);
- sub foo { print "called E::foo\n"; shift->NEXT::UNSEEN::foo() }
+ sub foo { print "called E::foo\n"; shift->NEXT::DISTINCT::foo() }
E->foo();
@@ -274,18 +361,155 @@ then it would print:
called D::foo
called B::foo
-and omit the second call to C<A::foo>.
+and omit the second call to C<A::foo> (since it would not be distinct
+from the first call to C<A::foo>).
Note that you can also use:
- $self->NEXT::UNSEEN::ACTUAL::method();
+ $self->NEXT::DISTINCT::ACTUAL::method();
or:
- $self->NEXT::ACTUAL::UNSEEN::method();
+ $self->NEXT::ACTUAL::DISTINCT::method();
to get both unique invocation I<and> exception-on-failure.
+Note that, for historical compatibility, you can also use
+C<NEXT::UNSEEN> instead of C<NEXT::DISTINCT>.
+
+
+=head2 Invoking all versions of a method with a single call
+
+Yet another pseudo-class that NEXT.pm provides is C<EVERY>.
+Its behaviour is considerably simpler than that of the C<NEXT> family.
+A call to:
+
+ $obj->EVERY::foo();
+
+calls I<every> method named C<foo> that the object in C<$obj> has inherited.
+That is:
+
+ use NEXT;
+
+ package A; @ISA = qw(B D X);
+ sub foo { print "A::foo " }
+
+ package B; @ISA = qw(D X);
+ sub foo { print "B::foo " }
+
+ package X; @ISA = qw(D);
+ sub foo { print "X::foo " }
+
+ package D;
+ sub foo { print "D::foo " }
+
+ package main;
+
+ my $obj = bless {}, 'A';
+ $obj->EVERY::foo(); # prints" A::foo B::foo X::foo D::foo
+
+Prefixing a method call with C<EVERY::> causes every method in the
+object's hierarchy with that name to be invoked. As the above example
+illustrates, they are not called in Perl's usual "left-most-depth-first"
+order. Instead, they are called "breadth-first-dependency-wise".
+
+That means that the inheritance tree of the object is traversed breadth-first
+and the resulting order of classes is used as the sequence in which methods
+are called. However, that sequence is modified by imposing a rule that the
+appropritae method of a derived class must be called before the same method of
+any ancestral class. That's why, in the above example, C<X::foo> is called
+before C<D::foo>, even though C<D> comes before C<X> in C<@B::ISA>.
+
+In general, there's no need to worry about the order of calls. They will be
+left-to-right, breadth-first, most-derived-first. This works perfectly for
+most inherited methods (including destructors), but is inappropriate for
+some kinds of methods (such as constructors, cloners, debuggers, and
+initializers) where it's more appropriate that the least-derived methods be
+called first (as more-derived methods may rely on the behaviour of their
+"ancestors"). In that case, instead of using the C<EVERY> pseudo-class:
+
+ $obj->EVERY::foo(); # prints" A::foo B::foo X::foo D::foo
+
+you can use the C<EVERY::LAST> pseudo-class:
+
+ $obj->EVERY::LAST::foo(); # prints" D::foo X::foo B::foo A::foo
+
+which reverses the order of method call.
+
+Whichever version is used, the actual methods are called in the same
+context (list, scalar, or void) as the original call via C<EVERY>, and return:
+
+=over
+
+=item *
+
+A hash of array references in list context. Each entry of the hash has the
+fully qualified method name as its key and a reference to an array containing
+the method's list-context return values as its value.
+
+=item *
+
+A reference to a hash of scalar values in scalar context. Each entry of the hash has the
+fully qualified method name as its key and the method's scalar-context return values as its value.
+
+=item *
+
+Nothing in void context (obviously).
+
+=back
+
+=head2 Using C<EVERY> methods
+
+The typical way to use an C<EVERY> call is to wrap it in another base
+method, that all classes inherit. For example, to ensure that every
+destructor an object inherits is actually called (as opposed to just the
+left-most-depth-first-est one):
+
+ package Base;
+ sub DESTROY { $_[0]->EVERY::Destroy }
+
+ package Derived1;
+ use base 'Base';
+ sub Destroy {...}
+
+ package Derived2;
+ use base 'Base', 'Derived1';
+ sub Destroy {...}
+
+et cetera. Every derived class than needs its own clean-up
+behaviour simply adds its own C<Destroy> method (I<not> a C<DESTROY> method),
+which the call to C<EVERY::LAST::Destroy> in the inherited destructor
+then correctly picks up.
+
+Likewise, to create a class hierarchy in which every initializer inherited by
+a new object is invoked:
+
+ package Base;
+ sub new {
+ my ($class, %args) = @_;
+ my $obj = bless {}, $class;
+ $obj->EVERY::LAST::Init(\%args);
+ }
+
+ package Derived1;
+ use base 'Base';
+ sub Init {
+ my ($argsref) = @_;
+ ...
+ }
+
+ package Derived2;
+ use base 'Base', 'Derived1';
+ sub Init {
+ my ($argsref) = @_;
+ ...
+ }
+
+et cetera. Every derived class than needs some additional initialization
+behaviour simply adds its own C<Init> method (I<not> a C<new> method),
+which the call to C<EVERY::LAST::Init> in the inherited constructor
+then correctly picks up.
+
=head1 AUTHOR
diff --git a/gnu/usr.bin/perl/lib/NEXT/Changes b/gnu/usr.bin/perl/lib/NEXT/Changes
index f6f7bff1b2f..fc340987781 100644
--- a/gnu/usr.bin/perl/lib/NEXT/Changes
+++ b/gnu/usr.bin/perl/lib/NEXT/Changes
@@ -37,3 +37,33 @@ Revision history for Perl extension NEXT.pm.
consistent with more useful SUPER:: behaviour
- Corified tests
+
+
+0.51 Tue Jul 29 23:09:48 2003
+
+ - Fixed NEXT::UNSEEN bug under diamond inheritance (thanks Dan
+ and Alan)
+
+ - Moved &ancestors out of NEXT class in case anyone ever
+ calls NEXT::ancestors
+
+ - Replaced UNSEEN with DISTINCT (but left UNSEEN operational
+ for backwards compatibility)
+
+
+0.52 Wed Jul 30 21:06:59 2003
+
+ - Refixed NEXT::UNSEEN bug under diamond inheritance
+
+
+0.53 Tue Aug 12 10:53:25 2003
+
+ - Re-re-fixed NEXT::UNSEEN bug under diamond inheritance
+
+
+0.60 Wed Aug 13 03:55:33 2003
+
+ - Re-re-re-fixed NEXT::UNSEEN bug under diamond inheritance
+ (Note to self: don't code whilst on vacation!)
+
+ - Implemented and documented EVERY functionality
diff --git a/gnu/usr.bin/perl/lib/NEXT/README b/gnu/usr.bin/perl/lib/NEXT/README
index ad750bcdb47..a60aae0bc3e 100644
--- a/gnu/usr.bin/perl/lib/NEXT/README
+++ b/gnu/usr.bin/perl/lib/NEXT/README
@@ -1,5 +1,5 @@
==============================================================================
- Release of version 0.50 of NEXT
+ Release of version 0.60 of NEXT
==============================================================================
@@ -25,7 +25,7 @@ DESCRIPTION
the current class -- to look for a suitable method in other
ancestors of C<$self> -- whereas C<$self->SUPER::m()> cannot.
- A particularly interesting use of redispatch is in
+ An particularly interesting use of redispatch is in
C<AUTOLOAD>'ed methods. If such a method determines that it is
not able to handle a particular call, it may choose to
redispatch that call, in the hope that some other C<AUTOLOAD>
@@ -50,22 +50,13 @@ COPYRIGHT
==============================================================================
-CHANGES IN VERSION 0.50
+CHANGES IN VERSION 0.60
- - Added a $VERSION (oops!)
+ - Re-re-re-fixed NEXT::UNSEEN bug under diamond inheritance
+ (Note to self: don't code whilst on vacation!)
- - Fixed handling of diamond patterns (thanks Paul)
-
- - Added NEXT::ACTUAL to require existence of next method (thanks Paul)
-
- - Added NEXT::UNSEEN to avoid calling multiply inherited
- methods twice (thanks Paul)
-
- - Re-fixed setting of $AUTOLOAD in NEXT'd AUTOLOADS to be
- consistent with more useful SUPER:: behaviour
-
- - Corified tests
+ - Implemented and documented EVERY functionality
==============================================================================
@@ -73,8 +64,5 @@ CHANGES IN VERSION 0.50
AVAILABILITY
NEXT has been uploaded to the CPAN
-and is also available from:
-
- http://www.csse.monash.edu.au/~damian/CPAN/NEXT.tar.gz
==============================================================================
diff --git a/gnu/usr.bin/perl/lib/NEXT/t/actual.t b/gnu/usr.bin/perl/lib/NEXT/t/actual.t
index e45184052b0..a3a724ae4a1 100644
--- a/gnu/usr.bin/perl/lib/NEXT/t/actual.t
+++ b/gnu/usr.bin/perl/lib/NEXT/t/actual.t
@@ -1,3 +1,5 @@
+use Test::More tests => 10;
+
BEGIN {
if ($ENV{PERL_CORE}) {
chdir('t') if -d 't';
@@ -5,27 +7,31 @@ BEGIN {
}
}
-BEGIN { print "1..9\n"; }
-use NEXT;
-
-my $count=1;
+BEGIN { use_ok('NEXT') };
+my $order = 0;
package A;
@ISA = qw/B C D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::ACTUAL::test;}
+sub test { ++$order; ::ok($order==1,"test A"); $_[0]->NEXT::ACTUAL::test;}
package B;
-@ISA = qw/C D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::ACTUAL::test;}
+@ISA = qw/D C/;
+sub test { ++$order; ::ok($order==2,"test B"); $_[0]->NEXT::ACTUAL::test;}
package C;
@ISA = qw/D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::ACTUAL::test;}
+sub test {
+ ++$order; ::ok($order==4||$order==6,"test C");
+ $_[0]->NEXT::ACTUAL::test;
+}
package D;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::ACTUAL::test;}
+sub test {
+ ++$order; ::ok($order==3||$order==5||$order==7||$order==8,"test D");
+ $_[0]->NEXT::ACTUAL::test;
+}
package main;
@@ -33,5 +39,6 @@ my $foo = {};
bless($foo,"A");
-eval { $foo->test } and print "not ";
-print "ok 9\n";
+eval{ $foo->test }
+ ? fail("Didn't die on missing ancestor")
+ : pass("Correctly dies after full traversal");
diff --git a/gnu/usr.bin/perl/lib/NEXT/t/actuns.t b/gnu/usr.bin/perl/lib/NEXT/t/actuns.t
index 3795681bc2c..b3da0c69fde 100644
--- a/gnu/usr.bin/perl/lib/NEXT/t/actuns.t
+++ b/gnu/usr.bin/perl/lib/NEXT/t/actuns.t
@@ -1,3 +1,5 @@
+use Test::More tests => 6;
+
BEGIN {
if ($ENV{PERL_CORE}) {
chdir('t') if -d 't';
@@ -5,27 +7,25 @@ BEGIN {
}
}
-BEGIN { print "1..5\n"; }
-use NEXT;
-
-my $count=1;
+BEGIN { use_ok('NEXT') };
+my $order = 0;
package A;
@ISA = qw/B C D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::UNSEEN::ACTUAL::test;}
+sub test { ::ok(++$order==1,"test A"); $_[0]->NEXT::UNSEEN::ACTUAL::test;}
package B;
-@ISA = qw/C D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::ACTUAL::UNSEEN::test;}
+@ISA = qw/D C/;
+sub test { ::ok(++$order==2,"test B"); $_[0]->NEXT::ACTUAL::UNSEEN::test;}
package C;
@ISA = qw/D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::UNSEEN::ACTUAL::test;}
+sub test { ::ok(++$order==4,"test C"); $_[0]->NEXT::UNSEEN::ACTUAL::test;}
package D;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::ACTUAL::UNSEEN::test;}
+sub test { ::ok(++$order==3,"test D"); $_[0]->NEXT::ACTUAL::UNSEEN::test;}
package main;
@@ -33,5 +33,6 @@ my $foo = {};
bless($foo,"A");
-eval { $foo->test } and print "not ";
-print "ok 5\n";
+eval{ $foo->test }
+ ? fail("Didn't die on missing ancestor")
+ : pass("Correctly dies after C");
diff --git a/gnu/usr.bin/perl/lib/NEXT/t/unseen.t b/gnu/usr.bin/perl/lib/NEXT/t/unseen.t
index af8d1f7612d..51668162807 100644
--- a/gnu/usr.bin/perl/lib/NEXT/t/unseen.t
+++ b/gnu/usr.bin/perl/lib/NEXT/t/unseen.t
@@ -1,3 +1,5 @@
+use Test::More tests => 7;
+
BEGIN {
if ($ENV{PERL_CORE}) {
chdir('t') if -d 't';
@@ -5,27 +7,25 @@ BEGIN {
}
}
-BEGIN { print "1..4\n"; }
-use NEXT;
-
-my $count=1;
+BEGIN { use_ok('NEXT') };
+my $order = 0;
package A;
@ISA = qw/B C D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::UNSEEN::test;}
+sub test { ::ok(++$order==1,"test A"); $_[0]->NEXT::UNSEEN::test; 1}
package B;
-@ISA = qw/C D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::UNSEEN::test;}
+@ISA = qw/D C/;
+sub test { ::ok(++$order==2,"test B"); $_[0]->NEXT::UNSEEN::test; 1}
package C;
@ISA = qw/D/;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::UNSEEN::test;}
+sub test { ::ok(++$order==4,"test C"); $_[0]->NEXT::UNSEEN::test; 1}
package D;
-sub test { print "ok ", $count++, "\n"; $_[0]->NEXT::UNSEEN::test;}
+sub test { ::ok(++$order==3,"test D"); $_[0]->NEXT::UNSEEN::test; 1}
package main;
@@ -33,4 +33,22 @@ my $foo = {};
bless($foo,"A");
-$foo->test;
+eval{ $foo->test }
+ ? pass("Correctly survives after C")
+ : fail("Shouldn't die on missing ancestor");
+
+package Diamond::Base;
+my $seen;
+sub test {
+ $seen++ ? ::fail("Can't visit inherited test twice")
+ : ::pass("First diamond is okay");
+ shift->NEXT::UNSEEN::test;
+}
+
+package Diamond::Left; @ISA = qw[Diamond::Base];
+package Diamond::Right; @ISA = qw[Diamond::Base];
+package Diamond::Top; @ISA = qw[Diamond::Left Diamond::Right];
+
+package main;
+
+Diamond::Top->test;
diff --git a/gnu/usr.bin/perl/lib/Net/ChangeLog.libnet b/gnu/usr.bin/perl/lib/Net/ChangeLog.libnet
index a00a527edce..26d7ac8dbed 100644
--- a/gnu/usr.bin/perl/lib/Net/ChangeLog.libnet
+++ b/gnu/usr.bin/perl/lib/Net/ChangeLog.libnet
@@ -1,3 +1,188 @@
+Change 830 on 2003/09/25 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - documentation fixes
+
+Change 829 on 2003/09/25 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Allow spaces after the file size in the response to SIZE
+
+Change 828 on 2003/09/25 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::Domain
+ - Avoid infinite loop
+
+Change 821 on 2003/06/18 by <gbarr@pobox.com> (Graham Barr)
+
+ Release 1.16
+
+Change 820 on 2003/06/17 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Fix uninit warning when sending the ALLO command inside put
+
+Change 819 on 2003/06/13 by <gbarr@pobox.com> (Graham Barr)
+
+ Release 1.15
+
+Change 818 on 2003/06/13 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Fix merge error spotted by Slaven Rezic
+
+Change 817 on 2003/06/13 by <gbarr@pobox.com> (Graham Barr)
+
+ Set INSTALLDIRS to 'perl' for perl >= 5.008
+
+Change 816 on 2003/06/13 by <gbarr@pobox.com> (Graham Barr)
+
+ Add SIGNATURE
+
+Change 806 on 2003/06/02 by <gbarr@pobox.com> (Graham Barr)
+
+ Release 1.14
+
+Change 805 on 2003/06/02 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::Cmd
+ - Avoid process death from SIGPIPE
+
+Change 804 on 2003/05/27 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Support for ALLO command (patch from Matthew N. Andrews)
+
+Change 803 on 2003/05/27 by <gbarr@pobox.com> (Graham Barr)
+
+ libnetFAQ
+ - Fix URLs
+
+Change 802 on 2003/05/21 by <gbarr@pobox.com> (Graham Barr)
+
+ Use read/print instead of sysread/syswrite for local files
+ so CRLF translation happens if it needs to
+
+Change 801 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP, Net::NNTP
+ - doc updates from Jarkko
+
+Change 800 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::Domain
+ - Look in environment on VMS for domainname
+ (patch from Michael Cartmell)
+
+Change 799 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::SMTP
+ - Allow multiple hosts to be passed to new() as an array reference
+
+Change 798 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Add some error checking to the examples in the SYNOPSIS
+
+Change 797 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::SMTP
+ - Support MTAs with broken HELO response
+ (patch from Michael Driscoll)
+
+Change 796 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::POP3
+ - Add small example to SYNOPSIS
+
+Change 795 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::NNTP
+ - Add post clarifications to pod
+
+Change 794 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::SMTP, Net::Cmd
+ - Support for BINARYMIME
+ (patch from Richard Coles)
+
+Change 793 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Allow the firewall type to be specified in Net::Config
+ (patch from Philip Newton)
+
+Change 792 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::SMTP
+ - Fixes to the DSN parameter to mail()
+ (patch from Rafael Garcia-Suarez)
+
+Change 791 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP::A
+ - Fix CRLF translation in write()
+
+Change 790 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::Cmd
+ - Improve performance of CRLF translation when sending data
+
+Change 789 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::SMTP
+ - Make the use of email address extraction configurable. By default
+ it is now back how it was
+
+Change 788 on 2003/05/20 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::NNTP
+ - Prevent instance methods being called as class methods when debug is turned on
+
+Change 772 on 2003/03/03 by <gbarr@pobox.com> (Graham Barr)
+
+ Release 1.13
+
+Change 755 on 2002/11/03 by <gbarr@pobox.com> (Graham Barr)
+
+ Fix typo
+
+Change 749 on 2002/09/23 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::POP3
+ - Make more compilant. +OK and -ERR responses do not have to be followed
+ by a space.
+
+Change 748 on 2002/09/23 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Fix unique name extraction to pick up name on initial
+ response, not just the final response
+
+Change 737 on 2002/07/18 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::Cmd
+ - Compatability fix for 5.004
+
+Change 736 on 2002/07/16 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::Cmd
+ - Ensure all debug output is via ->debug_print
+
+Change 735 on 2002/07/15 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::FTP
+ - Allow the user to specify a local address to use for sockets
+
+Change 734 on 2002/07/15 by <gbarr@pobox.com> (Graham Barr)
+
+ Net::SMTP
+ - Avoid extra spaces on the end of the AUTH command
+
+Change 728 on 2002/05/28 by <gbarr@pobox.com> (Graham Barr)
+
+ Release 1.12
+
Change 727 on 2002/05/28 by <gbarr@pobox.com> (Graham Barr)
Net::SMTP
diff --git a/gnu/usr.bin/perl/lib/Net/Cmd.pm b/gnu/usr.bin/perl/lib/Net/Cmd.pm
index 9093fcd3a2f..6899a973ef4 100644
--- a/gnu/usr.bin/perl/lib/Net/Cmd.pm
+++ b/gnu/usr.bin/perl/lib/Net/Cmd.pm
@@ -1,4 +1,4 @@
-# Net::Cmd.pm $Id: //depot/libnet/Net/Cmd.pm#28 $
+# Net::Cmd.pm $Id: //depot/libnet/Net/Cmd.pm#33 $
#
# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
# This program is free software; you can redistribute it and/or
@@ -21,7 +21,7 @@ BEGIN {
}
}
-$VERSION = "2.21";
+$VERSION = "2.24";
@ISA = qw(Exporter);
@EXPORT = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
@@ -73,7 +73,6 @@ sub _print_isa
my @do = ($pkg);
my %spc = ( $pkg , "");
- print STDERR "\n";
while ($pkg = shift @do)
{
next if defined $done{$pkg};
@@ -85,7 +84,7 @@ sub _print_isa
: "";
my $spc = $spc{$pkg};
- print STDERR "$cmd: ${spc}${pkg}${v}\n";
+ $cmd->debug_print(1,"${spc}${pkg}${v}\n");
if(@{"${pkg}::ISA"})
{
@@ -93,8 +92,6 @@ sub _print_isa
unshift(@do, @{"${pkg}::ISA"});
}
}
-
- print STDERR "\n";
}
sub debug
@@ -201,7 +198,7 @@ sub command
$cmd->dataend()
- if(exists ${*$cmd}{'net_cmd_lastch'});
+ if(exists ${*$cmd}{'net_cmd_need_crlf'});
if (scalar(@_))
{
@@ -395,32 +392,36 @@ sub datasend
return 0 unless defined(fileno($cmd));
- return 1
- unless length($line);
-
- if($cmd->debug)
- {
- my $b = "$cmd>>> ";
- print STDERR $b,join("\n$b",split(/\n/,$line)),"\n";
+ unless (length $line) {
+ # Even though we are not sending anything, the fact we were
+ # called means that dataend needs to be called before the next
+ # command, which happens of net_cmd_need_crlf exists
+ ${*$cmd}{'net_cmd_need_crlf'} ||= 0;
+ return 1;
+ }
+
+ if($cmd->debug) {
+ foreach my $b (split(/\n/,$line)) {
+ $cmd->debug_print(1, "$b\n");
+ }
}
- # Translate LF => CRLF, but not if the LF is
- # already preceeded by a CR
- $line =~ s/\G()\n|([^\r\n])\n/$+\015\012/sgo;
-
- ${*$cmd}{'net_cmd_lastch'} ||= " ";
- $line = ${*$cmd}{'net_cmd_lastch'} . $line;
+ $line =~ s/\r?\n/\r\n/sg;
+ $line =~ tr/\r\n/\015\012/ unless "\r" eq "\015";
$line =~ s/(\012\.)/$1./sog;
+ $line =~ s/^\./../ unless ${*$cmd}{'net_cmd_need_crlf'};
- ${*$cmd}{'net_cmd_lastch'} = substr($line,-1,1);
+ ${*$cmd}{'net_cmd_need_crlf'} = substr($line,-1,1) ne "\012";
- my $len = length($line) - 1;
- my $offset = 1;
+ my $len = length($line);
+ my $offset = 0;
my $win = "";
vec($win,fileno($cmd),1) = 1;
my $timeout = $cmd->timeout || undef;
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
while($len)
{
my $wout;
@@ -445,34 +446,73 @@ sub datasend
1;
}
-sub dataend
+sub rawdatasend
{
my $cmd = shift;
+ my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_;
+ my $line = join("" ,@$arr);
return 0 unless defined(fileno($cmd));
return 1
- unless(exists ${*$cmd}{'net_cmd_lastch'});
+ unless length($line);
- if(${*$cmd}{'net_cmd_lastch'} eq "\015")
+ if($cmd->debug)
{
- syswrite($cmd,"\012",1);
- print STDERR "\n"
- if($cmd->debug);
+ my $b = "$cmd>>> ";
+ print STDERR $b,join("\n$b",split(/\n/,$line)),"\n";
}
- elsif(${*$cmd}{'net_cmd_lastch'} ne "\012")
+
+ my $len = length($line);
+ my $offset = 0;
+ my $win = "";
+ vec($win,fileno($cmd),1) = 1;
+ my $timeout = $cmd->timeout || undef;
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+ while($len)
{
- syswrite($cmd,"\015\012",2);
- print STDERR "\n"
- if($cmd->debug);
+ my $wout;
+ if (select(undef,$wout=$win, undef, $timeout) > 0)
+ {
+ my $w = syswrite($cmd, $line, $len, $offset);
+ unless (defined($w))
+ {
+ carp("$cmd: $!") if $cmd->debug;
+ return undef;
+ }
+ $len -= $w;
+ $offset += $w;
+ }
+ else
+ {
+ carp("$cmd: Timeout") if($cmd->debug);
+ return undef;
+ }
}
- print STDERR "$cmd>>> .\n"
+ 1;
+}
+
+sub dataend
+{
+ my $cmd = shift;
+
+ return 0 unless defined(fileno($cmd));
+
+ return 1
+ unless(exists ${*$cmd}{'net_cmd_need_crlf'});
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+ syswrite($cmd,"\015\012",2)
+ if ${*$cmd}{'net_cmd_need_crlf'};
+
+ $cmd->debug_print(1, ".\n")
if($cmd->debug);
syswrite($cmd,".\015\012",3);
- delete ${*$cmd}{'net_cmd_lastch'};
+ delete ${*$cmd}{'net_cmd_need_crlf'};
$cmd->response() == CMD_OK;
}
@@ -497,7 +537,7 @@ sub TIEHANDLE {
# end-of-file when the dot is encountered.
sub READ {
my $cmd = shift;
- my (undef,$len,$offset) = @_;
+ my ($len,$offset) = @_[1,2];
return unless exists ${*$cmd}{'net_cmd_readbuf'};
my $done = 0;
while (!$done and length(${*$cmd}{'net_cmd_readbuf'}) < $len) {
@@ -677,6 +717,11 @@ some C<debug_print> calls into your method.
Unget a line of text from the server.
+=item rawdatasend ( DATA )
+
+Send data to the remote server without performing any conversions. C<DATA>
+is a scalar.
+
=item read_until_dot ()
Read data from the remote server until a line consisting of a single '.'.
@@ -714,6 +759,6 @@ it under the same terms as Perl itself.
=for html <hr>
-I<$Id: //depot/libnet/Net/Cmd.pm#28 $>
+I<$Id: //depot/libnet/Net/Cmd.pm#33 $>
=cut
diff --git a/gnu/usr.bin/perl/lib/Net/Domain.pm b/gnu/usr.bin/perl/lib/Net/Domain.pm
index b79ec8fa073..40ad2a8c9c3 100644
--- a/gnu/usr.bin/perl/lib/Net/Domain.pm
+++ b/gnu/usr.bin/perl/lib/Net/Domain.pm
@@ -16,7 +16,7 @@ use Net::Config;
@ISA = qw(Exporter);
@EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
-$VERSION = "2.17"; # $Id: //depot/libnet/Net/Domain.pm#19 $
+$VERSION = "2.19"; # $Id: //depot/libnet/Net/Domain.pm#21 $
my($host,$domain,$fqdn) = (undef,undef,undef);
@@ -164,14 +164,20 @@ sub _hostdomain {
: undef;
};
+ if ( $^O eq 'VMS' ) {
+ $dom ||= $ENV{'TCPIP$INET_DOMAIN'}
+ || $ENV{'UCX$INET_DOMAIN'};
+ }
+
chop($dom = `domainname 2>/dev/null`)
unless(defined $dom || $^O =~ /^(?:cygwin|MSWin32)/);
if(defined $dom) {
my @h = ();
+ $dom =~ s/^\.+//;
while(length($dom)) {
push(@h, "$host.$dom");
- $dom =~ s/^[^.]+.//;
+ $dom =~ s/^[^.]+.+// or last;
}
unshift(@hosts,@h);
}
@@ -331,6 +337,6 @@ it under the same terms as Perl itself.
=for html <hr>
-I<$Id: //depot/libnet/Net/Domain.pm#19 $>
+I<$Id: //depot/libnet/Net/Domain.pm#21 $>
=cut
diff --git a/gnu/usr.bin/perl/lib/Net/FTP/A.pm b/gnu/usr.bin/perl/lib/Net/FTP/A.pm
index 764e915883f..d0688280fc6 100644
--- a/gnu/usr.bin/perl/lib/Net/FTP/A.pm
+++ b/gnu/usr.bin/perl/lib/Net/FTP/A.pm
@@ -1,4 +1,4 @@
-## $Id: //depot/libnet/Net/FTP/A.pm#16 $
+## $Id: //depot/libnet/Net/FTP/A.pm#17 $
## Package to read/write on ASCII data connections
##
@@ -10,7 +10,7 @@ use Carp;
require Net::FTP::dataconn;
@ISA = qw(Net::FTP::dataconn);
-$VERSION = "1.15";
+$VERSION = "1.16";
sub read {
my $data = shift;
@@ -71,7 +71,7 @@ sub write {
my $size = shift || croak 'write($buf,$size,[$timeout])';
my $timeout = @_ ? shift : $data->timeout;
- (my $tmp = substr($buf,0,$size)) =~ s/\n/\015\012/sg;
+ (my $tmp = substr($buf,0,$size)) =~ s/\r?\n/\015\012/sg;
# If the remote server has closed the connection we will be signal'd
# when we write. This can happen if the disk on the remote server fills up
diff --git a/gnu/usr.bin/perl/lib/Net/POP3.pm b/gnu/usr.bin/perl/lib/Net/POP3.pm
index 146041624e7..7cd44ef1799 100644
--- a/gnu/usr.bin/perl/lib/Net/POP3.pm
+++ b/gnu/usr.bin/perl/lib/Net/POP3.pm
@@ -13,7 +13,7 @@ use Net::Cmd;
use Carp;
use Net::Config;
-$VERSION = "2.23"; # $Id: //depot/libnet/Net/POP3.pm#22 $
+$VERSION = "2.24"; # $Id: //depot/libnet/Net/POP3.pm#24 $
@ISA = qw(Net::Cmd IO::Socket::INET);
@@ -342,13 +342,13 @@ sub response
$cmd->debug_print(0,$str)
if ($cmd->debug);
- if($str =~ s/^\+OK\s+//io)
+ if($str =~ s/^\+OK\s*//io)
{
$code = "200"
}
else
{
- $str =~ s/^-ERR\s+//io;
+ $str =~ s/^-ERR\s*//io;
}
${*$cmd}{'net_cmd_resp'} = [ $str ];
@@ -373,6 +373,17 @@ Net::POP3 - Post Office Protocol 3 Client class (RFC1939)
$pop = Net::POP3->new('pop3host');
$pop = Net::POP3->new('pop3host', Timeout => 60);
+ if ($pop->login($username, $password) > 0) {
+ my $msgnums = $pop->list; # hashref of msgnum => size
+ foreach my $msgnum (keys %$msgnums) {
+ my $msg = $pop->get($msgnum);
+ print @$msg;
+ $pop->delete($msgnum);
+ }
+ }
+
+ $pop->quit;
+
=head1 DESCRIPTION
This module implements a client interface to the POP3 protocol, enabling
@@ -383,10 +394,6 @@ A new Net::POP3 object must be created with the I<new> method. Once
this has been done, all POP3 commands are accessed via method calls
on the object.
-=head1 EXAMPLES
-
- Need some small examples in here :-)
-
=head1 CONSTRUCTOR
=over 4
@@ -540,6 +547,6 @@ it under the same terms as Perl itself.
=for html <hr>
-I<$Id: //depot/libnet/Net/POP3.pm#22 $>
+I<$Id: //depot/libnet/Net/POP3.pm#24 $>
=cut
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/Changes b/gnu/usr.bin/perl/lib/Net/Ping/Changes
index d8dad1625bd..c4885be968e 100644
--- a/gnu/usr.bin/perl/lib/Net/Ping/Changes
+++ b/gnu/usr.bin/perl/lib/Net/Ping/Changes
@@ -1,6 +1,145 @@
CHANGES
-------
+2.31 Jun 28 14:00 2003
+ - Win32 Compatibility fixes.
+ Patch by mhx-perl@gmx.net (Marcus Holland-Moritz)
+ - Apply bleadperl patch #22204
+ - Add ToS support.
+ Patch by martin@lorensen.dk (Martin Lorensen)
+
+2.30 Apr 18 14:00 2003
+ - Fix select() bug for UDP and ICMP protocols
+ in case packet comes from wrong source or seq.
+ - Allow UDP ping to different IP addresses
+ without instantiating a new object.
+ - Add retrans() method to customize or disable
+ backoff factor for udp pings.
+ Thanks Torgny.Hofstedt@sevenlevels.se
+ - Let ECONNRESET be considered reachable for
+ UDP pings. Now it works for cygwin.
+ Spot by jhi@iki.fi (Jarkko Hietaniemi).
+
+2.29 Apr 12 15:00 2003
+ - Implement "double send()" concept for udp pings.
+ See: <http://perlmonks.thepen.com/42898.html>
+ Thanks to rdw @ perlmonks.
+ - Send multiple udp packets in case of loss.
+ - Exponential backoff code swiped from Net::DNS
+ Thanks to mike@fuhr.org (Michael Fuhr).
+ - Also allows to capture udp ECONNREFUSED condition.
+ - Rename tcp_service_check method to service_check.
+ - Allow demo/fping -s to force service check.
+ Idea by ralijani@yahoo.com (REZA Alijani)
+ - Fix return from ping to be compatible with wantarray
+ when the host doesn't even resolve.
+ - Add udp proto test to test suite.
+ - VMS patch from Craig Berry to pre-check echo.
+ - Apply bleadperl patch (change #18904)
+ - Apply bleadperl patch as explained:
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-
+ porters/2003-03/msg00992.html
+
+2.28 Jan 23 18:00 2003
+ - No new features. Bug fixes only.
+ - Fixed ICMP_STRUCT to work on Big Endian platforms.
+ Thanks to danb@thelittlemacshop.com (Dan Buettner)
+ for testing on Mac OS X 10.2.3 and many others
+ for testing on Big Endian boxes.
+ - Not do binmode(). Causes more problems than helps.
+ - Perl 5.004 compatibility fixes (Spot by Honza).
+
+2.27 Jan 15 23:00 2003
+ - Patch by slebedev@iwl.net (Sergey Lebedev):
+ - 1) Fixed response packet parsing offsets in ping_icmp.
+ - 2) Added icmp_result method.
+ - Patch by radu@netsoft.ro (Radu Greab):
+ - 1) Changed ping_tcp() to use non-blocking connect
+ instead of alarm() interface in order to avoid
+ conflicts with user applications.
+ - 2) Also get rid of all eval {} code in ping_tcp
+ in order to avoid catching SIGALRM trigger and
+ to avoid conflicts with other evals.
+ - 3) Avoid ioctl() syscall for more accurate error
+ detection on non-blocking tcp connects.
+ - 4) Fix fcntl() syntax usage.
+ - Patch by adelton@fi.muni.cz (Honza Pazdziora):
+ - 1) Fix icmp request pack code to be more platform
+ independent regardless of Big/Little Endian.
+ - 2) Use binmode for filehandle in case perl 5.8.0
+ tries to dink with the data stream.
+ - Other changes by Rob Brown:
+ - Fixed ack() failures under certain rare conditions.
+ - Use more appropriate \z instead of $ in regex.
+ - Resolved Cygwin "make test" problems reported by
+ h.m.brand@hccnet.nl (H.Merijn Brand).
+ - Add sending a real ICMP packet in the test suite.
+ - Add Socket to PREREQ_PM (missing on some boxes?)
+ - Adjust syn_forking IPC pipe for fatter Win32 pids.
+ - Better handling of alarm() in test suite for Win32.
+ - Add a DESTROY method to reduce chances of
+ lingering connect-choking children.
+
+2.26 Dec 02 12:00 2002
+ - More compatibility fixes.
+ - Thanks for Solaris bug reports:
+ Paul.Gaborit@enstimac.fr (Paul Gaborit)
+ Jost.Krieger@ruhr-uni-bochum.de (Jost Krieger)
+ - Thanks for Solaris testing box:
+ Gunther.Heintzen@rrze.uni-erlangen.de (Gunther Heintzen)
+ - Solaris ENOTCONN select() for write choke bug.
+ - Thanks for Cygwin bug reports:
+ h.m.brand@hccnet.nl (H.Merijn Brand)
+ - Cygwin "EAGAIN instead of ECONNREFUSED" buttwag.
+
+2.25 Nov 19 12:00 2002
+ - Handle condition where O_NONBLOCK tcp connects
+ immediately fail without EINPROGRESS
+ (certain platforms or SMP optimizations).
+
+2.24 Oct 21 22:00 2002
+ - Compatibility fixes.
+ - Avoid using 127.1.1.1 and 127.2.2.2 because
+ it breaks on some platforms (Irix).
+ - Handle condition where nonblocking tcp connects
+ immediately connect on some platforms
+ (solaris and freebsd) and to be SMP safer.
+ - Win32 $p->ack( $host ) method should now work.
+ - Add ack( $host ) test cases to test suite.
+
+2.23 Oct 18 22:00 2002
+ - Fix ack() fd "each" detection bug.
+ - Add nack() method for OO interface to the
+ reason why the ack() failed.
+ - Fix premature "Timed out" side effect when a
+ different specified ack( $host ) fails.
+ - IO::Socket::INET ephemeral port buttwag
+ hack for the t/450_service.t test.
+ - Documental changes.
+
+2.22 Oct 17 16:00 2002
+ - Add $p->tcp_service_check() method to enforce
+ remote tcp service availability checking.
+ Patch by jef@linuxbe.org (Jean-Francois Dive).
+ - Changed default behavior of "syn" protocol to
+ disabled tcp_service_check instead of enabled.
+ - Win32 compatibility changes ("syn" protocol).
+ - Increase timeouts for tests in case client or
+ server network(s) are busy.
+
+2.21 Oct 14 12:00 2002
+ - Preserve/restore ALRM settings for tcp mode pings.
+ Spot by d@niel-berlin.de (Daniel Berlin)
+ - Can now select device for udp and icmp protocols.
+ Patch by sarfata@altern.org (Thomas Sarlandie).
+ - Add new "syn" protocol to allow for mass parallel
+ (syncronous) TCP service reachability checking.
+ - Add ack() method to utilize non-blocking connect
+ (SYN/ACK) feature of the "syn" protocol.
+ - Add demo/fping script as a "syn" demonstration.
+ - Compatibiliy patches for cygwin.
+ Spot by frazee.23@osu.edu (Joseph Frazee)
+
2.20 Jun 20 10:00 2002
- Perl 5.8.0 compatibility stuff.
Spot by dcd@tc.fluke.com (David Dyck).
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/110_icmp_inst.t b/gnu/usr.bin/perl/lib/Net/Ping/t/110_icmp_inst.t
index b0ee1b74f3f..cdb7219af95 100644
--- a/gnu/usr.bin/perl/lib/Net/Ping/t/110_icmp_inst.t
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/110_icmp_inst.t
@@ -15,7 +15,7 @@ plan tests => 2;
# Everything loaded fine
ok 1;
-if (($> and $^O ne 'VMS')
+if (($> and $^O ne 'VMS' and $^O ne 'cygwin')
or ($^O eq 'MSWin32'
and Win32::IsWinNT())
or ($^O eq 'VMS'
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/150_syn_inst.t b/gnu/usr.bin/perl/lib/Net/Ping/t/150_syn_inst.t
new file mode 100644
index 00000000000..df85d460fe5
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/150_syn_inst.t
@@ -0,0 +1,22 @@
+# Test to make sure object can be instantiated for syn protocol.
+
+BEGIN {
+ unless (eval "require Socket") {
+ print "1..0 \# Skip: no Socket\n";
+ exit;
+ }
+ unless (getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+}
+
+use Test;
+use Net::Ping;
+plan tests => 2;
+
+# Everything loaded fine
+ok 1;
+
+my $p = new Net::Ping "syn";
+ok !!$p;
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/190_alarm.t b/gnu/usr.bin/perl/lib/Net/Ping/t/190_alarm.t
new file mode 100644
index 00000000000..a032014d965
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/190_alarm.t
@@ -0,0 +1,54 @@
+# Test to make sure alarm / SIGALM does not interfere
+# with Net::Ping. (This test was derived to ensure
+# compatibility with the "spamassassin" utility.)
+# Based on code written by radu@netsoft.ro (Radu Greab).
+
+BEGIN {
+ unless (eval "require Socket") {
+ print "1..0 \# Skip: no Socket\n";
+ exit;
+ }
+ unless (eval {alarm 0; 1;}) {
+ print "1..0 \# Skip: alarm borks on $^O $^X $] ?\n";
+ exit;
+ }
+ unless (getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+}
+
+use strict;
+use Test;
+use Net::Ping;
+
+plan tests => 6;
+
+# Everything compiled
+ok 1;
+
+eval {
+ my $timeout = 11;
+
+ ok 1; # In eval
+ local $SIG{ALRM} = sub { die "alarm works" };
+ ok 1; # SIGALRM can be set on this platform
+ alarm $timeout;
+ ok 1; # alarm() can be set on this platform
+
+ my $start = time;
+ while (1) {
+ my $ping = Net::Ping->new("tcp", 2);
+ # It does not matter if alive or not
+ $ping->ping("127.0.0.1");
+ $ping->ping("172.29.249.249");
+ die "alarm failed" if time > $start + $timeout + 1;
+ }
+};
+# Got out of "infinite loop" okay
+ok 1;
+
+# Make sure it died for a good excuse
+ok $@ =~ /alarm works/ or die $@;
+
+alarm 0; # Reset alarm
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/200_ping_tcp.t b/gnu/usr.bin/perl/lib/Net/Ping/t/200_ping_tcp.t
index 591c25166f4..2ac2236acf8 100644
--- a/gnu/usr.bin/perl/lib/Net/Ping/t/200_ping_tcp.t
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/200_ping_tcp.t
@@ -11,7 +11,7 @@ BEGIN {
print "1..0 \# Skip: no Socket\n";
exit;
}
- unless (getservbyname('echo', 'udp')) {
+ unless (getservbyname('echo', 'tcp')) {
print "1..0 \# Skip: no echo port\n";
exit;
}
@@ -35,7 +35,7 @@ plan tests => 13;
# Everything loaded fine
ok 1;
-my $p = new Net::Ping "tcp";
+my $p = new Net::Ping "tcp",9;
# new() worked?
ok !!$p;
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/250_ping_hires.t b/gnu/usr.bin/perl/lib/Net/Ping/t/250_ping_hires.t
index 52dae1ba759..91e905fb26b 100644
--- a/gnu/usr.bin/perl/lib/Net/Ping/t/250_ping_hires.t
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/250_ping_hires.t
@@ -57,5 +57,7 @@ my ($ret, $duration) = $p -> ping("localhost");
ok $ret;
# It is extremely likely that the duration contains a decimal
-# point if Time::HiRes is functioning properly.
-ok $duration =~ /\./;
+# point if Time::HiRes is functioning properly, except when it
+# it is fast enough to be "zero".
+print "# duration=[$duration]\n";
+ok $duration =~ /\.|^0$/;
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/300_ping_stream.t b/gnu/usr.bin/perl/lib/Net/Ping/t/300_ping_stream.t
index 270650a2c31..3a2f44409eb 100644
--- a/gnu/usr.bin/perl/lib/Net/Ping/t/300_ping_stream.t
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/300_ping_stream.t
@@ -11,7 +11,14 @@ BEGIN {
print "1..0 \# Skip: no Socket\n";
exit;
}
- unless (getservbyname('echo', 'udp')) {
+ if (my $port = getservbyname('echo', 'tcp')) {
+ socket(*ECHO, &Socket::PF_INET(), &Socket::SOCK_STREAM(), (getprotobyname 'tcp')[2]);
+ unless (connect(*ECHO, scalar &Socket::sockaddr_in($port, &Socket::inet_aton("localhost")))) {
+ print "1..0 \# Skip: loopback tcp echo service is off ($!)\n";
+ exit;
+ }
+ close (*ECHO);
+ } else {
print "1..0 \# Skip: no echo port\n";
exit;
}
@@ -21,11 +28,12 @@ BEGIN {
#
# NOTE:
# The echo service must be enabled on localhost
-# to really test the stream protocol ping.
+# to really test the stream protocol ping. See
+# the end of this document on how to enable it.
use Test;
use Net::Ping;
-plan tests => 12;
+plan tests => 22;
my $p = new Net::Ping "stream";
@@ -33,16 +41,12 @@ my $p = new Net::Ping "stream";
ok !!$p;
# Attempt to connect to the echo port
-if ($p -> ping("localhost")) {
- ok 1;
- # Try several pings while it is connected
- for (1..10) {
- ok $p -> ping("localhost");
- }
-} else {
- # Echo port is off, skip the tests
- for (2..12) { skip "Local echo port is off", 1; }
- exit;
+ok ($p -> ping("localhost"));
+
+# Try several pings while it is connected
+for (1..20) {
+ select (undef,undef,undef,0.1);
+ ok $p -> ping("localhost");
}
__END__
@@ -52,16 +56,19 @@ Just create the following file before restarting xinetd:
/etc/xinetd.d/echo:
-# description: echo service
+# description: An echo server.
service echo
{
- socket_type = stream
- wait = no
- user = root
- server = /bin/cat
- disable = no
+ type = INTERNAL
+ id = echo-stream
+ socket_type = stream
+ protocol = tcp
+ user = root
+ wait = no
+ disable = no
}
+
Or if you are using inetd, before restarting, add
this line to your /etc/inetd.conf:
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/400_ping_syn.t b/gnu/usr.bin/perl/lib/Net/Ping/t/400_ping_syn.t
new file mode 100644
index 00000000000..ae89800d3ab
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/400_ping_syn.t
@@ -0,0 +1,101 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ unless ($ENV{PERL_TEST_Net_Ping}) {
+ print "1..0 # Skip: network dependent test\n";
+ exit;
+ }
+ chdir 't' if -d 't';
+ @INC = qw(../lib);
+ }
+ unless (eval "require Socket") {
+ print "1..0 \# Skip: no Socket\n";
+ exit;
+ }
+ unless (getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+ unless (getservbyname('http', 'tcp')) {
+ print "1..0 \# Skip: no http port\n";
+ exit;
+ }
+}
+
+# Remote network test using syn protocol.
+#
+# NOTE:
+# Network connectivity will be required for all tests to pass.
+# Firewalls may also cause some tests to fail, so test it
+# on a clear network. If you know you do not have a direct
+# connection to remote networks, but you still want the tests
+# to pass, use the following:
+#
+# $ PERL_CORE=1 make test
+
+# Try a few remote servers
+my $webs = {
+ # Hopefully this is never a routeable host
+ "172.29.249.249" => 0,
+
+ # Hopefully all these web ports are open
+ "www.geocities.com." => 1,
+ "www.freeservers.com." => 1,
+ "yahoo.com." => 1,
+ "www.yahoo.com." => 1,
+ "www.about.com." => 1,
+ "www.microsoft.com." => 1,
+ "127.0.0.1" => 1,
+};
+
+use strict;
+use Test;
+use Net::Ping;
+plan tests => ((keys %{ $webs }) * 2 + 3);
+
+# Everything loaded fine
+ok 1;
+
+my $can_alarm = eval {alarm 0; 1;};
+
+sub Alarm {
+ alarm(shift) if $can_alarm;
+}
+
+Alarm(50);
+$SIG{ALRM} = sub {
+ ok 0;
+ die "TIMED OUT!";
+};
+
+my $p = new Net::Ping "syn", 10;
+
+# new() worked?
+ok !!$p;
+
+# Change to use the more common web port.
+# (Make sure getservbyname works in scalar context.)
+ok ($p -> {port_num} = getservbyname("http", "tcp"));
+
+foreach my $host (keys %{ $webs }) {
+ # ping() does dns resolution and
+ # only sends the SYN at this point
+ Alarm(50); # (Plenty for a DNS lookup)
+ if (!ok $p -> ping($host)) {
+ print STDERR "CANNOT RESOLVE $host $p->{bad}->{$host}\n";
+ }
+}
+
+Alarm(20);
+while (my $host = $p->ack()) {
+ if (!ok $webs->{$host}) {
+ print STDERR "SUPPOSED TO BE DOWN: http://$host/\n";
+ }
+ delete $webs->{$host};
+}
+
+Alarm(0);
+foreach my $host (keys %{ $webs }) {
+ if (!ok !$webs->{$host}) {
+ print STDERR "DOWN: http://$host/ [",($p->{bad}->{$host} || ""),"]\n";
+ }
+}
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/410_syn_host.t b/gnu/usr.bin/perl/lib/Net/Ping/t/410_syn_host.t
new file mode 100644
index 00000000000..8374b206232
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/410_syn_host.t
@@ -0,0 +1,105 @@
+# Same as 400_ping_syn.t but testing ack( $host ) instead of ack( ).
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ unless ($ENV{PERL_TEST_Net_Ping}) {
+ print "1..0 # Skip: network dependent test\n";
+ exit;
+ }
+ chdir 't' if -d 't';
+ @INC = qw(../lib);
+ }
+ unless (eval "require Socket") {
+ print "1..0 \# Skip: no Socket\n";
+ exit;
+ }
+ unless (getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+ unless (getservbyname('http', 'tcp')) {
+ print "1..0 \# Skip: no http port\n";
+ exit;
+ }
+}
+
+# Remote network test using syn protocol.
+#
+# NOTE:
+# Network connectivity will be required for all tests to pass.
+# Firewalls may also cause some tests to fail, so test it
+# on a clear network. If you know you do not have a direct
+# connection to remote networks, but you still want the tests
+# to pass, use the following:
+#
+# $ PERL_CORE=1 make test
+
+# Try a few remote servers
+my $webs = {
+ # Hopefully this is never a routeable host
+ "172.29.249.249" => 0,
+
+ # Hopefully all these web ports are open
+ "www.geocities.com." => 1,
+ "www.freeservers.com." => 1,
+ "yahoo.com." => 1,
+ "www.yahoo.com." => 1,
+ "www.about.com." => 1,
+ "www.microsoft.com." => 1,
+ "127.0.0.1" => 1,
+};
+
+use strict;
+use Test;
+use Net::Ping;
+plan tests => ((keys %{ $webs }) * 2 + 3);
+
+# Everything loaded fine
+ok 1;
+
+my $can_alarm = eval {alarm 0; 1;};
+
+sub Alarm {
+ alarm(shift) if $can_alarm;
+}
+
+Alarm(50);
+$SIG{ALRM} = sub {
+ ok 0;
+ die "TIMED OUT!";
+};
+
+my $p = new Net::Ping "syn", 10;
+
+# new() worked?
+ok !!$p;
+
+# Change to use the more common web port.
+# (Make sure getservbyname works in scalar context.)
+ok ($p -> {port_num} = getservbyname("http", "tcp"));
+
+foreach my $host (keys %{ $webs }) {
+ # ping() does dns resolution and
+ # only sends the SYN at this point
+ Alarm(50); # (Plenty for a DNS lookup)
+ if (!ok($p -> ping($host))) {
+ print STDERR "CANNOT RESOLVE $host $p->{bad}->{$host}\n";
+ }
+}
+
+Alarm(20);
+foreach my $host (sort keys %{ $webs }) {
+ my $on = $p->ack($host);
+ if (!ok (($on && $webs->{$host}) ||
+ (!$on && !$webs->{$host}))) {
+ if ($on) {
+ print STDERR "SUPPOSED TO BE DOWN: http://$host/\n";
+ } else {
+ print STDERR "DOWN: http://$host/ [",($p->{bad}->{$host} || ""),"]\n";
+ }
+ }
+ delete $webs->{$host};
+ Alarm(20);
+}
+
+Alarm(0);
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/450_service.t b/gnu/usr.bin/perl/lib/Net/Ping/t/450_service.t
new file mode 100644
index 00000000000..006bf64efb3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/450_service.t
@@ -0,0 +1,186 @@
+# Testing service_check method using tcp and syn protocols.
+
+BEGIN {
+ unless (eval "require IO::Socket") {
+ print "1..0 \# Skip: no IO::Socket\n";
+ exit;
+ }
+ unless (getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+}
+
+use strict;
+use Test;
+use Net::Ping;
+
+# I'm lazy so I'll just use IO::Socket
+# for the TCP Server stuff instead of doing
+# all that direct socket() junk manually.
+
+plan tests => 26, ($^O eq 'MSWin32' ? (todo => [18]) : ());
+
+# Everything loaded fine
+ok 1;
+
+# Start a tcp listen server on ephemeral port
+my $sock1 = new IO::Socket::INET
+ LocalAddr => "127.0.0.1",
+ Proto => "tcp",
+ Listen => 8,
+ or warn "bind: $!";
+
+# Make sure it worked.
+ok !!$sock1;
+
+# Start listening on another ephemeral port
+my $sock2 = new IO::Socket::INET
+ LocalAddr => "127.0.0.1",
+ Proto => "tcp",
+ Listen => 8,
+ or warn "bind: $!";
+
+# Make sure it worked too.
+ok !!$sock2;
+
+my $port1 = $sock1->sockport;
+ok $port1;
+
+my $port2 = $sock2->sockport;
+ok $port2;
+
+# Make sure the sockets are listening on different ports.
+ok ($port1 != $port2);
+
+$sock2->close;
+
+# This is how it should be:
+# 127.0.0.1:$port1 - service ON
+# 127.0.0.1:$port2 - service OFF
+
+#####
+# First, we test using the "tcp" protocol.
+# (2 seconds should be long enough to connect to loopback.)
+my $p = new Net::Ping "tcp", 2;
+
+# new() worked?
+ok !!$p;
+
+# Disable service checking
+$p->service_check(0);
+
+# Try on the first port
+$p->{port_num} = $port1;
+
+# Make sure it is reachable
+ok $p -> ping("127.0.0.1");
+
+# Try on the other port
+$p->{port_num} = $port2;
+
+# Make sure it is reachable
+ok $p -> ping("127.0.0.1");
+
+
+
+# Enable service checking
+$p->service_check(1);
+
+# Try on the first port
+$p->{port_num} = $port1;
+
+# Make sure service is on
+ok $p -> ping("127.0.0.1");
+
+# Try on the other port
+$p->{port_num} = $port2;
+
+# Make sure service is off
+ok !$p -> ping("127.0.0.1");
+
+# test 11 just finished.
+
+#####
+# Lastly, we test using the "syn" protocol.
+$p = new Net::Ping "syn", 2;
+
+# new() worked?
+ok !!$p;
+
+# Disable service checking
+$p->service_check(0);
+
+# Try on the first port
+$p->{port_num} = $port1;
+
+# Send SYN
+if (!ok $p -> ping("127.0.0.1")) {warn "ERRNO: $!";}
+
+# IP should be reachable
+ok $p -> ack();
+# No more sockets?
+ok !$p -> ack();
+
+###
+# Get a fresh object
+$p = new Net::Ping "syn", 2;
+
+# new() worked?
+ok !!$p;
+
+# Disable service checking
+$p->service_check(0);
+
+# Try on the other port
+$p->{port_num} = $port2;
+
+# Send SYN
+if (!ok $p -> ping("127.0.0.1")) {warn "ERRNO: $!";}
+
+# IP should still be reachable
+ok $p -> ack();
+# No more sockets?
+ok !$p -> ack();
+
+
+###
+# Get a fresh object
+$p = new Net::Ping "syn", 2;
+
+# new() worked?
+ok !!$p;
+
+# Enable service checking
+$p->service_check(1);
+
+# Try on the first port
+$p->{port_num} = $port1;
+
+# Send SYN
+ok $p -> ping("127.0.0.1");
+
+# Should have service on
+ok ($p -> ack(),"127.0.0.1");
+# No more good sockets?
+ok !$p -> ack();
+
+
+###
+# Get a fresh object
+$p = new Net::Ping "syn", 2;
+
+# new() worked?
+ok !!$p;
+
+# Enable service checking
+$p->service_check(1);
+
+# Try on the other port
+$p->{port_num} = $port2;
+
+# Send SYN
+if (!ok $p -> ping("127.0.0.1")) {warn "ERRNO: $!";}
+
+# No sockets should have service on
+ok !$p -> ack();
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/500_ping_icmp.t b/gnu/usr.bin/perl/lib/Net/Ping/t/500_ping_icmp.t
new file mode 100644
index 00000000000..6b6c3eff27d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/500_ping_icmp.t
@@ -0,0 +1,29 @@
+# Test to perform icmp protocol testing.
+# Root access is required.
+
+BEGIN {
+ unless (eval "require Socket") {
+ print "1..0 \# Skip: no Socket\n";
+ exit;
+ }
+}
+
+use Test;
+use Net::Ping;
+plan tests => 2;
+
+# Everything loaded fine
+ok 1;
+
+if (($> and $^O ne 'VMS' and $^O ne 'cygwin')
+ or ($^O eq 'MSWin32'
+ and Win32::IsWinNT())
+ or ($^O eq 'VMS'
+ and (`write sys\$output f\$privilege("SYSPRV")` =~ m/FALSE/))) {
+ skip "icmp ping requires root privileges.", 1;
+} elsif ($^O eq 'MacOS') {
+ skip "icmp protocol not supported.", 1;
+} else {
+ my $p = new Net::Ping "icmp";
+ ok $p->ping("127.0.0.1");
+}
diff --git a/gnu/usr.bin/perl/lib/Net/Ping/t/510_ping_udp.t b/gnu/usr.bin/perl/lib/Net/Ping/t/510_ping_udp.t
new file mode 100644
index 00000000000..35f44fdd9cf
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Net/Ping/t/510_ping_udp.t
@@ -0,0 +1,22 @@
+# Test to perform udp protocol testing.
+
+BEGIN {
+ unless (eval "require Socket") {
+ print "1..0 \# Skip: no Socket\n";
+ exit;
+ }
+ unless (getservbyname('echo', 'tcp')) {
+ print "1..0 \# Skip: no echo port\n";
+ exit;
+ }
+}
+
+use Test;
+use Net::Ping;
+plan tests => 2;
+
+# Everything loaded fine
+ok 1;
+
+my $p = new Net::Ping "udp";
+ok $p->ping("127.0.0.1");
diff --git a/gnu/usr.bin/perl/lib/Net/README.libnet b/gnu/usr.bin/perl/lib/Net/README.libnet
index fd115a21ba8..ca47fe53ab3 100644
--- a/gnu/usr.bin/perl/lib/Net/README.libnet
+++ b/gnu/usr.bin/perl/lib/Net/README.libnet
@@ -3,7 +3,7 @@ and consistent programming interface (API) to the client side
of various protocols used in the internet community.
For details of each protocol please refer to the RFC. RFC's
-can be found a various places on the WEB, for a staring
+can be found a various places on the WEB, for a starting
point look at:
http://www.yahoo.com/Computers_and_Internet/Standards/RFCs/
diff --git a/gnu/usr.bin/perl/lib/Net/SMTP.pm b/gnu/usr.bin/perl/lib/Net/SMTP.pm
index 4da0d7878ed..be64037403a 100644
--- a/gnu/usr.bin/perl/lib/Net/SMTP.pm
+++ b/gnu/usr.bin/perl/lib/Net/SMTP.pm
@@ -16,7 +16,7 @@ use IO::Socket;
use Net::Cmd;
use Net::Config;
-$VERSION = "2.24"; # $Id: //depot/libnet/Net/SMTP.pm#25 $
+$VERSION = "2.26"; # $Id: //depot/libnet/Net/SMTP.pm#31 $
@ISA = qw(Net::Cmd IO::Socket::INET);
@@ -26,11 +26,11 @@ sub new
my $type = ref($self) || $self;
my $host = shift if @_ % 2;
my %arg = @_;
- my $hosts = defined $host ? [ $host ] : $NetConfig{smtp_hosts};
+ my $hosts = defined $host ? $host : $NetConfig{smtp_hosts};
my $obj;
my $h;
- foreach $h (@{$hosts})
+ foreach $h (@{ref($hosts) ? $hosts : [ $hosts ]})
{
$obj = $type->SUPER::new(PeerAddr => ($host = $h),
PeerPort => $arg{Port} || 'smtp(25)',
@@ -56,6 +56,7 @@ sub new
return undef;
}
+ ${*$obj}{'net_smtp_exact_addr'} = $arg{ExactAddresses};
${*$obj}{'net_smtp_host'} = $host;
(${*$obj}{'net_smtp_banner'}) = $obj->message;
@@ -126,9 +127,12 @@ sub auth {
# todo that we would really need to change the ISA hierarchy
# so we dont inherit from IO::Socket, but instead hold it in an attribute
- my @cmd = ("AUTH", $client->mechanism, MIME::Base64::encode_base64($str,''));
+ my @cmd = ("AUTH", $client->mechanism);
my $code;
+ push @cmd, MIME::Base64::encode_base64($str,'')
+ if defined $str and length $str;
+
while (($code = $self->command(@cmd)->response()) == CMD_MORE) {
@cmd = (MIME::Base64::encode_base64(
$client->client_step(
@@ -164,9 +168,10 @@ sub hello
if $ok = $me->_HELO($domain);
}
- $ok && $msg[0] =~ /\A\s*(\S+)/
- ? $1
- : undef;
+ return undef unless $ok;
+
+ $msg[0] =~ /\A\s*(\S+)/;
+ return ($1 || " ");
}
sub supports {
@@ -180,16 +185,25 @@ sub supports {
}
sub _addr {
+ my $self = shift;
my $addr = shift;
$addr = "" unless defined $addr;
- $addr =~ s/^\s*<?\s*|\s*>?\s*$//sg;
+
+ if (${*$self}{'net_smtp_exact_addr'}) {
+ return $1 if $addr =~ /^\s*(<.*>)\s*$/s;
+ }
+ else {
+ return $1 if $addr =~ /(<[^>]*>)/;
+ $addr =~ s/^\s+|\s+$//sg;
+ }
+
"<$addr>";
}
sub mail
{
my $me = shift;
- my $addr = _addr(shift);
+ my $addr = _addr($me, shift);
my $opts = "";
if(@_)
@@ -217,7 +231,7 @@ sub mail
{
if(exists $esmtp->{DSN})
{
- $opts .= " RET=" . uc $v
+ $opts .= " RET=" . ((uc($v) eq "FULL") ? "FULL" : "HDRS");
}
else
{
@@ -227,13 +241,36 @@ sub mail
if(defined($v = delete $opt{Bits}))
{
- if(exists $esmtp->{'8BITMIME'})
+ if($v eq "8")
+ {
+ if(exists $esmtp->{'8BITMIME'})
+ {
+ $opts .= " BODY=8BITMIME";
+ }
+ else
+ {
+ carp 'Net::SMTP::mail: 8BITMIME option not supported by host';
+ }
+ }
+ elsif($v eq "binary")
+ {
+ if(exists $esmtp->{'BINARYMIME'} && exists $esmtp->{'CHUNKING'})
+ {
+ $opts .= " BODY=BINARYMIME";
+ ${*$me}{'net_smtp_chunking'} = 1;
+ }
+ else
+ {
+ carp 'Net::SMTP::mail: BINARYMIME option not supported by host';
+ }
+ }
+ elsif(exists $esmtp->{'8BITMIME'} or exists $esmtp->{'BINARYMIME'})
{
- $opts .= $v == 8 ? " BODY=8BITMIME" : " BODY=7BIT"
+ $opts .= " BODY=7BIT";
}
else
{
- carp 'Net::SMTP::mail: 8BITMIME option not supported by host';
+ carp 'Net::SMTP::mail: 8BITMIME and BINARYMIME options not supported by host';
}
}
@@ -241,7 +278,7 @@ sub mail
{
if(exists $esmtp->{CHECKPOINT})
{
- $opts .= " TRANSID=" . _addr($v);
+ $opts .= " TRANSID=" . _addr($me, $v);
}
else
{
@@ -276,9 +313,9 @@ sub mail
$me->_MAIL("FROM:".$addr.$opts);
}
-sub send { shift->_SEND("FROM:" . _addr($_[0])) }
-sub send_or_mail { shift->_SOML("FROM:" . _addr($_[0])) }
-sub send_and_mail { shift->_SAML("FROM:" . _addr($_[0])) }
+sub send { my $me = shift; $me->_SEND("FROM:" . _addr($me, $_[0])) }
+sub send_or_mail { my $me = shift; $me->_SOML("FROM:" . _addr($me, $_[0])) }
+sub send_and_mail { my $me = shift; $me->_SAML("FROM:" . _addr($me, $_[0])) }
sub reset
{
@@ -335,7 +372,7 @@ sub recipient
my $addr;
foreach $addr (@_)
{
- if($smtp->_RCPT("TO:" . _addr($addr) . $opts)) {
+ if($smtp->_RCPT("TO:" . _addr($smtp, $addr) . $opts)) {
push(@ok,$addr) if $skip_bad;
}
elsif(!$skip_bad) {
@@ -356,10 +393,51 @@ sub data
{
my $me = shift;
- my $ok = $me->_DATA() && $me->datasend(@_);
+ if(exists ${*$me}{'net_smtp_chunking'})
+ {
+ carp 'Net::SMTP::data: CHUNKING extension in use, must call bdat instead';
+ }
+ else
+ {
+ my $ok = $me->_DATA() && $me->datasend(@_);
- $ok && @_ ? $me->dataend
- : $ok;
+ $ok && @_ ? $me->dataend
+ : $ok;
+ }
+}
+
+sub bdat
+{
+ my $me = shift;
+
+ if(exists ${*$me}{'net_smtp_chunking'})
+ {
+ my $data = shift;
+
+ $me->_BDAT(length $data) && $me->rawdatasend($data) &&
+ $me->response() == CMD_OK;
+ }
+ else
+ {
+ carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead';
+ }
+}
+
+sub bdatlast
+{
+ my $me = shift;
+
+ if(exists ${*$me}{'net_smtp_chunking'})
+ {
+ my $data = shift;
+
+ $me->_BDAT(length $data, "LAST") && $me->rawdatasend($data) &&
+ $me->response() == CMD_OK;
+ }
+ else
+ {
+ carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead';
+ }
}
sub datafh {
@@ -418,6 +496,7 @@ sub _RSET { shift->command("RSET")->response() == CMD_OK }
sub _NOOP { shift->command("NOOP")->response() == CMD_OK }
sub _QUIT { shift->command("QUIT")->response() == CMD_OK }
sub _DATA { shift->command("DATA")->response() == CMD_MORE }
+sub _BDAT { shift->command("BDAT", @_) }
sub _TURN { shift->unsupported(@_); }
sub _ETRN { shift->command("ETRN", @_)->response() == CMD_OK }
sub _AUTH { shift->command("AUTH", @_)->response() == CMD_OK }
@@ -491,6 +570,9 @@ known as mailhost:
This is the constructor for a new Net::SMTP object. C<HOST> is the
name of the remote host to which an SMTP connection is required.
+If C<HOST> is an array reference then each value will be attempted
+in turn until a connection is made.
+
If C<HOST> is not given, then the C<SMTP_Host> specified in C<Net::Config>
will be used.
@@ -507,6 +589,10 @@ to IO::Socket to allow binding the socket to a local port.
B<Timeout> - Maximum time, in seconds, to wait for a response from the
SMTP server (default: 120)
+B<ExactAddresses> - If true the all ADDRESS arguments must be as
+defined by C<addr-spec> in RFC2822. If not given, or false, then
+Net::SMTP will attempt to extract the address from the value passed.
+
B<Debug> - Enable debugging information
@@ -572,11 +658,13 @@ The C<mail> method can some additional ESMTP OPTIONS which is passed
in hash like fashion, using key and value pairs. Possible options are:
Size => <bytes>
- Return => <???>
- Bits => "7" | "8"
+ Return => "FULL" | "HDRS"
+ Bits => "7" | "8" | "binary"
Transaction => <ADDRESS>
Envelope => <ENVID>
+The C<Return> and C<Envelope> parameters are used for DSN (Delivery
+Status Notification).
=item reset ()
@@ -647,8 +735,15 @@ Send the QUIT command to the remote SMTP server and close the socket connection.
=head1 ADDRESSES
-All methods that accept addresses expect the address to be a valid rfc2821-quoted address, although
-Net::SMTP will accept accept the address surrounded by angle brackets.
+Net::SMTP attempts to DWIM with addresses that are passed. For
+example an application might extract The From: line from an email
+and pass that to mail(). While this may work, it is not reccomended.
+The application should really use a module like L<Mail::Address>
+to extract the mail address and pass that.
+
+If C<ExactAddresses> is passed to the contructor, then addresses
+should be a valid rfc2821-quoted address, although Net::SMTP will
+accept accept the address surrounded by angle brackets.
funny user@domain WRONG
"funny user"@domain RIGHT, recommended
@@ -670,6 +765,6 @@ it under the same terms as Perl itself.
=for html <hr>
-I<$Id: //depot/libnet/Net/SMTP.pm#25 $>
+I<$Id: //depot/libnet/Net/SMTP.pm#31 $>
=cut
diff --git a/gnu/usr.bin/perl/lib/Net/hostent.t b/gnu/usr.bin/perl/lib/Net/hostent.t
index 9c6fa1318e8..2616b56425d 100644
--- a/gnu/usr.bin/perl/lib/Net/hostent.t
+++ b/gnu/usr.bin/perl/lib/Net/hostent.t
@@ -14,8 +14,8 @@ BEGIN {
{
plan skip_all => "Test uses Socket, Socket not built";
}
- if ($^O eq 'MacOS') {
- plan skip_all => "Test relies on resolution of localhost, fails on Mac OS";
+ if ($^O eq 'MacOS' || ($^O eq 'irix' && $Config{osvers} == 5)) {
+ plan skip_all => "Test relies on resolution of localhost, fails on $^O ($Config{osvers})";
}
}
diff --git a/gnu/usr.bin/perl/lib/Net/libnetFAQ.pod b/gnu/usr.bin/perl/lib/Net/libnetFAQ.pod
index d370e8462fc..9858f2b5e19 100644
--- a/gnu/usr.bin/perl/lib/Net/libnetFAQ.pod
+++ b/gnu/usr.bin/perl/lib/Net/libnetFAQ.pod
@@ -9,7 +9,7 @@ libnetFAQ - libnet Frequently Asked Questions
This document is distributed with the libnet distribution, and is also
available on the libnet web page at
- http://www.pobox.com/~gbarr/libnet/
+ http://search.cpan.org/~gbarr/libnet/
=head2 How to contribute to this document
@@ -70,7 +70,7 @@ in
The latest release and information is also available on the libnet web page
at
- http://www.pobox.com/~gbarr/libnet/
+ http://search.cpan.org/~gbarr/libnet/
=head1 Using Net::FTP
@@ -303,5 +303,5 @@ All rights reserved.
=for html <hr>
-I<$Id: //depot/libnet/Net/libnetFAQ.pod#5 $>
+I<$Id: //depot/libnet/Net/libnetFAQ.pod#6 $>
diff --git a/gnu/usr.bin/perl/lib/PerlIO.pm b/gnu/usr.bin/perl/lib/PerlIO.pm
index 1ee5b888154..c7b9f1312b5 100644
--- a/gnu/usr.bin/perl/lib/PerlIO.pm
+++ b/gnu/usr.bin/perl/lib/PerlIO.pm
@@ -1,6 +1,6 @@
package PerlIO;
-our $VERSION = '1.01';
+our $VERSION = '1.02';
# Map layer name to package that defines it
our %alias;
@@ -24,6 +24,8 @@ sub import
}
}
+sub F_UTF8 () { 0x8000 }
+
1;
__END__
@@ -113,20 +115,20 @@ to a such a stream.
=item raw
The C<:raw> layer is I<defined> as being identical to calling
-C<binmode($fh)> - the stream is made suitable for passing binary
-data i.e. each byte is passed as-is. The stream will still be
-buffered. Unlike earlier versions of perl C<:raw> is I<not> just the
-inverse of C<:crlf> - other layers which would affect the binary nature of
-the stream are also removed or disabled.
+C<binmode($fh)> - the stream is made suitable for passing binary data
+i.e. each byte is passed as-is. The stream will still be
+buffered. Unlike in the earlier versions of Perl C<:raw> is I<not>
+just the inverse of C<:crlf> - other layers which would affect the
+binary nature of the stream are also removed or disabled.
The implementation of C<:raw> is as a pseudo-layer which when "pushed"
pops itself and then any layers which do not declare themselves as suitable
for binary data. (Undoing :utf8 and :crlf are implemented by clearing
-flags rather than poping layers but that is an implementation detail.)
+flags rather than popping layers but that is an implementation detail.)
As a consequence of the fact that C<:raw> normally pops layers
-it usually only makes sense to have it as the only or first element in a
-layer specification. When used as the first element it provides
+it usually only makes sense to have it as the only or first element in
+a layer specification. When used as the first element it provides
a known base on which to build e.g.
open($fh,":raw:utf8",...)
@@ -151,6 +153,31 @@ A more elegant (and safer) interface is needed.
=back
+=head2 Custom Layers
+
+It is possible to write custom layers in addition to the above builtin
+ones, both in C/XS and Perl. Two such layers (and one example written
+in Perl using the latter) come with the Perl distribution.
+
+=over 4
+
+=item :encoding
+
+Use C<:encoding(ENCODING)> either in open() or binmode() to install
+a layer that does transparently character set and encoding transformations,
+for example from Shift-JIS to Unicode. Note that under C<stdio>
+an C<:encoding> also enables C<:utf8>. See L<PerlIO::encoding>
+for more information.
+
+=item :via
+
+Use C<:via(MODULE)> either in open() or binmode() to install a layer
+that does whatever transformation (for example compression /
+decompression, encryption / decryption) to the filehandle.
+See L<PerlIO::via> for more information.
+
+=back
+
=head2 Alternatives to raw
To get a binary stream an alternate method is to use:
@@ -177,7 +204,7 @@ translation for text files then the default layers are :
level layer.)
Otherwise if C<Configure> found out how to do "fast" IO using system's
-stdio, then the default layers are :
+stdio, then the default layers are:
unix stdio
@@ -188,8 +215,8 @@ Otherwise the default layers are
These defaults may change once perlio has been better tested and tuned.
The default can be overridden by setting the environment variable
-PERLIO to a space separated list of layers (unix or platform low level
-layer is always pushed first).
+PERLIO to a space separated list of layers (C<unix> or platform low
+level layer is always pushed first).
This can be used to see the effect of/bugs in the various layers e.g.
@@ -197,13 +224,71 @@ This can be used to see the effect of/bugs in the various layers e.g.
PERLIO=stdio ./perl harness
PERLIO=perlio ./perl harness
+For the various value of PERLIO see L<perlrun/PERLIO>.
+
+=head2 Querying the layers of filehandles
+
+The following returns the B<names> of the PerlIO layers on a filehandle.
+
+ my @layers = PerlIO::get_layers($fh); # Or FH, *FH, "FH".
+
+The layers are returned in the order an open() or binmode() call would
+use them. Note that the "default stack" depends on the operating
+system and on the Perl version, and both the compile-time and
+runtime configurations of Perl.
+
+The following table summarizes the default layers on UNIX-like and
+DOS-like platforms and depending on the setting of the C<$ENV{PERLIO}>:
+
+ PERLIO UNIX-like DOS-like
+
+ unset / "" unix perlio / stdio [1] unix crlf
+ stdio unix perlio / stdio [1] stdio
+ perlio unix perlio unix perlio
+ mmap unix mmap unix mmap
+
+ # [1] "stdio" if Configure found out how to do "fast stdio" (depends
+ # on the stdio implementation) and in Perl 5.8, otherwise "unix perlio"
+
+By default the layers from the input side of the filehandle is
+returned, to get the output side use the optional C<output> argument:
+
+ my @layers = PerlIO::get_layers($fh, output => 1);
+
+(Usually the layers are identical on either side of a filehandle but
+for example with sockets there may be differences, or if you have
+been using the C<open> pragma.)
+
+There is no set_layers(), nor does get_layers() return a tied array
+mirroring the stack, or anything fancy like that. This is not
+accidental or unintentional. The PerlIO layer stack is a bit more
+complicated than just a stack (see for example the behaviour of C<:raw>).
+You are supposed to use open() and binmode() to manipulate the stack.
+
+B<Implementation details follow, please close your eyes.>
+
+The arguments to layers are by default returned in parenthesis after
+the name of the layer, and certain layers (like C<utf8>) are not real
+layers but instead flags on real layers: to get all of these returned
+separately use the optional C<separate> argument:
+
+ my @layer_and_args_and_flags = PerlIO::get_layers($fh, details => 1);
+
+The result will be up to be three times the number of layers:
+the first element will be a name, the second element the arguments
+(unspecified arguments will be C<undef>), the third element the flags,
+the fourth element a name again, and so forth.
+
+B<You may open your eyes now.>
+
=head1 AUTHOR
Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt>
=head1 SEE ALSO
-L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>, L<Encode>
+L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>, L<perliol>,
+L<Encode>
=cut
diff --git a/gnu/usr.bin/perl/lib/PerlIO/via/QuotedPrint.pm b/gnu/usr.bin/perl/lib/PerlIO/via/QuotedPrint.pm
index e2588306681..8b182bdbb03 100644
--- a/gnu/usr.bin/perl/lib/PerlIO/via/QuotedPrint.pm
+++ b/gnu/usr.bin/perl/lib/PerlIO/via/QuotedPrint.pm
@@ -3,7 +3,7 @@ package PerlIO::via::QuotedPrint;
# Set the version info
# Make sure we do things by the book from now on
-$VERSION = '0.04';
+$VERSION = '0.05';
use strict;
# Make sure the encoding/decoding stuff is available
@@ -76,12 +76,15 @@ from a handle, and it will encode as quoted-printable while writing to a handle.
L<PerlIO::via>, L<MIME::QuotedPrint>, L<PerlIO::via::Base64>,
L<PerlIO::via::MD5>, L<PerlIO::via::StripHTML>, L<PerlIO::via::Rotate>.
-=head1 COPYRIGHT
+=head1 ACKNOWLEDGEMENTS
+
+Based on example that was initially added to MIME::QuotedPrint.pm for the
+5.8.0 distribution of Perl.
-Copyright (c) 2002 Elizabeth Mattijsen. Based on example that was initially
-added to MIME::QuotedPrint.pm for the 5.8.0 distribution of Perl.
+=head1 COPYRIGHT
-This library is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
+Copyright (c) 2002-2003 Elizabeth Mattijsen. All rights reserved. This
+library is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
=cut
diff --git a/gnu/usr.bin/perl/lib/PerlIO/via/t/QuotedPrint.t b/gnu/usr.bin/perl/lib/PerlIO/via/t/QuotedPrint.t
index ee0f697cfb8..b379f66f5b1 100644
--- a/gnu/usr.bin/perl/lib/PerlIO/via/t/QuotedPrint.t
+++ b/gnu/usr.bin/perl/lib/PerlIO/via/t/QuotedPrint.t
@@ -1,23 +1,25 @@
-my $file = 'test.qp';
-
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = '../lib';
+BEGIN { # Magic Perl CORE pragma
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = '../lib';
}
unless (find PerlIO::Layer 'perlio') {
print "1..0 # Skip: PerlIO not used\n";
- exit 0;
+ exit 0;
}
if (ord("A") == 193) {
- print "1..0 # Skip: EBCDIC\n";
+ print "1..0 # Skip: EBCDIC\n";
}
}
+use strict;
+use warnings;
use Test::More tests => 11;
BEGIN { use_ok('PerlIO::via::QuotedPrint') }
+my $file = 'test.qp';
+
my $decoded = <<EOD;
This is a tést for quoted-printable text that has hàrdly any speçial characters
in it.
diff --git a/gnu/usr.bin/perl/lib/Pod/Checker.pm b/gnu/usr.bin/perl/lib/Pod/Checker.pm
index 5aca76c7ace..824178f61ca 100644
--- a/gnu/usr.bin/perl/lib/Pod/Checker.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Checker.pm
@@ -10,7 +10,7 @@
package Pod::Checker;
use vars qw($VERSION);
-$VERSION = 1.3; ## Current version of this package
+$VERSION = 1.41; ## Current version of this package
require 5.005; ## requires this Perl version or later
use Pod::ParseUtils; ## for hyperlinks and lists
@@ -53,11 +53,9 @@ trigger additional warnings. See L<"Warnings">.
B<podchecker> will perform syntax checking of Perl5 POD format documentation.
-I<NOTE THAT THIS MODULE IS CURRENTLY IN THE BETA STAGE!>
-
-It is hoped that curious/ambitious user will help flesh out and add the
-additional features they wish to see in B<Pod::Checker> and B<podchecker>
-and verify that the checks are consistent with L<perlpod>.
+Curious/ambitious users are welcome to propose additional features they wish
+to see in B<Pod::Checker> and B<podchecker> and verify that the checks are
+consistent with L<perlpod>.
The following checks are currently preformed:
@@ -274,6 +272,11 @@ The NAME section (C<=head1 NAME>) should consist of a single paragraph
with the script/module name, followed by a dash `-' and a very short
description of what the thing is good for.
+=item * =headI<n> without preceding higher level
+
+For example if there is a C<=head2> in the POD file prior to a
+C<=head1>.
+
=back
=head2 Hyperlinks
@@ -314,7 +317,7 @@ there were no POD commands at all found in the file.
=head1 EXAMPLES
-I<[T.B.D.]>
+See L</SYNOPSIS>
=head1 INTERFACE
@@ -324,6 +327,13 @@ POD translators can use this feature to syntax-check and get the nodes in
a first pass before actually starting to convert. This is expensive in terms
of execution time, but allows for very robust conversions.
+Since PodParser-1.24 the B<Pod::Checker> module uses only the B<poderror>
+method to print errors and warnings. The summary output (e.g.
+"Pod syntax OK") has been dropped from the module and has been included in
+B<podchecker> (the script). This allows users of B<Pod::Checker> to
+control completely the output behaviour. Users of B<podchecker> (the script)
+get the well-known behaviour.
+
=cut
#############################################################################
@@ -548,6 +558,7 @@ sub initialize {
## Initialize number of errors, and setup an error function to
## increment this number and then print to the designated output.
$self->{_NUM_ERRORS} = 0;
+ $self->{_NUM_WARNINGS} = 0;
$self->{-quiet} ||= 0;
# set the error handling subroutine
$self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror');
@@ -609,6 +620,8 @@ sub poderror {
## Increment error count and print message "
++($self->{_NUM_ERRORS})
if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
+ ++($self->{_NUM_WARNINGS})
+ if(!%opts || ($opts{-severity} && $opts{-severity} eq 'WARNING'));
my $out_fh = $self->output_handle() || \*STDERR;
print $out_fh ($severity, $msg, $line, $file, "\n")
if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
@@ -628,6 +641,18 @@ sub num_errors {
##################################
+=item C<$checker-E<gt>num_warnings()>
+
+Set (if argument specified) and retrieve the number of warnings found.
+
+=cut
+
+sub num_warnings {
+ return (@_ > 1) ? ($_[0]->{_NUM_WARNINGS} = $_[1]) : $_[0]->{_NUM_WARNINGS};
+}
+
+##################################
+
=item C<$checker-E<gt>name()>
Set (if argument specified) and retrieve the canonical name of POD as
@@ -722,7 +747,6 @@ sub end_pod {
my $out_fh = $self->output_handle();
if(@{$self->{_list_stack}}) {
- # _TODO_ display, but don't count them for now
my $list;
while(($list = $self->_close_list('EOF',$infile)) &&
$list->indent() ne 'auto') {
@@ -770,19 +794,8 @@ sub end_pod {
-msg => "multiple occurrence of link target '$_'"});
}
- ## Print the number of errors found
- my $num_errors = $self->num_errors();
- if ($num_errors > 0) {
- printf $out_fh ("$infile has $num_errors pod syntax %s.\n",
- ($num_errors == 1) ? "error" : "errors");
- }
- elsif($self->{_commands} == 0) {
- print $out_fh "$infile does not contain any pod commands.\n";
- $self->num_errors(-1);
- }
- else {
- print $out_fh "$infile pod syntax OK.\n";
- }
+ # no POD found here
+ $self->num_errors(-1) if($self->{_commands} == 0);
}
# check a POD command directive
@@ -907,17 +920,24 @@ sub command {
}
}
elsif($cmd =~ /^head(\d+)/) {
+ my $hnum = $1;
+ $self->{"_have_head_$hnum"}++; # count head types
+ if($hnum > 1 && !$self->{"_have_head_".($hnum -1)}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "=head$hnum without preceding higher level"});
+ }
# check whether the previous =head section had some contents
if(defined $self->{_commands_in_head} &&
$self->{_commands_in_head} == 0 &&
defined $self->{_last_head} &&
- $self->{_last_head} >= $1) {
+ $self->{_last_head} >= $hnum) {
$self->poderror({ -line => $line, -file => $file,
-severity => 'WARNING',
-msg => "empty section in previous paragraph"});
}
$self->{_commands_in_head} = -1;
- $self->{_last_head} = $1;
+ $self->{_last_head} = $hnum;
# check if there is an open list
if(@{$self->{_list_stack}}) {
my $list;
@@ -1051,17 +1071,17 @@ sub _check_ptree {
foreach(@$ptree) {
# regular text chunk
unless(ref) {
- my $count;
# count the unescaped angle brackets
# complain only when warning level is greater than 1
- my $i = $_;
- if($count = $i =~ tr/<>/<>/) {
+ if($self->{-warnings} && $self->{-warnings}>1) {
+ my $count;
+ if($count = tr/<>/<>/) {
$self->poderror({ -line => $line, -file => $file,
-severity => 'WARNING',
- -msg => "$count unescaped <> in paragraph" })
- if($self->{-warnings} && $self->{-warnings}>1);
+ -msg => "$count unescaped <> in paragraph" });
+ }
}
- $text .= $i;
+ $text .= $_;
next;
}
# have an interior sequence
diff --git a/gnu/usr.bin/perl/lib/Pod/Find.pm b/gnu/usr.bin/perl/lib/Pod/Find.pm
index 111744b8dfa..e18d976ffb8 100644
--- a/gnu/usr.bin/perl/lib/Pod/Find.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Find.pm
@@ -13,7 +13,7 @@
package Pod::Find;
use vars qw($VERSION);
-$VERSION = 0.22; ## Current version of this package
+$VERSION = 0.24; ## Current version of this package
require 5.005; ## requires this Perl version or later
use Carp;
@@ -416,6 +416,9 @@ sub pod_where {
if -d $Config::Config{'scriptdir'};
}
+ warn "Search path is: ".join(' ', @search_dirs)."\n"
+ if $options{'-verbose'};
+
# Loop over directories
Dir: foreach my $dir ( @search_dirs ) {
@@ -443,6 +446,17 @@ sub pod_where {
if $options{'-verbose'};
next Dir;
}
+ # for some strange reason the path on MacOS/darwin/cygwin is
+ # 'pods' not 'pod'
+ # this could be the case also for other systems that
+ # have a case-tolerant file system, but File::Spec
+ # does not recognize 'darwin' yet. And cygwin also has "pods",
+ # but is not case tolerant. Oh well...
+ if((File::Spec->case_tolerant || $^O =~ /macos|darwin|cygwin/i)
+ && -d File::Spec->catdir($dir,'pods')) {
+ $dir = File::Spec->catdir($dir,'pods');
+ redo Dir;
+ }
if(-d File::Spec->catdir($dir,'pod')) {
$dir = File::Spec->catdir($dir,'pod');
redo Dir;
diff --git a/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm b/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm
index db615a57c47..18e9626e0e6 100644
--- a/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm
+++ b/gnu/usr.bin/perl/lib/Pod/ParseUtils.pm
@@ -10,7 +10,7 @@
package Pod::ParseUtils;
use vars qw($VERSION);
-$VERSION = 0.22; ## Current version of this package
+$VERSION = 0.30; ## Current version of this package
require 5.005; ## requires this Perl version or later
=head1 NAME
@@ -284,7 +284,7 @@ sub parse {
my $self = shift;
local($_) = $_[0];
# syntax check the link and extract destination
- my ($alttext,$page,$node,$type) = (undef,'','','');
+ my ($alttext,$page,$node,$type,$quoted) = (undef,'','','',0);
$self->{_warnings} = [];
@@ -311,7 +311,7 @@ sub parse {
# problem: a lot of people use (), or (1) or the like to indicate
# man page sections. But this collides with L<func()> that is supposed
# to point to an internal funtion...
- my $page_rx = '[\w.]+(?:::[\w.]+)*(?:[(](?:\d\w*|)[)]|)';
+ my $page_rx = '[\w.-]+(?:::[\w.-]+)*(?:[(](?:\d\w*|)[)]|)';
# page name only
if(m!^($page_rx)$!o) {
$page = $1;
@@ -321,6 +321,7 @@ sub parse {
elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {
($alttext, $page, $node) = ($1, $2, $3);
$type = 'section';
+ $quoted = 1; #... therefore | and / are allowed
}
# alttext and page
elsif(m!^(.*?)\s*[|]\s*($page_rx)$!o) {
@@ -331,11 +332,13 @@ sub parse {
elsif(m!^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
($alttext, $node) = ($1,$2);
$type = 'section';
+ $quoted = 1;
}
# page and "section"
elsif(m!^($page_rx)\s*/\s*"(.+)"$!o) {
($page, $node) = ($1, $2);
$type = 'section';
+ $quoted = 1;
}
# page and item
elsif(m!^($page_rx)\s*/\s*(.+)$!o) {
@@ -346,6 +349,7 @@ sub parse {
elsif(m!^/?"(.+)"$!) {
$node = $1;
$type = 'section';
+ $quoted = 1;
}
# only item
elsif(m!^\s*/(.+)$!) {
@@ -392,7 +396,7 @@ sub parse {
if($page =~ /[(]\w*[)]$/) {
$self->warning("(section) in '$page' deprecated");
}
- if($node =~ m:[|/]:) {
+ if(!$quoted && $node =~ m:[|/]:) {
$self->warning("node '$node' contains non-escaped | or /");
}
if($alttext =~ m:[|/]:) {
@@ -422,11 +426,9 @@ sub _construct_text {
$self->{_text} = $section;
}
else {
- $self->{_text} = (!$section ? '' :
- $type eq 'item' ? "the $section entry" :
- "the section on $section" ) .
- ($page ? ($section ? ' in ':'') . "the $page$page_ext manpage" :
- ' elsewhere in this document');
+ $self->{_text} = ($section || '') .
+ (($page && $section) ? ' in ' : '') .
+ "$page$page_ext";
}
# for being marked up later
# use the non-standard markers P<> and Q<>, so that the resulting
@@ -439,11 +441,8 @@ sub _construct_text {
$self->{_markup} = "Q<$section>";
}
else {
- $self->{_markup} = (!$section ? '' :
- $type eq 'item' ? "the Q<$section> entry" :
- "the section on Q<$section>" ) .
- ($page ? ($section ? ' in ':'') . "the P<$page>$page_ext manpage" :
- ' elsewhere in this document');
+ $self->{_markup} = (!$section ? '' : "Q<$section>") .
+ ($page ? ($section ? ' in ':'') . "P<$page>$page_ext" : '');
}
}
@@ -469,10 +468,10 @@ but without markers (read only). Depending on the link type this is one of
the following alternatives (the + and * denote the portions of the text
that are marked up):
- the +perl+ manpage
- the *$|* entry in the +perlvar+ manpage
- the section on *OPTIONS* in the +perldoc+ manpage
- the section on *DESCRIPTION* elsewhere in this document
+ +perl+ L<perl>
+ *$|* in +perlvar+ L<perlvar/$|>
+ *OPTIONS* in +perldoc+ L<perldoc/"OPTIONS">
+ *DESCRIPTION* L<"DESCRIPTION">
=cut
diff --git a/gnu/usr.bin/perl/lib/Pod/Parser.pm b/gnu/usr.bin/perl/lib/Pod/Parser.pm
index 85551faca88..456b515b9a0 100644
--- a/gnu/usr.bin/perl/lib/Pod/Parser.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Parser.pm
@@ -788,13 +788,15 @@ sub parse_text {
## Look for the beginning of a sequence
if ( /^([A-Z])(<(?:<+\s)?)$/ ) {
## Push a new sequence onto the stack of those "in-progress"
- ($cmd, $ldelim) = ($1, $2);
+ my $ldelim_orig;
+ ($cmd, $ldelim_orig) = ($1, $2);
+ ($ldelim = $ldelim_orig) =~ s/\s+$//;
+ ($rdelim = $ldelim) =~ tr/</>/;
$seq = Pod::InteriorSequence->new(
-name => $cmd,
- -ldelim => $ldelim, -rdelim => '',
+ -ldelim => $ldelim_orig, -rdelim => $rdelim,
-file => $file, -line => $line
);
- $ldelim =~ s/\s+$//, ($rdelim = $ldelim) =~ tr/</>/;
(@seq_stack > 1) and $seq->nested($seq_stack[-1]);
push @seq_stack, $seq;
}
@@ -827,9 +829,13 @@ sub parse_text {
$seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq)
: $seq);
## Remember the current cmd-name and left-delimiter
- $cmd = (@seq_stack > 1) ? $seq_stack[-1]->name : '';
- $ldelim = (@seq_stack > 1) ? $seq_stack[-1]->ldelim : '';
- $ldelim =~ s/\s+$//, ($rdelim = $ldelim) =~ tr/</>/;
+ if(@seq_stack > 1) {
+ $cmd = $seq_stack[-1]->name;
+ $ldelim = $seq_stack[-1]->ldelim;
+ $rdelim = $seq_stack[-1]->rdelim;
+ } else {
+ $cmd = $ldelim = $rdelim = '';
+ }
}
}
elsif (length) {
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc.pm
new file mode 100644
index 00000000000..8f1bb0cb559
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc.pm
@@ -0,0 +1,1743 @@
+
+require 5;
+use 5.006; # we use some open(X, "<", $y) syntax
+package Pod::Perldoc;
+use strict;
+use warnings;
+use Config '%Config';
+
+use Fcntl; # for sysopen
+use File::Spec::Functions qw(catfile catdir splitdir);
+
+use vars qw($VERSION @Pagers $Bindir $Pod2man
+ $Temp_Files_Created $Temp_File_Lifetime
+);
+$VERSION = '3.11';
+#..........................................................................
+
+BEGIN { # Make a DEBUG constant very first thing...
+ unless(defined &DEBUG) {
+ if(($ENV{'PERLDOCDEBUG'} || '') =~ m/^(\d+)/) { # untaint
+ eval("sub DEBUG () {$1}");
+ die "WHAT? Couldn't eval-up a DEBUG constant!? $@" if $@;
+ } else {
+ *DEBUG = sub () {0};
+ }
+ }
+}
+
+use Pod::Perldoc::GetOptsOO; # uses the DEBUG.
+
+#..........................................................................
+
+sub TRUE () {1}
+sub FALSE () {return}
+
+BEGIN {
+ *IS_VMS = $^O eq 'VMS' ? \&TRUE : \&FALSE unless defined &IS_VMS;
+ *IS_MSWin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &IS_MSWin32;
+ *IS_Dos = $^O eq 'dos' ? \&TRUE : \&FALSE unless defined &IS_Dos;
+ *IS_OS2 = $^O eq 'os2' ? \&TRUE : \&FALSE unless defined &IS_OS2;
+ *IS_Cygwin = $^O eq 'cygwin' ? \&TRUE : \&FALSE unless defined &IS_Cygwin;
+ *IS_Linux = $^O eq 'linux' ? \&TRUE : \&FALSE unless defined &IS_Linux;
+ *IS_HPUX = $^O =~ m/hpux/ ? \&TRUE : \&FALSE unless defined &IS_HPUX;
+}
+
+$Temp_File_Lifetime ||= 60 * 60 * 24 * 5;
+ # If it's older than five days, it's quite unlikely
+ # that anyone's still looking at it!!
+ # (Currently used only by the MSWin cleanup routine)
+
+
+#..........................................................................
+{ my $pager = $Config{'pager'};
+ push @Pagers, $pager if -x (split /\s+/, $pager)[0] or IS_VMS;
+}
+$Bindir = $Config{'scriptdirexp'};
+$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' );
+
+# End of class-init stuff
+#
+###########################################################################
+#
+# Option accessors...
+
+foreach my $subname (map "opt_$_", split '', q{mhlvriFfXqnTdU}) {
+ no strict 'refs';
+ *$subname = do{ use strict 'refs'; sub () { shift->_elem($subname, @_) } };
+}
+
+# And these are so that GetOptsOO knows they take options:
+sub opt_f_with { shift->_elem('opt_f', @_) }
+sub opt_q_with { shift->_elem('opt_q', @_) }
+sub opt_d_with { shift->_elem('opt_d', @_) }
+
+sub opt_w_with { # Specify an option for the formatter subclass
+ my($self, $value) = @_;
+ if($value =~ m/^([-_a-zA-Z][-_a-zA-Z0-9]*)(?:[=\:](.*?))?$/s) {
+ my $option = $1;
+ my $option_value = defined($2) ? $2 : "TRUE";
+ $option =~ tr/\-/_/s; # tolerate "foo-bar" for "foo_bar"
+ $self->add_formatter_option( $option, $option_value );
+ } else {
+ warn "\"$value\" isn't a good formatter option name. I'm ignoring it!\n";
+ }
+ return;
+}
+
+sub opt_M_with { # specify formatter class name(s)
+ my($self, $classes) = @_;
+ return unless defined $classes and length $classes;
+ DEBUG > 4 and print "Considering new formatter classes -M$classes\n";
+ my @classes_to_add;
+ foreach my $classname (split m/[,;]+/s, $classes) {
+ next unless $classname =~ m/\S/;
+ if( $classname =~ m/^(\w+(::\w+)+)$/s ) {
+ # A mildly restrictive concept of what modulenames are valid.
+ push @classes_to_add, $1; # untaint
+ } else {
+ warn "\"$classname\" isn't a valid classname. Ignoring.\n";
+ }
+ }
+
+ unshift @{ $self->{'formatter_classes'} }, @classes_to_add;
+
+ DEBUG > 3 and print(
+ "Adding @classes_to_add to the list of formatter classes, "
+ . "making them @{ $self->{'formatter_classes'} }.\n"
+ );
+
+ return;
+}
+
+sub opt_V { # report version and exit
+ print join '',
+ "Perldoc v$VERSION, under perl v$] for $^O",
+
+ (defined(&Win32::BuildNumber) and defined &Win32::BuildNumber())
+ ? (" (win32 build ", &Win32::BuildNumber(), ")") : (),
+
+ (chr(65) eq 'A') ? () : " (non-ASCII)",
+
+ "\n",
+ ;
+ exit;
+}
+
+sub opt_t { # choose plaintext as output format
+ my $self = shift;
+ $self->opt_o_with('text') if @_ and $_[0];
+ return $self->_elem('opt_t', @_);
+}
+
+sub opt_u { # choose raw pod as output format
+ my $self = shift;
+ $self->opt_o_with('pod') if @_ and $_[0];
+ return $self->_elem('opt_u', @_);
+}
+
+sub opt_n_with {
+ # choose man as the output format, and specify the proggy to run
+ my $self = shift;
+ $self->opt_o_with('man') if @_ and $_[0];
+ $self->_elem('opt_n', @_);
+}
+
+sub opt_o_with { # "o" for output format
+ my($self, $rest) = @_;
+ return unless defined $rest and length $rest;
+ if($rest =~ m/^(\w+)$/s) {
+ $rest = $1; #untaint
+ } else {
+ warn "\"$rest\" isn't a valid output format. Skipping.\n";
+ return;
+ }
+
+ $self->aside("Noting \"$rest\" as desired output format...\n");
+
+ # Figure out what class(es) that could actually mean...
+
+ my @classes;
+ foreach my $prefix ("Pod::Perldoc::To", "Pod::Simple::", "Pod::") {
+ # Messy but smart:
+ foreach my $stem (
+ $rest, # Yes, try it first with the given capitalization
+ "\L$rest", "\L\u$rest", "\U$rest" # And then try variations
+
+ ) {
+ push @classes, $prefix . $stem;
+ #print "Considering $prefix$stem\n";
+ }
+
+ # Tidier, but misses too much:
+ #push @classes, $prefix . ucfirst(lc($rest));
+ }
+ $self->opt_M_with( join ";", @classes );
+ return;
+}
+
+###########################################################################
+# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+
+sub run { # to be called by the "perldoc" executable
+ my $class = shift;
+ if(DEBUG > 3) {
+ print "Parameters to $class\->run:\n";
+ my @x = @_;
+ while(@x) {
+ $x[1] = '<undef>' unless defined $x[1];
+ $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY';
+ print " [$x[0]] => [$x[1]]\n";
+ splice @x,0,2;
+ }
+ print "\n";
+ }
+ return $class -> new(@_) -> process() || 0;
+}
+
+# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+###########################################################################
+
+sub new { # yeah, nothing fancy
+ my $class = shift;
+ my $new = bless {@_}, (ref($class) || $class);
+ DEBUG > 1 and print "New $class object $new\n";
+ $new->init();
+ $new;
+}
+
+#..........................................................................
+
+sub aside { # If we're in -v or DEBUG mode, say this.
+ my $self = shift;
+ if( DEBUG or $self->opt_v ) {
+ my $out = join( '',
+ DEBUG ? do {
+ my $callsub = (caller(1))[3];
+ my $package = quotemeta(__PACKAGE__ . '::');
+ $callsub =~ s/^$package/'/os;
+ # the o is justified, as $package really won't change.
+ $callsub . ": ";
+ } : '',
+ @_,
+ );
+ if(DEBUG) { print $out } else { print STDERR $out }
+ }
+ return;
+}
+
+#..........................................................................
+
+sub usage {
+ my $self = shift;
+ warn "@_\n" if @_;
+
+ # Erase evidence of previous errors (if any), so exit status is simple.
+ $! = 0;
+
+ die <<EOF;
+perldoc [options] PageName|ModuleName|ProgramName...
+perldoc [options] -f BuiltinFunction
+perldoc [options] -q FAQRegex
+
+Options:
+ -h Display this help message
+ -V report version
+ -r Recursive search (slow)
+ -i Ignore case
+ -t Display pod using pod2text instead of pod2man and nroff
+ (-t is the default on win32 unless -n is specified)
+ -u Display unformatted pod text
+ -m Display module's file in its entirety
+ -n Specify replacement for nroff
+ -l Display the module's file name
+ -F Arguments are file names, not modules
+ -v Verbosely describe what's going on
+ -T Send output to STDOUT without any pager
+ -d output_filename_to_send_to
+ -o output_format_name
+ -M FormatterModuleNameToUse
+ -w formatter_option:option_value
+ -X use index if present (looks for pod.idx at $Config{archlib})
+ -q Search the text of questions (not answers) in perlfaq[1-9]
+
+PageName|ModuleName...
+ is the name of a piece of documentation that you want to look at. You
+ may either give a descriptive name of the page (as in the case of
+ `perlfunc') the name of a module, either like `Term::Info' or like
+ `Term/Info', or the name of a program, like `perldoc'.
+
+BuiltinFunction
+ is the name of a perl function. Will extract documentation from
+ `perlfunc'.
+
+FAQRegex
+ is a regex. Will search perlfaq[1-9] for and extract any
+ questions that match.
+
+Any switches in the PERLDOC environment variable will be used before the
+command line arguments. The optional pod index file contains a list of
+filenames, one per line.
+ [Perldoc v$VERSION]
+EOF
+
+}
+
+#..........................................................................
+
+sub usage_brief {
+ my $me = $0; # Editing $0 is unportable
+
+ $me =~ s,.*[/\\],,; # get basename
+
+ die <<"EOUSAGE";
+Usage: $me [-h] [-V] [-r] [-i] [-v] [-t] [-u] [-m] [-n nroffer_program] [-l] [-T] [-d output_filename] [-o output_format] [-M FormatterModuleNameToUse] [-w formatter_option:option_value] [-F] [-X] PageName|ModuleName|ProgramName
+ $me -f PerlFunc
+ $me -q FAQKeywords
+
+The -h option prints more help. Also try "perldoc perldoc" to get
+acquainted with the system. [Perldoc v$VERSION]
+EOUSAGE
+
+}
+
+#..........................................................................
+
+sub pagers { @{ shift->{'pagers'} } }
+
+#..........................................................................
+
+sub _elem { # handy scalar meta-accessor: shift->_elem("foo", @_)
+ if(@_ > 2) { return $_[0]{ $_[1] } = $_[2] }
+ else { return $_[0]{ $_[1] } }
+}
+#..........................................................................
+###########################################################################
+#
+# Init formatter switches, and start it off with __bindir and all that
+# other stuff that ToMan.pm needs.
+#
+
+sub init {
+ my $self = shift;
+
+ # Make sure creat()s are neither too much nor too little
+ eval { umask(0077) }; # doubtless someone has no mask
+
+ $self->{'args'} ||= \@ARGV;
+ $self->{'found'} ||= [];
+ $self->{'temp_file_list'} ||= [];
+
+
+ $self->{'target'} = undef;
+
+ $self->init_formatter_class_list;
+
+ $self->{'pagers' } = [@Pagers] unless exists $self->{'pagers'};
+ $self->{'bindir' } = $Bindir unless exists $self->{'bindir'};
+ $self->{'pod2man'} = $Pod2man unless exists $self->{'pod2man'};
+
+ push @{ $self->{'formatter_switches'} = [] }, (
+ # Yeah, we could use a hashref, but maybe there's some class where options
+ # have to be ordered; so we'll use an arrayref.
+
+ [ '__bindir' => $self->{'bindir' } ],
+ [ '__pod2man' => $self->{'pod2man'} ],
+ );
+
+ DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+ join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+ return;
+}
+
+#..........................................................................
+
+sub init_formatter_class_list {
+ my $self = shift;
+ $self->{'formatter_classes'} ||= [];
+
+ # Remember, no switches have been read yet, when
+ # we've started this routine.
+
+ $self->opt_M_with('Pod::Perldoc::ToPod'); # the always-there fallthru
+ $self->opt_o_with('text');
+ $self->opt_o_with('man') unless IS_MSWin32 || IS_Dos
+ || !($ENV{TERM} && (
+ ($ENV{TERM} || '') !~ /dumb|emacs|none|unknown/i
+ ));
+
+ return;
+}
+
+#..........................................................................
+
+sub process {
+ # if this ever returns, its retval will be used for exit(RETVAL)
+
+ my $self = shift;
+ DEBUG > 1 and print " Beginning process.\n";
+ DEBUG > 1 and print " Args: @{$self->{'args'}}\n\n";
+ if(DEBUG > 3) {
+ print "Object contents:\n";
+ my @x = %$self;
+ while(@x) {
+ $x[1] = '<undef>' unless defined $x[1];
+ $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY';
+ print " [$x[0]] => [$x[1]]\n";
+ splice @x,0,2;
+ }
+ print "\n";
+ }
+
+ # TODO: make it deal with being invoked as various different things
+ # such as perlfaq".
+
+ return $self->usage_brief unless @{ $self->{'args'} };
+ $self->pagers_guessing;
+ $self->options_reading;
+ $self->aside(sprintf "$0 => %s v%s\n", ref($self), $self->VERSION);
+ $self->drop_privs_maybe;
+ $self->options_processing;
+
+ # Hm, we have @pages and @found, but we only really act on one
+ # file per call, with the exception of the opt_q hack, and with
+ # -l things
+
+ $self->aside("\n");
+
+ my @pages;
+ $self->{'pages'} = \@pages;
+ if( $self->opt_f) { @pages = ("perlfunc") }
+ elsif( $self->opt_q) { @pages = ("perlfaq1" .. "perlfaq9") }
+ else { @pages = @{$self->{'args'}};
+ # @pages = __FILE__
+ # if @pages == 1 and $pages[0] eq 'perldoc';
+ }
+
+ return $self->usage_brief unless @pages;
+
+ $self->find_good_formatter_class();
+ $self->formatter_sanity_check();
+
+ $self->maybe_diddle_INC();
+ # for when we're apparently in a module or extension directory
+
+ my @found = $self->grand_search_init(\@pages);
+ exit (IS_VMS ? 98962 : 1) unless @found;
+
+ if ($self->opt_l) {
+ DEBUG and print "We're in -l mode, so byebye after this:\n";
+ print join("\n", @found), "\n";
+ return;
+ }
+
+ $self->tweak_found_pathnames(\@found);
+ $self->assert_closing_stdout;
+ return $self->page_module_file(@found) if $self->opt_m;
+ DEBUG > 2 and print "Found: [@found]\n";
+
+ return $self->render_and_page(\@found);
+}
+
+#..........................................................................
+{
+
+my( %class_seen, %class_loaded );
+sub find_good_formatter_class {
+ my $self = $_[0];
+ my @class_list = @{ $self->{'formatter_classes'} || [] };
+ die "WHAT? Nothing in the formatter class list!?" unless @class_list;
+
+ my $good_class_found;
+ foreach my $c (@class_list) {
+ DEBUG > 4 and print "Trying to load $c...\n";
+ if($class_loaded{$c}) {
+ DEBUG > 4 and print "OK, the already-loaded $c it is!\n";
+ $good_class_found = $c;
+ last;
+ }
+
+ if($class_seen{$c}) {
+ DEBUG > 4 and print
+ "I've tried $c before, and it's no good. Skipping.\n";
+ next;
+ }
+
+ $class_seen{$c} = 1;
+
+ if( $c->can('parse_from_file') ) {
+ DEBUG > 4 and print
+ "Interesting, the formatter class $c is already loaded!\n";
+
+ } elsif(
+ (IS_VMS or IS_MSWin32 or IS_Dos or IS_OS2)
+ # the alway case-insensitive fs's
+ and $class_seen{lc("~$c")}++
+ ) {
+ DEBUG > 4 and print
+ "We already used something quite like \"\L$c\E\", so no point using $c\n";
+ # This avoids redefining the package.
+ } else {
+ DEBUG > 4 and print "Trying to eval 'require $c'...\n";
+
+ local $^W = $^W;
+ if(DEBUG() or $self->opt_v) {
+ # feh, let 'em see it
+ } else {
+ $^W = 0;
+ # The average user just has no reason to be seeing
+ # $^W-suppressable warnings from the the require!
+ }
+
+ eval "require $c";
+ if($@) {
+ DEBUG > 4 and print "Couldn't load $c: $!\n";
+ next;
+ }
+ }
+
+ if( $c->can('parse_from_file') ) {
+ DEBUG > 4 and print "Settling on $c\n";
+ my $v = $c->VERSION;
+ $v = ( defined $v and length $v ) ? " version $v" : '';
+ $self->aside("Formatter class $c$v successfully loaded!\n");
+ $good_class_found = $c;
+ last;
+ } else {
+ DEBUG > 4 and print "Class $c isn't a formatter?! Skipping.\n";
+ }
+ }
+
+ die "Can't find any loadable formatter class in @class_list?!\nAborting"
+ unless $good_class_found;
+
+ $self->{'formatter_class'} = $good_class_found;
+ $self->aside("Will format with the class $good_class_found\n");
+
+ return;
+}
+
+}
+#..........................................................................
+
+sub formatter_sanity_check {
+ my $self = shift;
+ my $formatter_class = $self->{'formatter_class'}
+ || die "NO FORMATTER CLASS YET!?";
+
+ if(!$self->opt_T # so -T can FORCE sending to STDOUT
+ and $formatter_class->can('is_pageable')
+ and !$formatter_class->is_pageable
+ and !$formatter_class->can('page_for_perldoc')
+ ) {
+ my $ext =
+ ($formatter_class->can('output_extension')
+ && $formatter_class->output_extension
+ ) || '';
+ $ext = ".$ext" if length $ext;
+
+ die
+ "When using Perldoc to format with $formatter_class, you have to\n"
+ . "specify -T or -dsomefile$ext\n"
+ . "See `perldoc perldoc' for more information on those switches.\n"
+ ;
+ }
+}
+
+#..........................................................................
+
+sub render_and_page {
+ my($self, $found_list) = @_;
+
+ $self->maybe_generate_dynamic_pod($found_list);
+
+ my($out, $formatter) = $self->render_findings($found_list);
+
+ if($self->opt_d) {
+ printf "Perldoc (%s) output saved to %s\n",
+ $self->{'formatter_class'} || ref($self),
+ $out;
+ print "But notice that it's 0 bytes long!\n" unless -s $out;
+
+
+ } elsif( # Allow the formatter to "page" itself, if it wants.
+ $formatter->can('page_for_perldoc')
+ and do {
+ $self->aside("Going to call $formatter\->page_for_perldoc(\"$out\")\n");
+ if( $formatter->page_for_perldoc($out, $self) ) {
+ $self->aside("page_for_perldoc returned true, so NOT paging with $self.\n");
+ 1;
+ } else {
+ $self->aside("page_for_perldoc returned false, so paging with $self instead.\n");
+ '';
+ }
+ }
+ ) {
+ # Do nothing, since the formatter has "paged" it for itself.
+
+ } else {
+ # Page it normally (internally)
+
+ if( -s $out ) { # Usual case:
+ $self->page($out, $self->{'output_to_stdout'}, $self->pagers);
+
+ } else {
+ # Odd case:
+ $self->aside("Skipping $out (from $$found_list[0] "
+ . "via $$self{'formatter_class'}) as it is 0-length.\n");
+
+ push @{ $self->{'temp_file_list'} }, $out;
+ $self->unlink_if_temp_file($out);
+ }
+ }
+
+ $self->after_rendering(); # any extra cleanup or whatever
+
+ return;
+}
+
+#..........................................................................
+
+sub options_reading {
+ my $self = shift;
+
+ if( defined $ENV{"PERLDOC"} and length $ENV{"PERLDOC"} ) {
+ require Text::ParseWords;
+ $self->aside("Noting env PERLDOC setting of $ENV{'PERLDOC'}\n");
+ # Yes, appends to the beginning
+ unshift @{ $self->{'args'} },
+ Text::ParseWords::shellwords( $ENV{"PERLDOC"} )
+ ;
+ DEBUG > 1 and print " Args now: @{$self->{'args'}}\n\n";
+ } else {
+ DEBUG > 1 and print " Okay, no PERLDOC setting in ENV.\n";
+ }
+
+ DEBUG > 1
+ and print " Args right before switch processing: @{$self->{'args'}}\n";
+
+ Pod::Perldoc::GetOptsOO::getopts( $self, $self->{'args'}, 'YES' )
+ or return $self->usage;
+
+ DEBUG > 1
+ and print " Args after switch processing: @{$self->{'args'}}\n";
+
+ return $self->usage if $self->opt_h;
+
+ return;
+}
+
+#..........................................................................
+
+sub options_processing {
+ my $self = shift;
+
+ if ($self->opt_X) {
+ my $podidx = "$Config{'archlib'}/pod.idx";
+ $podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
+ $self->{'podidx'} = $podidx;
+ }
+
+ $self->{'output_to_stdout'} = 1 if $self->opt_T or ! -t STDOUT;
+
+ $self->options_sanity;
+
+ $self->opt_n("nroff") unless $self->opt_n;
+ $self->add_formatter_option( '__nroffer' => $self->opt_n );
+
+ return;
+}
+
+#..........................................................................
+
+sub options_sanity {
+ my $self = shift;
+
+ # The opts-counting stuff interacts quite badly with
+ # the $ENV{"PERLDOC"} stuff. I.e., if I have $ENV{"PERLDOC"}
+ # set to -t, and I specify -u on the command line, I don't want
+ # to be hectored at that -u and -t don't make sense together.
+
+ #my $opts = grep $_ && 1, # yes, the count of the set ones
+ # $self->opt_t, $self->opt_u, $self->opt_m, $self->opt_l
+ #;
+ #
+ #$self->usage("only one of -t, -u, -m or -l") if $opts > 1;
+
+
+ # Any sanity-checking need doing here?
+
+ return;
+}
+
+#..........................................................................
+
+sub grand_search_init {
+ my($self, $pages, @found) = @_;
+
+ foreach (@$pages) {
+ if ($self->{'podidx'} && open(PODIDX, $self->{'podidx'})) {
+ my $searchfor = catfile split '::', $_;
+ $self->aside( "Searching for '$searchfor' in $self->{'podidx'}\n" );
+ local $_;
+ while (<PODIDX>) {
+ chomp;
+ push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i;
+ }
+ close(PODIDX) or die "Can't close $$self{'podidx'}: $!";
+ next;
+ }
+
+ $self->aside( "Searching for $_\n" );
+
+ if ($self->opt_F) {
+ next unless -r;
+ push @found, $_ if $self->opt_m or $self->containspod($_);
+ next;
+ }
+
+ # We must look both in @INC for library modules and in $bindir
+ # for executables, like h2xs or perldoc itself.
+
+ my @searchdirs = ($self->{'bindir'}, @INC);
+ unless ($self->opt_m) {
+ if (IS_VMS) {
+ my($i,$trn);
+ for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
+ push(@searchdirs,$trn);
+ }
+ push(@searchdirs,'perl_root:[lib.pod]') # installed pods
+ }
+ else {
+ push(@searchdirs, grep(-d, split($Config{path_sep},
+ $ENV{'PATH'})));
+ }
+ }
+ my @files = $self->searchfor(0,$_,@searchdirs);
+ if (@files) {
+ $self->aside( "Found as @files\n" );
+ }
+ else {
+ # no match, try recursive search
+ @searchdirs = grep(!/^\.\z/s,@INC);
+ @files= $self->searchfor(1,$_,@searchdirs) if $self->opt_r;
+ if (@files) {
+ $self->aside( "Loosely found as @files\n" );
+ }
+ else {
+ print STDERR "No " .
+ ($self->opt_m ? "module" : "documentation") . " found for \"$_\".\n";
+ if ( @{ $self->{'found'} } ) {
+ print STDERR "However, try\n";
+ for my $dir (@{ $self->{'found'} }) {
+ opendir(DIR, $dir) or die "opendir $dir: $!";
+ while (my $file = readdir(DIR)) {
+ next if ($file =~ /^\./s);
+ $file =~ s/\.(pm|pod)\z//; # XXX: badfs
+ print STDERR "\tperldoc $_\::$file\n";
+ }
+ closedir(DIR) or die "closedir $dir: $!";
+ }
+ }
+ }
+ }
+ push(@found,@files);
+ }
+ return @found;
+}
+
+#..........................................................................
+
+sub maybe_generate_dynamic_pod {
+ my($self, $found_things) = @_;
+ my @dynamic_pod;
+
+ $self->search_perlfunc($found_things, \@dynamic_pod) if $self->opt_f;
+
+ $self->search_perlfaqs($found_things, \@dynamic_pod) if $self->opt_q;
+
+ if( ! $self->opt_f and ! $self->opt_q ) {
+ DEBUG > 4 and print "That's a non-dynamic pod search.\n";
+ } elsif ( @dynamic_pod ) {
+ $self->aside("Hm, I found some Pod from that search!\n");
+ my ($buffd, $buffer) = $self->new_tempfile('pod', 'dyn');
+
+ push @{ $self->{'temp_file_list'} }, $buffer;
+ # I.e., it MIGHT be deleted at the end.
+
+ print $buffd "=over 8\n\n";
+ print $buffd @dynamic_pod or die "Can't print $buffer: $!";
+ print $buffd "=back\n";
+ close $buffd or die "Can't close $buffer: $!";
+
+ @$found_things = $buffer;
+ # Yes, so found_things never has more than one thing in
+ # it, by time we leave here
+
+ $self->add_formatter_option('__filter_nroff' => 1);
+
+ } else {
+ @$found_things = ();
+ $self->aside("I found no Pod from that search!\n");
+ }
+
+ return;
+}
+
+#..........................................................................
+
+sub add_formatter_option { # $self->add_formatter_option('key' => 'value');
+ my $self = shift;
+ push @{ $self->{'formatter_switches'} }, [ @_ ] if @_;
+
+ DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+ join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+ return;
+}
+
+#..........................................................................
+
+sub search_perlfunc {
+ my($self, $found_things, $pod) = @_;
+
+ DEBUG > 2 and print "Search: @$found_things\n";
+
+ my $perlfunc = shift @$found_things;
+ open(PFUNC, "<", $perlfunc) # "Funk is its own reward"
+ or die("Can't open $perlfunc: $!");
+
+ # Functions like -r, -e, etc. are listed under `-X'.
+ my $search_re = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
+ ? '(?:I<)?-X' : quotemeta($self->opt_f) ;
+
+ DEBUG > 2 and
+ print "Going to perlfunc-scan for $search_re in $perlfunc\n";
+
+ # Skip introduction
+ local $_;
+ while (<PFUNC>) {
+ last if /^=head2 Alphabetical Listing of Perl Functions/;
+ }
+
+ # Look for our function
+ my $found = 0;
+ my $inlist = 0;
+ while (<PFUNC>) { # "The Mothership Connection is here!"
+ if ( m/^=item\s+$search_re\b/ ) {
+ $found = 1;
+ }
+ elsif (/^=item/) {
+ last if $found > 1 and not $inlist;
+ }
+ next unless $found;
+ if (/^=over/) {
+ ++$inlist;
+ }
+ elsif (/^=back/) {
+ --$inlist;
+ }
+ push @$pod, $_;
+ ++$found if /^\w/; # found descriptive text
+ }
+ if (!@$pod) {
+ die sprintf
+ "No documentation for perl function `%s' found\n",
+ $self->opt_f
+ ;
+ }
+ close PFUNC or die "Can't open $perlfunc: $!";
+
+ return;
+}
+
+#..........................................................................
+
+sub search_perlfaqs {
+ my( $self, $found_things, $pod) = @_;
+
+ my $found = 0;
+ my %found_in;
+ my $search_key = $self->opt_q;
+
+ my $rx = eval { qr/$search_key/ }
+ or die <<EOD;
+Invalid regular expression '$search_key' given as -q pattern:
+$@
+Did you mean \\Q$search_key ?
+
+EOD
+
+ local $_;
+ foreach my $file (@$found_things) {
+ die "invalid file spec: $!" if $file =~ /[<>|]/;
+ open(INFAQ, "<", $file) # XXX 5.6ism
+ or die "Can't read-open $file: $!\nAborting";
+ while (<INFAQ>) {
+ if ( m/^=head2\s+.*(?:$search_key)/i ) {
+ $found = 1;
+ push @$pod, "=head1 Found in $file\n\n" unless $found_in{$file}++;
+ }
+ elsif (/^=head[12]/) {
+ $found = 0;
+ }
+ next unless $found;
+ push @$pod, $_;
+ }
+ close(INFAQ);
+ }
+ die("No documentation for perl FAQ keyword `$search_key' found\n")
+ unless @$pod;
+
+ return;
+}
+
+
+#..........................................................................
+
+sub render_findings {
+ # Return the filename to open
+
+ my($self, $found_things) = @_;
+
+ my $formatter_class = $self->{'formatter_class'}
+ || die "No formatter class set!?";
+ my $formatter = $formatter_class->can('new')
+ ? $formatter_class->new
+ : $formatter_class
+ ;
+
+ if(! @$found_things) {
+ die "Nothing found?!";
+ # should have been caught before here
+ } elsif(@$found_things > 1) {
+ warn join '',
+ "Perldoc is only really meant for reading one document at a time.\n",
+ "So these parameters are being ignored: ",
+ join(' ', @$found_things[1 .. $#$found_things] ),
+ "\n"
+ }
+
+ my $file = $found_things->[0];
+
+ DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+ join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+ # Set formatter options:
+ if( ref $formatter ) {
+ foreach my $f (@{ $self->{'formatter_switches'} || [] }) {
+ my($switch, $value, $silent_fail) = @$f;
+ if( $formatter->can($switch) ) {
+ eval { $formatter->$switch( defined($value) ? $value : () ) };
+ warn "Got an error when setting $formatter_class\->$switch:\n$@\n"
+ if $@;
+ } else {
+ if( $silent_fail or $switch =~ m/^__/s ) {
+ DEBUG > 2 and print "Formatter $formatter_class doesn't support $switch\n";
+ } else {
+ warn "$formatter_class doesn't recognize the $switch switch.\n";
+ }
+ }
+ }
+ }
+
+ $self->{'output_is_binary'} =
+ $formatter->can('write_with_binmode') && $formatter->write_with_binmode;
+
+ my ($out_fh, $out) = $self->new_output_file(
+ ( $formatter->can('output_extension') && $formatter->output_extension )
+ || undef,
+ $self->useful_filename_bit,
+ );
+
+ # Now, finally, do the formatting!
+ {
+ local $^W = $^W;
+ if(DEBUG() or $self->opt_v) {
+ # feh, let 'em see it
+ } else {
+ $^W = 0;
+ # The average user just has no reason to be seeing
+ # $^W-suppressable warnings from the formatting!
+ }
+
+ eval { $formatter->parse_from_file( $file, $out_fh ) };
+ }
+
+ warn "Error while formatting with $formatter_class:\n $@\n" if $@;
+ DEBUG > 2 and print "Back from formatting with $formatter_class\n";
+
+ close $out_fh
+ or warn "Can't close $out: $!\n(Did $formatter already close it?)";
+ sleep 0; sleep 0; sleep 0;
+ # Give the system a few timeslices to meditate on the fact
+ # that the output file does in fact exist and is closed.
+
+ $self->unlink_if_temp_file($file);
+
+ unless( -s $out ) {
+ if( $formatter->can( 'if_zero_length' ) ) {
+ # Basically this is just a hook for Pod::Simple::Checker; since
+ # what other class could /happily/ format an input file with Pod
+ # as a 0-length output file?
+ $formatter->if_zero_length( $file, $out, $out_fh );
+ } else {
+ warn "Got a 0-length file from $$found_things[0] via $formatter_class!?\n"
+ }
+ }
+
+ DEBUG and print "Finished writing to $out.\n";
+ return($out, $formatter) if wantarray;
+ return $out;
+}
+
+#..........................................................................
+
+sub unlink_if_temp_file {
+ # Unlink the specified file IFF it's in the list of temp files.
+ # Really only used in the case of -f / -q things when we can
+ # throw away the dynamically generated source pod file once
+ # we've formatted it.
+ #
+ my($self, $file) = @_;
+ return unless defined $file and length $file;
+
+ my $temp_file_list = $self->{'temp_file_list'} || return;
+ if(grep $_ eq $file, @$temp_file_list) {
+ $self->aside("Unlinking $file\n");
+ unlink($file) or warn "Odd, couldn't unlink $file: $!";
+ } else {
+ DEBUG > 1 and print "$file isn't a temp file, so not unlinking.\n";
+ }
+ return;
+}
+
+#..........................................................................
+
+sub MSWin_temp_cleanup {
+
+ # Nothing particularly MSWin-specific in here, but I don't know if any
+ # other OS needs its temp dir policed like MSWin does!
+
+ my $self = shift;
+
+ my $tempdir = $ENV{'TEMP'};
+ return unless defined $tempdir and length $tempdir
+ and -e $tempdir and -d _ and -w _;
+
+ $self->aside(
+ "Considering whether any old files of mine in $tempdir need unlinking.\n"
+ );
+
+ opendir(TMPDIR, $tempdir) || return;
+ my @to_unlink;
+
+ my $limit = time() - $Temp_File_Lifetime;
+
+ DEBUG > 5 and printf "Looking for things pre-dating %s (%x)\n",
+ ($limit) x 2;
+
+ my $filespec;
+
+ while(defined($filespec = readdir(TMPDIR))) {
+ if(
+ $filespec =~ m{^perldoc_[a-zA-Z0-9]+_T([a-fA-F0-9]{7,})_[a-fA-F0-9]{3,}}s
+ ) {
+ if( hex($1) < $limit ) {
+ push @to_unlink, "$tempdir/$filespec";
+ $self->aside( "Will unlink my old temp file $to_unlink[-1]\n" );
+ } else {
+ DEBUG > 5 and
+ printf " $tempdir/$filespec is too recent (after %x)\n", $limit;
+ }
+ } else {
+ DEBUG > 5 and
+ print " $tempdir/$filespec doesn't look like a perldoc temp file.\n";
+ }
+ }
+ closedir(TMPDIR);
+ $self->aside(sprintf "Unlinked %s items of mine in %s\n",
+ scalar(unlink(@to_unlink)),
+ $tempdir
+ );
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub MSWin_perldoc_tempfile {
+ my($self, $suffix, $infix) = @_;
+
+ my $tempdir = $ENV{'TEMP'};
+ return unless defined $tempdir and length $tempdir
+ and -e $tempdir and -d _ and -w _;
+
+ my $spec;
+
+ do {
+ $spec = sprintf "%s/perldoc_%s_T%x_%x%02x.%s", # used also in MSWin_temp_cleanup
+ # Yes, we embed the create-time in the filename!
+ $tempdir,
+ $infix || 'x',
+ time(),
+ $$,
+ defined( &Win32::GetTickCount )
+ ? (Win32::GetTickCount() & 0xff)
+ : int(rand 256)
+ # Under MSWin, $$ values get reused quickly! So if we ran
+ # perldoc foo and then perldoc bar before there was time for
+ # time() to increment time."_$$" would likely be the same
+ # for each process! So we tack on the tick count's lower
+ # bits (or, in a pinch, rand)
+ ,
+ $suffix || 'txt';
+ ;
+ } while( -e $spec );
+
+ my $counter = 0;
+
+ while($counter < 50) {
+ my $fh;
+ # If we are running before perl5.6.0, we can't autovivify
+ if ($] < 5.006) {
+ require Symbol;
+ $fh = Symbol::gensym();
+ }
+ DEBUG > 3 and print "About to try making temp file $spec\n";
+ return($fh, $spec) if open($fh, ">", $spec); # XXX 5.6ism
+ $self->aside("Can't create temp file $spec: $!\n");
+ }
+
+ $self->aside("Giving up on making a temp file!\n");
+ die "Can't make a tempfile!?";
+}
+
+#..........................................................................
+
+
+sub after_rendering {
+ my $self = $_[0];
+ $self->after_rendering_VMS if IS_VMS;
+ $self->after_rendering_MSWin32 if IS_MSWin32;
+ $self->after_rendering_Dos if IS_Dos;
+ $self->after_rendering_OS2 if IS_OS2;
+ return;
+}
+
+sub after_rendering_VMS { return }
+sub after_rendering_Dos { return }
+sub after_rendering_OS2 { return }
+
+sub after_rendering_MSWin32 {
+ shift->MSWin_temp_cleanup() if $Temp_Files_Created;
+}
+
+#..........................................................................
+# : : : : : : : : :
+#..........................................................................
+
+
+sub minus_f_nocase { # i.e., do like -f, but without regard to case
+
+ my($self, $dir, $file) = @_;
+ my $path = catfile($dir,$file);
+ return $path if -f $path and -r _;
+
+ if(!$self->opt_i
+ or IS_VMS or IS_MSWin32
+ or IS_Dos or IS_OS2
+ ) {
+ # On a case-forgiving file system, or if case is important,
+ # that is it, all we can do.
+ warn "Ignored $path: unreadable\n" if -f _;
+ return '';
+ }
+
+ local *DIR;
+ my @p = ($dir);
+ my($p,$cip);
+ foreach $p (splitdir $file){
+ my $try = catfile @p, $p;
+ $self->aside("Scrutinizing $try...\n");
+ stat $try;
+ if (-d _) {
+ push @p, $p;
+ if ( $p eq $self->{'target'} ) {
+ my $tmp_path = catfile @p;
+ my $path_f = 0;
+ for (@{ $self->{'found'} }) {
+ $path_f = 1 if $_ eq $tmp_path;
+ }
+ push (@{ $self->{'found'} }, $tmp_path) unless $path_f;
+ $self->aside( "Found as $tmp_path but directory\n" );
+ }
+ }
+ elsif (-f _ && -r _) {
+ return $try;
+ }
+ elsif (-f _) {
+ warn "Ignored $try: unreadable\n";
+ }
+ elsif (-d catdir(@p)) { # at least we see the containing directory!
+ my $found = 0;
+ my $lcp = lc $p;
+ my $p_dirspec = catdir(@p);
+ opendir DIR, $p_dirspec or die "opendir $p_dirspec: $!";
+ while(defined( $cip = readdir(DIR) )) {
+ if (lc $cip eq $lcp){
+ $found++;
+ last; # XXX stop at the first? what if there's others?
+ }
+ }
+ closedir DIR or die "closedir $p_dirspec: $!";
+ return "" unless $found;
+
+ push @p, $cip;
+ my $p_filespec = catfile(@p);
+ return $p_filespec if -f $p_filespec and -r _;
+ warn "Ignored $p_filespec: unreadable\n" if -f _;
+ }
+ }
+ return "";
+}
+
+#..........................................................................
+
+sub pagers_guessing {
+ my $self = shift;
+
+ my @pagers;
+ push @pagers, $self->pagers;
+ $self->{'pagers'} = \@pagers;
+
+ if (IS_MSWin32) {
+ push @pagers, qw( more< less notepad );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ }
+ elsif (IS_VMS) {
+ push @pagers, qw( most more less type/page );
+ }
+ elsif (IS_Dos) {
+ push @pagers, qw( less.exe more.com< );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ }
+ else {
+ if (IS_OS2) {
+ unshift @pagers, 'less', 'cmd /c more <';
+ }
+ push @pagers, qw( more less pg view cat );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ }
+ unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
+
+ return;
+}
+
+#..........................................................................
+
+sub page_module_file {
+ my($self, @found) = @_;
+
+ # Security note:
+ # Don't ever just pass this off to anything like MSWin's "start.exe",
+ # since we might be calling on a .pl file, and we wouldn't want that
+ # to actually /execute/ the file that we just want to page thru!
+ # Also a consideration if one were to use a web browser as a pager;
+ # doing so could trigger the browser's MIME mapping for whatever
+ # it thinks .pm/.pl/whatever is. Probably just a (useless and
+ # annoying) "Save as..." dialog, but potentially executing the file
+ # in question -- particularly in the case of MSIE and it's, ahem,
+ # occasionally hazy distinction between OS-local extension
+ # associations, and browser-specific MIME mappings.
+
+ if ($self->{'output_to_stdout'}) {
+ $self->aside("Sending unpaged output to STDOUT.\n");
+ local $_;
+ my $any_error = 0;
+ foreach my $output (@found) {
+ unless( open(TMP, "<", $output) ) { # XXX 5.6ism
+ warn("Can't open $output: $!");
+ $any_error = 1;
+ next;
+ }
+ while (<TMP>) {
+ print or die "Can't print to stdout: $!";
+ }
+ close TMP or die "Can't close while $output: $!";
+ $self->unlink_if_temp_file($output);
+ }
+ return $any_error; # successful
+ }
+
+ foreach my $pager ( $self->pagers ) {
+ $self->aside("About to try calling $pager @found\n");
+ if (system($pager, @found) == 0) {
+ $self->aside("Yay, it worked.\n");
+ return 0;
+ }
+ $self->aside("That didn't work.\n");
+
+ # Odd -- when it fails, under Win32, this seems to neither
+ # return with a fail nor return with a success!!
+ # That's discouraging!
+ }
+
+ $self->aside(
+ sprintf "Can't manage to find a way to page [%s] via pagers [%s]\n",
+ join(' ', @found),
+ join(' ', $self->pagers),
+ );
+
+ if (IS_VMS) {
+ DEBUG > 1 and print "Bailing out in a VMSish way.\n";
+ eval q{
+ use vmsish qw(status exit);
+ exit $?;
+ 1;
+ } or die;
+ }
+
+ return 1;
+ # i.e., an UNSUCCESSFUL return value!
+}
+
+#..........................................................................
+
+sub check_file {
+ my($self, $dir, $file) = @_;
+
+ unless( ref $self ) {
+ # Should never get called:
+ $Carp::Verbose = 1;
+ Carp::croak join '',
+ "Crazy ", __PACKAGE__, " error:\n",
+ "check_file must be an object_method!\n",
+ "Aborting"
+ }
+
+ if(length $dir and not -d $dir) {
+ DEBUG > 3 and print " No dir $dir -- skipping.\n";
+ return "";
+ }
+
+ if ($self->opt_m) {
+ return $self->minus_f_nocase($dir,$file);
+ }
+
+ else {
+ my $path = $self->minus_f_nocase($dir,$file);
+ if( length $path and $self->containspod($path) ) {
+ DEBUG > 3 and print
+ " The file $path indeed looks promising!\n";
+ return $path;
+ }
+ }
+ DEBUG > 3 and print " No good: $file in $dir\n";
+
+ return "";
+}
+
+#..........................................................................
+
+sub containspod {
+ my($self, $file, $readit) = @_;
+ return 1 if !$readit && $file =~ /\.pod\z/i;
+
+
+ # Under cygwin the /usr/bin/perl is legal executable, but
+ # you cannot open a file with that name. It must be spelled
+ # out as "/usr/bin/perl.exe".
+ #
+ # The following if-case under cygwin prevents error
+ #
+ # $ perldoc perl
+ # Cannot open /usr/bin/perl: no such file or directory
+ #
+ # This would work though
+ #
+ # $ perldoc perl.pod
+
+ if ( IS_Cygwin and -x $file and -f "$file.exe" )
+ {
+ warn "Cygwin $file.exe search skipped\n" if DEBUG or $self->opt_v;
+ return 0;
+ }
+
+ local($_);
+ open(TEST,"<", $file) or die "Can't open $file: $!"; # XXX 5.6ism
+ while (<TEST>) {
+ if (/^=head/) {
+ close(TEST) or die "Can't close $file: $!";
+ return 1;
+ }
+ }
+ close(TEST) or die "Can't close $file: $!";
+ return 0;
+}
+
+#..........................................................................
+
+sub maybe_diddle_INC {
+ my $self = shift;
+
+ # Does this look like a module or extension directory?
+
+ if (-f "Makefile.PL") {
+
+ # Add "." and "lib" to @INC (if they exist)
+ eval q{ use lib qw(. lib); 1; } or die;
+
+ # don't add if superuser
+ if ($< && $> && -f "blib") { # don't be looking too hard now!
+ eval q{ use blib; 1 };
+ warn $@ if $@ && $self->opt_v;
+ }
+ }
+
+ return;
+}
+
+#..........................................................................
+
+sub new_output_file {
+ my $self = shift;
+ my $outspec = $self->opt_d; # Yes, -d overrides all else!
+ # So don't call this twice per format-job!
+
+ return $self->new_tempfile(@_) unless defined $outspec and length $outspec;
+
+ # Otherwise open a write-handle on opt_d!f
+
+ my $fh;
+ # If we are running before perl5.6.0, we can't autovivify
+ if ($] < 5.006) {
+ require Symbol;
+ $fh = Symbol::gensym();
+ }
+ DEBUG > 3 and print "About to try writing to specified output file $outspec\n";
+ die "Can't write-open $outspec: $!"
+ unless open($fh, ">", $outspec); # XXX 5.6ism
+
+ DEBUG > 3 and print "Successfully opened $outspec\n";
+ binmode($fh) if $self->{'output_is_binary'};
+ return($fh, $outspec);
+}
+
+#..........................................................................
+
+sub useful_filename_bit {
+ # This tries to provide a meaningful bit of text to do with the query,
+ # such as can be used in naming the file -- since if we're going to be
+ # opening windows on temp files (as a "pager" may well do!) then it's
+ # better if the temp file's name (which may well be used as the window
+ # title) isn't ALL just random garbage!
+ # In other words "perldoc_LWPSimple_2371981429" is a better temp file
+ # name than "perldoc_2371981429". So this routine is what tries to
+ # provide the "LWPSimple" bit.
+ #
+ my $self = shift;
+ my $pages = $self->{'pages'} || return undef;
+ return undef unless @$pages;
+
+ my $chunk = $pages->[0];
+ return undef unless defined $chunk;
+ $chunk =~ s/:://g;
+ $chunk =~ s/\.\w+$//g; # strip any extension
+ if( $chunk =~ m/([^\#\\:\/\$]+)$/s ) { # get basename, if it's a file
+ $chunk = $1;
+ } else {
+ return undef;
+ }
+ $chunk =~ s/[^a-zA-Z0-9]+//g; # leave ONLY a-zA-Z0-9 things!
+ $chunk = substr($chunk, -10) if length($chunk) > 10;
+ return $chunk;
+}
+
+#..........................................................................
+
+sub new_tempfile { # $self->new_tempfile( [$suffix, [$infix] ] )
+ my $self = shift;
+
+ ++$Temp_Files_Created;
+
+ if( IS_MSWin32 ) {
+ my @out = $self->MSWin_perldoc_tempfile(@_);
+ return @out if @out;
+ # otherwise fall thru to the normal stuff below...
+ }
+
+ require File::Temp;
+ return File::Temp::tempfile(UNLINK => 1);
+}
+
+#..........................................................................
+
+sub page { # apply a pager to the output file
+ my ($self, $output, $output_to_stdout, @pagers) = @_;
+ if ($output_to_stdout) {
+ $self->aside("Sending unpaged output to STDOUT.\n");
+ open(TMP, "<", $output) or die "Can't open $output: $!"; # XXX 5.6ism
+ local $_;
+ while (<TMP>) {
+ print or die "Can't print to stdout: $!";
+ }
+ close TMP or die "Can't close while $output: $!";
+ $self->unlink_if_temp_file($output);
+ } else {
+ # On VMS, quoting prevents logical expansion, and temp files with no
+ # extension get the wrong default extension (such as .LIS for TYPE)
+
+ $output = VMS::Filespec::rmsexpand($output, '.') if IS_VMS;
+ foreach my $pager (@pagers) {
+ $self->aside("About to try calling $pager $output\n");
+ if (IS_VMS) {
+ last if system("$pager $output") == 0;
+ } else {
+ last if system("$pager \"$output\"") == 0;
+ }
+ }
+ }
+ return;
+}
+
+#..........................................................................
+
+sub searchfor {
+ my($self, $recurse,$s,@dirs) = @_;
+ $s =~ s!::!/!g;
+ $s = VMS::Filespec::unixify($s) if IS_VMS;
+ return $s if -f $s && $self->containspod($s);
+ $self->aside( "Looking for $s in @dirs\n" );
+ my $ret;
+ my $i;
+ my $dir;
+ $self->{'target'} = (splitdir $s)[-1]; # XXX: why not use File::Basename?
+ for ($i=0; $i<@dirs; $i++) {
+ $dir = $dirs[$i];
+ ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if IS_VMS;
+ if ( (! $self->opt_m && ( $ret = $self->check_file($dir,"$s.pod")))
+ or ( $ret = $self->check_file($dir,"$s.pm"))
+ or ( $ret = $self->check_file($dir,$s))
+ or ( IS_VMS and
+ $ret = $self->check_file($dir,"$s.com"))
+ or ( IS_OS2 and
+ $ret = $self->check_file($dir,"$s.cmd"))
+ or ( (IS_MSWin32 or IS_Dos or IS_OS2) and
+ $ret = $self->check_file($dir,"$s.bat"))
+ or ( $ret = $self->check_file("$dir/pod","$s.pod"))
+ or ( $ret = $self->check_file("$dir/pod",$s))
+ or ( $ret = $self->check_file("$dir/pods","$s.pod"))
+ or ( $ret = $self->check_file("$dir/pods",$s))
+ ) {
+ DEBUG > 1 and print " Found $ret\n";
+ return $ret;
+ }
+
+ if ($recurse) {
+ opendir(D,$dir) or die "Can't opendir $dir: $!";
+ my @newdirs = map catfile($dir, $_), grep {
+ not /^\.\.?\z/s and
+ not /^auto\z/s and # save time! don't search auto dirs
+ -d catfile($dir, $_)
+ } readdir D;
+ closedir(D) or die "Can't closedir $dir: $!";
+ next unless @newdirs;
+ # what a wicked map!
+ @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if IS_VMS;
+ $self->aside( "Also looking in @newdirs\n" );
+ push(@dirs,@newdirs);
+ }
+ }
+ return ();
+}
+
+#..........................................................................
+{
+ my $already_asserted;
+ sub assert_closing_stdout {
+ my $self = shift;
+
+ return if $already_asserted;
+
+ eval q~ END { close(STDOUT) || die "Can't close STDOUT: $!" } ~;
+ # What for? to let the pager know that nothing more will come?
+
+ die $@ if $@;
+ $already_asserted = 1;
+ return;
+ }
+}
+
+#..........................................................................
+
+sub tweak_found_pathnames {
+ my($self, $found) = @_;
+ if (IS_MSWin32) {
+ foreach (@$found) { s,/,\\,g }
+ }
+ return;
+}
+
+#..........................................................................
+# : : : : : : : : :
+#..........................................................................
+
+sub am_taint_checking {
+ my $self = shift;
+ die "NO ENVIRONMENT?!?!" unless keys %ENV; # reset iterator along the way
+ my($k,$v) = each %ENV;
+ return is_tainted($v);
+}
+
+#..........................................................................
+
+sub is_tainted { # just a function
+ my $arg = shift;
+ my $nada = substr($arg, 0, 0); # zero-length!
+ local $@; # preserve the caller's version of $@
+ eval { eval "# $nada" };
+ return length($@) != 0;
+}
+
+#..........................................................................
+
+sub drop_privs_maybe {
+ my $self = shift;
+
+ # Attempt to drop privs if we should be tainting and aren't
+ if (!(IS_VMS || IS_MSWin32 || IS_Dos
+ || IS_OS2
+ )
+ && ($> == 0 || $< == 0)
+ && !$self->am_taint_checking()
+ ) {
+ my $id = eval { getpwnam("nobody") };
+ $id = eval { getpwnam("nouser") } unless defined $id;
+ $id = -2 unless defined $id;
+ #
+ # According to Stevens' APUE and various
+ # (BSD, Solaris, HP-UX) man pages, setting
+ # the real uid first and effective uid second
+ # is the way to go if one wants to drop privileges,
+ # because if one changes into an effective uid of
+ # non-zero, one cannot change the real uid any more.
+ #
+ # Actually, it gets even messier. There is
+ # a third uid, called the saved uid, and as
+ # long as that is zero, one can get back to
+ # uid of zero. Setting the real-effective *twice*
+ # helps in *most* systems (FreeBSD and Solaris)
+ # but apparently in HP-UX even this doesn't help:
+ # the saved uid stays zero (apparently the only way
+ # in HP-UX to change saved uid is to call setuid()
+ # when the effective uid is zero).
+ #
+ eval {
+ $< = $id; # real uid
+ $> = $id; # effective uid
+ $< = $id; # real uid
+ $> = $id; # effective uid
+ };
+ if( !$@ && $< && $> ) {
+ DEBUG and print "OK, I dropped privileges.\n";
+ } elsif( $self->opt_U ) {
+ DEBUG and print "Couldn't drop privileges, but in -U mode, so feh."
+ } else {
+ DEBUG and print "Hm, couldn't drop privileges. Ah well.\n";
+ # We used to die here; but that seemed pointless.
+ }
+ }
+ return;
+}
+
+#..........................................................................
+
+1;
+
+__END__
+
+# See "perldoc perldoc" for basic details.
+#
+# Perldoc -- look up a piece of documentation in .pod format that
+# is embedded in the perl installation tree.
+#
+#~~~~~~
+#
+# See ChangeLog in CPAN dist for Pod::Perldoc for later notes.
+#
+# Version 3.01: Sun Nov 10 21:38:09 MST 2002
+# Sean M. Burke <sburke@cpan.org>
+# Massive refactoring and code-tidying.
+# Now it's a module(-family)!
+# Formatter-specific stuff pulled out into Pod::Perldoc::To(Whatever).pm
+# Added -T, -d, -o, -M, -w.
+# Added some improved MSWin funk.
+#
+#~~~~~~
+#
+# Version 2.05: Sat Oct 12 16:09:00 CEST 2002
+# Hugo van der Sanden <hv@crypt.org>
+# Made -U the default, based on patch from Simon Cozens
+# Version 2.04: Sun Aug 18 13:27:12 BST 2002
+# Randy W. Sims <RandyS@ThePierianSpring.org>
+# allow -n to enable nroff under Win32
+# Version 2.03: Sun Apr 23 16:56:34 BST 2000
+# Hugo van der Sanden <hv@crypt.org>
+# don't die when 'use blib' fails
+# Version 2.02: Mon Mar 13 18:03:04 MST 2000
+# Tom Christiansen <tchrist@perl.com>
+# Added -U insecurity option
+# Version 2.01: Sat Mar 11 15:22:33 MST 2000
+# Tom Christiansen <tchrist@perl.com>, querulously.
+# Security and correctness patches.
+# What a twisted bit of distasteful spaghetti code.
+# Version 2.0: ????
+#
+#~~~~~~
+#
+# Version 1.15: Tue Aug 24 01:50:20 EST 1999
+# Charles Wilson <cwilson@ece.gatech.edu>
+# changed /pod/ directory to /pods/ for cygwin
+# to support cygwin/win32
+# Version 1.14: Wed Jul 15 01:50:20 EST 1998
+# Robin Barker <rmb1@cise.npl.co.uk>
+# -strict, -w cleanups
+# Version 1.13: Fri Feb 27 16:20:50 EST 1997
+# Gurusamy Sarathy <gsar@activestate.com>
+# -doc tweaks for -F and -X options
+# Version 1.12: Sat Apr 12 22:41:09 EST 1997
+# Gurusamy Sarathy <gsar@activestate.com>
+# -various fixes for win32
+# Version 1.11: Tue Dec 26 09:54:33 EST 1995
+# Kenneth Albanowski <kjahds@kjahds.com>
+# -added Charles Bailey's further VMS patches, and -u switch
+# -added -t switch, with pod2text support
+#
+# Version 1.10: Thu Nov 9 07:23:47 EST 1995
+# Kenneth Albanowski <kjahds@kjahds.com>
+# -added VMS support
+# -added better error recognition (on no found pages, just exit. On
+# missing nroff/pod2man, just display raw pod.)
+# -added recursive/case-insensitive matching (thanks, Andreas). This
+# slows things down a bit, unfortunately. Give a precise name, and
+# it'll run faster.
+#
+# Version 1.01: Tue May 30 14:47:34 EDT 1995
+# Andy Dougherty <doughera@lafcol.lafayette.edu>
+# -added pod documentation.
+# -added PATH searching.
+# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod
+# and friends.
+#
+#~~~~~~~
+#
+# TODO:
+#
+# Cache the directories read during sloppy match
+# (To disk, or just in-memory?)
+#
+# Backport this to perl 5.005?
+#
+# Implement at least part of the "perlman" interface described
+# in Programming Perl 3e?
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/BaseTo.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/BaseTo.pm
new file mode 100644
index 00000000000..6ca2a8c7e54
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/BaseTo.pm
@@ -0,0 +1,28 @@
+
+require 5;
+package Pod::Perldoc::BaseTo;
+use strict;
+use warnings;
+
+sub is_pageable { '' }
+sub write_with_binmode { 1 }
+
+sub output_extension { 'txt' } # override in subclass!
+
+# sub new { my $self = shift; ... }
+# sub parse_from_file( my($class, $in, $out) = ...; ... }
+
+#sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub _perldoc_elem {
+ my($self, $name) = splice @_,0,2;
+ if(@_) {
+ $self->{$name} = $_[0];
+ } else {
+ $self->{$name};
+ }
+}
+
+
+1;
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/GetOptsOO.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/GetOptsOO.pm
new file mode 100644
index 00000000000..b29aeb10906
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/GetOptsOO.pm
@@ -0,0 +1,106 @@
+
+require 5;
+package Pod::Perldoc::GetOptsOO;
+use strict;
+
+# Rather like Getopt::Std's getopts
+# Call Pod::Perldoc::GetOptsOO::getopts($object, \@ARGV, $truth)
+# Given -n, if there's a opt_n_with, it'll call $object->opt_n_with( ARGUMENT )
+# (e.g., "-n foo" => $object->opt_n_with('foo'). Ditto "-nfoo")
+# Otherwise (given -n) if there's an opt_n, we'll call it $object->opt_n($truth)
+# (Truth defaults to 1)
+# Otherwise we try calling $object->handle_unknown_option('n')
+# (and we increment the error count by the return value of it)
+# If there's no handle_unknown_option, then we just warn, and then increment
+# the error counter
+#
+# The return value of Pod::Perldoc::GetOptsOO::getopts is true if no errors,
+# otherwise it's false.
+#
+## sburke@cpan.org 2002-10-31
+
+BEGIN { # Make a DEBUG constant ASAP
+ *DEBUG = defined( &Pod::Perldoc::DEBUG )
+ ? \&Pod::Perldoc::DEBUG
+ : sub(){10};
+}
+
+
+sub getopts {
+ my($target, $args, $truth) = @_;
+
+ $args ||= \@ARGV;
+
+ $target->aside(
+ "Starting switch processing. Scanning arguments [@$args]\n"
+ ) if $target->can('aside');
+
+ return unless @$args;
+
+ $truth = 1 unless @_ > 2;
+
+ DEBUG > 3 and print " Truth is $truth\n";
+
+
+ my $error_count = 0;
+
+ while( @$args and ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) {
+ my($first,$rest) = ($1,$2);
+ if ($_ eq '--') { # early exit if "--"
+ shift @$args;
+ last;
+ }
+ my $method = "opt_${first}_with";
+ if( $target->can($method) ) { # it's argumental
+ if($rest eq '') { # like -f bar
+ shift @$args;
+ warn "Option $first needs a following argument!\n" unless @$args;
+ $rest = shift @$args;
+ } else { # like -fbar (== -f bar)
+ shift @$args;
+ }
+
+ DEBUG > 3 and print " $method => $rest\n";
+ $target->$method( $rest );
+
+ # Otherwise, it's not argumental...
+ } else {
+
+ if( $target->can( $method = "opt_$first" ) ) {
+ DEBUG > 3 and print " $method is true ($truth)\n";
+ $target->$method( $truth );
+
+ # Otherwise it's an unknown option...
+
+ } elsif( $target->can('handle_unknown_option') ) {
+ DEBUG > 3
+ and print " calling handle_unknown_option('$first')\n";
+
+ $error_count += (
+ $target->handle_unknown_option( $first ) || 0
+ );
+
+ } else {
+ ++$error_count;
+ warn "Unknown option: $first\n";
+ }
+
+ if($rest eq '') { # like -f
+ shift @$args
+ } else { # like -fbar (== -f -bar )
+ DEBUG > 2 and print " Setting args->[0] to \"-$rest\"\n";
+ $args->[0] = "-$rest";
+ }
+ }
+ }
+
+
+ $target->aside(
+ "Ending switch processing. Args are [@$args] with $error_count errors.\n"
+ ) if $target->can('aside');
+
+ $error_count == 0;
+}
+
+1;
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToChecker.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToChecker.pm
new file mode 100644
index 00000000000..c60290d6502
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToChecker.pm
@@ -0,0 +1,72 @@
+
+require 5;
+package Pod::Perldoc::ToChecker;
+use strict;
+use warnings;
+use vars qw(@ISA);
+
+# Pick our superclass...
+#
+eval 'require Pod::Simple::Checker';
+if($@) {
+ require Pod::Checker;
+ @ISA = ('Pod::Checker');
+} else {
+ @ISA = ('Pod::Simple::Checker');
+}
+
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' }
+
+sub if_zero_length {
+ my( $self, $file, $tmp, $tmpfd ) = @_;
+ print "No Pod errors in $file\n";
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToChecker - let Perldoc check Pod for errors
+
+=head1 SYNOPSIS
+
+ % perldoc -o checker SomeFile.pod
+ No Pod errors in SomeFile.pod
+ (or an error report)
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::Checker as a "formatter" class (or if that is
+not available, then Pod::Checker), to check for errors in a given
+Pod file.
+
+This is actually a Pod::Simple::Checker (or Pod::Checker) subclass, and
+inherits all its options.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::Checker>, L<Pod::Simple>, L<Pod::Checker>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToMan.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToMan.pm
new file mode 100644
index 00000000000..12c2a68fba1
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToMan.pm
@@ -0,0 +1,175 @@
+
+require 5;
+package Pod::Perldoc::ToMan;
+use strict;
+use warnings;
+
+# This class is unlike ToText.pm et al, because we're NOT paging thru
+# the output in our particular format -- we make the output and
+# then we run nroff (or whatever) on it, and then page thru the
+# (plaintext) output of THAT!
+
+use base qw(Pod::Perldoc::BaseTo);
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' }
+
+sub __filter_nroff { shift->_perldoc_elem('__filter_nroff' , @_) }
+sub __nroffer { shift->_perldoc_elem('__nroffer' , @_) }
+sub __bindir { shift->_perldoc_elem('__bindir' , @_) }
+sub __pod2man { shift->_perldoc_elem('__pod2man' , @_) }
+sub __output_file { shift->_perldoc_elem('__output_file' , @_) }
+
+sub center { shift->_perldoc_elem('center' , @_) }
+sub date { shift->_perldoc_elem('date' , @_) }
+sub fixed { shift->_perldoc_elem('fixed' , @_) }
+sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) }
+sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) }
+sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
+sub quotes { shift->_perldoc_elem('quotes' , @_) }
+sub release { shift->_perldoc_elem('release' , @_) }
+sub section { shift->_perldoc_elem('section' , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+use File::Spec::Functions qw(catfile);
+
+sub parse_from_file {
+ my $self = shift;
+ my($file, $outfh) = @_;
+
+ my $render = $self->{'__nroffer'} || die "no nroffer set!?";
+
+ # turn the switches into CLIs
+ my $switches = join ' ',
+ map qq{"--$_=$self->{$_}"},
+ grep !m/^_/s,
+ keys %$self
+ ;
+
+ my $command =
+ catfile(
+ ($self->{'__bindir'} || die "no bindir set?!" ),
+ ($self->{'__pod2man'} || die "no pod2man set?!" ),
+ )
+ . " $switches --lax $file | $render -man"
+ ; # no temp file, just a pipe!
+
+ # Thanks to Brendan O'Dea for contributing the following block
+ if(Pod::Perldoc::IS_Linux and -t STDOUT
+ and my ($cols) = `stty -a` =~ m/\bcolumns\s+(\d+)/
+ ) {
+ my $c = $cols * 39 / 40;
+ $cols = $c > $cols - 2 ? $c : $cols -2;
+ $command .= ' -rLL=' . (int $c) . 'n' if $cols > 80;
+ }
+
+ # I hear persistent reports that adding a -c switch to $render
+ # solves many people's problems. But I also hear that some mans
+ # don't have a -c switch, so that adding it here would presumably
+ # be a Bad Thing -- sburke@cpan.org
+
+ $command .= " | col -x" if Pod::Perldoc::IS_HPUX;
+
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "About to run $command\n";
+ ;
+
+ my $rslt = `$command`;
+
+ my $err;
+
+ if( $self->{'__filter_nroff'} ) {
+ defined(&Pod::Perldoc::DEBUG)
+ and &Pod::Perldoc::DEBUG()
+ and print "filter_nroff is set, so filtering...\n";
+ $rslt = $self->___Do_filter_nroff($rslt);
+ } else {
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "filter_nroff isn't set, so not filtering.\n";
+ }
+
+ if (($err = $?)) {
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "Nonzero exit ($?) while running $command.\n",
+ "Falling back to Pod::Perldoc::ToPod\n ",
+ ;
+ # A desperate fallthru:
+ require Pod::Perldoc::ToPod;
+ return Pod::Perldoc::ToPod->new->parse_from_file(@_);
+
+ } else {
+ print $outfh $rslt
+ or die "Can't print to $$self{__output_file}: $!";
+ }
+
+ return;
+}
+
+
+sub ___Do_filter_nroff {
+ my $self = shift;
+ my @data = split /\n{2,}/, shift;
+
+ shift @data while @data and $data[0] !~ /\S/; # Go to header
+ shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
+ pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
+ # 28/Jan/99 perl 5.005, patch 53 1
+ join "\n\n", @data;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
+
+=head1 SYNOPSIS
+
+ perldoc -o man Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Man and C<nroff> for reading Pod pages.
+
+The following options are supported: center, date, fixed, fixedbold,
+fixeditalic, fixedbolditalic, quotes, release, section
+
+(Those options are explained in L<Pod::Man>.)
+
+For example:
+
+ perldoc -o man -w center:Pod Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different pod-to-nroff formatter class
+in the future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToNroff>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToNroff.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToNroff.pm
new file mode 100644
index 00000000000..d0568605068
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToNroff.pm
@@ -0,0 +1,100 @@
+
+require 5;
+package Pod::Perldoc::ToNroff;
+use strict;
+use warnings;
+
+# This is unlike ToMan.pm in that it emits the raw nroff source!
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable { 1 } # well, if you ask for it...
+sub write_with_binmode { 0 }
+sub output_extension { 'man' }
+
+use Pod::Man ();
+
+sub center { shift->_perldoc_elem('center' , @_) }
+sub date { shift->_perldoc_elem('date' , @_) }
+sub fixed { shift->_perldoc_elem('fixed' , @_) }
+sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) }
+sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) }
+sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
+sub quotes { shift->_perldoc_elem('quotes' , @_) }
+sub release { shift->_perldoc_elem('release' , @_) }
+sub section { shift->_perldoc_elem('section' , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+ my $self = shift;
+ my $file = $_[0];
+
+ my @options =
+ map {; $_, $self->{$_} }
+ grep !m/^_/s,
+ keys %$self
+ ;
+
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "About to call new Pod::Man ",
+ $Pod::Man::VERSION ? "(v$Pod::Man::VERSION) " : '',
+ "with options: ",
+ @options ? "[@options]" : "(nil)", "\n";
+ ;
+
+ Pod::Man->new(@options)->parse_from_file(@_);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff
+
+=head1 SYNOPSIS
+
+ perldoc -o nroff -d something.3 Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Man as a formatter class.
+
+The following options are supported: center, date, fixed, fixedbold,
+fixeditalic, fixedbolditalic, quotes, release, section
+
+Those options are explained in L<Pod::Man>.
+
+For example:
+
+ perldoc -o nroff -w center:Pod -d something.3 Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different pod-to-nroff formatter class
+in the future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToMan>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToPod.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToPod.pm
new file mode 100644
index 00000000000..bccbfcadbd6
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToPod.pm
@@ -0,0 +1,90 @@
+
+# This class is just a hack to act as a "formatter" for
+# actually unformatted Pod.
+#
+# Note that this isn't the same as just passing thru whatever
+# we're given -- we pass thru only the pod source, and suppress
+# the Perl code (or whatever non-pod stuff is in the source file).
+
+
+require 5;
+package Pod::Perldoc::ToPod;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'pod' }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+ my( $self, $in, $outfh ) = @_;
+
+ open(IN, "<", $in) or die "Can't read-open $in: $!\nAborting";
+
+ my $cut_mode = 1;
+
+ # A hack for finding things between =foo and =cut, inclusive
+ local $_;
+ while (<IN>) {
+ if( m/^=(\w+)/s ) {
+ if($cut_mode = ($1 eq 'cut')) {
+ print $outfh "\n=cut\n\n";
+ # Pass thru the =cut line with some harmless
+ # (and occasionally helpful) padding
+ }
+ }
+ next if $cut_mode;
+ print $outfh $_ or die "Can't print to $outfh: $!";
+ }
+
+ close IN or die "Can't close $in: $!";
+ return;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod!
+
+=head1 SYNOPSIS
+
+ perldoc -opod Some::Modulename
+
+(That's currently the same as the following:)
+
+ perldoc -u Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to display Pod source as
+itself! Pretty Zen, huh?
+
+Currently this class works by just filtering out the non-Pod stuff from
+a given input file.
+
+=head1 SEE ALSO
+
+L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToRtf.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToRtf.pm
new file mode 100644
index 00000000000..25e609e313a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToRtf.pm
@@ -0,0 +1,85 @@
+
+require 5;
+package Pod::Perldoc::ToRtf;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use base qw( Pod::Simple::RTF );
+
+$VERSION # so that ->VERSION is happy
+# stop CPAN from seeing this
+ =
+$Pod::Simple::RTF::VERSION;
+
+
+sub is_pageable { 0 }
+sub write_with_binmode { 0 }
+sub output_extension { 'rtf' }
+
+sub page_for_perldoc {
+ my($self, $tempfile, $perldoc) = @_;
+ return unless $perldoc->IS_MSWin32;
+
+ my $rtf_pager = $ENV{'RTFREADER'} || 'write.exe';
+
+ $perldoc->aside( "About to launch <\"$rtf_pager\" \"$tempfile\">\n" );
+
+ return 1 if system( qq{"$rtf_pager"}, qq{"$tempfile"} ) == 0;
+ return 0;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF
+
+=head1 SYNOPSIS
+
+ perldoc -o rtf Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::RTF as a formatter class.
+
+This is actually a Pod::Simple::RTF subclass, and inherits
+all its options.
+
+You have to have Pod::Simple::RTF installed (from the Pod::Simple dist),
+or this module won't work.
+
+If Perldoc is running under MSWin and uses this class as a formatter,
+the output will be opened with F<write.exe> or whatever program is
+specified in the environment variable C<RTFREADER>. For example, to
+specify that RTF files should be opened the same as they are when you
+double-click them, you would do C<set RTFREADER=start.exe> in your
+F<autoexec.bat>.
+
+Handy tip: put C<set PERLDOC=-ortf> in your F<autoexec.bat>
+and that will set this class as the default formatter to run when
+you do C<perldoc whatever>.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::RTF>, L<Pod::Simple>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToText.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToText.pm
new file mode 100644
index 00000000000..2eb9e0644ac
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToText.pm
@@ -0,0 +1,91 @@
+
+require 5;
+package Pod::Perldoc::ToText;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' }
+
+use Pod::Text ();
+
+sub alt { shift->_perldoc_elem('alt' , @_) }
+sub indent { shift->_perldoc_elem('indent' , @_) }
+sub loose { shift->_perldoc_elem('loose' , @_) }
+sub quotes { shift->_perldoc_elem('quotes' , @_) }
+sub sentence { shift->_perldoc_elem('sentence', @_) }
+sub width { shift->_perldoc_elem('width' , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+ my $self = shift;
+
+ my @options =
+ map {; $_, $self->{$_} }
+ grep !m/^_/s,
+ keys %$self
+ ;
+
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "About to call new Pod::Text ",
+ $Pod::Text::VERSION ? "(v$Pod::Text::VERSION) " : '',
+ "with options: ",
+ @options ? "[@options]" : "(nil)", "\n";
+ ;
+
+ Pod::Text->new(@options)->parse_from_file(@_);
+}
+
+1;
+
+=head1 NAME
+
+Pod::Perldoc::ToText - let Perldoc render Pod as plaintext
+
+=head1 SYNOPSIS
+
+ perldoc -o text Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Text as a formatter class.
+
+It supports the following options, which are explained in
+L<Pod::Text>: alt, indent, loose, quotes, sentence, width
+
+For example:
+
+ perldoc -o text -w indent:5 Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different text formatter class in the
+future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToTk.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToTk.pm
new file mode 100644
index 00000000000..39459629503
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToTk.pm
@@ -0,0 +1,129 @@
+
+require 5;
+package Pod::Perldoc::ToTk;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' } # doesn't matter
+sub if_zero_length { } # because it will be 0-length!
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+# TODO: document these and their meanings...
+sub tree { shift->_perldoc_elem('tree' , @_) }
+sub tk_opt { shift->_perldoc_elem('tk_opt' , @_) }
+sub forky { shift->_perldoc_elem('forky' , @_) }
+
+use Pod::Perldoc ();
+use File::Spec::Functions qw(catfile);
+
+use Tk;
+die join '', __PACKAGE__, " doesn't work nice with Tk.pm verison $Tk::VERSION"
+ if $Tk::VERSION eq '800.003';
+
+BEGIN { eval { require Tk::FcyEntry; }; };
+use Tk::Pod;
+
+# The following was adapted from "tkpod" in the Tk-Pod dist.
+
+sub parse_from_file {
+
+ my($self, $Input_File) = @_;
+ if($self->{'forky'}) {
+ return if fork; # i.e., parent process returns
+ }
+
+ $Input_File =~ s{\\}{/}g
+ if Pod::Perldoc::IS_MSWin32 or Pod::Perldoc::IS_Dos
+ # and maybe OS/2
+ ;
+
+ my($tk_opt, $tree);
+ $tree = $self->{'tree' };
+ $tk_opt = $self->{'tk_opt'};
+
+ #require Tk::ErrorDialog;
+
+ # Add 'Tk' subdirectories to search path so, e.g.,
+ # 'Scrolled' will find doc in 'Tk/Scrolled'
+
+ if( $tk_opt ) {
+ push @INC, grep -d $_, map catfile($_,'Tk'), @INC;
+ }
+
+ my $mw = MainWindow->new();
+ #eval 'use blib "/home/e/eserte/src/perl/Tk-App";require Tk::App::Debug';
+ $mw->withdraw;
+
+ # CDE use Font Settings if available
+ my $ufont = $mw->optionGet('userFont','UserFont'); # fixed width
+ my $sfont = $mw->optionGet('systemFont','SystemFont'); # proportional
+ if (defined($ufont) and defined($sfont)) {
+ foreach ($ufont, $sfont) { s/:$//; };
+ $mw->optionAdd('*Font', $sfont);
+ $mw->optionAdd('*Entry.Font', $ufont);
+ $mw->optionAdd('*Text.Font', $ufont);
+ }
+
+ $mw->optionAdd('*Menu.tearOff', $Tk::platform ne 'MSWin32' ? 1 : 0);
+
+ $mw->Pod(
+ '-file' => $Input_File,
+ (($Tk::Pod::VERSION >= 4) ? ('-tree' => $tree) : ())
+ )->focusNext;
+
+ # xxx dirty but it works. A simple $mw->destroy if $mw->children
+ # does not work because Tk::ErrorDialogs could be created.
+ # (they are withdrawn after Ok instead of destory'ed I guess)
+
+ if ($mw->children) {
+ $mw->repeat(1000, sub {
+ # ErrorDialog is withdrawn not deleted :-(
+ foreach ($mw->children) {
+ return if "$_" =~ /^Tk::Pod/ # ->isa('Tk::Pod')
+ }
+ $mw->destroy;
+ });
+ } else {
+ $mw->destroy;
+ }
+ #$mw->WidgetDump;
+ MainLoop();
+
+ exit if $self->{'forky'}; # we were the child! so exit now!
+ return;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod
+
+=head1 SYNOPSIS
+
+ perldoc -o tk Some::Modulename &
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Tk::Pod as a formatter class.
+
+You have to have installed Tk::Pod first, or this class won't load.
+
+=head1 SEE ALSO
+
+L<Tk::Pod>, L<Pod::Perldoc>
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>, with significant portions copied from
+F<tkpod> in the Tk::Pod dist, by Nick Ing-Simmons, Slaven Rezic, et al.
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/ToXml.pm b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToXml.pm
new file mode 100644
index 00000000000..dd0d15cc10b
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/ToXml.pm
@@ -0,0 +1,63 @@
+
+require 5;
+package Pod::Perldoc::ToXml;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use base qw( Pod::Simple::XMLOutStream );
+
+$VERSION # so that ->VERSION is happy
+# stop CPAN from seeing this
+ =
+$Pod::Simple::XMLOutStream::VERSION;
+
+
+sub is_pageable { 0 }
+sub write_with_binmode { 0 }
+sub output_extension { 'xml' }
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToXml - let Perldoc render Pod as XML
+
+=head1 SYNOPSIS
+
+ perldoc -o xml -d out.xml Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::XMLOutStream as a formatter class.
+
+This is actually a Pod::Simple::XMLOutStream subclass, and inherits
+all its options.
+
+You have to have installed Pod::Simple::XMLOutStream (from the Pod::Simple
+dist), or this class won't work.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple::XMLOutStream>, L<Pod::Simple>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/t/checkerbasic.t b/gnu/usr.bin/perl/lib/Pod/Perldoc/t/checkerbasic.t
new file mode 100644
index 00000000000..c47dcedc64a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/t/checkerbasic.t
@@ -0,0 +1,9 @@
+
+use Test;
+BEGIN {plan tests => 2};
+ok 1;
+require Pod::Perldoc::ToChecker;
+$Pod::Perldoc::VERSION
+ and print "# Pod::Perldoc version $Pod::Perldoc::VERSION\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/t/perldocbasic.t b/gnu/usr.bin/perl/lib/Pod/Perldoc/t/perldocbasic.t
new file mode 100644
index 00000000000..6f6b9984d7d
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/t/perldocbasic.t
@@ -0,0 +1,9 @@
+
+use Test;
+BEGIN {plan tests => 3};
+ok 1;
+require Pod::Perldoc;
+ok($Pod::Perldoc::VERSION)
+ and print "# Pod::Perldoc version $Pod::Perldoc::VERSION\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Pod/Perldoc/t/textbasic.t b/gnu/usr.bin/perl/lib/Pod/Perldoc/t/textbasic.t
new file mode 100644
index 00000000000..6814267ec84
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/Perldoc/t/textbasic.t
@@ -0,0 +1,9 @@
+
+use Test;
+BEGIN {plan tests => 2};
+ok 1;
+require Pod::Perldoc::ToText;
+$Pod::Perldoc::VERSION
+ and print "# Pod::Perldoc version $Pod::Perldoc::VERSION\n";
+ok 1;
+
diff --git a/gnu/usr.bin/perl/lib/Pod/PlainText.pm b/gnu/usr.bin/perl/lib/Pod/PlainText.pm
new file mode 100644
index 00000000000..bf0063bbfa2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/PlainText.pm
@@ -0,0 +1,700 @@
+# Pod::PlainText -- Convert POD data to formatted ASCII text.
+# $Id: PlainText.pm,v 1.1.1.1 2003/12/03 02:44:08 millert Exp $
+#
+# Copyright 1999-2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module is intended to be a replacement for Pod::Text, and attempts to
+# match its output except for some specific circumstances where other
+# decisions seemed to produce better output. It uses Pod::Parser and is
+# designed to be very easy to subclass.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::PlainText;
+
+require 5.005;
+
+use Carp qw(carp croak);
+use Pod::Select ();
+
+use strict;
+use vars qw(@ISA %ESCAPES $VERSION);
+
+# We inherit from Pod::Select instead of Pod::Parser so that we can be used
+# by Pod::Usage.
+@ISA = qw(Pod::Select);
+
+($VERSION = (split (' ', q$Revision: 1.1.1.1 $ ))[1]) =~ s/\.(\d)$/.0$1/;
+
+
+############################################################################
+# Table of supported E<> escapes
+############################################################################
+
+# This table is taken near verbatim from Pod::PlainText in Pod::Parser,
+# which got it near verbatim from the original Pod::Text. It is therefore
+# credited to Tom Christiansen, and I'm glad I didn't have to write it. :)
+%ESCAPES = (
+ 'amp' => '&', # ampersand
+ 'lt' => '<', # left chevron, less-than
+ 'gt' => '>', # right chevron, greater-than
+ 'quot' => '"', # double quote
+
+ "Aacute" => "\xC1", # capital A, acute accent
+ "aacute" => "\xE1", # small a, acute accent
+ "Acirc" => "\xC2", # capital A, circumflex accent
+ "acirc" => "\xE2", # small a, circumflex accent
+ "AElig" => "\xC6", # capital AE diphthong (ligature)
+ "aelig" => "\xE6", # small ae diphthong (ligature)
+ "Agrave" => "\xC0", # capital A, grave accent
+ "agrave" => "\xE0", # small a, grave accent
+ "Aring" => "\xC5", # capital A, ring
+ "aring" => "\xE5", # small a, ring
+ "Atilde" => "\xC3", # capital A, tilde
+ "atilde" => "\xE3", # small a, tilde
+ "Auml" => "\xC4", # capital A, dieresis or umlaut mark
+ "auml" => "\xE4", # small a, dieresis or umlaut mark
+ "Ccedil" => "\xC7", # capital C, cedilla
+ "ccedil" => "\xE7", # small c, cedilla
+ "Eacute" => "\xC9", # capital E, acute accent
+ "eacute" => "\xE9", # small e, acute accent
+ "Ecirc" => "\xCA", # capital E, circumflex accent
+ "ecirc" => "\xEA", # small e, circumflex accent
+ "Egrave" => "\xC8", # capital E, grave accent
+ "egrave" => "\xE8", # small e, grave accent
+ "ETH" => "\xD0", # capital Eth, Icelandic
+ "eth" => "\xF0", # small eth, Icelandic
+ "Euml" => "\xCB", # capital E, dieresis or umlaut mark
+ "euml" => "\xEB", # small e, dieresis or umlaut mark
+ "Iacute" => "\xCD", # capital I, acute accent
+ "iacute" => "\xED", # small i, acute accent
+ "Icirc" => "\xCE", # capital I, circumflex accent
+ "icirc" => "\xEE", # small i, circumflex accent
+ "Igrave" => "\xCD", # capital I, grave accent
+ "igrave" => "\xED", # small i, grave accent
+ "Iuml" => "\xCF", # capital I, dieresis or umlaut mark
+ "iuml" => "\xEF", # small i, dieresis or umlaut mark
+ "Ntilde" => "\xD1", # capital N, tilde
+ "ntilde" => "\xF1", # small n, tilde
+ "Oacute" => "\xD3", # capital O, acute accent
+ "oacute" => "\xF3", # small o, acute accent
+ "Ocirc" => "\xD4", # capital O, circumflex accent
+ "ocirc" => "\xF4", # small o, circumflex accent
+ "Ograve" => "\xD2", # capital O, grave accent
+ "ograve" => "\xF2", # small o, grave accent
+ "Oslash" => "\xD8", # capital O, slash
+ "oslash" => "\xF8", # small o, slash
+ "Otilde" => "\xD5", # capital O, tilde
+ "otilde" => "\xF5", # small o, tilde
+ "Ouml" => "\xD6", # capital O, dieresis or umlaut mark
+ "ouml" => "\xF6", # small o, dieresis or umlaut mark
+ "szlig" => "\xDF", # small sharp s, German (sz ligature)
+ "THORN" => "\xDE", # capital THORN, Icelandic
+ "thorn" => "\xFE", # small thorn, Icelandic
+ "Uacute" => "\xDA", # capital U, acute accent
+ "uacute" => "\xFA", # small u, acute accent
+ "Ucirc" => "\xDB", # capital U, circumflex accent
+ "ucirc" => "\xFB", # small u, circumflex accent
+ "Ugrave" => "\xD9", # capital U, grave accent
+ "ugrave" => "\xF9", # small u, grave accent
+ "Uuml" => "\xDC", # capital U, dieresis or umlaut mark
+ "uuml" => "\xFC", # small u, dieresis or umlaut mark
+ "Yacute" => "\xDD", # capital Y, acute accent
+ "yacute" => "\xFD", # small y, acute accent
+ "yuml" => "\xFF", # small y, dieresis or umlaut mark
+
+ "lchevron" => "\xAB", # left chevron (double less than)
+ "rchevron" => "\xBB", # right chevron (double greater than)
+);
+
+
+############################################################################
+# Initialization
+############################################################################
+
+# Initialize the object. Must be sure to call our parent initializer.
+sub initialize {
+ my $self = shift;
+
+ $$self{alt} = 0 unless defined $$self{alt};
+ $$self{indent} = 4 unless defined $$self{indent};
+ $$self{loose} = 0 unless defined $$self{loose};
+ $$self{sentence} = 0 unless defined $$self{sentence};
+ $$self{width} = 76 unless defined $$self{width};
+
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{MARGIN} = $$self{indent}; # Current left margin in spaces.
+
+ $self->SUPER::initialize;
+}
+
+
+############################################################################
+# Core overrides
+############################################################################
+
+# Called for each command paragraph. Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object. Just dispatches
+# the command to a method named the same as the command. =cut is handled
+# internally by Pod::Parser.
+sub command {
+ my $self = shift;
+ my $command = shift;
+ return if $command eq 'pod';
+ return if ($$self{EXCLUDE} && $command ne 'end');
+ $self->item ("\n") if defined $$self{ITEM};
+ $command = 'cmd_' . $command;
+ $self->$command (@_);
+}
+
+# Called for a verbatim paragraph. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Just output it verbatim, but with tabs converted
+# to spaces.
+sub verbatim {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->item if defined $$self{ITEM};
+ local $_ = shift;
+ return if /^\s*$/;
+ s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme;
+ $self->output ($_);
+}
+
+# Called for a regular text block. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Perform interpolation and output the results.
+sub textblock {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->output ($_[0]), return if $$self{VERBATIM};
+ local $_ = shift;
+ my $line = shift;
+
+ # Perform a little magic to collapse multiple L<> references. This is
+ # here mostly for backwards-compatibility. We'll just rewrite the whole
+ # thing into actual text at this part, bypassing the whole internal
+ # sequence parsing thing.
+ s{
+ (
+ L< # A link of the form L</something>.
+ /
+ (
+ [:\w]+ # The item has to be a simple word...
+ (\(\))? # ...or simple function.
+ )
+ >
+ (
+ ,?\s+(and\s+)? # Allow lots of them, conjuncted.
+ L<
+ /
+ (
+ [:\w]+
+ (\(\))?
+ )
+ >
+ )+
+ )
+ } {
+ local $_ = $1;
+ s%L</([^>]+)>%$1%g;
+ my @items = split /(?:,?\s+(?:and\s+)?)/;
+ my $string = "the ";
+ my $i;
+ for ($i = 0; $i < @items; $i++) {
+ $string .= $items[$i];
+ $string .= ", " if @items > 2 && $i != $#items;
+ $string .= " and " if ($i == $#items - 1);
+ }
+ $string .= " entries elsewhere in this document";
+ $string;
+ }gex;
+
+ # Now actually interpolate and output the paragraph.
+ $_ = $self->interpolate ($_, $line);
+ s/\s+$/\n/;
+ if (defined $$self{ITEM}) {
+ $self->item ($_ . "\n");
+ } else {
+ $self->output ($self->reformat ($_ . "\n"));
+ }
+}
+
+# Called for an interior sequence. Gets the command, argument, and a
+# Pod::InteriorSequence object and is expected to return the resulting text.
+# Calls code, bold, italic, file, and link to handle those types of
+# sequences, and handles S<>, E<>, X<>, and Z<> directly.
+sub interior_sequence {
+ my $self = shift;
+ my $command = shift;
+ local $_ = shift;
+ return '' if ($command eq 'X' || $command eq 'Z');
+
+ # Expand escapes into the actual character now, carping if invalid.
+ if ($command eq 'E') {
+ return $ESCAPES{$_} if defined $ESCAPES{$_};
+ carp "Unknown escape: E<$_>";
+ return "E<$_>";
+ }
+
+ # For all the other sequences, empty content produces no output.
+ return if $_ eq '';
+
+ # For S<>, compress all internal whitespace and then map spaces to \01.
+ # When we output the text, we'll map this back.
+ if ($command eq 'S') {
+ s/\s{2,}/ /g;
+ tr/ /\01/;
+ return $_;
+ }
+
+ # Anything else needs to get dispatched to another method.
+ if ($command eq 'B') { return $self->seq_b ($_) }
+ elsif ($command eq 'C') { return $self->seq_c ($_) }
+ elsif ($command eq 'F') { return $self->seq_f ($_) }
+ elsif ($command eq 'I') { return $self->seq_i ($_) }
+ elsif ($command eq 'L') { return $self->seq_l ($_) }
+ else { carp "Unknown sequence $command<$_>" }
+}
+
+# Called for each paragraph that's actually part of the POD. We take
+# advantage of this opportunity to untabify the input.
+sub preprocess_paragraph {
+ my $self = shift;
+ local $_ = shift;
+ 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+ $_;
+}
+
+
+############################################################################
+# Command paragraphs
+############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n==== $_ ====\n\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output ($_ . "\n");
+ }
+}
+
+# Second level heading.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n== $_ ==\n\n");
+ } else {
+ $self->output (' ' x ($$self{indent} / 2) . $_ . "\n\n");
+ }
+}
+
+# Start a list.
+sub cmd_over {
+ my $self = shift;
+ local $_ = shift;
+ unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+ push (@{ $$self{INDENTS} }, $$self{MARGIN});
+ $$self{MARGIN} += ($_ + 0);
+}
+
+# End a list.
+sub cmd_back {
+ my $self = shift;
+ $$self{MARGIN} = pop @{ $$self{INDENTS} };
+ unless (defined $$self{MARGIN}) {
+ carp "Unmatched =back";
+ $$self{MARGIN} = $$self{indent};
+ }
+}
+
+# An individual list item.
+sub cmd_item {
+ my $self = shift;
+ if (defined $$self{ITEM}) { $self->item }
+ local $_ = shift;
+ s/\s+$//;
+ $$self{ITEM} = $self->interpolate ($_);
+}
+
+# Begin a block for a particular translator. Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+ my $self = shift;
+ local $_ = shift;
+ my ($kind) = /^(\S+)/ or return;
+ if ($kind eq 'text') {
+ $$self{VERBATIM} = 1;
+ } else {
+ $$self{EXCLUDE} = 1;
+ }
+}
+
+# End a block for a particular translator. We assume that all =begin/=end
+# pairs are properly closed.
+sub cmd_end {
+ my $self = shift;
+ $$self{EXCLUDE} = 0;
+ $$self{VERBATIM} = 0;
+}
+
+# One paragraph for a particular translator. Ignore it unless it's intended
+# for text, in which case we treat it as a verbatim text block.
+sub cmd_for {
+ my $self = shift;
+ local $_ = shift;
+ my $line = shift;
+ return unless s/^text\b[ \t]*\n?//;
+ $self->verbatim ($_, $line);
+}
+
+
+############################################################################
+# Interior sequences
+############################################################################
+
+# The simple formatting ones. These are here mostly so that subclasses can
+# override them and do more complicated things.
+sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
+sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" }
+sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
+sub seq_i { return '*' . $_[1] . '*' }
+
+# The complicated one. Handle links. Since this is plain text, we can't
+# actually make any real links, so this is all to figure out what text we
+# print out.
+sub seq_l {
+ my $self = shift;
+ local $_ = shift;
+
+ # Smash whitespace in case we were split across multiple lines.
+ s/\s+/ /g;
+
+ # If we were given any explicit text, just output it.
+ if (/^([^|]+)\|/) { return $1 }
+
+ # Okay, leading and trailing whitespace isn't important; get rid of it.
+ s/^\s+//;
+ s/\s+$//;
+
+ # Default to using the whole content of the link entry as a section
+ # name. Note that L<manpage/> forces a manpage interpretation, as does
+ # something looking like L<manpage(section)>. The latter is an
+ # enhancement over the original Pod::Text.
+ my ($manpage, $section) = ('', $_);
+ if (/^"\s*(.*?)\s*"$/) {
+ $section = '"' . $1 . '"';
+ } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) {
+ ($manpage, $section) = ($_, '');
+ } elsif (m%/%) {
+ ($manpage, $section) = split (/\s*\/\s*/, $_, 2);
+ }
+
+ # Now build the actual output text.
+ my $text = '';
+ if (!length $section) {
+ $text = "the $manpage manpage" if length $manpage;
+ } elsif ($section =~ /^[:\w]+(?:\(\))?/) {
+ $text .= 'the ' . $section . ' entry';
+ $text .= (length $manpage) ? " in the $manpage manpage"
+ : " elsewhere in this document";
+ } else {
+ $section =~ s/^\"\s*//;
+ $section =~ s/\s*\"$//;
+ $text .= 'the section on "' . $section . '"';
+ $text .= " in the $manpage manpage" if length $manpage;
+ }
+ $text;
+}
+
+
+############################################################################
+# List handling
+############################################################################
+
+# This method is called whenever an =item command is complete (in other
+# words, we've seen its associated paragraph or know for certain that it
+# doesn't have one). It gets the paragraph associated with the item as an
+# argument. If that argument is empty, just output the item tag; if it
+# contains a newline, output the item tag followed by the newline.
+# Otherwise, see if there's enough room for us to output the item tag in the
+# margin of the text or if we have to put it on a separate line.
+sub item {
+ my $self = shift;
+ local $_ = shift;
+ my $tag = $$self{ITEM};
+ unless (defined $tag) {
+ carp "item called without tag";
+ return;
+ }
+ undef $$self{ITEM};
+ my $indent = $$self{INDENTS}[-1];
+ unless (defined $indent) { $indent = $$self{indent} }
+ my $space = ' ' x $indent;
+ $space =~ s/^ /:/ if $$self{alt};
+ if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) {
+ my $margin = $$self{MARGIN};
+ $$self{MARGIN} = $indent;
+ my $output = $self->reformat ($tag);
+ $output =~ s/\n*$/\n/;
+ $self->output ($output);
+ $$self{MARGIN} = $margin;
+ $self->output ($self->reformat ($_)) if /\S/;
+ } else {
+ $_ = $self->reformat ($_);
+ s/^ /:/ if ($$self{alt} && $indent > 0);
+ my $tagspace = ' ' x length $tag;
+ s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item";
+ $self->output ($_);
+ }
+}
+
+
+############################################################################
+# Output formatting
+############################################################################
+
+# Wrap a line, indenting by the current left margin. We can't use
+# Text::Wrap because it plays games with tabs. We can't use formline, even
+# though we'd really like to, because it screws up non-printing characters.
+# So we have to do the wrapping ourselves.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{width} - $$self{MARGIN};
+ while (length > $width) {
+ if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ $output;
+}
+
+# Reformat a paragraph of text for the current margin. Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+ my $self = shift;
+ local $_ = shift;
+
+ # If we're trying to preserve two spaces after sentences, do some
+ # munging to support that. Otherwise, smash all repeated whitespace.
+ if ($$self{sentence}) {
+ s/ +$//mg;
+ s/\.\n/. \n/g;
+ s/\n/ /g;
+ s/ +/ /g;
+ } else {
+ s/\s+/ /g;
+ }
+ $self->wrap ($_);
+}
+
+# Output text to the output device.
+sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] }
+
+
+############################################################################
+# Backwards compatibility
+############################################################################
+
+# The old Pod::Text module did everything in a pod2text() function. This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+ my @args;
+
+ # This is really ugly; I hate doing option parsing in the middle of a
+ # module. But the old Pod::Text module supported passing flags to its
+ # entry function, so handle -a and -<number>.
+ while ($_[0] =~ /^-/) {
+ my $flag = shift;
+ if ($flag eq '-a') { push (@args, alt => 1) }
+ elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+ else {
+ unshift (@_, $flag);
+ last;
+ }
+ }
+
+ # Now that we know what arguments we're using, create the parser.
+ my $parser = Pod::PlainText->new (@args);
+
+ # If two arguments were given, the second argument is going to be a file
+ # handle. That means we want to call parse_from_filehandle(), which
+ # means we need to turn the first argument into a file handle. Magic
+ # open will handle the <&STDIN case automagically.
+ if (defined $_[1]) {
+ local *IN;
+ unless (open (IN, $_[0])) {
+ croak ("Can't open $_[0] for reading: $!\n");
+ return;
+ }
+ $_[0] = \*IN;
+ return $parser->parse_from_filehandle (@_);
+ } else {
+ return $parser->parse_from_file (@_);
+ }
+}
+
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::PlainText - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+ use Pod::PlainText;
+ my $parser = Pod::PlainText->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::PlainText is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII. It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Parser, Pod::PlainText supports the same methods and
+interfaces. See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<Pod::PlainText-E<gt>new()> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser. The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin. Defaults to false.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks. Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=head1> heading.
+If set to false (the default), no blank line is printed after C<=head1>,
+although one is still printed after C<=head2>. This is the default because
+it's the expected formatting for manual pages; if you're formatting
+arbitrary text documents, setting this to true may result in more pleasing
+output.
+
+=item sentence
+
+If set to a true value, Pod::PlainText will assume that each sentence ends in two
+spaces, and will try to preserve that spacing. If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space. Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side. Defaults to 76.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to. The first defaults
+to STDIN if not given, and the second defaults to STDOUT. The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead. See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+(W) Something has gone wrong in internal C<=item> processing. This message
+indicates a bug in Pod::PlainText; you should never see it.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::PlainText was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Unknown escape: %s
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::PlainText didn't
+know about.
+
+=item Unknown sequence: %s
+
+(W) The POD source contained a non-standard internal sequence (something of
+the form C<XE<lt>E<gt>>) that Pod::PlainText didn't know about.
+
+=item Unmatched =back
+
+(W) Pod::PlainText encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 RESTRICTIONS
+
+Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on
+output, due to an internal implementation detail.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen. It has a revamped interface, since it now uses Pod::Parser,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available. Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all. This rewrite doesn't even try to do that, but a
+subclass of it does. Look for L<Pod::Text::Termcap|Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser|Pod::Parser>, L<Pod::Text::Termcap|Pod::Text::Termcap>,
+pod2text(1)
+
+=head1 AUTHOR
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original Pod::Text by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> and
+its conversion to Pod::Parser by Brad Appleton
+E<lt>bradapp@enteract.comE<gt>.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/Pod/Usage.pm b/gnu/usr.bin/perl/lib/Pod/Usage.pm
index 771cff451cb..63c7007bc59 100644
--- a/gnu/usr.bin/perl/lib/Pod/Usage.pm
+++ b/gnu/usr.bin/perl/lib/Pod/Usage.pm
@@ -10,7 +10,7 @@
package Pod::Usage;
use vars qw($VERSION);
-$VERSION = 1.14; ## Current version of this package
+$VERSION = 1.16; ## Current version of this package
require 5.005; ## requires this Perl version or later
=head1 NAME
@@ -469,7 +469,8 @@ sub pod2usage {
}
## Default the output file
- $opts{"-output"} = ($opts{"-exitval"} < 2) ? \*STDOUT : \*STDERR
+ $opts{"-output"} = (lc($opts{"-exitval"}) eq "noexit" ||
+ $opts{"-exitval"} < 2) ? \*STDOUT : \*STDERR
unless (defined $opts{"-output"});
## Default the input file
$opts{"-input"} = $0 unless (defined $opts{"-input"});
@@ -506,7 +507,7 @@ sub pod2usage {
and $opts{"-output"} == \*STDOUT )
{
## spit out the entire PODs. Might as well invoke perldoc
- my $progpath = File::Spec->catfile($Config{bin}, "perldoc");
+ my $progpath = File::Spec->catfile($Config{scriptdir}, "perldoc");
system($progpath, $opts{"-input"});
}
else {
diff --git a/gnu/usr.bin/perl/lib/Pod/t/Functions.t b/gnu/usr.bin/perl/lib/Pod/t/Functions.t
index 601aa50c9dc..8f44d812010 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/Functions.t
+++ b/gnu/usr.bin/perl/lib/Pod/t/Functions.t
@@ -80,7 +80,7 @@ Functions for SCALARs or strings:
sprintf, substr, tr///, uc, ucfirst, y///
Regular expressions and pattern matching:
- m//, pos, qr/PATTERN/, quotemeta, s///, split, study
+ m//, pos, qr/STRING/, quotemeta, s///, split, study
Numeric functions:
abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt,
@@ -109,7 +109,7 @@ Functions for fixed length data or records:
Functions for filehandles, files, or directories:
-X, chdir, chmod, chown, chroot, fcntl, glob, ioctl, link,
lstat, mkdir, open, opendir, readlink, rename, rmdir,
- stat, symlink, umask, unlink, utime
+ stat, symlink, sysopen, umask, unlink, utime
Keywords related to control flow of your perl program:
caller, continue, die, do, dump, eval, exit, goto, last,
@@ -124,14 +124,15 @@ Miscellaneous functions:
Functions for processes and process groups:
alarm, exec, fork, getpgrp, getppid, getpriority, kill,
- pipe, qx/STRING/, setpgrp, setpriority, sleep, system,
- times, wait, waitpid
+ pipe, qx/STRING/, readpipe, setpgrp, setpriority, sleep,
+ system, times, wait, waitpid
Keywords related to perl modules:
do, import, no, package, require, use
Keywords related to classes and object-orientedness:
- bless, dbmclose, dbmopen, package, ref, tie, untie, use
+ bless, dbmclose, dbmopen, package, ref, tie, tied, untie,
+ use
Low-level socket functions:
accept, bind, connect, getpeername, getsockname,
diff --git a/gnu/usr.bin/perl/lib/Pod/t/basic.t b/gnu/usr.bin/perl/lib/Pod/t/basic.t
index eb6db54f301..a61b4bf07f9 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/basic.t
+++ b/gnu/usr.bin/perl/lib/Pod/t/basic.t
@@ -98,9 +98,9 @@ for (sort keys %translators) {
close MASTER;
close OUTPUT;
- # EBCDIC platforms use a different character for ESC
+ # OS/390 is EBCDIC, which uses a different character for ESC
# apparently. Try to convert so that the test still works.
- if (ord('A') eq 193 && $_ eq 'Pod::Text::Termcap') {
+ if ($^O eq 'os390' && $_ eq 'Pod::Text::Termcap') {
$output =~ tr/\033/\047/;
}
diff --git a/gnu/usr.bin/perl/lib/Pod/t/htmlview.pod b/gnu/usr.bin/perl/lib/Pod/t/htmlview.pod
index 62ac71ced4d..3ac378987e7 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/htmlview.pod
+++ b/gnu/usr.bin/perl/lib/Pod/t/htmlview.pod
@@ -135,6 +135,8 @@ This is an href link2: http://example.com/foo/bar.html
This is an email link: mailto:foo@bar.com
+ This is a link in a verbatim block <a href="http://perl.org"> Perl </a>
+
=head1 SEE ALSO
See also L<Test Page 2|htmlescp>, the L<Your::Module> and L<Their::Module>
diff --git a/gnu/usr.bin/perl/lib/Pod/t/htmlview.t b/gnu/usr.bin/perl/lib/Pod/t/htmlview.t
index a36b58aee37..739d3003fbf 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/htmlview.t
+++ b/gnu/usr.bin/perl/lib/Pod/t/htmlview.t
@@ -7,13 +7,11 @@ BEGIN {
require "pod2html-lib.pl";
}
-
use strict;
use Test::More tests => 1;
convert_n_test("htmlview", "html rendering");
-
__DATA__
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
@@ -32,11 +30,11 @@ __DATA__
<li><a href="#name">NAME</a></li>
<li><a href="#synopsis">SYNOPSIS</a></li>
<li><a href="#description">DESCRIPTION</a></li>
- <li><a href="#methods_=>_other_stuff">METHODS =&gt; OTHER STUFF</a></li>
+ <li><a href="#methods____other_stuff">METHODS =&gt; OTHER STUFF</a></li>
<ul>
- <li><a href="#new()"><code>new()</code></a></li>
- <li><a href="#old()"><code>old()</code></a></li>
+ <li><a href="#new__"><code>new()</code></a></li>
+ <li><a href="#old__"><code>old()</code></a></li>
</ul>
<li><a href="#testing_for_and_begin">TESTING FOR AND BEGIN</a></li>
@@ -75,11 +73,11 @@ other <strong>cool </strong></em>&gt; stuff &gt;&gt;</p>
<p>
</p>
<hr />
-<h1><a name="methods_=>_other_stuff">METHODS =&gt; OTHER STUFF</a></h1>
+<h1><a name="methods____other_stuff">METHODS =&gt; OTHER STUFF</a></h1>
<p>Here is a list of methods</p>
<p>
</p>
-<h2><a name="new()"><code>new()</code></a></h2>
+<h2><a name="new__"><code>new()</code></a></h2>
<p>Constructor method. Accepts the following config options:</p>
<dl>
<dt><strong><a name="item_foo">foo</a></strong><br />
@@ -113,7 +111,7 @@ The baz item.
</li>
<li><strong><a name="item_sat_on_the">Sat <em>on</em>&nbsp;the</a></strong><br />
</li>
-<li><strong><a name="item_mat%3c%21%3e">Mat&lt;!&gt;</a></strong><br />
+<li><strong><a name="item_mat_3c_21_3e">Mat&lt;!&gt;</a></strong><br />
</li>
</ul>
<p>Title on the same line as the =item + numerical bullets</p>
@@ -144,7 +142,7 @@ Mat
<p></p></dl>
<p>
</p>
-<h2><a name="old()"><code>old()</code></a></h2>
+<h2><a name="old__"><code>old()</code></a></h2>
<p>Destructor method</p>
<p>
</p>
@@ -163,6 +161,8 @@ HTML
<p>This is an href link1: <a href="http://example.com">http://example.com</a></p>
<p>This is an href link2: <a href="http://example.com/foo/bar.html">http://example.com/foo/bar.html</a></p>
<p>This is an email link: <a href="mailto:mailto:foo@bar.com">mailto:foo@bar.com</a></p>
+<pre>
+ This is a link in a verbatim block &lt;a href=&quot;<a href="http://perl.org">http://perl.org</a>&quot;&gt; Perl &lt;/a&gt;</pre>
<p>
</p>
<hr />
diff --git a/gnu/usr.bin/perl/lib/Pod/t/man.t b/gnu/usr.bin/perl/lib/Pod/t/man.t
index 8bf7abdcbac..f43f32a9913 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/man.t
+++ b/gnu/usr.bin/perl/lib/Pod/t/man.t
@@ -1,9 +1,9 @@
#!/usr/bin/perl -w
-# $Id: man.t,v 1.2 2002/06/23 19:16:25 eagle Exp $
+# $Id: man.t,v 1.4 2003/01/05 06:31:52 eagle Exp $
#
# man.t -- Additional specialized tests for Pod::Man.
#
-# Copyright 2002 by Russ Allbery <rra@stanford.edu>
+# Copyright 2002, 2003 by Russ Allbery <rra@stanford.edu>
#
# This program is free software; you may redistribute it and/or modify it
# under the same terms as Perl itself.
@@ -17,7 +17,7 @@ BEGIN {
}
unshift (@INC, '../blib/lib');
$| = 1;
- print "1..3\n";
+ print "1..5\n";
}
END {
@@ -94,3 +94,46 @@ This C<.> should be quoted.
.IX Header "PERIODS"
This \f(CW\*(C`.\*(C'\fR should be quoted.
###
+
+###
+=over 4
+
+=item *
+
+A bullet.
+
+=item *
+
+Another bullet.
+
+=item * Not a bullet.
+
+=back
+###
+.IP "\(bu" 4
+A bullet.
+.IP "\(bu" 4
+Another bullet.
+.IP "* Not a bullet." 4
+.IX Item "Not a bullet."
+###
+
+###
+=over 4
+
+=item foo
+
+Not a bullet.
+
+=item *
+
+Also not a bullet.
+
+=back
+###
+.IP "foo" 4
+.IX Item "foo"
+Not a bullet.
+.IP "*" 4
+Also not a bullet.
+###
diff --git a/gnu/usr.bin/perl/lib/Pod/t/pod2html-lib.pl b/gnu/usr.bin/perl/lib/Pod/t/pod2html-lib.pl
index 3f1b267ee16..7443fe099f1 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/pod2html-lib.pl
+++ b/gnu/usr.bin/perl/lib/Pod/t/pod2html-lib.pl
@@ -21,24 +21,42 @@ sub convert_n_test {
);
- local $/;
- # expected
- my $expect = <DATA>;
- $expect =~ s/\[PERLADMIN\]/$Config::Config{perladmin}/;
- if (ord("A") == 193) { # EBCDIC.
- $expect =~ s/item_mat%3c%21%3e/item_mat%4c%5a%6e/;
+ my ($expect, $result);
+ {
+ local $/;
+ # expected
+ $expect = <DATA>;
+ $expect =~ s/\[PERLADMIN\]/$Config::Config{perladmin}/;
+ if (ord("A") == 193) { # EBCDIC.
+ $expect =~ s/item_mat%3c%21%3e/item_mat%4c%5a%6e/;
+ }
+
+ # result
+ open my $in, $outfile or die "cannot open $outfile: $!";
+ $result = <$in>;
+ close $in;
}
- # result
- open my $in, $outfile or die "cannot open $outfile: $!";
- my $result = <$in>;
- close $in;
- 1 while unlink $outfile;
+ ok($expect eq $result, $testname) or do {
+ my $diff = '/bin/diff';
+ -x $diff or $diff = '/usr/bin/diff';
+ if (-x $diff) {
+ my $expectfile = "pod2html-lib.tmp";
+ open my $tmpfile, ">", $expectfile or die $!;
+ print $tmpfile $expect;
+ close $tmpfile;
+ my $diffopt = $^O eq 'linux' ? 'u' : 'c';
+ open my $diff, "diff -$diffopt $expectfile $outfile |" or die $!;
+ print "# $_" while <$diff>;
+ close $diff;
+ unlink $expectfile;
+ }
+ };
- is($expect, $result, $testname);
# pod2html creates these
- 1 while unlink "pod2htmd.x~~";
- 1 while unlink "pod2htmi.x~~";
+ 1 while unlink $outfile;
+ 1 while unlink "pod2htmd.tmp";
+ 1 while unlink "pod2htmi.tmp";
}
1;
diff --git a/gnu/usr.bin/perl/lib/Pod/t/pod2latex.t b/gnu/usr.bin/perl/lib/Pod/t/pod2latex.t
new file mode 100644
index 00000000000..79543cc2eff
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/t/pod2latex.t
@@ -0,0 +1,392 @@
+
+# Test that Pod::LaTeX works
+# This test relies on the DATA filehandle
+# DATA contains the latex that is used for comparison
+# and the pod that was used to generate it. The two
+# are separated by '=pod'
+# Note that if the translator is adjusted the output tex
+# will probably not match what is currently there. You
+# will need to adjust it to match (assuming it is correct).
+
+use Test;
+use strict;
+
+BEGIN { plan tests => 172 }
+
+use Pod::LaTeX;
+
+# The link parsing changed between v0.22 and v0.30 of Pod::ParseUtils
+use Pod::ParseUtils;
+my $linkver = $Pod::ParseUtils::VERSION;
+
+# Set up an END block to remove the test output file
+END {
+ unlink "test.tex";
+};
+
+ok(1);
+
+# First thing to do is to read the expected output from
+# the DATA filehandle and store it in a scalar.
+# Do this until we read an =pod
+my @reference;
+while (my $line = <DATA>) {
+ last if $line =~ /^=pod/;
+ push(@reference,$line);
+}
+
+# Create a new parser
+my $parser = Pod::LaTeX->new;
+ok($parser);
+$parser->Head1Level(1);
+# Add the preamble but remember not to compare the timestamps
+$parser->AddPreamble(1);
+$parser->AddPostamble(1);
+
+# For a laugh add a table of contents
+$parser->TableOfContents(1);
+
+# Create an output file
+open(OUTFH, "> test.tex" ) or die "Unable to open test tex file: $!\n";
+
+# Read from the DATA filehandle and write to a new output file
+# Really want to write this to a scalar
+$parser->parse_from_filehandle(\*DATA,\*OUTFH);
+
+close(OUTFH) or die "Error closing OUTFH test.tex: $!\n";
+
+# Now read in OUTFH and compare
+open(INFH, "< test.tex") or die "Unable to read test tex file: $!\n";
+my @output = <INFH>;
+
+ok(@output, @reference);
+for my $i (0..$#reference) {
+ next if $reference[$i] =~ /^%%/; # skip timestamp comments
+
+ # if we are running a new version of Pod::ParseUtils we need
+ # to change the link text. This is a kluge until we drop support
+ # for older versions of Pod::ParseUtils
+ if ($linkver < 0.29 && $output[$i] =~ /manpage/) {
+ # convert our expectations from new to old new format
+ $reference[$i] =~ s/Standard link: \\emph\{Pod::LaTeX\}/Standard link: the \\emph\{Pod::LaTeX\} manpage/;
+ $reference[$i] =~ s/\\textsf\{sec\} in \\emph\{Pod::LaTeX\}/the section on \\textsf\{sec\} in the \\emph\{Pod::LaTeX\} manpage/;
+ }
+ ok($output[$i], $reference[$i]);
+}
+
+close(INFH) or die "Error closing INFH test.tex: $!\n";
+
+
+__DATA__
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage{textcomp}
+
+%% Latex generated from POD in document (unknown)
+%% Using the perl module Pod::LaTeX
+%% Converted on Sat Apr 5 21:16:02 2003
+
+
+\usepackage{makeidx}
+\makeindex
+
+
+\begin{document}
+
+\tableofcontents
+
+\section{Introduction\label{Introduction}\index{Introduction}}
+\begin{itemize}
+
+\item
+
+Always check the return codes of system calls. Good error messages should
+go to STDERR, include which program caused the problem, what the failed
+system call and arguments were, and (\textbf{very important}) should contain
+the standard system error message for what went wrong. Here's a simple
+but sufficient example:
+
+\begin{verbatim}
+ opendir(D, $dir) or die "can't opendir $dir: $!";
+\end{verbatim}
+
+\item
+
+Line up your transliterations when it makes sense:
+
+\begin{verbatim}
+ tr [abc]
+ [xyz];
+\end{verbatim}
+
+
+The above should be aligned since it includes an embedded tab.
+
+
+\item
+
+Think about reusability. Why waste brainpower on a one-shot when you
+might want to do something like it again? Consider generalizing your
+code. Consider writing a module or object class. Consider making your
+code run cleanly with \texttt{use strict} and \texttt{-w} (or \texttt{use warnings} in
+Perl 5.6) in effect. Consider giving away your code. Consider changing
+your whole world view. Consider... oh, never mind.
+
+
+\item
+
+Be consistent.
+
+
+\item
+
+Be nice.
+
+\end{itemize}
+\section{Links\label{Links}\index{Links}}
+
+
+This link should just include one word: \textsf{Pod::LaTeX}
+
+
+
+This link should include the text \texttt{test} even though
+it refers to \texttt{Pod::LaTeX}: \textsf{test}.
+
+
+
+Standard link: \emph{Pod::LaTeX}.
+
+
+
+Now refer to an external section: \textsf{sec} in \emph{Pod::LaTeX}
+
+\section{Lists\label{Lists}\index{Lists}}
+
+
+Test description list with long lines
+
+\begin{description}
+
+\item[Some short text] \mbox{}
+
+Some additional para.
+
+\begin{itemize}
+
+\item
+
+Nested itemized list
+
+
+\item
+
+Second item
+
+\end{itemize}
+
+\item[some longer text than that] \mbox{}
+
+and again.
+
+
+\item[this text is even longer and greater than] \textbf{40 characters}
+
+Some more content for the item.
+
+
+\item[this is some text with \textit{something across}] \textbf{the 40 char boundary}
+
+This is item content.
+
+\end{description}
+
+
+And this should be an enumerated list without any cruft after the numbers or additional numbers at all.
+
+\begin{enumerate}
+
+\item
+
+item 1
+
+
+\item
+
+item 2
+
+\end{enumerate}
+\section{Escapes\label{Escapes}\index{Escapes}}
+
+
+Test some normal escapes such as $<$ (lt) and $>$ (gt) and $|$ (verbar) and
+\texttt{\~{}} (tilde) and \& (amp) as well as $<$ (Esc lt) and $|$ (Esc
+verbar) and \textfractionsolidus{} (Esc sol) and $>$ (Esc gt) and \& (Esc amp)
+and " (Esc quot) and even $\alpha$ (Esc alpha).
+
+\section{For blocks\label{For_blocks}\index{For blocks}}
+ Some latex code \textbf{here}.
+
+
+
+Some text that should appear.
+
+
+
+Some more text that should appear
+
+Some latex in a \textsf{begin block}
+
+and some more
+
+\begin{equation}
+a = \frac{3}{2}
+\end{equation}
+
+
+
+Back to pod.
+
+\printindex
+
+\end{document}
+=pod
+
+=head1 Introduction
+
+=over 4
+
+=item *
+
+Always check the return codes of system calls. Good error messages should
+go to STDERR, include which program caused the problem, what the failed
+system call and arguments were, and (B<very important>) should contain
+the standard system error message for what went wrong. Here's a simple
+but sufficient example:
+
+ opendir(D, $dir) or die "can't opendir $dir: $!";
+
+=item *
+
+Line up your transliterations when it makes sense:
+
+ tr [abc]
+ [xyz];
+
+The above should be aligned since it includes an embedded tab.
+
+=item *
+
+Think about reusability. Why waste brainpower on a one-shot when you
+might want to do something like it again? Consider generalizing your
+code. Consider writing a module or object class. Consider making your
+code run cleanly with C<use strict> and C<-w> (or C<use warnings> in
+Perl 5.6) in effect. Consider giving away your code. Consider changing
+your whole world view. Consider... oh, never mind.
+
+=item *
+
+Be consistent.
+
+=item *
+
+Be nice.
+
+=back
+
+=head1 Links
+
+This link should just include one word: L<Pod::LaTeX|Pod::LaTeX>
+
+This link should include the text C<test> even though
+it refers to C<Pod::LaTeX>: L<test|Pod::LaTeX>.
+
+Standard link: L<Pod::LaTeX>.
+
+Now refer to an external section: L<Pod::LaTeX/"sec">
+
+
+=head1 Lists
+
+Test description list with long lines
+
+=over 4
+
+=item Some short text
+
+Some additional para.
+
+=over 4
+
+=item *
+
+Nested itemized list
+
+=item *
+
+Second item
+
+=back
+
+=item some longer text than that
+
+and again.
+
+=item this text is even longer and greater than 40 characters
+
+Some more content for the item.
+
+=item this is some text with I<something across> the 40 char boundary
+
+This is item content.
+
+=back
+
+And this should be an enumerated list without any cruft after the numbers or additional numbers at all.
+
+=over 4
+
+=item 1)
+
+item 1
+
+=item 2.
+
+item 2
+
+=back
+
+=head1 Escapes
+
+Test some normal escapes such as < (lt) and > (gt) and | (verbar) and
+~ (tilde) and & (amp) as well as E<lt> (Esc lt) and E<verbar> (Esc
+verbar) and E<sol> (Esc sol) and E<gt> (Esc gt) and E<amp> (Esc amp)
+and E<quot> (Esc quot) and even E<alpha> (Esc alpha).
+
+=head1 For blocks
+
+=for latex
+ Some latex code \textbf{here}.
+
+Some text that should appear.
+
+=for comment
+ Should not print anything
+
+Some more text that should appear
+
+=begin latex
+
+Some latex in a \textsf{begin block}
+
+and some more
+
+\begin{equation}
+a = \frac{3}{2}
+\end{equation}
+
+=end latex
+
+Back to pod.
+
+=cut
diff --git a/gnu/usr.bin/perl/lib/Pod/t/text-options.t b/gnu/usr.bin/perl/lib/Pod/t/text-options.t
new file mode 100644
index 00000000000..42c2146d531
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Pod/t/text-options.t
@@ -0,0 +1,144 @@
+#!/usr/bin/perl -w
+# $Id: text-options.t,v 1.1.1.1 2003/12/03 02:44:08 millert Exp $
+#
+# text-options.t -- Additional tests for Pod::Text options.
+#
+# Copyright 2002 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+BEGIN {
+ chdir 't' if -d 't';
+ if ($ENV{PERL_CORE}) {
+ @INC = '../lib';
+ } else {
+ unshift (@INC, '../blib/lib');
+ }
+ unshift (@INC, '../blib/lib');
+ $| = 1;
+ print "1..3\n";
+}
+
+END {
+ print "not ok 1\n" unless $loaded;
+}
+
+use Pod::Text;
+
+$loaded = 1;
+print "ok 1\n";
+
+my $n = 2;
+while (<DATA>) {
+ my %options;
+ next until $_ eq "###\n";
+ while (<DATA>) {
+ last if $_ eq "###\n";
+ my ($option, $value) = split;
+ $options{$option} = $value;
+ }
+ open (TMP, '> tmp.pod') or die "Cannot create tmp.pod: $!\n";
+ while (<DATA>) {
+ last if $_ eq "###\n";
+ print TMP $_;
+ }
+ close TMP;
+ my $parser = Pod::Text->new (%options) or die "Cannot create parser\n";
+ $parser->parse_from_file ('tmp.pod', 'out.tmp');
+ open (TMP, 'out.tmp') or die "Cannot open out.tmp: $!\n";
+ my $output;
+ {
+ local $/;
+ $output = <TMP>;
+ }
+ close TMP;
+ unlink ('tmp.pod', 'out.tmp');
+ my $expected = '';
+ while (<DATA>) {
+ last if $_ eq "###\n";
+ $expected .= $_;
+ }
+ if ($output eq $expected) {
+ print "ok $n\n";
+ } else {
+ print "not ok $n\n";
+ print "Expected\n========\n$expected\nOutput\n======\n$output\n";
+ }
+ $n++;
+}
+
+# Below the marker are bits of POD and corresponding expected text output.
+# This is used to test specific features or problems with Pod::Text. The
+# input and output are separated by lines containing only ###.
+
+__DATA__
+
+###
+alt 1
+###
+=head1 SAMPLE
+
+=over 4
+
+=item F
+
+Paragraph.
+
+=item Bar
+
+=item B
+
+Paragraph.
+
+=item Longer
+
+Paragraph.
+
+=back
+
+###
+
+==== SAMPLE ====
+
+: F Paragraph.
+
+: Bar
+: B Paragraph.
+
+: Longer
+ Paragraph.
+
+###
+
+###
+margin 4
+###
+=head1 SAMPLE
+
+This is some body text that is long enough to be a paragraph that wraps,
+thereby testing margins with wrapped paragraphs.
+
+ This is some verbatim text.
+
+=over 6
+
+=item Test
+
+This is a test of an indented paragraph.
+
+This is another indented paragraph.
+
+=back
+###
+ SAMPLE
+ This is some body text that is long enough to be a paragraph that
+ wraps, thereby testing margins with wrapped paragraphs.
+
+ This is some verbatim text.
+
+ Test This is a test of an indented paragraph.
+
+ This is another indented paragraph.
+
+###
diff --git a/gnu/usr.bin/perl/lib/Pod/t/utils.t b/gnu/usr.bin/perl/lib/Pod/t/utils.t
index 202ffd95105..4a1b8a14b94 100644
--- a/gnu/usr.bin/perl/lib/Pod/t/utils.t
+++ b/gnu/usr.bin/perl/lib/Pod/t/utils.t
@@ -27,11 +27,11 @@ my @links = qw{
};
my @results = (
- "the P<name> manpage",
- "the Q<ident> entry in the P<name> manpage",
- "the section on Q<sec> in the P<name> manpage",
- "the section on Q<sec> elsewhere in this document",
- "the section on Q<sec> elsewhere in this document",
+ "P<name>",
+ "Q<ident> in P<name>",
+ "Q<sec> in P<name>",
+ "Q<sec>",
+ "Q<sec>",
"Q<http://www.perl.org/>",
"Q<text>",
"Q<text>",
diff --git a/gnu/usr.bin/perl/lib/Shell.t b/gnu/usr.bin/perl/lib/Shell.t
index b2d3d67aa05..106cd2a51d6 100644
--- a/gnu/usr.bin/perl/lib/Shell.t
+++ b/gnu/usr.bin/perl/lib/Shell.t
@@ -5,62 +5,64 @@ BEGIN {
@INC = '../lib';
}
-use Test::More tests => 4;
+use Test::More tests => 7;
BEGIN { use_ok('Shell'); }
+my $so = Shell->new;
+ok($so, 'Shell->new');
+
my $Is_VMS = $^O eq 'VMS';
my $Is_MSWin32 = $^O eq 'MSWin32';
my $Is_NetWare = $^O eq 'NetWare';
-$Shell::capture_stderr = 1; #
+$Shell::capture_stderr = 1;
# Now test that that works ..
my $tmpfile = 'sht0001';
-
-while ( -f $tmpfile )
-{
- $tmpfile++;
+while ( -f $tmpfile ) {
+ $tmpfile++;
}
-
-END { -f $tmpfile && (open STDERR, '>&SAVERR' and unlink $tmpfile) };
+END { -f $tmpfile && (open STDERR, '>&SAVERR' and unlink $tmpfile) }
-
-open(SAVERR,">&STDERR") ;
+open(SAVERR, ">&STDERR");
open(STDERR, ">$tmpfile");
-xXx(); # Ok someone could have a program called this :(
+xXx_not_there(); # Ok someone could have a program called this :(
# On os2 the warning is on by default...
-ok( ($^O eq 'os2' xor !(-s $tmpfile)) ,'$Shell::capture_stderr');
+ok(($^O eq 'os2' xor !(-s $tmpfile)), '$Shell::capture_stderr');
-$Shell::capture_stderr = 0; #
+$Shell::capture_stderr = 0;
# someone will have to fill in the blanks for other platforms
-if ( $Is_VMS )
-{
- ok(directory(),'Execute command');
+if ($Is_VMS) {
+ ok(directory(), 'Execute command');
my @files = directory('*.*');
- ok(@files,'Quoted arguments');
-}
-elsif( $Is_MSWin32 )
-{
- ok(dir(),'Execute command');
-
- my @files = dir('*.*');
-
- ok(@files, 'Quoted arguments');
-}
-else
-{
- ok(ls(),'Execute command');
-
- my @files = ls('*');
-
- ok(@files,'Quoted arguments');
+ ok(@files, 'Quoted arguments');
+
+ ok(eq_array(\@files, [$so->directory('*.*')]), 'object method');
+ eval { $so->directory };
+ ok(!$@, '2 methods calls');
+} elsif ($Is_MSWin32) {
+ ok(dir(), 'Execute command');
+ my @files = dir('*.*');
+ ok(@files, 'Quoted arguments');
+
+ ok(eq_array(\@files, [$so->dir('*.*')]), 'object method');
+ eval { $so->dir };
+ ok(!$@, '2 methods calls');
+} else {
+ ok(ls(), 'Execute command');
+ my @files = ls('*');
+ ok(@files, 'Quoted arguments');
+
+ ok(eq_array(\@files, [$so->ls('*')]), 'object method');
+ eval { $so->ls };
+ ok(!$@, '2 methods calls');
}
-open(STDERR,">&SAVERR") ;
+open(STDERR, ">&SAVERR") ;
diff --git a/gnu/usr.bin/perl/lib/Switch.pm b/gnu/usr.bin/perl/lib/Switch.pm
index 31590b3dcc7..9c4abe33fd4 100644
--- a/gnu/usr.bin/perl/lib/Switch.pm
+++ b/gnu/usr.bin/perl/lib/Switch.pm
@@ -4,7 +4,7 @@ use strict;
use vars qw($VERSION);
use Carp;
-$VERSION = '2.09';
+$VERSION = '2.10';
# LOAD FILTERING MODULE...
@@ -101,7 +101,8 @@ sub filter_blocks
my @pos = Text::Balanced::_match_quotelike(\$source,qr/\s*/,1,0);
if (defined $pos[0])
{
- $text .= " " . substr($source,$pos[2],$pos[18]-$pos[2]);
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= substr($source,$pos[2],$pos[18]-$pos[2]);
next component;
}
if ($source =~ m/\G\s*($pod_or_DATA)/gc) {
@@ -110,7 +111,8 @@ sub filter_blocks
@pos = Text::Balanced::_match_variable(\$source,qr/\s*/);
if (defined $pos[0])
{
- $text .= " " . substr($source,$pos[0],$pos[4]-$pos[0]);
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= substr($source,$pos[0],$pos[4]-$pos[0]);
next component;
}
@@ -149,8 +151,9 @@ sub filter_blocks
$text .= $1."if (Switch::case";
if (@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef)) {
my $code = substr($source,$pos[0],$pos[4]-$pos[0]);
- $text .= " sub" if is_block $code;
- $text .= " " . filter_blocks($code,line(substr($source,0,$pos[0]),$line)) . ")";
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "sub " if is_block $code;
+ $text .= filter_blocks($code,line(substr($source,0,$pos[0]),$line)) . ")";
}
elsif (@pos = Text::Balanced::_match_codeblock(\$source,qr/\s*/,qr/[[(]/,qr/[])]/,qr/[[({]/,qr/[])}]/,undef)) {
my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
@@ -158,13 +161,15 @@ sub filter_blocks
$code =~ s {^\s*[(]\s*m\b} { ( qr} ||
$code =~ s {^\s*[(]\s*/} { ( qr/} ||
$code =~ s {^\s*[(]\s*qw} { ( \\qw};
- $text .= " $code)";
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "$code)";
}
elsif ($Perl6 && do{@pos = Text::Balanced::_match_variable(\$source,qr/\s*/)}) {
my $code = filter_blocks(substr($source,$pos[0],$pos[4]-$pos[0]),line(substr($source,0,$pos[0]),$line));
$code =~ s {^\s*%} { \%} ||
$code =~ s {^\s*@} { \@};
- $text .= " $code)";
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "$code)";
}
elsif ( @pos = Text::Balanced::_match_quotelike(\$source,qr/\s*/,1,0)) {
my $code = substr($source,$pos[2],$pos[18]-$pos[2]);
@@ -172,7 +177,8 @@ sub filter_blocks
$code =~ s {^\s*m} { qr} ||
$code =~ s {^\s*/} { qr/} ||
$code =~ s {^\s*qw} { \\qw};
- $text .= " $code)";
+ $text .= " " if $pos[0] < $pos[2];
+ $text .= "$code)";
}
elsif ($Perl5 && $source =~ m/\G\s*(([^\$\@{])[^\$\@{]*)(?=\s*{)/gc
|| $Perl6 && $source =~ m/\G\s*([^;{]*)()/gc) {
diff --git a/gnu/usr.bin/perl/lib/Symbol.t b/gnu/usr.bin/perl/lib/Symbol.t
index 5763e5420e9..c8a7c0773f3 100644
--- a/gnu/usr.bin/perl/lib/Symbol.t
+++ b/gnu/usr.bin/perl/lib/Symbol.t
@@ -5,7 +5,7 @@ BEGIN {
@INC = '../lib';
}
-use Test::More tests => 14;
+use Test::More tests => 19;
BEGIN { $_ = 'foo'; } # because Symbol used to clobber $_
@@ -65,3 +65,13 @@ use Symbol qw(qualify); # must import into this package too
'qualify() with an identifier starting with a _' );
::ok( qualify("^FOO") eq "main::\cFOO",
'qualify() with an identifier starting with a ^' );
+
+# tests for delete_package
+package main;
+$Transient::variable = 42;
+ok( exists $::{'Transient::'}, 'transient stash exists' );
+ok( defined $Transient::{variable}, 'transient variable in stash' );
+Symbol::delete_package('Transient');
+ok( !exists $Transient::{variable}, 'transient variable no longer in stash' );
+is( scalar(keys %Transient::), 0, 'transient stash is empty' );
+ok( !exists $::{'Transient::'}, 'no transient stash' );
diff --git a/gnu/usr.bin/perl/lib/Term/ANSIColor/ChangeLog b/gnu/usr.bin/perl/lib/Term/ANSIColor/ChangeLog
index 9df692dda37..a89485cab02 100644
--- a/gnu/usr.bin/perl/lib/Term/ANSIColor/ChangeLog
+++ b/gnu/usr.bin/perl/lib/Term/ANSIColor/ChangeLog
@@ -1,3 +1,32 @@
+2003-03-25 Russ Allbery <rra@stanford.edu>
+
+ * ANSIColor.pm: Version 1.07 released.
+
+ * ANSIColor.pm: Add PuTTY, Windows telnet, and Cygwin OpenSSH
+ information to the terminal emulators table, and update the URL to
+ the ECMA standard.
+
+2002-12-09 Russ Allbery <rra@stanford.edu>
+
+ * ANSIColor.pm: Version 1.06 released to synchronize the version
+ on CPAN with the version in Perl core.
+
+ * ANSIColor.pm: Fix typo in L<> link in documentation.
+
+2002-06-28 Russ Allbery <rra@stanford.edu>
+
+ * ANSIColor.pm: Version 1.05 released.
+
+ * ANSIColor.pm: Update the formatting style, add a pointer to the
+ module web site, use L<> for URLs, and use naked <>s where
+ permissible rather than E<lt> and E<gt>. Renamed LICENSE to
+ COPYRIGHT AND LICENSE.
+
+2002-02-14 Russ Allbery <rra@stanford.edu>
+
+ * ANSIColor.pm: Added a mention of the specific Windows consoles
+ that don't work with this module.
+
2001-07-10 Russ Allbery <rra@stanford.edu>
* ANSIColor.pm: Version 1.04 released.
diff --git a/gnu/usr.bin/perl/lib/Term/ANSIColor/README b/gnu/usr.bin/perl/lib/Term/ANSIColor/README
index 9c44a6179c4..fa21f99edc9 100644
--- a/gnu/usr.bin/perl/lib/Term/ANSIColor/README
+++ b/gnu/usr.bin/perl/lib/Term/ANSIColor/README
@@ -1,10 +1,15 @@
- Term::ANSIColor version 1.04
- (A simple ANSI text attribute control module)
+ Term::ANSIColor version 1.07
+ (A simple ANSI text attribute control module)
- Copyright 1996, 1997, 1998, 2000, 2001 Russ Allbery <rra@stanford.edu>
- and Zenin <zenin@bawdycaste.org>. This program is free software; you
- may redistribute it and/or modify it under the same terms as Perl
- itself.
+ Copyright 1996, 1997, 1998, 2000, 2001, 2002
+ Russ Allbery <rra@stanford.edu> and Zenin <zenin@bawdycaste.org>. This
+ program is free software; you may redistribute it and/or modify it under
+ the same terms as Perl itself.
+
+ I welcome bug reports and patches for this package at rra@stanford.edu.
+ However, please be aware that I tend to be extremely busy and to get a
+ lot of mail. I'll save your mail and get to it as soon as I can, but
+ depending on how busy I am it may take me a couple of months.
INTRODUCTION
@@ -20,33 +25,41 @@ INTRODUCTION
While ANSI color escape codes are fairly simple, it can be hard to
remember the codes for all of the attributes and the code resulting from
hard-coding them into your script is definitely difficult to read. This
- module is designed to fix those problems, as well as provide a convenient
- interface to do a few things for you automatically (like resetting
- attributes after the text you print out so that you don't accidentally
- leave attributes set).
+ module is designed to fix those problems, as well as provide a
+ convenient interface to do a few things for you automatically (like
+ resetting attributes after the text you print out so that you don't
+ accidentally leave attributes set).
Despite its name, this module can also handle non-color ANSI text
- attributes (bold, underline, reverse video, and blink). It uses either of
- two interfaces, one of which uses "constants" for each different attribute
- and the other of which uses two subs which take strings of attributes as
- arguments.
+ attributes (bold, underline, reverse video, and blink). It uses either
+ of two interfaces, one of which uses "constants" for each different
+ attribute and the other of which uses two subs which take strings of
+ attributes as arguments.
+
+ The most recent version of this module is available at its web site:
+
+ <http://www.eyrie.org/~eagle/software/ansicolor/>
See the POD documentation for complete details, features, and usage.
+ This module is distributed as part of the Perl core distribution as of
+ Perl 5.6.0. You only need to install this module if you want a newer
+ version than came with Perl or if you have an old version of Perl.
+
INSTALLATION
Follow the standard installation procedure for Perl modules, which is to
type the following commands:
- perl Makefile.PL
- make
- make test
- make install
+ perl Makefile.PL
+ make
+ make test
+ make install
You'll probably need to do the last as root. If instead you wish to
- install the module by hand, simply copy it into a directory named Term in
- your Perl library directory.
+ install the module by hand, simply copy it into a directory named Term
+ in your Perl library directory.
Note that make install, for Perl 5.6.0 or later, will replace the
Term::ANSIColor that came with Perl. You may wan to save a backup copy
@@ -71,7 +84,7 @@ THANKS
To Rani Pinchuk for the idea of ANSI_COLORS_DISABLED and an initial
implementation.
- To Larry Wall, as always, for Perl.
+ To ATricket for the information about what PuTTY, Windows telnet, and
+ OpenSSH under Cygwin support.
- Russ Allbery
- rra@stanford.edu
+ To Larry Wall, as always, for Perl.
diff --git a/gnu/usr.bin/perl/lib/Test.pm b/gnu/usr.bin/perl/lib/Test.pm
index d497217ff11..2a76b7bd7da 100644
--- a/gnu/usr.bin/perl/lib/Test.pm
+++ b/gnu/usr.bin/perl/lib/Test.pm
@@ -1,12 +1,13 @@
-package Test;
require 5.004;
+package Test;
+# Time-stamp: "2003-04-18 21:48:01 AHDT"
use strict;
use Carp;
use vars (qw($VERSION @ISA @EXPORT @EXPORT_OK $ntest $TestLevel), #public-ish
- qw($TESTOUT $TESTERR
+ qw($TESTOUT $TESTERR %Program_Lines
$ONFAIL %todo %history $planned @FAILDETAIL) #private-ish
);
@@ -20,7 +21,7 @@ sub _reset_globals {
$planned = 0;
}
-$VERSION = '1.20';
+$VERSION = '1.24';
require Exporter;
@ISA=('Exporter');
@@ -51,6 +52,9 @@ Test - provides a simple framework for writing test scripts
# load your module...
use MyModule;
+ # Helpful notes. All note-lines must start with a "#".
+ print "# I'm testing MyModule version $MyModule::VERSION\n";
+
ok(0); # failure
ok(1); # success
@@ -64,54 +68,82 @@ Test - provides a simple framework for writing test scripts
ok(sub { 1+1 }, 2); # success: '2' eq '2'
ok(sub { 1+1 }, 3); # failure: '2' ne '3'
- ok(0, int(rand(2)); # (just kidding :-)
my @list = (0,0);
- ok @list, 3, "\@list=".join(',',@list); #extra diagnostics
+ ok @list, 3, "\@list=".join(',',@list); #extra notes
ok 'segmentation fault', '/(?i)success/'; #regex match
- skip($feature_is_missing, ...); #do platform specific test
+ skip(
+ $^O eq 'MSWin' ? "Skip unless MSWin" : 0, # whether to skip
+ $foo, $bar # arguments just like for ok(...)
+ );
+ skip(
+ $^O eq 'MSWin' ? 0 : "Skip if MSWin", # whether to skip
+ $foo, $bar # arguments just like for ok(...)
+ );
=head1 DESCRIPTION
-B<STOP!> If you are writing a new test, we I<highly suggest> you use
-the new Test::Simple and Test::More modules instead.
+This module simplifies the task of writing test files for Perl modules,
+such that their output is in the format that
+L<Test::Harness|Test::Harness> expects to see.
-L<Test::Harness|Test::Harness> expects to see particular output when it
-executes tests. This module aims to make writing proper test scripts just
-a little bit easier (and less error prone :-).
+=head1 QUICK START GUIDE
+To write a test for your new (and probably not even done) module, create
+a new file called F<t/test.t> (in a new F<t> directory). If you have
+multiple test files, to test the "foo", "bar", and "baz" feature sets,
+then feel free to call your files F<t/foo.t>, F<t/bar.t>, and
+F<t/baz.t>
=head2 Functions
-All the following are exported by Test by default.
+This module defines three public functions, C<plan(...)>, C<ok(...)>,
+and C<skip(...)>. By default, all three are exported by
+the C<use Test;> statement.
=over 4
-=item B<plan>
+=item C<plan(...)>
BEGIN { plan %theplan; }
This should be the first thing you call in your test script. It
declares your testing plan, how many there will be, if any of them
-should be allowed to fail, etc...
+should be allowed to fail, and so on.
Typical usage is just:
use Test;
BEGIN { plan tests => 23 }
-Things you can put in the plan:
+These are the things that you can put in the parameters to plan:
+
+=over
+
+=item C<tests =E<gt> I<number>>
+
+The number of tests in your script.
+This means all ok() and skip() calls.
+
+=item C<todo =E<gt> [I<1,5,14>]>
+
+A reference to a list of tests which are allowed to fail.
+See L</TODO TESTS>.
+
+=item C<onfail =E<gt> sub { ... }>
+
+=item C<onfail =E<gt> \&some_sub>
+
+A subroutine reference to be run at the end of the test script, if
+any of the tests fail. See L</ONFAIL>.
- tests The number of tests in your script.
- This means all ok() and skip() calls.
- todo A reference to a list of tests which are allowed
- to fail. See L</TODO TESTS>.
- onfail A subroutine reference to be run at the end of
- the test script should any of the tests fail.
- See L</ONFAIL>.
+=back
+
+You must call C<plan(...)> once and only once. You should call it
+in a C<BEGIN {...}> block, like so:
-You must call plan() once and only once.
+ BEGIN { plan tests => 23 }
=cut
@@ -124,6 +156,8 @@ sub plan {
_reset_globals();
+ _read_program( (caller)[1] );
+
my $max=0;
for (my $x=0; $x < @_; $x+=2) {
my ($k,$v) = @_[$x,$x+1];
@@ -143,11 +177,39 @@ sub plan {
print $TESTOUT "1..$max\n";
}
++$planned;
+ print $TESTOUT "# Running under perl version $] for $^O",
+ (chr(65) eq 'A') ? "\n" : " in a non-ASCII world\n";
+
+ print $TESTOUT "# Win32::BuildNumber ", &Win32::BuildNumber(), "\n"
+ if defined(&Win32::BuildNumber) and defined &Win32::BuildNumber();
+
+ print $TESTOUT "# MacPerl version $MacPerl::Version\n"
+ if defined $MacPerl::Version;
- # Never used.
+ printf $TESTOUT
+ "# Current time local: %s\n# Current time GMT: %s\n",
+ scalar(localtime($^T)), scalar(gmtime($^T));
+
+ print $TESTOUT "# Using Test.pm version $VERSION\n";
+
+ # Retval never used:
return undef;
}
+sub _read_program {
+ my($file) = shift;
+ return unless defined $file and length $file
+ and -e $file and -f _ and -r _;
+ open(SOURCEFILE, "<$file") || return;
+ $Program_Lines{$file} = [<SOURCEFILE>];
+ close(SOURCEFILE);
+
+ foreach my $x (@{$Program_Lines{$file}})
+ { $x =~ tr/\cm\cj\n\r//d }
+
+ unshift @{$Program_Lines{$file}}, '';
+ return 1;
+}
=begin _private
@@ -155,8 +217,8 @@ sub plan {
my $value = _to_value($input);
-Converts an ok parameter to its value. Typically this just means
-running it if its a code reference. You should run all inputed
+Converts an C<ok> parameter to its value. Typically this just means
+running it, if it's a code reference. You should run all inputted
values through this.
=cut
@@ -168,17 +230,22 @@ sub _to_value {
=end _private
-=item B<ok>
+=item C<ok(...)>
ok(1 + 1 == 2);
ok($have, $expect);
ok($have, $expect, $diagnostics);
-This is the reason for Test's existance. Its the basic function that
-handles printing "ok" or "not ok" along with the current test number.
+This function is the reason for C<Test>'s existence. It's
+the basic function that
+handles printing "C<ok>" or "C<not ok>", along with the
+current test number. (That's what C<Test::Harness> wants to see.)
+
+In its most basic usage, C<ok(...)> simply takes a single scalar
+expression. If its value is true, the test passes; if false,
+the test fails. Examples:
-In its most basic usage, it simply takes an expression. If its true,
-the test passes, if false, the test fails. Simp.
+ # Examples of ok(scalar)
ok( 1 + 1 == 2 ); # ok if 1 + 1 == 2
ok( $foo =~ /bar/ ); # ok if $foo contains 'bar'
@@ -193,43 +260,78 @@ work:
ok( !grep !defined $_, @stuff ); # ok if everything in @stuff is
# defined.
-A special case is if the expression is a subroutine reference. In
+A special case is if the expression is a subroutine reference (in either
+C<sub {...}> syntax or C<\&foo> syntax). In
that case, it is executed and its value (true or false) determines if
-the test passes or fails.
+the test passes or fails. For example,
-In its two argument form it compares the two values to see if they
-equal (with C<eq>).
+ ok( sub { # See whether sleep works at least passably
+ my $start_time = time;
+ sleep 5;
+ time() - $start_time >= 4
+ });
- ok( "this", "that" ); # not ok, 'this' ne 'that'
+In its two-argument form, C<ok(I<arg1>,I<arg2>)> compares the two scalar
+values to see if they equal. (The equality is checked with C<eq>).
+
+ # Example of ok(scalar, scalar)
-If either is a subroutine reference, that is run and used as a
-comparison.
+ ok( "this", "that" ); # not ok, 'this' ne 'that'
-Should $expect either be a regex reference (ie. qr//) or a string that
-looks like a regex (ie. '/foo/') ok() will perform a pattern match
-against it rather than using eq.
+If either (or both!) is a subroutine reference, it is run and used
+as the value for comparing. For example:
+
+ ok 4, sub {
+ open(OUT, ">x.dat") || die $!;
+ print OUT "\x{e000}";
+ close OUT;
+ my $bytecount = -s 'x.dat';
+ unlink 'x.dat' or warn "Can't unlink : $!";
+ return $bytecount;
+ },
+ ;
+
+The above test passes two values to C<ok(arg1, arg2)> -- the first is
+the number 4, and the second is a coderef. Before C<ok> compares them,
+it calls the coderef, and uses its return value as the real value of
+this parameter. Assuming that C<$bytecount> returns 4, C<ok> ends up
+testing C<4 eq 4>. Since that's true, this test passes.
+
+If C<arg2> is either a regex object (i.e., C<qr/.../>) or a string
+that I<looks like> a regex (e.g., C<'/foo/'>), then
+C<ok(I<arg1>,I<arg2>)> will perform a pattern
+match against it, instead of using C<eq>.
ok( 'JaffO', '/Jaff/' ); # ok, 'JaffO' =~ /Jaff/
ok( 'JaffO', qr/Jaff/ ); # ok, 'JaffO' =~ qr/Jaff/;
ok( 'JaffO', '/(?i)jaff/ ); # ok, 'JaffO' =~ /jaff/i;
-Finally, an optional set of $diagnostics will be printed should the
-test fail. This should usually be some useful information about the
-test pertaining to why it failed or perhaps a description of the test.
-Or both.
+Finally, you can append an optional third argument, in
+C<ok(I<arg1>,I<arg2>, I<note>)>, where I<note> is a string value that
+will be printed if the test fails. This should be some useful
+information about the test, pertaining to why it failed, and/or
+a description of the test. For example:
ok( grep($_ eq 'something unique', @stuff), 1,
"Something that should be unique isn't!\n".
'@stuff = '.join ', ', @stuff
);
-Unfortunately, a diagnostic cannot be used with the single argument
-style of ok().
+Unfortunately, a note cannot be used with the single argument
+style of C<ok()>. That is, if you try C<ok(I<arg1>, I<note>)>, then
+C<Test> will interpret this as C<ok(I<arg1>, I<arg2>)>, and probably
+end up testing C<I<arg1> eq I<arg2>> -- and that's not what you want!
-All these special cases can cause some problems. See L</BUGS and CAVEATS>.
+All of the above special cases can occasionally cause some
+problems. See L</BUGS and CAVEATS>.
=cut
+# A past maintainer of this module said:
+# <<ok(...)'s special handling of subroutine references is an unfortunate
+# "feature" that can't be removed due to compatibility.>>
+#
+
sub ok ($;$$) {
croak "ok: plan before you test!" if !$planned;
@@ -240,12 +342,17 @@ sub ok ($;$$) {
my $repetition = ++$history{"$file:$line"};
my $context = ("$file at line $line".
($repetition > 1 ? " fail \#$repetition" : ''));
+
+ # Are we comparing two values?
+ my $compare = 0;
+
my $ok=0;
my $result = _to_value(shift);
my ($expected,$diag,$isregex,$regex);
if (@_ == 0) {
$ok = $result;
} else {
+ $compare = 1;
$expected = _to_value(shift);
if (!defined $expected) {
$ok = !defined $result;
@@ -285,7 +392,7 @@ sub ok ($;$$) {
$diag =~ s/\n/\n#/g if defined $diag;
$context .= ' *TODO*' if $todo;
- if (!defined $expected) {
+ if (!$compare) {
if (!$diag) {
print $TESTERR "# Failed test $ntest in $context\n";
} else {
@@ -299,15 +406,31 @@ sub ok ($;$$) {
if (defined $regex) {
$expected = 'qr{'.$regex.'}';
}
- else {
+ elsif (defined $expected) {
$expected = "'$expected'";
}
+ else {
+ $expected = '<UNDEF>';
+ }
if (!$diag) {
print $TESTERR "# $prefix Expected: $expected\n";
} else {
print $TESTERR "# $prefix Expected: $expected ($diag)\n";
}
}
+
+ if(defined $Program_Lines{$file}[$line]) {
+ print $TESTERR
+ "# $file line $line is: $Program_Lines{$file}[$line]\n"
+ if
+ $Program_Lines{$file}[$line] =~ m/[^\s\#\(\)\{\}\[\]\;]/
+ # Otherwise it's a pretty uninteresting line!
+ ;
+
+ undef $Program_Lines{$file}[$line];
+ # So we won't repeat it.
+ }
+
push @FAILDETAIL, $detail;
}
}
@@ -315,6 +438,83 @@ sub ok ($;$$) {
$ok;
}
+=item C<skip(I<skip_if_true>, I<args...>)>
+
+This is used for tests that under some conditions can be skipped. It's
+basically equivalent to:
+
+ if( $skip_if_true ) {
+ ok(1);
+ } else {
+ ok( args... );
+ }
+
+...except that the C<ok(1)> emits not just "C<ok I<testnum>>" but
+actually "C<ok I<testnum> # I<skip_if_true_value>>".
+
+The arguments after the I<skip_if_true> are what is fed to C<ok(...)> if
+this test isn't skipped.
+
+Example usage:
+
+ my $if_MSWin =
+ $^O eq 'MSWin' ? 'Skip if under MSWin' : '';
+
+ # A test to be run EXCEPT under MSWin:
+ skip($if_MSWin, thing($foo), thing($bar) );
+
+Or, going the other way:
+
+ my $unless_MSWin =
+ $^O eq 'MSWin' ? 'Skip unless under MSWin' : '';
+
+ # A test to be run EXCEPT under MSWin:
+ skip($unless_MSWin, thing($foo), thing($bar) );
+
+The tricky thing to remember is that the first parameter is true if
+you want to I<skip> the test, not I<run> it; and it also doubles as a
+note about why it's being skipped. So in the first codeblock above, read
+the code as "skip if MSWin -- (otherwise) test whether C<thing($foo)> is
+C<thing($bar)>" or for the second case, "skip unless MSWin...".
+
+Also, when your I<skip_if_reason> string is true, it really should (for
+backwards compatibility with older Test.pm versions) start with the
+string "Skip", as shown in the above examples.
+
+Note that in the above cases, C<thing($foo)> and C<thing($bar)>
+I<are> evaluated -- but as long as the C<skip_if_true> is true,
+then we C<skip(...)> just tosses out their value (i.e., not
+bothering to treat them like values to C<ok(...)>. But if
+you need to I<not> eval the arguments when skipping the
+test, use
+this format:
+
+ skip( $unless_MSWin,
+ sub {
+ # This code returns true if the test passes.
+ # (But it doesn't even get called if the test is skipped.)
+ thing($foo) eq thing($bar)
+ }
+ );
+
+or even this, which is basically equivalent:
+
+ skip( $unless_MSWin,
+ sub { thing($foo) }, sub { thing($bar) }
+ );
+
+That is, both are like this:
+
+ if( $unless_MSWin ) {
+ ok(1); # but it actually appends "# $unless_MSWin"
+ # so that Test::Harness can tell it's a skip
+ } else {
+ # Not skipping, so actually call and evaluate...
+ ok( sub { thing($foo) }, sub { thing($bar) } );
+ }
+
+=cut
+
sub skip ($;$$$) {
local($\, $,); # guard against -l and other things that screw with
# print
@@ -341,7 +541,7 @@ sub skip ($;$$$) {
#the documented interface as this has been deprecated.
#WARN
- local($TestLevel) = $TestLevel+1; #ignore this stack frame
+ local($TestLevel) = $TestLevel+1; #to ignore this stack frame
return &ok(@_);
}
}
@@ -363,27 +563,30 @@ __END__
=item * NORMAL TESTS
-These tests are expected to succeed. If they don't something's
-screwed up!
+These tests are expected to succeed. Usually, most or all of your tests
+are in this category. If a normal test doesn't succeed, then that
+means that something is I<wrong>.
=item * SKIPPED TESTS
-Skip is for tests that might or might not be possible to run depending
-on the availability of platform specific features. The first argument
+The C<skip(...)> function is for tests that might or might not be
+possible to run, depending
+on the availability of platform-specific features. The first argument
should evaluate to true (think "yes, please skip") if the required
-feature is not available. After the first argument, skip works
-exactly the same way as do normal tests.
+feature is I<not> available. After the first argument, C<skip(...)> works
+exactly the same way as C<ok(...)> does.
=item * TODO TESTS
TODO tests are designed for maintaining an B<executable TODO list>.
-These tests are expected NOT to succeed. If a TODO test does succeed,
-the feature in question should not be on the TODO list, now should it?
+These tests are I<expected to fail.> If a TODO test does succeed,
+then the feature in question shouldn't be on the TODO list, now
+should it?
Packages should NOT be released with succeeding TODO tests. As soon
-as a TODO test starts working, it should be promoted to a normal test
+as a TODO test starts working, it should be promoted to a normal test,
and the newly working feature should be documented in the release
-notes or change log.
+notes or in the change log.
=back
@@ -391,16 +594,16 @@ notes or change log.
BEGIN { plan test => 4, onfail => sub { warn "CALL 911!" } }
-While test failures should be enough, extra diagnostics can be
+Although test failures should be enough, extra diagnostics can be
triggered at the end of a test run. C<onfail> is passed an array ref
of hash refs that describe each test failure. Each hash will contain
at least the following fields: C<package>, C<repetition>, and
C<result>. (The file, line, and test number are not included because
their correspondence to a particular test is tenuous.) If the test
-had an expected value or a diagnostic string, these will also be
+had an expected value or a diagnostic (or "note") string, these will also be
included.
-The B<optional> C<onfail> hook might be used simply to print out the
+The I<optional> C<onfail> hook might be used simply to print out the
version of your package and/or how to report problems. It might also
be used to generate extremely sophisticated diagnostics for a
particularly bizarre test failure. However it's not a panacea. Core
@@ -412,10 +615,24 @@ than the code it is testing, yes?)
=head1 BUGS and CAVEATS
-ok()'s special handling of subroutine references is an unfortunate
-"feature" that can't be removed due to compatibility.
+=over
+
+=item *
+
+C<ok(...)>'s special handing of strings which look like they might be
+regexes can also cause unexpected behavior. An innocent:
+
+ ok( $fileglob, '/path/to/some/*stuff/' );
+
+will fail, since Test.pm considers the second argument to be a regex!
+The best bet is to use the one-argument form:
+
+ ok( $fileglob eq '/path/to/some/*stuff/' );
+
+=item *
-ok()'s use of string eq can sometimes cause odd problems when comparing
+C<ok(...)>'s use of string C<eq> can sometimes cause odd problems
+when comparing
numbers, especially if you're casting a string to a number:
$foo = "1.0";
@@ -425,27 +642,94 @@ Your best bet is to use the single argument form:
ok( $foo == 1 ); # ok "1.0" == 1
-ok()'s special handing of strings which look like they might be
-regexes can also cause unexpected behavior. An innocent:
+=item *
- ok( $fileglob, '/path/to/some/*stuff/' );
+As you may have inferred from the above documentation and examples,
+C<ok>'s prototype is C<($;$$)> (and, incidentally, C<skip>'s is
+C<($;$$$)>). This means, for example, that you can do C<ok @foo, @bar>
+to compare the I<size> of the two arrays. But don't be fooled into
+thinking that C<ok @foo, @bar> means a comparison of the contents of two
+arrays -- you're comparing I<just> the number of elements of each. It's
+so easy to make that mistake in reading C<ok @foo, @bar> that you might
+want to be very explicit about it, and instead write C<ok scalar(@foo),
+scalar(@bar)>.
-will fail since Test.pm considers the second argument to a regex.
-Again, best bet is to use the single argument form:
+=item *
- ok( $fileglob eq '/path/to/some/*stuff/' );
+This almost definitely doesn't do what you expect:
+
+ ok $thingy->can('some_method');
+
+Why? Because C<can> returns a coderef to mean "yes it can (and the
+method is this...)", and then C<ok> sees a coderef and thinks you're
+passing a function that you want it to call and consider the truth of
+the result of! I.e., just like:
+ ok $thingy->can('some_method')->();
+
+What you probably want instead is this:
+
+ ok $thingy->can('some_method') && 1;
+
+If the C<can> returns false, then that is passed to C<ok>. If it
+returns true, then the larger expression S<< C<<
+$thingy->can('some_method') && 1 >> >> returns 1, which C<ok> sees as
+a simple signal of success, as you would expect.
+
+
+=item *
+
+The syntax for C<skip> is about the only way it can be, but it's still
+quite confusing. Just start with the above examples and you'll
+be okay.
+
+Moreover, users may expect this:
+
+ skip $unless_mswin, foo($bar), baz($quux);
+
+to not evaluate C<foo($bar)> and C<baz($quux)> when the test is being
+skipped. But in reality, they I<are> evaluated, but C<skip> just won't
+bother comparing them if C<$unless_mswin> is true.
+
+You could do this:
+
+ skip $unless_mswin, sub{foo($bar)}, sub{baz($quux)};
+
+But that's not terribly pretty. You may find it simpler or clearer in
+the long run to just do things like this:
+
+ if( $^O =~ m/MSWin/ ) {
+ print "# Yay, we're under $^O\n";
+ ok foo($bar), baz($quux);
+ ok thing($whatever), baz($stuff);
+ ok blorp($quux, $whatever);
+ ok foo($barzbarz), thang($quux);
+ } else {
+ print "# Feh, we're under $^O. Watch me skip some tests...\n";
+ for(1 .. 4) { skip "Skip unless under MSWin" }
+ }
+
+But be quite sure that C<ok> is called exactly as many times in the
+first block as C<skip> is called in the second block.
+
+=back
=head1 NOTE
-This module is no longer actively being developed, only bug fixes and
-small tweaks (I'll still accept patches). If you desire additional
-functionality, consider L<Test::More> or L<Test::Unit>.
+A past developer of this module once said that it was no longer being
+actively developed. However, rumors of its demise were greatly
+exaggerated. Feedback and suggestions are quite welcome.
+
+Be aware that the main value of this module is its simplicity. Note
+that there are already more ambitious modules out there, such as
+L<Test::More> and L<Test::Unit>.
=head1 SEE ALSO
-L<Test::Simple>, L<Test::More>, L<Test::Harness>, L<Devel::Cover>
+L<Test::Harness>
+
+L<Test::Simple>, L<Test::More>, L<Devel::Cover>
L<Test::Builder> for building your own testing library.
@@ -457,12 +741,18 @@ L<Test::Inline> and L<SelfTest> let you embed tests in code.
=head1 AUTHOR
Copyright (c) 1998-2000 Joshua Nathaniel Pritikin. All rights reserved.
-Copyright (c) 2001-2002 Michael G Schwern.
-Current maintainer, Michael G Schwern <schwern@pobox.com>
+Copyright (c) 2001-2002 Michael G. Schwern.
+
+Copyright (c) 2002-2003 Sean M. Burke.
+
+Current maintainer: Sean M. Burke. E<lt>sburke@cpan.orgE<gt>
This package is free software and is provided "as is" without express
or implied warranty. It may be used, redistributed and/or modified
under the same terms as Perl itself.
=cut
+
+# "Your mistake was a hidden intention."
+# -- /Oblique Strategies/, Brian Eno and Peter Schmidt
diff --git a/gnu/usr.bin/perl/lib/Test/Builder.pm b/gnu/usr.bin/perl/lib/Test/Builder.pm
index 06543e696ea..6f3edd8cce7 100644
--- a/gnu/usr.bin/perl/lib/Test/Builder.pm
+++ b/gnu/usr.bin/perl/lib/Test/Builder.pm
@@ -8,18 +8,11 @@ $^C ||= 0;
use strict;
use vars qw($VERSION $CLASS);
-$VERSION = '0.15';
+$VERSION = '0.17';
$CLASS = __PACKAGE__;
my $IsVMS = $^O eq 'VMS';
-use vars qw($Level);
-my @Test_Results = ();
-my @Test_Details = ();
-my($Test_Died) = 0;
-my($Have_Plan) = 0;
-my $Curr_Test = 0;
-
# Make Test::Builder thread-safe for ithreads.
BEGIN {
use Config;
@@ -27,15 +20,21 @@ BEGIN {
require threads;
require threads::shared;
threads::shared->import;
- share(\$Curr_Test);
- share(\@Test_Details);
- share(\@Test_Results);
}
else {
- *lock = sub { 0 };
+ *share = sub { 0 };
+ *lock = sub { 0 };
}
}
+use vars qw($Level);
+my($Test_Died) = 0;
+my($Have_Plan) = 0;
+my $Original_Pid = $$;
+my $Curr_Test = 0; share($Curr_Test);
+my @Test_Results = (); share(@Test_Results);
+my @Test_Details = (); share(@Test_Details);
+
=head1 NAME
@@ -217,6 +216,21 @@ sub no_plan {
$Have_Plan = 1;
}
+=item B<has_plan>
+
+ $plan = $Test->has_plan
+
+Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (indeterminate # of tests) or an integer (the number of expected tests).
+
+=cut
+
+sub has_plan {
+ return($Expected_Tests) if $Expected_Tests;
+ return('no_plan') if $No_Plan;
+ return(undef);
+};
+
+
=item B<skip_all>
$Test->skip_all;
@@ -263,6 +277,10 @@ like Test::Simple's ok().
sub ok {
my($self, $test, $name) = @_;
+ # $test might contain an object which we don't want to accidentally
+ # store, so we turn it into a boolean.
+ $test = $test ? 1 : 0;
+
unless( $Have_Plan ) {
require Carp;
Carp::croak("You tried to run a test without a plan! Gotta have a plan.");
@@ -281,12 +299,15 @@ ERR
my $todo = $self->todo($pack);
my $out;
+ my $result = {};
+ share($result);
+
unless( $test ) {
$out .= "not ";
- $Test_Results[$Curr_Test-1] = $todo ? 1 : 0;
+ @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 );
}
else {
- $Test_Results[$Curr_Test-1] = 1;
+ @$result{ 'ok', 'actual_ok' } = ( 1, $test );
}
$out .= "ok";
@@ -295,13 +316,24 @@ ERR
if( defined $name ) {
$name =~ s|#|\\#|g; # # in a name can confuse Test::Harness.
$out .= " - $name";
+ $result->{name} = $name;
+ }
+ else {
+ $result->{name} = '';
}
if( $todo ) {
my $what_todo = $todo;
$out .= " # TODO $what_todo";
+ $result->{reason} = $what_todo;
+ $result->{type} = 'todo';
+ }
+ else {
+ $result->{reason} = '';
+ $result->{type} = '';
}
+ $Test_Results[$Curr_Test-1] = $result;
$out .= "\n";
$self->_print($out);
@@ -630,7 +662,16 @@ sub skip {
lock($Curr_Test);
$Curr_Test++;
- $Test_Results[$Curr_Test-1] = 1;
+ my %result;
+ share(%result);
+ %result = (
+ 'ok' => 1,
+ actual_ok => 1,
+ name => '',
+ type => 'skip',
+ reason => $why,
+ );
+ $Test_Results[$Curr_Test-1] = \%result;
my $out = "ok";
$out .= " $Curr_Test" if $self->use_numbers;
@@ -666,7 +707,17 @@ sub todo_skip {
lock($Curr_Test);
$Curr_Test++;
- $Test_Results[$Curr_Test-1] = 1;
+ my %result;
+ share(%result);
+ %result = (
+ 'ok' => 1,
+ actual_ok => 0,
+ name => '',
+ type => 'todo_skip',
+ reason => $why,
+ );
+
+ $Test_Results[$Curr_Test-1] = \%result;
my $out = "not ok";
$out .= " $Curr_Test" if $self->use_numbers;
@@ -1024,9 +1075,17 @@ sub current_test {
$Curr_Test = $num;
if( $num > @Test_Results ) {
- my $start = @Test_Results ? $#Test_Results : 0;
+ my $start = @Test_Results ? $#Test_Results + 1 : 0;
for ($start..$num-1) {
- $Test_Results[$_] = 1;
+ my %result;
+ share(%result);
+ %result = ( ok => 1,
+ actual_ok => undef,
+ reason => 'incrementing test number',
+ type => 'unknown',
+ name => undef
+ );
+ $Test_Results[$_] = \%result;
}
}
}
@@ -1048,23 +1107,62 @@ Of course, test #1 is $tests[0], etc...
sub summary {
my($self) = shift;
- return @Test_Results;
+ return map { $_->{'ok'} } @Test_Results;
}
-=item B<details> I<UNIMPLEMENTED>
+=item B<details>
my @tests = $Test->details;
Like summary(), but with a lot more detail.
$tests[$test_num - 1] =
- { ok => is the test considered ok?
+ { 'ok' => is the test considered a pass?
actual_ok => did it literally say 'ok'?
name => name of the test (if any)
- type => 'skip' or 'todo' (if any)
+ type => type of test (if any, see below).
reason => reason for the above (if any)
};
+'ok' is true if Test::Harness will consider the test to be a pass.
+
+'actual_ok' is a reflection of whether or not the test literally
+printed 'ok' or 'not ok'. This is for examining the result of 'todo'
+tests.
+
+'name' is the name of the test.
+
+'type' indicates if it was a special test. Normal tests have a type
+of ''. Type can be one of the following:
+
+ skip see skip()
+ todo see todo()
+ todo_skip see todo_skip()
+ unknown see below
+
+Sometimes the Test::Builder test counter is incremented without it
+printing any test output, for example, when current_test() is changed.
+In these cases, Test::Builder doesn't know the result of the test, so
+it's type is 'unkown'. These details for these tests are filled in.
+They are considered ok, but the name and actual_ok is left undef.
+
+For example "not ok 23 - hole count # TODO insufficient donuts" would
+result in this structure:
+
+ $tests[22] = # 23 - 1, since arrays start from 0.
+ { ok => 1, # logically, the test passed since it's todo
+ actual_ok => 0, # in absolute terms, it failed
+ name => 'hole count',
+ type => 'todo',
+ reason => 'insufficient donuts'
+ };
+
+=cut
+
+sub details {
+ return @Test_Results;
+}
+
=item B<todo>
my $todo_reason = $Test->todo;
@@ -1201,9 +1299,13 @@ sub _ending {
_sanity_check();
+ # Don't bother with an ending if this is a forked copy. Only the parent
+ # should do the ending.
+ do{ _my_exit($?) && return } if $Original_Pid != $$;
+
# Bailout if plan() was never called. This is so
# "require Test::Simple" doesn't puke.
- do{ _my_exit(0) && return } if !$Have_Plan;
+ do{ _my_exit(0) && return } if !$Have_Plan && !$Test_Died;
# Figure out if we passed or failed and print helpful messages.
if( @Test_Results ) {
@@ -1214,11 +1316,16 @@ sub _ending {
}
# 5.8.0 threads bug. Shared arrays will not be auto-extended
- # by a slice.
- $Test_Results[$Expected_Tests-1] = undef
- unless defined $Test_Results[$Expected_Tests-1];
+ # by a slice. Worse, we have to fill in every entry else
+ # we'll get an "Invalid value for shared scalar" error
+ for my $idx ($#Test_Results..$Expected_Tests-1) {
+ my %empty_result = ();
+ share(%empty_result);
+ $Test_Results[$idx] = \%empty_result
+ unless defined $Test_Results[$idx];
+ }
- my $num_failed = grep !$_, @Test_Results[0..$Expected_Tests-1];
+ my $num_failed = grep !$_->{'ok'}, @Test_Results[0..$Expected_Tests-1];
$num_failed += abs($Expected_Tests - @Test_Results);
if( $Curr_Test < $Expected_Tests ) {
@@ -1251,6 +1358,11 @@ FAIL
elsif ( $Skip_All ) {
_my_exit( 0 ) && return;
}
+ elsif ( $Test_Died ) {
+ $self->diag(<<'FAIL');
+Looks like your test died before it could output anything.
+FAIL
+ }
else {
$self->diag("No tests run!\n");
_my_exit( 255 ) && return;
@@ -1283,7 +1395,7 @@ E<lt>schwern@pobox.comE<gt>
=head1 COPYRIGHT
-Copyright 2001 by chromatic E<lt>chromatic@wgz.orgE<gt>,
+Copyright 2002 by chromatic E<lt>chromatic@wgz.orgE<gt>,
Michael G Schwern E<lt>schwern@pobox.comE<gt>.
This program is free software; you can redistribute it and/or
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/Changes b/gnu/usr.bin/perl/lib/Test/Harness/Changes
index 892c24308ab..ea124e2c515 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/Changes
+++ b/gnu/usr.bin/perl/lib/Test/Harness/Changes
@@ -1,5 +1,69 @@
Revision history for Perl extension Test::Harness
+2.30 Thu Aug 14 20:04:00 CDT 2003
+ No functional changes in this version. It's only to make some doc
+ tweaks, and bump up the version number in T:H:Straps.
+
+ [DOCUMENTATION]
+ - Changed Schwern to Andy as the maintainer.
+ - Incorporated the TODO file into Harness.pm proper.
+ - Cleaned up formatting in Test::Harness::Straps.
+
+2.29 Wed Jul 17 14:08:00 CDT 2003
+ - Released as 2.29.
+
+2.28_91 Sun Jul 13 00:10:00 CDT 2003
+ [ENHANCEMENTS]
+ - Added support for HARNESS_OK_SLOW. This will make a significant
+ speedup for slower connections.
+ - Folded in some changes from bleadperl that spiff up the
+ failure reports.
+
+ [INTERNALS]
+ - Added some isa_ok() checks to the tests.
+ - All Test::Harness* modules are used by use_ok()
+ - Fixed the prototype for the canonfailed() function, not that
+ it matters since it's never called without parens.
+
+2.28_90 Sat Jul 05 20:21:00 CDT 2003
+ [ENHANCEMENTS]
+ - Now, when you run a test harnessed, the numbers don't fly by one
+ at a time, one update per second. This significantly speeds
+ up the run time for running thousands of tests. *COUGH*
+ Regexp::Common *COUGH*
+
+2.28 Thu Apr 24 14:39:00 CDT 2003
+ - No functional changes.
+
+2.27_05 Mon Apr 21 15:55:00 CDT 2003
+ - No functional changes.
+ - Fixed circular depency in the test suite. Thanks, Rob Brown.
+
+2.27_04 Sat Apr 12 21:42:00 CDT 2003
+ - Added test for $Test::Harness::Switches patch below.
+
+2.27_03 Thu Apr 03 10:47:00 CDT 2003
+ - Fixed straps not respecting $Test::Harness::Switches. Thanks
+ to Miyagawa for the patch.
+ - Added t/pod.t to test POD validity.
+
+2.27_02 Mon Mar 24 13:17:00 CDT 2003
+2.27_01 Sun Mar 23 19:46:00 CDT 2003
+ - Handed over to Andy Lester for further maintenance.
+ - Fixed when the path to perl contains spaces on Windows
+ * Stas Bekman noticed that tests with no output at all were
+ interpreted as passing
+ - MacPerl test tweak for busted exit codes (bleadperl 17345)
+ - Abigail and Nick Clark both hit the 100000 "huge test that will
+ suck up all your memory" limit with legit tests. Made the check
+ smarter to allow large, planned tests to work.
+ - Partial fix of stats display when a test fails only because there's
+ too many tests.
+ - Made wait.ph and WCOREDUMP anti-vommit protection more robust in
+ cases where wait.ph loads but WCOREDUMP() pukes when run.
+ - Added a LICENSE.
+ - Ilya noticed the per test skip reason was accumlating between tests.
+
2.26 Wed Jun 19 16:58:02 EDT 2002
- Workaround for MacPerl's lack of a working putenv. It will never
see the PERL5LIB environment variable (perl@16942).
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/Straps.pm b/gnu/usr.bin/perl/lib/Test/Harness/Straps.pm
index 75300450c6f..94fd363490f 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/Straps.pm
+++ b/gnu/usr.bin/perl/lib/Test/Harness/Straps.pm
@@ -1,12 +1,12 @@
# -*- Mode: cperl; cperl-indent-level: 4 -*-
-# $Id: Straps.pm,v 1.13 2002/06/19 21:01:04 schwern Exp $
+# $Id: Straps.pm,v 1.18 2003/08/15 01:29:23 andy Exp $
package Test::Harness::Straps;
use strict;
use vars qw($VERSION);
use Config;
-$VERSION = '0.14';
+$VERSION = '0.15';
use Test::Harness::Assert;
use Test::Harness::Iterator;
@@ -58,11 +58,9 @@ The interface is currently incomplete. I<Please> contact the author
if you'd like a feature added or something change or just have
comments.
-=head2 Construction
+=head1 Construction
-=over 4
-
-=item B<new>
+=head2 C<new>
my $strap = Test::Harness::Straps->new;
@@ -80,9 +78,7 @@ sub new {
return $self;
}
-=begin _private
-
-=item B<_init>
+=head2 C<_init>
$strap->_init;
@@ -93,26 +89,22 @@ Initialize the internal state of a strap to make it ready for parsing.
sub _init {
my($self) = shift;
- $self->{_is_vms} = $^O eq 'VMS';
+ $self->{_is_vms} = $^O eq 'VMS';
+ $self->{_is_win32} = $^O eq 'Win32';
}
-=end _private
-
-=back
-
-=head2 Analysis
-
-=over 4
+=head1 Analysis
-=item B<analyze>
+=head2 C<analyze>
my %results = $strap->analyze($name, \@test_output);
-Analyzes the output of a single test, assigning it the given $name for
-use in the total report. Returns the %results of the test. See
-L<Results>.
+Analyzes the output of a single test, assigning it the given C<$name>
+for use in the total report. Returns the C<%results> of the test.
+See L<Results>.
-@test_output should be the raw output from the test, including newlines.
+C<@test_output> should be the raw output from the test, including
+newlines.
=cut
@@ -150,10 +142,10 @@ sub _analyze_iterator {
$totals{skip_all} = $self->{skip_all} if defined $self->{skip_all};
- my $passed = !$totals{max} ||
- ($totals{max} && $totals{seen} &&
- $totals{max} == $totals{seen} &&
- $totals{max} == $totals{ok});
+ my $passed = ($totals{max} == 0 && defined $totals{skip_all}) ||
+ ($totals{max} && $totals{seen} &&
+ $totals{max} == $totals{seen} &&
+ $totals{max} == $totals{ok});
$totals{passing} = $passed ? 1 : 0;
return %totals;
@@ -206,7 +198,7 @@ sub _analyze_line {
$totals->{ok}++ if $pass;
- if( $result{number} > 100000 ) {
+ if( $result{number} > 100000 && $result{number} > $self->{max} ) {
warn "Enormous test number seen [test $result{number}]\n";
warn "Can't detailize, too big.\n";
}
@@ -230,7 +222,7 @@ sub _analyze_line {
$self->{'next'} = $result{number} + 1 if $type eq 'test';
}
-=item B<analyze_fh>
+=head2 C<analyze_fh>
my %results = $strap->analyze_fh($name, $test_filehandle);
@@ -245,11 +237,11 @@ sub analyze_fh {
$self->_analyze_iterator($name, $it);
}
-=item B<analyze_file>
+=head2 C<analyze_file>
my %results = $strap->analyze_file($test_file);
-Like C<analyze>, but it runs the given $test_file and parses it's
+Like C<analyze>, but it runs the given C<$test_file> and parses its
results. It will also use that name for the total report.
=cut
@@ -269,8 +261,9 @@ sub analyze_file {
local $ENV{PERL5LIB} = $self->_INC2PERL5LIB;
- # Is this necessary anymore?
- my $cmd = $self->{_is_vms} ? "MCR $^X" : $^X;
+ my $cmd = $self->{_is_vms} ? "MCR $^X" :
+ $self->{_is_win32} ? Win32::GetShortPathName($^X)
+ : $^X;
my $switches = $self->_switches($file);
@@ -306,9 +299,7 @@ else {
}
-=begin _private
-
-=item B<_switches>
+=head2 C<_switches>
my $switches = $self->_switches($file);
@@ -322,7 +313,7 @@ sub _switches {
local *TEST;
open(TEST, $file) or print "can't open $file. $!\n";
my $first = <TEST>;
- my $s = '';
+ my $s = $Test::Harness::Switches || '';
$s .= " $ENV{'HARNESS_PERL_SWITCHES'}"
if exists $ENV{'HARNESS_PERL_SWITCHES'};
@@ -342,12 +333,12 @@ sub _switches {
}
-=item B<_INC2PERL5LIB>
+=head2 C<_INC2PERL5LIB>
local $ENV{PERL5LIB} = $self->_INC2PERL5LIB;
-Takes the current value of @INC and turns it into something suitable
-for putting onto PERL5LIB.
+Takes the current value of C<@INC> and turns it into something suitable
+for putting onto C<PERL5LIB>.
=cut
@@ -359,12 +350,12 @@ sub _INC2PERL5LIB {
return join $Config{path_sep}, $self->_filtered_INC;
}
-=item B<_filtered_INC>
+=head2 C<_filtered_INC>
my @filtered_inc = $self->_filtered_INC;
-Shortens @INC by removing redundant and unnecessary entries.
-Necessary for OS's with limited command line lengths, like VMS.
+Shortens C<@INC> by removing redundant and unnecessary entries.
+Necessary for OSes with limited command line lengths, like VMS.
=cut
@@ -383,11 +374,11 @@ sub _filtered_INC {
}
-=item B<_restore_PERL5LIB>
+=head2 C<_restore_PERL5LIB>
$self->_restore_PERL5LIB;
-This restores the original value of the PERL5LIB environment variable.
+This restores the original value of the C<PERL5LIB> environment variable.
Necessary on VMS, otherwise a no-op.
=cut
@@ -402,26 +393,16 @@ sub _restore_PERL5LIB {
}
}
-
-=end _private
-
-=back
-
-
-=begin _private
-
-=head2 Parsing
+=head1 Parsing
Methods for identifying what sort of line you're looking at.
-=over 4
-
-=item B<_is_comment>
+=head2 C<_is_comment>
my $is_comment = $strap->_is_comment($line, \$comment);
Checks if the given line is a comment. If so, it will place it into
-$comment (sans #).
+C<$comment> (sans #).
=cut
@@ -437,14 +418,14 @@ sub _is_comment {
}
}
-=item B<_is_header>
+=head2 C<_is_header>
my $is_header = $strap->_is_header($line);
-Checks if the given line is a header (1..M) line. If so, it places
-how many tests there will be in $strap->{max}, a list of which tests
-are todo in $strap->{todo} and if the whole test was skipped
-$strap->{skip_all} contains the reason.
+Checks if the given line is a header (1..M) line. If so, it places how
+many tests there will be in C<< $strap->{max} >>, a list of which tests
+are todo in C<< $strap->{todo} >> and if the whole test was skipped
+C<< $strap->{skip_all} >> contains the reason.
=cut
@@ -467,7 +448,11 @@ sub _is_header {
$self->{todo} = { map { $_ => 1 } split /\s+/, $todo } if $todo;
- $self->{skip_all} = $reason if defined $skip and $skip =~ /^Skip/i;
+ if( $self->{max} == 0 ) {
+ $reason = '' unless defined $skip and $skip =~ /^Skip/i;
+ }
+
+ $self->{skip_all} = $reason;
}
return $YES;
@@ -477,12 +462,12 @@ sub _is_header {
}
}
-=item B<_is_test>
+=head2 C<_is_test>
my $is_test = $strap->_is_test($line, \%test);
Checks if the $line is a test report (ie. 'ok/not ok'). Reports the
-result back in %test which will contain:
+result back in C<%test> which will contain:
ok did it succeed? This is the literal 'ok' or 'not ok'.
name name of the test (if any)
@@ -492,7 +477,7 @@ result back in %test which will contain:
reason why is it todo or skip? (if any)
If will also catch lone 'not' lines, note it saw them
-$strap->{saw_lone_not} and the line in $strap->{lone_not_line}.
+C<< $strap->{saw_lone_not} >> and the line in C<< $strap->{lone_not_line} >>.
=cut
@@ -546,7 +531,7 @@ sub _is_test {
}
}
-=item B<_is_bail_out>
+=head2 C<_is_bail_out>
my $is_bail_out = $strap->_is_bail_out($line, \$reason);
@@ -567,12 +552,12 @@ sub _is_bail_out {
}
}
-=item B<_reset_file_state>
+=head2 C<_reset_file_state>
$strap->_reset_file_state;
-Resets things like $strap->{max}, $strap->{skip_all}, etc... so its
-ready to parse the next file.
+Resets things like C<< $strap->{max} >> , C<< $strap->{skip_all} >>,
+etc. so it's ready to parse the next file.
=cut
@@ -589,14 +574,10 @@ sub _reset_file_state {
$self->{'next'} = 1;
}
-=back
-
-=end _private
-
+=head1 Results
-=head2 Results
-
-The %results returned from analyze() contain the following information:
+The C<%results> returned from C<analyze()> contain the following
+information:
passing true if the whole test is considered a pass
(or skipped), false if its a failure
@@ -637,17 +618,13 @@ There is one final item, the details.
Element 0 of the details is test #1. I tried it with element 1 being
#1 and 0 being empty, this is less awkward.
-=begin _private
-
-=over 4
-
-=item B<_detailize>
+=head2 C<_detailize>
my %details = $strap->_detailize($pass, \%test);
-Generates the details based on the last test line seen. $pass is true
-if it was considered to be a passed test. %test is the results of the
-test you're summarizing.
+Generates the details based on the last test line seen. C<$pass> is
+true if it was considered to be a passed test. C<%test> is the results
+of the test you're summarizing.
=cut
@@ -671,17 +648,14 @@ sub _detailize {
return %details;
}
-=back
-
-=end _private
-
=head1 EXAMPLES
See F<examples/mini_harness.plx> for an example of use.
=head1 AUTHOR
-Michael G Schwern E<lt>schwern@pobox.comE<gt>
+Michael G Schwern C<< <schwern@pobox.com> >>, currently maintained by
+Andy Lester C<< <andy@petdance.com> >>.
=head1 SEE ALSO
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/t/assert.t b/gnu/usr.bin/perl/lib/Test/Harness/t/assert.t
index 9ff7305b29b..11a4ed78a73 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/t/assert.t
+++ b/gnu/usr.bin/perl/lib/Test/Harness/t/assert.t
@@ -12,9 +12,9 @@ BEGIN {
use strict;
-use Test::More tests => 6;
+use Test::More tests => 7;
-use Test::Harness::Assert;
+use_ok( 'Test::Harness::Assert' );
ok( defined &assert, 'assert() exported' );
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/t/callback.t b/gnu/usr.bin/perl/lib/Test/Harness/t/callback.t
index d77495887ce..646e81f398c 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/t/callback.t
+++ b/gnu/usr.bin/perl/lib/Test/Harness/t/callback.t
@@ -43,10 +43,11 @@ my $SAMPLE_TESTS = $ENV{PERL_CORE}
test other other test other )],
);
-plan tests => scalar keys %samples;
+plan tests => 2 + scalar keys %samples;
-use Test::Harness::Straps;
+use_ok( 'Test::Harness::Straps' );
my $strap = Test::Harness::Straps->new;
+isa_ok( $strap, 'Test::Harness::Straps' );
$strap->{callback} = sub {
my($self, $line, $type, $totals) = @_;
push @out, $type;
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/t/pod.t b/gnu/usr.bin/perl/lib/Test/Harness/t/pod.t
new file mode 100644
index 00000000000..6a299a6273a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Test/Harness/t/pod.t
@@ -0,0 +1,23 @@
+BEGIN {
+ eval "use Test::More";
+ if ($@) {
+ print "1..0 # SKIPPED: Test::More not installed.\n";
+ exit;
+ }
+}
+
+use File::Spec;
+use File::Find;
+use strict;
+
+eval "use Test::Pod 0.95";
+
+if ($@) {
+ plan skip_all => "Test::Pod v0.95 required for testing POD";
+} else {
+ my @files;
+ my $blib = File::Spec->catfile(qw(blib lib));
+ find( sub {push @files, $File::Find::name if /\.p(l|m|od)$/}, $blib);
+ plan tests => scalar @files;
+ Test::Pod::pod_file_ok($_) foreach @files;
+}
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/t/strap-analyze.t b/gnu/usr.bin/perl/lib/Test/Harness/t/strap-analyze.t
index 02fa1d63900..70f973dbd98 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/t/strap-analyze.t
+++ b/gnu/usr.bin/perl/lib/Test/Harness/t/strap-analyze.t
@@ -20,11 +20,11 @@ my $SAMPLE_TESTS = $ENV{PERL_CORE}
: File::Spec->catdir($Curdir, 't', 'sample-tests');
-my $IsMacOS = $^O eq 'MacOS';
+my $IsMacPerl = $^O eq 'MacOS';
my $IsVMS = $^O eq 'VMS';
# VMS uses native, not POSIX, exit codes.
-my $die_exit = $IsVMS ? 44 : $IsMacOS ? 0 : 1;
+my $die_exit = $IsVMS ? 44 : 1;
# We can only predict that the wait status should be zero or not.
my $wait_non_zero = 1;
@@ -174,6 +174,23 @@ my %samples = (
],
},
+ no_output => {
+ passing => 0,
+
+ 'exit' => 0,
+ 'wait' => 0,
+
+ max => 0,
+ seen => 0,
+
+ 'ok' => 0,
+ 'todo' => 0,
+ 'skip' => 0,
+ bonus => 0,
+
+ details => [],
+ },
+
simple => {
passing => 1,
@@ -284,6 +301,7 @@ my %samples = (
max => 0,
seen => 0,
+ skip_all => '',
'ok' => 0,
'todo' => 0,
@@ -442,7 +460,7 @@ my %samples = (
},
);
-plan tests => (keys(%samples) * 4) + 3;
+plan tests => (keys(%samples) * 5) + 4;
use_ok('Test::Harness::Straps');
@@ -462,6 +480,7 @@ while( my($test, $expect) = each %samples ) {
my $test_path = File::Spec->catfile($SAMPLE_TESTS, $test);
my $strap = Test::Harness::Straps->new;
+ isa_ok( $strap, 'Test::Harness::Straps' );
my %results = $strap->analyze_file($test_path);
is_deeply($results{details}, $expect->{details}, "$test details" );
@@ -470,7 +489,7 @@ while( my($test, $expect) = each %samples ) {
delete $results{details};
SKIP: {
- skip '$? unreliable in MacPerl', 2 if $IsMacOS;
+ skip '$? unreliable in MacPerl', 2 if $IsMacPerl;
# We can only check if it's zero or non-zero.
is( !!$results{'wait'}, !!$expect->{'wait'}, 'wait status' );
@@ -489,5 +508,6 @@ while( my($test, $expect) = each %samples ) {
my $strap = Test::Harness::Straps->new;
+isa_ok( $strap, 'Test::Harness::Straps' );
ok( !$strap->analyze_file('I_dont_exist') );
is( $strap->{error}, "I_dont_exist does not exist" );
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/t/strap.t b/gnu/usr.bin/perl/lib/Test/Harness/t/strap.t
index 26af9f30fb7..d74ea64da35 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/t/strap.t
+++ b/gnu/usr.bin/perl/lib/Test/Harness/t/strap.t
@@ -12,14 +12,12 @@ BEGIN {
use strict;
-use Test::More tests => 146;
-
+use Test::More tests => 170;
use_ok('Test::Harness::Straps');
my $strap = Test::Harness::Straps->new;
-ok( defined $strap && $strap->isa("Test::Harness::Straps"), 'new()' );
-
+isa_ok( $strap, 'Test::Harness::Straps', 'new()' );
### Testing _is_comment()
@@ -39,6 +37,7 @@ my %comments = (
while( my($line, $line_comment) = each %comments ) {
my $strap = Test::Harness::Straps->new;
+ isa_ok( $strap, 'Test::Harness::Straps' );
my $name = substr($line, 0, 20);
ok( $strap->_is_comment($line, \$comment), " comment '$name'" );
@@ -72,7 +71,9 @@ my @attribs = qw(max skip_all todo);
my %headers = (
'1..2' => { max => 2 },
'1..1' => { max => 1 },
- '1..0' => { max => 0 },
+ '1..0' => { max => 0,
+ skip_all => '',
+ },
'1..0 # Skipped: no leverage found' => { max => 0,
skip_all => 'no leverage found',
},
@@ -84,17 +85,17 @@ my %headers = (
},
'1..10 todo 2 4 10' => { max => 10,
'todo' => { 2 => 1,
- 4 => 1,
- 10 => 1,
+ 4 => 1,
+ 10 => 1,
},
},
'1..10 todo' => { max => 10 },
'1..192 todo 4 2 13 192 # Skip skip skip because' =>
{ max => 192,
'todo' => { 4 => 1,
- 2 => 1,
- 13 => 1,
- 192 => 1,
+ 2 => 1,
+ 13 => 1,
+ 192 => 1,
},
skip_all => 'skip skip because'
}
@@ -102,6 +103,7 @@ my %headers = (
while( my($header, $expect) = each %headers ) {
my $strap = Test::Harness::Straps->new;
+ isa_ok( $strap, 'Test::Harness::Straps' );
ok( $strap->_is_header($header), "_is_header() is a header '$header'" );
@@ -183,6 +185,8 @@ my @untests = (
);
foreach my $line (@untests) {
my $strap = Test::Harness::Straps->new;
+ isa_ok( $strap, 'Test::Harness::Straps' );
+
my %test = ();
ok( !$strap->_is_test($line, \%test), "_is_test() disregards '$line'" );
@@ -202,6 +206,8 @@ my %bails = (
while( my($line, $expect) = each %bails ) {
my $strap = Test::Harness::Straps->new;
+ isa_ok( $strap, 'Test::Harness::Straps' );
+
my $reason;
ok( $strap->_is_bail_out($line, \$reason), "_is_bail_out() spots '$line'");
is( $reason, $expect, ' with the right reason' );
@@ -216,6 +222,8 @@ my @unbails = (
foreach my $line (@unbails) {
my $strap = Test::Harness::Straps->new;
+ isa_ok( $strap, 'Test::Harness::Straps' );
+
my $reason;
ok( !$strap->_is_bail_out($line, \$reason),
diff --git a/gnu/usr.bin/perl/lib/Test/Harness/t/test-harness.t b/gnu/usr.bin/perl/lib/Test/Harness/t/test-harness.t
index e9f99c8a960..1af11442bde 100644
--- a/gnu/usr.bin/perl/lib/Test/Harness/t/test-harness.t
+++ b/gnu/usr.bin/perl/lib/Test/Harness/t/test-harness.t
@@ -40,11 +40,14 @@ package main;
use Test::More;
-my $IsMacOS = $^O eq 'MacOS';
+my $IsMacPerl = $^O eq 'MacOS';
my $IsVMS = $^O eq 'VMS';
# VMS uses native, not POSIX, exit codes.
-my $die_estat = $IsVMS ? 44 : $IsMacOS ? 0 : 1;
+# MacPerl's exit codes are broken.
+my $die_estat = $IsVMS ? 44 :
+ $IsMacPerl ? 0 :
+ 1;
my %samples = (
simple => {
@@ -250,6 +253,23 @@ my %samples = (
},
all_ok => 0,
},
+ no_output => {
+ total => {
+ bonus => 0,
+ max => 0,
+ 'ok' => 0,
+ files => 1,
+ bad => 1,
+ good => 0,
+ tests => 1,
+ sub_skipped => 0,
+ 'todo' => 0,
+ skipped => 0,
+ },
+ failed => {
+ },
+ all_ok => 0,
+ },
skipall => {
total => {
bonus => 0,
@@ -414,13 +434,47 @@ my %samples = (
failed => { },
all_ok => 1,
},
+ too_many => {
+ total => {
+ bonus => 0,
+ max => 3,
+ 'ok' => 7,
+ files => 1,
+ bad => 1,
+ good => 0,
+ tests => 1,
+ sub_skipped => 0,
+ 'todo' => 0,
+ skipped => 0,
+ },
+ failed => {
+ canon => '4-7',
+ },
+ all_ok => 0,
+ },
+ switches => {
+ total => {
+ bonus => 0,
+ max => 1,
+ 'ok' => 1,
+ files => 1,
+ bad => 0,
+ good => 1,
+ tests => 1,
+ sub_skipped=> 0,
+ 'todo' => 0,
+ skipped => 0,
+ },
+ failed => { },
+ all_ok => 1,
+ },
);
plan tests => (keys(%samples) * 8) + 1;
-use Test::Harness;
use_ok('Test::Harness');
-
+use Test::Harness; # So that we don't get "used only once" warnings on the next line
+$Test::Harness::Switches = '"-Mstrict"';
tie *NULL, 'My::Dev::Null' or die $!;
@@ -438,8 +492,8 @@ while (my($test, $expect) = each %samples) {
};
select STDOUT;
- # $? is unreliable in MacPerl, so we'll simply fudge it.
- $failed->{estat} = $die_estat if $IsMacOS and $failed;
+ # $? is unreliable in MacPerl, so we'll just fudge it.
+ $failed->{estat} = $die_estat if $IsMacPerl and $failed;
SKIP: {
skip "special tests for bailout", 1 unless $test eq 'bailout';
diff --git a/gnu/usr.bin/perl/lib/Test/More.pm b/gnu/usr.bin/perl/lib/Test/More.pm
index 9be5ea8b928..d82f81d0fe1 100644
--- a/gnu/usr.bin/perl/lib/Test/More.pm
+++ b/gnu/usr.bin/perl/lib/Test/More.pm
@@ -18,7 +18,7 @@ sub _carp {
require Exporter;
use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO);
-$VERSION = '0.45';
+$VERSION = '0.47';
@ISA = qw(Exporter);
@EXPORT = qw(ok use_ok require_ok
is isnt like unlike is_deeply
@@ -304,7 +304,7 @@ test:
Will produce something like this:
not ok 17 - Is foo the same as bar?
- # Failed test 1 (foo.t at line 139)
+ # Failed test (foo.t at line 139)
# got: 'waffle'
# expected: 'yarblokos'
@@ -773,10 +773,10 @@ the easiest way to illustrate:
skip "HTML::Lint not installed", 2 if $@;
my $lint = new HTML::Lint;
- ok( $lint, "Created object" );
+ isa_ok( $lint, "HTML::Lint" );
$lint->parse( $html );
- is( scalar $lint->errors, 0, "No errors found in HTML" );
+ is( $lint->errors, 0, "No errors found in HTML" );
}
If the user does not have HTML::Lint installed, the whole block of
@@ -1109,6 +1109,9 @@ Similar to eq_array(), except the order of the elements is B<not>
important. This is a deep check, but the irrelevancy of order only
applies to the top level.
+B<NOTE> By historical accident, this is not a true set comparision.
+While the order of elements does not matter, duplicate elements do.
+
=cut
# We must make sure that references are treated neutrally. It really
diff --git a/gnu/usr.bin/perl/lib/Test/Simple.pm b/gnu/usr.bin/perl/lib/Test/Simple.pm
index 464fffd782f..563528bc159 100644
--- a/gnu/usr.bin/perl/lib/Test/Simple.pm
+++ b/gnu/usr.bin/perl/lib/Test/Simple.pm
@@ -4,7 +4,7 @@ use 5.004;
use strict 'vars';
use vars qw($VERSION);
-$VERSION = '0.45';
+$VERSION = '0.47';
use Test::Builder;
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/Changes b/gnu/usr.bin/perl/lib/Test/Simple/Changes
index 0591a7e4359..272b07e6499 100644
--- a/gnu/usr.bin/perl/lib/Test/Simple/Changes
+++ b/gnu/usr.bin/perl/lib/Test/Simple/Changes
@@ -1,5 +1,25 @@
Revision history for Perl extension Test::Simple
+0.47 Mon Aug 26 03:54:22 PDT 2002
+ * Tatsuhiko Miyagawa noticed Test::Builder was accidentally storing
+ objects passed into test functions causing problems with tests
+ relying on object destruction.
+ - Added example of calculating the number of tests to Test::Tutorial
+ - Peter Scott made the ending logic not fire on child processes when
+ forking.
+ * Test::Builder is once again ithread safe.
+
+0.46 Sat Jul 20 19:57:40 EDT 2002
+ - Noted eq_set() isn't really a set comparision.
+ - Test fix, exit codes are broken on MacPerl (bleadperl@16868)
+ - Make Test::Simple install itself into the core for >= 5.8
+ - Small fixes to Test::Tutorial and skip examples
+ * Added TB->has_plan() from Adrian Howard
+ - Clarified the meaning of 'actual_ok' from TB->details
+ * Added TB->details() from chromatic
+ - Neil Watkiss fixed a pre-5.8 test glitch with threads.t
+ * If the test died before a plan, it would exit with 0 [ID 20020716.013]
+
0.45 Wed Jun 19 18:41:12 EDT 2002
- Andy Lester made the SKIP & TODO docs a bit clearer.
- Explicitly disallowing double plans. (RT #553)
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/details.t b/gnu/usr.bin/perl/lib/Test/Simple/t/details.t
new file mode 100644
index 00000000000..65dcf8d1544
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/details.t
@@ -0,0 +1,93 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib', 'lib');
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use Test::More;
+use Test::Builder;
+my $Test = Test::Builder->new;
+
+$Test->plan( tests => 8 );
+$Test->level(0);
+
+my @Expected_Details;
+
+$Test->is_num( scalar $Test->summary(), 0, 'no tests yet, no summary' );
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 1,
+ name => 'no tests yet, no summary',
+ type => '',
+ reason => ''
+ };
+
+# Inline TODO tests will confuse pre 1.20 Test::Harness, so we
+# should just avoid the problem and not print it out.
+my $out_fh = $Test->output;
+my $start_test = $Test->current_test + 1;
+require TieOut;
+tie *FH, 'TieOut';
+$Test->output(\*FH);
+
+SKIP: {
+ $Test->skip( 'just testing skip' );
+}
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 1,
+ name => '',
+ type => 'skip',
+ reason => 'just testing skip',
+ };
+
+TODO: {
+ local $TODO = 'i need a todo';
+ $Test->ok( 0, 'a test to todo!' );
+
+ push @Expected_Details, { 'ok' => 1,
+ actual_ok => 0,
+ name => 'a test to todo!',
+ type => 'todo',
+ reason => 'i need a todo',
+ };
+
+ $Test->todo_skip( 'i need both' );
+}
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 0,
+ name => '',
+ type => 'todo_skip',
+ reason => 'i need both'
+ };
+
+for ($start_test..$Test->current_test) { print "ok $_\n" }
+$Test->output($out_fh);
+
+$Test->is_num( scalar $Test->summary(), 4, 'summary' );
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => 1,
+ name => 'summary',
+ type => '',
+ reason => '',
+ };
+
+$Test->current_test(6);
+print "ok 6 - current_test incremented\n";
+push @Expected_Details, { 'ok' => 1,
+ actual_ok => undef,
+ name => undef,
+ type => 'unknown',
+ reason => 'incrementing test number',
+ };
+
+my @details = $Test->details();
+$Test->is_num( scalar @details, 6,
+ 'details() should return a list of all test details');
+
+$Test->level(1);
+is_deeply( \@details, \@Expected_Details );
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/exit.t b/gnu/usr.bin/perl/lib/Test/Simple/t/exit.t
index 1367bbfdcd3..0ba76ba5dec 100644
--- a/gnu/usr.bin/perl/lib/Test/Simple/t/exit.t
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/exit.t
@@ -1,3 +1,5 @@
+#!/usr/bin/perl -w
+
# Can't use Test.pm, that's a 5.005 thing.
package My::Test;
@@ -53,6 +55,7 @@ my %Tests = (
'too_few.plx' => [4, 4],
'death.plx' => [255, 4],
'last_minute_death.plx' => [255, 4],
+ 'pre_plan_death.plx' => ['not zero', 'not zero'],
'death_in_eval.plx' => [0, 0],
'require.plx' => [0, 0],
);
@@ -87,6 +90,14 @@ while( my($test_name, $exit_codes) = each %Tests ) {
my $wait_stat = system(qq{$Perl -"I../blib/lib" -"I../lib" -"I../t/lib" $file});
my $actual_exit = exitstatus($wait_stat);
- My::Test::ok( $actual_exit == $exit_code,
- "$test_name exited with $actual_exit (expected $exit_code)");
+ if( $exit_code eq 'not zero' ) {
+ My::Test::ok( $actual_exit != 0,
+ "$test_name exited with $actual_exit ".
+ "(expected $exit_code)");
+ }
+ else {
+ My::Test::ok( $actual_exit == $exit_code,
+ "$test_name exited with $actual_exit ".
+ "(expected $exit_code)");
+ }
}
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/fork.t b/gnu/usr.bin/perl/lib/Test/Simple/t/fork.t
new file mode 100644
index 00000000000..ca103b1ca64
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/fork.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+use Config;
+
+if( !$Config{d_fork} ) {
+ plan skip_all => "This system cannot fork";
+}
+else {
+ plan tests => 1;
+}
+
+if( fork ) { # parent
+ pass("Only the parent should process the ending, not the child");
+}
+else {
+ exit; # child
+}
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/has_plan.t b/gnu/usr.bin/perl/lib/Test/Simple/t/has_plan.t
new file mode 100644
index 00000000000..d3f888f2a59
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/has_plan.t
@@ -0,0 +1,23 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ('../lib');
+ }
+}
+
+use strict;
+use Test::Builder;
+
+my $unplanned;
+
+BEGIN {
+ $unplanned = 'oops';
+ $unplanned = Test::Builder->has_plan;
+};
+
+use Test::More tests => 2;
+
+is($unplanned, undef, 'no plan yet defined');
+is(Test::Builder->has_plan, 2, 'has fixed plan');
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/has_plan2.t b/gnu/usr.bin/perl/lib/Test/Simple/t/has_plan2.t
new file mode 100644
index 00000000000..2b9ac499da2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/has_plan2.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More;
+
+BEGIN {
+ if( !$ENV{HARNESS_ACTIVE} && $ENV{PERL_CORE} ) {
+ plan skip_all => "Won't work with t/TEST";
+ }
+}
+
+BEGIN {
+ require Test::Harness;
+}
+
+if( $Test::Harness::VERSION < 1.20 ) {
+ plan skip_all => 'Need Test::Harness 1.20 or up';
+}
+
+use strict;
+use Test::Builder;
+
+plan 'no_plan';
+is(Test::Builder->has_plan, 'no_plan', 'has no_plan');
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/ok_obj.t b/gnu/usr.bin/perl/lib/Test/Simple/t/ok_obj.t
new file mode 100644
index 00000000000..8678dbff8d9
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/ok_obj.t
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+# Testing to make sure Test::Builder doesn't accidentally store objects
+# passed in as test arguments.
+
+BEGIN {
+ if( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More tests => 4;
+
+package Foo;
+my $destroyed = 0;
+sub new { bless {}, shift }
+
+sub DESTROY {
+ $destroyed++;
+}
+
+package main;
+
+for (1..3) {
+ ok(my $foo = Foo->new, 'created Foo object');
+}
+is $destroyed, 3, "DESTROY called 3 times";
+
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/plan.t b/gnu/usr.bin/perl/lib/Test/Simple/t/plan.t
index c2bf27a37e5..fa46744b06b 100644
--- a/gnu/usr.bin/perl/lib/Test/Simple/t/plan.t
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/plan.t
@@ -1,3 +1,5 @@
+#!/usr/bin/perl -w
+
BEGIN {
if( $ENV{PERL_CORE} ) {
chdir 't';
diff --git a/gnu/usr.bin/perl/lib/Test/Simple/t/threads.t b/gnu/usr.bin/perl/lib/Test/Simple/t/threads.t
index 4212cccb77f..5670bda25b3 100644
--- a/gnu/usr.bin/perl/lib/Test/Simple/t/threads.t
+++ b/gnu/usr.bin/perl/lib/Test/Simple/t/threads.t
@@ -8,7 +8,7 @@ BEGIN {
}
use Config;
-unless ($Config{'useithreads'}) {
+unless ($Config{'useithreads'} and eval { require threads; 1 }) {
print "1..0 # Skip: no threads\n";
exit 0;
}
diff --git a/gnu/usr.bin/perl/lib/Test/Tutorial.pod b/gnu/usr.bin/perl/lib/Test/Tutorial.pod
index e07ca325f34..a57d04769e8 100644
--- a/gnu/usr.bin/perl/lib/Test/Tutorial.pod
+++ b/gnu/usr.bin/perl/lib/Test/Tutorial.pod
@@ -298,8 +298,23 @@ C<%ICal_Dates>. Now that it's less work to test with more dates, you'll
be inclined to just throw more in as you think of them.
Only problem is, every time we add to that we have to keep adjusting
the C<use Test::More tests =E<gt> ##> line. That can rapidly get
-annoying. Instead we use C<no_plan>. This means we're just running
-some tests, don't know how many. [6]
+annoying. There's two ways to make this work better.
+
+First, we can calculate the plan dynamically using the C<plan()>
+function.
+
+ use Test::More;
+ use Date::ICal;
+
+ my %ICal_Dates = (
+ ...same as before...
+ );
+
+ # For each key in the hash we're running 8 tests.
+ plan tests => keys %ICal_Dates * 8;
+
+Or to be even more flexible, we use C<no_plan>. This means we're just
+running some tests, don't know how many. [6]
use Test::More 'no_plan'; # instead of tests => 32
@@ -436,6 +451,7 @@ Thumbing through the Date::ICal man page, I came across this:
the date in the Date::ICal test suite. So I'll write one.
use Test::More tests => 1;
+ use Date::ICal;
my $ical = Date::ICal->new;
$ical->ical('20201231Z');
diff --git a/gnu/usr.bin/perl/lib/Test/t/fail.t b/gnu/usr.bin/perl/lib/Test/t/fail.t
index ce37464d04a..9051a1f481e 100644
--- a/gnu/usr.bin/perl/lib/Test/t/fail.t
+++ b/gnu/usr.bin/perl/lib/Test/t/fail.t
@@ -51,8 +51,17 @@ shift @got;
$Expect =~ s/\n+$//;
my @expect = split /\n\n/, $Expect;
+
+sub commentless {
+ my $in = $_[0];
+ $in =~ s/^#[^\n]*\n//mg;
+ $in =~ s/\n#[^\n]*$//mg;
+ return $in;
+}
+
+
for (my $x=0; $x < @got; $x++) {
- ok $got[$x], $expect[$x]."\n";
+ ok commentless($got[$x]), commentless($expect[$x]."\n");
}
diff --git a/gnu/usr.bin/perl/lib/Test/t/mix.t b/gnu/usr.bin/perl/lib/Test/t/mix.t
index a746ba66b5d..52983383186 100644
--- a/gnu/usr.bin/perl/lib/Test/t/mix.t
+++ b/gnu/usr.bin/perl/lib/Test/t/mix.t
@@ -46,5 +46,13 @@ ok 4 # skip
EXPECT
+sub commentless {
+ my $in = $_[0];
+ $in =~ s/^#[^\n]*\n//mg;
+ $in =~ s/\n#[^\n]*$//mg;
+ return $in;
+}
+
+
print "1..1\n";
-ok( $out, $expect );
+ok( commentless($out), commentless($expect) );
diff --git a/gnu/usr.bin/perl/lib/Test/t/todo.t b/gnu/usr.bin/perl/lib/Test/t/todo.t
index 2f179e4547d..74f9aefb8b9 100644
--- a/gnu/usr.bin/perl/lib/Test/t/todo.t
+++ b/gnu/usr.bin/perl/lib/Test/t/todo.t
@@ -9,11 +9,11 @@ use Test qw(:DEFAULT $TESTOUT $TESTERR $ntest);
open F, ">todo";
$TESTOUT = *F{IO};
$TESTERR = *F{IO};
-
my $tests = 5;
plan tests => $tests, todo => [2..$tests];
-# line 11
+
+# tests to go to the output file
ok(1);
ok(1);
ok(0,1);
@@ -33,16 +33,23 @@ unlink "todo";
my $expect = <<"EXPECT";
1..5 todo 2 3 4 5;
ok 1
-ok 2 # ($0 at line 12 TODO?!)
+ok 2 # ($0 at line 18 TODO?!)
not ok 3
-# Test 3 got: '0' ($0 at line 13 *TODO*)
+# Test 3 got: '0' ($0 at line 19 *TODO*)
# Expected: '1'
not ok 4
-# Test 4 got: '0' ($0 at line 14 *TODO*)
+# Test 4 got: '0' ($0 at line 20 *TODO*)
# Expected: '1' (need more tuits)
-ok 5 # ($0 at line 15 TODO?!)
+ok 5 # ($0 at line 21 TODO?!)
EXPECT
+sub commentless {
+ my $in = $_[0];
+ $in =~ s/^#[^\n]*\n//mg;
+ $in =~ s/\n#[^\n]*$//mg;
+ return $in;
+}
+
print "1..1\n";
-ok( $out, $expect );
+ok( commentless($out), commentless($expect) );
diff --git a/gnu/usr.bin/perl/lib/Text/Abbrev.t b/gnu/usr.bin/perl/lib/Text/Abbrev.t
index fb5a9841eb1..38d4a39886d 100644
--- a/gnu/usr.bin/perl/lib/Text/Abbrev.t
+++ b/gnu/usr.bin/perl/lib/Text/Abbrev.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..7\n";
+print "1..8\n";
BEGIN {
chdir 't' if -d 't';
@@ -49,3 +49,11 @@ abbrev \%y, @z;
$s = join ':', sort keys %y;
print (($r eq $s)?"ok $test\n":"not ok $test\n"); $test++;
+
+
+# warnings safe with zero arguments
+my $notok;
+$^W = 1;
+$SIG{__WARN__} = sub { $notok++ };
+abbrev();
+print ($notok ? "not ok $test\n" : "ok $test\n"); $test++;
diff --git a/gnu/usr.bin/perl/lib/Text/Balanced.pm b/gnu/usr.bin/perl/lib/Text/Balanced.pm
index ee83e545dc8..820ae255a71 100644
--- a/gnu/usr.bin/perl/lib/Text/Balanced.pm
+++ b/gnu/usr.bin/perl/lib/Text/Balanced.pm
@@ -10,7 +10,7 @@ use Exporter;
use SelfLoader;
use vars qw { $VERSION @ISA %EXPORT_TAGS };
-$VERSION = '1.89';
+$VERSION = '1.95';
@ISA = qw ( Exporter );
%EXPORT_TAGS = ( ALL => [ qw(
@@ -30,15 +30,6 @@ $VERSION = '1.89';
Exporter::export_ok_tags('ALL');
-##
-## These shenanagins are to avoid using $& in perl5.6+
-##
-my $GetMatchedText = ($] < 5.006) ? eval 'sub { $& } '
- : eval 'sub {
- substr($_[0], $-[0], $+[0] - $-[0])
- }';
-
-
# PROTOTYPES
sub _match_bracketed($$$$$$);
@@ -337,8 +328,7 @@ sub _match_tagged # ($$$$$$$)
if (!defined $rdel)
{
- $rdelspec = &$GetMatchedText($$textref);
-
+ $rdelspec = $&;
unless ($rdelspec =~ s/\A([[(<{]+)($XMLNAME).*/ quotemeta "$1\/$2". revbracket($1) /oes)
{
_failmsg "Unable to construct closing tag to match: $rdel",
@@ -348,7 +338,16 @@ sub _match_tagged # ($$$$$$$)
}
else
{
- $rdelspec = eval "qq{$rdel}";
+ $rdelspec = eval "qq{$rdel}" || do {
+ my $del;
+ for (qw,~ ! ^ & * ) _ + - = } ] : " ; ' > . ? / | ',)
+ { next if $rdel =~ /\Q$_/; $del = $_; last }
+ unless ($del) {
+ use Carp;
+ croak "Can't interpolate right delimiter $rdel"
+ }
+ eval "qq$del$rdel$del";
+ };
}
while (pos($$textref) < length($$textref))
@@ -450,7 +449,7 @@ sub _match_variable($$)
return;
}
my $varpos = pos($$textref);
- unless ($$textref =~ m{\G\$\s*(\d+|[][&`'+*./|,";%=~:?!\@<>()-]|\^[a-z]?)}gci)
+ unless ($$textref =~ m{\G\$\s*(?!::)(\d+|[][&`'+*./|,";%=~:?!\@<>()-]|\^[a-z]?)}gci)
{
unless ($$textref =~ m/\G((\$#?|[*\@\%]|\\&)+)/gc)
{
@@ -472,6 +471,7 @@ sub _match_variable($$)
while (1)
{
+ next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc;
next if _match_codeblock($textref,
qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/,
qr/[({[]/, qr/[)}\]]/,
@@ -583,11 +583,13 @@ sub _match_codeblock($$$$$$$)
# NEED TO COVER MANY MORE CASES HERE!!!
- if ($$textref =~ m#\G\s*( [-+*x/%^&|.]=?
+ if ($$textref =~ m#\G\s*(?!$ldel_inner)
+ ( [-+*x/%^&|.]=?
| [!=]~
| =(?!>)
| (\*\*|&&|\|\||<<|>>)=?
| split|grep|map|return
+ | [([]
)#gcx)
{
$patvalid = 1;
@@ -717,7 +719,7 @@ sub _match_quotelike($$$$) # ($textref, $prepat, $allow_raw_match)
);
}
- unless ($$textref =~ m{\G((?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc)
+ unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc)
{
_failmsg q{No quotelike operator found after prefix at "} .
substr($$textref, pos($$textref), 20) .
@@ -908,7 +910,7 @@ sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunkno
FIELD: while (pos($$textref) < length($$textref))
{
- my $field;
+ my ($field, $rem);
my @bits;
foreach my $i ( 0..$#func )
{
@@ -917,12 +919,13 @@ sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunkno
$class = $class[$i];
$lastpos = pos $$textref;
if (ref($func) eq 'CODE')
- { ($field,undef,$pref) = @bits = $func->($$textref) }
+ { ($field,$rem,$pref) = @bits = $func->($$textref);
+ # print "[$field|$rem]" if $field;
+ }
elsif (ref($func) eq 'Text::Balanced::Extractor')
{ @bits = $field = $func->extract($$textref) }
elsif( $$textref =~ m/\G$func/gc )
- { @bits = $field = defined($1) ? $1 : &$GetMatchedText($$textref) }
- # substr() on previous line is "$&", without the pain
+ { @bits = $field = defined($1) ? $1 : $& }
$pref ||= "";
if (defined($field) && length($field))
{
@@ -1057,7 +1060,7 @@ Text::Balanced - Extract delimited text sequences from strings.
# Extract the initial substring of $text that is bounded by
- # an HTML/XML tag.
+ # an XML tag.
($extracted, $remainder) = extract_tagged($text);
@@ -1113,11 +1116,23 @@ Text::Balanced - Extract delimited text sequences from strings.
=head1 DESCRIPTION
-The various C<extract_...> subroutines may be used to extract a
-delimited string (possibly after skipping a specified prefix string).
-The search for the string always begins at the current C<pos>
-location of the string's variable (or at index zero, if no C<pos>
-position is defined).
+The various C<extract_...> subroutines may be used to
+extract a delimited substring, possibly after skipping a
+specified prefix string. By default, that prefix is
+optional whitespace (C</\s*/>), but you can change it to whatever
+you wish (see below).
+
+The substring to be extracted must appear at the
+current C<pos> location of the string's variable
+(or at index zero, if no C<pos> position is defined).
+In other words, the C<extract_...> subroutines I<don't>
+extract the first occurance of a substring anywhere
+in a string (like an unanchored regex would). Rather,
+they extract an occurance of the substring appearing
+immediately at the current matching position in the
+string (like a C<\G>-anchored regex would).
+
+
=head2 General behaviour in list contexts
@@ -1219,7 +1234,7 @@ pattern C<'\s*'> - optional whitespace - is used. If the delimiter set
is also not specified, the set C</["'`]/> is used. If the text to be processed
is not specified either, C<$_> is used.
-In list context, C<extract_delimited> returns an array of three
+In list context, C<extract_delimited> returns a array of three
elements, the extracted substring (I<including the surrounding
delimiters>), the remainder of the text, and the skipped prefix (if
any). If a suitable delimited substring is not found, the first
@@ -1375,6 +1390,58 @@ would correctly match something like this:
See also: C<"extract_quotelike"> and C<"extract_codeblock">.
+=head2 C<extract_variable>
+
+C<extract_variable> extracts any valid Perl variable or
+variable-involved expression, including scalars, arrays, hashes, array
+accesses, hash look-ups, method calls through objects, subroutine calles
+through subroutine references, etc.
+
+The subroutine takes up to two optional arguments:
+
+=over 4
+
+=item 1.
+
+A string to be processed (C<$_> if the string is omitted or C<undef>)
+
+=item 2.
+
+A string specifying a pattern to be matched as a prefix (which is to be
+skipped). If omitted, optional whitespace is skipped.
+
+=back
+
+On success in a list context, an array of 3 elements is returned. The
+elements are:
+
+=over 4
+
+=item [0]
+
+the extracted variable, or variablish expression
+
+=item [1]
+
+the remainder of the input text,
+
+=item [2]
+
+the prefix substring (if any),
+
+=back
+
+On failure, all of these values (except the remaining text) are C<undef>.
+
+In a scalar context, C<extract_variable> returns just the complete
+substring that matched a variablish expression. C<undef> is returned on
+failure. In addition, the original input text has the returned substring
+(and any prefix) removed from it.
+
+In a void context, the input text just has the matched substring (and
+any specified prefix) removed.
+
+
=head2 C<extract_tagged>
C<extract_tagged> extracts and segments text between (balanced)
@@ -1392,7 +1459,7 @@ A string to be processed (C<$_> if the string is omitted or C<undef>)
A string specifying a pattern to be matched as the opening tag.
If the pattern string is omitted (or C<undef>) then a pattern
-that matches any standard HTML/XML tag is used.
+that matches any standard XML tag is used.
=item 3.
@@ -1427,7 +1494,7 @@ that must I<not> appear within the tagged text.
For example, to extract
an HTML link (which should not contain nested links) use:
- extract_tagged($text, '<A>', '</A>', undef, {reject => ['<A>']} );
+ extract_tagged($text, '<A>', '</A>', undef, {reject => ['<A>']} );
=item C<ignore =E<gt> $listref>
@@ -1437,7 +1504,7 @@ that are I<not> be be treated as nested tags within the tagged text
For example, to extract an arbitrary XML tag, but ignore "empty" elements:
- extract_tagged($text, undef, undef, undef, {ignore => ['<[^>]*/>']} );
+ extract_tagged($text, undef, undef, undef, {ignore => ['<[^>]*/>']} );
(also see L<"gen_delimited_pat"> below).
@@ -1454,28 +1521,28 @@ C<extract_tagged> returns the complete text up to the point of failure.
If the string is "PARA", C<extract_tagged> returns only the first paragraph
after the tag (up to the first line that is either empty or contains
only whitespace characters).
-If the string is "", the default behaviour (i.e. failure) is reinstated.
+If the string is "", the the default behaviour (i.e. failure) is reinstated.
For example, suppose the start tag "/para" introduces a paragraph, which then
continues until the next "/endpara" tag or until another "/para" tag is
encountered:
- $text = "/para line 1\n\nline 3\n/para line 4";
+ $text = "/para line 1\n\nline 3\n/para line 4";
- extract_tagged($text, '/para', '/endpara', undef,
- {reject => '/para', fail => MAX );
+ extract_tagged($text, '/para', '/endpara', undef,
+ {reject => '/para', fail => MAX );
- # EXTRACTED: "/para line 1\n\nline 3\n"
+ # EXTRACTED: "/para line 1\n\nline 3\n"
Suppose instead, that if no matching "/endpara" tag is found, the "/para"
tag refers only to the immediately following paragraph:
- $text = "/para line 1\n\nline 3\n/para line 4";
+ $text = "/para line 1\n\nline 3\n/para line 4";
- extract_tagged($text, '/para', '/endpara', undef,
- {reject => '/para', fail => MAX );
+ extract_tagged($text, '/para', '/endpara', undef,
+ {reject => '/para', fail => MAX );
- # EXTRACTED: "/para line 1\n"
+ # EXTRACTED: "/para line 1\n"
Note that the specified C<fail> behaviour applies to nested tags as well.
@@ -1558,12 +1625,12 @@ be extracted from).
In other words, the implementation of C<extract_tagged> is exactly
equivalent to:
- sub extract_tagged
- {
- my $text = shift;
- $extractor = gen_extract_tagged(@_);
- return $extractor->($text);
- }
+ sub extract_tagged
+ {
+ my $text = shift;
+ $extractor = gen_extract_tagged(@_);
+ return $extractor->($text);
+ }
(although C<extract_tagged> is not currently implemented that way, in order
to preserve pre-5.005 compatibility).
@@ -1582,13 +1649,13 @@ L<perlop(3)>) Nested backslashed delimiters, embedded balanced bracket
delimiters (for the quotelike operators), and trailing modifiers are
all caught. For example, in:
- extract_quotelike 'q # an octothorpe: \# (not the end of the q!) #'
-
- extract_quotelike ' "You said, \"Use sed\"." '
+ extract_quotelike 'q # an octothorpe: \# (not the end of the q!) #'
+
+ extract_quotelike ' "You said, \"Use sed\"." '
- extract_quotelike ' s{([A-Z]{1,8}\.[A-Z]{3})} /\L$1\E/; '
+ extract_quotelike ' s{([A-Z]{1,8}\.[A-Z]{3})} /\L$1\E/; '
- extract_quotelike ' tr/\\\/\\\\/\\\//ds; '
+ extract_quotelike ' tr/\\\/\\\\/\\\//ds; '
the full Perl quotelike operations are all extracted correctly.
@@ -1596,17 +1663,17 @@ Note too that, when using the /x modifier on a regex, any comment
containing the current pattern delimiter will cause the regex to be
immediately terminated. In other words:
- 'm /
- (?i) # CASE INSENSITIVE
- [a-z_] # LEADING ALPHABETIC/UNDERSCORE
- [a-z0-9]* # FOLLOWED BY ANY NUMBER OF ALPHANUMERICS
- /x'
+ 'm /
+ (?i) # CASE INSENSITIVE
+ [a-z_] # LEADING ALPHABETIC/UNDERSCORE
+ [a-z0-9]* # FOLLOWED BY ANY NUMBER OF ALPHANUMERICS
+ /x'
will be extracted as if it were:
- 'm /
- (?i) # CASE INSENSITIVE
- [a-z_] # LEADING ALPHABETIC/'
+ 'm /
+ (?i) # CASE INSENSITIVE
+ [a-z_] # LEADING ALPHABETIC/'
This behaviour is identical to that of the actual compiler.
@@ -1653,7 +1720,7 @@ the right delimiter of the first block of the operation,
=item [7]
the left delimiter of the second block of the operation
-(that is, if it is an C<s>, C<tr>, or C<y>),
+(that is, if it is a C<s>, C<tr>, or C<y>),
=item [8]
@@ -1683,27 +1750,27 @@ prefix) removed.
Examples:
- # Remove the first quotelike literal that appears in text
+ # Remove the first quotelike literal that appears in text
- $quotelike = extract_quotelike($text,'.*?');
+ $quotelike = extract_quotelike($text,'.*?');
- # Replace one or more leading whitespace-separated quotelike
- # literals in $_ with "<QLL>"
+ # Replace one or more leading whitespace-separated quotelike
+ # literals in $_ with "<QLL>"
- do { $_ = join '<QLL>', (extract_quotelike)[2,1] } until $@;
+ do { $_ = join '<QLL>', (extract_quotelike)[2,1] } until $@;
- # Isolate the search pattern in a quotelike operation from $text
+ # Isolate the search pattern in a quotelike operation from $text
- ($op,$pat) = (extract_quotelike $text)[3,5];
- if ($op =~ /[ms]/)
- {
- print "search pattern: $pat\n";
- }
- else
- {
- print "$op is not a pattern matching operation\n";
- }
+ ($op,$pat) = (extract_quotelike $text)[3,5];
+ if ($op =~ /[ms]/)
+ {
+ print "search pattern: $pat\n";
+ }
+ else
+ {
+ print "$op is not a pattern matching operation\n";
+ }
=head2 C<extract_quotelike> and "here documents"
@@ -1718,7 +1785,7 @@ here document might look like this:
<<'EOMSG' || die;
This is the message.
EOMSG
- exit;
+ exit;
Given this as an input string in a scalar context, C<extract_quotelike>
would correctly return the string "<<'EOMSG'\nThis is the message.\nEOMSG",
@@ -1771,7 +1838,7 @@ However, the matching position of the input variable would be set to
which would cause the earlier " || die;\nexit;" to be skipped in any
sequence of code fragment extractions.
-To avoid this problem, when it encounters a here document while
+To avoid this problem, when it encounters a here document whilst
extracting from a modifiable string, C<extract_quotelike> silently
rearranges the string to an equivalent piece of Perl:
@@ -1779,7 +1846,7 @@ rearranges the string to an equivalent piece of Perl:
This is the message.
EOMSG
|| die;
- exit;
+ exit;
in which the here document I<is> contiguous. It still leaves the
matching position after the here document, but now the rest of the line
@@ -1811,7 +1878,7 @@ Omitting the third argument (prefix argument) implies optional whitespace at the
Omitting the fourth argument (outermost delimiter brackets) indicates that the
value of the second argument is to be used for the outermost delimiters.
-Once the prefix an the outermost opening delimiter bracket have been
+Once the prefix an dthe outermost opening delimiter bracket have been
recognized, code blocks are extracted by stepping through the input text and
trying the following alternatives in sequence:
@@ -1898,7 +1965,7 @@ extracted substring removed from it. In all contexts
C<extract_multiple> starts at the current C<pos> of the string, and
sets that C<pos> appropriately after it matches.
-Hence, the aim of a call to C<extract_multiple> in a list context
+Hence, the aim of of a call to C<extract_multiple> in a list context
is to split the processed string into as many non-overlapping fields as
possible, by repeatedly applying each of the specified extractors
to the remainder of the string. Thus C<extract_multiple> is
@@ -1930,7 +1997,7 @@ is used.
=item 3.
-A number specifying the maximum number of fields to return. If this
+An number specifying the maximum number of fields to return. If this
argument is omitted (or C<undef>), split continues as long as possible.
If the third argument is I<N>, then extraction continues until I<N> fields
@@ -1986,7 +2053,7 @@ If none of the extractor subroutines succeeds, then one
character is extracted from the start of the text and the extraction
subroutines reapplied. Characters which are thus removed are accumulated and
eventually become the next field (unless the fourth argument is true, in which
-case they are discarded).
+case they are disgarded).
For example, the following extracts substrings that are valid Perl variables:
diff --git a/gnu/usr.bin/perl/lib/Text/Balanced/Changes b/gnu/usr.bin/perl/lib/Text/Balanced/Changes
index 2b42f944028..c8c79fb487d 100644
--- a/gnu/usr.bin/perl/lib/Text/Balanced/Changes
+++ b/gnu/usr.bin/perl/lib/Text/Balanced/Changes
@@ -261,3 +261,41 @@ Revision history for Perl extension Text::Balanced.
1.89 Sun Nov 18 22:49:50 2001
- Fixed extvar.t tests
+
+
+1.90 Tue Mar 25 11:14:38 2003
+
+ - Fixed subtle bug in gen_extract_tagged (thanks Martin)
+
+ - Doc fix: removed suggestion that extract_tagged defaults
+ to matching HTML tags
+
+ - Doc fix: clarified general matching behaviour
+
+ - Fixed bug in parsing /.../ after a (
+
+ - Doc fix: documented extract_variable
+
+ - Fixed extract_variable handling of $h{qr}, $h{tr}, etc.
+ (thanks, Briac)
+
+ - Fixed incorrect handling of $::var (thanks Tim)
+
+
+1.91 Fri Mar 28 23:19:17 2003
+
+ - Fixed error count on t/extract_variable.t
+
+ - Fixed bug in extract_codelike when non-standard delimiters used
+
+
+1.94 Sun Apr 13 02:18:41 2003
+
+ - rereleased in attempt to fix CPAN problems
+
+
+1.95 Mon Apr 28 00:22:04 2003
+
+ - Constrainted _match_quote to only match at word boundaries
+ (so "exemplum(hic)" doesn't match "m(hic)")
+ (thanks Craig)
diff --git a/gnu/usr.bin/perl/lib/Text/Balanced/README b/gnu/usr.bin/perl/lib/Text/Balanced/README
index ef2f376fa43..032bb239190 100644
--- a/gnu/usr.bin/perl/lib/Text/Balanced/README
+++ b/gnu/usr.bin/perl/lib/Text/Balanced/README
@@ -1,5 +1,5 @@
==============================================================================
- Release of version 1.89 of Text::Balanced
+ Release of version 1.95 of Text::Balanced
==============================================================================
@@ -66,10 +66,12 @@ COPYRIGHT
==============================================================================
-CHANGES IN VERSION 1.89
+CHANGES IN VERSION 1.95
- - Fixed extvar.t tests
+ - Constrainted _match_quote to only match at word boundaries
+ (so "exemplum(hic)" doesn't match "m(hic)")
+ (thanks Craig)
==============================================================================
@@ -77,8 +79,5 @@ CHANGES IN VERSION 1.89
AVAILABILITY
Text::Balanced has been uploaded to the CPAN
-and is also available from:
-
- http://www.csse.monash.edu.au/~damian/CPAN/Text-Balanced.tar.gz
==============================================================================
diff --git a/gnu/usr.bin/perl/lib/Text/Balanced/t/extcbk.t b/gnu/usr.bin/perl/lib/Text/Balanced/t/extcbk.t
index 69957ed758b..47b004513bf 100644
--- a/gnu/usr.bin/perl/lib/Text/Balanced/t/extcbk.t
+++ b/gnu/usr.bin/perl/lib/Text/Balanced/t/extcbk.t
@@ -59,12 +59,12 @@ while (defined($str = <DATA>))
__DATA__
-# USING: extract_codeblock($str);
-{ $data[4] =~ /['"]/; };
-
# USING: extract_codeblock($str,'(){}',undef,'()');
(Foo(')'));
+# USING: extract_codeblock($str);
+{ $data[4] =~ /['"]/; };
+
# USING: extract_codeblock($str,'<>');
< %x = ( try => "this") >;
< %x = () >;
diff --git a/gnu/usr.bin/perl/lib/Text/Balanced/t/extvar.t b/gnu/usr.bin/perl/lib/Text/Balanced/t/extvar.t
index f8a46bb4faa..2bda381b60e 100644
--- a/gnu/usr.bin/perl/lib/Text/Balanced/t/extvar.t
+++ b/gnu/usr.bin/perl/lib/Text/Balanced/t/extvar.t
@@ -13,7 +13,7 @@ BEGIN {
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)
-BEGIN { $| = 1; print "1..181\n"; }
+BEGIN { $| = 1; print "1..183\n"; }
END {print "not ok 1\n" unless $loaded;}
use Text::Balanced qw ( extract_variable );
$loaded = 1;
@@ -65,6 +65,7 @@ $a->;
$a (1..3) { print $a };
# USING: extract_variable($str);
+$::obj;
$obj->nextval;
*var;
*$var;
diff --git a/gnu/usr.bin/perl/lib/Text/Balanced/t/gentag.t b/gnu/usr.bin/perl/lib/Text/Balanced/t/gentag.t
index ae94c545676..7b150a6ed5a 100644
--- a/gnu/usr.bin/perl/lib/Text/Balanced/t/gentag.t
+++ b/gnu/usr.bin/perl/lib/Text/Balanced/t/gentag.t
@@ -13,7 +13,7 @@ BEGIN {
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)
-BEGIN { $| = 1; print "1..35\n"; }
+BEGIN { $| = 1; print "1..37\n"; }
END {print "not ok 1\n" unless $loaded;}
use Text::Balanced qw ( gen_extract_tagged );
$loaded = 1;
@@ -65,6 +65,9 @@ while (defined($str = <DATA>))
__DATA__
+# USING: gen_extract_tagged('{','}');
+ { a test };
+
# USING: gen_extract_tagged(qr/<[A-Z]+>/,undef, undef, {ignore=>["<BR>"]});
<A>aaa<B>bbb<BR>ccc</B>ddd</A>;
diff --git a/gnu/usr.bin/perl/lib/Text/TabsWrap/t/wrap.t b/gnu/usr.bin/perl/lib/Text/TabsWrap/t/wrap.t
index fee6ce070d4..369512d27e5 100644
--- a/gnu/usr.bin/perl/lib/Text/TabsWrap/t/wrap.t
+++ b/gnu/usr.bin/perl/lib/Text/TabsWrap/t/wrap.t
@@ -122,7 +122,7 @@ DONE
$| = 1;
-print "1..", 1 +@tests, "\n";
+print "1..", 2 +@tests, "\n";
use Text::Wrap;
@@ -207,3 +207,9 @@ my $w = wrap('zzz','yyy',$tw);
print (($w eq "zzz$tw") ? "ok $tn\n" : "not ok $tn");
$tn++;
+{
+ local $Text::Wrap::columns = 10;
+ local $Text::Wrap::huge = "wrap";
+ print ((wrap("verylongindent", "", "foo") eq "verylongindent\nfoo") ? "ok $tn\n" : "not ok $tn");
+ $tn++;
+}
diff --git a/gnu/usr.bin/perl/lib/Thread/Semaphore.pm b/gnu/usr.bin/perl/lib/Thread/Semaphore.pm
index d3ebe637a70..1e188542de8 100644
--- a/gnu/usr.bin/perl/lib/Thread/Semaphore.pm
+++ b/gnu/usr.bin/perl/lib/Thread/Semaphore.pm
@@ -2,7 +2,7 @@ package Thread::Semaphore;
use threads::shared;
-our $VERSION = '2.00';
+our $VERSION = '2.01';
=head1 NAME
@@ -12,14 +12,14 @@ Thread::Semaphore - thread-safe semaphores
use Thread::Semaphore;
my $s = new Thread::Semaphore;
- $s->up; # Also known as the semaphore V -operation.
+ $s->down; # Also known as the semaphore P operation.
# The guarded section is here
- $s->down; # Also known as the semaphore P -operation.
+ $s->up; # Also known as the semaphore V operation.
# The default semaphore value is 1.
my $s = new Thread::Semaphore($initial_value);
+ $s->down($down_value);
$s->up($up_value);
- $s->down($up_value);
=head1 DESCRIPTION
@@ -29,7 +29,7 @@ control access to anything you care to use them for.
Semaphores don't limit their values to zero or one, so they can be used to
control access to some resource that there may be more than one of. (For
-example, filehandles). Increment and decrement amounts aren't fixed at one
+example, filehandles.) Increment and decrement amounts aren't fixed at one
either, so threads can reserve or return multiple resources at once.
=head1 FUNCTIONS AND METHODS
@@ -53,6 +53,10 @@ below zero, this method will block until such time that the semaphore's
count is equal to or larger than the amount you're C<down>ing the
semaphore's count by.
+This is the semaphore "P operation" (the name derives from the Dutch
+word "pak", which means "capture" -- the semaphore operations were
+named by the late Dijkstra, who was Dutch).
+
=item up
=item up NUMBER
@@ -62,6 +66,9 @@ or by one if no number has been specified. This will unblock any thread blocked
trying to C<down> the semaphore if the C<up> raises the semaphore count
above the amount that the C<down>s are trying to decrement it by.
+This is the semaphore "V operation" (the name derives from the Dutch
+word "vrij", which means "release").
+
=back
=cut
diff --git a/gnu/usr.bin/perl/lib/Tie/Array.pm b/gnu/usr.bin/perl/lib/Tie/Array.pm
index 6fdd258953c..af8f51e9f51 100644
--- a/gnu/usr.bin/perl/lib/Tie/Array.pm
+++ b/gnu/usr.bin/perl/lib/Tie/Array.pm
@@ -3,7 +3,7 @@ package Tie::Array;
use 5.006_001;
use strict;
use Carp;
-our $VERSION = '1.02';
+our $VERSION = '1.03';
# Pod documentation after __END__ below.
@@ -74,12 +74,12 @@ sub SPLICE {
sub EXISTS {
my $pkg = ref $_[0];
- croak "$pkg dosn't define an EXISTS method";
+ croak "$pkg doesn't define an EXISTS method";
}
sub DELETE {
my $pkg = ref $_[0];
- croak "$pkg dosn't define a DELETE method";
+ croak "$pkg doesn't define a DELETE method";
}
package Tie::StdArray;
diff --git a/gnu/usr.bin/perl/lib/Tie/File.pm b/gnu/usr.bin/perl/lib/Tie/File.pm
index 637d6cf8ca6..a1f40afe199 100644
--- a/gnu/usr.bin/perl/lib/Tie/File.pm
+++ b/gnu/usr.bin/perl/lib/Tie/File.pm
@@ -1,18 +1,20 @@
package Tie::File;
require 5.005;
-use Carp;
+use Carp ':DEFAULT', 'confess';
use POSIX 'SEEK_SET';
-use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'O_WRONLY', 'O_RDONLY';
+use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY';
sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY }
-$VERSION = "0.93";
+
+$VERSION = "0.97";
my $DEFAULT_MEMORY_SIZE = 1<<21; # 2 megabytes
my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records
my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful
-my %good_opt = map {$_ => 1, "-$_" => 1}
- qw(memory dw_size mode recsep discipline autodefer autochomp);
+my %good_opt = map {$_ => 1, "-$_" => 1}
+ qw(memory dw_size mode recsep discipline
+ autodefer autochomp autodefer_threshhold concurrent);
sub TIEARRAY {
if (@_ % 2 != 0) {
@@ -31,11 +33,15 @@ sub TIEARRAY {
}
}
+ if ($opts{concurrent}) {
+ croak("$pack: concurrent access not supported yet\n");
+ }
+
unless (defined $opts{memory}) {
# default is the larger of the default cache size and the
# deferred-write buffer size (if specified)
$opts{memory} = $DEFAULT_MEMORY_SIZE;
- $opts{memory} = $opts{dw_size}
+ $opts{memory} = $opts{dw_size}
if defined $opts{dw_size} && $opts{dw_size} > $DEFAULT_MEMORY_SIZE;
# Dora Winifred Read
}
@@ -49,9 +55,8 @@ sub TIEARRAY {
$opts{deferred_s} = 0; # count of total bytes in ->{deferred}
$opts{deferred_max} = -1; # empty
- # the cache is a hash instead of an array because it is likely to be
- # sparsely populated
- $opts{cache} = Tie::File::Cache->new($opts{memory});
+ # What's a good way to arrange that this class can be overridden?
+ $opts{cache} = Tie::File::Cache->new($opts{memory});
# autodeferment is enabled by default
$opts{autodefer} = 1 unless defined $opts{autodefer};
@@ -93,9 +98,15 @@ sub TIEARRAY {
} elsif (ref $file) {
croak "usage: tie \@array, $pack, filename, [option => value]...";
} else {
- $fh = \do { local *FH }; # only works in 5.005 and later
+ # $fh = \do { local *FH }; # XXX this is buggy
+ if ($] < 5.006) {
+ # perl 5.005 and earlier don't autovivify filehandles
+ require Symbol;
+ $fh = Symbol::gensym();
+ }
sysopen $fh, $file, $opts{mode}, 0666 or return;
binmode $fh;
+ ++$opts{ourfh};
}
{ my $ofh = select $fh; $| = 1; select $ofh } # autoflush on write
if (defined $opts{discipline} && $] >= 5.006) {
@@ -114,13 +125,13 @@ sub FETCH {
my $rec;
# check the defer buffer
- if ($self->_is_deferring && exists $self->{deferred}{$n}) {
- $rec = $self->{deferred}{$n};
- } else {
- $rec = $self->_fetch($n);
- }
+ $rec = $self->{deferred}{$n} if exists $self->{deferred}{$n};
+ $rec = $self->_fetch($n) unless defined $rec;
- $self->_chomp1($rec);
+ # inlined _chomp1
+ substr($rec, - $self->{recseplen}) = ""
+ if defined $rec && $self->{autochomp};
+ $rec;
}
# Chomp many records in-place; return nothing useful
@@ -153,7 +164,7 @@ sub _fetch {
}
if ($#{$self->{offsets}} < $n) {
- return if $self->{eof};
+ return if $self->{eof}; # request for record beyond end of file
my $o = $self->_fill_offsets_to($n);
# If it's still undefined, there is no such record, so return 'undef'
return unless defined $o;
@@ -198,26 +209,18 @@ sub STORE {
# 20020324 Wait, but this DOES alter the cache. TODO BUG?
my $oldrec = $self->_fetch($n);
- if (defined($self->{cache}->lookup($n))) {
- $self->{cache}->update($n, $rec);
- }
-
if (not defined $oldrec) {
# We're storing a record beyond the end of the file
$self->_extend_file_to($n+1);
$oldrec = $self->{recsep};
}
+# return if $oldrec eq $rec; # don't bother
my $len_diff = length($rec) - length($oldrec);
# length($oldrec) here is not consistent with text mode TODO XXX BUG
- $self->_twrite($rec, $self->{offsets}[$n], length($oldrec));
-
- # now update the offsets
- # array slice goes from element $n+1 (the first one to move)
- # to the end
- for (@{$self->{offsets}}[$n+1 .. $#{$self->{offsets}}]) {
- $_ += $len_diff;
- }
+ $self->_mtwrite($rec, $self->{offsets}[$n], length($oldrec));
+ $self->_oadjust([$n, 1, $rec]);
+ $self->{cache}->update($n, $rec);
}
sub _store_deferred {
@@ -259,13 +262,8 @@ sub _delete_deferred {
sub FETCHSIZE {
my $self = shift;
- my $n = $#{$self->{offsets}};
- # 20020317 Change this to binary search
- unless ($self->{eof}) {
- while (defined ($self->_fill_offsets_to($n+1))) {
- ++$n;
- }
- }
+ my $n = $self->{eof} ? $#{$self->{offsets}} : $self->_fill_offsets;
+
my $top_deferred = $self->_defer_max;
$n = $top_deferred+1 if defined $top_deferred && $n < $top_deferred+1;
$n;
@@ -310,10 +308,15 @@ sub STORESIZE {
$self->{cache}->remove(grep $_ >= $len, $self->{cache}->ckeys);
}
+### OPTIMIZE ME
+### It should not be necessary to do FETCHSIZE
+### Just seek to the end of the file.
sub PUSH {
my $self = shift;
$self->SPLICE($self->FETCHSIZE, scalar(@_), @_);
-# $self->FETCHSIZE; # av.c takes care of this for me
+
+ # No need to return:
+ # $self->FETCHSIZE; # because av.c takes care of this for me
}
sub POP {
@@ -391,7 +394,6 @@ sub DELETE {
sub EXISTS {
my ($self, $n) = @_;
return 1 if exists $self->{deferred}{$n};
- $self->_fill_offsets_to($n); # I think this is unnecessary
$n < $self->FETCHSIZE;
}
@@ -415,6 +417,10 @@ sub DESTROY {
my $self = shift;
$self->flush if $self->_is_deferring;
$self->{cache}->delink if defined $self->{cache}; # break circular link
+ if ($self->{fh} and $self->{ourfh}) {
+ delete $self->{ourfh};
+ close delete $self->{fh};
+ }
}
sub _splice {
@@ -447,6 +453,12 @@ sub _splice {
$nrecs = $oldsize - $pos + $nrecs;
$nrecs = 0 if $nrecs < 0;
}
+
+ # nrecs is too big---it really means "until the end"
+ # 20030507
+ if ($nrecs + $pos > $oldsize) {
+ $nrecs = $oldsize - $pos;
+ }
}
$self->_fixrecs(@data);
@@ -470,76 +482,52 @@ sub _splice {
$oldlen += $self->{offsets}[$_+1] - $self->{offsets}[$_]
if defined $self->{offsets}[$_+1];
}
+ $self->_fill_offsets_to($pos+$nrecs);
# Modify the file
- $self->_twrite($data, $self->{offsets}[$pos], $oldlen);
-
- # update the offsets table part 1
- # compute the offsets of the new records:
- my @new_offsets;
- if (@data) {
- push @new_offsets, $self->{offsets}[$pos];
- for (0 .. $#data-1) {
- push @new_offsets, $new_offsets[-1] + length($data[$_]);
+ $self->_mtwrite($data, $self->{offsets}[$pos], $oldlen);
+ # Adjust the offsets table
+ $self->_oadjust([$pos, $nrecs, @data]);
+
+ { # Take this read cache stuff out into a separate function
+ # You made a half-attempt to put it into _oadjust.
+ # Finish something like that up eventually.
+ # STORE also needs to do something similarish
+
+ # update the read cache, part 1
+ # modified records
+ for ($pos .. $pos+$nrecs-1) {
+ my $new = $data[$_-$pos];
+ if (defined $new) {
+ $self->{cache}->update($_, $new);
+ } else {
+ $self->{cache}->remove($_);
+ }
}
- }
-
- # If we're about to splice out the end of the offsets table...
- if ($pos + $nrecs >= @{$self->{offsets}}) {
- $self->{eof} = 0; # ... the table is no longer complete
- }
- splice(@{$self->{offsets}}, $pos, $nrecs, @new_offsets);
-
- # update the offsets table part 2
- # adjust the offsets of the following old records
- for ($pos+@data .. $#{$self->{offsets}}) {
- $self->{offsets}[$_] += $datalen - $oldlen;
- }
- # If we scrubbed out all known offsets, regenerate the trivial table
- # that knows that the file does indeed start at 0.
- $self->{offsets}[0] = 0 unless @{$self->{offsets}};
- # If the file got longer, the offsets table is no longer complete
- $self->{eof} = 0 if @data > $nrecs;
-
-
- # Perhaps the following cache foolery could be factored out
- # into a bunch of mor opaque cache functions. For example,
- # it's odd to delete a record from the cache and then remove
- # it from the LRU queue later on; there should be a function to
- # do both at once.
-
- # update the read cache, part 1
- # modified records
- for ($pos .. $pos+$nrecs-1) {
- my $new = $data[$_-$pos];
- if (defined $new) {
- $self->{cache}->update($_, $new);
- } else {
- $self->{cache}->remove($_);
+
+ # update the read cache, part 2
+ # moved records - records past the site of the change
+ # need to be renumbered
+ # Maybe merge this with the previous block?
+ {
+ my @oldkeys = grep $_ >= $pos + $nrecs, $self->{cache}->ckeys;
+ my @newkeys = map $_-$nrecs+@data, @oldkeys;
+ $self->{cache}->rekey(\@oldkeys, \@newkeys);
}
- }
- # update the read cache, part 2
- # moved records - records past the site of the change
- # need to be renumbered
- # Maybe merge this with the previous block?
- {
- my @oldkeys = grep $_ >= $pos + $nrecs, $self->{cache}->ckeys;
- my @newkeys = map $_-$nrecs+@data, @oldkeys;
- $self->{cache}->rekey(\@oldkeys, \@newkeys);
+ # Now there might be too much data in the cache, if we spliced out
+ # some short records and spliced in some long ones. If so, flush
+ # the cache.
+ $self->_cache_flush;
}
- # Now there might be too much data in the cache, if we spliced out
- # some short records and spliced in some long ones. If so, flush
- # the cache.
- $self->_cache_flush;
-
# Yes, the return value of 'splice' *is* actually this complicated
wantarray ? @result : @result ? $result[-1] : undef;
}
+
# write data into the file
-# $data is the data to be written.
+# $data is the data to be written.
# it should be written at position $pos, and should overwrite
# exactly $len of the following bytes.
# Note that if length($data) > $len, the subsequent bytes will have to
@@ -582,7 +570,7 @@ sub _twrite {
$readpos += $br;
$writepos += length $data;
$data = $next_block;
- } while $more_data; # BUG XXX TODO how could this have worked?
+ } while $more_data;
$self->_seekb($writepos);
$self->_write_record($next_block);
@@ -590,6 +578,241 @@ sub _twrite {
$self->_chop_file if $len_diff < 0;
}
+# _iwrite(D, S, E)
+# Insert text D at position S.
+# Let C = E-S-|D|. If C < 0; die.
+# Data in [S,S+C) is copied to [S+D,S+D+C) = [S+D,E).
+# Data in [S+C = E-D, E) is returned. Data in [E, oo) is untouched.
+#
+# In a later version, don't read the entire intervening area into
+# memory at once; do the copying block by block.
+sub _iwrite {
+ my $self = shift;
+ my ($D, $s, $e) = @_;
+ my $d = length $D;
+ my $c = $e-$s-$d;
+ local *FH = $self->{fh};
+ confess "Not enough space to insert $d bytes between $s and $e"
+ if $c < 0;
+ confess "[$s,$e) is an invalid insertion range" if $e < $s;
+
+ $self->_seekb($s);
+ read FH, my $buf, $e-$s;
+
+ $D .= substr($buf, 0, $c, "");
+
+ $self->_seekb($s);
+ $self->_write_record($D);
+
+ return $buf;
+}
+
+# Like _twrite, but the data-pos-len triple may be repeated; you may
+# write several chunks. All the writing will be done in
+# one pass. Chunks SHALL be in ascending order and SHALL NOT overlap.
+sub _mtwrite {
+ my $self = shift;
+ my $unwritten = "";
+ my $delta = 0;
+
+ @_ % 3 == 0
+ or die "Arguments to _mtwrite did not come in groups of three";
+
+ while (@_) {
+ my ($data, $pos, $len) = splice @_, 0, 3;
+ my $end = $pos + $len; # The OLD end of the segment to be replaced
+ $data = $unwritten . $data;
+ $delta -= length($unwritten);
+ $unwritten = "";
+ $pos += $delta; # This is where the data goes now
+ my $dlen = length $data;
+ $self->_seekb($pos);
+ if ($len >= $dlen) { # the data will fit
+ $self->_write_record($data);
+ $delta += ($dlen - $len); # everything following moves down by this much
+ $data = ""; # All the data in the buffer has been written
+ } else { # won't fit
+ my $writable = substr($data, 0, $len - $delta, "");
+ $self->_write_record($writable);
+ $delta += ($dlen - $len); # everything following moves down by this much
+ }
+
+ # At this point we've written some but maybe not all of the data.
+ # There might be a gap to close up, or $data might still contain a
+ # bunch of unwritten data that didn't fit.
+ my $ndlen = length $data;
+ if ($delta == 0) {
+ $self->_write_record($data);
+ } elsif ($delta < 0) {
+ # upcopy (close up gap)
+ if (@_) {
+ $self->_upcopy($end, $end + $delta, $_[1] - $end);
+ } else {
+ $self->_upcopy($end, $end + $delta);
+ }
+ } else {
+ # downcopy (insert data that didn't fit; replace this data in memory
+ # with _later_ data that doesn't fit)
+ if (@_) {
+ $unwritten = $self->_downcopy($data, $end, $_[1] - $end);
+ } else {
+ # Make the file longer to accomodate the last segment that doesn'
+ $unwritten = $self->_downcopy($data, $end);
+ }
+ }
+ }
+}
+
+# Copy block of data of length $len from position $spos to position $dpos
+# $dpos must be <= $spos
+#
+# If $len is undefined, go all the way to the end of the file
+# and then truncate it ($spos - $dpos bytes will be removed)
+sub _upcopy {
+ my $blocksize = 8192;
+ my ($self, $spos, $dpos, $len) = @_;
+ if ($dpos > $spos) {
+ die "source ($spos) was upstream of destination ($dpos) in _upcopy";
+ } elsif ($dpos == $spos) {
+ return;
+ }
+
+ while (! defined ($len) || $len > 0) {
+ my $readsize = ! defined($len) ? $blocksize
+ : $len > $blocksize ? $blocksize
+ : $len;
+
+ my $fh = $self->{fh};
+ $self->_seekb($spos);
+ my $bytes_read = read $fh, my($data), $readsize;
+ $self->_seekb($dpos);
+ if ($data eq "") {
+ $self->_chop_file;
+ last;
+ }
+ $self->_write_record($data);
+ $spos += $bytes_read;
+ $dpos += $bytes_read;
+ $len -= $bytes_read if defined $len;
+ }
+}
+
+# Write $data into a block of length $len at position $pos,
+# moving everything in the block forwards to make room.
+# Instead of writing the last length($data) bytes from the block
+# (because there isn't room for them any longer) return them.
+#
+# Undefined $len means 'until the end of the file'
+sub _downcopy {
+ my $blocksize = 8192;
+ my ($self, $data, $pos, $len) = @_;
+ my $fh = $self->{fh};
+
+ while (! defined $len || $len > 0) {
+ my $readsize = ! defined($len) ? $blocksize
+ : $len > $blocksize? $blocksize : $len;
+ $self->_seekb($pos);
+ read $fh, my($old), $readsize;
+ my $last_read_was_short = length($old) < $readsize;
+ $data .= $old;
+ my $writable;
+ if ($last_read_was_short) {
+ # If last read was short, then $data now contains the entire rest
+ # of the file, so there's no need to write only one block of it
+ $writable = $data;
+ $data = "";
+ } else {
+ $writable = substr($data, 0, $readsize, "");
+ }
+ last if $writable eq "";
+ $self->_seekb($pos);
+ $self->_write_record($writable);
+ last if $last_read_was_short && $data eq "";
+ $len -= $readsize if defined $len;
+ $pos += $readsize;
+ }
+ return $data;
+}
+
+# Adjust the object data structures following an '_mtwrite'
+# Arguments are
+# [$pos, $nrecs, @length] items
+# indicating that $nrecs records were removed at $recpos (a record offset)
+# and replaced with records of length @length...
+# Arguments guarantee that $recpos is strictly increasing.
+# No return value
+sub _oadjust {
+ my $self = shift;
+ my $delta = 0;
+ my $delta_recs = 0;
+ my $prev_end = -1;
+ my %newkeys;
+
+ for (@_) {
+ my ($pos, $nrecs, @data) = @$_;
+ $pos += $delta_recs;
+
+ # Adjust the offsets of the records after the previous batch up
+ # to the first new one of this batch
+ for my $i ($prev_end+2 .. $pos - 1) {
+ $self->{offsets}[$i] += $delta;
+ $newkey{$i} = $i + $delta_recs;
+ }
+
+ $prev_end = $pos + @data - 1; # last record moved on this pass
+
+ # Remove the offsets for the removed records;
+ # replace with the offsets for the inserted records
+ my @newoff = ($self->{offsets}[$pos] + $delta);
+ for my $i (0 .. $#data) {
+ my $newlen = length $data[$i];
+ push @newoff, $newoff[$i] + $newlen;
+ $delta += $newlen;
+ }
+
+ for my $i ($pos .. $pos+$nrecs-1) {
+ last if $i+1 > $#{$self->{offsets}};
+ my $oldlen = $self->{offsets}[$i+1] - $self->{offsets}[$i];
+ $delta -= $oldlen;
+ }
+
+# # also this data has changed, so update it in the cache
+# for (0 .. $#data) {
+# $self->{cache}->update($pos + $_, $data[$_]);
+# }
+# if ($delta_recs) {
+# my @oldkeys = grep $_ >= $pos + @data, $self->{cache}->ckeys;
+# my @newkeys = map $_ + $delta_recs, @oldkeys;
+# $self->{cache}->rekey(\@oldkeys, \@newkeys);
+# }
+
+ # replace old offsets with new
+ splice @{$self->{offsets}}, $pos, $nrecs+1, @newoff;
+ # What if we just spliced out the end of the offsets table?
+ # shouldn't we clear $self->{eof}? Test for this XXX BUG TODO
+
+ $delta_recs += @data - $nrecs; # net change in total number of records
+ }
+
+ # The trailing records at the very end of the file
+ if ($delta) {
+ for my $i ($prev_end+2 .. $#{$self->{offsets}}) {
+ $self->{offsets}[$i] += $delta;
+ }
+ }
+
+ # If we scrubbed out all known offsets, regenerate the trivial table
+ # that knows that the file does indeed start at 0.
+ $self->{offsets}[0] = 0 unless @{$self->{offsets}};
+ # If the file got longer, the offsets table is no longer complete
+ # $self->{eof} = 0 if $delta_recs > 0;
+
+ # Now there might be too much data in the cache, if we spliced out
+ # some short records and spliced in some long ones. If so, flush
+ # the cache.
+ $self->_cache_flush;
+}
+
# If a record does not already end with the appropriate terminator
# string, append one.
sub _fixrecs {
@@ -620,9 +843,10 @@ sub _seek {
defined($o)
or confess("logic error: undefined offset for record $n");
seek $self->{fh}, $o, SEEK_SET
- or die "Couldn't seek filehandle: $!"; # "Should never happen."
+ or confess "Couldn't seek filehandle: $!"; # "Should never happen."
}
+# seek to byte $b in the file
sub _seekb {
my ($self, $b) = @_;
seek $self->{fh}, $b, SEEK_SET
@@ -641,11 +865,10 @@ sub _fill_offsets_to {
my $rec;
until ($#OFF >= $n) {
- my $o = $OFF[-1];
$self->_seek(-1); # tricky -- see comment at _seek
$rec = $self->_read_record;
if (defined $rec) {
- push @OFF, tell $fh;
+ push @OFF, int(tell $fh); # Tels says that int() saves memory here
} else {
$self->{eof} = 1;
return; # It turns out there is no such record
@@ -654,7 +877,26 @@ sub _fill_offsets_to {
# we have now read all the records up to record n-1,
# so we can return the offset of record n
- return $OFF[$n];
+ $OFF[$n];
+}
+
+sub _fill_offsets {
+ my ($self) = @_;
+
+ my $fh = $self->{fh};
+ local *OFF = $self->{offsets};
+
+ $self->_seek(-1); # tricky -- see comment at _seek
+
+ # Tels says that inlining read_record() would make this loop
+ # five times faster. 20030508
+ while ( defined $self->_read_record()) {
+ # int() saves us memory here
+ push @OFF, int(tell $fh);
+ }
+
+ $self->{eof} = 1;
+ $#OFF;
}
# assumes that $rec is already suitably terminated
@@ -675,8 +917,7 @@ sub _read_record {
$rec = <$fh>;
}
return unless defined $rec;
- if (! $self->{sawlastrec} &&
- substr($rec, -$self->{recseplen}) ne $self->{recsep}) {
+ if (substr($rec, -$self->{recseplen}) ne $self->{recsep}) {
# improperly terminated final record --- quietly fix it.
# my $ac = substr($rec, -$self->{recseplen});
# $ac =~ s/\n/\\n/g;
@@ -735,7 +976,7 @@ sub _extend_file_to {
# Todo : just use $self->{recsep} x $extras here?
while ($extras-- > 0) {
$self->_write_record($self->{recsep});
- push @{$self->{offsets}}, tell $self->{fh};
+ push @{$self->{offsets}}, int(tell $self->{fh});
}
}
@@ -752,7 +993,7 @@ sub _chop_file {
# The result should be at least $n.
sub _bufsize {
my $n = shift;
- return 8192 if $n < 0;
+ return 8192 if $n <= 0;
my $b = $n & ~8191;
$b += 8192 if $n & 8191;
$b;
@@ -772,7 +1013,18 @@ sub flock {
}
my $fh = $self->{fh};
$op = LOCK_EX unless defined $op;
- flock $fh, $op;
+ my $locked = flock $fh, $op;
+
+ if ($locked && ($op & (LOCK_EX | LOCK_SH))) {
+ # If you're locking the file, then presumably it's because
+ # there might have been a write access by another process.
+ # In that case, the read cache contents and the offsets table
+ # might be invalid, so discard them. 20030508
+ $self->{offsets} = [0];
+ $self->{cache}->empty;
+ }
+
+ $locked;
}
# Get/set autochomp option
@@ -787,6 +1039,25 @@ sub autochomp {
}
}
+# Get offset table entries; returns offset of nth record
+sub offset {
+ my ($self, $n) = @_;
+
+ if ($#{$self->{offsets}} < $n) {
+ return if $self->{eof}; # request for record beyond the end of file
+ my $o = $self->_fill_offsets_to($n);
+ # If it's still undefined, there is no such record, so return 'undef'
+ return unless defined $o;
+ }
+
+ $self->{offsets}[$n];
+}
+
+sub discard_offsets {
+ my $self = shift;
+ $self->{offsets} = [0];
+}
+
################################################################
#
# Matters related to deferred writing
@@ -804,7 +1075,7 @@ sub defer {
#
# This could be better optimized to write the file in one pass, instead
# of one pass per block of records. But that will require modifications
-# to _twrite, so I should have a good _twite test suite first.
+# to _twrite, so I should have a good _twrite test suite first.
sub flush {
my $self = shift;
@@ -812,10 +1083,10 @@ sub flush {
$self->{defer} = 0;
}
-sub _flush {
+sub _old_flush {
my $self = shift;
my @writable = sort {$a<=>$b} (keys %{$self->{deferred}});
-
+
while (@writable) {
# gather all consecutive records from the front of @writable
my $first_rec = shift @writable;
@@ -831,6 +1102,40 @@ sub _flush {
$self->_discard; # clear out defered-write-cache
}
+sub _flush {
+ my $self = shift;
+ my @writable = sort {$a<=>$b} (keys %{$self->{deferred}});
+ my @args;
+ my @adjust;
+
+ while (@writable) {
+ # gather all consecutive records from the front of @writable
+ my $first_rec = shift @writable;
+ my $last_rec = $first_rec+1;
+ ++$last_rec, shift @writable while @writable && $last_rec == $writable[0];
+ --$last_rec;
+ my $end = $self->_fill_offsets_to($last_rec+1);
+ if (not defined $end) {
+ $self->_extend_file_to($last_rec);
+ $end = $self->{offsets}[$last_rec];
+ }
+ my ($start) = $self->{offsets}[$first_rec];
+ push @args,
+ join("", @{$self->{deferred}}{$first_rec .. $last_rec}), # data
+ $start, # position
+ $end-$start; # length
+ push @adjust, [$first_rec, # starting at this position...
+ $last_rec-$first_rec+1, # this many records...
+ # are replaced with these...
+ @{$self->{deferred}}{$first_rec .. $last_rec},
+ ];
+ }
+
+ $self->_mtwrite(@args); # write multiple record groups
+ $self->_discard; # clear out defered-write-cache
+ $self->_oadjust(@adjust);
+}
+
# Discard deferred writes and disable future deferred writes
sub discard {
my $self = shift;
@@ -940,7 +1245,7 @@ sub _annotate_ad_history {
}
}
-# If autodferring was enabled, cut it out and discard the history
+# If autodeferring was enabled, cut it out and discard the history
sub _stop_autodeferring {
my $self = shift;
if ($self->{autodeferring}) {
@@ -1150,6 +1455,9 @@ sub HEAP () { 0 }
sub HASH () { 1 }
sub MAX () { 2 }
sub BYTES() { 3 }
+#sub STAT () { 4 } # Array with request statistics for each record
+#sub MISS () { 5 } # Total number of cache misses
+#sub REQ () { 6 } # Total number of cache requests
use strict 'vars';
sub new {
@@ -1183,7 +1491,7 @@ sub _heap_move {
if (defined $n) {
$self->[HASH]{$k} = $n;
} else {
- delete $self->[HASH]{$k};
+ delete $self->[HASH]{$k};
}
}
@@ -1196,6 +1504,12 @@ sub insert {
}
confess "undefined val" unless defined $val;
return if length($val) > $self->[MAX];
+
+# if ($self->[STAT]) {
+# $self->[STAT][$key] = 1;
+# return;
+# }
+
my $oldnode = $self->[HASH]{$key};
if (defined $oldnode) {
my $oldval = $self->[HEAP]->set_val($oldnode, $val);
@@ -1204,7 +1518,7 @@ sub insert {
$self->[HEAP]->insert($key, $val);
}
$self->[BYTES] += length($val);
- $self->flush;
+ $self->flush if $self->[BYTES] > $self->[MAX];
}
sub expire {
@@ -1218,6 +1532,14 @@ sub expire {
sub remove {
my ($self, @keys) = @_;
my @result;
+
+# if ($self->[STAT]) {
+# for my $key (@keys) {
+# $self->[STAT][$key] = 0;
+# }
+# return;
+# }
+
for my $key (@keys) {
next unless exists $self->[HASH]{$key};
my $old_data = $self->[HEAP]->remove($self->[HASH]{$key});
@@ -1231,6 +1553,15 @@ sub lookup {
my ($self, $key) = @_;
local *_;
croak "missing argument to ->lookup" unless defined $key;
+
+# if ($self->[STAT]) {
+# $self->[MISS]++ if $self->[STAT][$key]++ == 0;
+# $self->[REQ]++;
+# my $hit_rate = 1 - $self->[MISS] / $self->[REQ];
+# # Do some testing to determine this threshhold
+# $#$self = STAT - 1 if $hit_rate > 0.20;
+# }
+
if (exists $self->[HASH]{$key}) {
$self->[HEAP]->lookup($self->[HASH]{$key});
} else {
@@ -1257,6 +1588,9 @@ sub empty {
%{$self->[HASH]} = ();
$self->[BYTES] = 0;
$self->[HEAP]->empty;
+# @{$self->[STAT]} = ();
+# $self->[MISS] = 0;
+# $self->[REQ] = 0;
}
sub is_empty {
@@ -1269,7 +1603,7 @@ sub update {
local *_;
croak "missing argument to ->update" unless defined $key;
if (length($val) > $self->[MAX]) {
- my $oldval = $self->remove($key);
+ my ($oldval) = $self->remove($key);
$self->[BYTES] -= length($oldval) if defined $oldval;
} elsif (exists $self->[HASH]{$key}) {
my $oldval = $self->[HEAP]->set_val($self->[HASH]{$key}, $val);
@@ -1307,23 +1641,29 @@ sub ckeys {
@a;
}
+# Return total amount of cached data
sub bytes {
my $self = shift;
$self->[BYTES];
}
+# Expire oldest item from cache until cache size is smaller than $max
sub reduce_size_to {
my ($self, $max) = @_;
- until ($self->is_empty || $self->[BYTES] <= $max) {
- $self->expire;
+ until ($self->[BYTES] <= $max) {
+ # Note that Tie::File::Cache::expire has been inlined here
+ my $old_data = $self->[HEAP]->popheap;
+ return unless defined $old_data;
+ $self->[BYTES] -= length $old_data;
}
}
+# Why not just $self->reduce_size_to($self->[MAX])?
+# Try this when things stabilize TODO XXX
+# If the cache is too full, expire the oldest records
sub flush {
my $self = shift;
- until ($self->is_empty || $self->[BYTES] <= $self->[MAX]) {
- $self->expire;
- }
+ $self->reduce_size_to($self->[MAX]) if $self->[BYTES] > $self->[MAX];
}
# For internal use only
@@ -1502,7 +1842,7 @@ sub _insert {
# Remove the item at node $i from the heap, moving child items upwards.
# The item with the smallest sequence number is always at the top.
# Moving items upwards maintains this condition.
-# Return the removed item.
+# Return the removed item. Return undef if there was no item at node $i.
sub remove {
my ($self, $i) = @_;
$i = 1 unless defined $i;
@@ -1661,13 +2001,16 @@ sub _nodes {
"Cogito, ergo sum."; # don't forget to return a true value from the file
+__END__
+
=head1 NAME
Tie::File - Access the lines of a disk file via a Perl array
=head1 SYNOPSIS
- # This file documents Tie::File version 0.93
+ # This file documents Tie::File version 0.97
+ use Tie::File;
tie @array, 'Tie::File', filename or die ...;
@@ -1688,7 +2031,7 @@ Tie::File - Access the lines of a disk file via a Perl array
push @array, new recs...;
my $r1 = pop @array;
unshift @array, new recs...;
- my $r1 = shift @array;
+ my $r2 = shift @array;
@old_recs = splice @array, 3, 7, new recs...;
untie @array; # all finished
@@ -1712,7 +2055,7 @@ Lazy people and beginners may now stop reading the manual.
What is a 'record'? By default, the meaning is the same as for the
C<E<lt>...E<gt>> operator: It's a string terminated by C<$/>, which is
-probably C<"\n">. (Minor exception: on dos and Win32 systems, a
+probably C<"\n">. (Minor exception: on DOS and Win32 systems, a
'record' is a string terminated by C<"\r\n">.) You may change the
definition of "record" by supplying the C<recsep> option in the C<tie>
call:
@@ -1836,7 +2179,13 @@ fetched from disk every time you examine them.
The C<memory> value is not an absolute or exact limit on the memory
used. C<Tie::File> objects contains some structures besides the read
cache and the deferred write buffer, whose sizes are not charged
-against C<memory>.
+against C<memory>.
+
+The cache itself consumes about 310 bytes per cached record, so if
+your file has many short records, you may want to decrease the cache
+memory limit, or else the cache overhead may exceed the size of the
+cached data.
+
=head2 C<dw_size>
@@ -1888,6 +2237,15 @@ the C<use Fcntl ':flock'> declaration.)
C<MODE> is optional; the default is C<LOCK_EX>.
+C<Tie::File> maintains an internal table of the byte offset of each
+record it has seen in the file.
+
+When you use C<flock> to lock the file, C<Tie::File> assumes that the
+read cache is no longer trustworthy, because another process might
+have modified the file since the last time it was read. Therefore, a
+successful call to C<flock> discards the contents of the read cache
+and the internal record offset table.
+
C<Tie::File> promises that the following sequence of operations will
be safe:
@@ -1929,6 +2287,14 @@ See L<"autochomp">, above.
See L<"Deferred Writing">, below.
+=head2 C<offset>
+
+ $off = $o->offset($n);
+
+This method returns the byte offset of the start of the C<$n>th record
+in the file. If there is no such record, it returns an undefined
+value.
+
=head1 Tying to an already-opened filehandle
If C<$fh> is a filehandle, such as is returned by C<IO::File> or one
@@ -1948,6 +2314,11 @@ means no pipes or sockets. If C<Tie::File> can detect that you
supplied a non-seekable handle, the C<tie> call will throw an
exception. (On Unix systems, it can detect this.)
+Note that Tie::File will only close any filehandles that it opened
+internally. If you passed it a filehandle as above, you "own" the
+filehandle, and are responsible for closing it after you have untied
+the @array.
+
=head1 Deferred Writing
(This is an advanced feature. Skip this section on first reading.)
@@ -2052,21 +2423,24 @@ or
Similarly, C<-E<gt>autodefer(1)> re-enables autodeferment, and
C<-E<gt>autodefer()> recovers the current value of the autodefer setting.
-=head1 CAVEATS
-(That's Latin for 'warnings'.)
+=head1 CONCURRENT ACCESS TO FILES
-=over 4
+Caching and deferred writing are inappropriate if you want the same
+file to be accessed simultaneously from more than one process. Other
+optimizations performed internally by this module are also
+incompatible with concurrent access. A future version of this module will
+support a C<concurrent =E<gt> 1> option that enables safe concurrent access.
-=item *
+Previous versions of this documentation suggested using C<memory
+=E<gt> 0> for safe concurrent access. This was mistaken. Tie::File
+will not support safe concurrent access before version 0.98.
+
+=head1 CAVEATS
-This is BETA RELEASE SOFTWARE. It may have bugs. See the discussion
-below about the (lack of any) warranty.
+(That's Latin for 'warnings'.)
-In particular, this means that the interface may change in
-incompatible ways from one version to the next, without warning. That
-has happened at least once already. The interface will freeze before
-Perl 5.8 is released, probably sometime in April 2002.
+=over 4
=item *
@@ -2100,27 +2474,12 @@ and C<delete>, but in general, the correspondence is extremely close.
=item *
-Not quite every effort was made to make this module as efficient as
-possible. C<FETCHSIZE> should use binary search instead of linear
-search.
-
-The performance of the C<flush> method could be improved. At present,
-it still rewrites the tail of the file once for each block of
-contiguous lines to be changed. In the typical case, this will result
-in only one rewrite, but in peculiar cases it might be bad. It should
-be possible to perform I<all> deferred writing with a single rewrite.
-
-Profiling suggests that these defects are probably minor; in any
-event, they will be fixed in a future version of the module.
-
-=item *
-
I have supposed that since this module is concerned with file I/O,
almost all normal use of it will be heavily I/O bound. This means
that the time to maintain complicated data structures inside the
module will be dominated by the time to actually perform the I/O.
When there was an opportunity to spend CPU time to avoid doing I/O, I
-tried to take it.
+usually tried to take it.
=item *
@@ -2128,6 +2487,17 @@ You might be tempted to think that deferred writing is like
transactions, with C<flush> as C<commit> and C<discard> as
C<rollback>, but it isn't, so don't.
+=item *
+
+There is a large memory overhead for each record offset and for each
+cache entry: about 310 bytes per cached data record, and about 21 bytes per offset table entry.
+
+The per-record overhead will limit the maximum number of records you
+can access per file. Note that I<accessing> the length of the array
+via C<$x = scalar @tied_file> accesses B<all> records and stores their
+offsets. The same for C<foreach (@tied_file)>, even if you exit the
+loop early.
+
=back
=head1 SUBCLASSING
@@ -2162,7 +2532,7 @@ any news of importance, will be available at
=head1 LICENSE
-C<Tie::File> version 0.93 is copyright (C) 2002 Mark Jason Dominus.
+C<Tie::File> version 0.97 is copyright (C) 2003 Mark Jason Dominus.
This library is free software; you may redistribute it and/or modify
it under the same terms as Perl itself.
@@ -2190,7 +2560,7 @@ For licensing inquiries, contact the author at:
=head1 WARRANTY
-C<Tie::File> version 0.93 comes with ABSOLUTELY NO WARRANTY.
+C<Tie::File> version 0.97 comes with ABSOLUTELY NO WARRANTY.
For details, see the license.
=head1 THANKS
@@ -2206,28 +2576,31 @@ Autrijus Tang (for heroic eleventh-hour Win32 testing above and beyond
the call of duty), Michael G Schwern (for testing advice), and the
rest of the CPAN testers (for testing generally).
+Special thanks to Tels for suggesting several speed and memory
+optimizations.
+
Additional thanks to:
Edward Avis /
+Mattia Barbon /
+Tom Christiansen /
Gerrit Haase /
+Gurusamy Sarathy /
+Jarkko Hietaniemi (again) /
Nikola Knezevic /
+John Kominetz /
Nick Ing-Simmons /
Tassilo von Parseval /
H. Dieter Pearcey /
Slaven Rezic /
+Eric Roode /
Peter Scott /
Peter Somu /
Autrijus Tang (again) /
-Tels /
-Juerd Wallboer
+Tels (again) /
+Juerd Waalboer
=head1 TODO
-More tests. (The cache and heap modules need more unit tests.)
-
-Improve SPLICE algorithm to use deferred writing machinery.
-
-Cleverer strategy for flushing deferred writes.
-
More tests. (Stuff I didn't think of yet.)
Paragraph mode?
@@ -2236,9 +2609,23 @@ Fixed-length mode. Leave-blanks mode.
Maybe an autolocking mode?
+For many common uses of the module, the read cache is a liability.
+For example, a program that inserts a single record, or that scans the
+file once, will have a cache hit rate of zero. This suggests a major
+optimization: The cache should be initially disabled. Here's a hybrid
+approach: Initially, the cache is disabled, but the cache code
+maintains statistics about how high the hit rate would be *if* it were
+enabled. When it sees the hit rate get high enough, it enables
+itself. The STAT comments in this code are the beginning of an
+implementation of this.
+
Record locking with fcntl()? Then the module might support an undo
log and get real transactions. What a tour de force that would be.
+Keeping track of the highest cached record. This would allow reads-in-a-row
+to skip the cache lookup faster (if reading from 1..N with empty cache at
+start, the last cached value will be always N-1).
+
More tests.
=cut
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/00_version.t b/gnu/usr.bin/perl/lib/Tie/File/t/00_version.t
index 71c1c823f21..3dd51c0bf69 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/00_version.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/00_version.t
@@ -2,7 +2,7 @@
print "1..1\n";
-my $testversion = "0.93";
+my $testversion = "0.97";
use Tie::File;
if ($Tie::File::VERSION != $testversion) {
@@ -19,3 +19,4 @@ None of the other test results will be reliable.
}
print "ok 1\n";
+
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/01_gen.t b/gnu/usr.bin/perl/lib/Tie/File/t/01_gen.t
index 0fc01764811..202b09c76aa 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/01_gen.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/01_gen.t
@@ -1,6 +1,8 @@
#!/usr/bin/perl
+$| = 1;
my $file = "tf$$.txt";
+1 while unlink $file;
print "1..75\n";
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/04_splice.t b/gnu/usr.bin/perl/lib/Tie/File/t/04_splice.t
index cb08dac4640..b3880b758cb 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/04_splice.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/04_splice.t
@@ -12,6 +12,7 @@
# contents.
+$| = 1;
my $file = "tf$$.txt";
$: = Tie::File::_default_recsep();
my $data = "rec0$:rec1$:rec2$:";
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/05_size.t b/gnu/usr.bin/perl/lib/Tie/File/t/05_size.t
index 695d379702e..44c69f910f0 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/05_size.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/05_size.t
@@ -86,7 +86,7 @@ print (! defined $r ? "ok $N\n" : "not ok $N \# was <$r>; should be UNDEF\n");
# 20020326 Well, but happily, this test did fail today.
# In the past, there was a bug in STORESIZE that it didn't correctly
-# remove deleted records from the the cache. This wasn't detected
+# remove deleted records from the cache. This wasn't detected
# because these tests were all done with an empty cache. populate()
# will ensure that the cache is fully populated.
sub populate {
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/09_gen_rs.t b/gnu/usr.bin/perl/lib/Tie/File/t/09_gen_rs.t
index c2025563add..041131fb07e 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/09_gen_rs.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/09_gen_rs.t
@@ -2,7 +2,7 @@
my $file = "tf$$.txt";
-print "1..58\n";
+print "1..59\n";
my $N = 1;
use Tie::File;
@@ -104,7 +104,6 @@ if (setup_badly_terminated_file(3)) {
$N++;
push @a, "next";
check_contents($badrec, "next");
- undef $o; untie @a;
}
# (51-52)
if (setup_badly_terminated_file(2)) {
@@ -113,7 +112,6 @@ if (setup_badly_terminated_file(2)) {
or die "Couldn't tie file: $!";
splice @a, 1, 0, "x", "y";
check_contents($badrec, "x", "y");
- undef $o; untie @a;
}
# (53-56)
if (setup_badly_terminated_file(4)) {
@@ -128,10 +126,9 @@ if (setup_badly_terminated_file(4)) {
: "not ok $N \# expected <$badrec>, got <$r[0]>\n";
$N++;
check_contents("x", "y");
- undef $o; untie @a;
}
-# (57-58) 20020402 The modifiaction would have failed if $\ were set wrong.
+# (57-58) 20020402 The modification would have failed if $\ were set wrong.
# I hate $\.
if (setup_badly_terminated_file(2)) {
$o = tie @a, 'Tie::File', $file,
@@ -141,7 +138,23 @@ if (setup_badly_terminated_file(2)) {
my $z = $a[0];
}
check_contents($badrec);
- undef $o; untie @a;
+}
+
+# (59) 20030527 Tom Christiansen pointed out that FETCH returns the wrong
+# data on the final record of an unterminated file if the file is opened
+# in read-only mode. Note that the $#a is necessary here.
+# There's special-case code to fix the final record when it is read normally.
+# But the $#a forces it to be read from the cache, which skips the
+# termination.
+$badrec = "world${RECSEP}hello";
+if (setup_badly_terminated_file(1)) {
+ tie(@a, "Tie::File", $file, mode => 0, recsep => $RECSEP)
+ or die "Couldn't tie file: $!";
+ my $z = $#a;
+ $z = $a[1];
+ print $z eq "hello" ? "ok $N\n" :
+ "not ok $N \# got $z, expected hello\n";
+ $N++;
}
sub setup_badly_terminated_file {
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/16_handle.t b/gnu/usr.bin/perl/lib/Tie/File/t/16_handle.t
index f799496be1a..72ff10b7be0 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/16_handle.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/16_handle.t
@@ -79,7 +79,7 @@ undef $o;
untie @a;
# (39) Does it correctly detect a non-seekable handle?
-{ if ($^O =~ /^(MSWin32|dos|beos)$/) {
+{ if ($^O =~ /^(MSWin32|dos|BeOS)$/) {
print "ok $N # skipped ($^O has broken pipe semantics)\n";
last;
}
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/19_cache.t b/gnu/usr.bin/perl/lib/Tie/File/t/19_cache.t
index 74228c04d11..81c693263e3 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/19_cache.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/19_cache.t
@@ -3,12 +3,13 @@
# Tests for various caching errors
#
+$|=1;
my $file = "tf$$.txt";
$: = Tie::File::_default_recsep();
my $data = join $:, "rec0" .. "rec9", "";
my $V = $ENV{INTEGRITY}; # Verbose integrity checking?
-print "1..54\n";
+print "1..55\n";
my $N = 1;
use Tie::File;
@@ -160,6 +161,11 @@ check();
splice @a;
check();
+# (55) This was broken on 20030507 when you moved the cache management
+# stuff out of _oadjust back into _splice without also putting it back
+# into _store.
+@a = (0..11);
+check();
sub init_file {
my $data = shift;
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/21_win32.t b/gnu/usr.bin/perl/lib/Tie/File/t/21_win32.t
index 80d795a5d02..d06854441bf 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/21_win32.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/21_win32.t
@@ -9,7 +9,7 @@
my $file = "tf$$.txt";
-unless ($^O =~ /^(MSWin32)$/) {
+unless ($^O =~ /^(MSWin32|dos)$/) {
print "1..0\n";
exit;
}
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/24_cache_loop.t b/gnu/usr.bin/perl/lib/Tie/File/t/24_cache_loop.t
index 20ccffae02b..0bc66bee2b1 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/24_cache_loop.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/24_cache_loop.t
@@ -43,6 +43,7 @@ $N++;
alarm 5 unless $^P;
@a = "record0" .. "record9";
print "ok 3\n";
+alarm 0;
END {
undef $o;
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/25_gen_nocache.t b/gnu/usr.bin/perl/lib/Tie/File/t/25_gen_nocache.t
index bafecf0b9f2..78e55062154 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/25_gen_nocache.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/25_gen_nocache.t
@@ -3,7 +3,6 @@
# Regular read-write tests with caching disabled
# (Same as 01_gen.t)
#
-
my $file = "tf$$.txt";
print "1..68\n";
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/26_twrite.t b/gnu/usr.bin/perl/lib/Tie/File/t/26_twrite.t
index 1d9073c0731..e2a925f4e08 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/26_twrite.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/26_twrite.t
@@ -269,7 +269,7 @@ sub try {
# The record has exactly 17 characters. This will help ensure that
# even if _twrite screws up, the data doesn't coincidentally
# look good because the remainder accidentally lines up.
- my $d = length($:) == 1 ? "0123456789abcdef$:" : "0123456789abcde$:";
+ my $d = substr("0123456789abcdef$:", -17);
my $recs = defined($FLEN) ?
int($FLEN/length($d))+1 : # enough to make up at least $FLEN
int(8192*5/length($d))+1; # at least 5 blocks' worth
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/27_iwrite.t b/gnu/usr.bin/perl/lib/Tie/File/t/27_iwrite.t
new file mode 100644
index 00000000000..db591a81ba0
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/27_iwrite.t
@@ -0,0 +1,235 @@
+#!/usr/bin/perl
+#
+# Unit tests of _iwrite function
+#
+# _iwrite($self, $data, $start, $end)
+#
+# 'i' here is for 'insert'. This writes $data at absolute position $start
+# in the file, copying the data at that position downwards---
+# but only down to position $end. Data at or past $end is not moved
+# or even examined. Since there isn't enough room for the full copy
+# (Because we inserted $data at the beginning) we copy as much as possible
+# and return a string containing the remainder.
+
+my $file = "tf$$.txt";
+$| = 1;
+
+print "1..203\n";
+
+my $N = 1;
+my $oldfile;
+use Tie::File;
+print "ok $N\n"; $N++;
+
+$: = Tie::File::_default_recsep();
+
+$FLEN = 40970; # Use files of this length
+$oldfile = mkrand($FLEN);
+print "# MOF tests\n";
+# (2-85) These were generated by 'gentests.pl' to cover all possible cases
+# (I hope)
+# Legend:
+# x: data is entirely contained within one block
+# x>: data runs from the middle to the end of the block
+# <x: data runs from the start to the middle of the block
+# <x>: data occupies precisely one block
+# x><x: data overlaps one block boundary
+# <x><x: data runs from the start of one block into the middle of the next
+# x><x>: data runs from the middle of one block to the end of the next
+# <x><x>: data occupies two blocks exactly
+# <x><x><x>: data occupies three blocks exactly
+# 0: data is null
+#
+# For each possible alignment of the old and new data, we investigate
+# up to three situations: old data is shorter, old and new data are the
+# same length, and new data is shorter.
+#
+# try($pos, $old, $new) means to run a test where the area being
+# written into starts at position $pos, the area being written into
+# has length $old, and and the new data has length $new.
+try( 8605, 2394, 2394); # old=x , new=x ; old = new
+try( 9768, 1361, 664); # old=x , new=x ; old > new
+try( 9955, 6429, 6429); # old=x> , new=x ; old = new
+try(10550, 5834, 4123); # old=x> , new=x ; old > new
+try(14580, 6158, 851); # old=x><x , new=x ; old > new
+try(13442, 11134, 1572); # old=x><x> , new=x ; old > new
+try( 8192, 514, 514); # old=<x , new=<x ; old = new
+try( 8192, 2196, 858); # old=<x , new=<x ; old > new
+try( 8192, 8192, 8192); # old=<x> , new=<x ; old = new
+try( 8192, 8192, 1290); # old=<x> , new=<x ; old > new
+try( 8192, 10575, 6644); # old=<x><x , new=<x ; old > new
+try( 8192, 16384, 5616); # old=<x><x> , new=<x ; old > new
+try( 8192, 24576, 6253); # old=<x><x><x>, new=<x ; old > new
+try( 9965, 6419, 6419); # old=x> , new=x> ; old = new
+try(16059, 6102, 325); # old=x><x , new=x> ; old > new
+try( 9503, 15073, 6881); # old=x><x> , new=x> ; old > new
+try(16316, 1605, 1605); # old=x><x , new=x><x ; old = new
+try(16093, 4074, 993); # old=x><x , new=x><x ; old > new
+try(14739, 9837, 9837); # old=x><x> , new=x><x ; old = new
+try(14071, 10505, 7344); # old=x><x> , new=x><x ; old > new
+try( 8192, 8192, 8192); # old=<x> , new=<x> ; old = new
+try( 8192, 14817, 8192); # old=<x><x , new=<x> ; old > new
+try( 8192, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try( 8192, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try( 8192, 9001, 9001); # old=<x><x , new=<x><x ; old = new
+try( 8192, 11760, 10274); # old=<x><x , new=<x><x ; old > new
+try( 8192, 16384, 10781); # old=<x><x> , new=<x><x ; old > new
+try( 8192, 24576, 9284); # old=<x><x><x>, new=<x><x ; old > new
+try(14761, 9815, 9815); # old=x><x> , new=x><x> ; old = new
+try( 8192, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try( 8192, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try( 8192, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try( 8771, 776, 0); # old=x , new=0 ; old > new
+try( 8192, 2813, 0); # old=<x , new=0 ; old > new
+try(13945, 2439, 0); # old=x> , new=0 ; old > new
+try(14493, 6090, 0); # old=x><x , new=0 ; old > new
+try( 8192, 8192, 0); # old=<x> , new=0 ; old > new
+try( 8192, 10030, 0); # old=<x><x , new=0 ; old > new
+try(14983, 9593, 0); # old=x><x> , new=0 ; old > new
+try( 8192, 16384, 0); # old=<x><x> , new=0 ; old > new
+try( 8192, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try(10489, 0, 0); # old=0 , new=0 ; old = new
+
+print "# SOF tests\n";
+# (86-133)
+# These tests all take place at the start of the file
+try( 0, 4868, 4868); # old=<x , new=<x ; old = new
+try( 0, 147, 118); # old=<x , new=<x ; old > new
+try( 0, 8192, 8192); # old=<x> , new=<x ; old = new
+try( 0, 8192, 4574); # old=<x> , new=<x ; old > new
+try( 0, 11891, 1917); # old=<x><x , new=<x ; old > new
+try( 0, 16384, 5155); # old=<x><x> , new=<x ; old > new
+try( 0, 24576, 2953); # old=<x><x><x>, new=<x ; old > new
+try( 0, 8192, 8192); # old=<x> , new=<x> ; old = new
+try( 0, 11083, 8192); # old=<x><x , new=<x> ; old > new
+try( 0, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try( 0, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try( 0, 14126, 14126); # old=<x><x , new=<x><x ; old = new
+try( 0, 12002, 9034); # old=<x><x , new=<x><x ; old > new
+try( 0, 16384, 13258); # old=<x><x> , new=<x><x ; old > new
+try( 0, 24576, 14367); # old=<x><x><x>, new=<x><x ; old > new
+try( 0, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try( 0, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try( 0, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try( 0, 6530, 0); # old=<x , new=0 ; old > new
+try( 0, 8192, 0); # old=<x> , new=0 ; old > new
+try( 0, 14707, 0); # old=<x><x , new=0 ; old > new
+try( 0, 16384, 0); # old=<x><x> , new=0 ; old > new
+try( 0, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try( 0, 0, 0); # old=0 , new=0 ; old = new
+
+print "# EOF tests 1\n";
+# (134-169)
+# These tests all take place at the end of the file
+$FLEN = 40960; # Force the file to be exactly 40960 bytes long
+$oldfile = mkrand($FLEN);
+try(32768, 8192, 8192); # old=<x> , new=<x ; old = new
+try(32768, 8192, 4026); # old=<x> , new=<x ; old > new
+try(24576, 16384, 1917); # old=<x><x> , new=<x ; old > new
+try(16384, 24576, 3818); # old=<x><x><x>, new=<x ; old > new
+try(32768, 8192, 8192); # old=<x> , new=<x> ; old = new
+try(24576, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try(16384, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try(24576, 16384, 12221); # old=<x><x> , new=<x><x ; old > new
+try(16384, 24576, 15030); # old=<x><x><x>, new=<x><x ; old > new
+try(24576, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try(16384, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try(16384, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try(35973, 4987, 0); # old=x> , new=0 ; old > new
+try(32768, 8192, 0); # old=<x> , new=0 ; old > new
+try(29932, 11028, 0); # old=x><x> , new=0 ; old > new
+try(24576, 16384, 0); # old=<x><x> , new=0 ; old > new
+try(16384, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try(40960, 0, 0); # old=0 , new=0 ; old = new
+
+print "# EOF tests 2\n";
+# (170-203)
+# These tests all take place at the end of the file
+$FLEN = 42000; # Force the file to be exactly 42000 bytes long
+$oldfile = mkrand($FLEN);
+try(41683, 317, 317); # old=x , new=x ; old = new
+try(41225, 775, 405); # old=x , new=x ; old > new
+try(35709, 6291, 284); # old=x><x , new=x ; old > new
+try(40960, 1040, 1040); # old=<x , new=<x ; old = new
+try(40960, 1040, 378); # old=<x , new=<x ; old > new
+try(32768, 9232, 5604); # old=<x><x , new=<x ; old > new
+try(39994, 2006, 966); # old=x><x , new=x> ; old > new
+try(36725, 5275, 5275); # old=x><x , new=x><x ; old = new
+try(37990, 4010, 3199); # old=x><x , new=x><x ; old > new
+try(32768, 9232, 8192); # old=<x><x , new=<x> ; old > new
+try(32768, 9232, 9232); # old=<x><x , new=<x><x ; old = new
+try(32768, 9232, 8795); # old=<x><x , new=<x><x ; old > new
+try(41500, 500, 0); # old=x , new=0 ; old > new
+try(40960, 1040, 0); # old=<x , new=0 ; old > new
+try(35272, 6728, 0); # old=x><x , new=0 ; old > new
+try(32768, 9232, 0); # old=<x><x , new=0 ; old > new
+try(42000, 0, 0); # old=0 , new=0 ; old = new
+
+sub mkrand {
+ my $len = shift;
+ srand $len;
+ my @c = ('a' .. 'z', 'A' .. 'Z', 0..9, $:);
+ my $d = "";
+ $d .= $c[rand @c] until length($d) >= $len;
+ substr($d, $len) = ""; # chop it off to the proper length
+ $d;
+}
+
+sub try {
+ my ($s, $len, $newlen) = @_;
+ my $e = $s + $len;
+
+ open F, "> $file" or die "Couldn't open file $file: $!";
+ binmode F;
+
+ print F $oldfile;
+ close F;
+
+ die "wrong length!" unless -s $file == $FLEN;
+
+ my $newdata = "-" x $newlen;
+ my $expected = $oldfile;
+
+ my $expected_return = substr($expected, $e - $newlen, $newlen, "");
+ substr($expected, $s, 0, $newdata);
+
+ my $o = tie my @lines, 'Tie::File', $file or die $!;
+ my $actual_return = $o->_iwrite($newdata, $s, $e);
+ undef $o; untie @lines;
+
+ open F, "< $file" or die "Couldn't open file $file: $!";
+ binmode F;
+ my $actual;
+ { local $/;
+ $actual = <F>;
+ }
+ close F;
+
+ my ($alen, $xlen) = (length $actual, length $expected);
+ unless ($alen == $xlen) {
+ print "# try(@_) expected file length $xlen, actual $alen!\n";
+ }
+ print $actual eq $expected ? "ok $N\n" : "not ok $N\n";
+ $N++;
+
+ if (! defined $actual_return && ! defined $expected_return) {
+ print "ok $N\n";
+ } elsif (! defined $actual_return || ! defined $expected_return) {
+ print "not ok $N\n";
+ } else {
+ print $actual_return eq $expected_return ? "ok $N\n" : "not ok $N\n";
+ }
+ $N++;
+}
+
+sub ctrlfix {
+ for (@_) {
+ s/\n/\\n/g;
+ s/\r/\\r/g;
+ }
+}
+
+END {
+ 1 while unlink $file;
+}
+
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/28_mtwrite.t b/gnu/usr.bin/perl/lib/Tie/File/t/28_mtwrite.t
new file mode 100644
index 00000000000..50e306d3b6f
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/28_mtwrite.t
@@ -0,0 +1,295 @@
+#!/usr/bin/perl
+#
+# Unit tests of _mtwrite function
+#
+# _mtwrite($self, $d1, $s1, $l1, $d2, $s2, $l2, ...)
+#
+# 'm' here is for 'multiple'. This writes data $d1 at position $s1
+# over a block of space $l1, moving subsequent data up or down as necessary.
+
+my $file = "tf$$.txt";
+$| = 1;
+
+print "1..2252\n";
+
+my $N = 1;
+my $oldfile;
+use Tie::File;
+print "ok $N\n"; $N++;
+
+$: = Tie::File::_default_recsep();
+
+# Only these are used for the triple-region tests
+@BASE_TRIES = (
+ [10, 20, 30],
+ [10, 30, 20],
+ [100, 30, 20],
+ [100, 20, 30],
+ [100, 40, 20],
+ [100, 20, 40],
+ [200, 20, 30],
+ [200, 30, 20],
+ [200, 20, 60],
+ [200, 60, 20],
+ );
+
+@TRIES = @BASE_TRIES;
+
+$FLEN = 40970; # Use files of this length
+$oldfile = mkrand($FLEN);
+print "# MOF tests\n";
+# These were generated by 'gentests.pl' to cover all possible cases
+# (I hope)
+# Legend:
+# x: data is entirely contained within one block
+# x>: data runs from the middle to the end of the block
+# <x: data runs from the start to the middle of the block
+# <x>: data occupies precisely one block
+# x><x: data overlaps one block boundary
+# <x><x: data runs from the start of one block into the middle of the next
+# x><x>: data runs from the middle of one block to the end of the next
+# <x><x>: data occupies two blocks exactly
+# <x><x><x>: data occupies three blocks exactly
+# 0: data is null
+#
+# For each possible alignment of the old and new data, we investigate
+# up to three situations: old data is shorter, old and new data are the
+# same length, and new data is shorter.
+#
+# try($pos, $old, $new) means to run a test where the area being
+# written into starts at position $pos, the area being written into
+# has length $old, and and the new data has length $new.
+try( 8605, 2394, 2394); # old=x , new=x ; old = new
+try( 9768, 1361, 664); # old=x , new=x ; old > new
+try( 9955, 6429, 6429); # old=x> , new=x ; old = new
+try(10550, 5834, 4123); # old=x> , new=x ; old > new
+try(14580, 6158, 851); # old=x><x , new=x ; old > new
+try(13442, 11134, 1572); # old=x><x> , new=x ; old > new
+try( 8192, 514, 514); # old=<x , new=<x ; old = new
+try( 8192, 2196, 858); # old=<x , new=<x ; old > new
+try( 8192, 8192, 8192); # old=<x> , new=<x ; old = new
+try( 8192, 8192, 1290); # old=<x> , new=<x ; old > new
+try( 8192, 10575, 6644); # old=<x><x , new=<x ; old > new
+try( 8192, 16384, 5616); # old=<x><x> , new=<x ; old > new
+try( 8192, 24576, 6253); # old=<x><x><x>, new=<x ; old > new
+try( 9965, 6419, 6419); # old=x> , new=x> ; old = new
+try(16059, 6102, 325); # old=x><x , new=x> ; old > new
+try( 9503, 15073, 6881); # old=x><x> , new=x> ; old > new
+try(16316, 1605, 1605); # old=x><x , new=x><x ; old = new
+try(16093, 4074, 993); # old=x><x , new=x><x ; old > new
+try(14739, 9837, 9837); # old=x><x> , new=x><x ; old = new
+try(14071, 10505, 7344); # old=x><x> , new=x><x ; old > new
+try( 8192, 8192, 8192); # old=<x> , new=<x> ; old = new
+try( 8192, 14817, 8192); # old=<x><x , new=<x> ; old > new
+try( 8192, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try( 8192, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try( 8192, 9001, 9001); # old=<x><x , new=<x><x ; old = new
+try( 8192, 11760, 10274); # old=<x><x , new=<x><x ; old > new
+try( 8192, 16384, 10781); # old=<x><x> , new=<x><x ; old > new
+try( 8192, 24576, 9284); # old=<x><x><x>, new=<x><x ; old > new
+try(14761, 9815, 9815); # old=x><x> , new=x><x> ; old = new
+try( 8192, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try( 8192, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try( 8192, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try( 8771, 776, 0); # old=x , new=0 ; old > new
+try( 8192, 2813, 0); # old=<x , new=0 ; old > new
+try(13945, 2439, 0); # old=x> , new=0 ; old > new
+try(14493, 6090, 0); # old=x><x , new=0 ; old > new
+try( 8192, 8192, 0); # old=<x> , new=0 ; old > new
+try( 8192, 10030, 0); # old=<x><x , new=0 ; old > new
+try(14983, 9593, 0); # old=x><x> , new=0 ; old > new
+try( 8192, 16384, 0); # old=<x><x> , new=0 ; old > new
+try( 8192, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try(10489, 0, 0); # old=0 , new=0 ; old = new
+
+print "# SOF tests\n";
+# These tests all take place at the start of the file
+try( 0, 4868, 4868); # old=<x , new=<x ; old = new
+try( 0, 147, 118); # old=<x , new=<x ; old > new
+try( 0, 8192, 8192); # old=<x> , new=<x ; old = new
+try( 0, 8192, 4574); # old=<x> , new=<x ; old > new
+try( 0, 11891, 1917); # old=<x><x , new=<x ; old > new
+try( 0, 16384, 5155); # old=<x><x> , new=<x ; old > new
+try( 0, 24576, 2953); # old=<x><x><x>, new=<x ; old > new
+try( 0, 8192, 8192); # old=<x> , new=<x> ; old = new
+try( 0, 11083, 8192); # old=<x><x , new=<x> ; old > new
+try( 0, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try( 0, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try( 0, 14126, 14126); # old=<x><x , new=<x><x ; old = new
+try( 0, 12002, 9034); # old=<x><x , new=<x><x ; old > new
+try( 0, 16384, 13258); # old=<x><x> , new=<x><x ; old > new
+try( 0, 24576, 14367); # old=<x><x><x>, new=<x><x ; old > new
+try( 0, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try( 0, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try( 0, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try( 0, 6530, 0); # old=<x , new=0 ; old > new
+try( 0, 8192, 0); # old=<x> , new=0 ; old > new
+try( 0, 14707, 0); # old=<x><x , new=0 ; old > new
+try( 0, 16384, 0); # old=<x><x> , new=0 ; old > new
+try( 0, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try( 0, 0, 0); # old=0 , new=0 ; old = new
+
+print "# EOF tests 1\n";
+# These tests all take place at the end of the file
+$FLEN = 40960; # Force the file to be exactly 40960 bytes long
+$oldfile = mkrand($FLEN);
+try(32768, 8192, 8192); # old=<x> , new=<x ; old = new
+try(32768, 8192, 4026); # old=<x> , new=<x ; old > new
+try(24576, 16384, 1917); # old=<x><x> , new=<x ; old > new
+try(16384, 24576, 3818); # old=<x><x><x>, new=<x ; old > new
+try(32768, 8192, 8192); # old=<x> , new=<x> ; old = new
+try(24576, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try(16384, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try(24576, 16384, 12221); # old=<x><x> , new=<x><x ; old > new
+try(16384, 24576, 15030); # old=<x><x><x>, new=<x><x ; old > new
+try(24576, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try(16384, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try(16384, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try(35973, 4987, 0); # old=x> , new=0 ; old > new
+try(32768, 8192, 0); # old=<x> , new=0 ; old > new
+try(29932, 11028, 0); # old=x><x> , new=0 ; old > new
+try(24576, 16384, 0); # old=<x><x> , new=0 ; old > new
+try(16384, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try(40960, 0, 0); # old=0 , new=0 ; old = new
+
+print "# EOF tests 2\n";
+# These tests all take place at the end of the file
+$FLEN = 42000; # Force the file to be exactly 42000 bytes long
+$oldfile = mkrand($FLEN);
+try(41683, 317, 317); # old=x , new=x ; old = new
+try(41225, 775, 405); # old=x , new=x ; old > new
+try(35709, 6291, 284); # old=x><x , new=x ; old > new
+try(40960, 1040, 1040); # old=<x , new=<x ; old = new
+try(40960, 1040, 378); # old=<x , new=<x ; old > new
+try(32768, 9232, 5604); # old=<x><x , new=<x ; old > new
+try(39994, 2006, 966); # old=x><x , new=x> ; old > new
+try(36725, 5275, 5275); # old=x><x , new=x><x ; old = new
+try(37990, 4010, 3199); # old=x><x , new=x><x ; old > new
+try(32768, 9232, 8192); # old=<x><x , new=<x> ; old > new
+try(32768, 9232, 9232); # old=<x><x , new=<x><x ; old = new
+try(32768, 9232, 8795); # old=<x><x , new=<x><x ; old > new
+try(41500, 500, 0); # old=x , new=0 ; old > new
+try(40960, 1040, 0); # old=<x , new=0 ; old > new
+try(35272, 6728, 0); # old=x><x , new=0 ; old > new
+try(32768, 9232, 0); # old=<x><x , new=0 ; old > new
+try(42000, 0, 0); # old=0 , new=0 ; old = new
+
+# Now the REAL tests
+# Make sure mtwrite can properly write sequences of several intervals
+# The intervals tested above were accumulated into @TRIES.
+# try_all_doubles() tries every possible sensible pair of those intervals.
+# try_all_triples() tries every possible sensible group of
+# tree intervals from the more restrictive set @BASE_TRIES.
+$FLEN = 40970;
+$oldfile = mkrand($FLEN);
+try_all_doubles();
+try_all_triples();
+
+sub mkrand {
+ my $len = shift;
+ srand $len;
+ my @c = ('a' .. 'z', 'A' .. 'Z', 0..9, $:);
+ my $d = "";
+ $d .= $c[rand @c] until length($d) >= $len;
+ substr($d, $len) = ""; # chop it off to the proper length
+ $d;
+}
+
+sub try {
+ push @TRIES, [@_] if @_ == 3;
+
+ open F, "> $file" or die "Couldn't open file $file: $!";
+ binmode F;
+ print F $oldfile;
+ close F;
+ die "wrong length!" unless -s $file == $FLEN;
+
+ my @mt_args;
+ my $expected = $oldfile;
+ { my @a = @_;
+ my $c = "a";
+ while (@a) {
+ my ($s, $len, $newlen) = splice @a, -3;
+ my $newdata = $c++ x $newlen;
+ substr($expected, $s, $len, $newdata);
+ unshift @mt_args, $newdata, $s, $len;
+ }
+ }
+
+ my $o = tie my @lines, 'Tie::File', $file or die $!;
+ my $actual_return = $o->_mtwrite(@mt_args);
+ undef $o; untie @lines;
+
+ open F, "< $file" or die "Couldn't open file $file: $!";
+ binmode F;
+ my $actual;
+ { local $/;
+ $actual = <F>;
+ }
+ close F;
+
+ my ($alen, $xlen) = (length $actual, length $expected);
+ unless ($alen == $xlen) {
+ print "# try(@_) expected file length $xlen, actual $alen!\n";
+ }
+ print $actual eq $expected ? "ok $N\n" : "not ok $N\n";
+ $N++;
+
+# if (! defined $actual_return && ! defined $expected_return) {
+# print "ok $N\n";
+# } elsif (! defined $actual_return || ! defined $expected_return) {
+# print "not ok $N\n";
+# } else {
+# print $actual_return eq $expected_return ? "ok $N\n" : "not ok $N\n";
+# }
+# $N++;
+}
+
+sub try_all_doubles {
+ print "# Trying double regions.\n";
+ for my $a (@TRIES) {
+ next if $a->[0] + $a->[1] >= $FLEN;
+ next if $a->[0] + $a->[2] >= $FLEN;
+ for my $b (@TRIES) {
+ next if $b->[0] + $b->[1] >= $FLEN;
+ next if $b->[0] + $b->[2] >= $FLEN;
+
+ next if $b->[0] < $a->[0] + $a->[1]; # Overlapping regions
+ try(@$a, @$b);
+ }
+ }
+}
+
+sub try_all_triples {
+ print "# Trying triple regions.\n";
+ for my $a (@BASE_TRIES) {
+ next if $a->[0] + $a->[1] >= $FLEN;
+ next if $a->[0] + $a->[2] >= $FLEN;
+ for my $b (@BASE_TRIES) {
+ next if $b->[0] + $b->[1] >= $FLEN;
+ next if $b->[0] + $b->[2] >= $FLEN;
+
+ next if $b->[0] < $a->[0] + $a->[1]; # Overlapping regions
+
+ for my $c (@BASE_TRIES) {
+ next if $c->[0] + $c->[1] >= $FLEN;
+ next if $c->[0] + $c->[2] >= $FLEN;
+
+ next if $c->[0] < $b->[0] + $b->[1]; # Overlapping regions
+ try(@$a, @$b, @$c);
+ }
+ }
+ }
+}
+
+sub ctrlfix {
+ for (@_) {
+ s/\n/\\n/g;
+ s/\r/\\r/g;
+ }
+}
+
+END {
+ 1 while unlink $file;
+}
+
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/29_downcopy.t b/gnu/usr.bin/perl/lib/Tie/File/t/29_downcopy.t
new file mode 100644
index 00000000000..d75806d5b2c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/29_downcopy.t
@@ -0,0 +1,363 @@
+#!/usr/bin/perl
+#
+# Unit tests of _downcopy function
+#
+# _downcopy($self, $data, $pos, $len)
+# Write $data into a block of length $len at position $pos,
+# moving everything in the block forwards to make room.
+# Instead of writing the last length($data) bytes from the block
+# (because there isn't room for them any longer) return them.
+#
+#
+
+my $file = "tf$$.txt";
+
+print "1..718\n";
+
+my $N = 1;
+use Tie::File;
+print "ok $N\n"; $N++;
+
+$: = Tie::File::_default_recsep();
+
+my @subtests = qw(x <x x> x><x <x> <x><x x><x> <x><x> <x><x><x> 0);
+print "ok $N\n"; $N++;
+
+# (3-144) These were generated by 'gentests.pl' to cover all possible cases
+# (I hope)
+# Legend:
+# x: data is entirely contained within one block
+# x>: data runs from the middle to the end of the block
+# <x: data runs from the start to the middle of the block
+# <x>: data occupies precisely one block
+# x><x: data overlaps one block boundary
+# <x><x: data runs from the start of one block into the middle of the next
+# x><x>: data runs from the middle of one block to the end of the next
+# <x><x>: data occupies two blocks exactly
+# <x><x><x>: data occupies three blocks exactly
+# 0: data is null
+#
+# For each possible alignment of the old and new data, we investigate
+# up to three situations: old data is shorter, old and new data are the
+# same length, and new data is shorter.
+#
+# try($pos, $old, $new) means to run a test where the data starts at
+# position $pos, the old data has length $old,
+# and the new data has length $new.
+try( 9659, 6635, 6691); # old=x , new=x ; old < new
+try( 8605, 2394, 2394); # old=x , new=x ; old = new
+try( 9768, 1361, 664); # old=x , new=x ; old > new
+try( 9955, 6429, 6429); # old=x> , new=x ; old = new
+try(10550, 5834, 4123); # old=x> , new=x ; old > new
+try(14580, 6158, 851); # old=x><x , new=x ; old > new
+try(13442, 11134, 1572); # old=x><x> , new=x ; old > new
+try( 8394, 0, 5742); # old=0 , new=x ; old < new
+try( 8192, 2819, 6738); # old=<x , new=<x ; old < new
+try( 8192, 514, 514); # old=<x , new=<x ; old = new
+try( 8192, 2196, 858); # old=<x , new=<x ; old > new
+try( 8192, 8192, 8192); # old=<x> , new=<x ; old = new
+try( 8192, 8192, 1290); # old=<x> , new=<x ; old > new
+try( 8192, 10575, 6644); # old=<x><x , new=<x ; old > new
+try( 8192, 16384, 5616); # old=<x><x> , new=<x ; old > new
+try( 8192, 24576, 6253); # old=<x><x><x>, new=<x ; old > new
+try( 8192, 0, 6870); # old=0 , new=<x ; old < new
+try( 8478, 6259, 7906); # old=x , new=x> ; old < new
+try( 9965, 6419, 6419); # old=x> , new=x> ; old = new
+try(16059, 6102, 325); # old=x><x , new=x> ; old > new
+try( 9503, 15073, 6881); # old=x><x> , new=x> ; old > new
+try( 9759, 0, 6625); # old=0 , new=x> ; old < new
+try( 8525, 2081, 8534); # old=x , new=x><x ; old < new
+try(15550, 834, 1428); # old=x> , new=x><x ; old < new
+try(14966, 1668, 3479); # old=x><x , new=x><x ; old < new
+try(16316, 1605, 1605); # old=x><x , new=x><x ; old = new
+try(16093, 4074, 993); # old=x><x , new=x><x ; old > new
+try(14739, 9837, 9837); # old=x><x> , new=x><x ; old = new
+try(14071, 10505, 7344); # old=x><x> , new=x><x ; old > new
+try(12602, 0, 8354); # old=0 , new=x><x ; old < new
+try( 8192, 2767, 8192); # old=<x , new=<x> ; old < new
+try( 8192, 8192, 8192); # old=<x> , new=<x> ; old = new
+try( 8192, 14817, 8192); # old=<x><x , new=<x> ; old > new
+try( 8192, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try( 8192, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try( 8192, 0, 8192); # old=0 , new=<x> ; old < new
+try( 8192, 6532, 10882); # old=<x , new=<x><x ; old < new
+try( 8192, 8192, 16044); # old=<x> , new=<x><x ; old < new
+try( 8192, 9555, 11020); # old=<x><x , new=<x><x ; old < new
+try( 8192, 9001, 9001); # old=<x><x , new=<x><x ; old = new
+try( 8192, 11760, 10274); # old=<x><x , new=<x><x ; old > new
+try( 8192, 16384, 10781); # old=<x><x> , new=<x><x ; old > new
+try( 8192, 24576, 9284); # old=<x><x><x>, new=<x><x ; old > new
+try( 8192, 0, 12488); # old=0 , new=<x><x ; old < new
+try( 8222, 6385, 16354); # old=x , new=x><x> ; old < new
+try(13500, 2884, 11076); # old=x> , new=x><x> ; old < new
+try(14069, 4334, 10507); # old=x><x , new=x><x> ; old < new
+try(14761, 9815, 9815); # old=x><x> , new=x><x> ; old = new
+try(10469, 0, 14107); # old=0 , new=x><x> ; old < new
+try( 8192, 4181, 16384); # old=<x , new=<x><x> ; old < new
+try( 8192, 8192, 16384); # old=<x> , new=<x><x> ; old < new
+try( 8192, 12087, 16384); # old=<x><x , new=<x><x> ; old < new
+try( 8192, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try( 8192, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try( 8192, 0, 16384); # old=0 , new=<x><x> ; old < new
+try( 8192, 4968, 24576); # old=<x , new=<x><x><x>; old < new
+try( 8192, 8192, 24576); # old=<x> , new=<x><x><x>; old < new
+try( 8192, 14163, 24576); # old=<x><x , new=<x><x><x>; old < new
+try( 8192, 16384, 24576); # old=<x><x> , new=<x><x><x>; old < new
+try( 8192, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try( 8192, 0, 24576); # old=0 , new=<x><x><x>; old < new
+try( 8771, 776, 0); # old=x , new=0 ; old > new
+try( 8192, 2813, 0); # old=<x , new=0 ; old > new
+try(13945, 2439, 0); # old=x> , new=0 ; old > new
+try(14493, 6090, 0); # old=x><x , new=0 ; old > new
+try( 8192, 8192, 0); # old=<x> , new=0 ; old > new
+try( 8192, 10030, 0); # old=<x><x , new=0 ; old > new
+try(14983, 9593, 0); # old=x><x> , new=0 ; old > new
+try( 8192, 16384, 0); # old=<x><x> , new=0 ; old > new
+try( 8192, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try(10489, 0, 0); # old=0 , new=0 ; old = new
+
+# (142-223)
+# These tests all take place at the start of the file
+try( 0, 771, 1593); # old=<x , new=<x ; old < new
+try( 0, 4868, 4868); # old=<x , new=<x ; old = new
+try( 0, 147, 118); # old=<x , new=<x ; old > new
+try( 0, 8192, 8192); # old=<x> , new=<x ; old = new
+try( 0, 8192, 4574); # old=<x> , new=<x ; old > new
+try( 0, 11891, 1917); # old=<x><x , new=<x ; old > new
+try( 0, 16384, 5155); # old=<x><x> , new=<x ; old > new
+try( 0, 24576, 2953); # old=<x><x><x>, new=<x ; old > new
+try( 0, 0, 1317); # old=0 , new=<x ; old < new
+try( 0, 5609, 8192); # old=<x , new=<x> ; old < new
+try( 0, 8192, 8192); # old=<x> , new=<x> ; old = new
+try( 0, 11083, 8192); # old=<x><x , new=<x> ; old > new
+try( 0, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try( 0, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try( 0, 0, 8192); # old=0 , new=<x> ; old < new
+try( 0, 6265, 9991); # old=<x , new=<x><x ; old < new
+try( 0, 8192, 16119); # old=<x> , new=<x><x ; old < new
+try( 0, 10218, 11888); # old=<x><x , new=<x><x ; old < new
+try( 0, 14126, 14126); # old=<x><x , new=<x><x ; old = new
+try( 0, 12002, 9034); # old=<x><x , new=<x><x ; old > new
+try( 0, 16384, 13258); # old=<x><x> , new=<x><x ; old > new
+try( 0, 24576, 14367); # old=<x><x><x>, new=<x><x ; old > new
+try( 0, 0, 10881); # old=0 , new=<x><x ; old < new
+try( 0, 6448, 16384); # old=<x , new=<x><x> ; old < new
+try( 0, 8192, 16384); # old=<x> , new=<x><x> ; old < new
+try( 0, 15082, 16384); # old=<x><x , new=<x><x> ; old < new
+try( 0, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try( 0, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try( 0, 0, 16384); # old=0 , new=<x><x> ; old < new
+try( 0, 2421, 24576); # old=<x , new=<x><x><x>; old < new
+try( 0, 8192, 24576); # old=<x> , new=<x><x><x>; old < new
+try( 0, 11655, 24576); # old=<x><x , new=<x><x><x>; old < new
+try( 0, 16384, 24576); # old=<x><x> , new=<x><x><x>; old < new
+try( 0, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try( 0, 0, 24576); # old=0 , new=<x><x><x>; old < new
+try( 0, 6530, 0); # old=<x , new=0 ; old > new
+try( 0, 8192, 0); # old=<x> , new=0 ; old > new
+try( 0, 14707, 0); # old=<x><x , new=0 ; old > new
+try( 0, 16384, 0); # old=<x><x> , new=0 ; old > new
+try( 0, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try( 0, 0, 0); # old=0 , new=0 ; old = new
+
+# (224-277)
+# These tests all take place at the end of the file
+$FLEN = 40960; # Force the file to be exactly 40960 bytes long
+try(32768, 8192, 8192); # old=<x> , new=<x ; old = new
+try(32768, 8192, 4026); # old=<x> , new=<x ; old > new
+try(24576, 16384, 1917); # old=<x><x> , new=<x ; old > new
+try(16384, 24576, 3818); # old=<x><x><x>, new=<x ; old > new
+try(40960, 0, 2779); # old=0 , new=<x ; old < new
+try(32768, 8192, 8192); # old=<x> , new=<x> ; old = new
+try(24576, 16384, 8192); # old=<x><x> , new=<x> ; old > new
+try(16384, 24576, 8192); # old=<x><x><x>, new=<x> ; old > new
+try(40960, 0, 8192); # old=0 , new=<x> ; old < new
+try(32768, 8192, 10724); # old=<x> , new=<x><x ; old < new
+try(24576, 16384, 12221); # old=<x><x> , new=<x><x ; old > new
+try(16384, 24576, 15030); # old=<x><x><x>, new=<x><x ; old > new
+try(40960, 0, 11752); # old=0 , new=<x><x ; old < new
+try(32768, 8192, 16384); # old=<x> , new=<x><x> ; old < new
+try(24576, 16384, 16384); # old=<x><x> , new=<x><x> ; old = new
+try(16384, 24576, 16384); # old=<x><x><x>, new=<x><x> ; old > new
+try(40960, 0, 16384); # old=0 , new=<x><x> ; old < new
+try(32768, 8192, 24576); # old=<x> , new=<x><x><x>; old < new
+try(24576, 16384, 24576); # old=<x><x> , new=<x><x><x>; old < new
+try(16384, 24576, 24576); # old=<x><x><x>, new=<x><x><x>; old = new
+try(40960, 0, 24576); # old=0 , new=<x><x><x>; old < new
+try(35973, 4987, 0); # old=x> , new=0 ; old > new
+try(32768, 8192, 0); # old=<x> , new=0 ; old > new
+try(29932, 11028, 0); # old=x><x> , new=0 ; old > new
+try(24576, 16384, 0); # old=<x><x> , new=0 ; old > new
+try(16384, 24576, 0); # old=<x><x><x>, new=0 ; old > new
+try(40960, 0, 0); # old=0 , new=0 ; old = new
+
+# (278-357)
+# These tests all take place at the end of the file
+$FLEN = 42000; # Force the file to be exactly 42000 bytes long
+try(41275, 725, 4059); # old=x , new=x ; old < new
+try(41683, 317, 317); # old=x , new=x ; old = new
+try(41225, 775, 405); # old=x , new=x ; old > new
+try(35709, 6291, 284); # old=x><x , new=x ; old > new
+try(42000, 0, 2434); # old=0 , new=x ; old < new
+try(40960, 1040, 1608); # old=<x , new=<x ; old < new
+try(40960, 1040, 1040); # old=<x , new=<x ; old = new
+try(40960, 1040, 378); # old=<x , new=<x ; old > new
+try(32768, 9232, 5604); # old=<x><x , new=<x ; old > new
+try(42000, 0, 6637); # old=0 , new=<x ; old < new
+try(41022, 978, 8130); # old=x , new=x> ; old < new
+try(39994, 2006, 966); # old=x><x , new=x> ; old > new
+try(42000, 0, 7152); # old=0 , new=x> ; old < new
+try(41613, 387, 10601); # old=x , new=x><x ; old < new
+try(38460, 3540, 3938); # old=x><x , new=x><x ; old < new
+try(36725, 5275, 5275); # old=x><x , new=x><x ; old = new
+try(37990, 4010, 3199); # old=x><x , new=x><x ; old > new
+try(42000, 0, 9189); # old=0 , new=x><x ; old < new
+try(40960, 1040, 8192); # old=<x , new=<x> ; old < new
+try(32768, 9232, 8192); # old=<x><x , new=<x> ; old > new
+try(42000, 0, 8192); # old=0 , new=<x> ; old < new
+try(40960, 1040, 11778); # old=<x , new=<x><x ; old < new
+try(32768, 9232, 13792); # old=<x><x , new=<x><x ; old < new
+try(32768, 9232, 9232); # old=<x><x , new=<x><x ; old = new
+try(32768, 9232, 8795); # old=<x><x , new=<x><x ; old > new
+try(42000, 0, 8578); # old=0 , new=<x><x ; old < new
+try(41531, 469, 15813); # old=x , new=x><x> ; old < new
+try(39618, 2382, 9534); # old=x><x , new=x><x> ; old < new
+try(42000, 0, 15344); # old=0 , new=x><x> ; old < new
+try(40960, 1040, 16384); # old=<x , new=<x><x> ; old < new
+try(32768, 9232, 16384); # old=<x><x , new=<x><x> ; old < new
+try(42000, 0, 16384); # old=0 , new=<x><x> ; old < new
+try(40960, 1040, 24576); # old=<x , new=<x><x><x>; old < new
+try(32768, 9232, 24576); # old=<x><x , new=<x><x><x>; old < new
+try(42000, 0, 24576); # old=0 , new=<x><x><x>; old < new
+try(41500, 500, 0); # old=x , new=0 ; old > new
+try(40960, 1040, 0); # old=<x , new=0 ; old > new
+try(35272, 6728, 0); # old=x><x , new=0 ; old > new
+try(32768, 9232, 0); # old=<x><x , new=0 ; old > new
+try(42000, 0, 0); # old=0 , new=0 ; old = new
+
+sub try {
+ my ($pos, $len, $newlen) = @_;
+ open F, "> $file" or die "Couldn't open file $file: $!";
+ binmode F;
+
+ # The record has exactly 17 characters. This will help ensure that
+ # even if _downcoopy screws up, the data doesn't coincidentally
+ # look good because the remainder accidentally lines up.
+ my $d = substr("0123456789abcdef$:", -17);
+ my $recs = defined($FLEN) ?
+ int($FLEN/length($d))+1 : # enough to make up at least $FLEN
+ int(8192*5/length($d))+1; # at least 5 blocks' worth
+ my $oldfile = $d x $recs;
+ my $flen = defined($FLEN) ? $FLEN : $recs * 17;
+ substr($oldfile, $FLEN) = "" if defined $FLEN; # truncate
+ print F $oldfile;
+ close F;
+
+ die "wrong length!" unless -s $file == $flen;
+
+ my $newdata = "-" x $newlen;
+ my $expected = $oldfile;
+ my $old = defined $len ? substr($expected, $pos, $len)
+ : substr($expected, $pos);
+ $old = "$newdata$old";
+ my $x_retval;
+ if (defined $len) {
+ substr($expected, $pos, $len, substr($old, 0, $len, ""));
+ $x_retval = $old;
+ } else {
+ substr($expected, $pos) = $old;
+ $x_retval = "";
+ }
+
+ my $o = tie my @lines, 'Tie::File', $file or die $!;
+ local $SIG{ALRM} = sub { die "Alarm clock" };
+ my $a_retval = eval { alarm(5) unless $^P; $o->_downcopy($newdata, $pos, $len) };
+ my $err = $@;
+ undef $o; untie @lines; alarm(0);
+ if ($err) {
+ if ($err =~ /^Alarm clock/) {
+ print "# Timeout\n";
+ print "not ok $N\n"; $N++;
+ print "not ok $N\n"; $N++;
+ return;
+ } else {
+ $@ = $err;
+ die;
+ }
+ }
+
+ open F, "< $file" or die "Couldn't open file $file: $!";
+ binmode F;
+ my $actual;
+ { local $/;
+ $actual = <F>;
+ }
+ close F;
+
+ my ($alen, $xlen) = (length $actual, length $expected);
+ unless ($alen == $xlen) {
+ my @ARGS = @_;
+ for (@ARGS) { $_ = "UNDEF" unless defined }
+ print "# try(@ARGS) expected file length $xlen, actual $alen!\n";
+ }
+ print $actual eq $expected ? "ok $N\n" : "not ok $N\n";
+ $N++;
+ print $a_retval eq $x_retval ? "ok $N\n" : "not ok $N\n";
+ $N++;
+
+ if (defined $len) {
+ try($pos, undef, $newlen);
+ }
+}
+
+
+
+use POSIX 'SEEK_SET';
+sub check_contents {
+ my @c = @_;
+ my $x = join $:, @c, '';
+ local *FH = $o->{fh};
+ seek FH, 0, SEEK_SET;
+# my $open = open FH, "< $file";
+ my $a;
+ { local $/; $a = <FH> }
+ $a = "" unless defined $a;
+ if ($a eq $x) {
+ print "ok $N\n";
+ } else {
+ ctrlfix($a, $x);
+ print "not ok $N\n# expected <$x>, got <$a>\n";
+ }
+ $N++;
+
+ # now check FETCH:
+ my $good = 1;
+ my $msg;
+ for (0.. $#c) {
+ my $aa = $a[$_];
+ unless ($aa eq "$c[$_]$:") {
+ $msg = "expected <$c[$_]$:>, got <$aa>";
+ ctrlfix($msg);
+ $good = 0;
+ }
+ }
+ print $good ? "ok $N\n" : "not ok $N # $msg\n";
+ $N++;
+
+ print $o->_check_integrity($file, $ENV{INTEGRITY})
+ ? "ok $N\n" : "not ok $N\n";
+ $N++;
+}
+
+sub ctrlfix {
+ for (@_) {
+ s/\n/\\n/g;
+ s/\r/\\r/g;
+ }
+}
+
+END {
+ undef $o;
+ untie @a;
+ 1 while unlink $file;
+}
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/29a_upcopy.t b/gnu/usr.bin/perl/lib/Tie/File/t/29a_upcopy.t
new file mode 100644
index 00000000000..1130615f37a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/29a_upcopy.t
@@ -0,0 +1,211 @@
+#!/usr/bin/perl
+#
+# Unit tests of _upcopy function
+#
+# _upcopy($self, $source, $dest, $len)
+#
+# Take a block of data of leength $len at $source and copy it
+# to $dest, which must be <= $source but which need not be <= $source - $len
+# (That is, this will only copy a block to a position earlier in the file,
+# but the source and destination regions may overlap.)
+
+
+my $file = "tf$$.txt";
+
+print "1..55\n";
+
+my $N = 1;
+use Tie::File;
+print "ok $N\n"; $N++;
+
+$: = Tie::File::_default_recsep();
+
+my @subtests = qw(x <x x> x><x <x> <x><x x><x> <x><x> <x><x><x> 0);
+
+$FLEN = 40970; # 2410 records of 17 chars each
+
+# (2-7) Trivial non-moves at start of file
+try(0, 0, 0);
+try(0, 0, 10);
+try(0, 0, 100);
+try(0, 0, 1000);
+try(0, 0, 10000);
+try(0, 0, 20000);
+
+# (8-13) Trivial non-moves in middle of file
+try(100, 100, 0);
+try(100, 100, 10);
+try(100, 100, 100);
+try(100, 100, 1000);
+try(100, 100, 10000);
+try(100, 100, 20000);
+
+# (14) Trivial non-move at end of file
+try($FLEN, $FLEN, 0);
+
+# (15-17) Trivial non-move of tail of file
+try(0, 0, undef);
+try(100, 100, undef);
+try($FLEN, $FLEN, undef);
+
+# (18-24) Moves to start of file
+try(100, 0, 0);
+try(100, 0, 10);
+try(100, 0, 100);
+try(100, 0, 1000);
+try(100, 0, 10000);
+try(100, 0, 20000);
+try(100, 0, undef);
+
+# (25-31) Moves in middle of file
+try(200, 100, 0);
+try(200, 100, 10);
+try(200, 100, 100);
+try(200, 100, 1000);
+try(200, 100, 10000);
+try(200, 100, 20000);
+try(200, 100, undef);
+
+# (32-43) Moves from end of file
+try($FLEN, 10000, 0);
+try($FLEN-10, 10000, 10);
+try($FLEN-100, 10000, 100);
+try($FLEN-1000, 200, 1000);
+try($FLEN-10000, 200, 10000);
+try($FLEN-20000, 200, 20000);
+try($FLEN, 10000, undef);
+try($FLEN-10, 10000, undef);
+try($FLEN-100, 10000, undef);
+try($FLEN-1000, 200, undef);
+try($FLEN-10000, 200, undef);
+try($FLEN-20000, 200, undef);
+
+$FLEN = 40960;
+
+# (44-55) Moves from end of file when file ends on a block boundary
+try($FLEN, 10000, 0);
+try($FLEN-10, 10000, 10);
+try($FLEN-100, 10000, 100);
+try($FLEN-1000, 200, 1000);
+try($FLEN-10000, 200, 10000);
+try($FLEN-20000, 200, 20000);
+try($FLEN, 10000, undef);
+try($FLEN-10, 10000, undef);
+try($FLEN-100, 10000, undef);
+try($FLEN-1000, 200, undef);
+try($FLEN-10000, 200, undef);
+try($FLEN-20000, 200, undef);
+
+sub try {
+ my ($src, $dst, $len) = @_;
+ open F, "> $file" or die "Couldn't open file $file: $!";
+ binmode F;
+
+ # The record has exactly 17 characters. This will help ensure that
+ # even if _upcopy screws up, the data doesn't coincidentally
+ # look good because the remainder accidentally lines up.
+ my $d = substr("0123456789abcdef$:", -17);
+ my $recs = defined($FLEN) ?
+ int($FLEN/length($d))+1 : # enough to make up at least $FLEN
+ int(8192*5/length($d))+1; # at least 5 blocks' worth
+ my $oldfile = $d x $recs;
+ my $flen = defined($FLEN) ? $FLEN : $recs * 17;
+ substr($oldfile, $FLEN) = "" if defined $FLEN; # truncate
+ print F $oldfile;
+ close F;
+
+ die "wrong length!" unless -s $file == $flen;
+
+ # If len is specified, use that. If it's undef,
+ # then behave *as if* we had specified the whole rest of the file
+ my $expected = $oldfile;
+ if (defined $len) {
+ substr($expected, $dst, $len) = substr($expected, $src, $len);
+ } else {
+ substr($expected, $dst) = substr($expected, $src);
+ }
+
+ my $o = tie my @lines, 'Tie::File', $file or die $!;
+ local $SIG{ALRM} = sub { die "Alarm clock" };
+ my $a_retval = eval { alarm(5) unless $^P; $o->_upcopy($src, $dst, $len) };
+ my $err = $@;
+ undef $o; untie @lines; alarm(0);
+ if ($err) {
+ if ($err =~ /^Alarm clock/) {
+ print "# Timeout\n";
+ print "not ok $N\n"; $N++;
+ return;
+ } else {
+ $@ = $err;
+ die;
+ }
+ }
+
+ open F, "< $file" or die "Couldn't open file $file: $!";
+ binmode F;
+ my $actual;
+ { local $/;
+ $actual = <F>;
+ }
+ close F;
+
+ my ($alen, $xlen) = (length $actual, length $expected);
+ unless ($alen == $xlen) {
+ print "# try(@_) expected file length $xlen, actual $alen!\n";
+ }
+ print $actual eq $expected ? "ok $N\n" : "not ok $N\n";
+ $N++;
+}
+
+
+
+use POSIX 'SEEK_SET';
+sub check_contents {
+ my @c = @_;
+ my $x = join $:, @c, '';
+ local *FH = $o->{fh};
+ seek FH, 0, SEEK_SET;
+# my $open = open FH, "< $file";
+ my $a;
+ { local $/; $a = <FH> }
+ $a = "" unless defined $a;
+ if ($a eq $x) {
+ print "ok $N\n";
+ } else {
+ ctrlfix($a, $x);
+ print "not ok $N\n# expected <$x>, got <$a>\n";
+ }
+ $N++;
+
+ # now check FETCH:
+ my $good = 1;
+ my $msg;
+ for (0.. $#c) {
+ my $aa = $a[$_];
+ unless ($aa eq "$c[$_]$:") {
+ $msg = "expected <$c[$_]$:>, got <$aa>";
+ ctrlfix($msg);
+ $good = 0;
+ }
+ }
+ print $good ? "ok $N\n" : "not ok $N # $msg\n";
+ $N++;
+
+ print $o->_check_integrity($file, $ENV{INTEGRITY})
+ ? "ok $N\n" : "not ok $N\n";
+ $N++;
+}
+
+sub ctrlfix {
+ for (@_) {
+ s/\n/\\n/g;
+ s/\r/\\r/g;
+ }
+}
+
+END {
+ undef $o;
+ untie @a;
+ 1 while unlink $file;
+}
+
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/30_defer.t b/gnu/usr.bin/perl/lib/Tie/File/t/30_defer.t
index 7503829eee8..063b3a70903 100644
--- a/gnu/usr.bin/perl/lib/Tie/File/t/30_defer.t
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/30_defer.t
@@ -125,17 +125,14 @@ check_caches({map(($_ => "record$_$:"), 5..7)},
check_contents($data);
$a[2] = "recordC"; # That should flush the whole darn defer
-# Flushing the defer requires looking up the true lengths of records
-# 0..2, which flushes out the read cache, leaving only 1..2 there.
-# Then the splicer updates the cached versions of 1..2 to contain the
-# new data
-check_caches({1 => "recordB$:", 2 => "recordC$:"},
+# This shouldn't change the cache contents
+check_caches({map(($_ => "record$_$:"), 5..7)},
{}); # URRRP
check_contents(join("$:", qw(recordA recordB recordC
record3 record4 record5 record6 record7)) . "$:");
$a[3] = "recordD"; # even though we flushed, deferring is STILL ENABLED
-check_caches({1 => "recordB$:", 2 => "recordC$:"},
+check_caches({map(($_ => "record$_$:"), 5..7)},
{3 => "recordD$:"});
check_contents(join("$:", qw(recordA recordB recordC
record3 record4 record5 record6 record7)) . "$:");
@@ -143,86 +140,84 @@ check_contents(join("$:", qw(recordA recordB recordC
# Check readcache-deferbuffer interactions
# (45-47) This should remove outdated data from the read cache
-$a[2] = "recordE";
-check_caches({1 => "recordB$:", },
- {3 => "recordD$:", 2 => "recordE$:"});
+$a[5] = "recordE";
+check_caches({6 => "record6$:", 7 => "record7$:"},
+ {3 => "recordD$:", 5 => "recordE$:"});
check_contents(join("$:", qw(recordA recordB recordC
record3 record4 record5 record6 record7)) . "$:");
# (48-51) This should read back out of the defer buffer
# without adding anything to the read cache
my $z;
-$z = $a[2];
+$z = $a[5];
print $z eq "recordE" ? "ok $N\n" : "not ok $N\n"; $N++;
-check_caches({1 => "recordB$:", },
- {3 => "recordD$:", 2 => "recordE$:"});
+check_caches({6 => "record6$:", 7 => "record7$:"},
+ {3 => "recordD$:", 5 => "recordE$:"});
check_contents(join("$:", qw(recordA recordB recordC
record3 record4 record5 record6 record7)) . "$:");
# (52-55) This should repopulate the read cache with a new record
$z = $a[0];
print $z eq "recordA" ? "ok $N\n" : "not ok $N\n"; $N++;
-check_caches({1 => "recordB$:", 0 => "recordA$:"},
- {3 => "recordD$:", 2 => "recordE$:"});
+check_caches({0 => "recordA$:", 6 => "record6$:", 7 => "record7$:"},
+ {3 => "recordD$:", 5 => "recordE$:"});
check_contents(join("$:", qw(recordA recordB recordC
record3 record4 record5 record6 record7)) . "$:");
# (56-59) This should flush the LRU record from the read cache
-$z = $a[4]; $z = $a[5];
-print $z eq "record5" ? "ok $N\n" : "not ok $N\n"; $N++;
-check_caches({5 => "record5$:", 0 => "recordA$:", 4 => "record4$:"},
- {3 => "recordD$:", 2 => "recordE$:"});
+$z = $a[4];
+print $z eq "record4" ? "ok $N\n" : "not ok $N\n"; $N++;
+check_caches({7 => "record7$:", 0 => "recordA$:", 4 => "record4$:"},
+ {3 => "recordD$:", 5 => "recordE$:"});
check_contents(join("$:", qw(recordA recordB recordC
record3 record4 record5 record6 record7)) . "$:");
# (60-63) This should FLUSH the deferred buffer
-# In doing so, it will read in records 2 and 3, flushing 0 and 4
-# from the read cache, leaving 2, 3, and 5.
$z = splice @a, 3, 1, "recordZ";
print $z eq "recordD" ? "ok $N\n" : "not ok $N\n"; $N++;
-check_caches({5 => "record5$:", 3 => "recordZ$:", 2 => "recordE$:"},
+check_caches({7 => "record7$:", 0 => "recordA$:", 4 => "record4$:", 3 => "recordZ$:"},
{});
-check_contents(join("$:", qw(recordA recordB recordE
- recordZ record4 record5 record6 record7)) . "$:");
+check_contents(join("$:", qw(recordA recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:");
# (64-66) We should STILL be in deferred writing mode
$a[5] = "recordX";
-check_caches({3 => "recordZ$:", 2 => "recordE$:"},
+check_caches({7 => "record7$:", 0 => "recordA$:", 4 => "record4$:", 3 => "recordZ$:"},
{5 => "recordX$:"});
-check_contents(join("$:", qw(recordA recordB recordE
- recordZ record4 record5 record6 record7)) . "$:");
+check_contents(join("$:", qw(recordA recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:");
# Fill up the defer buffer again
$a[4] = "recordP";
# (67-69) This should OVERWRITE the existing deferred record
# and NOT flush the buffer
$a[5] = "recordQ";
-check_caches({3 => "recordZ$:", 2 => "recordE$:"},
+check_caches({7 => "record7$:", 0 => "recordA$:", 3 => "recordZ$:"},
{5 => "recordQ$:", 4 => "recordP$:"});
-check_contents(join("$:", qw(recordA recordB recordE
- recordZ record4 record5 record6 record7)) . "$:");
-
+check_contents(join("$:", qw(recordA recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:");
# (70-72) Discard should just dump the whole deferbuffer
$o->discard;
-check_caches({3 => "recordZ$:", 2 => "recordE$:"},
+check_caches({7 => "record7$:", 0 => "recordA$:", 3 => "recordZ$:"},
{});
-check_contents(join("$:", qw(recordA recordB recordE
- recordZ record4 record5 record6 record7)) . "$:");
+check_contents(join("$:", qw(recordA recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:");
+
# (73-75) NOW we are out of deferred writing mode
$a[0] = "recordF";
-check_caches({3 => "recordZ$:", 2 => "recordE$:", 0 => "recordF$:"},
+check_caches({7 => "record7$:", 0 => "recordF$:", 3 => "recordZ$:"},
{});
-check_contents(join("$:", qw(recordF recordB recordE
- recordZ record4 record5 record6 record7)) . "$:");
+check_contents(join("$:", qw(recordF recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:");
# (76-79) Last call--untying the array should flush the deferbuffer
$o->defer;
$a[0] = "flushed";
-check_caches({3 => "recordZ$:", 2 => "recordE$:"},
+check_caches({7 => "record7$:", 3 => "recordZ$:"},
{0 => "flushed$:" });
-check_contents(join("$:", qw(recordF recordB recordE
- recordZ record4 record5 record6 record7)) . "$:");
+check_contents(join("$:", qw(recordF recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:");
undef $o;
untie @a;
# (79) We can't use check_contents any more, because the object is dead
@@ -230,8 +225,8 @@ open F, "< $file" or die;
binmode F;
{ local $/ ; $z = <F> }
close F;
-my $x = join("$:", qw(flushed recordB recordE
- recordZ record4 record5 record6 record7)) . "$:";
+my $x = join("$:", qw(flushed recordB recordC
+ recordZ record4 recordE record6 record7)) . "$:";
if ($z eq $x) {
print "ok $N\n";
} else {
@@ -326,6 +321,8 @@ sub ctrlfix {
}
END {
+ undef $o;
+ untie @a if tied @a;
1 while unlink $file;
}
diff --git a/gnu/usr.bin/perl/lib/Tie/File/t/42_offset.t b/gnu/usr.bin/perl/lib/Tie/File/t/42_offset.t
new file mode 100644
index 00000000000..1762443482c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Tie/File/t/42_offset.t
@@ -0,0 +1,74 @@
+#!/usr/bin/perl
+
+# 2003-04-09 Tels: test the offset method from 0.94
+
+use Test::More;
+use strict;
+use File::Spec;
+
+use POSIX 'SEEK_SET';
+my $file = "tf$$.txt";
+
+BEGIN
+ {
+ $| = 1;
+ if ($ENV{PERL_CORE})
+ {
+ # testing with the core distribution
+ @INC = ( File::Spec->catdir(File::Spec->updir, 't', 'lib') );
+ }
+ unshift @INC, File::Spec->catdir(File::Spec->updir, 'lib');
+ chdir 't' if -d 't';
+ print "# INC = @INC\n";
+
+ plan tests => 24;
+
+ use_ok ('Tie::File');
+ }
+
+$/ = "#"; # avoid problems with \n\r vs. \n
+
+my @a;
+my $o = tie @a, 'Tie::File', $file, autodefer => 0;
+
+is (ref($o), 'Tie::File');
+
+is ($o->offset(0), 0, 'first one always there');
+is ($o->offset(1), undef, 'no offsets yet');
+
+$a[0] = 'Bourbon';
+is ($o->offset(0), 0, 'first is ok');
+is ($o->offset(1), 8, 'and second ok');
+is ($o->offset(2), undef, 'third undef');
+
+$a[1] = 'makes';
+is ($o->offset(0), 0, 'first is ok');
+is ($o->offset(1), 8, 'and second ok');
+is ($o->offset(2), 14, 'and third ok');
+is ($o->offset(3), undef, 'fourth undef');
+
+$a[2] = 'the baby';
+is ($o->offset(0), 0, 'first is ok');
+is ($o->offset(1), 8, 'and second ok');
+is ($o->offset(2), 14, 'and third ok');
+is ($o->offset(3), 23, 'and fourth ok');
+is ($o->offset(4), undef, 'fourth undef');
+
+$a[3] = 'grin';
+is ($o->offset(0), 0, 'first is ok');
+is ($o->offset(1), 8, 'and second ok');
+is ($o->offset(2), 14, 'and third ok');
+is ($o->offset(3), 23, 'and fourth ok');
+is ($o->offset(4), 28, 'and fifth ok');
+
+$a[4] = '!';
+is ($o->offset(5), 30, 'and fifth ok');
+$a[3] = 'water';
+is ($o->offset(4), 29, 'and fourth changed ok');
+is ($o->offset(5), 31, 'and fifth ok');
+
+END {
+ undef $o;
+ untie @a;
+ 1 while unlink $file;
+}
diff --git a/gnu/usr.bin/perl/lib/Tie/RefHash.t b/gnu/usr.bin/perl/lib/Tie/RefHash.t
index d80b2e10fc9..52e3a2d5e9a 100644
--- a/gnu/usr.bin/perl/lib/Tie/RefHash.t
+++ b/gnu/usr.bin/perl/lib/Tie/RefHash.t
@@ -18,12 +18,18 @@ BEGIN {
use strict;
use Tie::RefHash;
use Data::Dumper;
-my $numtests = 34;
+my $numtests = 37;
my $currtest = 1;
print "1..$numtests\n";
my $ref = []; my $ref1 = [];
+package Boustrophedon; # A class with overloaded "".
+sub new { my ($c, $s) = @_; bless \$s, $c }
+use overload '""' => sub { ${$_[0]} . reverse ${$_[0]} };
+package main;
+my $ox = Boustrophedon->new("foobar");
+
# Test standard hash functionality, by performing the same operations
# on a tied hash and on a normal hash, and checking that the results
# are the same. This does of course assume that Perl hashes are not
@@ -93,6 +99,10 @@ test(not defined $h{$ref});
test(not exists($h{$ref}));
test((keys %h) == 0);
test((values %h) == 0);
+$h{$ox} = "bellow"; # overloaded ""
+test(exists $h{$ox});
+test($h{$ox} eq "bellow");
+test(not exists $h{"foobarraboof"});
undef $h;
untie %h;
diff --git a/gnu/usr.bin/perl/lib/Time/Local.t b/gnu/usr.bin/perl/lib/Time/Local.t
index a384b171fdc..809dd92e1d7 100644
--- a/gnu/usr.bin/perl/lib/Time/Local.t
+++ b/gnu/usr.bin/perl/lib/Time/Local.t
@@ -1,8 +1,10 @@
#!./perl
BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
+ if ($ENV{PERL_CORE}){
+ chdir('t') if -d 't';
+ @INC = ('.', '../lib');
+ }
}
use Time::Local;
@@ -28,7 +30,10 @@ use Time::Local;
# use vmsish 'time' makes for oddness around the Unix epoch
if ($^O eq 'VMS') { $time[0][2]++ }
-print "1..", @time * 2 + 5, "\n";
+my $tests = @time * 2 + 4;
+$tests += 2 if $ENV{PERL_CORE};
+
+print "1..$tests\n";
$count = 1;
for (@time) {
@@ -93,12 +98,26 @@ timegm(0,0,0, 1, 2, 80) - timegm(0,0,0, 1, 0, 80) == 60 * 24 * 3600
or print "not ";
print "ok ", $count++, "\n";
+# bugid #19393
+# At a DST transition, the clock skips forward, eg from 01:59:59 to
+# 03:00:00. In this case, 02:00:00 is an invalid time, and should be
+# treated like 03:00:00 rather than 01:00:00 - negative zone offsets used
+# to do the latter
+{
+ my $hour = (localtime(timelocal(0, 0, 2, 7, 3, 102)))[2];
+ # testers in US/Pacific should get 3,
+ # other testers should get 2
+ print "not " unless $hour == 2 || $hour == 3;
+ print "ok ", $main::count++, "\n";
+}
-#print "Testing timelocal.pl module too...\n";
-package test;
-require 'timelocal.pl';
-timegm(0,0,0,1,0,80) == main::timegm(0,0,0,1,0,80) or print "not ";
-print "ok ", $main::count++, "\n";
+if ($ENV{PERL_CORE}) {
+ #print "Testing timelocal.pl module too...\n";
+ package test;
+ require 'timelocal.pl';
+ timegm(0,0,0,1,0,80) == main::timegm(0,0,0,1,0,80) or print "not ";
+ print "ok ", $main::count++, "\n";
-timelocal(1,2,3,4,5,88) == main::timelocal(1,2,3,4,5,88) or print "not ";
-print "ok ", $main::count++, "\n";
+ timelocal(1,2,3,4,5,88) == main::timelocal(1,2,3,4,5,88) or print "not ";
+ print "ok ", $main::count++, "\n";
+}
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate.pm b/gnu/usr.bin/perl/lib/Unicode/Collate.pm
index 51c290ec879..a4d6d80cd1a 100644
--- a/gnu/usr.bin/perl/lib/Unicode/Collate.pm
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate.pm
@@ -1,8 +1,8 @@
package Unicode::Collate;
BEGIN {
- if (ord("A") == 193) {
- die "Unicode::Collate not ported to EBCDIC\n";
+ unless ("A" eq pack('U', 0x41)) {
+ die "Unicode::Collate cannot stringify a Unicode code point\n";
}
}
@@ -14,7 +14,7 @@ use File::Spec;
require Exporter;
-our $VERSION = '0.12';
+our $VERSION = '0.30';
our $PACKAGE = __PACKAGE__;
our @ISA = qw(Exporter);
@@ -26,124 +26,272 @@ our @EXPORT = ();
(our $Path = $INC{'Unicode/Collate.pm'}) =~ s/\.pm$//;
our $KeyFile = "allkeys.txt";
-our $UNICODE_VERSION;
+# Perl's boolean
+use constant TRUE => 1;
+use constant FALSE => "";
+use constant NOMATCHPOS => -1;
+
+# A coderef to get combining class imported from Unicode::Normalize
+# (i.e. \&Unicode::Normalize::getCombinClass).
+# This is also used as a HAS_UNICODE_NORMALIZE flag.
+our $CVgetCombinClass;
+
+# Supported Levels
+use constant MinLevel => 1;
+use constant MaxLevel => 4;
+
+# Minimum weights at level 2 and 3, respectively
+use constant Min2Wt => 0x20;
+use constant Min3Wt => 0x02;
+
+# Shifted weight at 4th level
+use constant Shift4Wt => 0xFFFF;
+
+# Variable weight at 1st level.
+# This is a negative value but should be regarded as zero on collation.
+# This is for distinction of variable chars from level 3 ignorable chars.
+use constant Var1Wt => -1;
+
+
+# A boolean for Variable and 16-bit weights at 4 levels of Collation Element
+# PROBLEM: The Default Unicode Collation Element Table
+# has weights over 0xFFFF at the 4th level.
+# The tie-breaking in the variable weights
+# other than "shift" (as well as "shift-trimmed") is unreliable.
+use constant VCE_TEMPLATE => 'Cn4';
+
+# A sort key: 16-bit weights
+# See also the PROBLEM on VCE_TEMPLATE above.
+use constant KEY_TEMPLATE => 'n*';
+
+# Level separator in a sort key:
+# i.e. pack(KEY_TEMPLATE, 0)
+use constant LEVEL_SEP => "\0\0";
+
+# As Unicode code point separator for hash keys.
+# A joined code point string (denoted by JCPS below)
+# like "65;768" is used for internal processing
+# instead of Perl's Unicode string like "\x41\x{300}",
+# as the native code point is different from the Unicode code point
+# on EBCDIC platform.
+# This character must not be included in any stringified
+# representation of an integer.
+use constant CODE_SEP => ';';
+
+# boolean values of variable weights
+use constant NON_VAR => 0; # Non-Variable character
+use constant VAR => 1; # Variable character
+
+# specific code points
+use constant Hangul_LBase => 0x1100;
+use constant Hangul_LIni => 0x1100;
+use constant Hangul_LFin => 0x1159;
+use constant Hangul_LFill => 0x115F;
+use constant Hangul_VBase => 0x1161;
+use constant Hangul_VIni => 0x1160;
+use constant Hangul_VFin => 0x11A2;
+use constant Hangul_TBase => 0x11A7;
+use constant Hangul_TIni => 0x11A8;
+use constant Hangul_TFin => 0x11F9;
+use constant Hangul_TCount => 28;
+use constant Hangul_NCount => 588;
+use constant Hangul_SBase => 0xAC00;
+use constant Hangul_SIni => 0xAC00;
+use constant Hangul_SFin => 0xD7A3;
+use constant CJK_UidIni => 0x4E00;
+use constant CJK_UidFin => 0x9FA5;
+use constant CJK_ExtAIni => 0x3400;
+use constant CJK_ExtAFin => 0x4DB5;
+use constant CJK_ExtBIni => 0x20000;
+use constant CJK_ExtBFin => 0x2A6D6;
+use constant BMP_Max => 0xFFFF;
+
+# Logical_Order_Exception in PropList.txt
+# TODO: synchronization with change of PropList.txt.
+our $DefaultRearrange = [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ];
+
+sub UCA_Version { "11" }
+
+sub Base_Unicode_Version { "4.0" }
-eval { require Unicode::UCD };
+######
-unless ($@) {
- $UNICODE_VERSION = Unicode::UCD::UnicodeVersion();
+sub pack_U {
+ return pack('U*', @_);
}
-else { # XXX, Perl 5.6.1
- my($f, $fh);
- foreach my $d (@INC) {
- use File::Spec;
- $f = File::Spec->catfile($d, "unicode", "Unicode.301");
- if (open($fh, $f)) {
- $UNICODE_VERSION = '3.0.1';
- close $fh;
- last;
- }
- }
+
+sub unpack_U {
+ return unpack('U*', pack('U*').shift);
}
-our $getCombinClass; # coderef for combining class from Unicode::Normalize
+######
+
+my (%VariableOK);
+@VariableOK{ qw/
+ blanked non-ignorable shifted shift-trimmed
+ / } = (); # keys lowercased
+
+our @ChangeOK = qw/
+ alternate backwards level normalization rearrange
+ katakana_before_hiragana upper_before_lower
+ overrideHangul overrideCJK preprocess UCA_Version
+ hangul_terminator variable
+ /;
+
+our @ChangeNG = qw/
+ entry mapping table maxlength
+ ignoreChar ignoreName undefChar undefName variableTable
+ versionTable alternateTable backwardsTable forwardsTable rearrangeTable
+ derivCode normCode rearrangeHash L3_ignorable
+ backwardsFlag
+ /;
+# The hash key 'ignored' is deleted at v 0.21.
+# The hash key 'isShift' is deleted at v 0.23.
+# The hash key 'combining' is deleted at v 0.24.
+# The hash key 'entries' is deleted at v 0.30.
+
+sub version {
+ my $self = shift;
+ return $self->{versionTable} || 'unknown';
+}
-use constant Min2 => 0x20; # minimum weight at level 2
-use constant Min3 => 0x02; # minimum weight at level 3
-use constant UNDEFINED => 0xFF80; # special value for undefined CE's
+my (%ChangeOK, %ChangeNG);
+@ChangeOK{ @ChangeOK } = ();
+@ChangeNG{ @ChangeNG } = ();
-our $DefaultRearrange = [ 0x0E40..0x0E44, 0x0EC0..0x0EC4 ];
+sub change {
+ my $self = shift;
+ my %hash = @_;
+ my %old;
+ if (exists $hash{variable} && exists $hash{alternate}) {
+ delete $hash{alternate};
+ }
+ elsif (!exists $hash{variable} && exists $hash{alternate}) {
+ $hash{variable} = $hash{alternate};
+ }
+ foreach my $k (keys %hash) {
+ if (exists $ChangeOK{$k}) {
+ $old{$k} = $self->{$k};
+ $self->{$k} = $hash{$k};
+ }
+ elsif (exists $ChangeNG{$k}) {
+ croak "change of $k via change() is not allowed!";
+ }
+ # else => ignored
+ }
+ $self->checkCollator;
+ return wantarray ? %old : $self;
+}
-sub UCA_Version { "8.0" }
+sub _checkLevel {
+ my $level = shift;
+ my $key = shift;
+ croak sprintf "Illegal level %d (in \$self->{%s}) lower than %d.",
+ $level, $key, MinLevel if MinLevel > $level;
+ croak sprintf "Unsupported level %d (in \$self->{%s}) higher than %d ",
+ $level, $key, MaxLevel if MaxLevel < $level;
+}
-sub Base_Unicode_Version { $UNICODE_VERSION || 'unknown' }
+my %DerivCode = (
+ 8 => \&_derivCE_8,
+ 9 => \&_derivCE_9,
+ 11 => \&_derivCE_9, # 11 == 9
+);
-##
-## constructor
-##
-sub new
-{
- my $class = shift;
- my $self = bless { @_ }, $class;
+sub checkCollator {
+ my $self = shift;
+ _checkLevel($self->{level}, "level");
- # alternate lowercased
- $self->{alternate} =
- ! exists $self->{alternate} ? 'shifted' : lc($self->{alternate});
+ $self->{derivCode} = $DerivCode{ $self->{UCA_Version} }
+ or croak "Illegal UCA version (passed $self->{UCA_Version}).";
- croak "$PACKAGE unknown alternate tag name: $self->{alternate}"
- unless $self->{alternate} eq 'blanked'
- || $self->{alternate} eq 'non-ignorable'
- || $self->{alternate} eq 'shifted'
- || $self->{alternate} eq 'shift-trimmed';
+ $self->{variable} ||= $self->{alternate} || $self->{variableTable} ||
+ $self->{alternateTable} || $self->{alternate} || 'shifted';
+ $self->{variable} = $self->{alternate} = lc($self->{variable});
+ exists $VariableOK{ $self->{variable} }
+ or croak "$PACKAGE unknown variable tag name: $self->{variable}";
- # collation level
- $self->{level} ||= 4;
+ if (! defined $self->{backwards}) {
+ $self->{backwardsFlag} = 0;
+ }
+ elsif (! ref $self->{backwards}) {
+ _checkLevel($self->{backwards}, "backwards");
+ $self->{backwardsFlag} = 1 << $self->{backwards};
+ }
+ else {
+ my %level;
+ $self->{backwardsFlag} = 0;
+ for my $b (@{ $self->{backwards} }) {
+ _checkLevel($b, "backwards");
+ $level{$b} = 1;
+ }
+ for my $v (sort keys %level) {
+ $self->{backwardsFlag} += 1 << $v;
+ }
+ }
- croak "Illegal level lower than 1 (passed $self->{level})."
- if $self->{level} < 1;
- croak "A level higher than 4 (passed $self->{level}) is not supported."
- if 4 < $self->{level};
+ defined $self->{rearrange} or $self->{rearrange} = [];
+ ref $self->{rearrange}
+ or croak "$PACKAGE: list for rearrangement must be store in ARRAYREF";
- # overrideHangul and -CJK
- # If true: CODEREF used; '': default; undef: derived elements
- $self->{overrideHangul} = ''
- if ! exists $self->{overrideHangul};
- $self->{overrideCJK} = ''
- if ! exists $self->{overrideCJK};
+ # keys of $self->{rearrangeHash} are $self->{rearrange}.
+ $self->{rearrangeHash} = undef;
- # normalization form
- $self->{normalization} = 'D'
- if ! exists $self->{normalization};
- $self->{UNF} = undef;
+ if (@{ $self->{rearrange} }) {
+ @{ $self->{rearrangeHash} }{ @{ $self->{rearrange} } } = ();
+ }
+
+ $self->{normCode} = undef;
if (defined $self->{normalization}) {
eval { require Unicode::Normalize };
- croak "Unicode/Normalize.pm is required to normalize strings: $@"
- if $@;
-
- Unicode::Normalize->import();
- $getCombinClass = \&Unicode::Normalize::getCombinClass
- if ! $getCombinClass;
-
- $self->{UNF} =
- $self->{normalization} =~ /^(?:NF)?C$/ ? \&NFC :
- $self->{normalization} =~ /^(?:NF)?D$/ ? \&NFD :
- $self->{normalization} =~ /^(?:NF)?KC$/ ? \&NFKC :
- $self->{normalization} =~ /^(?:NF)?KD$/ ? \&NFKD :
- croak "$PACKAGE unknown normalization form name: "
- . $self->{normalization};
+ $@ and croak "Unicode::Normalize is required to normalize strings";
+
+ $CVgetCombinClass ||= \&Unicode::Normalize::getCombinClass;
+
+ if ($self->{normalization} =~ /^(?:NF)D\z/) { # tweak for default
+ $self->{normCode} = \&Unicode::Normalize::NFD;
+ }
+ elsif ($self->{normalization} ne 'prenormalized') {
+ my $norm = $self->{normalization};
+ $self->{normCode} = sub {
+ Unicode::Normalize::normalize($norm, shift);
+ };
+ eval { $self->{normCode}->("") }; # try
+ $@ and croak "$PACKAGE unknown normalization form name: $norm";
+ }
}
+ return;
+}
+
+sub new
+{
+ my $class = shift;
+ my $self = bless { @_ }, $class;
- # Open a table file.
# If undef is passed explicitly, no file is read.
- $self->{table} = $KeyFile
- if ! exists $self->{table};
- $self->read_table
- if defined $self->{table};
+ $self->{table} = $KeyFile if ! exists $self->{table};
+ $self->read_table if defined $self->{table};
if ($self->{entry}) {
$self->parseEntry($_) foreach split /\n/, $self->{entry};
}
- # backwards
- $self->{backwards} ||= [ ];
- $self->{backwards} = [ $self->{backwards} ]
- if ! ref $self->{backwards};
+ $self->{level} ||= MaxLevel;
+ $self->{UCA_Version} ||= UCA_Version();
- # rearrange
- $self->{rearrange} = $DefaultRearrange
+ $self->{overrideHangul} = ''
+ if ! exists $self->{overrideHangul};
+ $self->{overrideCJK} = ''
+ if ! exists $self->{overrideCJK};
+ $self->{normalization} = 'NFD'
+ if ! exists $self->{normalization};
+ $self->{rearrange} = $self->{rearrangeTable} || $DefaultRearrange
if ! exists $self->{rearrange};
- $self->{rearrange} = []
- if ! defined $self->{rearrange};
- croak "$PACKAGE: A list for rearrangement must be store in an ARRAYREF"
- if ! ref $self->{rearrange};
+ $self->{backwards} = $self->{backwardsTable}
+ if ! exists $self->{backwards};
- # keys of $self->{rearrangeHash} are $self->{rearrange}.
- $self->{rearrangeHash} = undef;
-
- if (@{ $self->{rearrange} }) {
- @{ $self->{rearrangeHash} }{ @{ $self->{rearrange} } } = ();
- }
+ $self->checkCollator;
return $self;
}
@@ -159,17 +307,23 @@ sub read_table {
while (<$fk>) {
next if /^\s*#/;
if (/^\s*\@/) {
- if (/^\@version\s*(\S*)/) {
- $self->{version} ||= $1;
+ if (/^\s*\@version\s*(\S*)/) {
+ $self->{versionTable} ||= $1;
}
- elsif (/^\@alternate\s+(.*)/) {
- $self->{alternate} ||= $1;
+ elsif (/^\s*\@variable\s+(\S*)/) { # since UTS #10-9
+ $self->{variableTable} ||= $1;
}
- elsif (/^\@backwards\s+(.*)/) {
- push @{ $self->{backwards} }, $1;
+ elsif (/^\s*\@alternate\s+(\S*)/) { # till UTS #10-8
+ $self->{alternateTable} ||= $1;
}
- elsif (/^\@rearrange\s+(.*)/) {
- push @{ $self->{rearrange} }, _getHexArray($1);
+ elsif (/^\s*\@backwards\s+(\S*)/) {
+ push @{ $self->{backwardsTable} }, $1;
+ }
+ elsif (/^\s*\@forwards\s+(\S*)/) { # parhaps no use
+ push @{ $self->{forwardsTable} }, $1;
+ }
+ elsif (/^\s*\@rearrange\s+(.*)/) { # (\S*) is NG
+ push @{ $self->{rearrangeTable} }, _getHexArray($1);
}
next;
}
@@ -186,7 +340,7 @@ sub parseEntry
{
my $self = shift;
my $line = shift;
- my($name, $ele, @key);
+ my($name, $entry, @uv, @key);
return if $line !~ /^\s*[0-9A-Fa-f]/;
@@ -200,84 +354,135 @@ sub parseEntry
croak "Wrong Entry: <charList> must be separated by ';' from <collElement>"
if ! $k;
- my @e = _getHexArray($e);
- $ele = pack('U*', @e);
- return if defined $self->{undefChar} && $ele =~ /$self->{undefChar}/;
+ @uv = _getHexArray($e);
+ return if !@uv;
+
+ $entry = join(CODE_SEP, @uv); # in JCPS
- # get sort key
- if (defined $self->{ignoreName} && $name =~ /$self->{ignoreName}/ ||
- defined $self->{ignoreChar} && $ele =~ /$self->{ignoreChar}/)
- {
- $self->{entries}{$ele} = $self->{ignored}{$ele} = 1;
+ if (defined $self->{undefChar} || defined $self->{ignoreChar}) {
+ my $ele = pack_U(@uv);
+
+ # regarded as if it were not entried in the table
+ return
+ if defined $self->{undefChar} && $ele =~ /$self->{undefChar}/;
+
+ # replaced as completely ignorable
+ $k = '[.0000.0000.0000.0000]'
+ if defined $self->{ignoreChar} && $ele =~ /$self->{ignoreChar}/;
}
- else {
- my $combining = 1; # primary = 0, secondary != 0;
- foreach my $arr ($k =~ /\[([^\[\]]+)\]/g) { # SPACEs allowed
- my $var = $arr =~ /\*/; # exactly /^\*/ but be lenient.
- push @key, $self->altCE($var, _getHexArray($arr));
- $combining = 0 unless $key[-1][0] == 0 && $key[-1][1] != 0;
- }
- $self->{entries}{$ele} = \@key;
- $self->{combining}{$ele} = 1 if $combining;
+ # replaced as completely ignorable
+ $k = '[.0000.0000.0000.0000]'
+ if defined $self->{ignoreName} && $name =~ /$self->{ignoreName}/;
+
+ my $is_L3_ignorable = TRUE;
+
+ foreach my $arr ($k =~ /\[([^\[\]]+)\]/g) { # SPACEs allowed
+ my $var = $arr =~ /\*/; # exactly /^\*/ but be lenient.
+ my @wt = _getHexArray($arr);
+ push @key, pack(VCE_TEMPLATE, $var, @wt);
+ $is_L3_ignorable = FALSE
+ if $wt[0] + $wt[1] + $wt[2] != 0;
+ # if $arr !~ /[1-9A-Fa-f]/; NG
+ # Conformance Test shows L3-ignorable is completely ignorable.
+ # For expansion, an entry $is_L3_ignorable
+ # if and only if "all" CEs are [.0000.0000.0000].
+ }
+
+ $self->{mapping}{$entry} = \@key;
+
+ if (@uv > 1) {
+ (!$self->{maxlength}{$uv[0]} || $self->{maxlength}{$uv[0]} < @uv)
+ and $self->{maxlength}{$uv[0]} = @uv;
+ }
+ else {
+ $is_L3_ignorable
+ ? ($self->{L3_ignorable}{$uv[0]} = TRUE)
+ : ($self->{L3_ignorable}{$uv[0]} and
+ $self->{L3_ignorable}{$uv[0]} = FALSE); # &&= stores key.
}
- $self->{maxlength}{ord $ele} = scalar @e if @e > 1;
}
##
-## arrayref CE = altCE(bool variable?, list[num] weights)
+## arrayref[weights] = varCE(VCE)
##
-sub altCE
+sub varCE
{
my $self = shift;
- my $var = shift;
- my @c = @_;
-
- $self->{alternate} eq 'blanked' ?
- $var ? [0,0,0,$c[3]] : \@c :
- $self->{alternate} eq 'non-ignorable' ?
- \@c :
- $self->{alternate} eq 'shifted' ?
- $var ? [0,0,0,$c[0] ] : [ @c[0..2], $c[0]+$c[1]+$c[2] ? 0xFFFF : 0 ] :
- $self->{alternate} eq 'shift-trimmed' ?
- $var ? [0,0,0,$c[0] ] : [ @c[0..2], 0 ] :
- croak "$PACKAGE unknown alternate name: $self->{alternate}";
+ my($var, @wt) = unpack(VCE_TEMPLATE, shift);
+
+ $self->{variable} eq 'blanked' ?
+ $var ? [Var1Wt, 0, 0, $wt[3]] : \@wt :
+ $self->{variable} eq 'non-ignorable' ?
+ \@wt :
+ $self->{variable} eq 'shifted' ?
+ $var ? [Var1Wt, 0, 0, $wt[0] ]
+ : [ @wt[0..2], $wt[0]+$wt[1]+$wt[2] ? Shift4Wt : 0 ] :
+ $self->{variable} eq 'shift-trimmed' ?
+ $var ? [Var1Wt, 0, 0, $wt[0] ] : [ @wt[0..2], 0 ] :
+ croak "$PACKAGE unknown variable name: $self->{variable}";
}
-##
-## string hex_sortkey = splitCE(string arg)
-##
sub viewSortKey
{
my $self = shift;
- my $key = $self->getSortKey(@_);
- my $view = join " ", map sprintf("%04X", $_), unpack 'n*', $key;
- $view =~ s/ ?0000 ?/|/g;
+ $self->visualizeSortKey($self->getSortKey(@_));
+}
+
+sub visualizeSortKey
+{
+ my $self = shift;
+ my $view = join " ", map sprintf("%04X", $_), unpack(KEY_TEMPLATE, shift);
+
+ if ($self->{UCA_Version} <= 8) {
+ $view =~ s/ ?0000 ?/|/g;
+ } else {
+ $view =~ s/\b0000\b/|/g;
+ }
return "[$view]";
}
##
-## list[strings] elements = splitCE(string arg)
+## arrayref of JCPS = splitEnt(string to be collated)
+## arrayref of arrayref[JCPS, ini_pos, fin_pos] = splitEnt(string, true)
##
-sub splitCE
+sub splitEnt
{
my $self = shift;
+ my $wLen = $_[1];
+
my $code = $self->{preprocess};
- my $norm = $self->{UNF};
- my $ent = $self->{entries};
+ my $norm = $self->{normCode};
+ my $map = $self->{mapping};
my $max = $self->{maxlength};
my $reH = $self->{rearrangeHash};
+ my $ign = $self->{L3_ignorable};
+ my $ver9 = $self->{UCA_Version} >= 9;
+
+ my ($str, @buf);
- my $str = ref $code ? &$code(shift) : shift;
- $str = &$norm($str) if ref $norm;
+ if ($wLen) {
+ $code and croak "Preprocess breaks character positions. "
+ . "Don't use with index(), match(), etc.";
+ $norm and croak "Normalization breaks character positions. "
+ . "Don't use with index(), match(), etc.";
+ $str = $_[0];
+ }
+ else {
+ $str = $_[0];
+ $str = &$code($str) if ref $code;
+ $str = &$norm($str) if ref $norm;
+ }
- my @src = unpack('U*', $str);
- my @buf;
+ # get array of Unicode code point of string.
+ my @src = unpack_U($str);
- # rearrangement
- if ($reH) {
+ # rearrangement:
+ # Character positions are not kept if rearranged,
+ # then neglected if $wLen is true.
+ if ($reH && ! $wLen) {
for (my $i = 0; $i < @src; $i++) {
if (exists $reH->{ $src[$i] } && $i + 1 < @src) {
($src[$i], $src[$i+1]) = ($src[$i+1], $src[$i]);
@@ -286,192 +491,208 @@ sub splitCE
}
}
+ if ($ver9) {
+ # To remove a character marked as a completely ignorable.
+ for (my $i = 0; $i < @src; $i++) {
+ $src[$i] = undef if $ign->{ $src[$i] };
+ }
+ }
+
for (my $i = 0; $i < @src; $i++) {
- my $ch;
- my $u = $src[$i];
-
- # non-characters
- next unless defined $u;
- next if $u < 0 || 0x10FFFF < $u # out of range
- || (0xD800 <= $u && $u <= 0xDFFF); # unpaired surrogates
- my $four = $u & 0xFFFF;
- next if $four == 0xFFFE || $four == 0xFFFF;
-
- if ($max->{$u}) { # contract
- for (my $j = $max->{$u}; $j >= 1; $j--) {
- next unless $i+$j-1 < @src;
- $ch = pack 'U*', @src[$i .. $i+$j-1];
- $i += $j-1, last if $ent->{$ch};
+ next if _isNonCharacter($src[$i]);
+
+ my $i_orig = $i;
+ my $jcps = $src[$i];
+
+ if ($max->{$jcps}) { # contract
+ my $temp_jcps = $jcps;
+ my $jcpsLen = 1;
+ my $maxLen = $max->{$jcps};
+
+ for (my $p = $i + 1; $jcpsLen < $maxLen && $p < @src; $p++) {
+ next if ! defined $src[$p];
+ $temp_jcps .= CODE_SEP . $src[$p];
+ $jcpsLen++;
+ if ($map->{$temp_jcps}) {
+ $jcps = $temp_jcps;
+ $i = $p;
+ }
+ }
+
+ # not-contiguous contraction with Combining Char (cf. UTS#10, S2.1).
+ # This process requires Unicode::Normalize.
+ # If "normalization" is undef, here should be skipped *always*
+ # (in spite of bool value of $CVgetCombinClass),
+ # since canonical ordering cannot be expected.
+ # Blocked combining character should not be contracted.
+
+ if ($self->{normalization})
+ # $self->{normCode} is false in the case of "prenormalized".
+ {
+ my $preCC = 0;
+ my $curCC = 0;
+
+ for (my $p = $i + 1; $p < @src; $p++) {
+ next if ! defined $src[$p];
+ $curCC = $CVgetCombinClass->($src[$p]);
+ last unless $curCC;
+ my $tail = CODE_SEP . $src[$p];
+ if ($preCC != $curCC && $map->{$jcps.$tail}) {
+ $jcps .= $tail;
+ $src[$p] = undef;
+ } else {
+ $preCC = $curCC;
+ }
+ }
}
- } else {
- $ch = pack('U', $u);
}
- # with Combining Char (UTS#10, 4.2.1), here requires Unicode::Normalize.
- if ($getCombinClass && defined $ch) {
- for (my $j = $i+1; $j < @src; $j++) {
- next unless defined $src[$j];
- last unless $getCombinClass->( $src[$j] );
- my $comb = pack 'U', $src[$j];
- next if ! $ent->{ $ch.$comb };
- $ch .= $comb;
- $src[$j] = undef;
+ if ($wLen) {
+ for (my $p = $i + 1; $p < @src; $p++) {
+ last if defined $src[$p];
+ $i = $p;
}
}
- push @buf, $ch;
+
+ push @buf, $wLen ? [$jcps, $i_orig, $i + 1] : $jcps;
}
- wantarray ? @buf : \@buf;
+ return \@buf;
}
##
-## list[arrayrefs] weight = getWt(string element)
+## list of arrayrefs of weights = getWt(JCPS)
##
sub getWt
{
my $self = shift;
- my $ch = shift;
- my $ent = $self->{entries};
- my $ign = $self->{ignored};
- my $cjk = $self->{overrideCJK};
- my $hang = $self->{overrideHangul};
-
- return if !defined $ch || $ign->{$ch}; # ignored
- return @{ $ent->{$ch} } if $ent->{$ch};
- my $u = unpack('U', $ch);
-
- if (0xAC00 <= $u && $u <= 0xD7A3) { # is_Hangul
- return $hang
- ? &$hang($u)
- : defined $hang
- ? map({
- my $v = $_;
- my $ar = $ent->{pack('U', $v)};
- $ar ? @$ar : map($self->altCE(0,@$_), _derivCE($v));
- } _decompHangul($u))
- : map($self->altCE(0,@$_), _derivCE($u));
+ my $u = shift;
+ my $map = $self->{mapping};
+ my $der = $self->{derivCode};
+
+ return if !defined $u;
+ return map($self->varCE($_), @{ $map->{$u} })
+ if $map->{$u};
+
+ # JCPS must not be a contraction, then it's a code point.
+ if (Hangul_SIni <= $u && $u <= Hangul_SFin) {
+ my $hang = $self->{overrideHangul};
+ my @hangulCE;
+ if ($hang) {
+ @hangulCE = map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$hang($u));
+ }
+ elsif (!defined $hang) {
+ @hangulCE = $der->($u);
+ }
+ else {
+ my $max = $self->{maxlength};
+ my @decH = _decompHangul($u);
+
+ if (@decH == 2) {
+ my $contract = join(CODE_SEP, @decH);
+ @decH = ($contract) if $map->{$contract};
+ } else { # must be <@decH == 3>
+ if ($max->{$decH[0]}) {
+ my $contract = join(CODE_SEP, @decH);
+ if ($map->{$contract}) {
+ @decH = ($contract);
+ } else {
+ $contract = join(CODE_SEP, @decH[0,1]);
+ $map->{$contract} and @decH = ($contract, $decH[2]);
+ }
+ # even if V's ignorable, LT contraction is not supported.
+ # If such a situatution were required, NFD should be used.
+ }
+ if (@decH == 3 && $max->{$decH[1]}) {
+ my $contract = join(CODE_SEP, @decH[1,2]);
+ $map->{$contract} and @decH = ($decH[0], $contract);
+ }
+ }
+
+ @hangulCE = map({
+ $map->{$_} ? @{ $map->{$_} } : $der->($_);
+ } @decH);
+ }
+ return map $self->varCE($_), @hangulCE;
}
- elsif (0x3400 <= $u && $u <= 0x4DB5 ||
- 0x4E00 <= $u && $u <= 0x9FA5 ||
- 0x20000 <= $u && $u <= 0x2A6D6) { # is_CJK
- return $cjk
- ? &$cjk($u)
- : defined $cjk && $u <= 0xFFFF
- ? $self->altCE(0, ($u, 0x20, 0x02, $u))
- : map($self->altCE(0,@$_), _derivCE($u));
+ elsif (CJK_UidIni <= $u && $u <= CJK_UidFin ||
+ CJK_ExtAIni <= $u && $u <= CJK_ExtAFin ||
+ CJK_ExtBIni <= $u && $u <= CJK_ExtBFin) {
+ my $cjk = $self->{overrideCJK};
+ return map $self->varCE($_),
+ $cjk
+ ? map(pack(VCE_TEMPLATE, NON_VAR, @$_), &$cjk($u))
+ : defined $cjk && $self->{UCA_Version} <= 8 && $u <= BMP_Max
+ ? pack(VCE_TEMPLATE, NON_VAR, $u, Min2Wt, Min3Wt, $u)
+ : $der->($u);
}
else {
- return map($self->altCE(0,@$_), _derivCE($u));
+ return map $self->varCE($_), $der->($u);
}
}
+
##
-## int = index(string, substring)
+## string sortkey = getSortKey(string arg)
##
-sub index
+sub getSortKey
{
my $self = shift;
my $lev = $self->{level};
- my $comb = $self->{combining};
- my $str = $self->splitCE(shift);
- my $sub = $self->splitCE(shift);
-
- return wantarray ? (0,0) : 0 if ! @$sub;
- return wantarray ? () : -1 if ! @$str;
+ my $rEnt = $self->splitEnt(shift); # get an arrayref of JCPS
+ my $ver9 = $self->{UCA_Version} >= 9;
+ my $v2i = $self->{variable} ne 'non-ignorable';
- my @subWt = grep _ignorableAtLevel($_,$lev),
- map $self->getWt($_), @$sub;
-
- my(@strWt,@strPt);
- my $count = 0;
- for (my $i = 0; $i < @$str; $i++) {
- my $go_ahead = 0;
-
- my @tmp = grep _ignorableAtLevel($_,$lev), $self->getWt($str->[$i]);
- $go_ahead += length $str->[$i];
+ # weight arrays
+ my (@wts, @buf, $last_is_variable);
+
+ if ($self->{hangul_terminator}) {
+ my $preHST = '';
+ foreach my $jcps (@$rEnt) {
+ # weird things like VL, TL-contraction are not considered!
+ my $curHST = '';
+ foreach my $u (split /;/, $jcps) {
+ $curHST .= getHST($u);
+ }
+ if ($preHST && !$curHST || # hangul before non-hangul
+ $preHST =~ /L\z/ && $curHST =~ /^T/ ||
+ $preHST =~ /V\z/ && $curHST =~ /^L/ ||
+ $preHST =~ /T\z/ && $curHST =~ /^[LV]/) {
- # /*XXX*/ still broken.
- # index("e\x{300}", "e") should be 'no match' at level 2 or higher
- # as "e\x{300}" is a *single* grapheme cluster and not equal to "e".
+ push @wts, $self->varCE_HangulTerm;
+ }
+ $preHST = $curHST;
- # go ahead as far as we find a combining character;
- while ($i + 1 < @$str &&
- (! defined $str->[$i+1] || $comb->{ $str->[$i+1] }) ) {
- $i++;
- $go_ahead += length $str->[$i];
- next if ! defined $str->[$i];
- push @tmp,
- grep _ignorableAtLevel($_,$lev), $self->getWt($str->[$i]);
+ push @wts, $self->getWt($jcps);
}
-
- push @strWt, @tmp;
- push @strPt, ($count) x @tmp;
- $count += $go_ahead;
-
- while (@strWt >= @subWt) {
- if (_eqArray(\@strWt, \@subWt, $lev)) {
- my $pos = $strPt[0];
- return wantarray ? ($pos, $count-$pos) : $pos;
- }
- shift @strWt;
- shift @strPt;
+ $preHST # end at hangul
+ and push @wts, $self->varCE_HangulTerm;
+ }
+ else {
+ foreach my $jcps (@$rEnt) {
+ push @wts, $self->getWt($jcps);
}
}
- return wantarray ? () : -1;
-}
-##
-## bool _eqArray(arrayref, arrayref, level)
-##
-sub _eqArray($$$)
-{
- my $a = shift; # length $a >= length $b;
- my $b = shift;
- my $lev = shift;
- for my $v (0..$lev-1) {
- for my $c (0..@$b-1){
- return if $a->[$c][$v] != $b->[$c][$v];
+ foreach my $wt (@wts) {
+ if ($v2i && $ver9) {
+ if ($wt->[0] == 0) { # ignorable
+ next if $last_is_variable;
+ } else {
+ $last_is_variable = ($wt->[0] == Var1Wt);
+ }
}
+ push @buf, $wt;
}
- return 1;
-}
-
-
-##
-## bool _ignorableAtLevel(CE, level)
-##
-sub _ignorableAtLevel($$)
-{
- my $ce = shift;
- return unless defined $ce;
- my $lv = shift;
- return ! grep { ! $ce->[$_] } 0..$lv-1;
-}
-
-
-##
-## string sortkey = getSortKey(string arg)
-##
-sub getSortKey
-{
- my $self = shift;
- my $lev = $self->{level};
- my $rCE = $self->splitCE(shift); # get an arrayref
-
- # weight arrays
- my @buf = grep defined(), map $self->getWt($_), @$rCE;
# make sort key
my @ret = ([],[],[],[]);
foreach my $v (0..$lev-1) {
foreach my $b (@buf) {
- push @{ $ret[$v] }, $b->[$v] if $b->[$v];
+ push @{ $ret[$v] }, $b->[$v]
+ if 0 < $b->[$v];
}
}
- foreach (@{ $self->{backwards} }) {
- my $v = $_ - 1;
- @{ $ret[$v] } = reverse @{ $ret[$v] };
- }
# modification of tertiary weights
if ($self->{upper_before_lower}) {
@@ -488,7 +709,16 @@ sub getSortKey
elsif (0x0D <= $_ && $_ <= 0x0E) { $_ += 5 } # hiragana
}
}
- join "\0\0", map pack('n*', @$_), @ret;
+
+ if ($self->{backwardsFlag}) {
+ for (my $v = MinLevel; $v <= MaxLevel; $v++) {
+ if ($self->{backwardsFlag} & (1 << $v)) {
+ @{ $ret[$v-1] } = reverse @{ $ret[$v-1] };
+ }
+ }
+ }
+
+ join LEVEL_SEP, map pack(KEY_TEMPLATE, @$_), @ret;
}
@@ -514,40 +744,320 @@ sub sort {
map [ $obj->getSortKey($_), $_ ], @_;
}
-##
-## list[arrayrefs] CE = _derivCE(int codepoint)
-##
-sub _derivCE {
+
+sub _derivCE_9 {
+ my $u = shift;
+ my $base =
+ (CJK_UidIni <= $u && $u <= CJK_UidFin)
+ ? 0xFB40 : # CJK
+ (CJK_ExtAIni <= $u && $u <= CJK_ExtAFin ||
+ CJK_ExtBIni <= $u && $u <= CJK_ExtBFin)
+ ? 0xFB80 # CJK ext.
+ : 0xFBC0; # others
+
+ my $aaaa = $base + ($u >> 15);
+ my $bbbb = ($u & 0x7FFF) | 0x8000;
+ return
+ pack(VCE_TEMPLATE, NON_VAR, $aaaa, Min2Wt, Min3Wt, $u),
+ pack(VCE_TEMPLATE, NON_VAR, $bbbb, 0, 0, $u);
+}
+
+sub _derivCE_8 {
my $code = shift;
- my $a = UNDEFINED + ($code >> 15); # ok
- my $b = ($code & 0x7FFF) | 0x8000; # ok
-# my $a = 0xFFC2 + ($code >> 15); # ng
-# my $b = $code & 0x7FFF | 0x1000; # ng
- $b ? ([$a,2,1,$code],[$b,0,0,$code]) : [$a,2,1,$code];
+ my $aaaa = 0xFF80 + ($code >> 15);
+ my $bbbb = ($code & 0x7FFF) | 0x8000;
+ return
+ pack(VCE_TEMPLATE, NON_VAR, $aaaa, 2, 1, $code),
+ pack(VCE_TEMPLATE, NON_VAR, $bbbb, 0, 0, $code);
+}
+
+
+sub varCE_HangulTerm {
+ my $self = shift;
+ return $self->varCE(pack(VCE_TEMPLATE,
+ NON_VAR, $self->{hangul_terminator}, 0,0,0));
}
+
##
## "hhhh hhhh hhhh" to (dddd, dddd, dddd)
##
sub _getHexArray { map hex, $_[0] =~ /([0-9a-fA-F]+)/g }
#
-# $code must be in Hangul syllable.
+# $code *must* be in Hangul syllable.
# Check it before you enter here.
#
sub _decompHangul {
my $code = shift;
- my $SIndex = $code - 0xAC00;
- my $LIndex = int( $SIndex / 588);
- my $VIndex = int(($SIndex % 588) / 28);
- my $TIndex = $SIndex % 28;
+ my $SIndex = $code - Hangul_SBase;
+ my $LIndex = int( $SIndex / Hangul_NCount);
+ my $VIndex = int(($SIndex % Hangul_NCount) / Hangul_TCount);
+ my $TIndex = $SIndex % Hangul_TCount;
return (
- 0x1100 + $LIndex,
- 0x1161 + $VIndex,
- $TIndex ? (0x11A7 + $TIndex) : (),
+ Hangul_LBase + $LIndex,
+ Hangul_VBase + $VIndex,
+ $TIndex ? (Hangul_TBase + $TIndex) : (),
);
}
+sub _isNonCharacter {
+ my $code = shift;
+ return ! defined $code # removed
+ || ($code < 0 || 0x10FFFF < $code) # out of range
+ || (($code & 0xFFFE) == 0xFFFE) # ??FFF[EF] (cf. utf8.c)
+ || (0xD800 <= $code && $code <= 0xDFFF) # unpaired surrogates
+ || (0xFDD0 <= $code && $code <= 0xFDEF) # other non-characters
+ ;
+}
+
+# Hangul Syllable Type
+sub getHST {
+ my $u = shift;
+ return
+ Hangul_LIni <= $u && $u <= Hangul_LFin || $u == Hangul_LFill ? "L" :
+ Hangul_VIni <= $u && $u <= Hangul_VFin ? "V" :
+ Hangul_TIni <= $u && $u <= Hangul_TFin ? "T" :
+ Hangul_SIni <= $u && $u <= Hangul_SFin ?
+ ($u - Hangul_SBase) % Hangul_TCount ? "LVT" : "LV" : "";
+}
+
+
+##
+## bool _nonIgnorAtLevel(arrayref weights, int level)
+##
+sub _nonIgnorAtLevel($$)
+{
+ my $wt = shift;
+ return if ! defined $wt;
+ my $lv = shift;
+ return grep($wt->[$_-1] != 0, MinLevel..$lv) ? TRUE : FALSE;
+}
+
+##
+## bool _eqArray(
+## arrayref of arrayref[weights] source,
+## arrayref of arrayref[weights] substr,
+## int level)
+## * comparison of graphemes vs graphemes.
+## @$source >= @$substr must be true (check it before call this);
+##
+sub _eqArray($$$)
+{
+ my $source = shift;
+ my $substr = shift;
+ my $lev = shift;
+
+ for my $g (0..@$substr-1){
+ # Do the $g'th graphemes have the same number of AV weigths?
+ return if @{ $source->[$g] } != @{ $substr->[$g] };
+
+ for my $w (0..@{ $substr->[$g] }-1) {
+ for my $v (0..$lev-1) {
+ return if $source->[$g][$w][$v] != $substr->[$g][$w][$v];
+ }
+ }
+ }
+ return 1;
+}
+
+##
+## (int position, int length)
+## int position = index(string, substring, position, [undoc'ed grobal])
+##
+## With "grobal" (only for the list context),
+## returns list of arrayref[position, length].
+##
+sub index
+{
+ my $self = shift;
+ my $str = shift;
+ my $len = length($str);
+ my $subE = $self->splitEnt(shift);
+ my $pos = @_ ? shift : 0;
+ $pos = 0 if $pos < 0;
+ my $grob = shift;
+
+ my $lev = $self->{level};
+ my $ver9 = $self->{UCA_Version} >= 9;
+ my $v2i = $self->{variable} ne 'non-ignorable';
+
+ if (! @$subE) {
+ my $temp = $pos <= 0 ? 0 : $len <= $pos ? $len : $pos;
+ return $grob
+ ? map([$_, 0], $temp..$len)
+ : wantarray ? ($temp,0) : $temp;
+ }
+ if ($len < $pos) {
+ return wantarray ? () : NOMATCHPOS;
+ }
+ my $strE = $self->splitEnt($pos ? substr($str, $pos) : $str, TRUE);
+ if (! @$strE) {
+ return wantarray ? () : NOMATCHPOS;
+ }
+ my $last_is_variable;
+ my(@strWt, @iniPos, @finPos, @subWt, @g_ret);
+
+ $last_is_variable = FALSE;
+ for my $wt (map $self->getWt($_), @$subE) {
+ my $to_be_pushed = _nonIgnorAtLevel($wt,$lev);
+
+ if ($v2i && $ver9) {
+ if ($wt->[0] == 0) {
+ $to_be_pushed = FALSE if $last_is_variable;
+ } else {
+ $last_is_variable = ($wt->[0] == Var1Wt);
+ }
+ }
+
+ if (@subWt && $wt->[0] == 0) {
+ push @{ $subWt[-1] }, $wt if $to_be_pushed;
+ } else {
+ $wt->[0] = 0 if $wt->[0] == Var1Wt;
+ push @subWt, [ $wt ];
+ }
+ }
+
+ my $count = 0;
+ my $end = @$strE - 1;
+
+ $last_is_variable = FALSE;
+
+ for (my $i = 0; $i <= $end; ) { # no $i++
+ my $found_base = 0;
+
+ # fetch a grapheme
+ while ($i <= $end && $found_base == 0) {
+ for my $wt ($self->getWt($strE->[$i][0])) {
+ my $to_be_pushed = _nonIgnorAtLevel($wt,$lev);
+
+ if ($v2i && $ver9) {
+ if ($wt->[0] == 0) {
+ $to_be_pushed = FALSE if $last_is_variable;
+ } else {
+ $last_is_variable = ($wt->[0] == Var1Wt);
+ }
+ }
+
+ if (@strWt && $wt->[0] == 0) {
+ push @{ $strWt[-1] }, $wt if $to_be_pushed;
+ $finPos[-1] = $strE->[$i][2];
+ } elsif ($to_be_pushed) {
+ $wt->[0] = 0 if $wt->[0] == Var1Wt;
+ push @strWt, [ $wt ];
+ push @iniPos, $found_base ? NOMATCHPOS : $strE->[$i][1];
+ $finPos[-1] = NOMATCHPOS if $found_base;
+ push @finPos, $strE->[$i][2];
+ $found_base++;
+ }
+ # else ===> no-op
+ }
+ $i++;
+ }
+
+ # try to match
+ while ( @strWt > @subWt || (@strWt == @subWt && $i > $end) ) {
+ if ($iniPos[0] != NOMATCHPOS &&
+ $finPos[$#subWt] != NOMATCHPOS &&
+ _eqArray(\@strWt, \@subWt, $lev)) {
+ my $temp = $iniPos[0] + $pos;
+
+ if ($grob) {
+ push @g_ret, [$temp, $finPos[$#subWt] - $iniPos[0]];
+ splice @strWt, 0, $#subWt;
+ splice @iniPos, 0, $#subWt;
+ splice @finPos, 0, $#subWt;
+ }
+ else {
+ return wantarray
+ ? ($temp, $finPos[$#subWt] - $iniPos[0])
+ : $temp;
+ }
+ }
+ shift @strWt;
+ shift @iniPos;
+ shift @finPos;
+ }
+ }
+
+ return $grob
+ ? @g_ret
+ : wantarray ? () : NOMATCHPOS;
+}
+
+##
+## scalarref to matching part = match(string, substring)
+##
+sub match
+{
+ my $self = shift;
+ if (my($pos,$len) = $self->index($_[0], $_[1])) {
+ my $temp = substr($_[0], $pos, $len);
+ return wantarray ? $temp : \$temp;
+ # An lvalue ref \substr should be avoided,
+ # since its value is affected by modification of its referent.
+ }
+ else {
+ return;
+ }
+}
+
+##
+## arrayref matching parts = gmatch(string, substring)
+##
+sub gmatch
+{
+ my $self = shift;
+ my $str = shift;
+ my $sub = shift;
+ return map substr($str, $_->[0], $_->[1]),
+ $self->index($str, $sub, 0, 'g');
+}
+
+##
+## bool subst'ed = subst(string, substring, replace)
+##
+sub subst
+{
+ my $self = shift;
+ my $code = ref $_[2] eq 'CODE' ? $_[2] : FALSE;
+
+ if (my($pos,$len) = $self->index($_[0], $_[1])) {
+ if ($code) {
+ my $mat = substr($_[0], $pos, $len);
+ substr($_[0], $pos, $len, $code->($mat));
+ } else {
+ substr($_[0], $pos, $len, $_[2]);
+ }
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+}
+
+##
+## int count = gsubst(string, substring, replace)
+##
+sub gsubst
+{
+ my $self = shift;
+ my $code = ref $_[2] eq 'CODE' ? $_[2] : FALSE;
+ my $cnt = 0;
+
+ # Replacement is carried out from the end, then use reverse.
+ for my $pos_len (reverse $self->index($_[0], $_[1], 0, 'g')) {
+ if ($code) {
+ my $mat = substr($_[0], $pos_len->[0], $pos_len->[1]);
+ substr($_[0], $pos_len->[0], $pos_len->[1], $code->($mat));
+ } else {
+ substr($_[0], $pos_len->[0], $pos_len->[1], $_[2]);
+ }
+ $cnt++;
+ }
+ return $cnt;
+}
+
1;
__END__
@@ -568,21 +1078,30 @@ Unicode::Collate - Unicode Collation Algorithm
#compare
$result = $Collator->cmp($a, $b); # returns 1, 0, or -1.
+ # If %tailoring is false (i.e. empty),
+ # $Collator should do the default collation.
+
=head1 DESCRIPTION
+This module is an implementation
+of Unicode Technical Standard #10 (UTS #10)
+"Unicode Collation Algorithm."
+
=head2 Constructor and Tailoring
The C<new> method returns a collator object.
$Collator = Unicode::Collate->new(
- alternate => $alternate,
+ UCA_Version => $UCA_Version,
+ alternate => $alternate, # deprecated: use of 'variable' is recommended.
backwards => $levelNumber, # or \@levelNumbers
entry => $element,
- normalization => $normalization_form,
+ hangul_terminator => $term_primary_weight,
ignoreName => qr/$ignoreName/,
ignoreChar => qr/$ignoreChar/,
katakana_before_hiragana => $bool,
level => $collationLevel,
+ normalization => $normalization_form,
overrideCJK => \&overrideCJK,
overrideHangul => \&overrideHangul,
preprocess => \&preprocess,
@@ -591,40 +1110,25 @@ The C<new> method returns a collator object.
undefName => qr/$undefName/,
undefChar => qr/$undefChar/,
upper_before_lower => $bool,
+ variable => $variable,
);
- # if %tailoring is false (i.e. empty),
- # $Collator should do the default collation.
=over 4
-=item alternate
-
--- see 3.2.2 Alternate Weighting, UTR #10.
-
-This key allows to alternate weighting for variable collation elements,
-which are marked with an ASTERISK in the table
-(NOTE: Many punction marks and symbols are variable in F<allkeys.txt>).
-
- alternate => 'blanked', 'non-ignorable', 'shifted', or 'shift-trimmed'.
-
-These names are case-insensitive.
-By default (if specification is omitted), 'shifted' is adopted.
+=item UCA_Version
- 'Blanked' Variable elements are ignorable at levels 1 through 3;
- considered at the 4th level.
+If the tracking version number of the older UCA is given,
+the older behavior of that tracking version is emulated on collating.
+If omitted, the return value of C<UCA_Version()> is used.
- 'Non-ignorable' Variable elements are not reset to ignorable.
+The supported tracking version: 8, 9, or 11.
- 'Shifted' Variable elements are ignorable at levels 1 through 3
- their level 4 weight is replaced by the old level 1 weight.
- Level 4 weight for Non-Variable elements is 0xFFFF.
-
- 'Shift-Trimmed' Same as 'shifted', but all FFFF's at the 4th level
- are trimmed.
+B<This parameter may be removed in the future version,
+as switching the algorithm would affect the performance.>
=item backwards
--- see 3.1.2 French Accents, UTR #10.
+-- see 3.1.2 French Accents, UTS #10.
backwards => $levelNumber or \@levelNumbers
@@ -633,9 +1137,12 @@ If omitted, forwards at all the levels.
=item entry
--- see 3.1 Linguistic Features; 3.2.1 File Format, UTR #10.
+-- see 3.1 Linguistic Features; 3.2.1 File Format, UTS #10.
-Overrides a default order or defines additional collation elements
+If the same character (or a sequence of characters) exists
+in the collation element table through C<table>,
+mapping to collation elements is overrided.
+If it does not exist, the mapping is defined additionally.
entry => <<'ENTRIES', # use the UCA file format
00E6 ; [.0861.0020.0002.00E6] [.08B1.0020.0002.00E6] # ligature <ae> as <a><e>
@@ -643,22 +1150,54 @@ Overrides a default order or defines additional collation elements
0043 0068 ; [.0893.0020.0008.0043] # "Ch" in traditional Spanish
ENTRIES
+B<NOTE:> The code point in the UCA file format (before C<';'>)
+B<must> be a Unicode code point, but not a native code point.
+So C<0063> must always denote C<U+0063>,
+but not a character of C<"\x63">.
+
+=item hangul_terminator
+
+-- see Condition B.2. in 7.1.4 Trailing Weights, UTS #10.
+
+If a true value is given (non-zero but should be positive),
+it will be added as a terminator primary weight to the end of
+every standard Hangul syllable. Secondary and any higher weights
+for terminator are set to zero.
+If the value is false or C<hangul_terminator> key does not exist,
+insertion of terminator weights will not be performed.
+
+Boundaries of Hangul syllables are determined
+according to conjoining Jamo behavior in F<the Unicode Standard>
+and F<HangulSyllableType.txt>.
+
+B<Implementation Note:>
+(1) For expansion mapping (Unicode character mapped
+to a sequence of collation elements), a terminator will not be added
+between collation elements, even if Hangul syllable boundary exists there.
+Addition of terminator is restricted to the next position
+to the last collation element.
+
+(2) Non-conjoining Hangul letters
+(Compatibility Jamo, halfwidth Jamo, and enclosed letters) are not
+automatically terminated with a terminator primary weight.
+These characters may need terminator included in a collation element
+table beforehand.
+
=item ignoreName
=item ignoreChar
--- see Completely Ignorable, 3.2.2 Alternate Weighting, UTR #10.
+-- see Completely Ignorable, 3.2.2 Variable Weighting, UTS #10.
-Makes the entry in the table ignorable.
-If a collation element is ignorable,
-it is ignored as if the element had been deleted from there.
+Makes the entry in the table completely ignorable;
+i.e. as if the weights were zero at all level.
E.g. when 'a' and 'e' are ignorable,
'element' is equal to 'lament' (or 'lmnt').
=item level
--- see 4.3 Form a sort key for each string, UTR #10.
+-- see 4.3 Form a sort key for each string, UTS #10.
Set the maximum level.
Any higher levels than the specified one are ignored.
@@ -666,7 +1205,7 @@ Any higher levels than the specified one are ignored.
Level 1: alphabetic ordering
Level 2: diacritic ordering
Level 3: case ordering
- Level 4: tie-breaking (e.g. in the case when alternate is 'shifted')
+ Level 4: tie-breaking (e.g. in the case when variable is 'shifted')
ex.level => 2,
@@ -674,33 +1213,55 @@ If omitted, the maximum is the 4th.
=item normalization
--- see 4.1 Normalize each input string, UTR #10.
+-- see 4.1 Normalize each input string, UTS #10.
If specified, strings are normalized before preparation of sort keys
(the normalization is executed after preprocess).
-As a form name, one of the following names must be used.
+A form name C<Unicode::Normalize::normalize()> accepts will be applied
+as C<$normalization_form>.
+Acceptable names include C<'NFD'>, C<'NFC'>, C<'NFKD'>, and C<'NFKC'>.
+See C<Unicode::Normalize::normalize()> for detail.
+If omitted, C<'NFD'> is used.
- 'C' or 'NFC' for Normalization Form C
- 'D' or 'NFD' for Normalization Form D
- 'KC' or 'NFKC' for Normalization Form KC
- 'KD' or 'NFKD' for Normalization Form KD
+C<normalization> is performed after C<preprocess> (if defined).
-If omitted, the string is put into Normalization Form D.
+Furthermore, special values, C<undef> and C<"prenormalized">, can be used,
+though they are not concerned with C<Unicode::Normalize::normalize()>.
-If C<undef> is passed explicitly as the value for this key,
+If C<undef> (not a string C<"undef">) is passed explicitly
+as the value for this key,
any normalization is not carried out (this may make tailoring easier
if any normalization is not desired).
-
-see B<CAVEAT>.
+Under C<(normalization =E<gt> undef)>, only contiguous contractions
+are resolved; e.g. C<A-cedilla-ring> would be primary equal to C<A>,
+even if C<A-ring> (and C<A-ring-cedilla>) is ordered after C<Z>.
+In this point,
+C<(normalization =E<gt> undef, preprocess =E<gt> sub { NFD(shift) })>
+B<is not> equivalent to C<(normalization =E<gt> 'NFD')>.
+
+In the case of C<(normalization =E<gt> "prenormalized")>,
+any normalization is not performed, but
+non-contiguous contractions with combining characters are performed.
+Therefore
+C<(normalization =E<gt> 'prenormalized', preprocess =E<gt> sub { NFD(shift) })>
+B<is> equivalent to C<(normalization =E<gt> 'NFD')>.
+If source strings are finely prenormalized,
+C<(normalization =E<gt> 'prenormalized')> may save time for normalization.
+
+Except C<(normalization =E<gt> undef)>,
+B<Unicode::Normalize> is required (see also B<CAVEAT>).
=item overrideCJK
--- see 7.1 Derived Collation Elements, UTR #10.
+-- see 7.1 Derived Collation Elements, UTS #10.
+
+By default, CJK Unified Ideographs are ordered in Unicode codepoint order
+(but C<CJK Unified Ideographs> [C<U+4E00> to C<U+9FA5>] are lesser than
+C<CJK Unified Ideographs Extension> [C<U+3400> to C<U+4DB5> and
+C<U+20000> to C<U+2A6D6>].
-By default, mapping of CJK Unified Ideographs
-uses the Unicode codepoint order.
-But the mapping of CJK Unified Ideographs may be overrided.
+Through C<overrideCJK>, ordering of CJK Unified Ideographs can be overrided.
ex. CJK Unified Ideographs in the JIS code point order.
@@ -722,16 +1283,16 @@ ex. ignores all CJK Unified Ideographs.
If C<undef> is passed explicitly as the value for this key,
weights for CJK Unified Ideographs are treated as undefined.
But assignment of weight for CJK Unified Ideographs
-in table or L<entry> is still valid.
+in table or C<entry> is still valid.
=item overrideHangul
--- see 7.1 Derived Collation Elements, UTR #10.
+-- see 7.1 Derived Collation Elements, UTS #10.
By default, Hangul Syllables are decomposed into Hangul Jamo.
But the mapping of Hangul Syllables may be overrided.
-This tag works like L<overrideCJK>, so see there for examples.
+This tag works like C<overrideCJK>, so see there for examples.
If you want to override the mapping of Hangul Syllables,
the Normalization Forms D and KD are not appropriate
@@ -741,11 +1302,11 @@ If C<undef> is passed explicitly as the value for this key,
weight for Hangul Syllables is treated as undefined
without decomposition into Hangul Jamo.
But definition of weight for Hangul Syllables
-in table or L<entry> is still valid.
+in table or C<entry> is still valid.
=item preprocess
--- see 5.1 Preprocessing, UTR #10.
+-- see 5.1 Preprocessing, UTS #10.
If specified, the coderef is used to preprocess
before the formation of sort keys.
@@ -756,12 +1317,14 @@ Then, "the pen" is before "a pencil".
preprocess => sub {
my $str = shift;
$str =~ s/\b(?:an?|the)\s+//gi;
- $str;
+ return $str;
},
+C<preprocess> is performed before C<normalization> (if defined).
+
=item rearrange
--- see 3.1.3 Rearrangement, UTR #10.
+-- see 3.1.3 Rearrangement, UTS #10.
Characters that are not coded in logical order and to be rearranged.
By default,
@@ -772,17 +1335,23 @@ If you want to disallow any rearrangement,
pass C<undef> or C<[]> (a reference to an empty list)
as the value for this key.
+B<According to the version 9 of UCA, this parameter shall not be used;
+but it is not warned at present.>
+
=item table
--- see 3.2 Default Unicode Collation Element Table, UTR #10.
+-- see 3.2 Default Unicode Collation Element Table, UTS #10.
-You can use another element table if desired.
-The table file must be in your C<lib/Unicode/Collate> directory.
+You can use another collation element table if desired.
+The table file must be put into a directory
+where F<Unicode/Collate.pm> is installed.
+E.g. in F<perl/lib/Unicode/Collate> directory
+when you have F<perl/lib/Unicode/Collate.pm>.
-By default, the file C<lib/Unicode/Collate/allkeys.txt> is used.
+By default, the filename F<"allkeys.txt"> is used.
If C<undef> is passed explicitly as the value for this key,
-no file is read (but you can define collation elements via L<entry>).
+no file is read (but you can define collation elements via C<entry>).
A typical way to define a collation element table
without any file of table:
@@ -803,7 +1372,7 @@ ENTRIES
=item undefChar
--- see 6.3.4 Reducing the Repertoire, UTR #10.
+-- see 6.3.4 Reducing the Repertoire, UTS #10.
Undefines the collation element as if it were unassigned in the table.
This reduces the size of the table.
@@ -819,7 +1388,7 @@ unfamiliar to you and maybe never used.
=item upper_before_lower
--- see 6.6 Case Comparisons; 7.3.1 Tertiary Weight Table, UTR #10.
+-- see 6.6 Case Comparisons; 7.3.1 Tertiary Weight Table, UTS #10.
By default, lowercase is before uppercase
and hiragana is before katakana.
@@ -828,10 +1397,42 @@ If the tag is made true, this is reversed.
B<NOTE>: These tags simplemindedly assume
any lowercase/uppercase or hiragana/katakana distinctions
-should occur in level 3, and their weights at level 3
-should be same as those mentioned in 7.3.1, UTR #10.
-If you define your collation elements which violates this,
-these tags doesn't work validly.
+must occur in level 3, and their weights at level 3
+must be same as those mentioned in 7.3.1, UTS #10.
+If you define your collation elements which violate this requirement,
+these tags don't work validly.
+
+=item variable
+
+=item alternate
+
+-- see 3.2.2 Variable Weighting, UTS #10.
+
+(the title in UCA version 8: Alternate Weighting)
+
+This key allows to variable weighting for variable collation elements,
+which are marked with an ASTERISK in the table
+(NOTE: Many punction marks and symbols are variable in F<allkeys.txt>).
+
+ variable => 'blanked', 'non-ignorable', 'shifted', or 'shift-trimmed'.
+
+These names are case-insensitive.
+By default (if specification is omitted), 'shifted' is adopted.
+
+ 'Blanked' Variable elements are made ignorable at levels 1 through 3;
+ considered at the 4th level.
+
+ 'Non-ignorable' Variable elements are not reset to ignorable.
+
+ 'Shifted' Variable elements are made ignorable at levels 1 through 3
+ their level 4 weight is replaced by the old level 1 weight.
+ Level 4 weight for Non-Variable elements is 0xFFFF.
+
+ 'Shift-Trimmed' Same as 'shifted', but all FFFF's at the 4th level
+ are trimmed.
+
+For backward compatibility, C<alternate> can be used as an alias
+for C<variable>.
=back
@@ -872,7 +1473,7 @@ They works like the same name operators as theirs.
=item C<$sortKey = $Collator-E<gt>getSortKey($string)>
--- see 4.3 Form a sort key for each string, UTR #10.
+-- see 4.3 Form a sort key for each string, UTS #10.
Returns a sort key.
@@ -887,39 +1488,42 @@ and get the result of the comparison of the strings using UCA.
=item C<$sortKeyForm = $Collator-E<gt>viewSortKey($string)>
-Returns a string formalized to display a sort key.
-Weights are enclosed with C<'['> and C<']'>
-and level boundaries are denoted by C<'|'>.
-
use Unicode::Collate;
my $c = Unicode::Collate->new();
print $c->viewSortKey("Perl"),"\n";
- # output:
- # [09B3 08B1 09CB 094F|0020 0020 0020 0020|0008 0002 0002 0002|FFFF FFFF FFFF FFFF]
- # Level 1 Level 2 Level 3 Level 4
+ # output:
+ # [0B67 0A65 0B7F 0B03 | 0020 0020 0020 0020 | 0008 0002 0002 0002 | FFFF FFFF FFFF FFFF]
+ # Level 1 Level 2 Level 3 Level 4
-=item C<$position = $Collator-E<gt>index($string, $substring)>
+ (If C<UCA_Version> is 8, the output is slightly different.)
-=item C<($position, $length) = $Collator-E<gt>index($string, $substring)>
+=back
--- see 6.8 Searching, UTR #10.
+=head2 Methods for Searching
+
+B<DISCLAIMER:> If C<preprocess> or C<normalization> tag is true
+for C<$Collator>, calling these methods (C<index>, C<match>, C<gmatch>,
+C<subst>, C<gsubst>) is croaked,
+as the position and the length might differ
+from those on the specified string.
+(And C<rearrange> and C<hangul_terminator> tags are neglected.)
+
+The C<match>, C<gmatch>, C<subst>, C<gsubst> methods work
+like C<m//>, C<m//g>, C<s///>, C<s///g>, respectively,
+but they are not aware of any pattern, but only a literal substring.
+
+=over 4
+
+=item C<$position = $Collator-E<gt>index($string, $substring[, $position])>
+
+=item C<($position, $length) = $Collator-E<gt>index($string, $substring[, $position])>
If C<$substring> matches a part of C<$string>, returns
the position of the first occurrence of the matching part in scalar context;
in list context, returns a two-element list of
the position and the length of the matching part.
-B<Notice> that the length of the matching part may differ from
-the length of C<$substring>.
-
-B<Note> that the position and the length are counted on the string
-after the process of preprocess, normalization, and rearrangement.
-Therefore, in case the specified string is not binary equal to
-the preprocessed/normalized/rearranged string, the position and the length
-may differ form those on the specified string. But it is guaranteed
-that, if matched, it returns a non-negative value as C<$position>.
-
If C<$substring> does not match any part of C<$string>,
returns C<-1> in scalar context and
an empty list in list context.
@@ -927,15 +1531,86 @@ an empty list in list context.
e.g. you say
my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
- my $str = "Ich mu\x{00DF} studieren.";
- my $sub = "m\x{00FC}ss";
+ # (normalization => undef) is REQUIRED.
+ my $str = "Ich muß studieren Perl.";
+ my $sub = "MÜSS";
my $match;
if (my($pos,$len) = $Collator->index($str, $sub)) {
$match = substr($str, $pos, $len);
}
-and get C<"mu\x{00DF}"> in C<$match> since C<"mu>E<223>C<">
-is primary equal to C<"m>E<252>C<ss">.
+and get C<"muß"> in C<$match> since C<"muß">
+is primary equal to C<"MÜSS">.
+
+=item C<$match_ref = $Collator-E<gt>match($string, $substring)>
+
+=item C<($match) = $Collator-E<gt>match($string, $substring)>
+
+If C<$substring> matches a part of C<$string>, in scalar context, returns
+B<a reference to> the first occurrence of the matching part
+(C<$match_ref> is always true if matches,
+since every reference is B<true>);
+in list context, returns the first occurrence of the matching part.
+
+If C<$substring> does not match any part of C<$string>,
+returns C<undef> in scalar context and
+an empty list in list context.
+
+e.g.
+
+ if ($match_ref = $Collator->match($str, $sub)) { # scalar context
+ print "matches [$$match_ref].\n";
+ } else {
+ print "doesn't match.\n";
+ }
+
+ or
+
+ if (($match) = $Collator->match($str, $sub)) { # list context
+ print "matches [$match].\n";
+ } else {
+ print "doesn't match.\n";
+ }
+
+=item C<@match = $Collator-E<gt>gmatch($string, $substring)>
+
+If C<$substring> matches a part of C<$string>, returns
+all the matching parts (or matching count in scalar context).
+
+If C<$substring> does not match any part of C<$string>,
+returns an empty list.
+
+=item C<$count = $Collator-E<gt>subst($string, $substring, $replacement)>
+
+If C<$substring> matches a part of C<$string>,
+the first occurrence of the matching part is replaced by C<$replacement>
+(C<$string> is modified) and return C<$count> (always equals to C<1>).
+
+C<$replacement> can be a C<CODEREF>,
+taking the matching part as an argument,
+and returning a string to replace the matching part
+(a bit similar to C<s/(..)/$coderef-E<gt>($1)/e>).
+
+=item C<$count = $Collator-E<gt>gsubst($string, $substring, $replacement)>
+
+If C<$substring> matches a part of C<$string>,
+all the occurrences of the matching part is replaced by C<$replacement>
+(C<$string> is modified) and return C<$count>.
+
+C<$replacement> can be a C<CODEREF>,
+taking the matching part as an argument,
+and returning a string to replace the matching part
+(a bit similar to C<s/(..)/$coderef-E<gt>($1)/eg>).
+
+e.g.
+
+ my $Collator = Unicode::Collate->new( normalization => undef, level => 1 );
+ # (normalization => undef) is REQUIRED.
+ my $str = "Camel ass came\x{301}l CAMEL horse cAm\0E\0L...";
+ $Collator->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
+
+ # now $str is "<b>Camel</b> ass <b>came\x{301}l</b> <b>CAMEL</b> horse <b>cAm\0E\0L</b>...";
+ # i.e., all the camels are made bold-faced.
=back
@@ -943,15 +1618,48 @@ is primary equal to C<"m>E<252>C<ss">.
=over 4
-=item UCA_Version
+=item C<%old_tailoring = $Collator-E<gt>change(%new_tailoring)>
+
+Change the value of specified keys and returns the changed part.
+
+ $Collator = Unicode::Collate->new(level => 4);
+
+ $Collator->eq("perl", "PERL"); # false
+
+ %old = $Collator->change(level => 2); # returns (level => 4).
+
+ $Collator->eq("perl", "PERL"); # true
+
+ $Collator->change(%old); # returns (level => 2).
+
+ $Collator->eq("perl", "PERL"); # false
+
+Not all C<(key,value)>s are allowed to be changed.
+See also C<@Unicode::Collate::ChangeOK> and C<@Unicode::Collate::ChangeNG>.
+
+In the scalar context, returns the modified collator
+(but it is B<not> a clone from the original).
+
+ $Collator->change(level => 2)->eq("perl", "PERL"); # true
-Returns the version number of Unicode Technical Standard 10
-this module consults.
+ $Collator->eq("perl", "PERL"); # true; now max level is 2nd.
-=item Base_Unicode_Version
+ $Collator->change(level => 4)->eq("perl", "PERL"); # false
-Returns the version number of the Unicode Standard
-this module is based on.
+=item C<$version = $Collator-E<gt>version()>
+
+Returns the version number (a string) of the Unicode Standard
+which the C<table> file used by the collator object is based on.
+If the table does not include a version line (starting with C<@version>),
+returns C<"unknown">.
+
+=item C<UCA_Version()>
+
+Returns the tracking version number of UTS #10 this module consults.
+
+=item C<Base_Unicode_Version()>
+
+Returns the version number of UTS #10 this module consults.
=back
@@ -959,17 +1667,6 @@ this module is based on.
None by default.
-=head2 TODO
-
-Unicode::Collate has not been ported to EBCDIC. The code mostly would
-work just fine but a decision needs to be made: how the module should
-work in EBCDIC? Should the low 256 characters be understood as
-Unicode or as EBCDIC code points? Should one be chosen or should
-there be a way to do either? Or should such translation be left
-outside the module for the user to do, for example by using
-Encode::from_to()?
-(or utf8::unicode_to_native()/utf8::native_to_unicode()?)
-
=head2 CAVEAT
Use of the C<normalization> parameter requires
@@ -979,25 +1676,28 @@ If you need not it (say, in the case when you need not
handle any combining characters),
assign C<normalization =E<gt> undef> explicitly.
--- see 6.5 Avoiding Normalization, UTR #10.
+-- see 6.5 Avoiding Normalization, UTS #10.
+
+=head2 Conformance Test
-=head2 BUGS
+The Conformance Test for the UCA is provided
+in L<http://www.unicode.org/reports/tr10/CollationTest.html>
+and L<http://www.unicode.org/reports/tr10/CollationTest.zip>
-C<index()> is an experimental method and
-its return value may be unreliable.
-The correct implementation for C<index()> must be based
-on Locale-Sensitive Support: Level 3 in UTR #18,
-F<Unicode Regular Expression Guidelines>.
+For F<CollationTest_SHIFTED.txt>,
+a collator via C<Unicode::Collate-E<gt>new( )> should be used;
+for F<CollationTest_NON_IGNORABLE.txt>, a collator via
+C<Unicode::Collate-E<gt>new(variable =E<gt> "non-ignorable", level =E<gt> 3)>.
-See also 4.2 Locale-Dependent Graphemes in UTR #18.
+B<Unicode::Normalize is required to try The Conformance Test.>
=head1 AUTHOR
-SADAHIRO Tomoyuki, E<lt>SADAHIRO@cpan.orgE<gt>
+SADAHIRO Tomoyuki, <SADAHIRO@cpan.org>
http://homepage1.nifty.com/nomenclator/perl/
- Copyright(C) 2001-2002, SADAHIRO Tomoyuki. Japan. All rights reserved.
+ Copyright(C) 2001-2003, SADAHIRO Tomoyuki. Japan. All rights reserved.
This library is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
@@ -1006,21 +1706,27 @@ SADAHIRO Tomoyuki, E<lt>SADAHIRO@cpan.orgE<gt>
=over 4
-=item http://www.unicode.org/unicode/reports/tr10/
+=item Unicode Collation Algorithm - UTS #10
+
+L<http://www.unicode.org/reports/tr10/>
+
+=item The Default Unicode Collation Element Table (DUCET)
+
+L<http://www.unicode.org/reports/tr10/allkeys.txt>
-Unicode Collation Algorithm - UTR #10
+=item The conformance test for the UCA
-=item http://www.unicode.org/unicode/reports/tr10/allkeys.txt
+L<http://www.unicode.org/reports/tr10/CollationTest.html>
-The Default Unicode Collation Element Table
+L<http://www.unicode.org/reports/tr10/CollationTest.zip>
-=item http://www.unicode.org/unicode/reports/tr15/
+=item Hangul Syllable Type
-Unicode Normalization Forms - UAX #15
+http://www.unicode.org/Public/UNIDATA/HangulSyllableType.txt
-=item http://www.unicode.org/unicode/reports/tr18
+=item Unicode Normalization Forms - UAX #15
-Unicode Regular Expression Guidelines - UTR #18
+L<http://www.unicode.org/reports/tr15/>
=item L<Unicode::Normalize>
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/Changes b/gnu/usr.bin/perl/lib/Unicode/Collate/Changes
index 997117c6700..7f92d7aad18 100644
--- a/gnu/usr.bin/perl/lib/Unicode/Collate/Changes
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/Changes
@@ -1,4 +1,80 @@
-Revision history for Perl extension Unicode::Collate.
+Revision history for Perl module Unicode::Collate.
+
+0.30 Mon Oct 13 21:26:37 2003
+ - fix: Completely ignorable in table should be able to be overrided
+ by non-ignorable in entry.
+ - fix: Maximum length for contraction must not be shortened
+ by a shorter contraction following.
+ - added normal.t.
+ - some doc fixes
+
+0.29 Mon Oct 13 12:18:23 2003
+ - supported hangul_terminator.
+ - fix: Base_Unicode_Version falsely returns Perl's Unicode version.
+ C4 in UTS #10 requires UTS's Unicode version.
+ - For variable weighting, 'variable' is recommended
+ and 'alternate' is deprecated.
+ - added version() method.
+ - added hangtype.t, trailwt.t, variable.t, and version.t.
+
+0.28 Sat Sep 06 20:16:01 2003
+ - Fixed another inconsistency under (normalization => undef):
+ Non-contiguous contraction is always neglected.
+ - Fixed: according to S2.1 in UTS #10, a blocked combining character
+ should not be contracted. One test in test.t was wrong, then removed.
+ - Added contract.t.
+ - (normalization => "prenormalized") is able to be used.
+
+0.27 Sun Aug 31 22:23:17 2003
+ some improvements:
+ - The maximum length of contracted CE was not checked (v0.22 to v0.26).
+ Collation of a large string including a first letter of a contraction
+ that is not a part of that contraction (say, 'c' of 'ca'
+ where 'ch' is defined) was too slow, inefficient.
+ - A form name for 'normalization', no longer restricted to
+ /^(?:NF)?K?[CD]\z/, will be allowed as long as
+ Unicode::Normalize::normalize() accepts it, since Unicode::Normalize
+ or UAX #15 may be changed/enhanced in future.
+ - When Hangul syllables are decomposed under <normalization => undef>,
+ contraction among jamo (LV, VT, LVT) derived from the same
+ Hangul syllable is allowed. Added hangul.t.
+
+0.26 Sun Aug 03 22:23:17 2003
+ - fix: an expansion in which a CE is level 3 ignorable and others are not
+ was wrongly made level 3 ignorable as a whole entry.
+ (In DUCET, some precomposites in Musical Symbols are so)
+
+0.25 Mon Jun 06 23:20:17 2003
+ - fix Makefile.PL.
+ - internal tweak (again): pack_U() and unpack_U().
+
+0.24 Thu Apr 02 23:12:54 2003
+ - internal tweak for (?un)pack 'U'.
+
+0.23 Wed Sep 04 19:25:20 2002
+ - fix: scalar match() no longer returns an lvalue substr ref.
+ - fix: "Ignorable after variable" should be made level 3 ignorable
+ even if alternate => 'blanked'.
+ - Now a grapheme may contain trailing level 2, level 3,
+ and completely ignorable characters.
+
+0.22 Mon Sep 02 23:15:14 2002
+ - New File: index.t.
+ (The new test.t excludes tests for index.)
+ - tweak on index(). POSITION is supported.
+ - add match, gmatch, subst, gsubst methods.
+ - fix: ignorable after variable in 'shift'-variable weight.
+
+0.21 Sat Aug 03 10:24:00 2002
+ - upgrade keys.txt and t/test.t for UCA Version 9.
+
+0.20 Fri Jul 26 02:15:25 2002
+ - now UCA Version 9.
+ - U+FDD0..U+FDEF are new non-characters.
+ - fix: whitespace characters before @backwards etc. in a table file.
+ - now values for 'alternate', 'backwards', etc.,
+ which are explicitly specified via new(),
+ are preferred to those specified in a table file.
0.12 Sun May 05 09:43:10 2002
- add new methods, ->UCA_Version and ->Base_Unicode_Version.
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/README b/gnu/usr.bin/perl/lib/Unicode/Collate/README
index 4d4f12ce977..6a4b712a8b0 100644
--- a/gnu/usr.bin/perl/lib/Unicode/Collate/README
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/README
@@ -1,17 +1,9 @@
-Unicode/Collate version 0.12
+Unicode/Collate version 0.30
===============================
-Unicode::Collate - Unicode Collation Algorithm
+NAME
- UCA - Unicode TR #10.
- http://www.unicode.org/unicode/reports/tr10/
-
- Fetch the following file and put it into the Unicode/Collate directory.
- http://www.unicode.org/unicode/reports/tr10/allkeys.txt
-
- You can install this module using a subset "keys.txt"
- contained in this distribution without the "allkeys.txt";
- but "keys.txt" is small and not very useful.
+ Unicode::Collate - Unicode Collation Algorithm
SYNOPSIS
@@ -30,7 +22,7 @@ SYNOPSIS
INSTALLATION
-Perl 5.006 or later
+Perl 5.6.1 or later
To install this module type the following:
@@ -39,18 +31,30 @@ To install this module type the following:
make test
make install
+To use this module, it is better to install a table file in the UCA format,
+by copying it into the lib/Unicode/Collate directory.
+
+The most preferable one is "The Default Unicode Collation Element Table",
+available from the Unicode consortium's website:
+
+ http://www.unicode.org/reports/tr10/allkeys.txt
+
+Though this distribution contains a subset of allkeys.txt, named "keys.txt",
+this one is intended only for doing a test of this module
+and practically useless for any other purpose.
+
DEPENDENCIES
- It's better if you have Unicode::Normalize (v 0.10 or later)
+ The conformant collation requires Unicode::Normalize (v 0.10 or later)
although Unicode::Collate can be used without Unicode::Normalize.
COPYRIGHT AND LICENCE
-SADAHIRO Tomoyuki <bqw10602@nifty.com>
+SADAHIRO Tomoyuki <SADAHIRO@cpan.org>
http://homepage1.nifty.com/nomenclator/perl/
- Copyright(C) 2001-2002, SADAHIRO Tomoyuki. Japan. All rights reserved.
+ Copyright(C) 2001-2003, SADAHIRO Tomoyuki. Japan. All rights reserved.
This library is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/keys.txt b/gnu/usr.bin/perl/lib/Unicode/Collate/keys.txt
index 5fe3ebef624..aaa2d2a5a77 100644
--- a/gnu/usr.bin/perl/lib/Unicode/Collate/keys.txt
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/keys.txt
@@ -1,1930 +1,864 @@
-#### This file is generated from allkeys-3.0.1d9.txt (unicode.org)
-#### by deleting many many elements.
+#### This file is generated from allkeys-3.1.1.txt (unicode.org)
+#### by deleting many many entries.
####
-#### Remaining elements include LATIN, HANGUL, HIRAGANA, KATAKANA,
-#### BOPOMOFO, CJK UNIFIED IDEOGRAPHS.
+#### This table is intended ONLY for doing a test
+#### of Unicode/Collate.pm, a Perl module.
####
-#### To fetch the original file, access to:
-#### http://www.unicode.org/unicode/reports/tr10/allkeys.txt
+#### The entries contained here ARE:
+#### 0000..007F # Basic Latin
+#### 0080..00FF # Latin-1 Supplement
+#### 0300..036F # Combining Diacritical Marks
+#### 1100..11FF # Hangul Jamo
+#### 2000..206F # General Punctuation
+#### 3040..309F # Hiragana
+#### 30A0..30FF # Katakana
####
-# allkeys-3.0.1d9.txt
-# Created: 2001-Feb-22
-# Posted: 2001-Mar-29
-#
-# Note: This file was originally posted with the header section
-# omitted, together with the @version and @rearrange lines. This
-# 2001-Mar-29 reposting corrects that omission. All of the weight
-# entries are identical to the originally posted allkeys.txt for
-# UTS #10, Version 8.0.
-#
-# Derived from: unidata-3.0.1d9.txt
-# Sifter version: 3.0.1d4, 2001-Feb-22
-
-@version 3.0.1d9
-
-@rearrange 0E40,0E41,0E42,0E43,0E44
-@rearrange 0EC0,0EC1,0EC2,0EC3,0EC4
-
-0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
-000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
-000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
-000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
-000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
-0020 ; [*0209.0020.0002.0020] # SPACE
-0021 ; [*0237.0020.0002.0021] # EXCLAMATION MARK
-0022 ; [*025C.0020.0002.0022] # QUOTATION MARK
-0023 ; [*0295.0020.0002.0023] # NUMBER SIGN
-0025 ; [*0296.0020.0002.0025] # PERCENT SIGN
-0026 ; [*0293.0020.0002.0026] # AMPERSAND
-0027 ; [*0255.0020.0002.0027] # APOSTROPHE
-0028 ; [*0266.0020.0002.0028] # LEFT PARENTHESIS
-0029 ; [*0267.0020.0002.0029] # RIGHT PARENTHESIS
-002A ; [*028E.0020.0002.002A] # ASTERISK
-002B ; [*038B.0020.0002.002B] # PLUS SIGN
-002C ; [*0219.0020.0002.002C] # COMMA
-002D ; [*020D.0020.0002.002D] # HYPHEN-MINUS
-002E ; [*0241.0020.0002.002E] # FULL STOP
-002F ; [*0290.0020.0002.002F] # SOLIDUS
-003A ; [*0223.0020.0002.003A] # COLON
-003B ; [*0221.0020.0002.003B] # SEMICOLON
-003C ; [*038F.0020.0002.003C] # LESS-THAN SIGN
-003D ; [*0390.0020.0002.003D] # EQUALS SIGN
-003E ; [*0391.0020.0002.003E] # GREATER-THAN SIGN
-003F ; [*023A.0020.0002.003F] # QUESTION MARK
-0040 ; [*028D.0020.0002.0040] # COMMERCIAL AT
-005C ; [*0292.0020.0002.005C] # REVERSE SOLIDUS
-007B ; [*026A.0020.0002.007B] # LEFT CURLY BRACKET
-007C ; [*0393.0020.0002.007C] # VERTICAL LINE
-007D ; [*026B.0020.0002.007D] # RIGHT CURLY BRACKET
-007E ; [*0396.0020.0002.007E] # TILDE
-0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
-00A1 ; [*0238.0020.0002.00A1] # INVERTED EXCLAMATION MARK
-00A6 ; [*0394.0020.0002.00A6] # BROKEN BAR
-00A7 ; [*0288.0020.0002.00A7] # SECTION SIGN
-00A9 ; [*028B.0020.0002.00A9] # COPYRIGHT SIGN
-00AC ; [*0392.0020.0002.00AC] # NOT SIGN
-00AD ; [*020C.0020.0002.00AD] # SOFT HYPHEN
-00AE ; [*028C.0020.0002.00AE] # REGISTERED SIGN
-00B0 ; [*02F6.0020.0002.00B0] # DEGREE SIGN
-00B1 ; [*038C.0020.0002.00B1] # PLUS-MINUS SIGN
-00B6 ; [*0289.0020.0002.00B6] # PILCROW SIGN
-00B7 ; [*024B.0020.0002.00B7] # MIDDLE DOT
-00BF ; [*023B.0020.0002.00BF] # INVERTED QUESTION MARK
-00D7 ; [*038E.0020.0002.00D7] # MULTIPLICATION SIGN
-00F7 ; [*038D.0020.0002.00F7] # DIVISION SIGN
-02B9 ; [*02D5.0020.0002.02B9] # MODIFIER LETTER PRIME
-02BA ; [*02D7.0020.0002.02BA] # MODIFIER LETTER DOUBLE PRIME
-02C2 ; [*02D8.0020.0002.02C2] # MODIFIER LETTER LEFT ARROWHEAD
-02C3 ; [*02D9.0020.0002.02C3] # MODIFIER LETTER RIGHT ARROWHEAD
-02C4 ; [*02DA.0020.0002.02C4] # MODIFIER LETTER UP ARROWHEAD
-02C5 ; [*02DB.0020.0002.02C5] # MODIFIER LETTER DOWN ARROWHEAD
-02C6 ; [*02DC.0020.0002.02C6] # MODIFIER LETTER CIRCUMFLEX ACCENT
-02C7 ; [*02DD.0020.0002.02C7] # CARON
-02C8 ; [*02DE.0020.0002.02C8] # MODIFIER LETTER VERTICAL LINE
-02C9 ; [*02DF.0020.0002.02C9] # MODIFIER LETTER MACRON
-02CA ; [*02E0.0020.0002.02CA] # MODIFIER LETTER ACUTE ACCENT
-02CB ; [*02E1.0020.0002.02CB] # MODIFIER LETTER GRAVE ACCENT
-02CC ; [*02E2.0020.0002.02CC] # MODIFIER LETTER LOW VERTICAL LINE
-02CD ; [*02E3.0020.0002.02CD] # MODIFIER LETTER LOW MACRON
-02CE ; [*02E4.0020.0002.02CE] # MODIFIER LETTER LOW GRAVE ACCENT
-02CF ; [*02E5.0020.0002.02CF] # MODIFIER LETTER LOW ACUTE ACCENT
-02D2 ; [*02E6.0020.0002.02D2] # MODIFIER LETTER CENTRED RIGHT HALF RING
-02D3 ; [*02E7.0020.0002.02D3] # MODIFIER LETTER CENTRED LEFT HALF RING
-02D4 ; [*02E8.0020.0002.02D4] # MODIFIER LETTER UP TACK
-02D5 ; [*02E9.0020.0002.02D5] # MODIFIER LETTER DOWN TACK
-02D6 ; [*02EA.0020.0002.02D6] # MODIFIER LETTER PLUS SIGN
-02D7 ; [*02EB.0020.0002.02D7] # MODIFIER LETTER MINUS SIGN
-02DE ; [*02EC.0020.0002.02DE] # MODIFIER LETTER RHOTIC HOOK
-02E5 ; [*02ED.0020.0002.02E5] # MODIFIER LETTER EXTRA-HIGH TONE BAR
-02E6 ; [*02EE.0020.0002.02E6] # MODIFIER LETTER HIGH TONE BAR
-02E7 ; [*02EF.0020.0002.02E7] # MODIFIER LETTER MID TONE BAR
-02E8 ; [*02F0.0020.0002.02E8] # MODIFIER LETTER LOW TONE BAR
-02E9 ; [*02F1.0020.0002.02E9] # MODIFIER LETTER EXTRA-LOW TONE BAR
-02EA ; [*02F2.0020.0002.02EA] # MODIFIER LETTER YIN DEPARTING TONE MARK
-02EB ; [*02F3.0020.0002.02EB] # MODIFIER LETTER YANG DEPARTING TONE MARK
-02EC ; [*02F4.0020.0002.02EC] # MODIFIER LETTER VOICING
-02ED ; [*02F5.0020.0002.02ED] # MODIFIER LETTER UNASPIRATED
-2000 ; [*0209.0020.0004.2000] # EN QUAD; CANON
-2001 ; [*0209.0020.0004.2001] # EM QUAD; CANON
-2010 ; [*0211.0020.0002.2010] # HYPHEN
-2012 ; [*0212.0020.0002.2012] # FIGURE DASH
-2013 ; [*0213.0020.0002.2013] # EN DASH
-2014 ; [*0214.0020.0002.2014] # EM DASH
-2015 ; [*0215.0020.0002.2015] # HORIZONTAL BAR
-2016 ; [*0395.0020.0002.2016] # DOUBLE VERTICAL LINE
-2018 ; [*0256.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
-2019 ; [*0257.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
-201A ; [*0258.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
-201B ; [*0259.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
-201C ; [*025D.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
-201D ; [*025E.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
-201E ; [*025F.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
-201F ; [*0260.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
-2020 ; [*029A.0020.0002.2020] # DAGGER
-2021 ; [*029B.0020.0002.2021] # DOUBLE DAGGER
-2022 ; [*029C.0020.0002.2022] # BULLET
-2023 ; [*029D.0020.0002.2023] # TRIANGULAR BULLET
-2027 ; [*029E.0020.0002.2027] # HYPHENATION POINT
-2028 ; [*0207.0020.0002.2028] # LINE SEPARATOR
-2029 ; [*0208.0020.0002.2029] # PARAGRAPH SEPARATOR
-2030 ; [*0298.0020.0002.2030] # PER MILLE SIGN
-2031 ; [*0299.0020.0002.2031] # PER TEN THOUSAND SIGN
-2032 ; [*02A2.0020.0002.2032] # PRIME
-2035 ; [*02A3.0020.0002.2035] # REVERSED PRIME
-2038 ; [*02A5.0020.0002.2038] # CARET
-203B ; [*02A6.0020.0002.203B] # REFERENCE MARK
-203D ; [*0240.0020.0002.203D] # INTERROBANG
-203F ; [*02A7.0020.0002.203F] # UNDERTIE
-2040 ; [*02A8.0020.0002.2040] # CHARACTER TIE
-2041 ; [*02A9.0020.0002.2041] # CARET INSERTION POINT
-2042 ; [*02AA.0020.0002.2042] # ASTERISM
-2043 ; [*029F.0020.0002.2043] # HYPHEN BULLET
-2044 ; [*0291.0020.0002.2044] # FRACTION SLASH
-204A ; [*0294.0020.0002.204A] # TIRONIAN SIGN ET
-204B ; [*028A.0020.0002.204B] # REVERSED PILCROW SIGN
-204C ; [*02A0.0020.0002.204C] # BLACK LEFTWARDS BULLET
-204D ; [*02A1.0020.0002.204D] # BLACK RIGHTWARDS BULLET
-2200 ; [*037C.0020.0002.2200] # FOR ALL
-2201 ; [*037D.0020.0002.2201] # COMPLEMENT
-2202 ; [*037E.0020.0002.2202] # PARTIAL DIFFERENTIAL
-2203 ; [*037F.0020.0002.2203] # THERE EXISTS
-2204 ; [*037F.0054.0002.2204] # THERE DOES NOT EXIST; CANONSEQ
-2205 ; [*0380.0020.0002.2205] # EMPTY SET
-2206 ; [*0381.0020.0002.2206] # INCREMENT
-2207 ; [*0382.0020.0002.2207] # NABLA
-2208 ; [*0383.0020.0002.2208] # ELEMENT OF
-2209 ; [*0383.0054.0002.2209] # NOT AN ELEMENT OF; CANONSEQ
-220A ; [*0384.0020.0002.220A] # SMALL ELEMENT OF
-220B ; [*0385.0020.0002.220B] # CONTAINS AS MEMBER
-220C ; [*0385.0054.0002.220C] # DOES NOT CONTAIN AS MEMBER; CANONSEQ
-220D ; [*0386.0020.0002.220D] # SMALL CONTAINS AS MEMBER
-220E ; [*0387.0020.0002.220E] # END OF PROOF
-220F ; [*0388.0020.0002.220F] # N-ARY PRODUCT
-2210 ; [*0389.0020.0002.2210] # N-ARY COPRODUCT
-2211 ; [*038A.0020.0002.2211] # N-ARY SUMMATION
-2212 ; [*0397.0020.0002.2212] # MINUS SIGN
-2213 ; [*0398.0020.0002.2213] # MINUS-OR-PLUS SIGN
-2214 ; [*0399.0020.0002.2214] # DOT PLUS
-2215 ; [*039A.0020.0002.2215] # DIVISION SLASH
-2216 ; [*039B.0020.0002.2216] # SET MINUS
-2217 ; [*039C.0020.0002.2217] # ASTERISK OPERATOR
-2218 ; [*039D.0020.0002.2218] # RING OPERATOR
-2219 ; [*039E.0020.0002.2219] # BULLET OPERATOR
-221B ; [*03A0.0020.0002.221B] # CUBE ROOT
-221C ; [*03A1.0020.0002.221C] # FOURTH ROOT
-221D ; [*03A2.0020.0002.221D] # PROPORTIONAL TO
-221E ; [*03A3.0020.0002.221E] # INFINITY
-2223 ; [*03A8.0020.0002.2223] # DIVIDES
-2224 ; [*03A8.0054.0002.2224] # DOES NOT DIVIDE; CANONSEQ
-2225 ; [*03A9.0020.0002.2225] # PARALLEL TO
-2226 ; [*03A9.0054.0002.2226] # NOT PARALLEL TO; CANONSEQ
-2227 ; [*03AA.0020.0002.2227] # LOGICAL AND
-2228 ; [*03AB.0020.0002.2228] # LOGICAL OR
-2229 ; [*03AC.0020.0002.2229] # INTERSECTION
-222A ; [*03AD.0020.0002.222A] # UNION
-2234 ; [*03B3.0020.0002.2234] # THEREFORE
-2235 ; [*03B4.0020.0002.2235] # BECAUSE
-2236 ; [*03B5.0020.0002.2236] # RATIO
-2237 ; [*03B6.0020.0002.2237] # PROPORTION
-2238 ; [*03B7.0020.0002.2238] # DOT MINUS
-2239 ; [*03B8.0020.0002.2239] # EXCESS
-223A ; [*03B9.0020.0002.223A] # GEOMETRIC PROPORTION
-223B ; [*03BA.0020.0002.223B] # HOMOTHETIC
-223C ; [*03BB.0020.0002.223C] # TILDE OPERATOR
-223D ; [*03BC.0020.0002.223D] # REVERSED TILDE
-223E ; [*03BD.0020.0002.223E] # INVERTED LAZY S
-223F ; [*03BE.0020.0002.223F] # SINE WAVE
-2240 ; [*03BF.0020.0002.2240] # WREATH PRODUCT
-2241 ; [*03BB.0054.0002.2241] # NOT TILDE; CANONSEQ
-2242 ; [*03C0.0020.0002.2242] # MINUS TILDE
-2243 ; [*03C1.0020.0002.2243] # ASYMPTOTICALLY EQUAL TO
-2244 ; [*03C1.0054.0002.2244] # NOT ASYMPTOTICALLY EQUAL TO; CANONSEQ
-2245 ; [*03C2.0020.0002.2245] # APPROXIMATELY EQUAL TO
-2246 ; [*03C3.0020.0002.2246] # APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
-2247 ; [*03C2.0054.0002.2247] # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO; CANONSEQ
-2248 ; [*03C4.0020.0002.2248] # ALMOST EQUAL TO
-2249 ; [*03C4.0054.0002.2249] # NOT ALMOST EQUAL TO; CANONSEQ
-224A ; [*03C5.0020.0002.224A] # ALMOST EQUAL OR EQUAL TO
-224B ; [*03C6.0020.0002.224B] # TRIPLE TILDE
-224C ; [*03C7.0020.0002.224C] # ALL EQUAL TO
-224D ; [*03C8.0020.0002.224D] # EQUIVALENT TO
-224E ; [*03C9.0020.0002.224E] # GEOMETRICALLY EQUIVALENT TO
-224F ; [*03CA.0020.0002.224F] # DIFFERENCE BETWEEN
-2250 ; [*03CB.0020.0002.2250] # APPROACHES THE LIMIT
-2251 ; [*03CC.0020.0002.2251] # GEOMETRICALLY EQUAL TO
-2252 ; [*03CD.0020.0002.2252] # APPROXIMATELY EQUAL TO OR THE IMAGE OF
-2253 ; [*03CE.0020.0002.2253] # IMAGE OF OR APPROXIMATELY EQUAL TO
-2254 ; [*03CF.0020.0002.2254] # COLON EQUALS
-2255 ; [*03D0.0020.0002.2255] # EQUALS COLON
-2256 ; [*03D1.0020.0002.2256] # RING IN EQUAL TO
-2257 ; [*03D2.0020.0002.2257] # RING EQUAL TO
-2258 ; [*03D3.0020.0002.2258] # CORRESPONDS TO
-2259 ; [*03D4.0020.0002.2259] # ESTIMATES
-225A ; [*03D5.0020.0002.225A] # EQUIANGULAR TO
-225C ; [*03D7.0020.0002.225C] # DELTA EQUAL TO
-225D ; [*03D8.0020.0002.225D] # EQUAL TO BY DEFINITION
-225E ; [*03D9.0020.0002.225E] # MEASURED BY
-225F ; [*03DA.0020.0002.225F] # QUESTIONED EQUAL TO
-2260 ; [*0390.0054.0002.2260] # NOT EQUAL TO; CANONSEQ
-2261 ; [*03DB.0020.0002.2261] # IDENTICAL TO
-2262 ; [*03DB.0054.0002.2262] # NOT IDENTICAL TO; CANONSEQ
-2263 ; [*03DC.0020.0002.2263] # STRICTLY EQUIVALENT TO
-2264 ; [*03DD.0020.0002.2264] # LESS-THAN OR EQUAL TO
-2265 ; [*03DE.0020.0002.2265] # GREATER-THAN OR EQUAL TO
-2266 ; [*03DF.0020.0002.2266] # LESS-THAN OVER EQUAL TO
-2267 ; [*03E0.0020.0002.2267] # GREATER-THAN OVER EQUAL TO
-2268 ; [*03E1.0020.0002.2268] # LESS-THAN BUT NOT EQUAL TO
-2269 ; [*03E2.0020.0002.2269] # GREATER-THAN BUT NOT EQUAL TO
-226A ; [*03E3.0020.0002.226A] # MUCH LESS-THAN
-226B ; [*03E4.0020.0002.226B] # MUCH GREATER-THAN
-226C ; [*03E5.0020.0002.226C] # BETWEEN
-226D ; [*03C8.0054.0002.226D] # NOT EQUIVALENT TO; CANONSEQ
-226E ; [*038F.0054.0002.226E] # NOT LESS-THAN; CANONSEQ
-226F ; [*0391.0054.0002.226F] # NOT GREATER-THAN; CANONSEQ
-2270 ; [*03DD.0054.0002.2270] # NEITHER LESS-THAN NOR EQUAL TO; CANONSEQ
-2271 ; [*03DE.0054.0002.2271] # NEITHER GREATER-THAN NOR EQUAL TO; CANONSEQ
-2272 ; [*03E6.0020.0002.2272] # LESS-THAN OR EQUIVALENT TO
-2273 ; [*03E7.0020.0002.2273] # GREATER-THAN OR EQUIVALENT TO
-2274 ; [*03E6.0054.0002.2274] # NEITHER LESS-THAN NOR EQUIVALENT TO; CANONSEQ
-2275 ; [*03E7.0054.0002.2275] # NEITHER GREATER-THAN NOR EQUIVALENT TO; CANONSEQ
-2276 ; [*03E8.0020.0002.2276] # LESS-THAN OR GREATER-THAN
-2277 ; [*03E9.0020.0002.2277] # GREATER-THAN OR LESS-THAN
-2278 ; [*03E8.0054.0002.2278] # NEITHER LESS-THAN NOR GREATER-THAN; CANONSEQ
-2279 ; [*03E9.0054.0002.2279] # NEITHER GREATER-THAN NOR LESS-THAN; CANONSEQ
-227A ; [*03EA.0020.0002.227A] # PRECEDES
-227B ; [*03EB.0020.0002.227B] # SUCCEEDS
-227C ; [*03EC.0020.0002.227C] # PRECEDES OR EQUAL TO
-227D ; [*03ED.0020.0002.227D] # SUCCEEDS OR EQUAL TO
-227E ; [*03EE.0020.0002.227E] # PRECEDES OR EQUIVALENT TO
-227F ; [*03EF.0020.0002.227F] # SUCCEEDS OR EQUIVALENT TO
-2280 ; [*03EA.0054.0002.2280] # DOES NOT PRECEDE; CANONSEQ
-2281 ; [*03EB.0054.0002.2281] # DOES NOT SUCCEED; CANONSEQ
-2282 ; [*03F0.0020.0002.2282] # SUBSET OF
-2283 ; [*03F1.0020.0002.2283] # SUPERSET OF
-2284 ; [*03F0.0054.0002.2284] # NOT A SUBSET OF; CANONSEQ
-2285 ; [*03F1.0054.0002.2285] # NOT A SUPERSET OF; CANONSEQ
-2286 ; [*03F2.0020.0002.2286] # SUBSET OF OR EQUAL TO
-2287 ; [*03F3.0020.0002.2287] # SUPERSET OF OR EQUAL TO
-2288 ; [*03F2.0054.0002.2288] # NEITHER A SUBSET OF NOR EQUAL TO; CANONSEQ
-2289 ; [*03F3.0054.0002.2289] # NEITHER A SUPERSET OF NOR EQUAL TO; CANONSEQ
-228A ; [*03F4.0020.0002.228A] # SUBSET OF WITH NOT EQUAL TO
-228B ; [*03F5.0020.0002.228B] # SUPERSET OF WITH NOT EQUAL TO
-228C ; [*03F6.0020.0002.228C] # MULTISET
-228D ; [*03F7.0020.0002.228D] # MULTISET MULTIPLICATION
-228E ; [*03F8.0020.0002.228E] # MULTISET UNION
-22A2 ; [*040C.0020.0002.22A2] # RIGHT TACK
-22A3 ; [*040D.0020.0002.22A3] # LEFT TACK
-22A4 ; [*040E.0020.0002.22A4] # DOWN TACK
-22A5 ; [*040F.0020.0002.22A5] # UP TACK
-22A6 ; [*0410.0020.0002.22A6] # ASSERTION
-22A7 ; [*0411.0020.0002.22A7] # MODELS
-22A8 ; [*0412.0020.0002.22A8] # TRUE
-22A9 ; [*0413.0020.0002.22A9] # FORCES
-22AA ; [*0414.0020.0002.22AA] # TRIPLE VERTICAL BAR RIGHT TURNSTILE
-22AB ; [*0415.0020.0002.22AB] # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
-22AC ; [*040C.0054.0002.22AC] # DOES NOT PROVE; CANONSEQ
-22AD ; [*0412.0054.0002.22AD] # NOT TRUE; CANONSEQ
-22AE ; [*0413.0054.0002.22AE] # DOES NOT FORCE; CANONSEQ
-22AF ; [*0415.0054.0002.22AF] # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE; CANONSEQ
-22B0 ; [*0416.0020.0002.22B0] # PRECEDES UNDER RELATION
-22B1 ; [*0417.0020.0002.22B1] # SUCCEEDS UNDER RELATION
-22B2 ; [*0418.0020.0002.22B2] # NORMAL SUBGROUP OF
-22B3 ; [*0419.0020.0002.22B3] # CONTAINS AS NORMAL SUBGROUP
-22B4 ; [*041A.0020.0002.22B4] # NORMAL SUBGROUP OF OR EQUAL TO
-22B5 ; [*041B.0020.0002.22B5] # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
-22B6 ; [*041C.0020.0002.22B6] # ORIGINAL OF
-22B7 ; [*041D.0020.0002.22B7] # IMAGE OF
-22B8 ; [*041E.0020.0002.22B8] # MULTIMAP
-22B9 ; [*041F.0020.0002.22B9] # HERMITIAN CONJUGATE MATRIX
-22BA ; [*0420.0020.0002.22BA] # INTERCALATE
-22BB ; [*0421.0020.0002.22BB] # XOR
-22BC ; [*0422.0020.0002.22BC] # NAND
-22BD ; [*0423.0020.0002.22BD] # NOR
-22C0 ; [*0426.0020.0002.22C0] # N-ARY LOGICAL AND
-22C1 ; [*0427.0020.0002.22C1] # N-ARY LOGICAL OR
-22C2 ; [*0428.0020.0002.22C2] # N-ARY INTERSECTION
-22C3 ; [*0429.0020.0002.22C3] # N-ARY UNION
-22C4 ; [*042A.0020.0002.22C4] # DIAMOND OPERATOR
-22C5 ; [*042B.0020.0002.22C5] # DOT OPERATOR
-22C7 ; [*042D.0020.0002.22C7] # DIVISION TIMES
-22C8 ; [*042E.0020.0002.22C8] # BOWTIE
-22C9 ; [*042F.0020.0002.22C9] # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
-22CA ; [*0430.0020.0002.22CA] # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
-22CB ; [*0431.0020.0002.22CB] # LEFT SEMIDIRECT PRODUCT
-22CC ; [*0432.0020.0002.22CC] # RIGHT SEMIDIRECT PRODUCT
-22CD ; [*0433.0020.0002.22CD] # REVERSED TILDE EQUALS
-22CE ; [*0434.0020.0002.22CE] # CURLY LOGICAL OR
-22CF ; [*0435.0020.0002.22CF] # CURLY LOGICAL AND
-22D0 ; [*0436.0020.0002.22D0] # DOUBLE SUBSET
-22D1 ; [*0437.0020.0002.22D1] # DOUBLE SUPERSET
-22D2 ; [*0438.0020.0002.22D2] # DOUBLE INTERSECTION
-22D3 ; [*0439.0020.0002.22D3] # DOUBLE UNION
-22D4 ; [*043A.0020.0002.22D4] # PITCHFORK
-22D5 ; [*043B.0020.0002.22D5] # EQUAL AND PARALLEL TO
-22D6 ; [*043C.0020.0002.22D6] # LESS-THAN WITH DOT
-22D7 ; [*043D.0020.0002.22D7] # GREATER-THAN WITH DOT
-22D8 ; [*043E.0020.0002.22D8] # VERY MUCH LESS-THAN
-22D9 ; [*043F.0020.0002.22D9] # VERY MUCH GREATER-THAN
-22DA ; [*0440.0020.0002.22DA] # LESS-THAN EQUAL TO OR GREATER-THAN
-22DB ; [*0441.0020.0002.22DB] # GREATER-THAN EQUAL TO OR LESS-THAN
-22DC ; [*0442.0020.0002.22DC] # EQUAL TO OR LESS-THAN
-22DD ; [*0443.0020.0002.22DD] # EQUAL TO OR GREATER-THAN
-22DE ; [*0444.0020.0002.22DE] # EQUAL TO OR PRECEDES
-22DF ; [*0445.0020.0002.22DF] # EQUAL TO OR SUCCEEDS
-22E0 ; [*03EC.0054.0002.22E0] # DOES NOT PRECEDE OR EQUAL; CANONSEQ
-22E1 ; [*03ED.0054.0002.22E1] # DOES NOT SUCCEED OR EQUAL; CANONSEQ
-22E6 ; [*0448.0020.0002.22E6] # LESS-THAN BUT NOT EQUIVALENT TO
-22E7 ; [*0449.0020.0002.22E7] # GREATER-THAN BUT NOT EQUIVALENT TO
-22E8 ; [*044A.0020.0002.22E8] # PRECEDES BUT NOT EQUIVALENT TO
-22E9 ; [*044B.0020.0002.22E9] # SUCCEEDS BUT NOT EQUIVALENT TO
-22EA ; [*0418.0054.0002.22EA] # NOT NORMAL SUBGROUP OF; CANONSEQ
-22EB ; [*0419.0054.0002.22EB] # DOES NOT CONTAIN AS NORMAL SUBGROUP; CANONSEQ
-22EC ; [*041A.0054.0002.22EC] # NOT NORMAL SUBGROUP OF OR EQUAL TO; CANONSEQ
-22ED ; [*041B.0054.0002.22ED] # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL; CANONSEQ
-22EE ; [*044C.0020.0002.22EE] # VERTICAL ELLIPSIS
-22EF ; [*044D.0020.0002.22EF] # MIDLINE HORIZONTAL ELLIPSIS
-22F0 ; [*044E.0020.0002.22F0] # UP RIGHT DIAGONAL ELLIPSIS
-22F1 ; [*044F.0020.0002.22F1] # DOWN RIGHT DIAGONAL ELLIPSIS
-2300 ; [*0450.0020.0002.2300] # DIAMETER SIGN
-2302 ; [*0452.0020.0002.2302] # HOUSE
-2303 ; [*0453.0020.0002.2303] # UP ARROWHEAD
-2304 ; [*0454.0020.0002.2304] # DOWN ARROWHEAD
-2305 ; [*0455.0020.0002.2305] # PROJECTIVE
-2306 ; [*0456.0020.0002.2306] # PERSPECTIVE
-2307 ; [*0457.0020.0002.2307] # WAVY LINE
-2308 ; [*0458.0020.0002.2308] # LEFT CEILING
-2309 ; [*0459.0020.0002.2309] # RIGHT CEILING
-230A ; [*045A.0020.0002.230A] # LEFT FLOOR
-230B ; [*045B.0020.0002.230B] # RIGHT FLOOR
-230C ; [*045C.0020.0002.230C] # BOTTOM RIGHT CROP
-230D ; [*045D.0020.0002.230D] # BOTTOM LEFT CROP
-230E ; [*045E.0020.0002.230E] # TOP RIGHT CROP
-230F ; [*045F.0020.0002.230F] # TOP LEFT CROP
-2310 ; [*0460.0020.0002.2310] # REVERSED NOT SIGN
-2312 ; [*0462.0020.0002.2312] # ARC
-2313 ; [*0463.0020.0002.2313] # SEGMENT
-2314 ; [*0464.0020.0002.2314] # SECTOR
-2315 ; [*0465.0020.0002.2315] # TELEPHONE RECORDER
-2316 ; [*0466.0020.0002.2316] # POSITION INDICATOR
-2318 ; [*0468.0020.0002.2318] # PLACE OF INTEREST SIGN
-2319 ; [*0469.0020.0002.2319] # TURNED NOT SIGN
-231A ; [*046A.0020.0002.231A] # WATCH
-231B ; [*046B.0020.0002.231B] # HOURGLASS
-2322 ; [*0472.0020.0002.2322] # FROWN
-2323 ; [*0473.0020.0002.2323] # SMILE
-2324 ; [*0474.0020.0002.2324] # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
-2325 ; [*0475.0020.0002.2325] # OPTION KEY
-2326 ; [*0476.0020.0002.2326] # ERASE TO THE RIGHT
-2328 ; [*0478.0020.0002.2328] # KEYBOARD
-232B ; [*0479.0020.0002.232B] # ERASE TO THE LEFT
-232C ; [*047A.0020.0002.232C] # BENZENE RING
-232D ; [*047B.0020.0002.232D] # CYLINDRICITY
-232E ; [*047C.0020.0002.232E] # ALL AROUND-PROFILE
-232F ; [*047D.0020.0002.232F] # SYMMETRY
-2330 ; [*047E.0020.0002.2330] # TOTAL RUNOUT
-2331 ; [*047F.0020.0002.2331] # DIMENSION ORIGIN
-2332 ; [*0480.0020.0002.2332] # CONICAL TAPER
-2333 ; [*0481.0020.0002.2333] # SLOPE
-2334 ; [*0482.0020.0002.2334] # COUNTERBORE
-2335 ; [*0483.0020.0002.2335] # COUNTERSINK
-237B ; [*04C9.0020.0002.237B] # NOT CHECK MARK
-237F ; [*04CC.0020.0002.237F] # VERTICAL LINE WITH MIDDLE DOT
-2397 ; [*04E4.0020.0002.2397] # PREVIOUS PAGE
-2398 ; [*04E5.0020.0002.2398] # NEXT PAGE
-25B0 ; [*05C0.0020.0002.25B0] # BLACK PARALLELOGRAM
-25B1 ; [*05C1.0020.0002.25B1] # WHITE PARALLELOGRAM
-25C6 ; [*05D6.0020.0002.25C6] # BLACK DIAMOND
-25C7 ; [*05D7.0020.0002.25C7] # WHITE DIAMOND
-25C8 ; [*05D8.0020.0002.25C8] # WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND
-25C9 ; [*05D9.0020.0002.25C9] # FISHEYE
-25CA ; [*05DA.0020.0002.25CA] # LOZENGE
-25CE ; [*05DE.0020.0002.25CE] # BULLSEYE
-25D8 ; [*05E8.0020.0002.25D8] # INVERSE BULLET
-25E6 ; [*05F6.0020.0002.25E6] # WHITE BULLET
-2600 ; [*0608.0020.0002.2600] # BLACK SUN WITH RAYS
-2601 ; [*0609.0020.0002.2601] # CLOUD
-2602 ; [*060A.0020.0002.2602] # UMBRELLA
-2603 ; [*060B.0020.0002.2603] # SNOWMAN
-2604 ; [*060C.0020.0002.2604] # COMET
-2607 ; [*060F.0020.0002.2607] # LIGHTNING
-2608 ; [*0610.0020.0002.2608] # THUNDERSTORM
-2609 ; [*0611.0020.0002.2609] # SUN
-260A ; [*0612.0020.0002.260A] # ASCENDING NODE
-260B ; [*0613.0020.0002.260B] # DESCENDING NODE
-260C ; [*0614.0020.0002.260C] # CONJUNCTION
-260D ; [*0615.0020.0002.260D] # OPPOSITION
-260E ; [*0616.0020.0002.260E] # BLACK TELEPHONE
-260F ; [*0617.0020.0002.260F] # WHITE TELEPHONE
-2613 ; [*061B.0020.0002.2613] # SALTIRE
-2619 ; [*061C.0020.0002.2619] # REVERSED ROTATED FLORAL HEART BULLET
-2620 ; [*0623.0020.0002.2620] # SKULL AND CROSSBONES
-2621 ; [*0624.0020.0002.2621] # CAUTION SIGN
-2622 ; [*0625.0020.0002.2622] # RADIOACTIVE SIGN
-2623 ; [*0626.0020.0002.2623] # BIOHAZARD SIGN
-2624 ; [*0627.0020.0002.2624] # CADUCEUS
-2625 ; [*0628.0020.0002.2625] # ANKH
-2626 ; [*0629.0020.0002.2626] # ORTHODOX CROSS
-2627 ; [*062A.0020.0002.2627] # CHI RHO
-2628 ; [*062B.0020.0002.2628] # CROSS OF LORRAINE
-2629 ; [*062C.0020.0002.2629] # CROSS OF JERUSALEM
-262C ; [*062F.0020.0002.262C] # ADI SHAKTI
-262D ; [*0630.0020.0002.262D] # HAMMER AND SICKLE
-262F ; [*0632.0020.0002.262F] # YIN YANG
-2638 ; [*063B.0020.0002.2638] # WHEEL OF DHARMA
-2639 ; [*063C.0020.0002.2639] # WHITE FROWNING FACE
-263A ; [*063D.0020.0002.263A] # WHITE SMILING FACE
-263B ; [*063E.0020.0002.263B] # BLACK SMILING FACE
-263C ; [*063F.0020.0002.263C] # WHITE SUN WITH RAYS
-263D ; [*0640.0020.0002.263D] # FIRST QUARTER MOON
-263E ; [*0641.0020.0002.263E] # LAST QUARTER MOON
-263F ; [*0642.0020.0002.263F] # MERCURY
-2640 ; [*0643.0020.0002.2640] # FEMALE SIGN
-2641 ; [*0644.0020.0002.2641] # EARTH
-2642 ; [*0645.0020.0002.2642] # MALE SIGN
-2643 ; [*0646.0020.0002.2643] # JUPITER
-2644 ; [*0647.0020.0002.2644] # SATURN
-2645 ; [*0648.0020.0002.2645] # URANUS
-2646 ; [*0649.0020.0002.2646] # NEPTUNE
-2647 ; [*064A.0020.0002.2647] # PLUTO
-2648 ; [*064B.0020.0002.2648] # ARIES
-2649 ; [*064C.0020.0002.2649] # TAURUS
-264A ; [*064D.0020.0002.264A] # GEMINI
-264B ; [*064E.0020.0002.264B] # CANCER
-264C ; [*064F.0020.0002.264C] # LEO
-264D ; [*0650.0020.0002.264D] # VIRGO
-264E ; [*0651.0020.0002.264E] # LIBRA
-264F ; [*0652.0020.0002.264F] # SCORPIUS
-2650 ; [*0653.0020.0002.2650] # SAGITTARIUS
-2651 ; [*0654.0020.0002.2651] # CAPRICORN
-2652 ; [*0655.0020.0002.2652] # AQUARIUS
-2653 ; [*0656.0020.0002.2653] # PISCES
-2668 ; [*066B.0020.0002.2668] # HOT SPRINGS
-2669 ; [*066C.0020.0002.2669] # QUARTER NOTE
-266A ; [*066D.0020.0002.266A] # EIGHTH NOTE
-266B ; [*066E.0020.0002.266B] # BEAMED EIGHTH NOTES
-266C ; [*066F.0020.0002.266C] # BEAMED SIXTEENTH NOTES
-2701 ; [*0672.0020.0002.2701] # UPPER BLADE SCISSORS
-2702 ; [*0673.0020.0002.2702] # BLACK SCISSORS
-2703 ; [*0674.0020.0002.2703] # LOWER BLADE SCISSORS
-2704 ; [*0675.0020.0002.2704] # WHITE SCISSORS
-2706 ; [*0676.0020.0002.2706] # TELEPHONE LOCATION SIGN
-2707 ; [*0677.0020.0002.2707] # TAPE DRIVE
-2708 ; [*0678.0020.0002.2708] # AIRPLANE
-2709 ; [*0679.0020.0002.2709] # ENVELOPE
-270C ; [*067A.0020.0002.270C] # VICTORY HAND
-270D ; [*067B.0020.0002.270D] # WRITING HAND
-270E ; [*067C.0020.0002.270E] # LOWER RIGHT PENCIL
-270F ; [*067D.0020.0002.270F] # PENCIL
-2710 ; [*067E.0020.0002.2710] # UPPER RIGHT PENCIL
-2711 ; [*067F.0020.0002.2711] # WHITE NIB
-2712 ; [*0680.0020.0002.2712] # BLACK NIB
-2713 ; [*0681.0020.0002.2713] # CHECK MARK
-2714 ; [*0682.0020.0002.2714] # HEAVY CHECK MARK
-2715 ; [*0683.0020.0002.2715] # MULTIPLICATION X
-2716 ; [*0684.0020.0002.2716] # HEAVY MULTIPLICATION X
-2717 ; [*0685.0020.0002.2717] # BALLOT X
-2718 ; [*0686.0020.0002.2718] # HEAVY BALLOT X
-271B ; [*0689.0020.0002.271B] # OPEN CENTRE CROSS
-271C ; [*068A.0020.0002.271C] # HEAVY OPEN CENTRE CROSS
-271D ; [*068B.0020.0002.271D] # LATIN CROSS
-271E ; [*068C.0020.0002.271E] # SHADOWED WHITE LATIN CROSS
-271F ; [*068D.0020.0002.271F] # OUTLINED LATIN CROSS
-2720 ; [*068E.0020.0002.2720] # MALTESE CROSS
-2722 ; [*0690.0020.0002.2722] # FOUR TEARDROP-SPOKED ASTERISK
-2723 ; [*0691.0020.0002.2723] # FOUR BALLOON-SPOKED ASTERISK
-2724 ; [*0692.0020.0002.2724] # HEAVY FOUR BALLOON-SPOKED ASTERISK
-2725 ; [*0693.0020.0002.2725] # FOUR CLUB-SPOKED ASTERISK
-2731 ; [*069E.0020.0002.2731] # HEAVY ASTERISK
-2732 ; [*069F.0020.0002.2732] # OPEN CENTRE ASTERISK
-2733 ; [*06A0.0020.0002.2733] # EIGHT SPOKED ASTERISK
-273A ; [*06A7.0020.0002.273A] # SIXTEEN POINTED ASTERISK
-273B ; [*06A8.0020.0002.273B] # TEARDROP-SPOKED ASTERISK
-273C ; [*06A9.0020.0002.273C] # OPEN CENTRE TEARDROP-SPOKED ASTERISK
-273D ; [*06AA.0020.0002.273D] # HEAVY TEARDROP-SPOKED ASTERISK
-273E ; [*06AB.0020.0002.273E] # SIX PETALLED BLACK AND WHITE FLORETTE
-273F ; [*06AC.0020.0002.273F] # BLACK FLORETTE
-2740 ; [*06AD.0020.0002.2740] # WHITE FLORETTE
-2741 ; [*06AE.0020.0002.2741] # EIGHT PETALLED OUTLINED BLACK FLORETTE
-2743 ; [*06B0.0020.0002.2743] # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK
-2744 ; [*06B1.0020.0002.2744] # SNOWFLAKE
-2745 ; [*06B2.0020.0002.2745] # TIGHT TRIFOLIATE SNOWFLAKE
-2746 ; [*06B3.0020.0002.2746] # HEAVY CHEVRON SNOWFLAKE
-2747 ; [*06B4.0020.0002.2747] # SPARKLE
-2748 ; [*06B5.0020.0002.2748] # HEAVY SPARKLE
-2749 ; [*06B6.0020.0002.2749] # BALLOON-SPOKED ASTERISK
-274A ; [*06B7.0020.0002.274A] # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
-274B ; [*06B8.0020.0002.274B] # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
-2756 ; [*06BE.0020.0002.2756] # BLACK DIAMOND MINUS WHITE X
-2758 ; [*06BF.0020.0002.2758] # LIGHT VERTICAL BAR
-2759 ; [*06C0.0020.0002.2759] # MEDIUM VERTICAL BAR
-275A ; [*06C1.0020.0002.275A] # HEAVY VERTICAL BAR
-275B ; [*06C2.0020.0002.275B] # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT
-275C ; [*06C3.0020.0002.275C] # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT
-275D ; [*06C4.0020.0002.275D] # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT
-275E ; [*06C5.0020.0002.275E] # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
-2761 ; [*06C6.0020.0002.2761] # CURVED STEM PARAGRAPH SIGN ORNAMENT
-2762 ; [*06C7.0020.0002.2762] # HEAVY EXCLAMATION MARK ORNAMENT
-2763 ; [*06C8.0020.0002.2763] # HEAVY HEART EXCLAMATION MARK ORNAMENT
-2764 ; [*06C9.0020.0002.2764] # HEAVY BLACK HEART
-2765 ; [*06CA.0020.0002.2765] # ROTATED HEAVY BLACK HEART BULLET
-2766 ; [*06CB.0020.0002.2766] # FLORAL HEART
-2767 ; [*06CC.0020.0002.2767] # ROTATED FLORAL HEART BULLET
-27A2 ; [*06DB.0020.0002.27A2] # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD
-27A3 ; [*06DC.0020.0002.27A3] # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD
-27A4 ; [*06DD.0020.0002.27A4] # BLACK RIGHTWARDS ARROWHEAD
-2FF0 ; [*07F7.0020.0002.2FF0] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
-2FF1 ; [*07F8.0020.0002.2FF1] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW
-2FF2 ; [*07F9.0020.0002.2FF2] # IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT
-2FF3 ; [*07FA.0020.0002.2FF3] # IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW
-2FF4 ; [*07FB.0020.0002.2FF4] # IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND
-2FF5 ; [*07FC.0020.0002.2FF5] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE
-2FF6 ; [*07FD.0020.0002.2FF6] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW
-2FF7 ; [*07FE.0020.0002.2FF7] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT
-2FF8 ; [*07FF.0020.0002.2FF8] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT
-2FF9 ; [*0800.0020.0002.2FF9] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT
-2FFA ; [*0801.0020.0002.2FFA] # IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT
-2FFB ; [*0802.0020.0002.2FFB] # IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
-3001 ; [*0220.0020.0002.3001] # IDEOGRAPHIC COMMA
-3002 ; [*024A.0020.0002.3002] # IDEOGRAPHIC FULL STOP
-3003 ; [*02A4.0020.0002.3003] # DITTO MARK
-3010 ; [*027C.0020.0002.3010] # LEFT BLACK LENTICULAR BRACKET
-3011 ; [*027D.0020.0002.3011] # RIGHT BLACK LENTICULAR BRACKET
-3012 ; [*0804.0020.0002.3012] # POSTAL MARK
-3013 ; [*0805.0020.0002.3013] # GETA MARK
-3014 ; [*027E.0020.0002.3014] # LEFT TORTOISE SHELL BRACKET
-3015 ; [*027F.0020.0002.3015] # RIGHT TORTOISE SHELL BRACKET
-3016 ; [*0280.0020.0002.3016] # LEFT WHITE LENTICULAR BRACKET
-3017 ; [*0281.0020.0002.3017] # RIGHT WHITE LENTICULAR BRACKET
-3018 ; [*0282.0020.0002.3018] # LEFT WHITE TORTOISE SHELL BRACKET
-3019 ; [*0283.0020.0002.3019] # RIGHT WHITE TORTOISE SHELL BRACKET
-301C ; [*0216.0020.0002.301C] # WAVE DASH
-301D ; [*0261.0020.0002.301D] # REVERSED DOUBLE PRIME QUOTATION MARK
-301E ; [*0262.0020.0002.301E] # DOUBLE PRIME QUOTATION MARK
-301F ; [*0263.0020.0002.301F] # LOW DOUBLE PRIME QUOTATION MARK
-3020 ; [*0806.0020.0002.3020] # POSTAL MARK FACE
-3030 ; [*0217.0020.0002.3030] # WAVY DASH
-303E ; [*0808.0020.0002.303E] # IDEOGRAPHIC VARIATION INDICATOR
-303F ; [*0809.0020.0002.303F] # IDEOGRAPHIC HALF FILL SPACE
-30FB ; [*0218.0020.0002.30FB] # KATAKANA MIDDLE DOT
-3190 ; [*080A.0020.0002.3190] # IDEOGRAPHIC ANNOTATION LINKING MARK
-3191 ; [*080B.0020.0002.3191] # IDEOGRAPHIC ANNOTATION REVERSE MARK
-FD3E ; [*0286.0020.0002.FD3E] # ORNATE LEFT PARENTHESIS
-FD3F ; [*0287.0020.0002.FD3F] # ORNATE RIGHT PARENTHESIS
-FEFF ; [.0000.0000.0000.FEFF] # ZERO WIDTH NO-BREAK SPACE
-FFFC ; [*080D.0020.0002.FFFC] # OBJECT REPLACEMENT CHARACTER
-FFFD ; [*080E.0020.0002.FFFD] # REPLACEMENT CHARACTER
-0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE
-0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
-0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
-0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
-0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; CANON
-0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
-0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; CANON
-0306 ; [.0000.0037.0002.0306] # COMBINING BREVE
-0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
-030C ; [.0000.0041.0002.030C] # COMBINING CARON
-030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
-0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
-030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
-0303 ; [.0000.004E.0002.0303] # COMBINING TILDE
-0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
-0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
-0327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA
-0328 ; [.0000.0058.0002.0328] # COMBINING OGONEK
-0304 ; [.0000.005A.0002.0304] # COMBINING MACRON
-0305 ; [.0000.005E.0002.0305] # COMBINING OVERLINE
-0309 ; [.0000.005F.0002.0309] # COMBINING HOOK ABOVE
-030D ; [.0000.0060.0002.030D] # COMBINING VERTICAL LINE ABOVE
-030E ; [.0000.0061.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE
-030F ; [.0000.0062.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
-0310 ; [.0000.0063.0002.0310] # COMBINING CANDRABINDU
-0311 ; [.0000.0064.0002.0311] # COMBINING INVERTED BREVE
-0312 ; [.0000.0065.0002.0312] # COMBINING TURNED COMMA ABOVE
-0315 ; [.0000.0066.0002.0315] # COMBINING COMMA ABOVE RIGHT
-0316 ; [.0000.0067.0002.0316] # COMBINING GRAVE ACCENT BELOW
-0317 ; [.0000.0068.0002.0317] # COMBINING ACUTE ACCENT BELOW
-0318 ; [.0000.0069.0002.0318] # COMBINING LEFT TACK BELOW
-0319 ; [.0000.006A.0002.0319] # COMBINING RIGHT TACK BELOW
-031B ; [.0000.006C.0002.031B] # COMBINING HORN
-031C ; [.0000.0072.0002.031C] # COMBINING LEFT HALF RING BELOW
-031D ; [.0000.0073.0002.031D] # COMBINING UP TACK BELOW
-031E ; [.0000.0074.0002.031E] # COMBINING DOWN TACK BELOW
-031F ; [.0000.0075.0002.031F] # COMBINING PLUS SIGN BELOW
-0320 ; [.0000.0076.0002.0320] # COMBINING MINUS SIGN BELOW
-0321 ; [.0000.0077.0002.0321] # COMBINING PALATALIZED HOOK BELOW
-0322 ; [.0000.0078.0002.0322] # COMBINING RETROFLEX HOOK BELOW
-0323 ; [.0000.0079.0002.0323] # COMBINING DOT BELOW
-0324 ; [.0000.007E.0002.0324] # COMBINING DIAERESIS BELOW
-0325 ; [.0000.007F.0002.0325] # COMBINING RING BELOW
-0326 ; [.0000.0080.0002.0326] # COMBINING COMMA BELOW
-0329 ; [.0000.0081.0002.0329] # COMBINING VERTICAL LINE BELOW
-032A ; [.0000.0082.0002.032A] # COMBINING BRIDGE BELOW
-032B ; [.0000.0083.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW
-032C ; [.0000.0084.0002.032C] # COMBINING CARON BELOW
-032D ; [.0000.0085.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
-032E ; [.0000.0086.0002.032E] # COMBINING BREVE BELOW
-032F ; [.0000.0087.0002.032F] # COMBINING INVERTED BREVE BELOW
-0330 ; [.0000.0088.0002.0330] # COMBINING TILDE BELOW
-0331 ; [.0000.0089.0002.0331] # COMBINING MACRON BELOW
-0333 ; [.0000.008A.0002.0333] # COMBINING DOUBLE LOW LINE
-0334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
-0335 ; [.0000.008C.0002.0335] # COMBINING SHORT STROKE OVERLAY
-0336 ; [.0000.008D.0002.0336] # COMBINING LONG STROKE OVERLAY
-0337 ; [.0000.008E.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY
-0339 ; [.0000.008F.0002.0339] # COMBINING RIGHT HALF RING BELOW
-033A ; [.0000.0090.0002.033A] # COMBINING INVERTED BRIDGE BELOW
-033C ; [.0000.0092.0002.033C] # COMBINING SEAGULL BELOW
-033D ; [.0000.0093.0002.033D] # COMBINING X ABOVE
-033E ; [.0000.0094.0002.033E] # COMBINING VERTICAL TILDE
-033F ; [.0000.0095.0002.033F] # COMBINING DOUBLE OVERLINE
-0346 ; [.0000.0097.0002.0346] # COMBINING BRIDGE ABOVE
-0347 ; [.0000.0098.0002.0347] # COMBINING EQUALS SIGN BELOW
-0348 ; [.0000.0099.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW
-034A ; [.0000.009B.0002.034A] # COMBINING NOT TILDE ABOVE
-034B ; [.0000.009C.0002.034B] # COMBINING HOMOTHETIC ABOVE
-034C ; [.0000.009D.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE
-0360 ; [.0000.00A0.0002.0360] # COMBINING DOUBLE TILDE
-0361 ; [.0000.00A1.0002.0361] # COMBINING DOUBLE INVERTED BREVE
-FE20 ; [.0000.00A3.0002.FE20] # COMBINING LIGATURE LEFT HALF
-FE21 ; [.0000.00A4.0002.FE21] # COMBINING LIGATURE RIGHT HALF
-FE22 ; [.0000.00A5.0002.FE22] # COMBINING DOUBLE TILDE LEFT HALF
-FE23 ; [.0000.00A6.0002.FE23] # COMBINING DOUBLE TILDE RIGHT HALF
-302A ; [.0000.0138.0002.302A] # IDEOGRAPHIC LEVEL TONE MARK
-302B ; [.0000.0139.0002.302B] # IDEOGRAPHIC RISING TONE MARK
-302C ; [.0000.013A.0002.302C] # IDEOGRAPHIC DEPARTING TONE MARK
-302D ; [.0000.013B.0002.302D] # IDEOGRAPHIC ENTERING TONE MARK
-302E ; [.0000.013C.0002.302E] # HANGUL SINGLE DOT TONE MARK
-302F ; [.0000.013D.0002.302F] # HANGUL DOUBLE DOT TONE MARK
-3099 ; [.0000.013E.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
-309A ; [.0000.013F.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
-20D2 ; [.0000.0142.0002.20D2] # COMBINING LONG VERTICAL LINE OVERLAY
-20D3 ; [.0000.0143.0002.20D3] # COMBINING SHORT VERTICAL LINE OVERLAY
-20D8 ; [.0000.0148.0002.20D8] # COMBINING RING OVERLAY
-20D9 ; [.0000.0149.0002.20D9] # COMBINING CLOCKWISE RING OVERLAY
-20DA ; [.0000.014A.0002.20DA] # COMBINING ANTICLOCKWISE RING OVERLAY
-20DB ; [.0000.014B.0002.20DB] # COMBINING THREE DOTS ABOVE
-20DC ; [.0000.014C.0002.20DC] # COMBINING FOUR DOTS ABOVE
-20DF ; [.0000.014F.0002.20DF] # COMBINING ENCLOSING DIAMOND
-20E2 ; [.0000.0152.0002.20E2] # COMBINING ENCLOSING SCREEN
-20E3 ; [.0000.0153.0002.20E3] # COMBINING ENCLOSING KEYCAP
-02D0 ; [.081F.0020.0002.02D0] # MODIFIER LETTER TRIANGULAR COLON
-02D1 ; [.0820.0020.0002.02D1] # MODIFIER LETTER HALF TRIANGULAR COLON
-3005 ; [.0823.0020.0002.3005] # IDEOGRAPHIC ITERATION MARK
-3031 ; [.0824.0020.0002.3031] # VERTICAL KANA REPEAT MARK
-3032 ; [.0824.013E.0002.3032] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK; CANONSEQ
-3033 ; [.0825.0020.0002.3033] # VERTICAL KANA REPEAT MARK UPPER HALF
-3034 ; [.0825.013E.0002.3034] # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF; CANONSEQ
-3035 ; [.0826.0020.0002.3035] # VERTICAL KANA REPEAT MARK LOWER HALF
-309D ; [.0827.0020.0002.309D] # HIRAGANA ITERATION MARK
-309E ; [.0827.013E.0002.309E] # HIRAGANA VOICED ITERATION MARK; CANONSEQ
-30FC ; [.0828.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
-30FD ; [.0829.0020.0002.30FD] # KATAKANA ITERATION MARK
-30FE ; [.0829.013E.0002.30FE] # KATAKANA VOICED ITERATION MARK; CANONSEQ
-00A4 ; [.082A.0020.0002.00A4] # CURRENCY SIGN
-00A2 ; [.082B.0020.0002.00A2] # CENT SIGN
-0024 ; [.082C.0020.0002.0024] # DOLLAR SIGN
-00A3 ; [.082D.0020.0002.00A3] # POUND SIGN
-00A5 ; [.082E.0020.0002.00A5] # YEN SIGN
-20A0 ; [.0833.0020.0002.20A0] # EURO-CURRENCY SIGN
-20A1 ; [.0834.0020.0002.20A1] # COLON SIGN
-20A2 ; [.0835.0020.0002.20A2] # CRUZEIRO SIGN
-20A3 ; [.0836.0020.0002.20A3] # FRENCH FRANC SIGN
-20A4 ; [.0837.0020.0002.20A4] # LIRA SIGN
-20A5 ; [.0838.0020.0002.20A5] # MILL SIGN
-20A6 ; [.0839.0020.0002.20A6] # NAIRA SIGN
-20A7 ; [.083A.0020.0002.20A7] # PESETA SIGN
-20A9 ; [.083B.0020.0002.20A9] # WON SIGN
-20AA ; [.083C.0020.0002.20AA] # NEW SHEQEL SIGN
-20AB ; [.083D.0020.0002.20AB] # DONG SIGN
-20AC ; [.083E.0020.0002.20AC] # EURO SIGN
-20AD ; [.083F.0020.0002.20AD] # KIP SIGN
-20AE ; [.0840.0020.0002.20AE] # TUGRIK SIGN
-20AF ; [.0841.0020.0002.20AF] # DRACHMA SIGN
-2108 ; [.0843.0020.0002.2108] # SCRUPLE
-2117 ; [.0845.0020.0002.2117] # SOUND RECORDING COPYRIGHT
-2118 ; [.0846.0020.0002.2118] # SCRIPT CAPITAL P
-211E ; [.0847.0020.0002.211E] # PRESCRIPTION TAKE
-211F ; [.0848.0020.0002.211F] # RESPONSE
-2123 ; [.0849.0020.0002.2123] # VERSICLE
-2125 ; [.084A.0020.0002.2125] # OUNCE SIGN
-2127 ; [.084B.0020.0002.2127] # INVERTED OHM SIGN
-2132 ; [.084E.0020.0002.2132] # TURNED CAPITAL F
-213A ; [.084F.0020.0002.213A] # ROTATED CAPITAL Q
-2180 ; [.0850.0020.0002.2180] # ROMAN NUMERAL ONE THOUSAND C D
-2181 ; [.0851.0020.0002.2181] # ROMAN NUMERAL FIVE THOUSAND
-2182 ; [.0852.0020.0002.2182] # ROMAN NUMERAL TEN THOUSAND
-2183 ; [.0853.0020.0002.2183] # ROMAN NUMERAL REVERSED ONE HUNDRED
-266D ; [.0854.0020.0002.266D] # MUSIC FLAT SIGN
-266E ; [.0855.0020.0002.266E] # MUSIC NATURAL SIGN
-266F ; [.0856.0020.0002.266F] # MUSIC SHARP SIGN
-0030 ; [.0857.0020.0002.0030] # DIGIT ZERO
-3007 ; [.0857.016E.0002.3007] # IDEOGRAPHIC NUMBER ZERO
-0031 ; [.0858.0020.0002.0031] # DIGIT ONE
-0032 ; [.0859.0020.0002.0032] # DIGIT TWO
-0033 ; [.085A.0020.0002.0033] # DIGIT THREE
-0034 ; [.085B.0020.0002.0034] # DIGIT FOUR
-0035 ; [.085C.0020.0002.0035] # DIGIT FIVE
-0036 ; [.085D.0020.0002.0036] # DIGIT SIX
-0037 ; [.085E.0020.0002.0037] # DIGIT SEVEN
-0038 ; [.085F.0020.0002.0038] # DIGIT EIGHT
-0039 ; [.0860.0020.0002.0039] # DIGIT NINE
-0061 ; [.0861.0020.0002.0061] # LATIN SMALL LETTER A
-0041 ; [.0861.0020.0008.0041] # LATIN CAPITAL LETTER A
-00E1 ; [.0861.0032.0002.00E1] # LATIN SMALL LETTER A WITH ACUTE; CANONSEQ
-00C1 ; [.0861.0032.0008.00C1] # LATIN CAPITAL LETTER A WITH ACUTE; CANONSEQ
-00E0 ; [.0861.0035.0002.00E0] # LATIN SMALL LETTER A WITH GRAVE; CANONSEQ
-00C0 ; [.0861.0035.0008.00C0] # LATIN CAPITAL LETTER A WITH GRAVE; CANONSEQ
-0103 ; [.0861.0037.0002.0103] # LATIN SMALL LETTER A WITH BREVE; CANONSEQ
-0102 ; [.0861.0037.0008.0102] # LATIN CAPITAL LETTER A WITH BREVE; CANONSEQ
-1EAF ; [.0861.0038.0002.1EAF] # LATIN SMALL LETTER A WITH BREVE AND ACUTE; CANONSEQ
-1EAE ; [.0861.0038.0008.1EAE] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE; CANONSEQ
-1EB1 ; [.0861.0039.0002.1EB1] # LATIN SMALL LETTER A WITH BREVE AND GRAVE; CANONSEQ
-1EB0 ; [.0861.0039.0008.1EB0] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE; CANONSEQ
-1EB5 ; [.0861.003A.0002.1EB5] # LATIN SMALL LETTER A WITH BREVE AND TILDE; CANONSEQ
-1EB4 ; [.0861.003A.0008.1EB4] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE; CANONSEQ
-1EB3 ; [.0861.003B.0002.1EB3] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE; CANONSEQ
-1EB2 ; [.0861.003B.0008.1EB2] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE; CANONSEQ
-00E2 ; [.0861.003C.0002.00E2] # LATIN SMALL LETTER A WITH CIRCUMFLEX; CANONSEQ
-00C2 ; [.0861.003C.0008.00C2] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; CANONSEQ
-1EA5 ; [.0861.003D.0002.1EA5] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE; CANONSEQ
-1EA4 ; [.0861.003D.0008.1EA4] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE; CANONSEQ
-1EA7 ; [.0861.003E.0002.1EA7] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE; CANONSEQ
-1EA6 ; [.0861.003E.0008.1EA6] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE; CANONSEQ
-1EAB ; [.0861.003F.0002.1EAB] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE; CANONSEQ
-1EAA ; [.0861.003F.0008.1EAA] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE; CANONSEQ
-1EA9 ; [.0861.0040.0002.1EA9] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; CANONSEQ
-1EA8 ; [.0861.0040.0008.1EA8] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE; CANONSEQ
-01CE ; [.0861.0041.0002.01CE] # LATIN SMALL LETTER A WITH CARON; CANONSEQ
-01CD ; [.0861.0041.0008.01CD] # LATIN CAPITAL LETTER A WITH CARON; CANONSEQ
-00E5 ; [.0861.0043.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; CANONSEQ
-00C5 ; [.0861.0043.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; CANONSEQ
-212B ; [.0861.0043.0008.212B] # ANGSTROM SIGN; CANONSEQ
-01FB ; [.0861.0044.0002.01FB] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE; CANONSEQ
-01FA ; [.0861.0044.0008.01FA] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE; CANONSEQ
-00E4 ; [.0861.0047.0002.00E4] # LATIN SMALL LETTER A WITH DIAERESIS; CANONSEQ
-00C4 ; [.0861.0047.0008.00C4] # LATIN CAPITAL LETTER A WITH DIAERESIS; CANONSEQ
-01DF ; [.0861.004B.0002.01DF] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON; CANONSEQ
-01DE ; [.0861.004B.0008.01DE] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON; CANONSEQ
-00E3 ; [.0861.004E.0002.00E3] # LATIN SMALL LETTER A WITH TILDE; CANONSEQ
-00C3 ; [.0861.004E.0008.00C3] # LATIN CAPITAL LETTER A WITH TILDE; CANONSEQ
-0227 ; [.0861.0052.0002.0227] # LATIN SMALL LETTER A WITH DOT ABOVE; CANONSEQ
-0226 ; [.0861.0052.0008.0226] # LATIN CAPITAL LETTER A WITH DOT ABOVE; CANONSEQ
-01E1 ; [.0861.0053.0002.01E1] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON; CANONSEQ
-01E0 ; [.0861.0053.0008.01E0] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON; CANONSEQ
-0105 ; [.0861.0058.0002.0105] # LATIN SMALL LETTER A WITH OGONEK; CANONSEQ
-0104 ; [.0861.0058.0008.0104] # LATIN CAPITAL LETTER A WITH OGONEK; CANONSEQ
-0101 ; [.0861.005A.0002.0101] # LATIN SMALL LETTER A WITH MACRON; CANONSEQ
-0100 ; [.0861.005A.0008.0100] # LATIN CAPITAL LETTER A WITH MACRON; CANONSEQ
-1EA3 ; [.0861.005F.0002.1EA3] # LATIN SMALL LETTER A WITH HOOK ABOVE; CANONSEQ
-1EA2 ; [.0861.005F.0008.1EA2] # LATIN CAPITAL LETTER A WITH HOOK ABOVE; CANONSEQ
-0201 ; [.0861.0062.0002.0201] # LATIN SMALL LETTER A WITH DOUBLE GRAVE; CANONSEQ
-0200 ; [.0861.0062.0008.0200] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; CANONSEQ
-0203 ; [.0861.0064.0002.0203] # LATIN SMALL LETTER A WITH INVERTED BREVE; CANONSEQ
-0202 ; [.0861.0064.0008.0202] # LATIN CAPITAL LETTER A WITH INVERTED BREVE; CANONSEQ
-1EA1 ; [.0861.0079.0002.1EA1] # LATIN SMALL LETTER A WITH DOT BELOW; CANONSEQ
-1EA0 ; [.0861.0079.0008.1EA0] # LATIN CAPITAL LETTER A WITH DOT BELOW; CANONSEQ
-1EB7 ; [.0861.007A.0002.1EB7] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW; CANONSEQ
-1EB6 ; [.0861.007A.0008.1EB6] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW; CANONSEQ
-1EAD ; [.0861.007B.0002.1EAD] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW; CANONSEQ
-1EAC ; [.0861.007B.0008.1EAC] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW; CANONSEQ
-1E01 ; [.0861.007F.0002.1E01] # LATIN SMALL LETTER A WITH RING BELOW; CANONSEQ
-1E00 ; [.0861.007F.0008.1E00] # LATIN CAPITAL LETTER A WITH RING BELOW; CANONSEQ
-00E6 ; [.0865.0020.0002.00E6] # LATIN SMALL LETTER AE
-00C6 ; [.0865.0020.0008.00C6] # LATIN CAPITAL LETTER AE
-01FD ; [.0865.0032.0002.01FD] # LATIN SMALL LETTER AE WITH ACUTE; CANONSEQ
-01FC ; [.0865.0032.0008.01FC] # LATIN CAPITAL LETTER AE WITH ACUTE; CANONSEQ
-01E3 ; [.0865.005A.0002.01E3] # LATIN SMALL LETTER AE WITH MACRON; CANONSEQ
-01E2 ; [.0865.005A.0008.01E2] # LATIN CAPITAL LETTER AE WITH MACRON; CANONSEQ
-0250 ; [.0869.0020.0002.0250] # LATIN SMALL LETTER TURNED A
-0251 ; [.086D.0020.0002.0251] # LATIN SMALL LETTER ALPHA
-0252 ; [.0871.0020.0002.0252] # LATIN SMALL LETTER TURNED ALPHA
-0062 ; [.0875.0020.0002.0062] # LATIN SMALL LETTER B
-0042 ; [.0875.0020.0008.0042] # LATIN CAPITAL LETTER B
-1E03 ; [.0875.0052.0002.1E03] # LATIN SMALL LETTER B WITH DOT ABOVE; CANONSEQ
-1E02 ; [.0875.0052.0008.1E02] # LATIN CAPITAL LETTER B WITH DOT ABOVE; CANONSEQ
-1E05 ; [.0875.0079.0002.1E05] # LATIN SMALL LETTER B WITH DOT BELOW; CANONSEQ
-1E04 ; [.0875.0079.0008.1E04] # LATIN CAPITAL LETTER B WITH DOT BELOW; CANONSEQ
-1E07 ; [.0875.0089.0002.1E07] # LATIN SMALL LETTER B WITH LINE BELOW; CANONSEQ
-1E06 ; [.0875.0089.0008.1E06] # LATIN CAPITAL LETTER B WITH LINE BELOW; CANONSEQ
-0299 ; [.0879.0020.0002.0299] # LATIN LETTER SMALL CAPITAL B
-0180 ; [.087D.0020.0002.0180] # LATIN SMALL LETTER B WITH STROKE
-0253 ; [.0881.0020.0002.0253] # LATIN SMALL LETTER B WITH HOOK
-0181 ; [.0881.0020.0008.0181] # LATIN CAPITAL LETTER B WITH HOOK
-0183 ; [.0885.0020.0002.0183] # LATIN SMALL LETTER B WITH TOPBAR
-0182 ; [.0885.0020.0008.0182] # LATIN CAPITAL LETTER B WITH TOPBAR
-0063 ; [.0889.0020.0002.0063] # LATIN SMALL LETTER C
-0043 ; [.0889.0020.0008.0043] # LATIN CAPITAL LETTER C
-0107 ; [.0889.0032.0002.0107] # LATIN SMALL LETTER C WITH ACUTE; CANONSEQ
-0106 ; [.0889.0032.0008.0106] # LATIN CAPITAL LETTER C WITH ACUTE; CANONSEQ
-0109 ; [.0889.003C.0002.0109] # LATIN SMALL LETTER C WITH CIRCUMFLEX; CANONSEQ
-0108 ; [.0889.003C.0008.0108] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX; CANONSEQ
-010D ; [.0889.0041.0002.010D] # LATIN SMALL LETTER C WITH CARON; CANONSEQ
-010C ; [.0889.0041.0008.010C] # LATIN CAPITAL LETTER C WITH CARON; CANONSEQ
-010B ; [.0889.0052.0002.010B] # LATIN SMALL LETTER C WITH DOT ABOVE; CANONSEQ
-010A ; [.0889.0052.0008.010A] # LATIN CAPITAL LETTER C WITH DOT ABOVE; CANONSEQ
-00E7 ; [.0889.0055.0002.00E7] # LATIN SMALL LETTER C WITH CEDILLA; CANONSEQ
-00C7 ; [.0889.0055.0008.00C7] # LATIN CAPITAL LETTER C WITH CEDILLA; CANONSEQ
-1E09 ; [.0889.0056.0002.1E09] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE; CANONSEQ
-1E08 ; [.0889.0056.0008.1E08] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE; CANONSEQ
-0188 ; [.088D.0020.0002.0188] # LATIN SMALL LETTER C WITH HOOK
-0187 ; [.088D.0020.0008.0187] # LATIN CAPITAL LETTER C WITH HOOK
-0255 ; [.0891.0020.0002.0255] # LATIN SMALL LETTER C WITH CURL
-0064 ; [.0895.0020.0002.0064] # LATIN SMALL LETTER D
-0044 ; [.0895.0020.0008.0044] # LATIN CAPITAL LETTER D
-010F ; [.0895.0041.0002.010F] # LATIN SMALL LETTER D WITH CARON; CANONSEQ
-010E ; [.0895.0041.0008.010E] # LATIN CAPITAL LETTER D WITH CARON; CANONSEQ
-1E0B ; [.0895.0052.0002.1E0B] # LATIN SMALL LETTER D WITH DOT ABOVE; CANONSEQ
-1E0A ; [.0895.0052.0008.1E0A] # LATIN CAPITAL LETTER D WITH DOT ABOVE; CANONSEQ
-1E11 ; [.0895.0055.0002.1E11] # LATIN SMALL LETTER D WITH CEDILLA; CANONSEQ
-1E10 ; [.0895.0055.0008.1E10] # LATIN CAPITAL LETTER D WITH CEDILLA; CANONSEQ
-1E0D ; [.0895.0079.0002.1E0D] # LATIN SMALL LETTER D WITH DOT BELOW; CANONSEQ
-1E0C ; [.0895.0079.0008.1E0C] # LATIN CAPITAL LETTER D WITH DOT BELOW; CANONSEQ
-1E13 ; [.0895.0085.0002.1E13] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW; CANONSEQ
-1E12 ; [.0895.0085.0008.1E12] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW; CANONSEQ
-1E0F ; [.0895.0089.0002.1E0F] # LATIN SMALL LETTER D WITH LINE BELOW; CANONSEQ
-1E0E ; [.0895.0089.0008.1E0E] # LATIN CAPITAL LETTER D WITH LINE BELOW; CANONSEQ
-0111 ; [.0899.0020.0002.0111] # LATIN SMALL LETTER D WITH STROKE
-0110 ; [.0899.0020.0008.0110] # LATIN CAPITAL LETTER D WITH STROKE
-0256 ; [.089D.0020.0002.0256] # LATIN SMALL LETTER D WITH TAIL
-0189 ; [.089D.0020.0008.0189] # LATIN CAPITAL LETTER AFRICAN D
-0257 ; [.08A1.0020.0002.0257] # LATIN SMALL LETTER D WITH HOOK
-018A ; [.08A1.0020.0008.018A] # LATIN CAPITAL LETTER D WITH HOOK
-018C ; [.08A5.0020.0002.018C] # LATIN SMALL LETTER D WITH TOPBAR
-018B ; [.08A5.0020.0008.018B] # LATIN CAPITAL LETTER D WITH TOPBAR
-00F0 ; [.08A9.0020.0002.00F0] # LATIN SMALL LETTER ETH
-00D0 ; [.08A9.0020.0008.00D0] # LATIN CAPITAL LETTER ETH
-018D ; [.08AD.0020.0002.018D] # LATIN SMALL LETTER TURNED DELTA
-0065 ; [.08B1.0020.0002.0065] # LATIN SMALL LETTER E
-0045 ; [.08B1.0020.0008.0045] # LATIN CAPITAL LETTER E
-00E9 ; [.08B1.0032.0002.00E9] # LATIN SMALL LETTER E WITH ACUTE; CANONSEQ
-00C9 ; [.08B1.0032.0008.00C9] # LATIN CAPITAL LETTER E WITH ACUTE; CANONSEQ
-00E8 ; [.08B1.0035.0002.00E8] # LATIN SMALL LETTER E WITH GRAVE; CANONSEQ
-00C8 ; [.08B1.0035.0008.00C8] # LATIN CAPITAL LETTER E WITH GRAVE; CANONSEQ
-0115 ; [.08B1.0037.0002.0115] # LATIN SMALL LETTER E WITH BREVE; CANONSEQ
-0114 ; [.08B1.0037.0008.0114] # LATIN CAPITAL LETTER E WITH BREVE; CANONSEQ
-00EA ; [.08B1.003C.0002.00EA] # LATIN SMALL LETTER E WITH CIRCUMFLEX; CANONSEQ
-00CA ; [.08B1.003C.0008.00CA] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; CANONSEQ
-1EBF ; [.08B1.003D.0002.1EBF] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE; CANONSEQ
-1EBE ; [.08B1.003D.0008.1EBE] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE; CANONSEQ
-1EC1 ; [.08B1.003E.0002.1EC1] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE; CANONSEQ
-1EC0 ; [.08B1.003E.0008.1EC0] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE; CANONSEQ
-1EC5 ; [.08B1.003F.0002.1EC5] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE; CANONSEQ
-1EC4 ; [.08B1.003F.0008.1EC4] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE; CANONSEQ
-1EC3 ; [.08B1.0040.0002.1EC3] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; CANONSEQ
-1EC2 ; [.08B1.0040.0008.1EC2] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE; CANONSEQ
-011B ; [.08B1.0041.0002.011B] # LATIN SMALL LETTER E WITH CARON; CANONSEQ
-011A ; [.08B1.0041.0008.011A] # LATIN CAPITAL LETTER E WITH CARON; CANONSEQ
-00EB ; [.08B1.0047.0002.00EB] # LATIN SMALL LETTER E WITH DIAERESIS; CANONSEQ
-00CB ; [.08B1.0047.0008.00CB] # LATIN CAPITAL LETTER E WITH DIAERESIS; CANONSEQ
-1EBD ; [.08B1.004E.0002.1EBD] # LATIN SMALL LETTER E WITH TILDE; CANONSEQ
-1EBC ; [.08B1.004E.0008.1EBC] # LATIN CAPITAL LETTER E WITH TILDE; CANONSEQ
-0117 ; [.08B1.0052.0002.0117] # LATIN SMALL LETTER E WITH DOT ABOVE; CANONSEQ
-0116 ; [.08B1.0052.0008.0116] # LATIN CAPITAL LETTER E WITH DOT ABOVE; CANONSEQ
-0229 ; [.08B1.0055.0002.0229] # LATIN SMALL LETTER E WITH CEDILLA; CANONSEQ
-0228 ; [.08B1.0055.0008.0228] # LATIN CAPITAL LETTER E WITH CEDILLA; CANONSEQ
-1E1D ; [.08B1.0057.0002.1E1D] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE; CANONSEQ
-1E1C ; [.08B1.0057.0008.1E1C] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE; CANONSEQ
-0119 ; [.08B1.0058.0002.0119] # LATIN SMALL LETTER E WITH OGONEK; CANONSEQ
-0118 ; [.08B1.0058.0008.0118] # LATIN CAPITAL LETTER E WITH OGONEK; CANONSEQ
-0113 ; [.08B1.005A.0002.0113] # LATIN SMALL LETTER E WITH MACRON; CANONSEQ
-0112 ; [.08B1.005A.0008.0112] # LATIN CAPITAL LETTER E WITH MACRON; CANONSEQ
-1E17 ; [.08B1.005B.0002.1E17] # LATIN SMALL LETTER E WITH MACRON AND ACUTE; CANONSEQ
-1E16 ; [.08B1.005B.0008.1E16] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE; CANONSEQ
-1E15 ; [.08B1.005C.0002.1E15] # LATIN SMALL LETTER E WITH MACRON AND GRAVE; CANONSEQ
-1E14 ; [.08B1.005C.0008.1E14] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE; CANONSEQ
-1EBB ; [.08B1.005F.0002.1EBB] # LATIN SMALL LETTER E WITH HOOK ABOVE; CANONSEQ
-1EBA ; [.08B1.005F.0008.1EBA] # LATIN CAPITAL LETTER E WITH HOOK ABOVE; CANONSEQ
-0205 ; [.08B1.0062.0002.0205] # LATIN SMALL LETTER E WITH DOUBLE GRAVE; CANONSEQ
-0204 ; [.08B1.0062.0008.0204] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE; CANONSEQ
-0207 ; [.08B1.0064.0002.0207] # LATIN SMALL LETTER E WITH INVERTED BREVE; CANONSEQ
-0206 ; [.08B1.0064.0008.0206] # LATIN CAPITAL LETTER E WITH INVERTED BREVE; CANONSEQ
-1EB9 ; [.08B1.0079.0002.1EB9] # LATIN SMALL LETTER E WITH DOT BELOW; CANONSEQ
-1EB8 ; [.08B1.0079.0008.1EB8] # LATIN CAPITAL LETTER E WITH DOT BELOW; CANONSEQ
-1EC7 ; [.08B1.007B.0002.1EC7] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW; CANONSEQ
-1EC6 ; [.08B1.007B.0008.1EC6] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW; CANONSEQ
-1E19 ; [.08B1.0085.0002.1E19] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW; CANONSEQ
-1E18 ; [.08B1.0085.0008.1E18] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW; CANONSEQ
-1E1B ; [.08B1.0088.0002.1E1B] # LATIN SMALL LETTER E WITH TILDE BELOW; CANONSEQ
-1E1A ; [.08B1.0088.0008.1E1A] # LATIN CAPITAL LETTER E WITH TILDE BELOW; CANONSEQ
-01DD ; [.08B5.0020.0002.01DD] # LATIN SMALL LETTER TURNED E
-018E ; [.08B5.0020.0008.018E] # LATIN CAPITAL LETTER REVERSED E
-0259 ; [.08B9.0020.0002.0259] # LATIN SMALL LETTER SCHWA
-018F ; [.08B9.0020.0008.018F] # LATIN CAPITAL LETTER SCHWA
-025B ; [.08BD.0020.0002.025B] # LATIN SMALL LETTER OPEN E
-0190 ; [.08BD.0020.0008.0190] # LATIN CAPITAL LETTER OPEN E
-0258 ; [.08C1.0020.0002.0258] # LATIN SMALL LETTER REVERSED E
-025A ; [.08C5.0020.0002.025A] # LATIN SMALL LETTER SCHWA WITH HOOK
-025C ; [.08C9.0020.0002.025C] # LATIN SMALL LETTER REVERSED OPEN E
-025D ; [.08CD.0020.0002.025D] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
-025E ; [.08D1.0020.0002.025E] # LATIN SMALL LETTER CLOSED REVERSED OPEN E
-029A ; [.08D5.0020.0002.029A] # LATIN SMALL LETTER CLOSED OPEN E
-0264 ; [.08D9.0020.0002.0264] # LATIN SMALL LETTER RAMS HORN
-0066 ; [.08DD.0020.0002.0066] # LATIN SMALL LETTER F
-0046 ; [.08DD.0020.0008.0046] # LATIN CAPITAL LETTER F
-1E1F ; [.08DD.0052.0002.1E1F] # LATIN SMALL LETTER F WITH DOT ABOVE; CANONSEQ
-1E1E ; [.08DD.0052.0008.1E1E] # LATIN CAPITAL LETTER F WITH DOT ABOVE; CANONSEQ
-0192 ; [.08E1.0020.0002.0192] # LATIN SMALL LETTER F WITH HOOK
-0191 ; [.08E1.0020.0008.0191] # LATIN CAPITAL LETTER F WITH HOOK
-0067 ; [.08E5.0020.0002.0067] # LATIN SMALL LETTER G
-0047 ; [.08E5.0020.0008.0047] # LATIN CAPITAL LETTER G
-01F5 ; [.08E5.0032.0002.01F5] # LATIN SMALL LETTER G WITH ACUTE; CANONSEQ
-01F4 ; [.08E5.0032.0008.01F4] # LATIN CAPITAL LETTER G WITH ACUTE; CANONSEQ
-011F ; [.08E5.0037.0002.011F] # LATIN SMALL LETTER G WITH BREVE; CANONSEQ
-011E ; [.08E5.0037.0008.011E] # LATIN CAPITAL LETTER G WITH BREVE; CANONSEQ
-011D ; [.08E5.003C.0002.011D] # LATIN SMALL LETTER G WITH CIRCUMFLEX; CANONSEQ
-011C ; [.08E5.003C.0008.011C] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX; CANONSEQ
-01E7 ; [.08E5.0041.0002.01E7] # LATIN SMALL LETTER G WITH CARON; CANONSEQ
-01E6 ; [.08E5.0041.0008.01E6] # LATIN CAPITAL LETTER G WITH CARON; CANONSEQ
-0121 ; [.08E5.0052.0002.0121] # LATIN SMALL LETTER G WITH DOT ABOVE; CANONSEQ
-0120 ; [.08E5.0052.0008.0120] # LATIN CAPITAL LETTER G WITH DOT ABOVE; CANONSEQ
-0123 ; [.08E5.0055.0002.0123] # LATIN SMALL LETTER G WITH CEDILLA; CANONSEQ
-0122 ; [.08E5.0055.0008.0122] # LATIN CAPITAL LETTER G WITH CEDILLA; CANONSEQ
-1E21 ; [.08E5.005A.0002.1E21] # LATIN SMALL LETTER G WITH MACRON; CANONSEQ
-1E20 ; [.08E5.005A.0008.1E20] # LATIN CAPITAL LETTER G WITH MACRON; CANONSEQ
-0262 ; [.08E9.0020.0002.0262] # LATIN LETTER SMALL CAPITAL G
-01E5 ; [.08ED.0020.0002.01E5] # LATIN SMALL LETTER G WITH STROKE
-01E4 ; [.08ED.0020.0008.01E4] # LATIN CAPITAL LETTER G WITH STROKE
-0260 ; [.08F1.0020.0002.0260] # LATIN SMALL LETTER G WITH HOOK
-0193 ; [.08F1.0020.0008.0193] # LATIN CAPITAL LETTER G WITH HOOK
-029B ; [.08F5.0020.0002.029B] # LATIN LETTER SMALL CAPITAL G WITH HOOK
-0263 ; [.08F9.0020.0002.0263] # LATIN SMALL LETTER GAMMA
-0194 ; [.08F9.0020.0008.0194] # LATIN CAPITAL LETTER GAMMA
-0261 ; [.08FD.0020.0002.0261] # LATIN SMALL LETTER SCRIPT G
-01A3 ; [.0901.0020.0002.01A3] # LATIN SMALL LETTER OI
-01A2 ; [.0901.0020.0008.01A2] # LATIN CAPITAL LETTER OI
-0068 ; [.0905.0020.0002.0068] # LATIN SMALL LETTER H
-0048 ; [.0905.0020.0008.0048] # LATIN CAPITAL LETTER H
-0125 ; [.0905.003C.0002.0125] # LATIN SMALL LETTER H WITH CIRCUMFLEX; CANONSEQ
-0124 ; [.0905.003C.0008.0124] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX; CANONSEQ
-021F ; [.0905.0041.0002.021F] # LATIN SMALL LETTER H WITH CARON; CANONSEQ
-021E ; [.0905.0041.0008.021E] # LATIN CAPITAL LETTER H WITH CARON; CANONSEQ
-1E27 ; [.0905.0047.0002.1E27] # LATIN SMALL LETTER H WITH DIAERESIS; CANONSEQ
-1E26 ; [.0905.0047.0008.1E26] # LATIN CAPITAL LETTER H WITH DIAERESIS; CANONSEQ
-1E23 ; [.0905.0052.0002.1E23] # LATIN SMALL LETTER H WITH DOT ABOVE; CANONSEQ
-1E22 ; [.0905.0052.0008.1E22] # LATIN CAPITAL LETTER H WITH DOT ABOVE; CANONSEQ
-1E29 ; [.0905.0055.0002.1E29] # LATIN SMALL LETTER H WITH CEDILLA; CANONSEQ
-1E28 ; [.0905.0055.0008.1E28] # LATIN CAPITAL LETTER H WITH CEDILLA; CANONSEQ
-1E25 ; [.0905.0079.0002.1E25] # LATIN SMALL LETTER H WITH DOT BELOW; CANONSEQ
-1E24 ; [.0905.0079.0008.1E24] # LATIN CAPITAL LETTER H WITH DOT BELOW; CANONSEQ
-1E2B ; [.0905.0086.0002.1E2B] # LATIN SMALL LETTER H WITH BREVE BELOW; CANONSEQ
-1E2A ; [.0905.0086.0008.1E2A] # LATIN CAPITAL LETTER H WITH BREVE BELOW; CANONSEQ
-1E96 ; [.0905.0089.0002.1E96] # LATIN SMALL LETTER H WITH LINE BELOW; CANONSEQ
-029C ; [.0909.0020.0002.029C] # LATIN LETTER SMALL CAPITAL H
-0195 ; [.090D.0020.0002.0195] # LATIN SMALL LETTER HV
-01F6 ; [.090D.0020.0008.01F6] # LATIN CAPITAL LETTER HWAIR
-0127 ; [.0911.0020.0002.0127] # LATIN SMALL LETTER H WITH STROKE
-0126 ; [.0911.0020.0008.0126] # LATIN CAPITAL LETTER H WITH STROKE
-0266 ; [.0915.0020.0002.0266] # LATIN SMALL LETTER H WITH HOOK
-0267 ; [.0919.0020.0002.0267] # LATIN SMALL LETTER HENG WITH HOOK
-02BB ; [.091D.0020.0002.02BB] # MODIFIER LETTER TURNED COMMA
-02BD ; [.091E.0020.0002.02BD] # MODIFIER LETTER REVERSED COMMA
-0069 ; [.091F.0020.0002.0069] # LATIN SMALL LETTER I
-0049 ; [.091F.0020.0008.0049] # LATIN CAPITAL LETTER I
-00ED ; [.091F.0032.0002.00ED] # LATIN SMALL LETTER I WITH ACUTE; CANONSEQ
-00CD ; [.091F.0032.0008.00CD] # LATIN CAPITAL LETTER I WITH ACUTE; CANONSEQ
-00EC ; [.091F.0035.0002.00EC] # LATIN SMALL LETTER I WITH GRAVE; CANONSEQ
-00CC ; [.091F.0035.0008.00CC] # LATIN CAPITAL LETTER I WITH GRAVE; CANONSEQ
-012D ; [.091F.0037.0002.012D] # LATIN SMALL LETTER I WITH BREVE; CANONSEQ
-012C ; [.091F.0037.0008.012C] # LATIN CAPITAL LETTER I WITH BREVE; CANONSEQ
-00EE ; [.091F.003C.0002.00EE] # LATIN SMALL LETTER I WITH CIRCUMFLEX; CANONSEQ
-00CE ; [.091F.003C.0008.00CE] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; CANONSEQ
-01D0 ; [.091F.0041.0002.01D0] # LATIN SMALL LETTER I WITH CARON; CANONSEQ
-01CF ; [.091F.0041.0008.01CF] # LATIN CAPITAL LETTER I WITH CARON; CANONSEQ
-00EF ; [.091F.0047.0002.00EF] # LATIN SMALL LETTER I WITH DIAERESIS; CANONSEQ
-00CF ; [.091F.0047.0008.00CF] # LATIN CAPITAL LETTER I WITH DIAERESIS; CANONSEQ
-1E2F ; [.091F.0048.0002.1E2F] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE; CANONSEQ
-1E2E ; [.091F.0048.0008.1E2E] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE; CANONSEQ
-0129 ; [.091F.004E.0002.0129] # LATIN SMALL LETTER I WITH TILDE; CANONSEQ
-0128 ; [.091F.004E.0008.0128] # LATIN CAPITAL LETTER I WITH TILDE; CANONSEQ
-0130 ; [.091F.0052.0008.0130] # LATIN CAPITAL LETTER I WITH DOT ABOVE; CANONSEQ
-012F ; [.091F.0058.0002.012F] # LATIN SMALL LETTER I WITH OGONEK; CANONSEQ
-012E ; [.091F.0058.0008.012E] # LATIN CAPITAL LETTER I WITH OGONEK; CANONSEQ
-012B ; [.091F.005A.0002.012B] # LATIN SMALL LETTER I WITH MACRON; CANONSEQ
-012A ; [.091F.005A.0008.012A] # LATIN CAPITAL LETTER I WITH MACRON; CANONSEQ
-1EC9 ; [.091F.005F.0002.1EC9] # LATIN SMALL LETTER I WITH HOOK ABOVE; CANONSEQ
-1EC8 ; [.091F.005F.0008.1EC8] # LATIN CAPITAL LETTER I WITH HOOK ABOVE; CANONSEQ
-0209 ; [.091F.0062.0002.0209] # LATIN SMALL LETTER I WITH DOUBLE GRAVE; CANONSEQ
-0208 ; [.091F.0062.0008.0208] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; CANONSEQ
-020B ; [.091F.0064.0002.020B] # LATIN SMALL LETTER I WITH INVERTED BREVE; CANONSEQ
-020A ; [.091F.0064.0008.020A] # LATIN CAPITAL LETTER I WITH INVERTED BREVE; CANONSEQ
-1ECB ; [.091F.0079.0002.1ECB] # LATIN SMALL LETTER I WITH DOT BELOW; CANONSEQ
-1ECA ; [.091F.0079.0008.1ECA] # LATIN CAPITAL LETTER I WITH DOT BELOW; CANONSEQ
-1E2D ; [.091F.0088.0002.1E2D] # LATIN SMALL LETTER I WITH TILDE BELOW; CANONSEQ
-1E2C ; [.091F.0088.0008.1E2C] # LATIN CAPITAL LETTER I WITH TILDE BELOW; CANONSEQ
-0131 ; [.0923.0020.0002.0131] # LATIN SMALL LETTER DOTLESS I
-026A ; [.0927.0020.0002.026A] # LATIN LETTER SMALL CAPITAL I
-0268 ; [.092B.0020.0002.0268] # LATIN SMALL LETTER I WITH STROKE
-0197 ; [.092B.0020.0008.0197] # LATIN CAPITAL LETTER I WITH STROKE
-0269 ; [.092F.0020.0002.0269] # LATIN SMALL LETTER IOTA
-0196 ; [.092F.0020.0008.0196] # LATIN CAPITAL LETTER IOTA
-006A ; [.0933.0020.0002.006A] # LATIN SMALL LETTER J
-004A ; [.0933.0020.0008.004A] # LATIN CAPITAL LETTER J
-0135 ; [.0933.003C.0002.0135] # LATIN SMALL LETTER J WITH CIRCUMFLEX; CANONSEQ
-0134 ; [.0933.003C.0008.0134] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX; CANONSEQ
-01F0 ; [.0933.0041.0002.01F0] # LATIN SMALL LETTER J WITH CARON; CANONSEQ
-029D ; [.0937.0020.0002.029D] # LATIN SMALL LETTER J WITH CROSSED-TAIL
-025F ; [.093B.0020.0002.025F] # LATIN SMALL LETTER DOTLESS J WITH STROKE
-0284 ; [.093F.0020.0002.0284] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
-006B ; [.0943.0020.0002.006B] # LATIN SMALL LETTER K
-004B ; [.0943.0020.0008.004B] # LATIN CAPITAL LETTER K
-212A ; [.0943.0020.0008.212A] # KELVIN SIGN; CANON
-1E31 ; [.0943.0032.0002.1E31] # LATIN SMALL LETTER K WITH ACUTE; CANONSEQ
-1E30 ; [.0943.0032.0008.1E30] # LATIN CAPITAL LETTER K WITH ACUTE; CANONSEQ
-01E9 ; [.0943.0041.0002.01E9] # LATIN SMALL LETTER K WITH CARON; CANONSEQ
-01E8 ; [.0943.0041.0008.01E8] # LATIN CAPITAL LETTER K WITH CARON; CANONSEQ
-0137 ; [.0943.0055.0002.0137] # LATIN SMALL LETTER K WITH CEDILLA; CANONSEQ
-0136 ; [.0943.0055.0008.0136] # LATIN CAPITAL LETTER K WITH CEDILLA; CANONSEQ
-1E33 ; [.0943.0079.0002.1E33] # LATIN SMALL LETTER K WITH DOT BELOW; CANONSEQ
-1E32 ; [.0943.0079.0008.1E32] # LATIN CAPITAL LETTER K WITH DOT BELOW; CANONSEQ
-1E35 ; [.0943.0089.0002.1E35] # LATIN SMALL LETTER K WITH LINE BELOW; CANONSEQ
-1E34 ; [.0943.0089.0008.1E34] # LATIN CAPITAL LETTER K WITH LINE BELOW; CANONSEQ
-0199 ; [.0947.0020.0002.0199] # LATIN SMALL LETTER K WITH HOOK
-0198 ; [.0947.0020.0008.0198] # LATIN CAPITAL LETTER K WITH HOOK
-029E ; [.094B.0020.0002.029E] # LATIN SMALL LETTER TURNED K
-006C ; [.094F.0020.0002.006C] # LATIN SMALL LETTER L
-004C ; [.094F.0020.0008.004C] # LATIN CAPITAL LETTER L
-013A ; [.094F.0032.0002.013A] # LATIN SMALL LETTER L WITH ACUTE; CANONSEQ
-0139 ; [.094F.0032.0008.0139] # LATIN CAPITAL LETTER L WITH ACUTE; CANONSEQ
-013E ; [.094F.0041.0002.013E] # LATIN SMALL LETTER L WITH CARON; CANONSEQ
-013D ; [.094F.0041.0008.013D] # LATIN CAPITAL LETTER L WITH CARON; CANONSEQ
-013C ; [.094F.0055.0002.013C] # LATIN SMALL LETTER L WITH CEDILLA; CANONSEQ
-013B ; [.094F.0055.0008.013B] # LATIN CAPITAL LETTER L WITH CEDILLA; CANONSEQ
-1E37 ; [.094F.0079.0002.1E37] # LATIN SMALL LETTER L WITH DOT BELOW; CANONSEQ
-1E36 ; [.094F.0079.0008.1E36] # LATIN CAPITAL LETTER L WITH DOT BELOW; CANONSEQ
-1E39 ; [.094F.007D.0002.1E39] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON; CANONSEQ
-1E38 ; [.094F.007D.0008.1E38] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON; CANONSEQ
-1E3D ; [.094F.0085.0002.1E3D] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW; CANONSEQ
-1E3C ; [.094F.0085.0008.1E3C] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW; CANONSEQ
-1E3B ; [.094F.0089.0002.1E3B] # LATIN SMALL LETTER L WITH LINE BELOW; CANONSEQ
-1E3A ; [.094F.0089.0008.1E3A] # LATIN CAPITAL LETTER L WITH LINE BELOW; CANONSEQ
-029F ; [.0953.0020.0002.029F] # LATIN LETTER SMALL CAPITAL L
-0142 ; [.0957.0020.0002.0142] # LATIN SMALL LETTER L WITH STROKE
-0141 ; [.0957.0020.0008.0141] # LATIN CAPITAL LETTER L WITH STROKE
-019A ; [.095B.0020.0002.019A] # LATIN SMALL LETTER L WITH BAR
-026B ; [.095F.0020.0002.026B] # LATIN SMALL LETTER L WITH MIDDLE TILDE
-026C ; [.0963.0020.0002.026C] # LATIN SMALL LETTER L WITH BELT
-026D ; [.0967.0020.0002.026D] # LATIN SMALL LETTER L WITH RETROFLEX HOOK
-026E ; [.096B.0020.0002.026E] # LATIN SMALL LETTER LEZH
-019B ; [.096F.0020.0002.019B] # LATIN SMALL LETTER LAMBDA WITH STROKE
-028E ; [.0973.0020.0002.028E] # LATIN SMALL LETTER TURNED Y
-006D ; [.0977.0020.0002.006D] # LATIN SMALL LETTER M
-004D ; [.0977.0020.0008.004D] # LATIN CAPITAL LETTER M
-1E3F ; [.0977.0032.0002.1E3F] # LATIN SMALL LETTER M WITH ACUTE; CANONSEQ
-1E3E ; [.0977.0032.0008.1E3E] # LATIN CAPITAL LETTER M WITH ACUTE; CANONSEQ
-1E41 ; [.0977.0052.0002.1E41] # LATIN SMALL LETTER M WITH DOT ABOVE; CANONSEQ
-1E40 ; [.0977.0052.0008.1E40] # LATIN CAPITAL LETTER M WITH DOT ABOVE; CANONSEQ
-1E43 ; [.0977.0079.0002.1E43] # LATIN SMALL LETTER M WITH DOT BELOW; CANONSEQ
-1E42 ; [.0977.0079.0008.1E42] # LATIN CAPITAL LETTER M WITH DOT BELOW; CANONSEQ
-0271 ; [.097B.0020.0002.0271] # LATIN SMALL LETTER M WITH HOOK
-006E ; [.097F.0020.0002.006E] # LATIN SMALL LETTER N
-004E ; [.097F.0020.0008.004E] # LATIN CAPITAL LETTER N
-0144 ; [.097F.0032.0002.0144] # LATIN SMALL LETTER N WITH ACUTE; CANONSEQ
-0143 ; [.097F.0032.0008.0143] # LATIN CAPITAL LETTER N WITH ACUTE; CANONSEQ
-01F9 ; [.097F.0035.0002.01F9] # LATIN SMALL LETTER N WITH GRAVE; CANONSEQ
-01F8 ; [.097F.0035.0008.01F8] # LATIN CAPITAL LETTER N WITH GRAVE; CANONSEQ
-0148 ; [.097F.0041.0002.0148] # LATIN SMALL LETTER N WITH CARON; CANONSEQ
-0147 ; [.097F.0041.0008.0147] # LATIN CAPITAL LETTER N WITH CARON; CANONSEQ
-00F1 ; [.097F.004E.0002.00F1] # LATIN SMALL LETTER N WITH TILDE; CANONSEQ
-00D1 ; [.097F.004E.0008.00D1] # LATIN CAPITAL LETTER N WITH TILDE; CANONSEQ
-1E45 ; [.097F.0052.0002.1E45] # LATIN SMALL LETTER N WITH DOT ABOVE; CANONSEQ
-1E44 ; [.097F.0052.0008.1E44] # LATIN CAPITAL LETTER N WITH DOT ABOVE; CANONSEQ
-0146 ; [.097F.0055.0002.0146] # LATIN SMALL LETTER N WITH CEDILLA; CANONSEQ
-0145 ; [.097F.0055.0008.0145] # LATIN CAPITAL LETTER N WITH CEDILLA; CANONSEQ
-1E47 ; [.097F.0079.0002.1E47] # LATIN SMALL LETTER N WITH DOT BELOW; CANONSEQ
-1E46 ; [.097F.0079.0008.1E46] # LATIN CAPITAL LETTER N WITH DOT BELOW; CANONSEQ
-1E4B ; [.097F.0085.0002.1E4B] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW; CANONSEQ
-1E4A ; [.097F.0085.0008.1E4A] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW; CANONSEQ
-1E49 ; [.097F.0089.0002.1E49] # LATIN SMALL LETTER N WITH LINE BELOW; CANONSEQ
-1E48 ; [.097F.0089.0008.1E48] # LATIN CAPITAL LETTER N WITH LINE BELOW; CANONSEQ
-0274 ; [.0983.0020.0002.0274] # LATIN LETTER SMALL CAPITAL N
-0272 ; [.0987.0020.0002.0272] # LATIN SMALL LETTER N WITH LEFT HOOK
-019D ; [.0987.0020.0008.019D] # LATIN CAPITAL LETTER N WITH LEFT HOOK
-019E ; [.098B.0020.0002.019E] # LATIN SMALL LETTER N WITH LONG RIGHT LEG
-0273 ; [.098F.0020.0002.0273] # LATIN SMALL LETTER N WITH RETROFLEX HOOK
-014B ; [.0993.0020.0002.014B] # LATIN SMALL LETTER ENG
-014A ; [.0993.0020.0008.014A] # LATIN CAPITAL LETTER ENG
-006F ; [.0997.0020.0002.006F] # LATIN SMALL LETTER O
-004F ; [.0997.0020.0008.004F] # LATIN CAPITAL LETTER O
-00F3 ; [.0997.0032.0002.00F3] # LATIN SMALL LETTER O WITH ACUTE; CANONSEQ
-00D3 ; [.0997.0032.0008.00D3] # LATIN CAPITAL LETTER O WITH ACUTE; CANONSEQ
-00F2 ; [.0997.0035.0002.00F2] # LATIN SMALL LETTER O WITH GRAVE; CANONSEQ
-00D2 ; [.0997.0035.0008.00D2] # LATIN CAPITAL LETTER O WITH GRAVE; CANONSEQ
-014F ; [.0997.0037.0002.014F] # LATIN SMALL LETTER O WITH BREVE; CANONSEQ
-014E ; [.0997.0037.0008.014E] # LATIN CAPITAL LETTER O WITH BREVE; CANONSEQ
-00F4 ; [.0997.003C.0002.00F4] # LATIN SMALL LETTER O WITH CIRCUMFLEX; CANONSEQ
-00D4 ; [.0997.003C.0008.00D4] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; CANONSEQ
-1ED1 ; [.0997.003D.0002.1ED1] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE; CANONSEQ
-1ED0 ; [.0997.003D.0008.1ED0] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE; CANONSEQ
-1ED3 ; [.0997.003E.0002.1ED3] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE; CANONSEQ
-1ED2 ; [.0997.003E.0008.1ED2] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE; CANONSEQ
-1ED7 ; [.0997.003F.0002.1ED7] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE; CANONSEQ
-1ED6 ; [.0997.003F.0008.1ED6] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE; CANONSEQ
-1ED5 ; [.0997.0040.0002.1ED5] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; CANONSEQ
-1ED4 ; [.0997.0040.0008.1ED4] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE; CANONSEQ
-01D2 ; [.0997.0041.0002.01D2] # LATIN SMALL LETTER O WITH CARON; CANONSEQ
-01D1 ; [.0997.0041.0008.01D1] # LATIN CAPITAL LETTER O WITH CARON; CANONSEQ
-00F6 ; [.0997.0047.0002.00F6] # LATIN SMALL LETTER O WITH DIAERESIS; CANONSEQ
-00D6 ; [.0997.0047.0008.00D6] # LATIN CAPITAL LETTER O WITH DIAERESIS; CANONSEQ
-022B ; [.0997.004B.0002.022B] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON; CANONSEQ
-022A ; [.0997.004B.0008.022A] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON; CANONSEQ
-0151 ; [.0997.004D.0002.0151] # LATIN SMALL LETTER O WITH DOUBLE ACUTE; CANONSEQ
-0150 ; [.0997.004D.0008.0150] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE; CANONSEQ
-00F5 ; [.0997.004E.0002.00F5] # LATIN SMALL LETTER O WITH TILDE; CANONSEQ
-00D5 ; [.0997.004E.0008.00D5] # LATIN CAPITAL LETTER O WITH TILDE; CANONSEQ
-1E4D ; [.0997.004F.0002.1E4D] # LATIN SMALL LETTER O WITH TILDE AND ACUTE; CANONSEQ
-1E4C ; [.0997.004F.0008.1E4C] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE; CANONSEQ
-1E4F ; [.0997.0050.0002.1E4F] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS; CANONSEQ
-1E4E ; [.0997.0050.0008.1E4E] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS; CANONSEQ
-022D ; [.0997.0051.0002.022D] # LATIN SMALL LETTER O WITH TILDE AND MACRON; CANONSEQ
-022C ; [.0997.0051.0008.022C] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON; CANONSEQ
-022F ; [.0997.0052.0002.022F] # LATIN SMALL LETTER O WITH DOT ABOVE; CANONSEQ
-022E ; [.0997.0052.0008.022E] # LATIN CAPITAL LETTER O WITH DOT ABOVE; CANONSEQ
-0231 ; [.0997.0053.0002.0231] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON; CANONSEQ
-0230 ; [.0997.0053.0008.0230] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON; CANONSEQ
-01EB ; [.0997.0058.0002.01EB] # LATIN SMALL LETTER O WITH OGONEK; CANONSEQ
-01EA ; [.0997.0058.0008.01EA] # LATIN CAPITAL LETTER O WITH OGONEK; CANONSEQ
-01ED ; [.0997.0059.0002.01ED] # LATIN SMALL LETTER O WITH OGONEK AND MACRON; CANONSEQ
-01EC ; [.0997.0059.0008.01EC] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON; CANONSEQ
-014D ; [.0997.005A.0002.014D] # LATIN SMALL LETTER O WITH MACRON; CANONSEQ
-014C ; [.0997.005A.0008.014C] # LATIN CAPITAL LETTER O WITH MACRON; CANONSEQ
-1E53 ; [.0997.005B.0002.1E53] # LATIN SMALL LETTER O WITH MACRON AND ACUTE; CANONSEQ
-1E52 ; [.0997.005B.0008.1E52] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE; CANONSEQ
-1E51 ; [.0997.005C.0002.1E51] # LATIN SMALL LETTER O WITH MACRON AND GRAVE; CANONSEQ
-1E50 ; [.0997.005C.0008.1E50] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE; CANONSEQ
-1ECF ; [.0997.005F.0002.1ECF] # LATIN SMALL LETTER O WITH HOOK ABOVE; CANONSEQ
-1ECE ; [.0997.005F.0008.1ECE] # LATIN CAPITAL LETTER O WITH HOOK ABOVE; CANONSEQ
-020D ; [.0997.0062.0002.020D] # LATIN SMALL LETTER O WITH DOUBLE GRAVE; CANONSEQ
-020C ; [.0997.0062.0008.020C] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; CANONSEQ
-020F ; [.0997.0064.0002.020F] # LATIN SMALL LETTER O WITH INVERTED BREVE; CANONSEQ
-020E ; [.0997.0064.0008.020E] # LATIN CAPITAL LETTER O WITH INVERTED BREVE; CANONSEQ
-01A1 ; [.0997.006C.0002.01A1] # LATIN SMALL LETTER O WITH HORN; CANONSEQ
-01A0 ; [.0997.006C.0008.01A0] # LATIN CAPITAL LETTER O WITH HORN; CANONSEQ
-1EDB ; [.0997.006D.0002.1EDB] # LATIN SMALL LETTER O WITH HORN AND ACUTE; CANONSEQ
-1EDA ; [.0997.006D.0008.1EDA] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE; CANONSEQ
-1EDD ; [.0997.006E.0002.1EDD] # LATIN SMALL LETTER O WITH HORN AND GRAVE; CANONSEQ
-1EDC ; [.0997.006E.0008.1EDC] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE; CANONSEQ
-1EE1 ; [.0997.006F.0002.1EE1] # LATIN SMALL LETTER O WITH HORN AND TILDE; CANONSEQ
-1EE0 ; [.0997.006F.0008.1EE0] # LATIN CAPITAL LETTER O WITH HORN AND TILDE; CANONSEQ
-1EDF ; [.0997.0070.0002.1EDF] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE; CANONSEQ
-1EDE ; [.0997.0070.0008.1EDE] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE; CANONSEQ
-1EE3 ; [.0997.0071.0002.1EE3] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW; CANONSEQ
-1EE2 ; [.0997.0071.0008.1EE2] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW; CANONSEQ
-1ECD ; [.0997.0079.0002.1ECD] # LATIN SMALL LETTER O WITH DOT BELOW; CANONSEQ
-1ECC ; [.0997.0079.0008.1ECC] # LATIN CAPITAL LETTER O WITH DOT BELOW; CANONSEQ
-1ED9 ; [.0997.007B.0002.1ED9] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW; CANONSEQ
-1ED8 ; [.0997.007B.0008.1ED8] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW; CANONSEQ
-0276 ; [.099B.0020.0002.0276] # LATIN LETTER SMALL CAPITAL OE
-00F8 ; [.099F.0020.0002.00F8] # LATIN SMALL LETTER O WITH STROKE
-00D8 ; [.099F.0020.0008.00D8] # LATIN CAPITAL LETTER O WITH STROKE
-01FF ; [.099F.0032.0002.01FF] # LATIN SMALL LETTER O WITH STROKE AND ACUTE; CANONSEQ
-01FE ; [.099F.0032.0008.01FE] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE; CANONSEQ
-0254 ; [.09A3.0020.0002.0254] # LATIN SMALL LETTER OPEN O
-0186 ; [.09A3.0020.0008.0186] # LATIN CAPITAL LETTER OPEN O
-0275 ; [.09A7.0020.0002.0275] # LATIN SMALL LETTER BARRED O
-019F ; [.09A7.0020.0008.019F] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE
-0277 ; [.09AB.0020.0002.0277] # LATIN SMALL LETTER CLOSED OMEGA
-0223 ; [.09AF.0020.0002.0223] # LATIN SMALL LETTER OU
-0222 ; [.09AF.0020.0008.0222] # LATIN CAPITAL LETTER OU
-0070 ; [.09B3.0020.0002.0070] # LATIN SMALL LETTER P
-0050 ; [.09B3.0020.0008.0050] # LATIN CAPITAL LETTER P
-1E55 ; [.09B3.0032.0002.1E55] # LATIN SMALL LETTER P WITH ACUTE; CANONSEQ
-1E54 ; [.09B3.0032.0008.1E54] # LATIN CAPITAL LETTER P WITH ACUTE; CANONSEQ
-1E57 ; [.09B3.0052.0002.1E57] # LATIN SMALL LETTER P WITH DOT ABOVE; CANONSEQ
-1E56 ; [.09B3.0052.0008.1E56] # LATIN CAPITAL LETTER P WITH DOT ABOVE; CANONSEQ
-01A5 ; [.09B7.0020.0002.01A5] # LATIN SMALL LETTER P WITH HOOK
-01A4 ; [.09B7.0020.0008.01A4] # LATIN CAPITAL LETTER P WITH HOOK
-0278 ; [.09BB.0020.0002.0278] # LATIN SMALL LETTER PHI
-0071 ; [.09BF.0020.0002.0071] # LATIN SMALL LETTER Q
-0051 ; [.09BF.0020.0008.0051] # LATIN CAPITAL LETTER Q
-02A0 ; [.09C3.0020.0002.02A0] # LATIN SMALL LETTER Q WITH HOOK
-0138 ; [.09C7.0020.0002.0138] # LATIN SMALL LETTER KRA
-0072 ; [.09CB.0020.0002.0072] # LATIN SMALL LETTER R
-0052 ; [.09CB.0020.0008.0052] # LATIN CAPITAL LETTER R
-0155 ; [.09CB.0032.0002.0155] # LATIN SMALL LETTER R WITH ACUTE; CANONSEQ
-0154 ; [.09CB.0032.0008.0154] # LATIN CAPITAL LETTER R WITH ACUTE; CANONSEQ
-0159 ; [.09CB.0041.0002.0159] # LATIN SMALL LETTER R WITH CARON; CANONSEQ
-0158 ; [.09CB.0041.0008.0158] # LATIN CAPITAL LETTER R WITH CARON; CANONSEQ
-1E59 ; [.09CB.0052.0002.1E59] # LATIN SMALL LETTER R WITH DOT ABOVE; CANONSEQ
-1E58 ; [.09CB.0052.0008.1E58] # LATIN CAPITAL LETTER R WITH DOT ABOVE; CANONSEQ
-0157 ; [.09CB.0055.0002.0157] # LATIN SMALL LETTER R WITH CEDILLA; CANONSEQ
-0156 ; [.09CB.0055.0008.0156] # LATIN CAPITAL LETTER R WITH CEDILLA; CANONSEQ
-0211 ; [.09CB.0062.0002.0211] # LATIN SMALL LETTER R WITH DOUBLE GRAVE; CANONSEQ
-0210 ; [.09CB.0062.0008.0210] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; CANONSEQ
-0213 ; [.09CB.0064.0002.0213] # LATIN SMALL LETTER R WITH INVERTED BREVE; CANONSEQ
-0212 ; [.09CB.0064.0008.0212] # LATIN CAPITAL LETTER R WITH INVERTED BREVE; CANONSEQ
-1E5B ; [.09CB.0079.0002.1E5B] # LATIN SMALL LETTER R WITH DOT BELOW; CANONSEQ
-1E5A ; [.09CB.0079.0008.1E5A] # LATIN CAPITAL LETTER R WITH DOT BELOW; CANONSEQ
-1E5D ; [.09CB.007D.0002.1E5D] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON; CANONSEQ
-1E5C ; [.09CB.007D.0008.1E5C] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON; CANONSEQ
-1E5F ; [.09CB.0089.0002.1E5F] # LATIN SMALL LETTER R WITH LINE BELOW; CANONSEQ
-1E5E ; [.09CB.0089.0008.1E5E] # LATIN CAPITAL LETTER R WITH LINE BELOW; CANONSEQ
-0280 ; [.09CF.0020.0002.0280] # LATIN LETTER SMALL CAPITAL R
-01A6 ; [.09CF.0020.0008.01A6] # LATIN LETTER YR
-0279 ; [.09D3.0020.0002.0279] # LATIN SMALL LETTER TURNED R
-027A ; [.09D7.0020.0002.027A] # LATIN SMALL LETTER TURNED R WITH LONG LEG
-027B ; [.09DB.0020.0002.027B] # LATIN SMALL LETTER TURNED R WITH HOOK
-027C ; [.09DF.0020.0002.027C] # LATIN SMALL LETTER R WITH LONG LEG
-027D ; [.09E3.0020.0002.027D] # LATIN SMALL LETTER R WITH TAIL
-027E ; [.09E7.0020.0002.027E] # LATIN SMALL LETTER R WITH FISHHOOK
-027F ; [.09EB.0020.0002.027F] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK
-0281 ; [.09EF.0020.0002.0281] # LATIN LETTER SMALL CAPITAL INVERTED R
-0073 ; [.09F3.0020.0002.0073] # LATIN SMALL LETTER S
-0053 ; [.09F3.0020.0008.0053] # LATIN CAPITAL LETTER S
-015B ; [.09F3.0032.0002.015B] # LATIN SMALL LETTER S WITH ACUTE; CANONSEQ
-015A ; [.09F3.0032.0008.015A] # LATIN CAPITAL LETTER S WITH ACUTE; CANONSEQ
-1E65 ; [.09F3.0033.0002.1E65] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE; CANONSEQ
-1E64 ; [.09F3.0033.0008.1E64] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE; CANONSEQ
-015D ; [.09F3.003C.0002.015D] # LATIN SMALL LETTER S WITH CIRCUMFLEX; CANONSEQ
-015C ; [.09F3.003C.0008.015C] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX; CANONSEQ
-0161 ; [.09F3.0041.0002.0161] # LATIN SMALL LETTER S WITH CARON; CANONSEQ
-0160 ; [.09F3.0041.0008.0160] # LATIN CAPITAL LETTER S WITH CARON; CANONSEQ
-1E67 ; [.09F3.0042.0002.1E67] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE; CANONSEQ
-1E66 ; [.09F3.0042.0008.1E66] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE; CANONSEQ
-1E61 ; [.09F3.0052.0002.1E61] # LATIN SMALL LETTER S WITH DOT ABOVE; CANONSEQ
-1E60 ; [.09F3.0052.0008.1E60] # LATIN CAPITAL LETTER S WITH DOT ABOVE; CANONSEQ
-015F ; [.09F3.0055.0002.015F] # LATIN SMALL LETTER S WITH CEDILLA; CANONSEQ
-015E ; [.09F3.0055.0008.015E] # LATIN CAPITAL LETTER S WITH CEDILLA; CANONSEQ
-1E63 ; [.09F3.0079.0002.1E63] # LATIN SMALL LETTER S WITH DOT BELOW; CANONSEQ
-1E62 ; [.09F3.0079.0008.1E62] # LATIN CAPITAL LETTER S WITH DOT BELOW; CANONSEQ
-1E69 ; [.09F3.007C.0002.1E69] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE; CANONSEQ
-1E68 ; [.09F3.007C.0008.1E68] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE; CANONSEQ
-0219 ; [.09F3.0080.0002.0219] # LATIN SMALL LETTER S WITH COMMA BELOW; CANONSEQ
-0218 ; [.09F3.0080.0008.0218] # LATIN CAPITAL LETTER S WITH COMMA BELOW; CANONSEQ
-0282 ; [.09F7.0020.0002.0282] # LATIN SMALL LETTER S WITH HOOK
-0283 ; [.09FB.0020.0002.0283] # LATIN SMALL LETTER ESH
-01A9 ; [.09FB.0020.0008.01A9] # LATIN CAPITAL LETTER ESH
-01AA ; [.09FF.0020.0002.01AA] # LATIN LETTER REVERSED ESH LOOP
-0285 ; [.0A03.0020.0002.0285] # LATIN SMALL LETTER SQUAT REVERSED ESH
-0286 ; [.0A07.0020.0002.0286] # LATIN SMALL LETTER ESH WITH CURL
-0074 ; [.0A0B.0020.0002.0074] # LATIN SMALL LETTER T
-0054 ; [.0A0B.0020.0008.0054] # LATIN CAPITAL LETTER T
-0165 ; [.0A0B.0041.0002.0165] # LATIN SMALL LETTER T WITH CARON; CANONSEQ
-0164 ; [.0A0B.0041.0008.0164] # LATIN CAPITAL LETTER T WITH CARON; CANONSEQ
-1E97 ; [.0A0B.0047.0002.1E97] # LATIN SMALL LETTER T WITH DIAERESIS; CANONSEQ
-1E6B ; [.0A0B.0052.0002.1E6B] # LATIN SMALL LETTER T WITH DOT ABOVE; CANONSEQ
-1E6A ; [.0A0B.0052.0008.1E6A] # LATIN CAPITAL LETTER T WITH DOT ABOVE; CANONSEQ
-0163 ; [.0A0B.0055.0002.0163] # LATIN SMALL LETTER T WITH CEDILLA; CANONSEQ
-0162 ; [.0A0B.0055.0008.0162] # LATIN CAPITAL LETTER T WITH CEDILLA; CANONSEQ
-1E6D ; [.0A0B.0079.0002.1E6D] # LATIN SMALL LETTER T WITH DOT BELOW; CANONSEQ
-1E6C ; [.0A0B.0079.0008.1E6C] # LATIN CAPITAL LETTER T WITH DOT BELOW; CANONSEQ
-021B ; [.0A0B.0080.0002.021B] # LATIN SMALL LETTER T WITH COMMA BELOW; CANONSEQ
-021A ; [.0A0B.0080.0008.021A] # LATIN CAPITAL LETTER T WITH COMMA BELOW; CANONSEQ
-1E71 ; [.0A0B.0085.0002.1E71] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW; CANONSEQ
-1E70 ; [.0A0B.0085.0008.1E70] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW; CANONSEQ
-1E6F ; [.0A0B.0089.0002.1E6F] # LATIN SMALL LETTER T WITH LINE BELOW; CANONSEQ
-1E6E ; [.0A0B.0089.0008.1E6E] # LATIN CAPITAL LETTER T WITH LINE BELOW; CANONSEQ
-0167 ; [.0A0F.0020.0002.0167] # LATIN SMALL LETTER T WITH STROKE
-0166 ; [.0A0F.0020.0008.0166] # LATIN CAPITAL LETTER T WITH STROKE
-01AB ; [.0A13.0020.0002.01AB] # LATIN SMALL LETTER T WITH PALATAL HOOK
-01AD ; [.0A17.0020.0002.01AD] # LATIN SMALL LETTER T WITH HOOK
-01AC ; [.0A17.0020.0008.01AC] # LATIN CAPITAL LETTER T WITH HOOK
-0288 ; [.0A1B.0020.0002.0288] # LATIN SMALL LETTER T WITH RETROFLEX HOOK
-01AE ; [.0A1B.0020.0008.01AE] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
-0287 ; [.0A1F.0020.0002.0287] # LATIN SMALL LETTER TURNED T
-0075 ; [.0A23.0020.0002.0075] # LATIN SMALL LETTER U
-0055 ; [.0A23.0020.0008.0055] # LATIN CAPITAL LETTER U
-00FA ; [.0A23.0032.0002.00FA] # LATIN SMALL LETTER U WITH ACUTE; CANONSEQ
-00DA ; [.0A23.0032.0008.00DA] # LATIN CAPITAL LETTER U WITH ACUTE; CANONSEQ
-00F9 ; [.0A23.0035.0002.00F9] # LATIN SMALL LETTER U WITH GRAVE; CANONSEQ
-00D9 ; [.0A23.0035.0008.00D9] # LATIN CAPITAL LETTER U WITH GRAVE; CANONSEQ
-016D ; [.0A23.0037.0002.016D] # LATIN SMALL LETTER U WITH BREVE; CANONSEQ
-016C ; [.0A23.0037.0008.016C] # LATIN CAPITAL LETTER U WITH BREVE; CANONSEQ
-00FB ; [.0A23.003C.0002.00FB] # LATIN SMALL LETTER U WITH CIRCUMFLEX; CANONSEQ
-00DB ; [.0A23.003C.0008.00DB] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; CANONSEQ
-01D4 ; [.0A23.0041.0002.01D4] # LATIN SMALL LETTER U WITH CARON; CANONSEQ
-01D3 ; [.0A23.0041.0008.01D3] # LATIN CAPITAL LETTER U WITH CARON; CANONSEQ
-016F ; [.0A23.0043.0002.016F] # LATIN SMALL LETTER U WITH RING ABOVE; CANONSEQ
-016E ; [.0A23.0043.0008.016E] # LATIN CAPITAL LETTER U WITH RING ABOVE; CANONSEQ
-00FC ; [.0A23.0047.0002.00FC] # LATIN SMALL LETTER U WITH DIAERESIS; CANONSEQ
-00DC ; [.0A23.0047.0008.00DC] # LATIN CAPITAL LETTER U WITH DIAERESIS; CANONSEQ
-01D8 ; [.0A23.0048.0002.01D8] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE; CANONSEQ
-01D7 ; [.0A23.0048.0008.01D7] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE; CANONSEQ
-01DC ; [.0A23.0049.0002.01DC] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE; CANONSEQ
-01DB ; [.0A23.0049.0008.01DB] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE; CANONSEQ
-01DA ; [.0A23.004A.0002.01DA] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON; CANONSEQ
-01D9 ; [.0A23.004A.0008.01D9] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON; CANONSEQ
-01D6 ; [.0A23.004B.0002.01D6] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON; CANONSEQ
-01D5 ; [.0A23.004B.0008.01D5] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON; CANONSEQ
-0171 ; [.0A23.004D.0002.0171] # LATIN SMALL LETTER U WITH DOUBLE ACUTE; CANONSEQ
-0170 ; [.0A23.004D.0008.0170] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE; CANONSEQ
-0169 ; [.0A23.004E.0002.0169] # LATIN SMALL LETTER U WITH TILDE; CANONSEQ
-0168 ; [.0A23.004E.0008.0168] # LATIN CAPITAL LETTER U WITH TILDE; CANONSEQ
-1E79 ; [.0A23.004F.0002.1E79] # LATIN SMALL LETTER U WITH TILDE AND ACUTE; CANONSEQ
-1E78 ; [.0A23.004F.0008.1E78] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE; CANONSEQ
-0173 ; [.0A23.0058.0002.0173] # LATIN SMALL LETTER U WITH OGONEK; CANONSEQ
-0172 ; [.0A23.0058.0008.0172] # LATIN CAPITAL LETTER U WITH OGONEK; CANONSEQ
-016B ; [.0A23.005A.0002.016B] # LATIN SMALL LETTER U WITH MACRON; CANONSEQ
-016A ; [.0A23.005A.0008.016A] # LATIN CAPITAL LETTER U WITH MACRON; CANONSEQ
-1E7B ; [.0A23.005D.0002.1E7B] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS; CANONSEQ
-1E7A ; [.0A23.005D.0008.1E7A] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS; CANONSEQ
-1EE7 ; [.0A23.005F.0002.1EE7] # LATIN SMALL LETTER U WITH HOOK ABOVE; CANONSEQ
-1EE6 ; [.0A23.005F.0008.1EE6] # LATIN CAPITAL LETTER U WITH HOOK ABOVE; CANONSEQ
-0215 ; [.0A23.0062.0002.0215] # LATIN SMALL LETTER U WITH DOUBLE GRAVE; CANONSEQ
-0214 ; [.0A23.0062.0008.0214] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE; CANONSEQ
-0217 ; [.0A23.0064.0002.0217] # LATIN SMALL LETTER U WITH INVERTED BREVE; CANONSEQ
-0216 ; [.0A23.0064.0008.0216] # LATIN CAPITAL LETTER U WITH INVERTED BREVE; CANONSEQ
-01B0 ; [.0A23.006C.0002.01B0] # LATIN SMALL LETTER U WITH HORN; CANONSEQ
-01AF ; [.0A23.006C.0008.01AF] # LATIN CAPITAL LETTER U WITH HORN; CANONSEQ
-1EE9 ; [.0A23.006D.0002.1EE9] # LATIN SMALL LETTER U WITH HORN AND ACUTE; CANONSEQ
-1EE8 ; [.0A23.006D.0008.1EE8] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE; CANONSEQ
-1EEB ; [.0A23.006E.0002.1EEB] # LATIN SMALL LETTER U WITH HORN AND GRAVE; CANONSEQ
-1EEA ; [.0A23.006E.0008.1EEA] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE; CANONSEQ
-1EEF ; [.0A23.006F.0002.1EEF] # LATIN SMALL LETTER U WITH HORN AND TILDE; CANONSEQ
-1EEE ; [.0A23.006F.0008.1EEE] # LATIN CAPITAL LETTER U WITH HORN AND TILDE; CANONSEQ
-1EED ; [.0A23.0070.0002.1EED] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE; CANONSEQ
-1EEC ; [.0A23.0070.0008.1EEC] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE; CANONSEQ
-1EF1 ; [.0A23.0071.0002.1EF1] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW; CANONSEQ
-1EF0 ; [.0A23.0071.0008.1EF0] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW; CANONSEQ
-1EE5 ; [.0A23.0079.0002.1EE5] # LATIN SMALL LETTER U WITH DOT BELOW; CANONSEQ
-1EE4 ; [.0A23.0079.0008.1EE4] # LATIN CAPITAL LETTER U WITH DOT BELOW; CANONSEQ
-1E73 ; [.0A23.007E.0002.1E73] # LATIN SMALL LETTER U WITH DIAERESIS BELOW; CANONSEQ
-1E72 ; [.0A23.007E.0008.1E72] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW; CANONSEQ
-1E77 ; [.0A23.0085.0002.1E77] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW; CANONSEQ
-1E76 ; [.0A23.0085.0008.1E76] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW; CANONSEQ
-1E75 ; [.0A23.0088.0002.1E75] # LATIN SMALL LETTER U WITH TILDE BELOW; CANONSEQ
-1E74 ; [.0A23.0088.0008.1E74] # LATIN CAPITAL LETTER U WITH TILDE BELOW; CANONSEQ
-0289 ; [.0A27.0020.0002.0289] # LATIN SMALL LETTER U BAR
-0265 ; [.0A2B.0020.0002.0265] # LATIN SMALL LETTER TURNED H
-026F ; [.0A2F.0020.0002.026F] # LATIN SMALL LETTER TURNED M
-019C ; [.0A2F.0020.0008.019C] # LATIN CAPITAL LETTER TURNED M
-0270 ; [.0A33.0020.0002.0270] # LATIN SMALL LETTER TURNED M WITH LONG LEG
-028A ; [.0A37.0020.0002.028A] # LATIN SMALL LETTER UPSILON
-01B1 ; [.0A37.0020.0008.01B1] # LATIN CAPITAL LETTER UPSILON
-0076 ; [.0A3B.0020.0002.0076] # LATIN SMALL LETTER V
-0056 ; [.0A3B.0020.0008.0056] # LATIN CAPITAL LETTER V
-1E7D ; [.0A3B.004E.0002.1E7D] # LATIN SMALL LETTER V WITH TILDE; CANONSEQ
-1E7C ; [.0A3B.004E.0008.1E7C] # LATIN CAPITAL LETTER V WITH TILDE; CANONSEQ
-1E7F ; [.0A3B.0079.0002.1E7F] # LATIN SMALL LETTER V WITH DOT BELOW; CANONSEQ
-1E7E ; [.0A3B.0079.0008.1E7E] # LATIN CAPITAL LETTER V WITH DOT BELOW; CANONSEQ
-028B ; [.0A3F.0020.0002.028B] # LATIN SMALL LETTER V WITH HOOK
-01B2 ; [.0A3F.0020.0008.01B2] # LATIN CAPITAL LETTER V WITH HOOK
-028C ; [.0A43.0020.0002.028C] # LATIN SMALL LETTER TURNED V
-0077 ; [.0A47.0020.0002.0077] # LATIN SMALL LETTER W
-0057 ; [.0A47.0020.0008.0057] # LATIN CAPITAL LETTER W
-1E83 ; [.0A47.0032.0002.1E83] # LATIN SMALL LETTER W WITH ACUTE; CANONSEQ
-1E82 ; [.0A47.0032.0008.1E82] # LATIN CAPITAL LETTER W WITH ACUTE; CANONSEQ
-1E81 ; [.0A47.0035.0002.1E81] # LATIN SMALL LETTER W WITH GRAVE; CANONSEQ
-1E80 ; [.0A47.0035.0008.1E80] # LATIN CAPITAL LETTER W WITH GRAVE; CANONSEQ
-0175 ; [.0A47.003C.0002.0175] # LATIN SMALL LETTER W WITH CIRCUMFLEX; CANONSEQ
-0174 ; [.0A47.003C.0008.0174] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX; CANONSEQ
-1E98 ; [.0A47.0043.0002.1E98] # LATIN SMALL LETTER W WITH RING ABOVE; CANONSEQ
-1E85 ; [.0A47.0047.0002.1E85] # LATIN SMALL LETTER W WITH DIAERESIS; CANONSEQ
-1E84 ; [.0A47.0047.0008.1E84] # LATIN CAPITAL LETTER W WITH DIAERESIS; CANONSEQ
-1E87 ; [.0A47.0052.0002.1E87] # LATIN SMALL LETTER W WITH DOT ABOVE; CANONSEQ
-1E86 ; [.0A47.0052.0008.1E86] # LATIN CAPITAL LETTER W WITH DOT ABOVE; CANONSEQ
-1E89 ; [.0A47.0079.0002.1E89] # LATIN SMALL LETTER W WITH DOT BELOW; CANONSEQ
-1E88 ; [.0A47.0079.0008.1E88] # LATIN CAPITAL LETTER W WITH DOT BELOW; CANONSEQ
-028D ; [.0A4B.0020.0002.028D] # LATIN SMALL LETTER TURNED W
-0078 ; [.0A4F.0020.0002.0078] # LATIN SMALL LETTER X
-0058 ; [.0A4F.0020.0008.0058] # LATIN CAPITAL LETTER X
-1E8D ; [.0A4F.0047.0002.1E8D] # LATIN SMALL LETTER X WITH DIAERESIS; CANONSEQ
-1E8C ; [.0A4F.0047.0008.1E8C] # LATIN CAPITAL LETTER X WITH DIAERESIS; CANONSEQ
-1E8B ; [.0A4F.0052.0002.1E8B] # LATIN SMALL LETTER X WITH DOT ABOVE; CANONSEQ
-1E8A ; [.0A4F.0052.0008.1E8A] # LATIN CAPITAL LETTER X WITH DOT ABOVE; CANONSEQ
-0079 ; [.0A53.0020.0002.0079] # LATIN SMALL LETTER Y
-0059 ; [.0A53.0020.0008.0059] # LATIN CAPITAL LETTER Y
-00FD ; [.0A53.0032.0002.00FD] # LATIN SMALL LETTER Y WITH ACUTE; CANONSEQ
-00DD ; [.0A53.0032.0008.00DD] # LATIN CAPITAL LETTER Y WITH ACUTE; CANONSEQ
-1EF3 ; [.0A53.0035.0002.1EF3] # LATIN SMALL LETTER Y WITH GRAVE; CANONSEQ
-1EF2 ; [.0A53.0035.0008.1EF2] # LATIN CAPITAL LETTER Y WITH GRAVE; CANONSEQ
-0177 ; [.0A53.003C.0002.0177] # LATIN SMALL LETTER Y WITH CIRCUMFLEX; CANONSEQ
-0176 ; [.0A53.003C.0008.0176] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX; CANONSEQ
-1E99 ; [.0A53.0043.0002.1E99] # LATIN SMALL LETTER Y WITH RING ABOVE; CANONSEQ
-00FF ; [.0A53.0047.0002.00FF] # LATIN SMALL LETTER Y WITH DIAERESIS; CANONSEQ
-0178 ; [.0A53.0047.0008.0178] # LATIN CAPITAL LETTER Y WITH DIAERESIS; CANONSEQ
-1EF9 ; [.0A53.004E.0002.1EF9] # LATIN SMALL LETTER Y WITH TILDE; CANONSEQ
-1EF8 ; [.0A53.004E.0008.1EF8] # LATIN CAPITAL LETTER Y WITH TILDE; CANONSEQ
-1E8F ; [.0A53.0052.0002.1E8F] # LATIN SMALL LETTER Y WITH DOT ABOVE; CANONSEQ
-1E8E ; [.0A53.0052.0008.1E8E] # LATIN CAPITAL LETTER Y WITH DOT ABOVE; CANONSEQ
-0233 ; [.0A53.005A.0002.0233] # LATIN SMALL LETTER Y WITH MACRON; CANONSEQ
-0232 ; [.0A53.005A.0008.0232] # LATIN CAPITAL LETTER Y WITH MACRON; CANONSEQ
-1EF7 ; [.0A53.005F.0002.1EF7] # LATIN SMALL LETTER Y WITH HOOK ABOVE; CANONSEQ
-1EF6 ; [.0A53.005F.0008.1EF6] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE; CANONSEQ
-1EF5 ; [.0A53.0079.0002.1EF5] # LATIN SMALL LETTER Y WITH DOT BELOW; CANONSEQ
-1EF4 ; [.0A53.0079.0008.1EF4] # LATIN CAPITAL LETTER Y WITH DOT BELOW; CANONSEQ
-028F ; [.0A57.0020.0002.028F] # LATIN LETTER SMALL CAPITAL Y
-01B4 ; [.0A5B.0020.0002.01B4] # LATIN SMALL LETTER Y WITH HOOK
-01B3 ; [.0A5B.0020.0008.01B3] # LATIN CAPITAL LETTER Y WITH HOOK
-007A ; [.0A5F.0020.0002.007A] # LATIN SMALL LETTER Z
-005A ; [.0A5F.0020.0008.005A] # LATIN CAPITAL LETTER Z
-017A ; [.0A5F.0032.0002.017A] # LATIN SMALL LETTER Z WITH ACUTE; CANONSEQ
-0179 ; [.0A5F.0032.0008.0179] # LATIN CAPITAL LETTER Z WITH ACUTE; CANONSEQ
-1E91 ; [.0A5F.003C.0002.1E91] # LATIN SMALL LETTER Z WITH CIRCUMFLEX; CANONSEQ
-1E90 ; [.0A5F.003C.0008.1E90] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX; CANONSEQ
-017E ; [.0A5F.0041.0002.017E] # LATIN SMALL LETTER Z WITH CARON; CANONSEQ
-017D ; [.0A5F.0041.0008.017D] # LATIN CAPITAL LETTER Z WITH CARON; CANONSEQ
-017C ; [.0A5F.0052.0002.017C] # LATIN SMALL LETTER Z WITH DOT ABOVE; CANONSEQ
-017B ; [.0A5F.0052.0008.017B] # LATIN CAPITAL LETTER Z WITH DOT ABOVE; CANONSEQ
-1E93 ; [.0A5F.0079.0002.1E93] # LATIN SMALL LETTER Z WITH DOT BELOW; CANONSEQ
-1E92 ; [.0A5F.0079.0008.1E92] # LATIN CAPITAL LETTER Z WITH DOT BELOW; CANONSEQ
-1E95 ; [.0A5F.0089.0002.1E95] # LATIN SMALL LETTER Z WITH LINE BELOW; CANONSEQ
-1E94 ; [.0A5F.0089.0008.1E94] # LATIN CAPITAL LETTER Z WITH LINE BELOW; CANONSEQ
-01B6 ; [.0A63.0020.0002.01B6] # LATIN SMALL LETTER Z WITH STROKE
-01B5 ; [.0A63.0020.0008.01B5] # LATIN CAPITAL LETTER Z WITH STROKE
-0225 ; [.0A67.0020.0002.0225] # LATIN SMALL LETTER Z WITH HOOK
-0224 ; [.0A67.0020.0008.0224] # LATIN CAPITAL LETTER Z WITH HOOK
-0290 ; [.0A6B.0020.0002.0290] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK
-0291 ; [.0A6F.0020.0002.0291] # LATIN SMALL LETTER Z WITH CURL
-0292 ; [.0A73.0020.0002.0292] # LATIN SMALL LETTER EZH
-01B7 ; [.0A73.0020.0008.01B7] # LATIN CAPITAL LETTER EZH
-01EF ; [.0A73.0041.0002.01EF] # LATIN SMALL LETTER EZH WITH CARON; CANONSEQ
-01EE ; [.0A73.0041.0008.01EE] # LATIN CAPITAL LETTER EZH WITH CARON; CANONSEQ
-01B9 ; [.0A77.0020.0002.01B9] # LATIN SMALL LETTER EZH REVERSED
-01B8 ; [.0A77.0020.0008.01B8] # LATIN CAPITAL LETTER EZH REVERSED
-01BA ; [.0A7B.0020.0002.01BA] # LATIN SMALL LETTER EZH WITH TAIL
-0293 ; [.0A7F.0020.0002.0293] # LATIN SMALL LETTER EZH WITH CURL
-021D ; [.0A83.0020.0002.021D] # LATIN SMALL LETTER YOGH
-021C ; [.0A83.0020.0008.021C] # LATIN CAPITAL LETTER YOGH
-00FE ; [.0A87.0020.0002.00FE] # LATIN SMALL LETTER THORN
-00DE ; [.0A87.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
-01BF ; [.0A8B.0020.0002.01BF] # LATIN LETTER WYNN
-01F7 ; [.0A8B.0020.0008.01F7] # LATIN CAPITAL LETTER WYNN
-01BB ; [.0A8F.0020.0002.01BB] # LATIN LETTER TWO WITH STROKE
-01A8 ; [.0A93.0020.0002.01A8] # LATIN SMALL LETTER TONE TWO
-01A7 ; [.0A93.0020.0008.01A7] # LATIN CAPITAL LETTER TONE TWO
-01BD ; [.0A97.0020.0002.01BD] # LATIN SMALL LETTER TONE FIVE
-01BC ; [.0A97.0020.0008.01BC] # LATIN CAPITAL LETTER TONE FIVE
-0185 ; [.0A9B.0020.0002.0185] # LATIN SMALL LETTER TONE SIX
-0184 ; [.0A9B.0020.0008.0184] # LATIN CAPITAL LETTER TONE SIX
-0294 ; [.0A9F.0020.0002.0294] # LATIN LETTER GLOTTAL STOP
-02C0 ; [.0AA3.0020.0002.02C0] # MODIFIER LETTER GLOTTAL STOP
-02BC ; [.0AA4.0020.0002.02BC] # MODIFIER LETTER APOSTROPHE
-02EE ; [.0AA5.0020.0002.02EE] # MODIFIER LETTER DOUBLE APOSTROPHE
-02BE ; [.0AA6.0020.0002.02BE] # MODIFIER LETTER RIGHT HALF RING
-0295 ; [.0AA7.0020.0002.0295] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE
-02BF ; [.0AAB.0020.0002.02BF] # MODIFIER LETTER LEFT HALF RING
-02C1 ; [.0AAC.0020.0002.02C1] # MODIFIER LETTER REVERSED GLOTTAL STOP
-01BE ; [.0AAD.0020.0002.01BE] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
-02A1 ; [.0AB1.0020.0002.02A1] # LATIN LETTER GLOTTAL STOP WITH STROKE
-02A2 ; [.0AB5.0020.0002.02A2] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
-0296 ; [.0AB9.0020.0002.0296] # LATIN LETTER INVERTED GLOTTAL STOP
-01C0 ; [.0ABD.0020.0002.01C0] # LATIN LETTER DENTAL CLICK
-01C1 ; [.0AC1.0020.0002.01C1] # LATIN LETTER LATERAL CLICK
-01C2 ; [.0AC5.0020.0002.01C2] # LATIN LETTER ALVEOLAR CLICK
-01C3 ; [.0AC9.0020.0002.01C3] # LATIN LETTER RETROFLEX CLICK
-0297 ; [.0ACD.0020.0002.0297] # LATIN LETTER STRETCHED C
-0298 ; [.0AD1.0020.0002.0298] # LATIN LETTER BILABIAL CLICK
-02AC ; [.0AD5.0020.0002.02AC] # LATIN LETTER BILABIAL PERCUSSIVE
-02AD ; [.0AD9.0020.0002.02AD] # LATIN LETTER BIDENTAL PERCUSSIVE
-2126 ; [.0AF8.0020.0008.2126] # OHM SIGN; CANON
-1100 ; [.1684.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
-1101 ; [.1685.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
-1102 ; [.1686.0020.0002.1102] # HANGUL CHOSEONG NIEUN
-1103 ; [.1687.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
-1104 ; [.1688.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
-1105 ; [.1689.0020.0002.1105] # HANGUL CHOSEONG RIEUL
-1106 ; [.168A.0020.0002.1106] # HANGUL CHOSEONG MIEUM
-1107 ; [.168B.0020.0002.1107] # HANGUL CHOSEONG PIEUP
-1108 ; [.168C.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
-1109 ; [.168D.0020.0002.1109] # HANGUL CHOSEONG SIOS
-110A ; [.168E.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
-110B ; [.168F.0020.0002.110B] # HANGUL CHOSEONG IEUNG
-110C ; [.1690.0020.0002.110C] # HANGUL CHOSEONG CIEUC
-110D ; [.1691.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
-110E ; [.1692.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
-110F ; [.1693.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
-1110 ; [.1694.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
-1111 ; [.1695.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
-1112 ; [.1696.0020.0002.1112] # HANGUL CHOSEONG HIEUH
-1113 ; [.1697.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
-1114 ; [.1698.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
-1115 ; [.1699.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
-1116 ; [.169A.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
-1117 ; [.169B.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
-1118 ; [.169C.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
-1119 ; [.169D.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
-111A ; [.169E.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
-111B ; [.169F.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
-111C ; [.16A0.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
-111D ; [.16A1.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
-111E ; [.16A2.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
-111F ; [.16A3.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
-1120 ; [.16A4.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
-1121 ; [.16A5.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
-1122 ; [.16A6.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
-1123 ; [.16A7.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
-1124 ; [.16A8.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
-1125 ; [.16A9.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
-1126 ; [.16AA.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
-1127 ; [.16AB.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
-1128 ; [.16AC.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
-1129 ; [.16AD.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
-112A ; [.16AE.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
-112B ; [.16AF.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
-112C ; [.16B0.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
-112D ; [.16B1.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
-112E ; [.16B2.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
-112F ; [.16B3.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
-1130 ; [.16B4.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
-1131 ; [.16B5.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
-1132 ; [.16B6.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
-1133 ; [.16B7.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
-1134 ; [.16B8.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
-1135 ; [.16B9.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
-1136 ; [.16BA.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
-1137 ; [.16BB.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
-1138 ; [.16BC.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
-1139 ; [.16BD.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
-113A ; [.16BE.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
-113B ; [.16BF.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
-113C ; [.16C0.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
-113D ; [.16C1.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
-113E ; [.16C2.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
-113F ; [.16C3.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
-1140 ; [.16C4.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
-1141 ; [.16C5.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
-1142 ; [.16C6.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
-1143 ; [.16C7.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
-1144 ; [.16C8.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
-1145 ; [.16C9.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
-1146 ; [.16CA.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
-1147 ; [.16CB.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
-1148 ; [.16CC.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
-1149 ; [.16CD.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
-114A ; [.16CE.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
-114B ; [.16CF.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
-114C ; [.16D0.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
-114D ; [.16D1.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
-114E ; [.16D2.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
-114F ; [.16D3.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
-1150 ; [.16D4.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
-1151 ; [.16D5.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
-1152 ; [.16D6.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
-1153 ; [.16D7.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
-1154 ; [.16D8.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
-1155 ; [.16D9.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
-1156 ; [.16DA.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
-1157 ; [.16DB.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
-1158 ; [.16DC.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
-1159 ; [.16DD.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
-115F ; [.16DE.0020.0002.115F] # HANGUL CHOSEONG FILLER
-1160 ; [.16DF.0020.0002.1160] # HANGUL JUNGSEONG FILLER
-1161 ; [.16E0.0020.0002.1161] # HANGUL JUNGSEONG A
-1162 ; [.16E1.0020.0002.1162] # HANGUL JUNGSEONG AE
-1163 ; [.16E2.0020.0002.1163] # HANGUL JUNGSEONG YA
-1164 ; [.16E3.0020.0002.1164] # HANGUL JUNGSEONG YAE
-1165 ; [.16E4.0020.0002.1165] # HANGUL JUNGSEONG EO
-1166 ; [.16E5.0020.0002.1166] # HANGUL JUNGSEONG E
-1167 ; [.16E6.0020.0002.1167] # HANGUL JUNGSEONG YEO
-1168 ; [.16E7.0020.0002.1168] # HANGUL JUNGSEONG YE
-1169 ; [.16E8.0020.0002.1169] # HANGUL JUNGSEONG O
-116A ; [.16E9.0020.0002.116A] # HANGUL JUNGSEONG WA
-116B ; [.16EA.0020.0002.116B] # HANGUL JUNGSEONG WAE
-116C ; [.16EB.0020.0002.116C] # HANGUL JUNGSEONG OE
-116D ; [.16EC.0020.0002.116D] # HANGUL JUNGSEONG YO
-116E ; [.16ED.0020.0002.116E] # HANGUL JUNGSEONG U
-116F ; [.16EE.0020.0002.116F] # HANGUL JUNGSEONG WEO
-1170 ; [.16EF.0020.0002.1170] # HANGUL JUNGSEONG WE
-1171 ; [.16F0.0020.0002.1171] # HANGUL JUNGSEONG WI
-1172 ; [.16F1.0020.0002.1172] # HANGUL JUNGSEONG YU
-1173 ; [.16F2.0020.0002.1173] # HANGUL JUNGSEONG EU
-1174 ; [.16F3.0020.0002.1174] # HANGUL JUNGSEONG YI
-1175 ; [.16F4.0020.0002.1175] # HANGUL JUNGSEONG I
-1176 ; [.16F5.0020.0002.1176] # HANGUL JUNGSEONG A-O
-1177 ; [.16F6.0020.0002.1177] # HANGUL JUNGSEONG A-U
-1178 ; [.16F7.0020.0002.1178] # HANGUL JUNGSEONG YA-O
-1179 ; [.16F8.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
-117A ; [.16F9.0020.0002.117A] # HANGUL JUNGSEONG EO-O
-117B ; [.16FA.0020.0002.117B] # HANGUL JUNGSEONG EO-U
-117C ; [.16FB.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
-117D ; [.16FC.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
-117E ; [.16FD.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
-117F ; [.16FE.0020.0002.117F] # HANGUL JUNGSEONG O-EO
-1180 ; [.16FF.0020.0002.1180] # HANGUL JUNGSEONG O-E
-1181 ; [.1700.0020.0002.1181] # HANGUL JUNGSEONG O-YE
-1182 ; [.1701.0020.0002.1182] # HANGUL JUNGSEONG O-O
-1183 ; [.1702.0020.0002.1183] # HANGUL JUNGSEONG O-U
-1184 ; [.1703.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
-1185 ; [.1704.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
-1186 ; [.1705.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
-1187 ; [.1706.0020.0002.1187] # HANGUL JUNGSEONG YO-O
-1188 ; [.1707.0020.0002.1188] # HANGUL JUNGSEONG YO-I
-1189 ; [.1708.0020.0002.1189] # HANGUL JUNGSEONG U-A
-118A ; [.1709.0020.0002.118A] # HANGUL JUNGSEONG U-AE
-118B ; [.170A.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
-118C ; [.170B.0020.0002.118C] # HANGUL JUNGSEONG U-YE
-118D ; [.170C.0020.0002.118D] # HANGUL JUNGSEONG U-U
-118E ; [.170D.0020.0002.118E] # HANGUL JUNGSEONG YU-A
-118F ; [.170E.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
-1190 ; [.170F.0020.0002.1190] # HANGUL JUNGSEONG YU-E
-1191 ; [.1710.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
-1192 ; [.1711.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
-1193 ; [.1712.0020.0002.1193] # HANGUL JUNGSEONG YU-U
-1194 ; [.1713.0020.0002.1194] # HANGUL JUNGSEONG YU-I
-1195 ; [.1714.0020.0002.1195] # HANGUL JUNGSEONG EU-U
-1196 ; [.1715.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
-1197 ; [.1716.0020.0002.1197] # HANGUL JUNGSEONG YI-U
-1198 ; [.1717.0020.0002.1198] # HANGUL JUNGSEONG I-A
-1199 ; [.1718.0020.0002.1199] # HANGUL JUNGSEONG I-YA
-119A ; [.1719.0020.0002.119A] # HANGUL JUNGSEONG I-O
-119B ; [.171A.0020.0002.119B] # HANGUL JUNGSEONG I-U
-119C ; [.171B.0020.0002.119C] # HANGUL JUNGSEONG I-EU
-119D ; [.171C.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
-119E ; [.171D.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
-119F ; [.171E.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
-11A0 ; [.171F.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
-11A1 ; [.1720.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
-11A2 ; [.1721.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
-11A8 ; [.1722.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
-11A9 ; [.1723.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
-11AA ; [.1724.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
-11AB ; [.1725.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
-11AC ; [.1726.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
-11AD ; [.1727.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
-11AE ; [.1728.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
-11AF ; [.1729.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
-11B0 ; [.172A.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
-11B1 ; [.172B.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
-11B2 ; [.172C.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
-11B3 ; [.172D.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
-11B4 ; [.172E.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
-11B5 ; [.172F.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
-11B6 ; [.1730.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
-11B7 ; [.1731.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
-11B8 ; [.1732.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
-11B9 ; [.1733.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
-11BA ; [.1734.0020.0002.11BA] # HANGUL JONGSEONG SIOS
-11BB ; [.1735.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
-11BC ; [.1736.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
-11BD ; [.1737.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
-11BE ; [.1738.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
-11BF ; [.1739.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
-11C0 ; [.173A.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
-11C1 ; [.173B.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
-11C2 ; [.173C.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
-11C3 ; [.173D.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
-11C4 ; [.173E.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
-11C5 ; [.173F.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
-11C6 ; [.1740.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
-11C7 ; [.1741.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
-11C8 ; [.1742.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
-11C9 ; [.1743.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
-11CA ; [.1744.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
-11CB ; [.1745.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
-11CC ; [.1746.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
-11CD ; [.1747.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
-11CE ; [.1748.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
-11CF ; [.1749.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
-11D0 ; [.174A.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
-11D1 ; [.174B.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
-11D2 ; [.174C.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
-11D3 ; [.174D.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
-11D4 ; [.174E.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
-11D5 ; [.174F.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
-11D6 ; [.1750.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
-11D7 ; [.1751.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
-11D8 ; [.1752.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
-11D9 ; [.1753.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
-11DA ; [.1754.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
-11DB ; [.1755.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
-11DC ; [.1756.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
-11DD ; [.1757.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
-11DE ; [.1758.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
-11DF ; [.1759.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
-11E0 ; [.175A.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
-11E1 ; [.175B.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
-11E2 ; [.175C.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
-11E3 ; [.175D.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
-11E4 ; [.175E.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
-11E5 ; [.175F.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
-11E6 ; [.1760.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
-11E7 ; [.1761.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
-11E8 ; [.1762.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
-11E9 ; [.1763.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
-11EA ; [.1764.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
-11EB ; [.1765.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
-11EC ; [.1766.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
-11ED ; [.1767.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
-11EE ; [.1768.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
-11EF ; [.1769.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
-11F0 ; [.176A.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
-11F1 ; [.176B.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
-11F2 ; [.176C.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
-11F3 ; [.176D.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
-11F4 ; [.176E.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
-11F5 ; [.176F.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
-11F6 ; [.1770.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
-11F7 ; [.1771.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
-11F8 ; [.1772.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
-11F9 ; [.1773.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
-3041 ; [.1774.0020.000D.3041] # HIRAGANA LETTER SMALL A
-3042 ; [.1774.0020.000E.3042] # HIRAGANA LETTER A
-30A1 ; [.1774.0020.000F.30A1] # KATAKANA LETTER SMALL A
-30A2 ; [.1774.0020.0011.30A2] # KATAKANA LETTER A
-3043 ; [.1775.0020.000D.3043] # HIRAGANA LETTER SMALL I
-3044 ; [.1775.0020.000E.3044] # HIRAGANA LETTER I
-30A3 ; [.1775.0020.000F.30A3] # KATAKANA LETTER SMALL I
-30A4 ; [.1775.0020.0011.30A4] # KATAKANA LETTER I
-3045 ; [.1776.0020.000D.3045] # HIRAGANA LETTER SMALL U
-3046 ; [.1776.0020.000E.3046] # HIRAGANA LETTER U
-30A5 ; [.1776.0020.000F.30A5] # KATAKANA LETTER SMALL U
-30A6 ; [.1776.0020.0011.30A6] # KATAKANA LETTER U
-3094 ; [.1776.013E.000E.3094] # HIRAGANA LETTER VU; CANONSEQ
-30F4 ; [.1776.013E.0011.30F4] # KATAKANA LETTER VU; CANONSEQ
-3047 ; [.1777.0020.000D.3047] # HIRAGANA LETTER SMALL E
-3048 ; [.1777.0020.000E.3048] # HIRAGANA LETTER E
-30A7 ; [.1777.0020.000F.30A7] # KATAKANA LETTER SMALL E
-30A8 ; [.1777.0020.0011.30A8] # KATAKANA LETTER E
-3049 ; [.1778.0020.000D.3049] # HIRAGANA LETTER SMALL O
-304A ; [.1778.0020.000E.304A] # HIRAGANA LETTER O
-30A9 ; [.1778.0020.000F.30A9] # KATAKANA LETTER SMALL O
-30AA ; [.1778.0020.0011.30AA] # KATAKANA LETTER O
-304B ; [.1779.0020.000E.304B] # HIRAGANA LETTER KA
-30F5 ; [.1779.0020.000F.30F5] # KATAKANA LETTER SMALL KA
-30AB ; [.1779.0020.0011.30AB] # KATAKANA LETTER KA
-304C ; [.1779.013E.000E.304C] # HIRAGANA LETTER GA; CANONSEQ
-30AC ; [.1779.013E.0011.30AC] # KATAKANA LETTER GA; CANONSEQ
-304D ; [.177A.0020.000E.304D] # HIRAGANA LETTER KI
-30AD ; [.177A.0020.0011.30AD] # KATAKANA LETTER KI
-304E ; [.177A.013E.000E.304E] # HIRAGANA LETTER GI; CANONSEQ
-30AE ; [.177A.013E.0011.30AE] # KATAKANA LETTER GI; CANONSEQ
-304F ; [.177B.0020.000E.304F] # HIRAGANA LETTER KU
-30AF ; [.177B.0020.0011.30AF] # KATAKANA LETTER KU
-3050 ; [.177B.013E.000E.3050] # HIRAGANA LETTER GU; CANONSEQ
-30B0 ; [.177B.013E.0011.30B0] # KATAKANA LETTER GU; CANONSEQ
-3051 ; [.177C.0020.000E.3051] # HIRAGANA LETTER KE
-30F6 ; [.177C.0020.000F.30F6] # KATAKANA LETTER SMALL KE
-30B1 ; [.177C.0020.0011.30B1] # KATAKANA LETTER KE
-3052 ; [.177C.013E.000E.3052] # HIRAGANA LETTER GE; CANONSEQ
-30B2 ; [.177C.013E.0011.30B2] # KATAKANA LETTER GE; CANONSEQ
-3053 ; [.177D.0020.000E.3053] # HIRAGANA LETTER KO
-30B3 ; [.177D.0020.0011.30B3] # KATAKANA LETTER KO
-3054 ; [.177D.013E.000E.3054] # HIRAGANA LETTER GO; CANONSEQ
-30B4 ; [.177D.013E.0011.30B4] # KATAKANA LETTER GO; CANONSEQ
-3055 ; [.177E.0020.000E.3055] # HIRAGANA LETTER SA
-30B5 ; [.177E.0020.0011.30B5] # KATAKANA LETTER SA
-3056 ; [.177E.013E.000E.3056] # HIRAGANA LETTER ZA; CANONSEQ
-30B6 ; [.177E.013E.0011.30B6] # KATAKANA LETTER ZA; CANONSEQ
-3057 ; [.177F.0020.000E.3057] # HIRAGANA LETTER SI
-30B7 ; [.177F.0020.0011.30B7] # KATAKANA LETTER SI
-3058 ; [.177F.013E.000E.3058] # HIRAGANA LETTER ZI; CANONSEQ
-30B8 ; [.177F.013E.0011.30B8] # KATAKANA LETTER ZI; CANONSEQ
-3059 ; [.1780.0020.000E.3059] # HIRAGANA LETTER SU
-30B9 ; [.1780.0020.0011.30B9] # KATAKANA LETTER SU
-305A ; [.1780.013E.000E.305A] # HIRAGANA LETTER ZU; CANONSEQ
-30BA ; [.1780.013E.0011.30BA] # KATAKANA LETTER ZU; CANONSEQ
-305B ; [.1781.0020.000E.305B] # HIRAGANA LETTER SE
-30BB ; [.1781.0020.0011.30BB] # KATAKANA LETTER SE
-305C ; [.1781.013E.000E.305C] # HIRAGANA LETTER ZE; CANONSEQ
-30BC ; [.1781.013E.0011.30BC] # KATAKANA LETTER ZE; CANONSEQ
-305D ; [.1782.0020.000E.305D] # HIRAGANA LETTER SO
-30BD ; [.1782.0020.0011.30BD] # KATAKANA LETTER SO
-305E ; [.1782.013E.000E.305E] # HIRAGANA LETTER ZO; CANONSEQ
-30BE ; [.1782.013E.0011.30BE] # KATAKANA LETTER ZO; CANONSEQ
-305F ; [.1783.0020.000E.305F] # HIRAGANA LETTER TA
-30BF ; [.1783.0020.0011.30BF] # KATAKANA LETTER TA
-3060 ; [.1783.013E.000E.3060] # HIRAGANA LETTER DA; CANONSEQ
-30C0 ; [.1783.013E.0011.30C0] # KATAKANA LETTER DA; CANONSEQ
-3061 ; [.1784.0020.000E.3061] # HIRAGANA LETTER TI
-30C1 ; [.1784.0020.0011.30C1] # KATAKANA LETTER TI
-3062 ; [.1784.013E.000E.3062] # HIRAGANA LETTER DI; CANONSEQ
-30C2 ; [.1784.013E.0011.30C2] # KATAKANA LETTER DI; CANONSEQ
-3063 ; [.1785.0020.000D.3063] # HIRAGANA LETTER SMALL TU
-3064 ; [.1785.0020.000E.3064] # HIRAGANA LETTER TU
-30C3 ; [.1785.0020.000F.30C3] # KATAKANA LETTER SMALL TU
-30C4 ; [.1785.0020.0011.30C4] # KATAKANA LETTER TU
-3065 ; [.1785.013E.000E.3065] # HIRAGANA LETTER DU; CANONSEQ
-30C5 ; [.1785.013E.0011.30C5] # KATAKANA LETTER DU; CANONSEQ
-3066 ; [.1786.0020.000E.3066] # HIRAGANA LETTER TE
-30C6 ; [.1786.0020.0011.30C6] # KATAKANA LETTER TE
-3067 ; [.1786.013E.000E.3067] # HIRAGANA LETTER DE; CANONSEQ
-30C7 ; [.1786.013E.0011.30C7] # KATAKANA LETTER DE; CANONSEQ
-3068 ; [.1787.0020.000E.3068] # HIRAGANA LETTER TO
-30C8 ; [.1787.0020.0011.30C8] # KATAKANA LETTER TO
-3069 ; [.1787.013E.000E.3069] # HIRAGANA LETTER DO; CANONSEQ
-30C9 ; [.1787.013E.0011.30C9] # KATAKANA LETTER DO; CANONSEQ
-306A ; [.1788.0020.000E.306A] # HIRAGANA LETTER NA
-30CA ; [.1788.0020.0011.30CA] # KATAKANA LETTER NA
-306B ; [.1789.0020.000E.306B] # HIRAGANA LETTER NI
-30CB ; [.1789.0020.0011.30CB] # KATAKANA LETTER NI
-306C ; [.178A.0020.000E.306C] # HIRAGANA LETTER NU
-30CC ; [.178A.0020.0011.30CC] # KATAKANA LETTER NU
-306D ; [.178B.0020.000E.306D] # HIRAGANA LETTER NE
-30CD ; [.178B.0020.0011.30CD] # KATAKANA LETTER NE
-306E ; [.178C.0020.000E.306E] # HIRAGANA LETTER NO
-30CE ; [.178C.0020.0011.30CE] # KATAKANA LETTER NO
-306F ; [.178D.0020.000E.306F] # HIRAGANA LETTER HA
-30CF ; [.178D.0020.0011.30CF] # KATAKANA LETTER HA
-3070 ; [.178D.013E.000E.3070] # HIRAGANA LETTER BA; CANONSEQ
-30D0 ; [.178D.013E.0011.30D0] # KATAKANA LETTER BA; CANONSEQ
-3071 ; [.178D.013F.000E.3071] # HIRAGANA LETTER PA; CANONSEQ
-30D1 ; [.178D.013F.0011.30D1] # KATAKANA LETTER PA; CANONSEQ
-3072 ; [.178E.0020.000E.3072] # HIRAGANA LETTER HI
-30D2 ; [.178E.0020.0011.30D2] # KATAKANA LETTER HI
-3073 ; [.178E.013E.000E.3073] # HIRAGANA LETTER BI; CANONSEQ
-30D3 ; [.178E.013E.0011.30D3] # KATAKANA LETTER BI; CANONSEQ
-3074 ; [.178E.013F.000E.3074] # HIRAGANA LETTER PI; CANONSEQ
-30D4 ; [.178E.013F.0011.30D4] # KATAKANA LETTER PI; CANONSEQ
-3075 ; [.178F.0020.000E.3075] # HIRAGANA LETTER HU
-30D5 ; [.178F.0020.0011.30D5] # KATAKANA LETTER HU
-3076 ; [.178F.013E.000E.3076] # HIRAGANA LETTER BU; CANONSEQ
-30D6 ; [.178F.013E.0011.30D6] # KATAKANA LETTER BU; CANONSEQ
-3077 ; [.178F.013F.000E.3077] # HIRAGANA LETTER PU; CANONSEQ
-30D7 ; [.178F.013F.0011.30D7] # KATAKANA LETTER PU; CANONSEQ
-3078 ; [.1790.0020.000E.3078] # HIRAGANA LETTER HE
-30D8 ; [.1790.0020.0011.30D8] # KATAKANA LETTER HE
-3079 ; [.1790.013E.000E.3079] # HIRAGANA LETTER BE; CANONSEQ
-30D9 ; [.1790.013E.0011.30D9] # KATAKANA LETTER BE; CANONSEQ
-307A ; [.1790.013F.000E.307A] # HIRAGANA LETTER PE; CANONSEQ
-30DA ; [.1790.013F.0011.30DA] # KATAKANA LETTER PE; CANONSEQ
-307B ; [.1791.0020.000E.307B] # HIRAGANA LETTER HO
-30DB ; [.1791.0020.0011.30DB] # KATAKANA LETTER HO
-307C ; [.1791.013E.000E.307C] # HIRAGANA LETTER BO; CANONSEQ
-30DC ; [.1791.013E.0011.30DC] # KATAKANA LETTER BO; CANONSEQ
-307D ; [.1791.013F.000E.307D] # HIRAGANA LETTER PO; CANONSEQ
-30DD ; [.1791.013F.0011.30DD] # KATAKANA LETTER PO; CANONSEQ
-307E ; [.1792.0020.000E.307E] # HIRAGANA LETTER MA
-30DE ; [.1792.0020.0011.30DE] # KATAKANA LETTER MA
-307F ; [.1793.0020.000E.307F] # HIRAGANA LETTER MI
-30DF ; [.1793.0020.0011.30DF] # KATAKANA LETTER MI
-3080 ; [.1794.0020.000E.3080] # HIRAGANA LETTER MU
-30E0 ; [.1794.0020.0011.30E0] # KATAKANA LETTER MU
-3081 ; [.1795.0020.000E.3081] # HIRAGANA LETTER ME
-30E1 ; [.1795.0020.0011.30E1] # KATAKANA LETTER ME
-3082 ; [.1796.0020.000E.3082] # HIRAGANA LETTER MO
-30E2 ; [.1796.0020.0011.30E2] # KATAKANA LETTER MO
-3083 ; [.1797.0020.000D.3083] # HIRAGANA LETTER SMALL YA
-3084 ; [.1797.0020.000E.3084] # HIRAGANA LETTER YA
-30E3 ; [.1797.0020.000F.30E3] # KATAKANA LETTER SMALL YA
-30E4 ; [.1797.0020.0011.30E4] # KATAKANA LETTER YA
-3085 ; [.1798.0020.000D.3085] # HIRAGANA LETTER SMALL YU
-3086 ; [.1798.0020.000E.3086] # HIRAGANA LETTER YU
-30E5 ; [.1798.0020.000F.30E5] # KATAKANA LETTER SMALL YU
-30E6 ; [.1798.0020.0011.30E6] # KATAKANA LETTER YU
-3087 ; [.1799.0020.000D.3087] # HIRAGANA LETTER SMALL YO
-3088 ; [.1799.0020.000E.3088] # HIRAGANA LETTER YO
-30E7 ; [.1799.0020.000F.30E7] # KATAKANA LETTER SMALL YO
-30E8 ; [.1799.0020.0011.30E8] # KATAKANA LETTER YO
-3089 ; [.179A.0020.000E.3089] # HIRAGANA LETTER RA
-30E9 ; [.179A.0020.0011.30E9] # KATAKANA LETTER RA
-308A ; [.179B.0020.000E.308A] # HIRAGANA LETTER RI
-30EA ; [.179B.0020.0011.30EA] # KATAKANA LETTER RI
-308B ; [.179C.0020.000E.308B] # HIRAGANA LETTER RU
-30EB ; [.179C.0020.0011.30EB] # KATAKANA LETTER RU
-308C ; [.179D.0020.000E.308C] # HIRAGANA LETTER RE
-30EC ; [.179D.0020.0011.30EC] # KATAKANA LETTER RE
-308D ; [.179E.0020.000E.308D] # HIRAGANA LETTER RO
-30ED ; [.179E.0020.0011.30ED] # KATAKANA LETTER RO
-308E ; [.179F.0020.000D.308E] # HIRAGANA LETTER SMALL WA
-308F ; [.179F.0020.000E.308F] # HIRAGANA LETTER WA
-30EE ; [.179F.0020.000F.30EE] # KATAKANA LETTER SMALL WA
-30EF ; [.179F.0020.0011.30EF] # KATAKANA LETTER WA
-30F7 ; [.179F.013E.0011.30F7] # KATAKANA LETTER VA; CANONSEQ
-3090 ; [.17A0.0020.000E.3090] # HIRAGANA LETTER WI
-30F0 ; [.17A0.0020.0011.30F0] # KATAKANA LETTER WI
-30F8 ; [.17A0.013E.0011.30F8] # KATAKANA LETTER VI; CANONSEQ
-3091 ; [.17A1.0020.000E.3091] # HIRAGANA LETTER WE
-30F1 ; [.17A1.0020.0011.30F1] # KATAKANA LETTER WE
-30F9 ; [.17A1.013E.0011.30F9] # KATAKANA LETTER VE; CANONSEQ
-3092 ; [.17A2.0020.000E.3092] # HIRAGANA LETTER WO
-30F2 ; [.17A2.0020.0011.30F2] # KATAKANA LETTER WO
-30FA ; [.17A2.013E.0011.30FA] # KATAKANA LETTER VO; CANONSEQ
-3093 ; [.17A3.0020.000E.3093] # HIRAGANA LETTER N
-30F3 ; [.17A3.0020.0011.30F3] # KATAKANA LETTER N
-3105 ; [.17A4.0020.0002.3105] # BOPOMOFO LETTER B
-3106 ; [.17A5.0020.0002.3106] # BOPOMOFO LETTER P
-3107 ; [.17A6.0020.0002.3107] # BOPOMOFO LETTER M
-3108 ; [.17A7.0020.0002.3108] # BOPOMOFO LETTER F
-312A ; [.17A8.0020.0002.312A] # BOPOMOFO LETTER V
-3109 ; [.17A9.0020.0002.3109] # BOPOMOFO LETTER D
-310A ; [.17AA.0020.0002.310A] # BOPOMOFO LETTER T
-310B ; [.17AB.0020.0002.310B] # BOPOMOFO LETTER N
-310C ; [.17AC.0020.0002.310C] # BOPOMOFO LETTER L
-310D ; [.17AD.0020.0002.310D] # BOPOMOFO LETTER G
-310E ; [.17AE.0020.0002.310E] # BOPOMOFO LETTER K
-312B ; [.17AF.0020.0002.312B] # BOPOMOFO LETTER NG
-31AD ; [.17B0.0020.0002.31AD] # BOPOMOFO LETTER NGG
-310F ; [.17B1.0020.0002.310F] # BOPOMOFO LETTER H
-3110 ; [.17B2.0020.0002.3110] # BOPOMOFO LETTER J
-3111 ; [.17B3.0020.0002.3111] # BOPOMOFO LETTER Q
-3112 ; [.17B4.0020.0002.3112] # BOPOMOFO LETTER X
-312C ; [.17B5.0020.0002.312C] # BOPOMOFO LETTER GN
-3113 ; [.17B6.0020.0002.3113] # BOPOMOFO LETTER ZH
-3114 ; [.17B7.0020.0002.3114] # BOPOMOFO LETTER CH
-3115 ; [.17B8.0020.0002.3115] # BOPOMOFO LETTER SH
-3116 ; [.17B9.0020.0002.3116] # BOPOMOFO LETTER R
-3117 ; [.17BA.0020.0002.3117] # BOPOMOFO LETTER Z
-3118 ; [.17BB.0020.0002.3118] # BOPOMOFO LETTER C
-3119 ; [.17BC.0020.0002.3119] # BOPOMOFO LETTER S
-311A ; [.17BD.0020.0002.311A] # BOPOMOFO LETTER A
-311B ; [.17BE.0020.0002.311B] # BOPOMOFO LETTER O
-31A6 ; [.17BF.0020.0002.31A6] # BOPOMOFO LETTER OO
-311C ; [.17C0.0020.0002.311C] # BOPOMOFO LETTER E
-311D ; [.17C1.0020.0002.311D] # BOPOMOFO LETTER EH
-31A4 ; [.17C2.0020.0002.31A4] # BOPOMOFO LETTER EE
-311E ; [.17C3.0020.0002.311E] # BOPOMOFO LETTER AI
-311F ; [.17C4.0020.0002.311F] # BOPOMOFO LETTER EI
-3120 ; [.17C5.0020.0002.3120] # BOPOMOFO LETTER AU
-3121 ; [.17C6.0020.0002.3121] # BOPOMOFO LETTER OU
-3122 ; [.17C7.0020.0002.3122] # BOPOMOFO LETTER AN
-3123 ; [.17C8.0020.0002.3123] # BOPOMOFO LETTER EN
-3124 ; [.17C9.0020.0002.3124] # BOPOMOFO LETTER ANG
-31B2 ; [.17CA.0020.0002.31B2] # BOPOMOFO LETTER ONG
-3125 ; [.17CB.0020.0002.3125] # BOPOMOFO LETTER ENG
-31B0 ; [.17CC.0020.0002.31B0] # BOPOMOFO LETTER AM
-31B1 ; [.17CD.0020.0002.31B1] # BOPOMOFO LETTER OM
-31AC ; [.17CE.0020.0002.31AC] # BOPOMOFO LETTER IM
-3126 ; [.17CF.0020.0002.3126] # BOPOMOFO LETTER ER
-3127 ; [.17D0.0020.0002.3127] # BOPOMOFO LETTER I
-3128 ; [.17D1.0020.0002.3128] # BOPOMOFO LETTER U
-3129 ; [.17D2.0020.0002.3129] # BOPOMOFO LETTER IU
+#### To fetch the original file, access to this:
+#### http://www.unicode.org/reports/tr10/allkeys.txt
+####
+@version 3.1.1
+0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0002 ; [.0000.0000.0000.0000] # [0002] START OF TEXT (in 6429)
+0003 ; [.0000.0000.0000.0000] # [0003] END OF TEXT (in 6429)
+0004 ; [.0000.0000.0000.0000] # [0004] END OF TRANSMISSION (in 6429)
+0005 ; [.0000.0000.0000.0000] # [0005] ENQUIRY (in 6429)
+0006 ; [.0000.0000.0000.0000] # [0006] ACKNOWLEDGE (in 6429)
+0007 ; [.0000.0000.0000.0000] # [0007] BELL (in 6429)
+0008 ; [.0000.0000.0000.0000] # [0008] BACKSPACE (in 6429)
+000E ; [.0000.0000.0000.0000] # [000E] SHIFT OUT (in 6429)
+000F ; [.0000.0000.0000.0000] # [000F] SHIFT IN (in 6429)
+0010 ; [.0000.0000.0000.0000] # [0010] DATA LINK ESCAPE (in 6429)
+0011 ; [.0000.0000.0000.0000] # [0011] DEVICE CONTROL ONE (in 6429)
+0012 ; [.0000.0000.0000.0000] # [0012] DEVICE CONTROL TWO (in 6429)
+0013 ; [.0000.0000.0000.0000] # [0013] DEVICE CONTROL THREE (in 6429)
+0014 ; [.0000.0000.0000.0000] # [0014] DEVICE CONTROL FOUR (in 6429)
+0015 ; [.0000.0000.0000.0000] # [0015] NEGATIVE ACKNOWLEDGE (in 6429)
+0016 ; [.0000.0000.0000.0000] # [0016] SYNCHRONOUS IDLE (in 6429)
+0017 ; [.0000.0000.0000.0000] # [0017] END OF TRANSMISSION BLOCK (in 6429)
+0018 ; [.0000.0000.0000.0000] # [0018] CANCEL (in 6429)
+0019 ; [.0000.0000.0000.0000] # [0019] END OF MEDIUM (in 6429)
+001A ; [.0000.0000.0000.0000] # [001A] SUBSTITUTE (in 6429)
+001B ; [.0000.0000.0000.0000] # [001B] ESCAPE (in 6429)
+001C ; [.0000.0000.0000.0000] # [001C] FILE SEPARATOR (in 6429)
+001D ; [.0000.0000.0000.0000] # [001D] GROUP SEPARATOR (in 6429)
+001E ; [.0000.0000.0000.0000] # [001E] RECORD SEPARATOR (in 6429)
+001F ; [.0000.0000.0000.0000] # [001F] UNIT SEPARATOR (in 6429)
+007F ; [.0000.0000.0000.0000] # [007F] DELETE (in 6429)
+0080 ; [.0000.0000.0000.0000] # [0080] <control>
+0081 ; [.0000.0000.0000.0000] # [0081] <control>
+0082 ; [.0000.0000.0000.0000] # [0082] BREAK PERMITTED HERE (in 6429)
+0083 ; [.0000.0000.0000.0000] # [0083] NO BREAK HERE (in 6429)
+0084 ; [.0000.0000.0000.0000] # [0084] <control>
+0086 ; [.0000.0000.0000.0000] # [0086] START OF SELECTED AREA (in 6429)
+0087 ; [.0000.0000.0000.0000] # [0087] END OF SELECTED AREA (in 6429)
+0088 ; [.0000.0000.0000.0000] # [0088] CHARACTER TABULATION SET (in 6429)
+0089 ; [.0000.0000.0000.0000] # [0089] CHARACTER TABULATION WITH JUSTIFICATION (in 6429)
+008A ; [.0000.0000.0000.0000] # [008A] LINE TABULATION SET (in 6429)
+008B ; [.0000.0000.0000.0000] # [008B] PARTIAL LINE FORWARD (in 6429)
+008C ; [.0000.0000.0000.0000] # [008C] PARTIAL LINE BACKWARD (in 6429)
+008D ; [.0000.0000.0000.0000] # [008D] PARTIAL LINE FEED (in 6429)
+008E ; [.0000.0000.0000.0000] # [008E] SINGLE SHIFT TWO (in 6429)
+008F ; [.0000.0000.0000.0000] # [008F] SINGLE SHIFT THREE (in 6429)
+0090 ; [.0000.0000.0000.0000] # [0090] DEVICE CONTROL STRING (in 6429)
+0091 ; [.0000.0000.0000.0000] # [0091] PRIVATE USE ONE (in 6429)
+0092 ; [.0000.0000.0000.0000] # [0092] PRIVATE USE TWO (in 6429)
+0093 ; [.0000.0000.0000.0000] # [0093] SET TRANSMIT STATE (in 6429)
+0094 ; [.0000.0000.0000.0000] # [0094] CANCEL CHARACTER (in 6429)
+0095 ; [.0000.0000.0000.0000] # [0095] MESSAGE WAITING (in 6429)
+0096 ; [.0000.0000.0000.0000] # [0096] START OF GUARDED AREA (in 6429)
+0097 ; [.0000.0000.0000.0000] # [0097] END OF GUARDED AREA (in 6429)
+0098 ; [.0000.0000.0000.0000] # [0098] START OF STRING (in 6429)
+0099 ; [.0000.0000.0000.0000] # [0099] <control>
+009A ; [.0000.0000.0000.0000] # [009A] SINGLE CHARACTER INTRODUCER (in 6429)
+009B ; [.0000.0000.0000.0000] # [009B] CONTROL SEQUENCE INTRODUCER (in 6429)
+009C ; [.0000.0000.0000.0000] # [009C] STRING TERMINATOR (in 6429)
+009D ; [.0000.0000.0000.0000] # [009D] OPERATING SYSTEM COMMAND (in 6429)
+009E ; [.0000.0000.0000.0000] # [009E] PRIVACY MESSAGE (in 6429)
+009F ; [.0000.0000.0000.0000] # [009F] APPLICATION PROGRAM COMMAND (in 6429)
+200B ; [.0000.0000.0000.0000] # [200B] ZERO WIDTH SPACE
+200C ; [.0000.0000.0000.0000] # [200C] ZERO WIDTH NON-JOINER
+200D ; [.0000.0000.0000.0000] # [200D] ZERO WIDTH JOINER
+200E ; [.0000.0000.0000.0000] # [200E] LEFT-TO-RIGHT MARK
+200F ; [.0000.0000.0000.0000] # [200F] RIGHT-TO-LEFT MARK
+202A ; [.0000.0000.0000.0000] # [202A] LEFT-TO-RIGHT EMBEDDING
+202B ; [.0000.0000.0000.0000] # [202B] RIGHT-TO-LEFT EMBEDDING
+202C ; [.0000.0000.0000.0000] # [202C] POP DIRECTIONAL FORMATTING
+202D ; [.0000.0000.0000.0000] # [202D] LEFT-TO-RIGHT OVERRIDE
+202E ; [.0000.0000.0000.0000] # [202E] RIGHT-TO-LEFT OVERRIDE
+206A ; [.0000.0000.0000.0000] # [206A] INHIBIT SYMMETRIC SWAPPING
+206B ; [.0000.0000.0000.0000] # [206B] ACTIVATE SYMMETRIC SWAPPING
+206C ; [.0000.0000.0000.0000] # [206C] INHIBIT ARABIC FORM SHAPING
+206D ; [.0000.0000.0000.0000] # [206D] ACTIVATE ARABIC FORM SHAPING
+206E ; [.0000.0000.0000.0000] # [206E] NATIONAL DIGIT SHAPES
+206F ; [.0000.0000.0000.0000] # [206F] NOMINAL DIGIT SHAPES
+0009 ; [*0201.0020.0002.0009] # HORIZONTAL TABULATION (in 6429)
+000A ; [*0202.0020.0002.000A] # LINE FEED (in 6429)
+000B ; [*0203.0020.0002.000B] # VERTICAL TABULATION (in 6429)
+000C ; [*0204.0020.0002.000C] # FORM FEED (in 6429)
+000D ; [*0205.0020.0002.000D] # CARRIAGE RETURN (in 6429)
+0020 ; [*0209.0020.0002.0020] # SPACE
+0021 ; [*024B.0020.0002.0021] # EXCLAMATION MARK
+0022 ; [*0270.0020.0002.0022] # QUOTATION MARK
+0023 ; [*02A9.0020.0002.0023] # NUMBER SIGN
+0025 ; [*02AA.0020.0002.0025] # PERCENT SIGN
+0026 ; [*02A7.0020.0002.0026] # AMPERSAND
+0027 ; [*0269.0020.0002.0027] # APOSTROPHE
+0028 ; [*027A.0020.0002.0028] # LEFT PARENTHESIS
+0029 ; [*027B.0020.0002.0029] # RIGHT PARENTHESIS
+002A ; [*02A2.0020.0002.002A] # ASTERISK
+002B ; [*039F.0020.0002.002B] # PLUS SIGN
+002C ; [*022D.0020.0002.002C] # COMMA
+002D ; [*0221.0020.0002.002D] # HYPHEN-MINUS
+002E ; [*0255.0020.0002.002E] # FULL STOP
+002F ; [*02A4.0020.0002.002F] # SOLIDUS
+003A ; [*0237.0020.0002.003A] # COLON
+003B ; [*0235.0020.0002.003B] # SEMICOLON
+003C ; [*03A3.0020.0002.003C] # LESS-THAN SIGN
+003D ; [*03A4.0020.0002.003D] # EQUALS SIGN
+003E ; [*03A5.0020.0002.003E] # GREATER-THAN SIGN
+003F ; [*024E.0020.0002.003F] # QUESTION MARK
+0040 ; [*02A1.0020.0002.0040] # COMMERCIAL AT
+005B ; [*027C.0020.0002.005B] # LEFT SQUARE BRACKET
+005C ; [*02A6.0020.0002.005C] # REVERSE SOLIDUS
+005D ; [*027D.0020.0002.005D] # RIGHT SQUARE BRACKET
+005E ; [*020F.0020.0002.005E] # CIRCUMFLEX ACCENT
+005F ; [*021B.0020.0002.005F] # LOW LINE
+0060 ; [*020C.0020.0002.0060] # GRAVE ACCENT
+007B ; [*027E.0020.0002.007B] # LEFT CURLY BRACKET
+007C ; [*03A7.0020.0002.007C] # VERTICAL LINE
+007D ; [*027F.0020.0002.007D] # RIGHT CURLY BRACKET
+007E ; [*03AA.0020.0002.007E] # TILDE
+0085 ; [*0206.0020.0002.0085] # NEXT LINE (in 6429)
+00A0 ; [*0209.0020.001B.00A0] # NO-BREAK SPACE; QQK
+00A1 ; [*024C.0020.0002.00A1] # INVERTED EXCLAMATION MARK
+00A6 ; [*03A8.0020.0002.00A6] # BROKEN BAR
+00A7 ; [*029C.0020.0002.00A7] # SECTION SIGN
+00A8 ; [*0214.0020.0002.00A8] # DIAERESIS
+00A9 ; [*029F.0020.0002.00A9] # COPYRIGHT SIGN
+00AB ; [*0278.0020.0002.00AB] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC ; [*03A6.0020.0002.00AC] # NOT SIGN
+00AD ; [*0220.0020.0002.00AD] # SOFT HYPHEN
+00AE ; [*02A0.0020.0002.00AE] # REGISTERED SIGN
+00AF ; [*0210.0020.0002.00AF] # MACRON
+00B0 ; [*030A.0020.0002.00B0] # DEGREE SIGN
+00B1 ; [*03A0.0020.0002.00B1] # PLUS-MINUS SIGN
+00B4 ; [*020D.0020.0002.00B4] # ACUTE ACCENT
+00B6 ; [*029D.0020.0002.00B6] # PILCROW SIGN
+00B7 ; [*025F.0020.0002.00B7] # MIDDLE DOT
+00B8 ; [*0219.0020.0002.00B8] # CEDILLA
+00BB ; [*0279.0020.0002.00BB] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BF ; [*024F.0020.0002.00BF] # INVERTED QUESTION MARK
+00D7 ; [*03A2.0020.0002.00D7] # MULTIPLICATION SIGN
+00F7 ; [*03A1.0020.0002.00F7] # DIVISION SIGN
+2000 ; [*0209.0020.0004.2000] # EN QUAD; QQK
+2001 ; [*0209.0020.0004.2001] # EM QUAD; QQK
+2002 ; [*0209.0020.0004.2002] # EN SPACE; QQK
+2003 ; [*0209.0020.0004.2003] # EM SPACE; QQK
+2004 ; [*0209.0020.0004.2004] # THREE-PER-EM SPACE; QQK
+2005 ; [*0209.0020.0004.2005] # FOUR-PER-EM SPACE; QQK
+2006 ; [*0209.0020.0004.2006] # SIX-PER-EM SPACE; QQK
+2007 ; [*0209.0020.001B.2007] # FIGURE SPACE; QQK
+2008 ; [*0209.0020.0004.2008] # PUNCTUATION SPACE; QQK
+2009 ; [*0209.0020.0004.2009] # THIN SPACE; QQK
+200A ; [*0209.0020.0004.200A] # HAIR SPACE; QQK
+2010 ; [*0225.0020.0002.2010] # HYPHEN
+2011 ; [*0225.0020.001B.2011] # NON-BREAKING HYPHEN; QQK
+2012 ; [*0226.0020.0002.2012] # FIGURE DASH
+2013 ; [*0227.0020.0002.2013] # EN DASH
+2014 ; [*0228.0020.0002.2014] # EM DASH
+2015 ; [*0229.0020.0002.2015] # HORIZONTAL BAR
+2016 ; [*03A9.0020.0002.2016] # DOUBLE VERTICAL LINE
+2017 ; [*021C.0020.0002.2017] # DOUBLE LOW LINE
+2018 ; [*026A.0020.0002.2018] # LEFT SINGLE QUOTATION MARK
+2019 ; [*026B.0020.0002.2019] # RIGHT SINGLE QUOTATION MARK
+201A ; [*026C.0020.0002.201A] # SINGLE LOW-9 QUOTATION MARK
+201B ; [*026D.0020.0002.201B] # SINGLE HIGH-REVERSED-9 QUOTATION MARK
+201C ; [*0271.0020.0002.201C] # LEFT DOUBLE QUOTATION MARK
+201D ; [*0272.0020.0002.201D] # RIGHT DOUBLE QUOTATION MARK
+201E ; [*0273.0020.0002.201E] # DOUBLE LOW-9 QUOTATION MARK
+201F ; [*0274.0020.0002.201F] # DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020 ; [*02AE.0020.0002.2020] # DAGGER
+2021 ; [*02AF.0020.0002.2021] # DOUBLE DAGGER
+2022 ; [*02B0.0020.0002.2022] # BULLET
+2023 ; [*02B1.0020.0002.2023] # TRIANGULAR BULLET
+2024 ; [*0255.0020.0004.2024] # ONE DOT LEADER; QQK
+2025 ; [*0255.0020.0004.2025][*0255.0020.0004.2025] # TWO DOT LEADER; QQKN
+2026 ; [*0255.0020.0004.2026][*0255.0020.0004.2026][*0255.0020.001F.2026] # HORIZONTAL ELLIPSIS; QQKN
+2027 ; [*02B2.0020.0002.2027] # HYPHENATION POINT
+2028 ; [*0207.0020.0002.2028] # LINE SEPARATOR
+2029 ; [*0208.0020.0002.2029] # PARAGRAPH SEPARATOR
+202F ; [*0209.0020.001B.202F] # NARROW NO-BREAK SPACE; QQK
+2030 ; [*02AC.0020.0002.2030] # PER MILLE SIGN
+2031 ; [*02AD.0020.0002.2031] # PER TEN THOUSAND SIGN
+2032 ; [*02B6.0020.0002.2032] # PRIME
+2033 ; [*02B6.0020.0004.2033][*02B6.0020.0004.2033] # DOUBLE PRIME; QQKN
+2034 ; [*02B6.0020.0004.2034][*02B6.0020.0004.2034][*02B6.0020.001F.2034] # TRIPLE PRIME; QQKN
+2035 ; [*02B7.0020.0002.2035] # REVERSED PRIME
+2036 ; [*02B7.0020.0004.2036][*02B7.0020.0004.2036] # REVERSED DOUBLE PRIME; QQKN
+2037 ; [*02B7.0020.0004.2037][*02B7.0020.0004.2037][*02B7.0020.001F.2037] # REVERSED TRIPLE PRIME; QQKN
+2038 ; [*02B9.0020.0002.2038] # CARET
+2039 ; [*026E.0020.0002.2039] # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A ; [*026F.0020.0002.203A] # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B ; [*02BA.0020.0002.203B] # REFERENCE MARK
+203C ; [*024B.0020.0004.203C][*024B.0020.0004.203C] # DOUBLE EXCLAMATION MARK; QQKN
+203D ; [*0254.0020.0002.203D] # INTERROBANG
+203E ; [*0211.0020.0002.203E] # OVERLINE
+203F ; [*02BB.0020.0002.203F] # UNDERTIE
+2040 ; [*02BC.0020.0002.2040] # CHARACTER TIE
+2041 ; [*02BD.0020.0002.2041] # CARET INSERTION POINT
+2042 ; [*02BE.0020.0002.2042] # ASTERISM
+2043 ; [*02B3.0020.0002.2043] # HYPHEN BULLET
+2044 ; [*02A5.0020.0002.2044] # FRACTION SLASH
+2045 ; [*0286.0020.0002.2045] # LEFT SQUARE BRACKET WITH QUILL
+2046 ; [*0287.0020.0002.2046] # RIGHT SQUARE BRACKET WITH QUILL
+2048 ; [*024E.0020.0004.2048][*024B.0020.0004.2048] # QUESTION EXCLAMATION MARK; QQKN
+2049 ; [*024B.0020.0004.2049][*024E.0020.0004.2049] # EXCLAMATION QUESTION MARK; QQKN
+204A ; [*02A8.0020.0002.204A] # TIRONIAN SIGN ET
+204B ; [*029E.0020.0002.204B] # REVERSED PILCROW SIGN
+204C ; [*02B4.0020.0002.204C] # BLACK LEFTWARDS BULLET
+204D ; [*02B5.0020.0002.204D] # BLACK RIGHTWARDS BULLET
+309B ; [*021E.0020.0002.309B] # KATAKANA-HIRAGANA VOICED SOUND MARK
+309C ; [*021F.0020.0002.309C] # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30FB ; [*022C.0020.0002.30FB] # KATAKANA MIDDLE DOT
+0332 ; [.0000.0021.0002.0332] # COMBINING LOW LINE
+0313 ; [.0000.0022.0002.0313] # COMBINING COMMA ABOVE
+0343 ; [.0000.0022.0002.0343] # COMBINING GREEK KORONIS; QQC
+0314 ; [.0000.002A.0002.0314] # COMBINING REVERSED COMMA ABOVE
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0341 ; [.0000.0032.0002.0341] # COMBINING ACUTE TONE MARK; QQC
+0300 ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
+0340 ; [.0000.0035.0002.0340] # COMBINING GRAVE TONE MARK; QQC
+0306 ; [.0000.0037.0002.0306] # COMBINING BREVE
+0302 ; [.0000.003C.0002.0302] # COMBINING CIRCUMFLEX ACCENT
+030C ; [.0000.0041.0002.030C] # COMBINING CARON
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE
+0342 ; [.0000.0045.0002.0342] # COMBINING GREEK PERISPOMENI
+0308 ; [.0000.0047.0002.0308] # COMBINING DIAERESIS
+0344 ; [.0000.0047.0002.0308][.0000.0032.0002.0301] # COMBINING GREEK DIALYTIKA TONOS; QQCM
+030B ; [.0000.004D.0002.030B] # COMBINING DOUBLE ACUTE ACCENT
+0303 ; [.0000.004E.0002.0303] # COMBINING TILDE
+0307 ; [.0000.0052.0002.0307] # COMBINING DOT ABOVE
+0338 ; [.0000.0054.0002.0338] # COMBINING LONG SOLIDUS OVERLAY
+0327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA
+0328 ; [.0000.0058.0002.0328] # COMBINING OGONEK
+0304 ; [.0000.005A.0002.0304] # COMBINING MACRON
+0305 ; [.0000.005E.0002.0305] # COMBINING OVERLINE
+0309 ; [.0000.005F.0002.0309] # COMBINING HOOK ABOVE
+030D ; [.0000.0060.0002.030D] # COMBINING VERTICAL LINE ABOVE
+030E ; [.0000.0061.0002.030E] # COMBINING DOUBLE VERTICAL LINE ABOVE
+030F ; [.0000.0062.0002.030F] # COMBINING DOUBLE GRAVE ACCENT
+0310 ; [.0000.0063.0002.0310] # COMBINING CANDRABINDU
+0311 ; [.0000.0064.0002.0311] # COMBINING INVERTED BREVE
+0312 ; [.0000.0065.0002.0312] # COMBINING TURNED COMMA ABOVE
+0315 ; [.0000.0066.0002.0315] # COMBINING COMMA ABOVE RIGHT
+0316 ; [.0000.0067.0002.0316] # COMBINING GRAVE ACCENT BELOW
+0317 ; [.0000.0068.0002.0317] # COMBINING ACUTE ACCENT BELOW
+0318 ; [.0000.0069.0002.0318] # COMBINING LEFT TACK BELOW
+0319 ; [.0000.006A.0002.0319] # COMBINING RIGHT TACK BELOW
+031A ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE
+031B ; [.0000.006C.0002.031B] # COMBINING HORN
+031C ; [.0000.0072.0002.031C] # COMBINING LEFT HALF RING BELOW
+031D ; [.0000.0073.0002.031D] # COMBINING UP TACK BELOW
+031E ; [.0000.0074.0002.031E] # COMBINING DOWN TACK BELOW
+031F ; [.0000.0075.0002.031F] # COMBINING PLUS SIGN BELOW
+0320 ; [.0000.0076.0002.0320] # COMBINING MINUS SIGN BELOW
+0321 ; [.0000.0077.0002.0321] # COMBINING PALATALIZED HOOK BELOW
+0322 ; [.0000.0078.0002.0322] # COMBINING RETROFLEX HOOK BELOW
+0323 ; [.0000.0079.0002.0323] # COMBINING DOT BELOW
+0324 ; [.0000.007E.0002.0324] # COMBINING DIAERESIS BELOW
+0325 ; [.0000.007F.0002.0325] # COMBINING RING BELOW
+0326 ; [.0000.0080.0002.0326] # COMBINING COMMA BELOW
+0329 ; [.0000.0081.0002.0329] # COMBINING VERTICAL LINE BELOW
+032A ; [.0000.0082.0002.032A] # COMBINING BRIDGE BELOW
+032B ; [.0000.0083.0002.032B] # COMBINING INVERTED DOUBLE ARCH BELOW
+032C ; [.0000.0084.0002.032C] # COMBINING CARON BELOW
+032D ; [.0000.0085.0002.032D] # COMBINING CIRCUMFLEX ACCENT BELOW
+032E ; [.0000.0086.0002.032E] # COMBINING BREVE BELOW
+032F ; [.0000.0087.0002.032F] # COMBINING INVERTED BREVE BELOW
+0330 ; [.0000.0088.0002.0330] # COMBINING TILDE BELOW
+0331 ; [.0000.0089.0002.0331] # COMBINING MACRON BELOW
+0333 ; [.0000.008A.0002.0333] # COMBINING DOUBLE LOW LINE
+0334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
+0335 ; [.0000.008C.0002.0335] # COMBINING SHORT STROKE OVERLAY
+0336 ; [.0000.008D.0002.0336] # COMBINING LONG STROKE OVERLAY
+0337 ; [.0000.008E.0002.0337] # COMBINING SHORT SOLIDUS OVERLAY
+0339 ; [.0000.008F.0002.0339] # COMBINING RIGHT HALF RING BELOW
+033A ; [.0000.0090.0002.033A] # COMBINING INVERTED BRIDGE BELOW
+033B ; [.0000.0091.0002.033B] # COMBINING SQUARE BELOW
+033C ; [.0000.0092.0002.033C] # COMBINING SEAGULL BELOW
+033D ; [.0000.0093.0002.033D] # COMBINING X ABOVE
+033E ; [.0000.0094.0002.033E] # COMBINING VERTICAL TILDE
+033F ; [.0000.0095.0002.033F] # COMBINING DOUBLE OVERLINE
+0345 ; [.0000.0096.0002.0345] # COMBINING GREEK YPOGEGRAMMENI
+0346 ; [.0000.0097.0002.0346] # COMBINING BRIDGE ABOVE
+0347 ; [.0000.0098.0002.0347] # COMBINING EQUALS SIGN BELOW
+0348 ; [.0000.0099.0002.0348] # COMBINING DOUBLE VERTICAL LINE BELOW
+0349 ; [.0000.009A.0002.0349] # COMBINING LEFT ANGLE BELOW
+034A ; [.0000.009B.0002.034A] # COMBINING NOT TILDE ABOVE
+034B ; [.0000.009C.0002.034B] # COMBINING HOMOTHETIC ABOVE
+034C ; [.0000.009D.0002.034C] # COMBINING ALMOST EQUAL TO ABOVE
+034D ; [.0000.009E.0002.034D] # COMBINING LEFT RIGHT ARROW BELOW
+034E ; [.0000.009F.0002.034E] # COMBINING UPWARDS ARROW BELOW
+0360 ; [.0000.00A0.0002.0360] # COMBINING DOUBLE TILDE
+0361 ; [.0000.00A1.0002.0361] # COMBINING DOUBLE INVERTED BREVE
+0362 ; [.0000.00A2.0002.0362] # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+3099 ; [.0000.013D.0002.3099] # COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+309A ; [.0000.013E.0002.309A] # COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+309D ; [.09DB.0020.0002.309D] # HIRAGANA ITERATION MARK
+309E ; [.09DB.0020.0002.309D][.0000.013D.0002.3099] # HIRAGANA VOICED ITERATION MARK; QQCM
+30FC ; [.09DC.0020.0002.30FC] # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FD ; [.09DD.0020.0002.30FD] # KATAKANA ITERATION MARK
+30FE ; [.09DD.0020.0002.30FD][.0000.013D.0002.3099] # KATAKANA VOICED ITERATION MARK; QQCM
+00A4 ; [.09DE.0020.0002.00A4] # CURRENCY SIGN
+00A2 ; [.09DF.0020.0002.00A2] # CENT SIGN
+0024 ; [.09E0.0020.0002.0024] # DOLLAR SIGN
+00A3 ; [.09E1.0020.0002.00A3] # POUND SIGN
+00A5 ; [.09E2.0020.0002.00A5] # YEN SIGN
+0030 ; [.0A0B.0020.0002.0030] # DIGIT ZERO
+0031 ; [.0A0C.0020.0002.0031] # DIGIT ONE
+00B9 ; [.0A0C.0020.0014.00B9] # SUPERSCRIPT ONE; QQK
+00BD ; [.0A0C.0020.001E.00BD][*02A5.0020.001E.00BD][.0A0D.0020.001F.00BD] # VULGAR FRACTION ONE HALF; QQKN
+00BC ; [.0A0C.0020.001E.00BC][*02A5.0020.001E.00BC][.0A0F.0020.001F.00BC] # VULGAR FRACTION ONE QUARTER; QQKN
+0032 ; [.0A0D.0020.0002.0032] # DIGIT TWO
+00B2 ; [.0A0D.0020.0014.00B2] # SUPERSCRIPT TWO; QQK
+0033 ; [.0A0E.0020.0002.0033] # DIGIT THREE
+00B3 ; [.0A0E.0020.0014.00B3] # SUPERSCRIPT THREE; QQK
+00BE ; [.0A0E.0020.001E.00BE][*02A5.0020.001E.00BE][.0A0F.0020.001F.00BE] # VULGAR FRACTION THREE QUARTERS; QQKN
+0034 ; [.0A0F.0020.0002.0034] # DIGIT FOUR
+0035 ; [.0A10.0020.0002.0035] # DIGIT FIVE
+0036 ; [.0A11.0020.0002.0036] # DIGIT SIX
+0037 ; [.0A12.0020.0002.0037] # DIGIT SEVEN
+0038 ; [.0A13.0020.0002.0038] # DIGIT EIGHT
+0039 ; [.0A14.0020.0002.0039] # DIGIT NINE
+0061 ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
+0041 ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
+00AA ; [.0A15.0020.0014.00AA] # FEMININE ORDINAL INDICATOR; QQK
+00E1 ; [.0A15.0020.0002.0061][.0000.0032.0002.0301] # LATIN SMALL LETTER A WITH ACUTE; QQCM
+00C1 ; [.0A15.0020.0008.0041][.0000.0032.0002.0301] # LATIN CAPITAL LETTER A WITH ACUTE; QQCM
+00E0 ; [.0A15.0020.0002.0061][.0000.0035.0002.0300] # LATIN SMALL LETTER A WITH GRAVE; QQCM
+00C0 ; [.0A15.0020.0008.0041][.0000.0035.0002.0300] # LATIN CAPITAL LETTER A WITH GRAVE; QQCM
+00E2 ; [.0A15.0020.0002.0061][.0000.003C.0002.0302] # LATIN SMALL LETTER A WITH CIRCUMFLEX; QQCM
+00C2 ; [.0A15.0020.0008.0041][.0000.003C.0002.0302] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX; QQCM
+00E5 ; [.0A15.0020.0002.0061][.0000.0043.0002.030A] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.0A15.0020.0008.0041][.0000.0043.0002.030A] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+00E4 ; [.0A15.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; QQCM
+00C4 ; [.0A15.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
+00E3 ; [.0A15.0020.0002.0061][.0000.004E.0002.0303] # LATIN SMALL LETTER A WITH TILDE; QQCM
+00C3 ; [.0A15.0020.0008.0041][.0000.004E.0002.0303] # LATIN CAPITAL LETTER A WITH TILDE; QQCM
+00E6 ; [.0A19.0020.0002.00E6] # LATIN SMALL LETTER AE
+00C6 ; [.0A19.0020.0008.00C6] # LATIN CAPITAL LETTER AE
+0062 ; [.0A29.0020.0002.0062] # LATIN SMALL LETTER B
+0042 ; [.0A29.0020.0008.0042] # LATIN CAPITAL LETTER B
+0063 ; [.0A3D.0020.0002.0063] # LATIN SMALL LETTER C
+0043 ; [.0A3D.0020.0008.0043] # LATIN CAPITAL LETTER C
+00E7 ; [.0A3D.0020.0002.0063][.0000.0055.0002.0327] # LATIN SMALL LETTER C WITH CEDILLA; QQCM
+00C7 ; [.0A3D.0020.0008.0043][.0000.0055.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
+0064 ; [.0A49.0020.0002.0064] # LATIN SMALL LETTER D
+0044 ; [.0A49.0020.0008.0044] # LATIN CAPITAL LETTER D
+00F0 ; [.0A5D.0020.0002.00F0] # LATIN SMALL LETTER ETH
+00D0 ; [.0A5D.0020.0008.00D0] # LATIN CAPITAL LETTER ETH
+0065 ; [.0A65.0020.0002.0065] # LATIN SMALL LETTER E
+0045 ; [.0A65.0020.0008.0045] # LATIN CAPITAL LETTER E
+00E9 ; [.0A65.0020.0002.0065][.0000.0032.0002.0301] # LATIN SMALL LETTER E WITH ACUTE; QQCM
+00C9 ; [.0A65.0020.0008.0045][.0000.0032.0002.0301] # LATIN CAPITAL LETTER E WITH ACUTE; QQCM
+00E8 ; [.0A65.0020.0002.0065][.0000.0035.0002.0300] # LATIN SMALL LETTER E WITH GRAVE; QQCM
+00C8 ; [.0A65.0020.0008.0045][.0000.0035.0002.0300] # LATIN CAPITAL LETTER E WITH GRAVE; QQCM
+00EA ; [.0A65.0020.0002.0065][.0000.003C.0002.0302] # LATIN SMALL LETTER E WITH CIRCUMFLEX; QQCM
+00CA ; [.0A65.0020.0008.0045][.0000.003C.0002.0302] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX; QQCM
+00EB ; [.0A65.0020.0002.0065][.0000.0047.0002.0308] # LATIN SMALL LETTER E WITH DIAERESIS; QQCM
+00CB ; [.0A65.0020.0008.0045][.0000.0047.0002.0308] # LATIN CAPITAL LETTER E WITH DIAERESIS; QQCM
+0066 ; [.0A91.0020.0002.0066] # LATIN SMALL LETTER F
+0046 ; [.0A91.0020.0008.0046] # LATIN CAPITAL LETTER F
+0067 ; [.0A99.0020.0002.0067] # LATIN SMALL LETTER G
+0047 ; [.0A99.0020.0008.0047] # LATIN CAPITAL LETTER G
+0068 ; [.0AB9.0020.0002.0068] # LATIN SMALL LETTER H
+0048 ; [.0AB9.0020.0008.0048] # LATIN CAPITAL LETTER H
+0069 ; [.0AD3.0020.0002.0069] # LATIN SMALL LETTER I
+0049 ; [.0AD3.0020.0008.0049] # LATIN CAPITAL LETTER I
+00ED ; [.0AD3.0020.0002.0069][.0000.0032.0002.0301] # LATIN SMALL LETTER I WITH ACUTE; QQCM
+00CD ; [.0AD3.0020.0008.0049][.0000.0032.0002.0301] # LATIN CAPITAL LETTER I WITH ACUTE; QQCM
+00EC ; [.0AD3.0020.0002.0069][.0000.0035.0002.0300] # LATIN SMALL LETTER I WITH GRAVE; QQCM
+00CC ; [.0AD3.0020.0008.0049][.0000.0035.0002.0300] # LATIN CAPITAL LETTER I WITH GRAVE; QQCM
+00EE ; [.0AD3.0020.0002.0069][.0000.003C.0002.0302] # LATIN SMALL LETTER I WITH CIRCUMFLEX; QQCM
+00CE ; [.0AD3.0020.0008.0049][.0000.003C.0002.0302] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX; QQCM
+00EF ; [.0AD3.0020.0002.0069][.0000.0047.0002.0308] # LATIN SMALL LETTER I WITH DIAERESIS; QQCM
+00CF ; [.0AD3.0020.0008.0049][.0000.0047.0002.0308] # LATIN CAPITAL LETTER I WITH DIAERESIS; QQCM
+006A ; [.0AE7.0020.0002.006A] # LATIN SMALL LETTER J
+004A ; [.0AE7.0020.0008.004A] # LATIN CAPITAL LETTER J
+006B ; [.0AF7.0020.0002.006B] # LATIN SMALL LETTER K
+004B ; [.0AF7.0020.0008.004B] # LATIN CAPITAL LETTER K
+006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L
+004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L
+006D ; [.0B2B.0020.0002.006D] # LATIN SMALL LETTER M
+004D ; [.0B2B.0020.0008.004D] # LATIN CAPITAL LETTER M
+006E ; [.0B33.0020.0002.006E] # LATIN SMALL LETTER N
+004E ; [.0B33.0020.0008.004E] # LATIN CAPITAL LETTER N
+00F1 ; [.0B33.0020.0002.006E][.0000.004E.0002.0303] # LATIN SMALL LETTER N WITH TILDE; QQCM
+00D1 ; [.0B33.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
+006F ; [.0B4B.0020.0002.006F] # LATIN SMALL LETTER O
+004F ; [.0B4B.0020.0008.004F] # LATIN CAPITAL LETTER O
+00BA ; [.0B4B.0020.0014.00BA] # MASCULINE ORDINAL INDICATOR; QQK
+00F3 ; [.0B4B.0020.0002.006F][.0000.0032.0002.0301] # LATIN SMALL LETTER O WITH ACUTE; QQCM
+00D3 ; [.0B4B.0020.0008.004F][.0000.0032.0002.0301] # LATIN CAPITAL LETTER O WITH ACUTE; QQCM
+00F2 ; [.0B4B.0020.0002.006F][.0000.0035.0002.0300] # LATIN SMALL LETTER O WITH GRAVE; QQCM
+00D2 ; [.0B4B.0020.0008.004F][.0000.0035.0002.0300] # LATIN CAPITAL LETTER O WITH GRAVE; QQCM
+00F4 ; [.0B4B.0020.0002.006F][.0000.003C.0002.0302] # LATIN SMALL LETTER O WITH CIRCUMFLEX; QQCM
+00D4 ; [.0B4B.0020.0008.004F][.0000.003C.0002.0302] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX; QQCM
+00F6 ; [.0B4B.0020.0002.006F][.0000.0047.0002.0308] # LATIN SMALL LETTER O WITH DIAERESIS; QQCM
+00D6 ; [.0B4B.0020.0008.004F][.0000.0047.0002.0308] # LATIN CAPITAL LETTER O WITH DIAERESIS; QQCM
+00F5 ; [.0B4B.0020.0002.006F][.0000.004E.0002.0303] # LATIN SMALL LETTER O WITH TILDE; QQCM
+00D5 ; [.0B4B.0020.0008.004F][.0000.004E.0002.0303] # LATIN CAPITAL LETTER O WITH TILDE; QQCM
+00F8 ; [.0B53.0020.0002.00F8] # LATIN SMALL LETTER O WITH STROKE
+00D8 ; [.0B53.0020.0008.00D8] # LATIN CAPITAL LETTER O WITH STROKE
+0070 ; [.0B67.0020.0002.0070] # LATIN SMALL LETTER P
+0050 ; [.0B67.0020.0008.0050] # LATIN CAPITAL LETTER P
+0071 ; [.0B73.0020.0002.0071] # LATIN SMALL LETTER Q
+0051 ; [.0B73.0020.0008.0051] # LATIN CAPITAL LETTER Q
+0072 ; [.0B7F.0020.0002.0072] # LATIN SMALL LETTER R
+0052 ; [.0B7F.0020.0008.0052] # LATIN CAPITAL LETTER R
+0073 ; [.0BA7.0020.0002.0073] # LATIN SMALL LETTER S
+0053 ; [.0BA7.0020.0008.0053] # LATIN CAPITAL LETTER S
+00DF ; [.0BA7.0020.0004.00DF][.0000.0153.0004.00DF][.0BA7.0020.001F.00DF] # LATIN SMALL LETTER SHARP S; QQKN
+0074 ; [.0BBF.0020.0002.0074] # LATIN SMALL LETTER T
+0054 ; [.0BBF.0020.0008.0054] # LATIN CAPITAL LETTER T
+0075 ; [.0BD7.0020.0002.0075] # LATIN SMALL LETTER U
+0055 ; [.0BD7.0020.0008.0055] # LATIN CAPITAL LETTER U
+00FA ; [.0BD7.0020.0002.0075][.0000.0032.0002.0301] # LATIN SMALL LETTER U WITH ACUTE; QQCM
+00DA ; [.0BD7.0020.0008.0055][.0000.0032.0002.0301] # LATIN CAPITAL LETTER U WITH ACUTE; QQCM
+00F9 ; [.0BD7.0020.0002.0075][.0000.0035.0002.0300] # LATIN SMALL LETTER U WITH GRAVE; QQCM
+00D9 ; [.0BD7.0020.0008.0055][.0000.0035.0002.0300] # LATIN CAPITAL LETTER U WITH GRAVE; QQCM
+00FB ; [.0BD7.0020.0002.0075][.0000.003C.0002.0302] # LATIN SMALL LETTER U WITH CIRCUMFLEX; QQCM
+00DB ; [.0BD7.0020.0008.0055][.0000.003C.0002.0302] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX; QQCM
+00FC ; [.0BD7.0020.0002.0075][.0000.0047.0002.0308] # LATIN SMALL LETTER U WITH DIAERESIS; QQCM
+00DC ; [.0BD7.0020.0008.0055][.0000.0047.0002.0308] # LATIN CAPITAL LETTER U WITH DIAERESIS; QQCM
+0076 ; [.0BEF.0020.0002.0076] # LATIN SMALL LETTER V
+0056 ; [.0BEF.0020.0008.0056] # LATIN CAPITAL LETTER V
+0077 ; [.0BFB.0020.0002.0077] # LATIN SMALL LETTER W
+0057 ; [.0BFB.0020.0008.0057] # LATIN CAPITAL LETTER W
+0078 ; [.0C03.0020.0002.0078] # LATIN SMALL LETTER X
+0058 ; [.0C03.0020.0008.0058] # LATIN CAPITAL LETTER X
+0079 ; [.0C07.0020.0002.0079] # LATIN SMALL LETTER Y
+0059 ; [.0C07.0020.0008.0059] # LATIN CAPITAL LETTER Y
+00FD ; [.0C07.0020.0002.0079][.0000.0032.0002.0301] # LATIN SMALL LETTER Y WITH ACUTE; QQCM
+00DD ; [.0C07.0020.0008.0059][.0000.0032.0002.0301] # LATIN CAPITAL LETTER Y WITH ACUTE; QQCM
+00FF ; [.0C07.0020.0002.0079][.0000.0047.0002.0308] # LATIN SMALL LETTER Y WITH DIAERESIS; QQCM
+007A ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
+005A ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
+00FE ; [.0C3B.0020.0002.00FE] # LATIN SMALL LETTER THORN
+00DE ; [.0C3B.0020.0008.00DE] # LATIN CAPITAL LETTER THORN
+00B5 ; [.0C9F.0020.0004.00B5] # MICRO SIGN; QQK
+1100 ; [.1831.0020.0002.1100] # HANGUL CHOSEONG KIYEOK
+1101 ; [.1832.0020.0002.1101] # HANGUL CHOSEONG SSANGKIYEOK
+1102 ; [.1833.0020.0002.1102] # HANGUL CHOSEONG NIEUN
+1103 ; [.1834.0020.0002.1103] # HANGUL CHOSEONG TIKEUT
+1104 ; [.1835.0020.0002.1104] # HANGUL CHOSEONG SSANGTIKEUT
+1105 ; [.1836.0020.0002.1105] # HANGUL CHOSEONG RIEUL
+1106 ; [.1837.0020.0002.1106] # HANGUL CHOSEONG MIEUM
+1107 ; [.1838.0020.0002.1107] # HANGUL CHOSEONG PIEUP
+1108 ; [.1839.0020.0002.1108] # HANGUL CHOSEONG SSANGPIEUP
+1109 ; [.183A.0020.0002.1109] # HANGUL CHOSEONG SIOS
+110A ; [.183B.0020.0002.110A] # HANGUL CHOSEONG SSANGSIOS
+110B ; [.183C.0020.0002.110B] # HANGUL CHOSEONG IEUNG
+110C ; [.183D.0020.0002.110C] # HANGUL CHOSEONG CIEUC
+110D ; [.183E.0020.0002.110D] # HANGUL CHOSEONG SSANGCIEUC
+110E ; [.183F.0020.0002.110E] # HANGUL CHOSEONG CHIEUCH
+110F ; [.1840.0020.0002.110F] # HANGUL CHOSEONG KHIEUKH
+1110 ; [.1841.0020.0002.1110] # HANGUL CHOSEONG THIEUTH
+1111 ; [.1842.0020.0002.1111] # HANGUL CHOSEONG PHIEUPH
+1112 ; [.1843.0020.0002.1112] # HANGUL CHOSEONG HIEUH
+1113 ; [.1844.0020.0002.1113] # HANGUL CHOSEONG NIEUN-KIYEOK
+1114 ; [.1845.0020.0002.1114] # HANGUL CHOSEONG SSANGNIEUN
+1115 ; [.1846.0020.0002.1115] # HANGUL CHOSEONG NIEUN-TIKEUT
+1116 ; [.1847.0020.0002.1116] # HANGUL CHOSEONG NIEUN-PIEUP
+1117 ; [.1848.0020.0002.1117] # HANGUL CHOSEONG TIKEUT-KIYEOK
+1118 ; [.1849.0020.0002.1118] # HANGUL CHOSEONG RIEUL-NIEUN
+1119 ; [.184A.0020.0002.1119] # HANGUL CHOSEONG SSANGRIEUL
+111A ; [.184B.0020.0002.111A] # HANGUL CHOSEONG RIEUL-HIEUH
+111B ; [.184C.0020.0002.111B] # HANGUL CHOSEONG KAPYEOUNRIEUL
+111C ; [.184D.0020.0002.111C] # HANGUL CHOSEONG MIEUM-PIEUP
+111D ; [.184E.0020.0002.111D] # HANGUL CHOSEONG KAPYEOUNMIEUM
+111E ; [.184F.0020.0002.111E] # HANGUL CHOSEONG PIEUP-KIYEOK
+111F ; [.1850.0020.0002.111F] # HANGUL CHOSEONG PIEUP-NIEUN
+1120 ; [.1851.0020.0002.1120] # HANGUL CHOSEONG PIEUP-TIKEUT
+1121 ; [.1852.0020.0002.1121] # HANGUL CHOSEONG PIEUP-SIOS
+1122 ; [.1853.0020.0002.1122] # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+1123 ; [.1854.0020.0002.1123] # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+1124 ; [.1855.0020.0002.1124] # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+1125 ; [.1856.0020.0002.1125] # HANGUL CHOSEONG PIEUP-SSANGSIOS
+1126 ; [.1857.0020.0002.1126] # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+1127 ; [.1858.0020.0002.1127] # HANGUL CHOSEONG PIEUP-CIEUC
+1128 ; [.1859.0020.0002.1128] # HANGUL CHOSEONG PIEUP-CHIEUCH
+1129 ; [.185A.0020.0002.1129] # HANGUL CHOSEONG PIEUP-THIEUTH
+112A ; [.185B.0020.0002.112A] # HANGUL CHOSEONG PIEUP-PHIEUPH
+112B ; [.185C.0020.0002.112B] # HANGUL CHOSEONG KAPYEOUNPIEUP
+112C ; [.185D.0020.0002.112C] # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+112D ; [.185E.0020.0002.112D] # HANGUL CHOSEONG SIOS-KIYEOK
+112E ; [.185F.0020.0002.112E] # HANGUL CHOSEONG SIOS-NIEUN
+112F ; [.1860.0020.0002.112F] # HANGUL CHOSEONG SIOS-TIKEUT
+1130 ; [.1861.0020.0002.1130] # HANGUL CHOSEONG SIOS-RIEUL
+1131 ; [.1862.0020.0002.1131] # HANGUL CHOSEONG SIOS-MIEUM
+1132 ; [.1863.0020.0002.1132] # HANGUL CHOSEONG SIOS-PIEUP
+1133 ; [.1864.0020.0002.1133] # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+1134 ; [.1865.0020.0002.1134] # HANGUL CHOSEONG SIOS-SSANGSIOS
+1135 ; [.1866.0020.0002.1135] # HANGUL CHOSEONG SIOS-IEUNG
+1136 ; [.1867.0020.0002.1136] # HANGUL CHOSEONG SIOS-CIEUC
+1137 ; [.1868.0020.0002.1137] # HANGUL CHOSEONG SIOS-CHIEUCH
+1138 ; [.1869.0020.0002.1138] # HANGUL CHOSEONG SIOS-KHIEUKH
+1139 ; [.186A.0020.0002.1139] # HANGUL CHOSEONG SIOS-THIEUTH
+113A ; [.186B.0020.0002.113A] # HANGUL CHOSEONG SIOS-PHIEUPH
+113B ; [.186C.0020.0002.113B] # HANGUL CHOSEONG SIOS-HIEUH
+113C ; [.186D.0020.0002.113C] # HANGUL CHOSEONG CHITUEUMSIOS
+113D ; [.186E.0020.0002.113D] # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+113E ; [.186F.0020.0002.113E] # HANGUL CHOSEONG CEONGCHIEUMSIOS
+113F ; [.1870.0020.0002.113F] # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+1140 ; [.1871.0020.0002.1140] # HANGUL CHOSEONG PANSIOS
+1141 ; [.1872.0020.0002.1141] # HANGUL CHOSEONG IEUNG-KIYEOK
+1142 ; [.1873.0020.0002.1142] # HANGUL CHOSEONG IEUNG-TIKEUT
+1143 ; [.1874.0020.0002.1143] # HANGUL CHOSEONG IEUNG-MIEUM
+1144 ; [.1875.0020.0002.1144] # HANGUL CHOSEONG IEUNG-PIEUP
+1145 ; [.1876.0020.0002.1145] # HANGUL CHOSEONG IEUNG-SIOS
+1146 ; [.1877.0020.0002.1146] # HANGUL CHOSEONG IEUNG-PANSIOS
+1147 ; [.1878.0020.0002.1147] # HANGUL CHOSEONG SSANGIEUNG
+1148 ; [.1879.0020.0002.1148] # HANGUL CHOSEONG IEUNG-CIEUC
+1149 ; [.187A.0020.0002.1149] # HANGUL CHOSEONG IEUNG-CHIEUCH
+114A ; [.187B.0020.0002.114A] # HANGUL CHOSEONG IEUNG-THIEUTH
+114B ; [.187C.0020.0002.114B] # HANGUL CHOSEONG IEUNG-PHIEUPH
+114C ; [.187D.0020.0002.114C] # HANGUL CHOSEONG YESIEUNG
+114D ; [.187E.0020.0002.114D] # HANGUL CHOSEONG CIEUC-IEUNG
+114E ; [.187F.0020.0002.114E] # HANGUL CHOSEONG CHITUEUMCIEUC
+114F ; [.1880.0020.0002.114F] # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+1150 ; [.1881.0020.0002.1150] # HANGUL CHOSEONG CEONGCHIEUMCIEUC
+1151 ; [.1882.0020.0002.1151] # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+1152 ; [.1883.0020.0002.1152] # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+1153 ; [.1884.0020.0002.1153] # HANGUL CHOSEONG CHIEUCH-HIEUH
+1154 ; [.1885.0020.0002.1154] # HANGUL CHOSEONG CHITUEUMCHIEUCH
+1155 ; [.1886.0020.0002.1155] # HANGUL CHOSEONG CEONGCHIEUMCHIEUCH
+1156 ; [.1887.0020.0002.1156] # HANGUL CHOSEONG PHIEUPH-PIEUP
+1157 ; [.1888.0020.0002.1157] # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+1158 ; [.1889.0020.0002.1158] # HANGUL CHOSEONG SSANGHIEUH
+1159 ; [.188A.0020.0002.1159] # HANGUL CHOSEONG YEORINHIEUH
+115F ; [.188B.0020.0002.115F] # HANGUL CHOSEONG FILLER
+1160 ; [.188C.0020.0002.1160] # HANGUL JUNGSEONG FILLER
+1161 ; [.188D.0020.0002.1161] # HANGUL JUNGSEONG A
+1162 ; [.188E.0020.0002.1162] # HANGUL JUNGSEONG AE
+1163 ; [.188F.0020.0002.1163] # HANGUL JUNGSEONG YA
+1164 ; [.1890.0020.0002.1164] # HANGUL JUNGSEONG YAE
+1165 ; [.1891.0020.0002.1165] # HANGUL JUNGSEONG EO
+1166 ; [.1892.0020.0002.1166] # HANGUL JUNGSEONG E
+1167 ; [.1893.0020.0002.1167] # HANGUL JUNGSEONG YEO
+1168 ; [.1894.0020.0002.1168] # HANGUL JUNGSEONG YE
+1169 ; [.1895.0020.0002.1169] # HANGUL JUNGSEONG O
+116A ; [.1896.0020.0002.116A] # HANGUL JUNGSEONG WA
+116B ; [.1897.0020.0002.116B] # HANGUL JUNGSEONG WAE
+116C ; [.1898.0020.0002.116C] # HANGUL JUNGSEONG OE
+116D ; [.1899.0020.0002.116D] # HANGUL JUNGSEONG YO
+116E ; [.189A.0020.0002.116E] # HANGUL JUNGSEONG U
+116F ; [.189B.0020.0002.116F] # HANGUL JUNGSEONG WEO
+1170 ; [.189C.0020.0002.1170] # HANGUL JUNGSEONG WE
+1171 ; [.189D.0020.0002.1171] # HANGUL JUNGSEONG WI
+1172 ; [.189E.0020.0002.1172] # HANGUL JUNGSEONG YU
+1173 ; [.189F.0020.0002.1173] # HANGUL JUNGSEONG EU
+1174 ; [.18A0.0020.0002.1174] # HANGUL JUNGSEONG YI
+1175 ; [.18A1.0020.0002.1175] # HANGUL JUNGSEONG I
+1176 ; [.18A2.0020.0002.1176] # HANGUL JUNGSEONG A-O
+1177 ; [.18A3.0020.0002.1177] # HANGUL JUNGSEONG A-U
+1178 ; [.18A4.0020.0002.1178] # HANGUL JUNGSEONG YA-O
+1179 ; [.18A5.0020.0002.1179] # HANGUL JUNGSEONG YA-YO
+117A ; [.18A6.0020.0002.117A] # HANGUL JUNGSEONG EO-O
+117B ; [.18A7.0020.0002.117B] # HANGUL JUNGSEONG EO-U
+117C ; [.18A8.0020.0002.117C] # HANGUL JUNGSEONG EO-EU
+117D ; [.18A9.0020.0002.117D] # HANGUL JUNGSEONG YEO-O
+117E ; [.18AA.0020.0002.117E] # HANGUL JUNGSEONG YEO-U
+117F ; [.18AB.0020.0002.117F] # HANGUL JUNGSEONG O-EO
+1180 ; [.18AC.0020.0002.1180] # HANGUL JUNGSEONG O-E
+1181 ; [.18AD.0020.0002.1181] # HANGUL JUNGSEONG O-YE
+1182 ; [.18AE.0020.0002.1182] # HANGUL JUNGSEONG O-O
+1183 ; [.18AF.0020.0002.1183] # HANGUL JUNGSEONG O-U
+1184 ; [.18B0.0020.0002.1184] # HANGUL JUNGSEONG YO-YA
+1185 ; [.18B1.0020.0002.1185] # HANGUL JUNGSEONG YO-YAE
+1186 ; [.18B2.0020.0002.1186] # HANGUL JUNGSEONG YO-YEO
+1187 ; [.18B3.0020.0002.1187] # HANGUL JUNGSEONG YO-O
+1188 ; [.18B4.0020.0002.1188] # HANGUL JUNGSEONG YO-I
+1189 ; [.18B5.0020.0002.1189] # HANGUL JUNGSEONG U-A
+118A ; [.18B6.0020.0002.118A] # HANGUL JUNGSEONG U-AE
+118B ; [.18B7.0020.0002.118B] # HANGUL JUNGSEONG U-EO-EU
+118C ; [.18B8.0020.0002.118C] # HANGUL JUNGSEONG U-YE
+118D ; [.18B9.0020.0002.118D] # HANGUL JUNGSEONG U-U
+118E ; [.18BA.0020.0002.118E] # HANGUL JUNGSEONG YU-A
+118F ; [.18BB.0020.0002.118F] # HANGUL JUNGSEONG YU-EO
+1190 ; [.18BC.0020.0002.1190] # HANGUL JUNGSEONG YU-E
+1191 ; [.18BD.0020.0002.1191] # HANGUL JUNGSEONG YU-YEO
+1192 ; [.18BE.0020.0002.1192] # HANGUL JUNGSEONG YU-YE
+1193 ; [.18BF.0020.0002.1193] # HANGUL JUNGSEONG YU-U
+1194 ; [.18C0.0020.0002.1194] # HANGUL JUNGSEONG YU-I
+1195 ; [.18C1.0020.0002.1195] # HANGUL JUNGSEONG EU-U
+1196 ; [.18C2.0020.0002.1196] # HANGUL JUNGSEONG EU-EU
+1197 ; [.18C3.0020.0002.1197] # HANGUL JUNGSEONG YI-U
+1198 ; [.18C4.0020.0002.1198] # HANGUL JUNGSEONG I-A
+1199 ; [.18C5.0020.0002.1199] # HANGUL JUNGSEONG I-YA
+119A ; [.18C6.0020.0002.119A] # HANGUL JUNGSEONG I-O
+119B ; [.18C7.0020.0002.119B] # HANGUL JUNGSEONG I-U
+119C ; [.18C8.0020.0002.119C] # HANGUL JUNGSEONG I-EU
+119D ; [.18C9.0020.0002.119D] # HANGUL JUNGSEONG I-ARAEA
+119E ; [.18CA.0020.0002.119E] # HANGUL JUNGSEONG ARAEA
+119F ; [.18CB.0020.0002.119F] # HANGUL JUNGSEONG ARAEA-EO
+11A0 ; [.18CC.0020.0002.11A0] # HANGUL JUNGSEONG ARAEA-U
+11A1 ; [.18CD.0020.0002.11A1] # HANGUL JUNGSEONG ARAEA-I
+11A2 ; [.18CE.0020.0002.11A2] # HANGUL JUNGSEONG SSANGARAEA
+11A8 ; [.18CF.0020.0002.11A8] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.18D0.0020.0002.11A9] # HANGUL JONGSEONG SSANGKIYEOK
+11AA ; [.18D1.0020.0002.11AA] # HANGUL JONGSEONG KIYEOK-SIOS
+11AB ; [.18D2.0020.0002.11AB] # HANGUL JONGSEONG NIEUN
+11AC ; [.18D3.0020.0002.11AC] # HANGUL JONGSEONG NIEUN-CIEUC
+11AD ; [.18D4.0020.0002.11AD] # HANGUL JONGSEONG NIEUN-HIEUH
+11AE ; [.18D5.0020.0002.11AE] # HANGUL JONGSEONG TIKEUT
+11AF ; [.18D6.0020.0002.11AF] # HANGUL JONGSEONG RIEUL
+11B0 ; [.18D7.0020.0002.11B0] # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1 ; [.18D8.0020.0002.11B1] # HANGUL JONGSEONG RIEUL-MIEUM
+11B2 ; [.18D9.0020.0002.11B2] # HANGUL JONGSEONG RIEUL-PIEUP
+11B3 ; [.18DA.0020.0002.11B3] # HANGUL JONGSEONG RIEUL-SIOS
+11B4 ; [.18DB.0020.0002.11B4] # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5 ; [.18DC.0020.0002.11B5] # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6 ; [.18DD.0020.0002.11B6] # HANGUL JONGSEONG RIEUL-HIEUH
+11B7 ; [.18DE.0020.0002.11B7] # HANGUL JONGSEONG MIEUM
+11B8 ; [.18DF.0020.0002.11B8] # HANGUL JONGSEONG PIEUP
+11B9 ; [.18E0.0020.0002.11B9] # HANGUL JONGSEONG PIEUP-SIOS
+11BA ; [.18E1.0020.0002.11BA] # HANGUL JONGSEONG SIOS
+11BB ; [.18E2.0020.0002.11BB] # HANGUL JONGSEONG SSANGSIOS
+11BC ; [.18E3.0020.0002.11BC] # HANGUL JONGSEONG IEUNG
+11BD ; [.18E4.0020.0002.11BD] # HANGUL JONGSEONG CIEUC
+11BE ; [.18E5.0020.0002.11BE] # HANGUL JONGSEONG CHIEUCH
+11BF ; [.18E6.0020.0002.11BF] # HANGUL JONGSEONG KHIEUKH
+11C0 ; [.18E7.0020.0002.11C0] # HANGUL JONGSEONG THIEUTH
+11C1 ; [.18E8.0020.0002.11C1] # HANGUL JONGSEONG PHIEUPH
+11C2 ; [.18E9.0020.0002.11C2] # HANGUL JONGSEONG HIEUH
+11C3 ; [.18EA.0020.0002.11C3] # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4 ; [.18EB.0020.0002.11C4] # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5 ; [.18EC.0020.0002.11C5] # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6 ; [.18ED.0020.0002.11C6] # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7 ; [.18EE.0020.0002.11C7] # HANGUL JONGSEONG NIEUN-SIOS
+11C8 ; [.18EF.0020.0002.11C8] # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9 ; [.18F0.0020.0002.11C9] # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA ; [.18F1.0020.0002.11CA] # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB ; [.18F2.0020.0002.11CB] # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC ; [.18F3.0020.0002.11CC] # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD ; [.18F4.0020.0002.11CD] # HANGUL JONGSEONG RIEUL-NIEUN
+11CE ; [.18F5.0020.0002.11CE] # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF ; [.18F6.0020.0002.11CF] # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0 ; [.18F7.0020.0002.11D0] # HANGUL JONGSEONG SSANGRIEUL
+11D1 ; [.18F8.0020.0002.11D1] # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2 ; [.18F9.0020.0002.11D2] # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3 ; [.18FA.0020.0002.11D3] # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4 ; [.18FB.0020.0002.11D4] # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5 ; [.18FC.0020.0002.11D5] # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6 ; [.18FD.0020.0002.11D6] # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7 ; [.18FE.0020.0002.11D7] # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8 ; [.18FF.0020.0002.11D8] # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9 ; [.1900.0020.0002.11D9] # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA ; [.1901.0020.0002.11DA] # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB ; [.1902.0020.0002.11DB] # HANGUL JONGSEONG MIEUM-RIEUL
+11DC ; [.1903.0020.0002.11DC] # HANGUL JONGSEONG MIEUM-PIEUP
+11DD ; [.1904.0020.0002.11DD] # HANGUL JONGSEONG MIEUM-SIOS
+11DE ; [.1905.0020.0002.11DE] # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF ; [.1906.0020.0002.11DF] # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0 ; [.1907.0020.0002.11E0] # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1 ; [.1908.0020.0002.11E1] # HANGUL JONGSEONG MIEUM-HIEUH
+11E2 ; [.1909.0020.0002.11E2] # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3 ; [.190A.0020.0002.11E3] # HANGUL JONGSEONG PIEUP-RIEUL
+11E4 ; [.190B.0020.0002.11E4] # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5 ; [.190C.0020.0002.11E5] # HANGUL JONGSEONG PIEUP-HIEUH
+11E6 ; [.190D.0020.0002.11E6] # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7 ; [.190E.0020.0002.11E7] # HANGUL JONGSEONG SIOS-KIYEOK
+11E8 ; [.190F.0020.0002.11E8] # HANGUL JONGSEONG SIOS-TIKEUT
+11E9 ; [.1910.0020.0002.11E9] # HANGUL JONGSEONG SIOS-RIEUL
+11EA ; [.1911.0020.0002.11EA] # HANGUL JONGSEONG SIOS-PIEUP
+11EB ; [.1912.0020.0002.11EB] # HANGUL JONGSEONG PANSIOS
+11EC ; [.1913.0020.0002.11EC] # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED ; [.1914.0020.0002.11ED] # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE ; [.1915.0020.0002.11EE] # HANGUL JONGSEONG SSANGIEUNG
+11EF ; [.1916.0020.0002.11EF] # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0 ; [.1917.0020.0002.11F0] # HANGUL JONGSEONG YESIEUNG
+11F1 ; [.1918.0020.0002.11F1] # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2 ; [.1919.0020.0002.11F2] # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3 ; [.191A.0020.0002.11F3] # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4 ; [.191B.0020.0002.11F4] # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5 ; [.191C.0020.0002.11F5] # HANGUL JONGSEONG HIEUH-NIEUN
+11F6 ; [.191D.0020.0002.11F6] # HANGUL JONGSEONG HIEUH-RIEUL
+11F7 ; [.191E.0020.0002.11F7] # HANGUL JONGSEONG HIEUH-MIEUM
+11F8 ; [.191F.0020.0002.11F8] # HANGUL JONGSEONG HIEUH-PIEUP
+11F9 ; [.1920.0020.0002.11F9] # HANGUL JONGSEONG YEORINHIEUH
+3041 ; [.1921.0020.000D.3041] # HIRAGANA LETTER SMALL A
+3042 ; [.1921.0020.000E.3042] # HIRAGANA LETTER A
+30A1 ; [.1921.0020.000F.30A1] # KATAKANA LETTER SMALL A
+30A2 ; [.1921.0020.0011.30A2] # KATAKANA LETTER A
+3043 ; [.1922.0020.000D.3043] # HIRAGANA LETTER SMALL I
+3044 ; [.1922.0020.000E.3044] # HIRAGANA LETTER I
+30A3 ; [.1922.0020.000F.30A3] # KATAKANA LETTER SMALL I
+30A4 ; [.1922.0020.0011.30A4] # KATAKANA LETTER I
+3045 ; [.1923.0020.000D.3045] # HIRAGANA LETTER SMALL U
+3046 ; [.1923.0020.000E.3046] # HIRAGANA LETTER U
+30A5 ; [.1923.0020.000F.30A5] # KATAKANA LETTER SMALL U
+30A6 ; [.1923.0020.0011.30A6] # KATAKANA LETTER U
+3094 ; [.1923.0020.000E.3046][.0000.013D.0002.3099] # HIRAGANA LETTER VU; QQCM
+30F4 ; [.1923.0020.0011.30A6][.0000.013D.0002.3099] # KATAKANA LETTER VU; QQCM
+3047 ; [.1924.0020.000D.3047] # HIRAGANA LETTER SMALL E
+3048 ; [.1924.0020.000E.3048] # HIRAGANA LETTER E
+30A7 ; [.1924.0020.000F.30A7] # KATAKANA LETTER SMALL E
+30A8 ; [.1924.0020.0011.30A8] # KATAKANA LETTER E
+3049 ; [.1925.0020.000D.3049] # HIRAGANA LETTER SMALL O
+304A ; [.1925.0020.000E.304A] # HIRAGANA LETTER O
+30A9 ; [.1925.0020.000F.30A9] # KATAKANA LETTER SMALL O
+30AA ; [.1925.0020.0011.30AA] # KATAKANA LETTER O
+304B ; [.1926.0020.000E.304B] # HIRAGANA LETTER KA
+30F5 ; [.1926.0020.000F.30F5] # KATAKANA LETTER SMALL KA
+30AB ; [.1926.0020.0011.30AB] # KATAKANA LETTER KA
+304C ; [.1926.0020.000E.304B][.0000.013D.0002.3099] # HIRAGANA LETTER GA; QQCM
+30AC ; [.1926.0020.0011.30AB][.0000.013D.0002.3099] # KATAKANA LETTER GA; QQCM
+304D ; [.1927.0020.000E.304D] # HIRAGANA LETTER KI
+30AD ; [.1927.0020.0011.30AD] # KATAKANA LETTER KI
+304E ; [.1927.0020.000E.304D][.0000.013D.0002.3099] # HIRAGANA LETTER GI; QQCM
+30AE ; [.1927.0020.0011.30AD][.0000.013D.0002.3099] # KATAKANA LETTER GI; QQCM
+304F ; [.1928.0020.000E.304F] # HIRAGANA LETTER KU
+30AF ; [.1928.0020.0011.30AF] # KATAKANA LETTER KU
+3050 ; [.1928.0020.000E.304F][.0000.013D.0002.3099] # HIRAGANA LETTER GU; QQCM
+30B0 ; [.1928.0020.0011.30AF][.0000.013D.0002.3099] # KATAKANA LETTER GU; QQCM
+3051 ; [.1929.0020.000E.3051] # HIRAGANA LETTER KE
+30F6 ; [.1929.0020.000F.30F6] # KATAKANA LETTER SMALL KE
+30B1 ; [.1929.0020.0011.30B1] # KATAKANA LETTER KE
+3052 ; [.1929.0020.000E.3051][.0000.013D.0002.3099] # HIRAGANA LETTER GE; QQCM
+30B2 ; [.1929.0020.0011.30B1][.0000.013D.0002.3099] # KATAKANA LETTER GE; QQCM
+3053 ; [.192A.0020.000E.3053] # HIRAGANA LETTER KO
+30B3 ; [.192A.0020.0011.30B3] # KATAKANA LETTER KO
+3054 ; [.192A.0020.000E.3053][.0000.013D.0002.3099] # HIRAGANA LETTER GO; QQCM
+30B4 ; [.192A.0020.0011.30B3][.0000.013D.0002.3099] # KATAKANA LETTER GO; QQCM
+3055 ; [.192B.0020.000E.3055] # HIRAGANA LETTER SA
+30B5 ; [.192B.0020.0011.30B5] # KATAKANA LETTER SA
+3056 ; [.192B.0020.000E.3055][.0000.013D.0002.3099] # HIRAGANA LETTER ZA; QQCM
+30B6 ; [.192B.0020.0011.30B5][.0000.013D.0002.3099] # KATAKANA LETTER ZA; QQCM
+3057 ; [.192C.0020.000E.3057] # HIRAGANA LETTER SI
+30B7 ; [.192C.0020.0011.30B7] # KATAKANA LETTER SI
+3058 ; [.192C.0020.000E.3057][.0000.013D.0002.3099] # HIRAGANA LETTER ZI; QQCM
+30B8 ; [.192C.0020.0011.30B7][.0000.013D.0002.3099] # KATAKANA LETTER ZI; QQCM
+3059 ; [.192D.0020.000E.3059] # HIRAGANA LETTER SU
+30B9 ; [.192D.0020.0011.30B9] # KATAKANA LETTER SU
+305A ; [.192D.0020.000E.3059][.0000.013D.0002.3099] # HIRAGANA LETTER ZU; QQCM
+30BA ; [.192D.0020.0011.30B9][.0000.013D.0002.3099] # KATAKANA LETTER ZU; QQCM
+305B ; [.192E.0020.000E.305B] # HIRAGANA LETTER SE
+30BB ; [.192E.0020.0011.30BB] # KATAKANA LETTER SE
+305C ; [.192E.0020.000E.305B][.0000.013D.0002.3099] # HIRAGANA LETTER ZE; QQCM
+30BC ; [.192E.0020.0011.30BB][.0000.013D.0002.3099] # KATAKANA LETTER ZE; QQCM
+305D ; [.192F.0020.000E.305D] # HIRAGANA LETTER SO
+30BD ; [.192F.0020.0011.30BD] # KATAKANA LETTER SO
+305E ; [.192F.0020.000E.305D][.0000.013D.0002.3099] # HIRAGANA LETTER ZO; QQCM
+30BE ; [.192F.0020.0011.30BD][.0000.013D.0002.3099] # KATAKANA LETTER ZO; QQCM
+305F ; [.1930.0020.000E.305F] # HIRAGANA LETTER TA
+30BF ; [.1930.0020.0011.30BF] # KATAKANA LETTER TA
+3060 ; [.1930.0020.000E.305F][.0000.013D.0002.3099] # HIRAGANA LETTER DA; QQCM
+30C0 ; [.1930.0020.0011.30BF][.0000.013D.0002.3099] # KATAKANA LETTER DA; QQCM
+3061 ; [.1931.0020.000E.3061] # HIRAGANA LETTER TI
+30C1 ; [.1931.0020.0011.30C1] # KATAKANA LETTER TI
+3062 ; [.1931.0020.000E.3061][.0000.013D.0002.3099] # HIRAGANA LETTER DI; QQCM
+30C2 ; [.1931.0020.0011.30C1][.0000.013D.0002.3099] # KATAKANA LETTER DI; QQCM
+3063 ; [.1932.0020.000D.3063] # HIRAGANA LETTER SMALL TU
+3064 ; [.1932.0020.000E.3064] # HIRAGANA LETTER TU
+30C3 ; [.1932.0020.000F.30C3] # KATAKANA LETTER SMALL TU
+30C4 ; [.1932.0020.0011.30C4] # KATAKANA LETTER TU
+3065 ; [.1932.0020.000E.3064][.0000.013D.0002.3099] # HIRAGANA LETTER DU; QQCM
+30C5 ; [.1932.0020.0011.30C4][.0000.013D.0002.3099] # KATAKANA LETTER DU; QQCM
+3066 ; [.1933.0020.000E.3066] # HIRAGANA LETTER TE
+30C6 ; [.1933.0020.0011.30C6] # KATAKANA LETTER TE
+3067 ; [.1933.0020.000E.3066][.0000.013D.0002.3099] # HIRAGANA LETTER DE; QQCM
+30C7 ; [.1933.0020.0011.30C6][.0000.013D.0002.3099] # KATAKANA LETTER DE; QQCM
+3068 ; [.1934.0020.000E.3068] # HIRAGANA LETTER TO
+30C8 ; [.1934.0020.0011.30C8] # KATAKANA LETTER TO
+3069 ; [.1934.0020.000E.3068][.0000.013D.0002.3099] # HIRAGANA LETTER DO; QQCM
+30C9 ; [.1934.0020.0011.30C8][.0000.013D.0002.3099] # KATAKANA LETTER DO; QQCM
+306A ; [.1935.0020.000E.306A] # HIRAGANA LETTER NA
+30CA ; [.1935.0020.0011.30CA] # KATAKANA LETTER NA
+306B ; [.1936.0020.000E.306B] # HIRAGANA LETTER NI
+30CB ; [.1936.0020.0011.30CB] # KATAKANA LETTER NI
+306C ; [.1937.0020.000E.306C] # HIRAGANA LETTER NU
+30CC ; [.1937.0020.0011.30CC] # KATAKANA LETTER NU
+306D ; [.1938.0020.000E.306D] # HIRAGANA LETTER NE
+30CD ; [.1938.0020.0011.30CD] # KATAKANA LETTER NE
+306E ; [.1939.0020.000E.306E] # HIRAGANA LETTER NO
+30CE ; [.1939.0020.0011.30CE] # KATAKANA LETTER NO
+306F ; [.193A.0020.000E.306F] # HIRAGANA LETTER HA
+30CF ; [.193A.0020.0011.30CF] # KATAKANA LETTER HA
+3070 ; [.193A.0020.000E.306F][.0000.013D.0002.3099] # HIRAGANA LETTER BA; QQCM
+30D0 ; [.193A.0020.0011.30CF][.0000.013D.0002.3099] # KATAKANA LETTER BA; QQCM
+3071 ; [.193A.0020.000E.306F][.0000.013E.0002.309A] # HIRAGANA LETTER PA; QQCM
+30D1 ; [.193A.0020.0011.30CF][.0000.013E.0002.309A] # KATAKANA LETTER PA; QQCM
+3072 ; [.193B.0020.000E.3072] # HIRAGANA LETTER HI
+30D2 ; [.193B.0020.0011.30D2] # KATAKANA LETTER HI
+3073 ; [.193B.0020.000E.3072][.0000.013D.0002.3099] # HIRAGANA LETTER BI; QQCM
+30D3 ; [.193B.0020.0011.30D2][.0000.013D.0002.3099] # KATAKANA LETTER BI; QQCM
+3074 ; [.193B.0020.000E.3072][.0000.013E.0002.309A] # HIRAGANA LETTER PI; QQCM
+30D4 ; [.193B.0020.0011.30D2][.0000.013E.0002.309A] # KATAKANA LETTER PI; QQCM
+3075 ; [.193C.0020.000E.3075] # HIRAGANA LETTER HU
+30D5 ; [.193C.0020.0011.30D5] # KATAKANA LETTER HU
+3076 ; [.193C.0020.000E.3075][.0000.013D.0002.3099] # HIRAGANA LETTER BU; QQCM
+30D6 ; [.193C.0020.0011.30D5][.0000.013D.0002.3099] # KATAKANA LETTER BU; QQCM
+3077 ; [.193C.0020.000E.3075][.0000.013E.0002.309A] # HIRAGANA LETTER PU; QQCM
+30D7 ; [.193C.0020.0011.30D5][.0000.013E.0002.309A] # KATAKANA LETTER PU; QQCM
+3078 ; [.193D.0020.000E.3078] # HIRAGANA LETTER HE
+30D8 ; [.193D.0020.0011.30D8] # KATAKANA LETTER HE
+3079 ; [.193D.0020.000E.3078][.0000.013D.0002.3099] # HIRAGANA LETTER BE; QQCM
+30D9 ; [.193D.0020.0011.30D8][.0000.013D.0002.3099] # KATAKANA LETTER BE; QQCM
+307A ; [.193D.0020.000E.3078][.0000.013E.0002.309A] # HIRAGANA LETTER PE; QQCM
+30DA ; [.193D.0020.0011.30D8][.0000.013E.0002.309A] # KATAKANA LETTER PE; QQCM
+307B ; [.193E.0020.000E.307B] # HIRAGANA LETTER HO
+30DB ; [.193E.0020.0011.30DB] # KATAKANA LETTER HO
+307C ; [.193E.0020.000E.307B][.0000.013D.0002.3099] # HIRAGANA LETTER BO; QQCM
+30DC ; [.193E.0020.0011.30DB][.0000.013D.0002.3099] # KATAKANA LETTER BO; QQCM
+307D ; [.193E.0020.000E.307B][.0000.013E.0002.309A] # HIRAGANA LETTER PO; QQCM
+30DD ; [.193E.0020.0011.30DB][.0000.013E.0002.309A] # KATAKANA LETTER PO; QQCM
+307E ; [.193F.0020.000E.307E] # HIRAGANA LETTER MA
+30DE ; [.193F.0020.0011.30DE] # KATAKANA LETTER MA
+307F ; [.1940.0020.000E.307F] # HIRAGANA LETTER MI
+30DF ; [.1940.0020.0011.30DF] # KATAKANA LETTER MI
+3080 ; [.1941.0020.000E.3080] # HIRAGANA LETTER MU
+30E0 ; [.1941.0020.0011.30E0] # KATAKANA LETTER MU
+3081 ; [.1942.0020.000E.3081] # HIRAGANA LETTER ME
+30E1 ; [.1942.0020.0011.30E1] # KATAKANA LETTER ME
+3082 ; [.1943.0020.000E.3082] # HIRAGANA LETTER MO
+30E2 ; [.1943.0020.0011.30E2] # KATAKANA LETTER MO
+3083 ; [.1944.0020.000D.3083] # HIRAGANA LETTER SMALL YA
+3084 ; [.1944.0020.000E.3084] # HIRAGANA LETTER YA
+30E3 ; [.1944.0020.000F.30E3] # KATAKANA LETTER SMALL YA
+30E4 ; [.1944.0020.0011.30E4] # KATAKANA LETTER YA
+3085 ; [.1945.0020.000D.3085] # HIRAGANA LETTER SMALL YU
+3086 ; [.1945.0020.000E.3086] # HIRAGANA LETTER YU
+30E5 ; [.1945.0020.000F.30E5] # KATAKANA LETTER SMALL YU
+30E6 ; [.1945.0020.0011.30E6] # KATAKANA LETTER YU
+3087 ; [.1946.0020.000D.3087] # HIRAGANA LETTER SMALL YO
+3088 ; [.1946.0020.000E.3088] # HIRAGANA LETTER YO
+30E7 ; [.1946.0020.000F.30E7] # KATAKANA LETTER SMALL YO
+30E8 ; [.1946.0020.0011.30E8] # KATAKANA LETTER YO
+3089 ; [.1947.0020.000E.3089] # HIRAGANA LETTER RA
+30E9 ; [.1947.0020.0011.30E9] # KATAKANA LETTER RA
+308A ; [.1948.0020.000E.308A] # HIRAGANA LETTER RI
+30EA ; [.1948.0020.0011.30EA] # KATAKANA LETTER RI
+308B ; [.1949.0020.000E.308B] # HIRAGANA LETTER RU
+30EB ; [.1949.0020.0011.30EB] # KATAKANA LETTER RU
+308C ; [.194A.0020.000E.308C] # HIRAGANA LETTER RE
+30EC ; [.194A.0020.0011.30EC] # KATAKANA LETTER RE
+308D ; [.194B.0020.000E.308D] # HIRAGANA LETTER RO
+30ED ; [.194B.0020.0011.30ED] # KATAKANA LETTER RO
+308E ; [.194C.0020.000D.308E] # HIRAGANA LETTER SMALL WA
+308F ; [.194C.0020.000E.308F] # HIRAGANA LETTER WA
+30EE ; [.194C.0020.000F.30EE] # KATAKANA LETTER SMALL WA
+30EF ; [.194C.0020.0011.30EF] # KATAKANA LETTER WA
+30F7 ; [.194C.0020.0011.30EF][.0000.013D.0002.3099] # KATAKANA LETTER VA; QQCM
+3090 ; [.194D.0020.000E.3090] # HIRAGANA LETTER WI
+30F0 ; [.194D.0020.0011.30F0] # KATAKANA LETTER WI
+30F8 ; [.194D.0020.0011.30F0][.0000.013D.0002.3099] # KATAKANA LETTER VI; QQCM
+3091 ; [.194E.0020.000E.3091] # HIRAGANA LETTER WE
+30F1 ; [.194E.0020.0011.30F1] # KATAKANA LETTER WE
+30F9 ; [.194E.0020.0011.30F1][.0000.013D.0002.3099] # KATAKANA LETTER VE; QQCM
+3092 ; [.194F.0020.000E.3092] # HIRAGANA LETTER WO
+30F2 ; [.194F.0020.0011.30F2] # KATAKANA LETTER WO
+30FA ; [.194F.0020.0011.30F2][.0000.013D.0002.3099] # KATAKANA LETTER VO; QQCM
+3093 ; [.1950.0020.000E.3093] # HIRAGANA LETTER N
+30F3 ; [.1950.0020.0011.30F3] # KATAKANA LETTER N
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/contract.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/contract.t
new file mode 100644
index 00000000000..1c6658d5724
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/contract.t
@@ -0,0 +1,146 @@
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 40 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+use vars qw($IsEBCDIC);
+$IsEBCDIC = ord("A") != 0x41;
+
+our $kjeEntry = <<'ENTRIES';
+0301 ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
+0334 ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
+043A ; [.0D31.0020.0002.043A] # CYRILLIC SMALL LETTER KA
+041A ; [.0D31.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
+045C ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+043A 0301 ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
+040C ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+041A 0301 ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
+ENTRIES
+
+our $aaEntry = <<'ENTRIES';
+0304 ; [.0000.005A.0002.0304] # COMBINING MACRON (cc = 230)
+030A ; [.0000.0043.0002.030A] # COMBINING RING ABOVE (cc = 230)
+0327 ; [.0000.0055.0002.0327] # COMBINING CEDILLA (cc = 202)
+031A ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE (cc = 232)
+0061 ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
+0041 ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
+007A ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
+005A ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
+00E5 ; [.0C25.0020.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
+00C5 ; [.0C25.0020.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
+0061 030A ; [.0C25.0020.0002.0061] # LATIN SMALL LETTER A WITH RING ABOVE
+0041 030A ; [.0C25.0020.0008.0041] # LATIN CAPITAL LETTER A WITH RING ABOVE
+ENTRIES
+
+#########################
+
+ok(1);
+
+my $kjeNoN = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => undef,
+ entry => $kjeEntry,
+);
+
+ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
+ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
+
+our %sortkeys;
+
+$sortkeys{'KAac'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}");
+$sortkeys{'KAta'} = $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}");
+$sortkeys{'KAat'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}");
+
+eval { require Unicode::Normalize };
+if (!$@ && !$IsEBCDIC) {
+ my $kjeNFD = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ entry => $kjeEntry,
+ );
+ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0301}"));
+ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
+
+ my $aaNFD = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ entry => $aaEntry,
+ );
+
+ok($aaNFD->lt("Z", "A\x{30A}\x{304}"));
+ok($aaNFD->eq("A", "A\x{304}\x{30A}"));
+ok($aaNFD->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
+ok($aaNFD->eq("A\x{304}", "A\x{304}\x{30A}"));
+ok($aaNFD->lt("Z", "A\x{327}\x{30A}"));
+ok($aaNFD->lt("Z", "A\x{30A}\x{327}"));
+ok($aaNFD->lt("Z", "A\x{31A}\x{30A}"));
+ok($aaNFD->lt("Z", "A\x{30A}\x{31A}"));
+
+ my $aaPre = Unicode::Collate->new(
+ level => 1,
+ normalization => "prenormalized",
+ table => undef,
+ entry => $aaEntry,
+ );
+
+ok($aaPre->lt("Z", "A\x{30A}\x{304}"));
+ok($aaPre->eq("A", "A\x{304}\x{30A}"));
+ok($aaPre->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
+ok($aaPre->eq("A\x{304}", "A\x{304}\x{30A}"));
+ok($aaPre->lt("Z", "A\x{327}\x{30A}"));
+ok($aaPre->lt("Z", "A\x{30A}\x{327}"));
+ok($aaPre->lt("Z", "A\x{31A}\x{30A}"));
+ok($aaPre->lt("Z", "A\x{30A}\x{31A}"));
+}
+else {
+ ok(1) for 1..20;
+}
+
+# again: loading Unicode::Normalize should not affect $kjeNoN.
+ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
+ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
+ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
+
+ok($sortkeys{'KAac'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}"));
+ok($sortkeys{'KAta'}, $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}"));
+ok($sortkeys{'KAat'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}"));
+
+my $aaNoN = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ entry => $aaEntry,
+ normalization => undef,
+);
+
+ok($aaNoN->lt("Z", "A\x{30A}\x{304}"));
+ok($aaNoN->eq("A", "A\x{304}\x{30A}"));
+ok($aaNoN->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
+ok($aaNoN->eq("A\x{304}", "A\x{304}\x{30A}"));
+ok($aaNoN->eq("A", "A\x{327}\x{30A}"));
+ok($aaNoN->lt("Z", "A\x{30A}\x{327}"));
+ok($aaNoN->eq("A", "A\x{31A}\x{30A}"));
+ok($aaNoN->lt("Z", "A\x{30A}\x{31A}"));
+
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/hangtype.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/hangtype.t
new file mode 100644
index 00000000000..b6a46691aa3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/hangtype.t
@@ -0,0 +1,56 @@
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 30 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+ok(1);
+
+#########################
+
+ok(Unicode::Collate::getHST(0x0000), '');
+ok(Unicode::Collate::getHST(0x0100), '');
+ok(Unicode::Collate::getHST(0x1000), '');
+ok(Unicode::Collate::getHST(0x10FF), '');
+ok(Unicode::Collate::getHST(0x1100), 'L');
+ok(Unicode::Collate::getHST(0x1101), 'L');
+ok(Unicode::Collate::getHST(0x1159), 'L');
+ok(Unicode::Collate::getHST(0x115A), '');
+ok(Unicode::Collate::getHST(0x115E), '');
+ok(Unicode::Collate::getHST(0x115F), 'L');
+ok(Unicode::Collate::getHST(0x1160), 'V');
+ok(Unicode::Collate::getHST(0x1161), 'V');
+ok(Unicode::Collate::getHST(0x11A0), 'V');
+ok(Unicode::Collate::getHST(0x11A2), 'V');
+ok(Unicode::Collate::getHST(0x11A3), '');
+ok(Unicode::Collate::getHST(0x11A7), '');
+ok(Unicode::Collate::getHST(0x11A8), 'T');
+ok(Unicode::Collate::getHST(0x11AF), 'T');
+ok(Unicode::Collate::getHST(0x11E0), 'T');
+ok(Unicode::Collate::getHST(0x11F9), 'T');
+ok(Unicode::Collate::getHST(0x11FA), '');
+ok(Unicode::Collate::getHST(0x11FF), '');
+ok(Unicode::Collate::getHST(0x3011), '');
+ok(Unicode::Collate::getHST(0x11A7), '');
+ok(Unicode::Collate::getHST(0xAC00), 'LV');
+ok(Unicode::Collate::getHST(0xAC01), 'LVT');
+ok(Unicode::Collate::getHST(0xAC1B), 'LVT');
+ok(Unicode::Collate::getHST(0xAC1C), 'LV');
+ok(Unicode::Collate::getHST(0xD7A3), 'LVT');
+
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/hangul.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/hangul.t
new file mode 100644
index 00000000000..1b1359e88da
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/hangul.t
@@ -0,0 +1,234 @@
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 72 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+use vars qw($IsEBCDIC);
+$IsEBCDIC = ord("A") != 0x41;
+
+#########################
+
+ok(1);
+
+# a standard collator (3.1.1)
+my $Collator = Unicode::Collate->new(
+ table => 'keys.txt',
+ normalization => undef,
+);
+
+
+# a collator for hangul sorting,
+# cf. http://std.dkuug.dk/JTC1/SC22/WG20/docs/documents.html
+# http://std.dkuug.dk/JTC1/SC22/WG20/docs/n1051-hangulsort.pdf
+my $hangul = Unicode::Collate->new(
+ level => 3,
+ table => undef,
+ normalization => undef,
+
+ entry => <<'ENTRIES',
+0061 ; [.0A15.0020.0002] # LATIN SMALL LETTER A
+0041 ; [.0A15.0020.0008] # LATIN CAPITAL LETTER A
+#1161 ; [.1800.0020.0002] # <comment> initial jungseong A
+#1163 ; [.1801.0020.0002] # <comment> initial jungseong YA
+1100 ; [.1831.0020.0002] # choseong KIYEOK
+1100 1161 ; [.1831.0020.0002][.1800.0020.0002] # G-A
+1100 1163 ; [.1831.0020.0002][.1801.0020.0002] # G-YA
+1101 ; [.1831.0020.0002][.1831.0020.0002] # choseong SSANGKIYEOK
+1101 1161 ; [.1831.0020.0002][.1831.0020.0002][.1800.0020.0002] # GG-A
+1101 1163 ; [.1831.0020.0002][.1831.0020.0002][.1801.0020.0002] # GG-YA
+1102 ; [.1833.0020.0002] # choseong NIEUN
+1102 1161 ; [.1833.0020.0002][.1800.0020.0002] # N-A
+1102 1163 ; [.1833.0020.0002][.1801.0020.0002] # N-YA
+3042 ; [.1921.0020.000E] # HIRAGANA LETTER A
+11A8 ; [.FE10.0020.0002] # jongseong KIYEOK
+11A9 ; [.FE10.0020.0002][.FE10.0020.0002] # jongseong SSANGKIYEOK
+1161 ; [.FE20.0020.0002] # jungseong A <non-initial>
+1163 ; [.FE21.0020.0002] # jungseong YA <non-initial>
+ENTRIES
+);
+
+ok(ref $hangul, "Unicode::Collate");
+
+my $trailwt = Unicode::Collate->new(
+ level => 3,
+ table => undef,
+ normalization => undef,
+ hangul_terminator => 16,
+
+ entry => <<'ENTRIES', # Term < Jongseong < Jungseong < Choseong
+0061 ; [.0A15.0020.0002] # LATIN SMALL LETTER A
+0041 ; [.0A15.0020.0008] # LATIN CAPITAL LETTER A
+11A8 ; [.1801.0020.0002] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.1801.0020.0002][.1801.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK
+1161 ; [.1831.0020.0002] # HANGUL JUNGSEONG A
+1163 ; [.1832.0020.0002] # HANGUL JUNGSEONG YA
+1100 ; [.1861.0020.0002] # HANGUL CHOSEONG KIYEOK
+1101 ; [.1861.0020.0002][.1861.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK
+1102 ; [.1862.0020.0002] # HANGUL CHOSEONG NIEUN
+3042 ; [.1921.0020.000E] # HIRAGANA LETTER A
+ENTRIES
+);
+
+#########################
+
+# L(simp)L(simp) vs L(comp): /GGA/
+ok($Collator->lt("\x{1100}\x{1100}\x{1161}", "\x{1101}\x{1161}"));
+ok($hangul ->eq("\x{1100}\x{1100}\x{1161}", "\x{1101}\x{1161}"));
+ok($trailwt ->eq("\x{1100}\x{1100}\x{1161}", "\x{1101}\x{1161}"));
+
+# L(simp) vs L(simp)L(simp): /GA/ vs /GGA/
+ok($Collator->gt("\x{1100}\x{1161}", "\x{1100}\x{1100}\x{1161}"));
+ok($hangul ->lt("\x{1100}\x{1161}", "\x{1100}\x{1100}\x{1161}"));
+ok($trailwt ->lt("\x{1100}\x{1161}", "\x{1100}\x{1100}\x{1161}"));
+
+# T(simp)T(simp) vs T(comp): /AGG/
+ok($Collator->lt("\x{1161}\x{11A8}\x{11A8}", "\x{1161}\x{11A9}"));
+ok($hangul ->eq("\x{1161}\x{11A8}\x{11A8}", "\x{1161}\x{11A9}"));
+ok($trailwt ->eq("\x{1161}\x{11A8}\x{11A8}", "\x{1161}\x{11A9}"));
+
+# T(simp) vs T(simp)T(simp): /AG/ vs /AGG/
+ok($Collator->lt("\x{1161}\x{11A8}", "\x{1161}\x{11A8}\x{11A8}"));
+ok($hangul ->lt("\x{1161}\x{11A8}", "\x{1161}\x{11A8}\x{11A8}"));
+ok($trailwt ->lt("\x{1161}\x{11A8}", "\x{1161}\x{11A8}\x{11A8}"));
+
+# LV vs LLV: /GA/ vs /GNA/
+ok($Collator->gt("\x{1100}\x{1161}", "\x{1100}\x{1102}\x{1161}"));
+ok($hangul ->lt("\x{1100}\x{1161}", "\x{1100}\x{1102}\x{1161}"));
+ok($trailwt ->lt("\x{1100}\x{1161}", "\x{1100}\x{1102}\x{1161}"));
+
+# LVX vs LVV: /GAA/ vs /GA/.latinA
+ok($Collator->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}A"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}A"));
+ok($trailwt ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}A"));
+
+# LVX vs LVV: /GAA/ vs /GA/.hiraganaA
+ok($Collator->lt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{3042}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{3042}"));
+ok($trailwt ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{3042}"));
+
+# LVX vs LVV: /GAA/ vs /GA/.hanja
+ok($Collator->lt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{4E00}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{4E00}"));
+ok($trailwt ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{4E00}"));
+
+# LVL vs LVT: /GA/./G/ vs /GAG/
+ok($Collator->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{11A8}"));
+ok($hangul ->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{11A8}"));
+ok($trailwt ->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{11A8}"));
+
+# LVT vs LVX: /GAG/ vs /GA/.latinA
+ok($Collator->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}A"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}A"));
+ok($trailwt ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}A"));
+
+# LVT vs LVX: /GAG/ vs /GA/.hiraganaA
+ok($Collator->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{3042}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{3042}"));
+ok($trailwt ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{3042}"));
+
+# LVT vs LVX: /GAG/ vs /GA/.hanja
+ok($Collator->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+ok($trailwt ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+
+# LVT vs LVV: /GAG/ vs /GAA/
+ok($Collator->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{1161}"));
+ok($hangul ->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{1161}"));
+ok($trailwt ->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{1161}"));
+
+# LVL vs LVV: /GA/./G/ vs /GAA/
+ok($Collator->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{1161}"));
+ok($hangul ->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{1161}"));
+ok($trailwt ->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{1161}"));
+
+# LV vs Syl(LV): /GA/ vs /[GA]/
+ok($Collator->eq("\x{1100}\x{1161}", "\x{AC00}"));
+ok($hangul ->eq("\x{1100}\x{1161}", "\x{AC00}"));
+ok($trailwt ->eq("\x{1100}\x{1161}", "\x{AC00}"));
+
+# LVT vs Syl(LV)T: /GAG/ vs /[GA]G/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+ok($trailwt ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+
+# LVT vs Syl(LVT): /GAG/ vs /[GAG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+ok($trailwt ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+
+# LVTT vs Syl(LVTT): /GAGG/ vs /[GAGG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+ok($trailwt ->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+
+# LVTT vs Syl(LVT).T: /GAGG/ vs /[GAG]G/
+ok($Collator->gt("\x{1100}\x{1161}\x{11A9}", "\x{AC01}\x{11A8}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC01}\x{11A8}"));
+ok($trailwt ->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC01}\x{11A8}"));
+
+# LLVT vs L.Syl(LVT): /GGAG/ vs /G[GAG]/
+ok($Collator->gt("\x{1101}\x{1161}\x{11A8}", "\x{1100}\x{AC01}"));
+ok($hangul ->eq("\x{1101}\x{1161}\x{11A8}", "\x{1100}\x{AC01}"));
+ok($trailwt ->eq("\x{1101}\x{1161}\x{11A8}", "\x{1100}\x{AC01}"));
+
+#########################
+
+# checks contraction in LVT:
+# weights of these contractions may be non-sense.
+
+my $hangcont = Unicode::Collate->new(
+ level => 3,
+ table => undef,
+ normalization => undef,
+ entry => <<'ENTRIES',
+1100 ; [.1831.0020.0002] # HANGUL CHOSEONG KIYEOK
+1101 ; [.1832.0020.0002] # HANGUL CHOSEONG SSANGKIYEOK
+1161 ; [.188D.0020.0002] # HANGUL JUNGSEONG A
+1162 ; [.188E.0020.0002] # HANGUL JUNGSEONG AE
+1163 ; [.188F.0020.0002] # HANGUL JUNGSEONG YA
+11A8 ; [.18CF.0020.0002] # HANGUL JONGSEONG KIYEOK
+11A9 ; [.18D0.0020.0002] # HANGUL JONGSEONG SSANGKIYEOK
+1161 11A9 ; [.0000.0000.0000] # A-GG <contraction>
+1100 1163 11A8 ; [.1000.0020.0002] # G-YA-G <contraction> eq. U+AC39
+ENTRIES
+);
+
+# contracted into VT
+ok($Collator->lt("\x{1101}", "\x{1101}\x{1161}\x{11A9}"));
+ok($hangcont->eq("\x{1101}", "\x{1101}\x{1161}\x{11A9}"));
+
+# not contracted into LVT but into VT
+ok($Collator->lt("\x{1100}", "\x{1100}\x{1161}\x{11A9}"));
+ok($hangcont->eq("\x{1100}", "\x{1100}\x{1161}\x{11A9}"));
+
+# contracted into LVT
+ok($Collator->gt("\x{1100}\x{1163}\x{11A8}", "\x{1100}"));
+ok($hangcont->lt("\x{1100}\x{1163}\x{11A8}", "\x{1100}"));
+
+# LVTT vs Syl(LVTT): /GAGG/ vs /[GAGG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+ok($hangcont->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+
+# LVT vs Syl(LVT): /GYAG/ vs /[GYAG]/
+ok($Collator->eq("\x{1100}\x{1163}\x{11A8}", "\x{AC39}"));
+ok($hangcont->eq("\x{1100}\x{1163}\x{11A8}", "\x{AC39}"));
+
+1;
+__END__
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/index.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/index.t
new file mode 100644
index 00000000000..a1d67d53461
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/index.t
@@ -0,0 +1,403 @@
+
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 65 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+our $IsEBCDIC = ord("A") != 0x41;
+
+#########################
+
+ok(1);
+
+my $Collator = Unicode::Collate->new(
+ table => 'keys.txt',
+ normalization => undef,
+);
+
+##############
+
+my %old_level = $Collator->change(level => 2);
+
+my $str;
+
+my $orig = "This is a Perl book.";
+my $sub = "PERL";
+my $rep = "camel";
+my $ret = "This is a camel book.";
+
+$str = $orig;
+if (my($pos,$len) = $Collator->index($str, $sub)) {
+ substr($str, $pos, $len, $rep);
+}
+
+ok($str, $ret);
+
+$Collator->change(%old_level);
+
+$str = $orig;
+if (my($pos,$len) = $Collator->index($str, $sub)) {
+ substr($str, $pos, $len, $rep);
+}
+
+ok($str, $orig);
+
+##############
+
+my $match;
+
+$Collator->change(level => 1);
+
+$str = "Pe\x{300}rl";
+$sub = "pe";
+$ret = "Pe\x{300}";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$str = "P\x{300}e\x{300}\x{301}\x{303}rl";
+$sub = "pE";
+$ret = "P\x{300}e\x{300}\x{301}\x{303}";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$Collator->change(level => 2);
+
+$str = "Pe\x{300}rl";
+$sub = "pe";
+$ret = undef;
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$str = "P\x{300}e\x{300}\x{301}\x{303}rl";
+$sub = "pE";
+$ret = undef;
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$str = "Pe\x{300}rl";
+$sub = "pe\x{300}";
+$ret = "Pe\x{300}";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$str = "P\x{300}e\x{300}\x{301}\x{303}rl";
+$sub = "p\x{300}E\x{300}\x{301}\x{303}";
+$ret = "P\x{300}e\x{300}\x{301}\x{303}";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+##############
+
+$Collator->change(level => 1);
+
+$str = $IsEBCDIC
+ ? "Ich mu\x{0059} studieren Perl."
+ : "Ich mu\x{00DF} studieren Perl.";
+$sub = $IsEBCDIC
+ ? "m\x{00DC}ss"
+ : "m\x{00FC}ss";
+$ret = $IsEBCDIC
+ ? "mu\x{0059}"
+ : "mu\x{00DF}";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$Collator->change(%old_level);
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, undef);
+
+$match = undef;
+if (my($pos,$len) = $Collator->index("", "")) {
+ $match = substr("", $pos, $len);
+}
+ok($match, "");
+
+$match = undef;
+if (my($pos,$len) = $Collator->index("", "abc")) {
+ $match = substr("", $pos, $len);
+}
+ok($match, undef);
+
+##############
+
+$Collator->change(level => 1);
+
+$str = "\0\cA\0\cAe\0\x{300}\cA\x{301}\cB\x{302}\0 \0\cA";
+$sub = "e";
+$ret = "e\0\x{300}\cA\x{301}\cB\x{302}\0";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+$Collator->change(level => 1);
+
+$str = "\0\cA\0\cAe\0\cA\x{300}\0\cAe";
+$sub = "e";
+$ret = "e\0\cA\x{300}\0\cA";
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+
+$Collator->change(%old_level);
+
+$str = "e\x{300}";
+$sub = "e";
+$ret = undef;
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, $ret);
+
+##############
+
+$Collator->change(level => 1);
+
+$str = "The Perl is a language, and the perl is an interpreter.";
+$sub = "PERL";
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub, -40)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, "Perl");
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub, 4)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, "Perl");
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub, 5)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, "perl");
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub, 32)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, "perl");
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub, 33)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, undef);
+
+$match = undef;
+if (my($pos, $len) = $Collator->index($str, $sub, 100)) {
+ $match = substr($str, $pos, $len);
+}
+ok($match, undef);
+
+$Collator->change(%old_level);
+
+##############
+
+my @ret;
+
+$Collator->change(level => 1);
+
+$ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
+ok($ret);
+ok($$ret eq "P\cBe\x{300}\cB");
+
+@ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
+ok($ret[0], "P\cBe\x{300}\cB");
+
+$str = $IsEBCDIC ? "mu\x{0059}" : "mu\x{00DF}";
+$sub = $IsEBCDIC ? "m\x{00DC}ss" : "m\x{00FC}ss";
+
+($ret) = $Collator->match($str, $sub);
+ok($ret, $str);
+
+$str = $IsEBCDIC ? "mu\x{0059}" : "mu\x{00DF}";
+$sub = $IsEBCDIC ? "m\x{00DC}s" : "m\x{00FC}s";
+
+($ret) = $Collator->match($str, $sub);
+ok($ret, undef);
+
+$ret = join ':', $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
+ok($ret eq "P\cBe\x{300}\cB:pe:PE");
+
+$ret = $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
+ok($ret == 3);
+
+$str = "ABCDEF";
+$sub = "cde";
+$ret = $Collator->match($str, $sub);
+$str = "01234567";
+ok($ret && $$ret, "CDE");
+
+$str = "ABCDEF";
+$sub = "cde";
+($ret) = $Collator->match($str, $sub);
+$str = "01234567";
+ok($ret, "CDE");
+
+
+$Collator->change(level => 3);
+
+$ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
+ok($ret, undef);
+
+@ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
+ok(@ret == 0);
+
+$ret = join ':', $Collator->gmatch("P\cBe\x{300}\cBrl and PERL", "pe");
+ok($ret eq "");
+
+$ret = $Collator->gmatch("P\cBe\x{300}\cBrl and PERL", "pe");
+ok($ret == 0);
+
+$ret = join ':', $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
+ok($ret eq "pe");
+
+$ret = $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
+ok($ret == 1);
+
+$str = $IsEBCDIC ? "mu\x{0059}" : "mu\x{00DF}";
+$sub = $IsEBCDIC ? "m\x{00DC}ss" : "m\x{00FC}ss";
+
+($ret) = $Collator->match($str, $sub);
+ok($ret, undef);
+
+$Collator->change(%old_level);
+
+##############
+
+$Collator->change(level => 1);
+
+sub strreverse { scalar reverse shift }
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->subst($str, "perl", 'Camel');
+ok($ret, 1);
+ok($str, "Camel and PERL.");
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->subst($str, "perl", \&strreverse);
+ok($ret, 1);
+ok($str, "lr\cB\x{300}e\cBP and PERL.");
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->gsubst($str, "perl", 'Camel');
+ok($ret, 2);
+ok($str, "Camel and Camel.");
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->gsubst($str, "perl", \&strreverse);
+ok($ret, 2);
+ok($str, "lr\cB\x{300}e\cBP and LREP.");
+
+$str = "Camel ass came\x{301}l CAMEL horse cAm\0E\0L...";
+$Collator->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
+ok($str,
+"<b>Camel</b> ass <b>came\x{301}l</b> <b>CAMEL</b> horse <b>cAm\0E\0L</b>...");
+
+$Collator->change(level => 3);
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->subst($str, "perl", "Camel");
+ok(! $ret);
+ok($str, "P\cBe\x{300}\cBrl and PERL.");
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->subst($str, "perl", \&strreverse);
+ok(! $ret);
+ok($str, "P\cBe\x{300}\cBrl and PERL.");
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->gsubst($str, "perl", "Camel");
+ok($ret, 0);
+ok($str, "P\cBe\x{300}\cBrl and PERL.");
+
+$str = "P\cBe\x{300}\cBrl and PERL.";
+$ret = $Collator->gsubst($str, "perl", \&strreverse);
+ok($ret, 0);
+ok($str, "P\cBe\x{300}\cBrl and PERL.");
+
+$Collator->change(%old_level);
+
+##############
+
+$str = "Perl and Camel";
+$ret = $Collator->gsubst($str, "\cA\cA\0", "AB");
+ok($ret, 15);
+ok($str, "ABPABeABrABlAB ABaABnABdAB ABCABaABmABeABlAB");
+
+$str = '';
+$ret = $Collator->subst($str, "", "ABC");
+ok($ret, 1);
+ok($str, "ABC");
+
+$str = '';
+$ret = $Collator->gsubst($str, "", "ABC");
+ok($ret, 1);
+ok($str, "ABC");
+
+$str = 'PPPPP';
+$ret = $Collator->gsubst($str, 'PP', "ABC");
+ok($ret, 2);
+ok($str, "ABCABCP");
+
+##############
+
+# Shifted; ignorable after variable
+
+($ret) = $Collator->match("A?\x{300}!\x{301}\x{344}B\x{315}", "?!");
+ok($ret, "?\x{300}!\x{301}\x{344}");
+
+$Collator->change(alternate => 'Non-ignorable');
+
+($ret) = $Collator->match("A?\x{300}!\x{301}B\x{315}", "?!");
+ok($ret, undef);
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/normal.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/normal.t
new file mode 100644
index 00000000000..026240d6fae
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/normal.t
@@ -0,0 +1,205 @@
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+BEGIN {
+ eval { require Unicode::Normalize; };
+ if ($@) {
+ print "1..0 # skipped: Unicode::Normalize needed for this test\n";
+ print $@;
+ exit;
+ }
+}
+use Test;
+BEGIN { plan tests => 100 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+our $Aring = pack('U', 0xC5);
+our $aring = pack('U', 0xE5);
+
+our $entry = <<'ENTRIES';
+030A; [.0000.030A.0002] # COMBINING RING ABOVE
+212B; [.002B.0020.0008] # ANGSTROM SIGN
+0061; [.0A41.0020.0002] # LATIN SMALL LETTER A
+0041; [.0A41.0020.0008] # LATIN CAPITAL LETTER A
+007A; [.0A5A.0020.0002] # LATIN SMALL LETTER Z
+005A; [.0A5A.0020.0008] # LATIN CAPITAL LETTER Z
+FF41; [.0A87.0020.0002] # LATIN SMALL LETTER A
+FF21; [.0A87.0020.0008] # LATIN CAPITAL LETTER A
+00E5; [.0AC5.0020.0002] # LATIN SMALL LETTER A WITH RING ABOVE
+00C5; [.0AC5.0020.0008] # LATIN CAPITAL LETTER A WITH RING ABOVE
+ENTRIES
+
+# Aong < A+ring < Z < fullA+ring < A-ring
+
+#########################
+
+our $noN = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => undef,
+ entry => $entry,
+);
+
+our $nfc = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => 'NFC',
+ entry => $entry,
+);
+
+our $nfd = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => 'NFD',
+ entry => $entry,
+);
+
+our $nfkc = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => 'NFKC',
+ entry => $entry,
+);
+
+our $nfkd = Unicode::Collate->new(
+ level => 1,
+ table => undef,
+ normalization => 'NFKD',
+ entry => $entry,
+);
+
+ok($noN->lt("\x{212B}", "A"));
+ok($noN->lt("\x{212B}", $Aring));
+ok($noN->lt("A\x{30A}", $Aring));
+ok($noN->lt("A", "\x{FF21}"));
+ok($noN->lt("Z", "\x{FF21}"));
+ok($noN->lt("Z", $Aring));
+ok($noN->lt("\x{212B}", $aring));
+ok($noN->lt("A\x{30A}", $aring));
+ok($noN->lt("Z", $aring));
+ok($noN->lt("a\x{30A}", "Z"));
+
+ok($nfd->eq("\x{212B}", "A"));
+ok($nfd->eq("\x{212B}", $Aring));
+ok($nfd->eq("A\x{30A}", $Aring));
+ok($nfd->lt("A", "\x{FF21}"));
+ok($nfd->lt("Z", "\x{FF21}"));
+ok($nfd->gt("Z", $Aring));
+ok($nfd->eq("\x{212B}", $aring));
+ok($nfd->eq("A\x{30A}", $aring));
+ok($nfd->gt("Z", $aring));
+ok($nfd->lt("a\x{30A}", "Z"));
+
+ok($nfc->gt("\x{212B}", "A"));
+ok($nfc->eq("\x{212B}", $Aring));
+ok($nfc->eq("A\x{30A}", $Aring));
+ok($nfc->lt("A", "\x{FF21}"));
+ok($nfc->lt("Z", "\x{FF21}"));
+ok($nfc->lt("Z", $Aring));
+ok($nfc->eq("\x{212B}", $aring));
+ok($nfc->eq("A\x{30A}", $aring));
+ok($nfc->lt("Z", $aring));
+ok($nfc->gt("a\x{30A}", "Z"));
+
+ok($nfkd->eq("\x{212B}", "A"));
+ok($nfkd->eq("\x{212B}", $Aring));
+ok($nfkd->eq("A\x{30A}", $Aring));
+ok($nfkd->eq("A", "\x{FF21}"));
+ok($nfkd->gt("Z", "\x{FF21}"));
+ok($nfkd->gt("Z", $Aring));
+ok($nfkd->eq("\x{212B}", $aring));
+ok($nfkd->eq("A\x{30A}", $aring));
+ok($nfkd->gt("Z", $aring));
+ok($nfkd->lt("a\x{30A}", "Z"));
+
+ok($nfkc->gt("\x{212B}", "A"));
+ok($nfkc->eq("\x{212B}", $Aring));
+ok($nfkc->eq("A\x{30A}", $Aring));
+ok($nfkc->eq("A", "\x{FF21}"));
+ok($nfkc->gt("Z", "\x{FF21}"));
+ok($nfkc->lt("Z", $Aring));
+ok($nfkc->eq("\x{212B}", $aring));
+ok($nfkc->eq("A\x{30A}", $aring));
+ok($nfkc->lt("Z", $aring));
+ok($nfkc->gt("a\x{30A}", "Z"));
+
+$nfd->change(normalization => undef);
+
+ok($nfd->lt("\x{212B}", "A"));
+ok($nfd->lt("\x{212B}", $Aring));
+ok($nfd->lt("A\x{30A}", $Aring));
+ok($nfd->lt("A", "\x{FF21}"));
+ok($nfd->lt("Z", "\x{FF21}"));
+ok($nfd->lt("Z", $Aring));
+ok($nfd->lt("\x{212B}", $aring));
+ok($nfd->lt("A\x{30A}", $aring));
+ok($nfd->lt("Z", $aring));
+ok($nfd->lt("a\x{30A}", "Z"));
+
+$nfd->change(normalization => 'C');
+
+ok($nfd->gt("\x{212B}", "A"));
+ok($nfd->eq("\x{212B}", $Aring));
+ok($nfd->eq("A\x{30A}", $Aring));
+ok($nfd->lt("A", "\x{FF21}"));
+ok($nfd->lt("Z", "\x{FF21}"));
+ok($nfd->lt("Z", $Aring));
+ok($nfd->eq("\x{212B}", $aring));
+ok($nfd->eq("A\x{30A}", $aring));
+ok($nfd->lt("Z", $aring));
+ok($nfd->gt("a\x{30A}", "Z"));
+
+$nfd->change(normalization => 'D');
+
+ok($nfd->eq("\x{212B}", "A"));
+ok($nfd->eq("\x{212B}", $Aring));
+ok($nfd->eq("A\x{30A}", $Aring));
+ok($nfd->lt("A", "\x{FF21}"));
+ok($nfd->lt("Z", "\x{FF21}"));
+ok($nfd->gt("Z", $Aring));
+ok($nfd->eq("\x{212B}", $aring));
+ok($nfd->eq("A\x{30A}", $aring));
+ok($nfd->gt("Z", $aring));
+ok($nfd->lt("a\x{30A}", "Z"));
+
+$nfd->change(normalization => 'KD');
+
+ok($nfd->eq("\x{212B}", "A"));
+ok($nfd->eq("\x{212B}", $Aring));
+ok($nfd->eq("A\x{30A}", $Aring));
+ok($nfd->eq("A", "\x{FF21}"));
+ok($nfd->gt("Z", "\x{FF21}"));
+ok($nfd->gt("Z", $Aring));
+ok($nfd->eq("\x{212B}", $aring));
+ok($nfd->eq("A\x{30A}", $aring));
+ok($nfd->gt("Z", $aring));
+ok($nfd->lt("a\x{30A}", "Z"));
+
+$nfd->change(normalization => 'KC');
+
+ok($nfd->gt("\x{212B}", "A"));
+ok($nfd->eq("\x{212B}", $Aring));
+ok($nfd->eq("A\x{30A}", $Aring));
+ok($nfd->eq("A", "\x{FF21}"));
+ok($nfd->gt("Z", "\x{FF21}"));
+ok($nfd->lt("Z", $Aring));
+ok($nfd->eq("\x{212B}", $aring));
+ok($nfd->eq("A\x{30A}", $aring));
+ok($nfd->lt("Z", $aring));
+ok($nfd->gt("a\x{30A}", "Z"));
+
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/test.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/test.t
index f5a7012ea95..8a7eb8b59f9 100644
--- a/gnu/usr.bin/perl/lib/Unicode/Collate/t/test.t
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/test.t
@@ -1,26 +1,31 @@
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl test.pl'
-
-#########################
BEGIN {
- if (ord("A") == 193) {
- print "1..0 # Unicode::Collate not ported to EBCDIC\n";
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
exit 0;
}
}
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
use Test;
-BEGIN { plan tests => 160 };
+BEGIN { plan tests => 203 };
+
+use strict;
+use warnings;
use Unicode::Collate;
-ok(1); # If we made it this far, we're ok.
-#########################
+our $IsEBCDIC = ord("A") != 0x41;
-my $UCA_Version = "8.0";
+ok(1);
-ok(Unicode::Collate::UCA_Version, $UCA_Version);
-ok(Unicode::Collate->UCA_Version, $UCA_Version);
+##### 2..6
my $Collator = Unicode::Collate->new(
table => 'keys.txt',
@@ -29,8 +34,6 @@ my $Collator = Unicode::Collate->new(
ok(ref $Collator, "Unicode::Collate");
-ok($Collator->UCA_Version, $UCA_Version);
-ok($Collator->UCA_Version(), $UCA_Version);
ok(
join(':', $Collator->sort(
@@ -41,63 +44,79 @@ ok(
),
);
-my $A_acute = pack('U', 0x00C1);
-my $acute = pack('U', 0x0301);
-
-ok($Collator->cmp("A$acute", $A_acute), -1);
ok($Collator->cmp("", ""), 0);
-ok(! $Collator->ne("", "") );
-ok( $Collator->eq("", "") );
+ok($Collator->eq("", ""));
ok($Collator->cmp("", "perl"), -1);
-##############
+##### 7..17
+
+sub _pack_U { Unicode::Collate::pack_U(@_) }
+sub _unpack_U { Unicode::Collate::unpack_U(@_) }
+
+my $A_acute = _pack_U(0xC1);
+my $a_acute = _pack_U(0xE1);
+my $acute = _pack_U(0x0301);
+
+ok($Collator->cmp("A$acute", $A_acute), 0); # @version 3.1.1 (prev: -1)
+ok($Collator->cmp($a_acute, $A_acute), -1);
+ok($Collator->eq("A\cA$acute", $A_acute)); # UCA v9. \cA is invariant.
+
+my %old_level = $Collator->change(level => 1);
+ok($Collator->eq("A$acute", $A_acute));
+ok($Collator->eq("A", $A_acute));
+
+ok($Collator->change(level => 2)->eq($a_acute, $A_acute));
+ok($Collator->lt("A", $A_acute));
+
+ok($Collator->change(%old_level)->lt("A", $A_acute));
+ok($Collator->lt("A", $A_acute));
+ok($Collator->lt("A", $a_acute));
+ok($Collator->lt($a_acute, $A_acute));
+
+##### 17..20
eval { require Unicode::Normalize };
-if (!$@) {
+if (!$@ && !$IsEBCDIC) {
my $NFD = Unicode::Collate->new(
table => 'keys.txt',
+ level => 1,
entry => <<'ENTRIES',
-0430 ; [.0B01.0020.0002.0430] # CYRILLIC SMALL LETTER A
-0410 ; [.0B01.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
-04D3 ; [.0B09.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
-0430 0308 ; [.0B09.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
-04D3 ; [.0B09.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
-0430 0308 ; [.0B09.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
-04D2 ; [.0B09.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
-0410 0308 ; [.0B09.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
-0430 3099 ; [.0B10.0020.0002.04D3] # A WITH KATAKANA VOICED
-0430 3099 0308 ; [.0B11.0020.0002.04D3] # A WITH KATAKANA VOICED, DIAERESIS
+0430 ; [.0CB5.0020.0002.0430] # CYRILLIC SMALL LETTER A
+0410 ; [.0CB5.0020.0008.0410] # CYRILLIC CAPITAL LETTER A
+04D3 ; [.0CBD.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+0430 0308 ; [.0CBD.0020.0002.04D3] # CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D2 ; [.0CBD.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+0410 0308 ; [.0CBD.0020.0008.04D2] # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+0430 3099 ; [.0CBE.0020.0002.04D3] # A WITH KATAKANA VOICED
+0430 3099 0308 ; [.0CBF.0020.0002.04D3] # A WITH KATAKANA VOICED, DIAERESIS
ENTRIES
);
- ok($NFD->eq("A$acute", $A_acute));
ok($NFD->eq("\x{4D3}\x{325}", "\x{430}\x{308}\x{325}"));
ok($NFD->lt("\x{430}\x{308}A", "\x{430}\x{308}B"));
ok($NFD->lt("\x{430}\x{3099}B", "\x{430}\x{308}\x{3099}A"));
- ok($NFD->eq("\x{0430}\x{3099}\x{309A}\x{0308}",
- "\x{0430}\x{309A}\x{3099}\x{0308}") );
}
else {
ok(1);
ok(1);
ok(1);
- ok(1);
- ok(1);
}
-##############
+##### 21..30
my $trad = Unicode::Collate->new(
table => 'keys.txt',
normalization => undef,
ignoreName => qr/HANGUL|HIRAGANA|KATAKANA|BOPOMOFO/,
- level => 4,
+ level => 3,
entry => << 'ENTRIES',
- 0063 0068 ; [.0893.0020.0002.0063] % "ch" in traditional Spanish
- 0043 0068 ; [.0893.0020.0008.0043] # "Ch" in traditional Spanish
- 00DF ; [.09F3.0154.0004.00DF] [.09F3.0020.0004.00DF] # eszet in Germany
+ 0063 0068 ; [.0A3F.0020.0002.0063] % "ch" in traditional Spanish
+ 0043 0068 ; [.0A3F.0020.0008.0043] # "Ch" in traditional Spanish
ENTRIES
);
+# 0063 ; [.0A3D.0020.0002.0063] # LATIN SMALL LETTER C
+# 0064 ; [.0A49.0020.0002.0064] # LATIN SMALL LETTER D
+# Deutsch sz is included in 'keys.txt';
ok(
join(':', $trad->sort( qw/ acha aca ada acia acka / ) ),
@@ -108,6 +127,10 @@ ok(
join(':', $Collator->sort( qw/ acha aca ada acia acka / ) ),
join(':', qw/ aca acha acia acka ada / ),
);
+ok($trad->eq("ocho", "oc\cAho")); # UCA v9
+ok($trad->eq("ocho", "oc\0\cA\0\cBho")); # UCA v9
+ok($trad->eq("-", "")); # also UCA v8
+ok($trad->lt("oc-ho", "ocho")); # also UCA v8
my $hiragana = "\x{3042}\x{3044}";
my $katakana = "\x{30A2}\x{30A4}";
@@ -118,11 +141,11 @@ ok($trad->eq("", $katakana));
ok($trad->eq($hiragana, $katakana));
ok($trad->eq($katakana, $hiragana));
-##############
+##### 31..37
-my $old_level = $Collator->{level};
+$Collator->change(level => 2);
-$Collator->{level} = 2;
+ok($Collator->{level}, 2);
ok( $Collator->cmp("ABC","abc"), 0);
ok( $Collator->eq("ABC","abc") );
@@ -131,6 +154,8 @@ ok( $Collator->cmp($hiragana, $katakana), 0);
ok( $Collator->eq($hiragana, $katakana) );
ok( $Collator->ge($hiragana, $katakana) );
+##### 38..43
+
# hangul
ok( $Collator->eq("a\x{AC00}b", "a\x{1100}\x{1161}b") );
ok( $Collator->eq("a\x{AE00}b", "a\x{1100}\x{1173}\x{11AF}b") );
@@ -139,9 +164,11 @@ ok( $Collator->lt("a\x{AC00}b", "a\x{AE00}b") );
ok( $Collator->gt("a\x{D7A3}b", "a\x{C544}b") );
ok( $Collator->lt("a\x{C544}b", "a\x{30A2}b") ); # hangul < hiragana
-$Collator->{level} = $old_level;
+##### 44..52
+
+$Collator->change(%old_level, katakana_before_hiragana => 1);
-$Collator->{katakana_before_hiragana} = 1;
+ok($Collator->{level}, 4);
ok( $Collator->cmp("abc", "ABC"), -1);
ok( $Collator->ne("abc", "ABC") );
@@ -152,7 +179,9 @@ ok( $Collator->ne($hiragana, $katakana) );
ok( $Collator->gt($hiragana, $katakana) );
ok( $Collator->ge($hiragana, $katakana) );
-$Collator->{upper_before_lower} = 1;
+##### 53..58
+
+$Collator->change(upper_before_lower => 1);
ok( $Collator->cmp("abc", "ABC"), 1);
ok( $Collator->ge("abc", "ABC"), 1);
@@ -161,19 +190,21 @@ ok( $Collator->cmp($hiragana, $katakana), 1);
ok( $Collator->ge($hiragana, $katakana), 1);
ok( $Collator->gt($hiragana, $katakana), 1);
-$Collator->{katakana_before_hiragana} = 0;
+##### 59..64
+
+$Collator->change(katakana_before_hiragana => 0);
ok( $Collator->cmp("abc", "ABC"), 1);
ok( $Collator->cmp($hiragana, $katakana), -1);
-$Collator->{upper_before_lower} = 0;
+$Collator->change(upper_before_lower => 0);
ok( $Collator->cmp("abc", "ABC"), -1);
ok( $Collator->le("abc", "ABC") );
ok( $Collator->cmp($hiragana, $katakana), -1);
ok( $Collator->lt($hiragana, $katakana) );
-##############
+##### 65..66
my $ignoreAE = Unicode::Collate->new(
table => 'keys.txt',
@@ -184,7 +215,7 @@ my $ignoreAE = Unicode::Collate->new(
ok($ignoreAE->eq("element","lament"));
ok($ignoreAE->eq("Perl","ePrl"));
-##############
+##### 67
my $onlyABC = Unicode::Collate->new(
table => undef,
@@ -204,7 +235,7 @@ ok(
join(':', qw/ A aB Ab ABA BAC cAc cc / ),
);
-##############
+##### 68..71
my $undefAE = Unicode::Collate->new(
table => 'keys.txt',
@@ -217,93 +248,7 @@ ok($Collator->lt("edge","fog"));
ok($undefAE ->gt("lake","like"));
ok($Collator->lt("lake","like"));
-##############
-
-$Collator->{level} = 2;
-
-my $str;
-
-my $orig = "This is a Perl book.";
-my $sub = "PERL";
-my $rep = "camel";
-my $ret = "This is a camel book.";
-
-$str = $orig;
-if (my($pos,$len) = $Collator->index($str, $sub)) {
- substr($str, $pos, $len, $rep);
-}
-
-ok($str, $ret);
-
-$Collator->{level} = $old_level;
-
-$str = $orig;
-if (my($pos,$len) = $Collator->index($str, $sub)) {
- substr($str, $pos, $len, $rep);
-}
-
-ok($str, $orig);
-
-##############
-
-my $match;
-
-$Collator->{level} = 1;
-
-$str = "Pe\x{300}rl";
-$sub = "pe";
-$match = undef;
-if (my($pos, $len) = $Collator->index($str, $sub)) {
- $match = substr($str, $pos, $len);
-}
-ok($match, "Pe\x{300}");
-
-$str = "P\x{300}e\x{300}\x{301}\x{303}rl";
-$sub = "pE";
-$match = undef;
-if (my($pos, $len) = $Collator->index($str, $sub)) {
- $match = substr($str, $pos, $len);
-}
-ok($match, "P\x{300}e\x{300}\x{301}\x{303}");
-
-$Collator->{level} = $old_level;
-
-##############
-
-$trad->{level} = 1;
-
-$str = "Ich mu\x{00DF} studieren.";
-$sub = "m\x{00FC}ss";
-$match = undef;
-if (my($pos, $len) = $trad->index($str, $sub)) {
- $match = substr($str, $pos, $len);
-}
-ok($match, "mu\x{00DF}");
-
-$trad->{level} = $old_level;
-
-$str = "Ich mu\x{00DF} studieren.";
-$sub = "m\x{00FC}ss";
-$match = undef;
-
-if (my($pos, $len) = $trad->index($str, $sub)) {
- $match = substr($str, $pos, $len);
-}
-ok($match, undef);
-
-$match = undef;
-if (my($pos,$len) = $Collator->index("", "")) {
- $match = substr("", $pos, $len);
-}
-ok($match, "");
-
-$match = undef;
-if (my($pos,$len) = $Collator->index("", "abc")) {
- $match = substr("", $pos, $len);
-}
-ok($match, undef);
-
-##############
+##### 72..81
# Table is undefined, then no entry is defined.
@@ -337,7 +282,7 @@ ok($undef_table->lt("\x{4E00}","\x{4E8C}"));
# U+4E8C: Ideograph "TWO"
-##############
+##### 82..86
my $few_entries = Unicode::Collate->new(
entry => <<'ENTRIES',
@@ -368,25 +313,45 @@ ok($few_entries->lt("\x{AE30}", "\x{AC00}"));
ok($few_entries->eq("\x{AC00}", "\x{1100}\x{1161}"));
-##############
+##### 87..91
-my $all_undef = Unicode::Collate->new(
+my $all_undef_8 = Unicode::Collate->new(
table => undef,
normalization => undef,
overrideCJK => undef,
overrideHangul => undef,
+ UCA_Version => 8,
);
# All in the Unicode code point order.
# No hangul decomposition.
-ok($all_undef->lt("\x{3042}", "\x{4E00}"));
-ok($all_undef->lt("\x{4DFF}", "\x{4E00}"));
-ok($all_undef->lt("\x{4E00}", "\x{AC00}"));
-ok($all_undef->gt("\x{AC00}", "\x{1100}\x{1161}"));
-ok($all_undef->gt("\x{AC00}", "\x{ABFF}"));
+ok($all_undef_8->lt("\x{3402}", "\x{4E00}"));
+ok($all_undef_8->lt("\x{4DFF}", "\x{4E00}"));
+ok($all_undef_8->lt("\x{4E00}", "\x{AC00}"));
+ok($all_undef_8->gt("\x{AC00}", "\x{1100}\x{1161}"));
+ok($all_undef_8->gt("\x{AC00}", "\x{ABFF}"));
-##############
+##### 92..96
+
+my $all_undef_9 = Unicode::Collate->new(
+ table => undef,
+ normalization => undef,
+ overrideCJK => undef,
+ overrideHangul => undef,
+ UCA_Version => 9,
+);
+
+# CJK Ideo. < CJK ext A/B < Others.
+# No hangul decomposition.
+
+ok($all_undef_9->lt("\x{4E00}", "\x{3402}"));
+ok($all_undef_9->lt("\x{3402}", "\x{20000}"));
+ok($all_undef_9->lt("\x{20000}", "\x{AC00}"));
+ok($all_undef_9->gt("\x{AC00}", "\x{1100}\x{1161}"));
+ok($all_undef_9->gt("\x{AC00}", "\x{ABFF}")); # U+ABFF: not assigned
+
+##### 97..101
my $ignoreCJK = Unicode::Collate->new(
table => undef,
@@ -405,7 +370,7 @@ ok($ignoreCJK->eq("Pe\x{4E00}rl", "Perl")); # U+4E00 is a CJK.
ok($ignoreCJK->gt("\x{4DFF}", "\x{4E00}")); # U+4DFF is not CJK.
ok($ignoreCJK->lt("Pe\x{5B57}rl", "Perl")); # 'r' is unassigned.
-##############
+##### 102..106
my $ignoreHangul = Unicode::Collate->new(
table => undef,
@@ -424,63 +389,45 @@ ok($ignoreHangul->lt("\x{AC00}", "\x{AE00}"));
ok($ignoreHangul->lt("\x{AC00}", "\x{1100}\x{1161}")); # Jamo are not ignored.
ok($ignoreHangul->lt("Pe\x{AE00}rl", "Perl")); # 'r' is unassigned.
-##############
-
-my $blanked = Unicode::Collate->new(
- table => 'keys.txt',
- normalization => undef,
- alternate => 'Blanked',
-);
+##### 107..127
-ok($blanked->lt("death", "de luge"));
-ok($blanked->lt("de luge", "de-luge"));
-ok($blanked->lt("de-luge", "deluge"));
-ok($blanked->lt("deluge", "de\x{2010}luge"));
-ok($blanked->lt("deluge", "de Luge"));
+my %origAlter = $Collator->change(alternate => 'Blanked');
-##############
+ok($Collator->lt("death", "de luge"));
+ok($Collator->lt("de luge", "de-luge"));
+ok($Collator->lt("de-luge", "deluge"));
+ok($Collator->lt("deluge", "de\x{2010}luge"));
+ok($Collator->lt("deluge", "de Luge"));
-my $nonIgn = Unicode::Collate->new(
- table => 'keys.txt',
- normalization => undef,
- alternate => 'Non-ignorable',
-);
+$Collator->change(alternate => 'Non-ignorable');
-ok($nonIgn->lt("de luge", "de Luge"));
-ok($nonIgn->lt("de Luge", "de-luge"));
-ok($nonIgn->lt("de-Luge", "de\x{2010}luge"));
-ok($nonIgn->lt("de-luge", "death"));
-ok($nonIgn->lt("death", "deluge"));
+ok($Collator->lt("de luge", "de Luge"));
+ok($Collator->lt("de Luge", "de-luge"));
+ok($Collator->lt("de-Luge", "de\x{2010}luge"));
+ok($Collator->lt("de-luge", "death"));
+ok($Collator->lt("death", "deluge"));
-##############
+$Collator->change(alternate => 'Shifted');
-my $shifted = Unicode::Collate->new(
- table => 'keys.txt',
- normalization => undef,
- alternate => 'Shifted',
-);
+ok($Collator->lt("death", "de luge"));
+ok($Collator->lt("de luge", "de-luge"));
+ok($Collator->lt("de-luge", "deluge"));
+ok($Collator->lt("deluge", "de Luge"));
+ok($Collator->lt("de Luge", "deLuge"));
-ok($shifted->lt("death", "de luge"));
-ok($shifted->lt("de luge", "de-luge"));
-ok($shifted->lt("de-luge", "deluge"));
-ok($shifted->lt("deluge", "de Luge"));
-ok($shifted->lt("de Luge", "deLuge"));
+$Collator->change(alternate => 'Shift-Trimmed');
-##############
+ok($Collator->lt("death", "deluge"));
+ok($Collator->lt("deluge", "de luge"));
+ok($Collator->lt("de luge", "de-luge"));
+ok($Collator->lt("de-luge", "deLuge"));
+ok($Collator->lt("deLuge", "de Luge"));
-my $shTrim = Unicode::Collate->new(
- table => 'keys.txt',
- normalization => undef,
- alternate => 'Shift-Trimmed',
-);
+$Collator->change(%origAlter);
-ok($shTrim->lt("death", "deluge"));
-ok($shTrim->lt("deluge", "de luge"));
-ok($shTrim->lt("de luge", "de-luge"));
-ok($shTrim->lt("de-luge", "deLuge"));
-ok($shTrim->lt("deLuge", "de Luge"));
+ok($Collator->{alternate}, 'shifted');
-##############
+##### 128..132
my $overCJK = Unicode::Collate->new(
table => undef,
@@ -502,23 +449,34 @@ ok($overCJK->lt("A\x{4E03}", "A\x{4E00}"));
ok($overCJK->lt("A\x{4E03}", "a\x{4E00}"));
ok($overCJK->lt("a\x{4E03}", "A\x{4E00}"));
-##############
+##### 133..144
+
+# rearrange : 0x0E40..0x0E44, 0x0EC0..0x0EC4 (default)
+
+my %old_rearrange = $Collator->change(rearrange => undef);
-# rearranged : 0x0E40..0x0E44, 0x0EC0..0x0EC4
+ok($Collator->gt("\x{0E41}A", "\x{0E40}B"));
+ok($Collator->gt("A\x{0E41}A", "A\x{0E40}B"));
-ok($Collator->lt("A", "B"));
+$Collator->change(rearrange => [ 0x61 ]);
+ # U+0061, 'a': This is a Unicode value, never a native value.
+
+ok($Collator->gt("ab", "AB")); # as 'ba' > 'AB'
+
+$Collator->change(%old_rearrange);
+
+ok($Collator->lt("ab", "AB"));
ok($Collator->lt("\x{0E40}", "\x{0E41}"));
ok($Collator->lt("\x{0E40}A", "\x{0E41}B"));
ok($Collator->lt("\x{0E41}A", "\x{0E40}B"));
ok($Collator->lt("A\x{0E41}A", "A\x{0E40}B"));
-ok($all_undef->lt("A", "B"));
-ok($all_undef->lt("\x{0E40}", "\x{0E41}"));
-ok($all_undef->lt("\x{0E40}A", "\x{0E41}B"));
-ok($all_undef->lt("\x{0E41}A", "\x{0E40}B"));
-ok($all_undef->lt("A\x{0E41}A", "A\x{0E40}B"));
+ok($all_undef_8->lt("\x{0E40}", "\x{0E41}"));
+ok($all_undef_8->lt("\x{0E40}A", "\x{0E41}B"));
+ok($all_undef_8->lt("\x{0E41}A", "\x{0E40}B"));
+ok($all_undef_8->lt("A\x{0E41}A", "A\x{0E40}B"));
-##############
+##### 145..149
my $no_rearrange = Unicode::Collate->new(
table => undef,
@@ -532,9 +490,7 @@ ok($no_rearrange->lt("\x{0E40}A", "\x{0E41}B"));
ok($no_rearrange->gt("\x{0E41}A", "\x{0E40}B"));
ok($no_rearrange->gt("A\x{0E41}A", "A\x{0E40}B"));
-##############
-
-# equivalent to $no_rearrange
+##### 150..154
my $undef_rearrange = Unicode::Collate->new(
table => undef,
@@ -548,7 +504,7 @@ ok($undef_rearrange->lt("\x{0E40}A", "\x{0E41}B"));
ok($undef_rearrange->gt("\x{0E41}A", "\x{0E40}B"));
ok($undef_rearrange->gt("A\x{0E41}A", "A\x{0E40}B"));
-##############
+##### 155..159
my $dropArticles = Unicode::Collate->new(
table => "keys.txt",
@@ -566,7 +522,7 @@ ok($dropArticles->lt("the pen", "a pencil"));
ok($Collator->lt("Perl", "The Perl"));
ok($Collator->gt("the pen", "a pencil"));
-##############
+##### 160..161
my $backLevel1 = Unicode::Collate->new(
table => undef,
@@ -579,7 +535,7 @@ my $backLevel1 = Unicode::Collate->new(
ok($backLevel1->gt("AB", "BA"));
ok($backLevel1->gt("\x{3042}\x{3044}", "\x{3044}\x{3042}"));
-##############
+##### 162..169
my $backLevel2 = Unicode::Collate->new(
table => "keys.txt",
@@ -593,7 +549,6 @@ ok($backLevel2->gt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
ok($Collator ->lt("Ca\x{300}ca\x{302}", "ca\x{302}ca\x{300}"));
ok($Collator ->lt("ca\x{300}ca\x{302}", "Ca\x{302}ca\x{300}"));
-
# HIRAGANA and KATAKANA are made undefined via undefName.
# So they are after CJK Unified Ideographs.
@@ -602,4 +557,112 @@ ok($backLevel2->lt("\x{4E03}", $katakana));
ok($Collator ->gt("\x{4E00}", $hiragana));
ok($Collator ->gt("\x{4E03}", $katakana));
-##############
+##### 170..184
+
+# ignorable after variable
+
+# Shifted;
+ok($Collator->eq("?\x{300}!\x{301}\x{315}", "?!"));
+ok($Collator->eq("?\x{300}A\x{301}", "?$A_acute"));
+ok($Collator->eq("?\x{300}", "?"));
+ok($Collator->eq("?\x{344}", "?")); # U+0344 has two CEs.
+
+$Collator->change(level => 3);
+ok($Collator->eq("\cA", "?"));
+
+$Collator->change(alternate => 'blanked', level => 4);
+ok($Collator->eq("?\x{300}!\x{301}\x{315}", "?!"));
+ok($Collator->eq("?\x{300}A\x{301}", "?$A_acute"));
+ok($Collator->eq("?\x{300}", "?"));
+ok($Collator->eq("?\x{344}", "?")); # U+0344 has two CEs.
+
+$Collator->change(level => 3);
+ok($Collator->eq("\cA", "?"));
+
+$Collator->change(alternate => 'Non-ignorable', level => 4);
+
+ok($Collator->lt("?\x{300}", "?!"));
+ok($Collator->gt("?\x{300}A$acute", "?$A_acute"));
+ok($Collator->gt("?\x{300}", "?"));
+ok($Collator->gt("?\x{344}", "?"));
+
+$Collator->change(level => 3);
+ok($Collator->lt("\cA", "?"));
+
+$Collator->change(alternate => 'Shifted', level => 4);
+
+##### 185..196
+
+# According to Conformance Test,
+# a L3-ignorable is treated as a completely ignorable.
+
+my $L3ignorable = Unicode::Collate->new(
+ alternate => 'Non-ignorable',
+ level => 3,
+ table => undef,
+ normalization => undef,
+ entry => <<'ENTRIES',
+0000 ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
+0001 ; [.0000.0000.0000.0000] # [0001] START OF HEADING (in 6429)
+0591 ; [.0000.0000.0000.0591] # HEBREW ACCENT ETNAHTA
+1D165 ; [.0000.0000.0000.1D165] # MUSICAL SYMBOL COMBINING STEM
+0021 ; [*024B.0020.0002.0021] # EXCLAMATION MARK
+09BE ; [.114E.0020.0002.09BE] # BENGALI VOWEL SIGN AA
+09C7 ; [.1157.0020.0002.09C7] # BENGALI VOWEL SIGN E
+09CB ; [.1159.0020.0002.09CB] # BENGALI VOWEL SIGN O
+09C7 09BE ; [.1159.0020.0002.09CB] # BENGALI VOWEL SIGN O
+1D1B9 ; [*098A.0020.0002.1D1B9] # MUSICAL SYMBOL SEMIBREVIS WHITE
+1D1BA ; [*098B.0020.0002.1D1BA] # MUSICAL SYMBOL SEMIBREVIS BLACK
+1D1BB ; [*098A.0020.0002.1D1B9][.0000.0000.0000.1D165] # M.S. MINIMA
+1D1BC ; [*098B.0020.0002.1D1BA][.0000.0000.0000.1D165] # M.S. MINIMA BLACK
+ENTRIES
+);
+
+ok($L3ignorable->lt("\cA", "!"));
+ok($L3ignorable->lt("\x{591}", "!"));
+ok($L3ignorable->eq("\cA", "\x{591}"));
+ok($L3ignorable->eq("\x{09C7}\x{09BE}A", "\x{09C7}\cA\x{09BE}A"));
+ok($L3ignorable->eq("\x{09C7}\x{09BE}A", "\x{09C7}\x{0591}\x{09BE}A"));
+ok($L3ignorable->eq("\x{09C7}\x{09BE}A", "\x{09C7}\x{1D165}\x{09BE}A"));
+ok($L3ignorable->eq("\x{09C7}\x{09BE}A", "\x{09CB}A"));
+ok($L3ignorable->lt("\x{1D1BB}", "\x{1D1BC}"));
+ok($L3ignorable->eq("\x{1D1BB}", "\x{1D1B9}"));
+ok($L3ignorable->eq("\x{1D1BC}", "\x{1D1BA}"));
+ok($L3ignorable->eq("\x{1D1BB}", "\x{1D1B9}\x{1D165}"));
+ok($L3ignorable->eq("\x{1D1BC}", "\x{1D1BA}\x{1D165}"));
+
+##### 197..203
+
+my $O_str = Unicode::Collate->new(
+ table => "keys.txt",
+ normalization => undef,
+ entry => <<'ENTRIES',
+0008 ; [*0008.0000.0000.0000] # BACKSPACE (need to be non-ignorable)
+004F 0337 ; [.0B53.0020.0008.004F] # capital O WITH SHORT SOLIDUS OVERLAY
+006F 0008 002F ; [.0B53.0020.0002.006F] # LATIN SMALL LETTER O WITH STROKE
+004F 0008 002F ; [.0B53.0020.0008.004F] # LATIN CAPITAL LETTER O WITH STROKE
+006F 0337 ; [.0B53.0020.0002.004F] # small O WITH SHORT SOLIDUS OVERLAY
+200B ; [.2000.0000.0000.0000] # ZERO WIDTH SPACE (may be non-sense but ...)
+#00F8 ; [.0B53.0020.0002.00F8] # LATIN SMALL LETTER O WITH STROKE
+#00D8 ; [.0B53.0020.0008.00D8] # LATIN CAPITAL LETTER O WITH STROKE
+ENTRIES
+);
+
+my $o_BS_slash = _pack_U(0x006F, 0x0008, 0x002F);
+my $O_BS_slash = _pack_U(0x004F, 0x0008, 0x002F);
+my $o_sol = _pack_U(0x006F, 0x0337);
+my $O_sol = _pack_U(0x004F, 0x0337);
+my $o_stroke = _pack_U(0x00F8);
+my $O_stroke = _pack_U(0x00D8);
+
+ok($O_str->eq($o_stroke, $o_BS_slash));
+ok($O_str->eq($O_stroke, $O_BS_slash));
+
+ok($O_str->eq($o_stroke, $o_sol));
+ok($O_str->eq($O_stroke, $O_sol));
+
+ok($Collator->eq("\x{200B}", "\0"));
+ok($O_str ->gt("\x{200B}", "\0"));
+ok($O_str ->gt("\x{200B}", "A"));
+
+#####
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/trailwt.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/trailwt.t
new file mode 100644
index 00000000000..463252cf1ca
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/trailwt.t
@@ -0,0 +1,229 @@
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 58 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+#########################
+
+ok(1);
+
+# a standard collator (3.1.1)
+my $Collator = Unicode::Collate->new(
+ level => 1,
+ table => 'keys.txt',
+ normalization => undef,
+
+ entry => <<'ENTRIES',
+326E ; [.1831.0020.0006.326E][.188D.0020.0006.326E] # c.h.s. GA
+326F ; [.1833.0020.0006.326F][.188D.0020.0006.326F] # c.h.s. NA
+3270 ; [.1834.0020.0006.3270][.188D.0020.0006.3270] # c.h.s. DA
+3271 ; [.1836.0020.0006.3271][.188D.0020.0006.3271] # c.h.s. RA
+3272 ; [.1837.0020.0006.3272][.188D.0020.0006.3272] # c.h.s. MA
+3273 ; [.1838.0020.0006.3273][.188D.0020.0006.3273] # c.h.s. BA
+3274 ; [.183A.0020.0006.3274][.188D.0020.0006.3274] # c.h.s. SA
+3275 ; [.183C.0020.0006.3275][.188D.0020.0006.3275] # c.h.s. A
+3276 ; [.183D.0020.0006.3276][.188D.0020.0006.3276] # c.h.s. JA
+3277 ; [.183F.0020.0006.3277][.188D.0020.0006.3277] # c.h.s. CA
+3278 ; [.1840.0020.0006.3278][.188D.0020.0006.3278] # c.h.s. KA
+3279 ; [.1841.0020.0006.3279][.188D.0020.0006.3279] # c.h.s. TA
+327A ; [.1842.0020.0006.327A][.188D.0020.0006.327A] # c.h.s. PA
+327B ; [.1843.0020.0006.327B][.188D.0020.0006.327B] # c.h.s. HA
+ENTRIES
+);
+
+my $hangul = Unicode::Collate->new(
+ level => 1,
+ table => 'keys.txt',
+ normalization => undef,
+ hangul_terminator => 16,
+
+ entry => <<'ENTRIES',
+326E ; [.1831.0020.0006.326E][.188D.0020.0006.326E] # c.h.s. GA
+326F ; [.1833.0020.0006.326F][.188D.0020.0006.326F] # c.h.s. NA
+3270 ; [.1834.0020.0006.3270][.188D.0020.0006.3270] # c.h.s. DA
+3271 ; [.1836.0020.0006.3271][.188D.0020.0006.3271] # c.h.s. RA
+3272 ; [.1837.0020.0006.3272][.188D.0020.0006.3272] # c.h.s. MA
+3273 ; [.1838.0020.0006.3273][.188D.0020.0006.3273] # c.h.s. BA
+3274 ; [.183A.0020.0006.3274][.188D.0020.0006.3274] # c.h.s. SA
+3275 ; [.183C.0020.0006.3275][.188D.0020.0006.3275] # c.h.s. A
+3276 ; [.183D.0020.0006.3276][.188D.0020.0006.3276] # c.h.s. JA
+3277 ; [.183F.0020.0006.3277][.188D.0020.0006.3277] # c.h.s. CA
+3278 ; [.1840.0020.0006.3278][.188D.0020.0006.3278] # c.h.s. KA
+3279 ; [.1841.0020.0006.3279][.188D.0020.0006.3279] # c.h.s. TA
+327A ; [.1842.0020.0006.327A][.188D.0020.0006.327A] # c.h.s. PA
+327B ; [.1843.0020.0006.327B][.188D.0020.0006.327B] # c.h.s. HA
+ENTRIES
+);
+
+ok(ref $hangul, "Unicode::Collate");
+
+#########################
+
+# LVX vs LVV: /GAA/ vs /GA/.latinA
+ok($Collator->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}A"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}A"));
+
+# LVX vs LVV: /GAA/ vs /GA/.hiraganaA
+ok($Collator->lt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{3042}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{3042}"));
+
+# LVX vs LVV: /GAA/ vs /GA/.hanja
+ok($Collator->lt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{4E00}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{1161}", "\x{1100}\x{1161}\x{4E00}"));
+
+# LVL vs LVT: /GA/./G/ vs /GAG/
+ok($Collator->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{11A8}"));
+ok($hangul ->lt("\x{1100}\x{1161}\x{1100}", "\x{1100}\x{1161}\x{11A8}"));
+
+# LVT vs LVX: /GAG/ vs /GA/.latinA
+ok($Collator->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}A"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}A"));
+
+# LVT vs LVX: /GAG/ vs /GA/.hiraganaA
+ok($Collator->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{3042}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{3042}"));
+
+# LVT vs LVX: /GAG/ vs /GA/.hanja
+ok($Collator->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+ok($hangul ->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+
+# LV vs Syl(LV): /GA/ vs /[GA]/
+ok($Collator->eq("\x{1100}\x{1161}", "\x{AC00}"));
+ok($hangul ->eq("\x{1100}\x{1161}", "\x{AC00}"));
+
+# LVT vs Syl(LV)T: /GAG/ vs /[GA]G/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+
+# LVT vs Syl(LVT): /GAG/ vs /[GAG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+
+# LVTT vs Syl(LVTT): /GAGG/ vs /[GAGG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A9}", "\x{AC02}"));
+
+# Syl(LVT) vs : /GAG/ vs /[GAG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+ok($hangul ->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+
+#########################
+
+my $hangcirc = Unicode::Collate->new(
+ level => 1,
+ table => 'keys.txt',
+ normalization => undef,
+ hangul_terminator => 16,
+
+ entry => <<'ENTRIES',
+326E ; [.1831.0020.0006.326E][.188D.0020.0006.326E][.10.0.0.0] # c.h.s. GA
+326F ; [.1833.0020.0006.326F][.188D.0020.0006.326F][.10.0.0.0] # c.h.s. NA
+3270 ; [.1834.0020.0006.3270][.188D.0020.0006.3270][.10.0.0.0] # c.h.s. DA
+3271 ; [.1836.0020.0006.3271][.188D.0020.0006.3271][.10.0.0.0] # c.h.s. RA
+3272 ; [.1837.0020.0006.3272][.188D.0020.0006.3272][.10.0.0.0] # c.h.s. MA
+3273 ; [.1838.0020.0006.3273][.188D.0020.0006.3273][.10.0.0.0] # c.h.s. BA
+3274 ; [.183A.0020.0006.3274][.188D.0020.0006.3274][.10.0.0.0] # c.h.s. SA
+3275 ; [.183C.0020.0006.3275][.188D.0020.0006.3275][.10.0.0.0] # c.h.s. A
+3276 ; [.183D.0020.0006.3276][.188D.0020.0006.3276][.10.0.0.0] # c.h.s. JA
+3277 ; [.183F.0020.0006.3277][.188D.0020.0006.3277][.10.0.0.0] # c.h.s. CA
+3278 ; [.1840.0020.0006.3278][.188D.0020.0006.3278][.10.0.0.0] # c.h.s. KA
+3279 ; [.1841.0020.0006.3279][.188D.0020.0006.3279][.10.0.0.0] # c.h.s. TA
+327A ; [.1842.0020.0006.327A][.188D.0020.0006.327A][.10.0.0.0] # c.h.s. PA
+327B ; [.1843.0020.0006.327B][.188D.0020.0006.327B][.10.0.0.0] # c.h.s. HA
+ENTRIES
+);
+
+# LV vs Circled Syl(LV): /GA/ vs /(GA)/
+ok($Collator->eq("\x{1100}\x{1161}", "\x{326E}"));
+ok($hangul ->gt("\x{1100}\x{1161}", "\x{326E}"));
+ok($hangcirc->eq("\x{1100}\x{1161}", "\x{326E}"));
+
+# LV vs Circled Syl(LV): followed by latin A
+ok($Collator->eq("\x{1100}\x{1161}A", "\x{326E}A"));
+ok($hangul ->lt("\x{1100}\x{1161}A", "\x{326E}A"));
+ok($hangcirc->eq("\x{1100}\x{1161}A", "\x{326E}A"));
+
+# LV vs Circled Syl(LV): followed by hiragana A
+ok($Collator->eq("\x{1100}\x{1161}\x{3042}", "\x{326E}\x{3042}"));
+ok($hangul ->lt("\x{1100}\x{1161}\x{3042}", "\x{326E}\x{3042}"));
+ok($hangcirc->eq("\x{1100}\x{1161}\x{3042}", "\x{326E}\x{3042}"));
+
+# LVT vs LVX: /GAG/ vs /GA/.hanja
+ok($Collator->eq("\x{1100}\x{1161}\x{4E00}", "\x{326E}\x{4E00}"));
+ok($hangul ->lt("\x{1100}\x{1161}\x{4E00}", "\x{326E}\x{4E00}"));
+ok($hangcirc->eq("\x{1100}\x{1161}\x{4E00}", "\x{326E}\x{4E00}"));
+
+#########################
+
+# checks contraction in LVT:
+# weights of these contractions may be non-sense.
+
+my $hangcont = Unicode::Collate->new(
+ level => 1,
+ table => 'keys.txt',
+ normalization => undef,
+ hangul_terminator => 16,
+
+ entry => <<'ENTRIES',
+1100 1161 ; [.1831.0020.0002.1100][.188D.0020.0002.1161] # KIYEOK+A
+1161 11A8 ; [.188D.0020.0002.1161][.18CF.0020.0002.11A8] # A+KIYEOK
+ENTRIES
+);
+
+# cont<LV> vs Syl(LV): /<GA>/ vs /[GA]/
+ok($Collator->eq("\x{1100}\x{1161}", "\x{AC00}"));
+ok($hangcont->eq("\x{1100}\x{1161}", "\x{AC00}"));
+
+# cont<LV>.T vs Syl(LV).T: /<GA>G/ vs /[GA]G/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+ok($hangcont->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC00}\x{11A8}"));
+
+# cont<LV>.T vs Syl(LVT): /<GA>G/ vs /[GAG]/
+ok($Collator->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+ok($hangcont->eq("\x{1100}\x{1161}\x{11A8}", "\x{AC01}"));
+
+# L.cont<VT> vs Syl(LV).T: /D<AG>/ vs /[DA]G/
+ok($Collator->eq("\x{1103}\x{1161}\x{11A8}", "\x{B2E4}\x{11A8}"));
+ok($hangcont->eq("\x{1103}\x{1161}\x{11A8}", "\x{B2E4}\x{11A8}"));
+
+# L.cont<VT> vs Syl(LVT): /D<AG>/ vs /[DAG]/
+ok($Collator->eq("\x{1103}\x{1161}\x{11A8}", "\x{B2E5}"));
+ok($hangcont->eq("\x{1103}\x{1161}\x{11A8}", "\x{B2E5}"));
+
+#####
+
+$Collator->change(hangul_terminator => 16);
+
+ok($Collator->gt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+ok($Collator->gt("\x{1100}\x{1161}", "\x{326E}"));
+ok($Collator->lt("\x{1100}\x{1161}A", "\x{326E}A"));
+ok($Collator->lt("\x{1100}\x{1161}\x{3042}", "\x{326E}\x{3042}"));
+ok($Collator->lt("\x{1100}\x{1161}\x{4E00}", "\x{326E}\x{4E00}"));
+
+$Collator->change(hangul_terminator => 0);
+
+ok($Collator->lt("\x{1100}\x{1161}\x{11A8}", "\x{1100}\x{1161}\x{4E00}"));
+ok($Collator->eq("\x{1100}\x{1161}", "\x{326E}"));
+ok($Collator->eq("\x{1100}\x{1161}A", "\x{326E}A"));
+ok($Collator->eq("\x{1100}\x{1161}\x{3042}", "\x{326E}\x{3042}"));
+ok($Collator->eq("\x{1100}\x{1161}\x{4E00}", "\x{326E}\x{4E00}"));
+
+1;
+__END__
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/variable.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/variable.t
new file mode 100644
index 00000000000..880327a6bdd
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/variable.t
@@ -0,0 +1,108 @@
+
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 37 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+ok(1);
+
+#########################
+
+sub _pack_U { Unicode::Collate::pack_U(@_) }
+sub _unpack_U { Unicode::Collate::unpack_U(@_) }
+
+my $A_acute = _pack_U(0xC1);
+my $acute = _pack_U(0x0301);
+
+my $Collator = Unicode::Collate->new(
+ table => 'keys.txt',
+ normalization => undef,
+);
+
+my %origVar = $Collator->change(variable => 'Blanked');
+
+ok($Collator->lt("death", "de luge"));
+ok($Collator->lt("de luge", "de-luge"));
+ok($Collator->lt("de-luge", "deluge"));
+ok($Collator->lt("deluge", "de\x{2010}luge"));
+ok($Collator->lt("deluge", "de Luge"));
+
+$Collator->change(variable => 'Non-ignorable');
+
+ok($Collator->lt("de luge", "de Luge"));
+ok($Collator->lt("de Luge", "de-luge"));
+ok($Collator->lt("de-Luge", "de\x{2010}luge"));
+ok($Collator->lt("de-luge", "death"));
+ok($Collator->lt("death", "deluge"));
+
+$Collator->change(variable => 'Shifted');
+
+ok($Collator->lt("death", "de luge"));
+ok($Collator->lt("de luge", "de-luge"));
+ok($Collator->lt("de-luge", "deluge"));
+ok($Collator->lt("deluge", "de Luge"));
+ok($Collator->lt("de Luge", "deLuge"));
+
+$Collator->change(variable => 'Shift-Trimmed');
+
+ok($Collator->lt("death", "deluge"));
+ok($Collator->lt("deluge", "de luge"));
+ok($Collator->lt("de luge", "de-luge"));
+ok($Collator->lt("de-luge", "deLuge"));
+ok($Collator->lt("deLuge", "de Luge"));
+
+$Collator->change(%origVar);
+
+ok($Collator->{variable}, 'shifted');
+
+##############
+
+# ignorable after variable
+
+# Shifted;
+ok($Collator->eq("?\x{300}!\x{301}\x{315}", "?!"));
+ok($Collator->eq("?\x{300}A\x{301}", "?$A_acute"));
+ok($Collator->eq("?\x{300}", "?"));
+ok($Collator->eq("?\x{344}", "?")); # U+0344 has two CEs.
+
+$Collator->change(level => 3);
+ok($Collator->eq("\cA", "?"));
+
+$Collator->change(variable => 'blanked', level => 4);
+ok($Collator->eq("?\x{300}!\x{301}\x{315}", "?!"));
+ok($Collator->eq("?\x{300}A\x{301}", "?$A_acute"));
+ok($Collator->eq("?\x{300}", "?"));
+ok($Collator->eq("?\x{344}", "?")); # U+0344 has two CEs.
+
+$Collator->change(level => 3);
+ok($Collator->eq("\cA", "?"));
+
+$Collator->change(variable => 'Non-ignorable', level => 4);
+
+ok($Collator->lt("?\x{300}", "?!"));
+ok($Collator->gt("?\x{300}A$acute", "?$A_acute"));
+ok($Collator->gt("?\x{300}", "?"));
+ok($Collator->gt("?\x{344}", "?"));
+
+$Collator->change(level => 3);
+ok($Collator->lt("\cA", "?"));
+
+$Collator->change(variable => 'Shifted', level => 4);
+
diff --git a/gnu/usr.bin/perl/lib/Unicode/Collate/t/version.t b/gnu/usr.bin/perl/lib/Unicode/Collate/t/version.t
new file mode 100644
index 00000000000..0a6d448e1e3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/Unicode/Collate/t/version.t
@@ -0,0 +1,61 @@
+
+BEGIN {
+ unless ("A" eq pack('U', 0x41)) {
+ print "1..0 # Unicode::Collate " .
+ "cannot stringify a Unicode code point\n";
+ exit 0;
+ }
+}
+
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir('t') if -d 't';
+ @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
+ }
+}
+
+use Test;
+BEGIN { plan tests => 17 };
+
+use strict;
+use warnings;
+use Unicode::Collate;
+
+ok(1);
+
+#########################
+
+# Fix me when UCA and/or key.txt is upgraded.
+my $UCA_Version = "11";
+my $Base_Unicode_Version = "4.0";
+my $Key_Version = "3.1.1";
+
+ok(Unicode::Collate::UCA_Version, $UCA_Version);
+ok(Unicode::Collate->UCA_Version, $UCA_Version);
+ok(Unicode::Collate::Base_Unicode_Version, $Base_Unicode_Version);
+ok(Unicode::Collate->Base_Unicode_Version, $Base_Unicode_Version);
+
+my $Collator = Unicode::Collate->new(
+ table => 'keys.txt',
+ normalization => undef,
+);
+
+ok($Collator->UCA_Version, $UCA_Version);
+ok($Collator->UCA_Version(), $UCA_Version);
+ok($Collator->Base_Unicode_Version, $Base_Unicode_Version);
+ok($Collator->Base_Unicode_Version(), $Base_Unicode_Version);
+ok($Collator->version, $Key_Version);
+ok($Collator->version(), $Key_Version);
+
+my $UndefTable = Unicode::Collate->new(
+ table => undef,
+ normalization => undef,
+);
+
+ok($UndefTable->UCA_Version, $UCA_Version);
+ok($UndefTable->UCA_Version(), $UCA_Version);
+ok($UndefTable->Base_Unicode_Version, $Base_Unicode_Version);
+ok($UndefTable->Base_Unicode_Version(), $Base_Unicode_Version);
+ok($UndefTable->version, "unknown");
+ok($UndefTable->version(), "unknown");
+
diff --git a/gnu/usr.bin/perl/lib/Unicode/UCD.pm b/gnu/usr.bin/perl/lib/Unicode/UCD.pm
index 96dee9a8164..baafd1a2579 100644
--- a/gnu/usr.bin/perl/lib/Unicode/UCD.pm
+++ b/gnu/usr.bin/perl/lib/Unicode/UCD.pm
@@ -3,7 +3,9 @@ package Unicode::UCD;
use strict;
use warnings;
-our $VERSION = '0.2';
+our $VERSION = '0.21';
+
+use Storable qw(dclone);
require Exporter;
@@ -31,7 +33,7 @@ Unicode::UCD - Unicode character database
my $charblock = charblock($codepoint);
use Unicode::UCD 'charscript';
- my $charscript = charblock($codepoint);
+ my $charscript = charscript($codepoint);
use Unicode::UCD 'charblocks';
my $charblocks = charblocks();
@@ -126,9 +128,9 @@ you will need also the compexcl(), casefold(), and casespec() functions.
sub _getcode {
my $arg = shift;
- if ($arg =~ /^\d+$/) {
+ if ($arg =~ /^[1-9]\d*$/) {
return $arg;
- } elsif ($arg =~ /^(?:U\+|0x)?([[:xdigit:]]+)$/) {
+ } elsif ($arg =~ /^(?:[Uu]\+|0[xX])?([[:xdigit:]]+)$/) {
return hex($1);
}
@@ -209,6 +211,7 @@ sub charinfo {
use Search::Dict 1.02;
if (look($UNICODEFH, "$hexk;", { xfrm => sub { $_[0] =~ /^([^;]+);(.+)/; sprintf "%06X;$2", hex($1) } } ) >= 0) {
my $line = <$UNICODEFH>;
+ return unless defined $line;
chomp $line;
my %prop;
@prop{qw(
@@ -295,6 +298,7 @@ my %BLOCKS;
sub _charblocks {
unless (@BLOCKS) {
if (openunicode(\$BLOCKSFH, "Blocks.txt")) {
+ local $_;
while (<$BLOCKSFH>) {
if (/^([0-9A-F]+)\.\.([0-9A-F]+);\s+(.+)/) {
my ($lo, $hi) = (hex($1), hex($2));
@@ -319,7 +323,7 @@ sub charblock {
_search(\@BLOCKS, 0, $#BLOCKS, $code);
} else {
if (exists $BLOCKS{$arg}) {
- return $BLOCKS{$arg};
+ return dclone $BLOCKS{$arg};
} else {
return;
}
@@ -356,6 +360,7 @@ my %SCRIPTS;
sub _charscripts {
unless (@SCRIPTS) {
if (openunicode(\$SCRIPTSFH, "Scripts.txt")) {
+ local $_;
while (<$SCRIPTSFH>) {
if (/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s+;\s+(\w+)/) {
my ($lo, $hi) = (hex($1), $2 ? hex($2) : hex($1));
@@ -383,7 +388,7 @@ sub charscript {
_search(\@SCRIPTS, 0, $#SCRIPTS, $code);
} else {
if (exists $SCRIPTS{$arg}) {
- return $SCRIPTS{$arg};
+ return dclone $SCRIPTS{$arg};
} else {
return;
}
@@ -405,7 +410,7 @@ See also L</Blocks versus Scripts>.
sub charblocks {
_charblocks() unless %BLOCKS;
- return \%BLOCKS;
+ return dclone \%BLOCKS;
}
=head2 charscripts
@@ -423,7 +428,7 @@ See also L</Blocks versus Scripts>.
sub charscripts {
_charscripts() unless %SCRIPTS;
- return \%SCRIPTS;
+ return dclone \%SCRIPTS;
}
=head2 Blocks versus Scripts
@@ -455,9 +460,12 @@ any of the 256 code points in the Tibetan block).
A I<code point argument> is either a decimal or a hexadecimal scalar
designating a Unicode character, or C<U+> followed by hexadecimals
-designating a Unicode character. Note that Unicode is B<not> limited
-to 16 bits (the number of Unicode characters is open-ended, in theory
-unlimited): you may have more than 4 hexdigits.
+designating a Unicode character. In other words, if you want a code
+point to be interpreted as a hexadecimal number, you must prefix it
+with either C<0x> or C<U+>, because a string like e.g. C<123> will
+be interpreted as a decimal code point. Also note that Unicode is
+B<not> limited to 16 bits (the number of Unicode characters is
+open-ended, in theory unlimited): you may have more than 4 hexdigits.
=head2 charinrange
@@ -493,6 +501,7 @@ my %COMPEXCL;
sub _compexcl {
unless (%COMPEXCL) {
if (openunicode(\$COMPEXCLFH, "CompositionExclusions.txt")) {
+ local $_;
while (<$COMPEXCLFH>) {
if (/^([0-9A-F]+)\s+\#\s+/) {
my $code = hex($1);
@@ -519,7 +528,7 @@ sub compexcl {
use Unicode::UCD 'casefold';
- my %casefold = casefold("09dc");
+ my $casefold = casefold("00DF");
The casefold() returns the locale-independent case folding of the
character specified by a B<code point argument>.
@@ -563,6 +572,7 @@ my %CASEFOLD;
sub _casefold {
unless (%CASEFOLD) {
if (openunicode(\$CASEFOLDFH, "CaseFolding.txt")) {
+ local $_;
while (<$CASEFOLDFH>) {
if (/^([0-9A-F]+); ([CFSI]); ([0-9A-F]+(?: [0-9A-F]+)*);/) {
my $code = hex($1);
@@ -591,7 +601,7 @@ sub casefold {
use Unicode::UCD 'casespec';
- my %casespec = casespec("09dc");
+ my $casespec = casespec("FB00");
The casespec() returns the potentially locale-dependent case mapping
of the character specified by a B<code point argument>. The mapping
@@ -614,7 +624,7 @@ more I<locales> or I<contexts>, separated by spaces (other than as
used to separate elements, spaces are to be ignored). A condition
list overrides the normal behavior if all of the listed conditions are
true. Case distinctions in the condition list are not significant.
-Conditions preceded by "NON_" represent the negation of the condition
+Conditions preceded by "NON_" represent the negation of the condition.
Note that when there are multiple case folding definitions for a
single code point because of different locales, the value returned by
@@ -643,6 +653,7 @@ my %CASESPEC;
sub _casespec {
unless (%CASESPEC) {
if (openunicode(\$CASESPECFH, "SpecialCasing.txt")) {
+ local $_;
while (<$CASESPECFH>) {
if (/^([0-9A-F]+); ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; (\w+(?: \w+)*)?/) {
my ($hexcode, $lower, $title, $upper, $condition) =
@@ -701,7 +712,7 @@ sub casespec {
_casespec() unless %CASESPEC;
- return $CASESPEC{$code};
+ return ref $CASESPEC{$code} ? dclone $CASESPEC{$code} : $CASESPEC{$code};
}
=head2 Unicode::UCD::UnicodeVersion
diff --git a/gnu/usr.bin/perl/lib/Unicode/UCD.t b/gnu/usr.bin/perl/lib/Unicode/UCD.t
index 9082057bbd1..067172d1b54 100644
--- a/gnu/usr.bin/perl/lib/Unicode/UCD.t
+++ b/gnu/usr.bin/perl/lib/Unicode/UCD.t
@@ -12,7 +12,7 @@ use strict;
use Unicode::UCD;
use Test::More;
-BEGIN { plan tests => 162 };
+BEGIN { plan tests => 179 };
use Unicode::UCD 'charinfo';
@@ -232,7 +232,7 @@ ok( charinrange($ranges, "13a0"));
ok( charinrange($ranges, "13f4"));
ok(!charinrange($ranges, "13f5"));
-is(Unicode::UCD::UnicodeVersion, '3.2.0', 'UnicodeVersion');
+is(Unicode::UCD::UnicodeVersion, '4.0.0', 'UnicodeVersion');
use Unicode::UCD qw(compexcl);
@@ -277,5 +277,38 @@ ok($casespec->{az}->{code} eq '0307' &&
$casespec->{az}->{lower} eq '' &&
$casespec->{az}->{title} eq '0307' &&
$casespec->{az}->{upper} eq '0307' &&
- $casespec->{az}->{condition} eq 'az After_Soft_Dotted',
+ $casespec->{az}->{condition} eq 'az After_I',
'casespec 0x307');
+
+# perl #7305 UnicodeCD::compexcl is weird
+
+for (1) {$a=compexcl $_}
+ok(1, 'compexcl read-only $_: perl #7305');
+grep {compexcl $_} %{{1=>2}};
+ok(1, 'compexcl read-only hash: perl #7305');
+
+is(Unicode::UCD::_getcode('123'), 123, "_getcode(123)");
+is(Unicode::UCD::_getcode('0123'), 0x123, "_getcode(0123)");
+is(Unicode::UCD::_getcode('0x123'), 0x123, "_getcode(0x123)");
+is(Unicode::UCD::_getcode('0X123'), 0x123, "_getcode(0X123)");
+is(Unicode::UCD::_getcode('U+123'), 0x123, "_getcode(U+123)");
+is(Unicode::UCD::_getcode('u+123'), 0x123, "_getcode(u+123)");
+is(Unicode::UCD::_getcode('U+1234'), 0x1234, "_getcode(U+1234)");
+is(Unicode::UCD::_getcode('U+12345'), 0x12345, "_getcode(U+12345)");
+is(Unicode::UCD::_getcode('123x'), undef, "_getcode(123x)");
+is(Unicode::UCD::_getcode('x123'), undef, "_getcode(x123)");
+is(Unicode::UCD::_getcode('0x123x'), undef, "_getcode(x123)");
+is(Unicode::UCD::_getcode('U+123x'), undef, "_getcode(x123)");
+
+{
+ my $r1 = charscript('Latin');
+ my $n1 = @$r1;
+ is($n1, 26, "26 ranges in Latin script (Unicode 4.0.0)");
+ shift @$r1 while @$r1;
+ my $r2 = charscript('Latin');
+ is(@$r2, $n1, "modifying results should not mess up internal caches");
+}
+
+{
+ is(charinfo(0xdeadbeef), undef, "[perl #23273] warnings in Unicode::UCD");
+} \ No newline at end of file
diff --git a/gnu/usr.bin/perl/lib/Win32.pod b/gnu/usr.bin/perl/lib/Win32.pod
index a1bae2d9ca6..d0a62633e61 100644
--- a/gnu/usr.bin/perl/lib/Win32.pod
+++ b/gnu/usr.bin/perl/lib/Win32.pod
@@ -112,6 +112,63 @@ $ENV{PROCESSOR_ARCHITECTURE}. This might not work on Win9X.
does not return a UNC path, since the functionality required for such
a feature is not available under Windows 95.
+=item Win32::GetFolderPath(FOLDER [, CREATE])
+
+[EXT] Returns the full pathname of one of the Windows special folders.
+The folder will be created if it doesn't exist and the optional CREATE
+argument is true. The following FOLDER constants are defined by the
+Win32 module, but only exported on demand:
+
+ CSIDL_ADMINTOOLS
+ CSIDL_APPDATA
+ CSIDL_CDBURN_AREA
+ CSIDL_COMMON_ADMINTOOLS
+ CSIDL_COMMON_APPDATA
+ CSIDL_COMMON_DESKTOPDIRECTORY
+ CSIDL_COMMON_DOCUMENTS
+ CSIDL_COMMON_FAVORITES
+ CSIDL_COMMON_MUSIC
+ CSIDL_COMMON_PICTURES
+ CSIDL_COMMON_PROGRAMS
+ CSIDL_COMMON_STARTMENU
+ CSIDL_COMMON_STARTUP
+ CSIDL_COMMON_TEMPLATES
+ CSIDL_COMMON_VIDEO
+ CSIDL_COOKIES
+ CSIDL_DESKTOP
+ CSIDL_DESKTOPDIRECTORY
+ CSIDL_FAVORITES
+ CSIDL_FONTS
+ CSIDL_HISTORY
+ CSIDL_INTERNET_CACHE
+ CSIDL_LOCAL_APPDATA
+ CSIDL_MYMUSIC
+ CSIDL_MYPICTURES
+ CSIDL_MYVIDEO
+ CSIDL_NETHOOD
+ CSIDL_PERSONAL
+ CSIDL_PRINTHOOD
+ CSIDL_PROFILE
+ CSIDL_PROGRAMS
+ CSIDL_PROGRAM_FILES
+ CSIDL_PROGRAM_FILES_COMMON
+ CSIDL_RECENT
+ CSIDL_RESOURCES
+ CSIDL_RESOURCES_LOCALIZED
+ CSIDL_SENDTO
+ CSIDL_STARTMENU
+ CSIDL_STARTUP
+ CSIDL_SYSTEM
+ CSIDL_TEMPLATES
+ CSIDL_WINDOWS
+
+Note that not all folders are defined on all versions of Windows.
+
+Please refer to the MSDN documentation of the CSIDL constants,
+currently available at:
+
+http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
+
=item Win32::GetFullPathName(FILENAME)
[CORE] GetFullPathName combines the FILENAME with the current drive
@@ -148,12 +205,12 @@ available drive letter.
=item Win32::GetOSVersion()
-[CORE] Returns the array (STRING, MAJOR, MINOR, BUILD, ID), where the
+[CORE] Returns the list (STRING, MAJOR, MINOR, BUILD, ID), where the
elements are, respectively: An arbitrary descriptive string, the major
version number of the operating system, the minor version number, the
build number, and a digit indicating the actual operating system.
-For the ID, the values are 0 for Win32s, 1 for Windows 9X and 2 for
-Windows NT/2000/XP. In scalar context it returns just the ID.
+For the ID, the values are 0 for Win32s, 1 for Windows 9X/Me and 2 for
+Windows NT/2000/XP/2003. In scalar context it returns just the ID.
Currently known values for ID MAJOR and MINOR are as follows:
@@ -166,10 +223,41 @@ Currently known values for ID MAJOR and MINOR are as follows:
Windows NT 4 2 4 0
Windows 2000 2 5 0
Windows XP 2 5 1
- Windows .NET Server 2 5 1
-
-Unfortunately as of June 2002 there is no way to distinguish between
-.NET servers and XP servers without using additional modules.
+ Windows Server 2003 2 5 2
+
+On Windows NT 4 SP6 and later this function returns the following
+additional values: SPMAJOR, SPMINOR, SUITEMASK, PRODUCTTYPE.
+
+SPMAJOR and SPMINOR are are the version numbers of the latest
+installed service pack.
+
+SUITEMASK is a bitfield identifying the product suites available on
+the system. Known bits are:
+
+ VER_SUITE_SMALLBUSINESS 0x00000001
+ VER_SUITE_ENTERPRISE 0x00000002
+ VER_SUITE_BACKOFFICE 0x00000004
+ VER_SUITE_COMMUNICATIONS 0x00000008
+ VER_SUITE_TERMINAL 0x00000010
+ VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
+ VER_SUITE_EMBEDDEDNT 0x00000040
+ VER_SUITE_DATACENTER 0x00000080
+ VER_SUITE_SINGLEUSERTS 0x00000100
+ VER_SUITE_PERSONAL 0x00000200
+ VER_SUITE_BLADE 0x00000400
+ VER_SUITE_EMBEDDED_RESTRICTED 0x00000800
+ VER_SUITE_SECURITY_APPLIANCE 0x00001000
+
+The VER_SUITE_xxx names are listed here to crossreference the Microsoft
+documentation. The Win32 module does not provide symbolic names for these
+constants.
+
+PRODUCTTYPE provides additional information about the system. It should
+be one of the following integer values:
+
+ 1 - Workstation (NT 4, 2000 Pro, XP Home, XP Pro)
+ 2 - Domaincontroller
+ 3 - Server
=item Win32::GetOSName()
@@ -182,7 +270,7 @@ GetOSVersion() in list context.
Currently the possible values for the OS name are
- Win32s Win95 Win98 WinMe Win2000 WinXP/.Net WinNT3.51 WinNT4
+ Win32s Win95 Win98 WinMe WinNT3.51 WinNT4 Win2000 WinXP/.Net Win2003
This routine is just a simple interface into GetOSVersion(). More
specific or demanding situations should use that instead. Another
@@ -190,6 +278,11 @@ option would be to use POSIX::uname(), however the latter appears to
report only the OS family name and not the specific OS. In scalar
context it returns just the ID.
+The name "WinXP/.Net" is used for historical reasons only, to maintain
+backwards compatibility of the Win32 module. Windows .NET Server has
+been renamed as Windows 2003 Server before final release and uses a
+different major/minor version number than Windows XP.
+
=item Win32::GetShortPathName(PATHNAME)
[CORE] Returns a representation of PATHNAME composed only of
diff --git a/gnu/usr.bin/perl/lib/attributes.pm b/gnu/usr.bin/perl/lib/attributes.pm
index 2dacd02751e..714cb267218 100644
--- a/gnu/usr.bin/perl/lib/attributes.pm
+++ b/gnu/usr.bin/perl/lib/attributes.pm
@@ -1,6 +1,6 @@
package attributes;
-our $VERSION = 0.05;
+our $VERSION = 0.06;
@EXPORT_OK = qw(get reftype);
@EXPORT = ();
@@ -165,6 +165,10 @@ The following are the built-in attributes for subroutines:
=item locked
+B<5.005 threads only! The use of the "locked" attribute currently
+only makes sense if you are using the deprecated "Perl 5.005 threads"
+implementation of threads.>
+
Setting this attribute is only meaningful when the subroutine or
method is to be called by multiple threads. When set on a method
subroutine (i.e., one marked with the B<method> attribute below),
@@ -261,7 +265,7 @@ This list may be empty.
This method is called with two fixed arguments, followed by the list of
attributes from the relevant declaration. The two fixed arguments are
the relevant package name and a reference to the declared subroutine or
-variable. The expected return value as a list of attributes which were
+variable. The expected return value is a list of attributes which were
not recognized by this handler. Note that this allows for a derived class
to delegate a call to its base class, and then only examine the attributes
which the base class didn't already handle for it.
diff --git a/gnu/usr.bin/perl/lib/base/t/base.t b/gnu/usr.bin/perl/lib/base/t/base.t
new file mode 100644
index 00000000000..0ddd238439c
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/base/t/base.t
@@ -0,0 +1,80 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 10;
+
+use_ok('base');
+
+
+package No::Version;
+
+use vars qw($Foo);
+sub VERSION { 42 }
+
+package Test::Version;
+
+use base qw(No::Version);
+::ok( $No::Version::VERSION =~ /set by base\.pm/, '$VERSION bug' );
+
+# Test Inverse of $VERSION bug base.pm should not clobber existing $VERSION
+package Has::Version;
+
+BEGIN { $Has::Version::VERSION = '42' };
+
+package Test::Version2;
+
+use base qw(Has::Version);
+::is( $Has::Version::VERSION, 42 );
+
+package main;
+
+my $eval1 = q{
+ {
+ package Eval1;
+ {
+ package Eval2;
+ use base 'Eval1';
+ $Eval2::VERSION = "1.02";
+ }
+ $Eval1::VERSION = "1.01";
+ }
+};
+
+eval $eval1;
+is( $@, '' );
+
+is( $Eval1::VERSION, 1.01 );
+
+is( $Eval2::VERSION, 1.02 );
+
+
+eval q{use base 'reallyReAlLyNotexists'};
+like( $@, qr/^Base class package "reallyReAlLyNotexists" is empty./,
+ 'base with empty package');
+
+eval q{use base 'reallyReAlLyNotexists'};
+like( $@, qr/^Base class package "reallyReAlLyNotexists" is empty./,
+ ' still empty on 2nd load');
+
+BEGIN { $Has::Version_0::VERSION = 0 }
+
+package Test::Version3;
+
+use base qw(Has::Version_0);
+::is( $Has::Version_0::VERSION, 0, '$VERSION==0 preserved' );
+
+
+package Test::SIGDIE;
+
+{
+ local $SIG{__DIE__} = sub {
+ ::fail('sigdie not caught, this test should not run')
+ };
+ eval {
+ 'base'->import(qw(Huh::Boo));
+ };
+
+ ::like($@, qr/^Base class package "Huh::Boo" is empty/,
+ 'Base class empty error message');
+
+}
diff --git a/gnu/usr.bin/perl/lib/base/t/fields-base.t b/gnu/usr.bin/perl/lib/base/t/fields-base.t
new file mode 100644
index 00000000000..b5ab54f7cb4
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/base/t/fields-base.t
@@ -0,0 +1,196 @@
+#!/usr/bin/perl -w
+
+my $Has_PH;
+BEGIN {
+ $Has_PH = $] < 5.009;
+}
+
+my $W;
+
+BEGIN {
+ $W = 0;
+ $SIG{__WARN__} = sub {
+ if ($_[0] =~ /^Hides field '.*?' in base class/) {
+ $W++;
+ }
+ else {
+ warn $_[0];
+ }
+ };
+}
+
+use strict;
+use Test::More tests => 25;
+
+BEGIN { use_ok('base'); }
+
+package B1;
+use fields qw(b1 b2 b3);
+
+package B2;
+use fields '_b1';
+use fields qw(b1 _b2 b2);
+
+sub new { fields::new(shift) }
+
+package B3;
+use fields qw(b4 _b5 b6 _b7);
+
+package D1;
+use base 'B1';
+use fields qw(d1 d2 d3);
+
+package D2;
+use base 'B1';
+use fields qw(_d1 _d2);
+use fields qw(d1 d2);
+
+
+package D3;
+use base 'B2';
+use fields qw(b1 d1 _b1 _d1); # hide b1
+
+package D4;
+use base 'D3';
+use fields qw(_d3 d3);
+
+package M;
+sub m {}
+
+package D5;
+use base qw(M B2);
+
+# Test that multiple inheritance fails.
+package D6;
+eval { 'base'->import(qw(B2 M B3)); };
+::like($@, qr/can't multiply inherit %FIELDS/i,
+ 'No multiple field inheritance');
+
+package Foo::Bar;
+use base 'B1';
+
+package Foo::Bar::Baz;
+use base 'Foo::Bar';
+use fields qw(foo bar baz);
+
+# Test repeatability for when modules get reloaded.
+package B1;
+use fields qw(b1 b2 b3);
+
+package D3;
+use base 'B2';
+use fields qw(b1 d1 _b1 _d1); # hide b1
+
+
+# Test that a package with only private fields gets inherited properly
+package B7;
+use fields qw(_b1);
+
+package D7;
+use base qw(B7);
+use fields qw(b1);
+
+
+# Test that an intermediate package with no fields doesn't cause a problem.
+package B8;
+use fields qw(_b1);
+
+package D8;
+use base qw(B8);
+
+package D8A;
+use base qw(D8);
+use fields qw(b1);
+
+
+package main;
+
+my %EXPECT = (
+ B1 => [qw(b1 b2 b3)],
+ D1 => [qw(b1 b2 b3 d1 d2 d3)],
+ D2 => [qw(b1 b2 b3 _d1 _d2 d1 d2)],
+
+ M => [qw()],
+ B2 => [qw(_b1 b1 _b2 b2)],
+ D3 => [(undef,undef,undef,
+ qw(b2 b1 d1 _b1 _d1))], # b1 is hidden
+ D4 => [(undef,undef,undef,
+ qw(b2 b1 d1),undef,undef,qw(_d3 d3))],
+
+ D5 => [undef, 'b1', undef, 'b2'],
+
+ B3 => [qw(b4 _b5 b6 _b7)],
+
+ B7 => [qw(_b1)],
+ D7 => [undef, 'b1'],
+
+ B8 => [qw(_b1)],
+ D8 => [undef],
+ D8A => [undef, 'b1'],
+
+ 'Foo::Bar' => [qw(b1 b2 b3)],
+ 'Foo::Bar::Baz' => [qw(b1 b2 b3 foo bar baz)],
+ );
+
+while(my($class, $efields) = each %EXPECT) {
+ no strict 'refs';
+ my %fields = %{$class.'::FIELDS'};
+ my %expected_fields;
+ foreach my $idx (1..@$efields) {
+ my $key = $efields->[$idx-1];
+ next unless $key;
+ $expected_fields{$key} = $idx;
+ }
+
+ ::is_deeply(\%fields, \%expected_fields, "%FIELDS check: $class");
+}
+
+# Did we get the appropriate amount of warnings?
+is( $W, 1, 'right warnings' );
+
+
+# A simple object creation and attribute access test
+my B2 $obj1 = D3->new;
+$obj1->{b1} = "B2";
+my D3 $obj2 = $obj1;
+$obj2->{b1} = "D3";
+
+# We should get compile time failures field name typos
+eval q(my D3 $obj3 = $obj2; $obj3->{notthere} = "");
+if( $Has_PH ) {
+ like $@,
+ qr/^No such pseudo-hash field "notthere" in variable \$obj3 of type D3/;
+}
+else {
+ like $@,
+ qr/^Attempt to access disallowed key 'notthere' in a restricted hash/;
+}
+
+# Slices
+@$obj1{"_b1", "b1"} = (17, 29);
+is( $obj1->{_b1}, 17 );
+is( $obj1->{b1}, 29 );
+
+@$obj1{'_b1', 'b1'} = (44,28);
+is( $obj1->{_b1}, 44 );
+is( $obj1->{b1}, 28 );
+
+
+
+# Break multiple inheritance with a field name clash.
+package E1;
+use fields qw(yo this _lah meep 42);
+
+package E2;
+use fields qw(_yo ahhh this);
+
+eval {
+ package Broken;
+
+ # The error must occur at run time for the eval to catch it.
+ require base;
+ 'base'->import(qw(E1 E2));
+};
+::like( $@, qr/Can't multiply inherit %FIELDS/i, 'Again, no multi inherit' );
+
+
diff --git a/gnu/usr.bin/perl/lib/base/t/fields.t b/gnu/usr.bin/perl/lib/base/t/fields.t
new file mode 100644
index 00000000000..9ddae34c112
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/base/t/fields.t
@@ -0,0 +1,112 @@
+#!/usr/bin/perl -w
+
+my $Has_PH;
+BEGIN {
+ $Has_PH = $] < 5.009;
+}
+
+use strict;
+use Test::More tests => 16;
+
+BEGIN { use_ok('fields'); }
+
+
+package Foo;
+
+use fields qw(_no Pants who _up_yours);
+use fields qw(what);
+
+sub new { fields::new(shift) }
+sub magic_new { bless [] } # Doesn't 100% work, perl's problem.
+
+package main;
+
+is_deeply( [sort keys %Foo::FIELDS],
+ [sort qw(_no Pants who _up_yours what)]
+);
+
+sub show_fields {
+ my($base, $mask) = @_;
+ no strict 'refs';
+ my $fields = \%{$base.'::FIELDS'};
+ return grep { ($fields::attr{$base}[$fields->{$_}] & $mask) == $mask}
+ keys %$fields;
+}
+
+is_deeply( [sort &show_fields('Foo', fields::PUBLIC)],
+ [sort qw(Pants who what)]);
+is_deeply( [sort &show_fields('Foo', fields::PRIVATE)],
+ [sort qw(_no _up_yours)]);
+
+# We should get compile time failures field name typos
+eval q(my Foo $obj = Foo->new; $obj->{notthere} = "");
+
+my $error = $Has_PH ? 'No such(?: [\w-]+)? field "notthere"'
+ : q[Attempt to access disallowed key 'notthere' in a ].
+ q[restricted hash at ];
+ok( $@ && $@ =~ /^$error/i );
+
+
+foreach (Foo->new) {
+ my Foo $obj = $_;
+ my %test = ( Pants => 'Whatever', _no => 'Yeah',
+ what => 'Ahh', who => 'Moo',
+ _up_yours => 'Yip' );
+
+ $obj->{Pants} = 'Whatever';
+ $obj->{_no} = 'Yeah';
+ @{$obj}{qw(what who _up_yours)} = ('Ahh', 'Moo', 'Yip');
+
+ while(my($k,$v) = each %test) {
+ ok($obj->{$k} eq $v);
+ }
+}
+
+{
+ local $SIG{__WARN__} = sub {
+ return if $_[0] =~ /^Pseudo-hashes are deprecated/
+ };
+ my $phash;
+ eval { $phash = fields::phash(name => "Joe", rank => "Captain") };
+ if( $Has_PH ) {
+ is( $phash->{rank}, "Captain" );
+ }
+ else {
+ like $@, qr/^Pseudo-hashes have been removed from Perl/;
+ }
+}
+
+
+# check if fields autovivify
+{
+ package Foo::Autoviv;
+ use fields qw(foo bar);
+ sub new { fields::new($_[0]) }
+
+ package main;
+ my Foo::Autoviv $a = Foo::Autoviv->new();
+ $a->{foo} = ['a', 'ok', 'c'];
+ $a->{bar} = { A => 'ok' };
+ is( $a->{foo}[1], 'ok' );
+ is( $a->{bar}->{A},, 'ok' );
+}
+
+package Test::FooBar;
+
+use fields qw(a b c);
+
+sub new {
+ my $self = fields::new(shift);
+ %$self = @_ if @_;
+ $self;
+}
+
+package main;
+
+{
+ my $x = Test::FooBar->new( a => 1, b => 2);
+
+ is(ref $x, 'Test::FooBar', 'x is a Test::FooBar');
+ ok(exists $x->{a}, 'x has a');
+ ok(exists $x->{b}, 'x has b');
+}
diff --git a/gnu/usr.bin/perl/lib/bigint.pm b/gnu/usr.bin/perl/lib/bigint.pm
index 900fe184525..9920dad8fee 100644
--- a/gnu/usr.bin/perl/lib/bigint.pm
+++ b/gnu/usr.bin/perl/lib/bigint.pm
@@ -1,10 +1,11 @@
package bigint;
require 5.005;
-$VERSION = '0.02';
+$VERSION = '0.04';
use Exporter;
-@ISA = qw( Exporter );
-@EXPORT_OK = qw( );
+@ISA = qw( Exporter );
+@EXPORT_OK = qw( );
+@EXPORT = qw( inf NaN );
use strict;
use overload;
@@ -32,7 +33,7 @@ sub AUTOLOAD
no strict 'refs';
if (defined $_[0])
{
- Math::BigInt->$name($_[0]);
+ return Math::BigInt->$name($_[0]);
}
return Math::BigInt->$name();
};
@@ -179,22 +180,29 @@ sub import
# we take care of floating point constants, since BigFloat isn't available
# and BigInt doesn't like them:
overload::constant float => sub { Math::BigInt->new( _constant(shift) ); };
+
+ $self->export_to_level(1,$self,@a); # export inf and NaN
}
+sub inf () { Math::BigInt->binf(); }
+sub NaN () { Math::BigInt->bnan(); }
+
1;
__END__
=head1 NAME
-bigint - Transparent big integer support for Perl
+bigint - Transparent BigInteger support for Perl
=head1 SYNOPSIS
use bignt;
$x = 2 + 4.5,"\n"; # BigInt 6
- print 2 ** 512; # really is what you think it is
+ print 2 ** 512,"\n"; # really is what you think it is
+ print inf + 42,"\n"; # inf
+ print NaN * 7,"\n"; # NaN
=head1 DESCRIPTION
@@ -202,7 +210,7 @@ All operators (including basic math operations) are overloaded. Integer
constants are created as proper BigInts.
Floating point constants are truncated to integer. All results are also
-trunctaed.
+truncated.
=head2 OPTIONS
@@ -277,7 +285,7 @@ classes, like Math::BigInt, or Math::BigInt::Lite. Mixing them together, even
with normal scalars is not extraordinary, but normal and expected.
You should not depend on the internal format, all accesses must go through
-accessor methods. E.g. looking at $x->{sign} is not a bright idea since there
+accessor methods. E.g. looking at $x->{sign} is not a good idea since there
is no guaranty that the object in question has such a hash key, nor is a hash
underneath at all.
@@ -297,6 +305,40 @@ Since all numbers are now objects, you can use all functions that are part of
the BigInt API. You can only use the bxxx() notation, and not the fxxx()
notation, though.
+=head2 CAVEAT
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+ $x = 9; $y = $x;
+ $x = $y = 7;
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+ $x = 9; $y = $x;
+ print $x + 1, " ", $y,"\n"; # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy beeing destroyed:
+
+ $x = 9; $y = $x;
+ print $x->badd(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->binc(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->bmul(2), " ", $y,"\n"; # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+ $x = 9; $y = $x;
+ $z = 9 if $x->is_zero(); # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
=head1 MODULES USED
C<bigint> is just a thin wrapper around various modules of the Math::BigInt
diff --git a/gnu/usr.bin/perl/lib/bignum.pm b/gnu/usr.bin/perl/lib/bignum.pm
index c900c95ea2a..056b45f2d52 100644
--- a/gnu/usr.bin/perl/lib/bignum.pm
+++ b/gnu/usr.bin/perl/lib/bignum.pm
@@ -1,10 +1,11 @@
package bignum;
require 5.005;
-$VERSION = '0.11';
+$VERSION = '0.14';
use Exporter;
-@ISA = qw( Exporter );
-@EXPORT_OK = qw( );
+@EXPORT_OK = qw( );
+@EXPORT = qw( inf NaN );
+@ISA = qw( Exporter );
use strict;
@@ -32,7 +33,7 @@ sub AUTOLOAD
if (defined $_[0])
{
Math::BigInt->$name($_[0]);
- Math::BigFloat->$name($_[0]);
+ return Math::BigFloat->$name($_[0]);
}
return Math::BigInt->$name();
};
@@ -166,8 +167,12 @@ sub import
print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n";
exit;
}
+ $self->export_to_level(1,$self,@a); # export inf and NaN
}
+sub inf () { Math::BigInt->binf(); }
+sub NaN () { Math::BigInt->bnan(); }
+
1;
__END__
@@ -181,7 +186,9 @@ bignum - Transparent BigNumber support for Perl
use bignum;
$x = 2 + 4.5,"\n"; # BigFloat 6.5
- print 2 ** 512 * 0.1; # really is what you think it is
+ print 2 ** 512 * 0.1,"\n"; # really is what you think it is
+ print inf * inf,"\n"; # prints inf
+ print NaN * 3,"\n"; # prints NaN
=head1 DESCRIPTION
@@ -189,6 +196,101 @@ All operators (including basic math operations) are overloaded. Integer and
floating-point constants are created as proper BigInts or BigFloats,
respectively.
+If you do
+
+ use bignum;
+
+at the top of your script, Math::BigFloat and Math::BigInt will be loaded
+and any constant number will be converted to an object (Math::BigFloat for
+floats like 3.1415 and Math::BigInt for integers like 1234).
+
+So, the following line:
+
+ $x = 1234;
+
+creates actually a Math::BigInt and stores a reference to in $x.
+This happens transparently and behind your back, so to speak.
+
+You can see this with the following:
+
+ perl -Mbignum -le 'print ref(1234)'
+
+Don't worry if it says Math::BigInt::Lite, bignum and friends will use Lite
+if it is installed since it is faster for some operations. It will be
+automatically upgraded to BigInt whenever neccessary:
+
+ perl -Mbignum -le 'print ref(2**255)'
+
+This also means it is a bad idea to check for some specific package, since
+the actual contents of $x might be something unexpected. Due to the
+transparent way of bignum C<ref()> should not be neccessary, anyway.
+
+Since Math::BigInt and BigFloat also overload the normal math operations,
+the following line will still work:
+
+ perl -Mbignum -le 'print ref(1234+1234)'
+
+Since numbers are actually objects, you can call all the usual methods from
+BigInt/BigFloat on them. This even works to some extent on expressions:
+
+ perl -Mbignum -le '$x = 1234; print $x->bdec()'
+ perl -Mbignum -le 'print 1234->binc();'
+ perl -Mbignum -le 'print 1234->binc->badd(6);'
+ perl -Mbignum -le 'print +(1234)->binc()'
+
+(Note that print doesn't do what you expect if the expression starts with
+'(' hence the C<+>)
+
+You can even chain the operations together as usual:
+
+ perl -Mbignum -le 'print 1234->binc->badd(6);'
+ 1241
+
+Under bignum (or bigint or bigrat), Perl will "upgrade" the numbers
+appropriately. This means that:
+
+ perl -Mbignum -le 'print 1234+4.5'
+ 1238.5
+
+will work correctly. These mixed cases don't do always work when using
+Math::BigInt or Math::BigFloat alone, or at least not in the way normal Perl
+scalars work.
+
+If you do want to work with large integers like under C<use integer;>, try
+C<use bigint;>:
+
+ perl -Mbigint -le 'print 1234.5+4.5'
+ 1238
+
+There is also C<use bigrat;> which gives you big rationals:
+
+ perl -Mbigrat -le 'print 1234+4.1'
+ 12381/10
+
+The entire upgrading/downgrading is still experimental and might not work
+as you expect or may even have bugs.
+
+You might get errors like this:
+
+ Can't use an undefined value as an ARRAY reference at
+ /usr/local/lib/perl5/5.8.0/Math/BigInt/Calc.pm line 864
+
+This means somewhere a routine got a BigFloat/Lite but expected a BigInt (or
+vice versa) and the upgrade/downgrad path was missing. This is a bug, please
+report it so that we can fix it.
+
+You might consider using just Math::BigInt or Math::BigFloat, since they
+allow you finer control over what get's done in which module/space. For
+instance, simple loop counters will be Math::BigInts under C<use bignum;> and
+this is slower than keeping them as Perl scalars:
+
+ perl -Mbignum -le 'for ($i = 0; $i < 10; $i++) { print ref($i); }'
+
+Please note the following does not work as expected (prints nothing), since
+overloading of '..' is not yet possible in Perl (as of v5.8.0):
+
+ perl -Mbignum -le 'for (1..2) { print ref($_); }'
+
=head2 OPTIONS
bignum recognizes some options that can be passed while loading it via use.
@@ -233,6 +335,68 @@ This prints out the name and version of all modules used and then exits.
perl -Mbignum=v -e ''
+=head2 METHODS
+
+Beside import() and AUTOLOAD() there are only a few other methods.
+
+Since all numbers are now objects, you can use all functions that are part of
+the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
+the fxxx() notation, though. This makes it possible that the underlying object
+might morph into a different class than BigFloat.
+
+=head2 CAVEAT
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+ $x = 9; $y = $x;
+ $x = $y = 7;
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+ $x = 9; $y = $x;
+ print $x + 1, " ", $y,"\n"; # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy beeing destroyed:
+
+ $x = 9; $y = $x;
+ print $x->badd(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->binc(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->bmul(2), " ", $y,"\n"; # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+ $x = 9; $y = $x;
+ $z = 9 if $x->is_zero(); # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
+=over 2
+
+=item inf()
+
+A shortcut to return Math::BigInt->binf(). Usefull because Perl does not always
+handle bareword C<inf> properly.
+
+=item NaN()
+
+A shortcut to return Math::BigInt->bnan(). Usefull because Perl does not always
+handle bareword C<NaN> properly.
+
+=item upgrade()
+
+Return the class that numbers are upgraded to, is in fact returning
+C<$Math::BigInt::upgrade>.
+
+=back
+
=head2 MATH LIBRARY
Math with the numbers is done (by default) by a module called
@@ -273,13 +437,6 @@ numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
minus infinity. You will get '+inf' when dividing a positive number by 0, and
'-inf' when dividing any negative number by 0.
-=head2 METHODS
-
-Since all numbers are now objects, you can use all functions that are part of
-the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
-the fxxx() notation, though. This makes it possible that the underlying object
-might morph into a different class than BigFloat.
-
=head1 MODULES USED
C<bignum> is just a thin wrapper around various modules of the Math::BigInt
diff --git a/gnu/usr.bin/perl/lib/bignum/t/bigint.t b/gnu/usr.bin/perl/lib/bignum/t/bigint.t
index 6133f7b89aa..b0c8f39dd40 100644
--- a/gnu/usr.bin/perl/lib/bignum/t/bigint.t
+++ b/gnu/usr.bin/perl/lib/bignum/t/bigint.t
@@ -10,7 +10,7 @@ BEGIN
$| = 1;
chdir 't' if -d 't';
unshift @INC, '../lib';
- plan tests => 28;
+ plan tests => 32;
}
use bigint;
@@ -63,15 +63,17 @@ ok (ref(4.5+4.5) =~ /^Math::BigInt/);
###############################################################################
# accurarcy and precision
-# this might change!
+ok_undef (bigint->accuracy());
+ok (bigint->accuracy(12),12);
+ok (bigint->accuracy(),12);
-ok_undef ($Math::BigInt::accuracy);
-ok_undef ($Math::BigInt::precision);
-bigint->accuracy(5);
-ok ($Math::BigInt::accuracy,5);
-bigint->precision(-2);
-ok_undef ($Math::BigInt::accuracy);
-ok ($Math::BigInt::precision,-2);
+ok_undef (bigint->precision());
+ok (bigint->precision(12),12);
+ok (bigint->precision(),12);
+
+ok (bigint->round_mode(),'even');
+ok (bigint->round_mode('odd'),'odd');
+ok (bigint->round_mode(),'odd');
###############################################################################
###############################################################################
diff --git a/gnu/usr.bin/perl/lib/bignum/t/bignum.t b/gnu/usr.bin/perl/lib/bignum/t/bignum.t
index 32235ea2d5b..ee5b8d43755 100644
--- a/gnu/usr.bin/perl/lib/bignum/t/bignum.t
+++ b/gnu/usr.bin/perl/lib/bignum/t/bignum.t
@@ -10,7 +10,7 @@ BEGIN
$| = 1;
chdir 't' if -d 't';
unshift @INC, '../lib';
- plan tests => 21;
+ plan tests => 20;
}
use bignum;
@@ -46,20 +46,17 @@ ok (1/3, '0.3333333333333333333333333333333333333333');
###############################################################################
# accurarcy and precision
-# this might change!
-
-ok_undef ($Math::BigInt::accuracy);
-ok_undef ($Math::BigInt::precision);
-ok_undef ($Math::BigFloat::accuracy);
-ok_undef ($Math::BigFloat::precision);
-bignum->accuracy(5);
-ok ($Math::BigInt::accuracy,5);
-ok ($Math::BigFloat::accuracy,5);
-bignum->precision(-2);
-ok_undef ($Math::BigInt::accuracy);
-ok_undef ($Math::BigFloat::accuracy);
-ok ($Math::BigInt::precision,-2);
-ok ($Math::BigFloat::precision,-2);
+ok_undef (bignum->accuracy());
+ok (bignum->accuracy(12),12);
+ok (bignum->accuracy(),12);
+
+ok_undef (bignum->precision());
+ok (bignum->precision(12),12);
+ok (bignum->precision(),12);
+
+ok (bignum->round_mode(),'even');
+ok (bignum->round_mode('odd'),'odd');
+ok (bignum->round_mode(),'odd');
###############################################################################
###############################################################################
diff --git a/gnu/usr.bin/perl/lib/bignum/t/bigrat.t b/gnu/usr.bin/perl/lib/bignum/t/bigrat.t
index e5edcb441d5..c8162fc719a 100644
--- a/gnu/usr.bin/perl/lib/bignum/t/bigrat.t
+++ b/gnu/usr.bin/perl/lib/bignum/t/bigrat.t
@@ -10,7 +10,7 @@ BEGIN
$| = 1;
chdir 't' if -d 't';
unshift @INC, '../lib';
- plan tests => 16;
+ plan tests => 25;
}
use bigrat;
@@ -50,19 +50,17 @@ ok (3/7 / 1.5,'2/7');
###############################################################################
# accurarcy and precision
-# this might change!
-#ok_undef ($Math::BigInt::accuracy);
-#ok_undef ($Math::BigInt::precision);
-#ok_undef ($Math::BigFloat::accuracy);
-#ok_undef ($Math::BigFloat::precision);
-#bigrat->accuracy(5);
-#ok ($Math::BigInt::accuracy,5);
-#ok ($Math::BigFloat::accuracy,5);
-#bigrat->precision(-2);
-#ok_undef ($Math::BigInt::accuracy);
-#ok_undef ($Math::BigFloat::accuracy);
-#ok ($Math::BigInt::precision,-2);
-#ok ($Math::BigFloat::precision,-2);
+ok_undef (bigrat->accuracy());
+ok (bigrat->accuracy(12),12);
+ok (bigrat->accuracy(),12);
+
+ok_undef (bigrat->precision());
+ok (bigrat->precision(12),12);
+ok (bigrat->precision(),12);
+
+ok (bigrat->round_mode(),'even');
+ok (bigrat->round_mode('odd'),'odd');
+ok (bigrat->round_mode(),'odd');
###############################################################################
###############################################################################
diff --git a/gnu/usr.bin/perl/lib/bignum/t/biinfnan.t b/gnu/usr.bin/perl/lib/bignum/t/biinfnan.t
new file mode 100644
index 00000000000..f136c1e66e3
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/bignum/t/biinfnan.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -w
+
+###############################################################################
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ unshift @INC, '../lib/bignum/t' if $ENV{PERL_CORE};
+ plan tests => 26;
+ }
+
+use bigint;
+
+my ($x);
+
+require "infnan.inc";
+
diff --git a/gnu/usr.bin/perl/lib/bignum/t/bn_lite.t b/gnu/usr.bin/perl/lib/bignum/t/bn_lite.t
new file mode 100644
index 00000000000..21247c1ee73
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/bignum/t/bn_lite.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+###############################################################################
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ plan tests => 1;
+ }
+
+eval 'require Math::BigInt::Lite;';
+if ($@ eq '')
+ {
+ # can use Lite, so let bignum try it
+ require bignum; bignum->import();
+ # can't get to work a ref(1+1) here, presumable because :constant phase
+ # already done
+ ok ($bignum::_lite,1);
+ }
+else
+ {
+ print "ok 1 # skipped, no Math::BigInt::Lite\n";
+ }
+
+
diff --git a/gnu/usr.bin/perl/lib/bignum/t/bninfnan.t b/gnu/usr.bin/perl/lib/bignum/t/bninfnan.t
new file mode 100644
index 00000000000..7536a034a3e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/bignum/t/bninfnan.t
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+
+###############################################################################
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ my $location = $0; $location =~ s/biinfnan.t//i;
+ if ($ENV{PERL_CORE})
+ {
+ @INC = qw(../lib ../lib/bignum/t); # testing with the core distribution
+ }
+ else
+ {
+ unshift @INC, '../lib'; # for testing manually
+ }
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+ plan tests => 26;
+ }
+
+use bignum;
+
+my ($x);
+
+require "infnan.inc";
+
diff --git a/gnu/usr.bin/perl/lib/bignum/t/br_lite.t b/gnu/usr.bin/perl/lib/bignum/t/br_lite.t
new file mode 100644
index 00000000000..2bf77d40370
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/bignum/t/br_lite.t
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+
+###############################################################################
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ plan tests => 1;
+ }
+
+eval 'require Math::BigInt::Lite;';
+if ($@ eq '')
+ {
+ # can use Lite, so let bignum try it
+ require bigrat; bigrat->import();
+ # can't get to work a ref(1+1) here, presumable because :constant phase
+ # already done
+ ok ($bigrat::_lite,1);
+ }
+else
+ {
+ print "ok 1 # skipped, no Math::BigInt::Lite\n";
+ }
+
+
diff --git a/gnu/usr.bin/perl/lib/bignum/t/brinfnan.t b/gnu/usr.bin/perl/lib/bignum/t/brinfnan.t
new file mode 100644
index 00000000000..286adbc0ca9
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/bignum/t/brinfnan.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -w
+
+###############################################################################
+
+use Test;
+use strict;
+
+BEGIN
+ {
+ $| = 1;
+ chdir 't' if -d 't';
+ unshift @INC, '../lib';
+ unshift @INC, '../lib/bignum/t' if $ENV{PERL_CORE};
+ plan tests => 26;
+ }
+
+use bigrat;
+
+my ($x);
+
+require "infnan.inc";
+
diff --git a/gnu/usr.bin/perl/lib/bignum/t/infnan.inc b/gnu/usr.bin/perl/lib/bignum/t/infnan.inc
new file mode 100644
index 00000000000..771b94e7480
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/bignum/t/infnan.inc
@@ -0,0 +1,35 @@
+
+use strict;
+
+my ($x);
+
+###############################################################################
+# inf tests
+
+$x = 1+inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'inf');
+$x = 1*inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'inf');
+
+# these don't work without exporting inf()
+$x = inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'inf');
+$x = inf+inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'inf');
+$x = inf*inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'inf');
+
+###############################################################################
+# NaN tests
+
+$x = 1+NaN; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+$x = 1*NaN; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+
+# these don't work without exporting NaN()
+$x = NaN; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+$x = NaN+NaN; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+$x = NaN*NaN; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+
+###############################################################################
+# mixed tests
+
+# these don't work without exporting NaN() or inf()
+$x = NaN+inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+$x = NaN*inf; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+$x = inf*NaN; ok (ref($x) =~ /^Math::BigInt/); ok ($x->bstr(),'NaN');
+
diff --git a/gnu/usr.bin/perl/lib/bigrat.pm b/gnu/usr.bin/perl/lib/bigrat.pm
index 54ef91ed301..45dfed40691 100644
--- a/gnu/usr.bin/perl/lib/bigrat.pm
+++ b/gnu/usr.bin/perl/lib/bigrat.pm
@@ -1,10 +1,11 @@
package bigrat;
require 5.005;
-$VERSION = '0.04';
+$VERSION = '0.06';
use Exporter;
-@ISA = qw( Exporter );
-@EXPORT_OK = qw( );
+@ISA = qw( Exporter );
+@EXPORT_OK = qw( );
+@EXPORT = qw( inf NaN );
use strict;
@@ -33,6 +34,7 @@ sub AUTOLOAD
{
Math::BigInt->$name($_[0]);
Math::BigFloat->$name($_[0]);
+ return Math::BigRat->$name($_[0]);
}
return Math::BigInt->$name();
};
@@ -141,8 +143,12 @@ sub import
print "Math::BigRat\t\t v$Math::BigRat::VERSION\n";
exit;
}
+ $self->export_to_level(1,$self,@a); # export inf and NaN
}
+sub inf () { Math::BigInt->binf(); }
+sub NaN () { Math::BigInt->bnan(); }
+
1;
__END__
@@ -214,6 +220,40 @@ the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
the fxxx() notation, though. This makes you independed on the fact that the
underlying object might morph into a different class than BigFloat.
+=head2 CAVEAT
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+ $x = 9; $y = $x;
+ $x = $y = 7;
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+ $x = 9; $y = $x;
+ print $x + 1, " ", $y,"\n"; # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy beeing destroyed:
+
+ $x = 9; $y = $x;
+ print $x->badd(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->binc(1), " ", $y,"\n"; # prints 10 10
+
+ $x = 9; $y = $x;
+ print $x->bmul(2), " ", $y,"\n"; # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+ $x = 9; $y = $x;
+ $z = 9 if $x->is_zero(); # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
=head1 EXAMPLES
perl -Mbigrat -le 'print sqrt(33)'
diff --git a/gnu/usr.bin/perl/lib/bytes.pm b/gnu/usr.bin/perl/lib/bytes.pm
index cd82abc75b5..9a04491daf1 100644
--- a/gnu/usr.bin/perl/lib/bytes.pm
+++ b/gnu/usr.bin/perl/lib/bytes.pm
@@ -1,6 +1,6 @@
package bytes;
-our $VERSION = '1.00';
+our $VERSION = '1.01';
$bytes::hint_bits = 0x00000008;
@@ -18,6 +18,11 @@ sub AUTOLOAD {
}
sub length ($);
+sub chr ($);
+sub ord ($);
+sub substr ($$;$$);
+sub index ($$;$);
+sub rindex ($$;$);
1;
__END__
@@ -29,8 +34,15 @@ bytes - Perl pragma to force byte semantics rather than character semantics
=head1 SYNOPSIS
use bytes;
+ ... chr(...); # or bytes::chr
+ ... index(...); # or bytes::index
+ ... length(...); # or bytes::length
+ ... ord(...); # or bytes::ord
+ ... rindex(...); # or bytes::rindex
+ ... substr(...); # or bytes::substr
no bytes;
+
=head1 DESCRIPTION
The C<use bytes> pragma disables character semantics for the rest of the
@@ -53,16 +65,22 @@ up the UTF8 encoding - and C<length $x> returns C<2>:
print "Length is ", length $x, "\n"; # "Length is 1"
printf "Contents are %vd\n", $x; # "Contents are 400"
{
- use bytes;
+ use bytes; # or "require bytes; bytes::length()"
print "Length is ", length $x, "\n"; # "Length is 2"
printf "Contents are %vd\n", $x; # "Contents are 198.144"
}
+chr(), ord(), substr(), index() and rindex() behave similarly.
+
For more on the implications and differences between character
-semantics and byte semantics, see L<perlunicode>.
+semantics and byte semantics, see L<perluniintro> and L<perlunicode>.
+
+=head1 LIMITATIONS
+
+bytes::substr() does not work as an lvalue().
=head1 SEE ALSO
-L<perlunicode>, L<utf8>
+L<perluniintro>, L<perlunicode>, L<utf8>
=cut
diff --git a/gnu/usr.bin/perl/lib/bytes.t b/gnu/usr.bin/perl/lib/bytes.t
index dda2b87728e..6b66a554b27 100644
--- a/gnu/usr.bin/perl/lib/bytes.t
+++ b/gnu/usr.bin/perl/lib/bytes.t
@@ -1,32 +1,48 @@
BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
+ require './test.pl';
}
-print "1..6\n";
+plan tests => 19;
-my $a = chr(0x0100);
+my $a = chr(0x100);
-print ord($a) == 0x100 ? "ok 1\n" : "not ok 1\n";
-print length($a) == 1 ? "ok 2\n" : "not ok 2\n";
+is(ord($a), 0x100, "ord sanity check");
+is(length($a), 1, "length sanity check");
+is(substr($a, 0, 1), "\x{100}", "substr sanity check");
+is(index($a, "\x{100}"), 0, "index sanity check");
+is(rindex($a, "\x{100}"), 0, "rindex sanity check");
+is(bytes::length($a), 2, "bytes::length sanity check");
+is(bytes::chr(0x100), chr(0), "bytes::chr sanity check");
{
use bytes;
- my $b = chr(0x0100);
- print ord($b) == 0 ? "ok 3\n" : "not ok 3\n";
+ my $b = chr(0x100); # affected by 'use bytes'
+ is(ord($b), 0, "chr truncates under use bytes");
+ is(length($b), 1, "length truncated under use bytes");
+ is(bytes::ord($b), 0, "bytes::ord truncated under use bytes");
+ is(bytes::length($b), 1, "bytes::length truncated under use bytes");
+ is(bytes::substr($b, 0, 1), "\0", "bytes::substr truncated under use bytes");
}
-my $c = chr(0x0100);
-
-print ord($c) == 0x100 ? "ok 4\n" : "not ok 4\n";
+my $c = chr(0x100);
{
use bytes;
- if (ord('A') == 193) {
- print ord($c) == 0x8c ? "ok 5\n" : "not ok 5\n";
+ if (ord('A') == 193) { # EBCDIC?
+ is(ord($c), 0x8c, "ord under use bytes looks at the 1st byte");
+ } else {
+ is(ord($c), 0xc4, "ord under use bytes looks at the 1st byte");
+ }
+ is(length($c), 2, "length under use bytes looks at bytes");
+ is(bytes::length($c), 2, "bytes::length under use bytes looks at bytes");
+ if (ord('A') == 193) { # EBCDIC?
+ is(bytes::ord($c), 0x8c, "bytes::ord under use bytes looks at the 1st byte");
} else {
- print ord($c) == 0xc4 ? "ok 5\n" : "not ok 5\n";
+ is(bytes::ord($c), 0xc4, "bytes::ord under use bytes looks at the 1st byte");
}
- print length($c) == 2 ? "ok 6\n" : "not ok 6\n";
+ is(bytes::substr($c, 0, 1), "\xc4", "bytes::substr under use bytes looks at bytes");
+ is(bytes::index($c, "\x80"), 1, "bytes::index under use bytes looks at bytes");
+ is(bytes::rindex($c, "\xc4"), 0, "bytes::rindex under use bytes looks at bytes");
}
-
diff --git a/gnu/usr.bin/perl/lib/bytes_heavy.pl b/gnu/usr.bin/perl/lib/bytes_heavy.pl
index 47bdbf91b0d..923381de58d 100644
--- a/gnu/usr.bin/perl/lib/bytes_heavy.pl
+++ b/gnu/usr.bin/perl/lib/bytes_heavy.pl
@@ -5,4 +5,36 @@ sub length ($) {
return CORE::length($_[0]);
}
+sub substr ($$;$$) {
+ BEGIN { bytes::import() }
+ return
+ @_ == 2 ? CORE::substr($_[0], $_[1]) :
+ @_ == 3 ? CORE::substr($_[0], $_[1], $_[2]) :
+ CORE::substr($_[0], $_[1], $_[2], $_[3]) ;
+}
+
+sub ord ($) {
+ BEGIN { bytes::import() }
+ return CORE::ord($_[0]);
+}
+
+sub chr ($) {
+ BEGIN { bytes::import() }
+ return CORE::chr($_[0]);
+}
+
+sub index ($$;$) {
+ BEGIN { bytes::import() }
+ return
+ @_ == 2 ? CORE::index($_[0], $_[1]) :
+ CORE::index($_[0], $_[1], $_[2]) ;
+}
+
+sub rindex ($$;$) {
+ BEGIN { bytes::import() }
+ return
+ @_ == 2 ? CORE::rindex($_[0], $_[1]) :
+ CORE::rindex($_[0], $_[1], $_[2]) ;
+}
+
1;
diff --git a/gnu/usr.bin/perl/lib/charnames.pm b/gnu/usr.bin/perl/lib/charnames.pm
index fc3ad8bf3ef..3457b8b66b2 100644
--- a/gnu/usr.bin/perl/lib/charnames.pm
+++ b/gnu/usr.bin/perl/lib/charnames.pm
@@ -2,10 +2,11 @@ package charnames;
use strict;
use warnings;
use Carp;
-our $VERSION = '1.01';
+use File::Spec;
+our $VERSION = '1.02';
use bytes (); # for $bytes::hint_bits
-$charnames::hint_bits = 0x20000;
+$charnames::hint_bits = 0x20000; # HINT_LOCALIZE_HH
my %alias1 = (
# Icky 3.2 names with parentheses.
@@ -38,20 +39,56 @@ my %alias2 = (
'PARTIAL LINE UP' => 'PARTIAL LINE BACKWARD',
);
+my %alias3 = (
+ # User defined aliasses. Even more convenient :)
+ );
my $txt;
+sub alias (@)
+{
+ @_ or return %alias3;
+ my $alias = ref $_[0] ? $_[0] : { @_ };
+ @alias3{keys %$alias} = values %$alias;
+} # alias
+
+sub alias_file ($)
+{
+ my ($arg, $file) = @_;
+ if (-f $arg && File::Spec->file_name_is_absolute ($arg)) {
+ $file = $arg;
+ }
+ elsif ($arg =~ m/^\w+$/) {
+ $file = "unicore/${arg}_alias.pl";
+ }
+ else {
+ croak "Charnames alias files can only have identifier characters";
+ }
+ if (my @alias = do $file) {
+ @alias == 1 && !defined $alias[0] and
+ croak "$file cannot be used as alias file for charnames";
+ @alias % 2 and
+ croak "$file did not return a (valid) list of alias pairs";
+ alias (@alias);
+ return (1);
+ }
+ 0;
+} # alias_file
+
# This is not optimized in any way yet
sub charnames
{
my $name = shift;
if (exists $alias1{$name}) {
- $name = $alias1{$name};
+ $name = $alias1{$name};
+ }
+ elsif (exists $alias2{$name}) {
+ require warnings;
+ warnings::warnif('deprecated', qq{Unicode character name "$name" is deprecated, use "$alias2{$name}" instead});
+ $name = $alias2{$name};
}
- if (exists $alias2{$name}) {
- require warnings;
- warnings::warnif('deprecated', qq{Unicode character name "$name" is deprecated, use "$alias2{$name}" instead});
- $name = $alias2{$name};
+ elsif (exists $alias3{$name}) {
+ $name = $alias3{$name};
}
my $ord;
@@ -59,72 +96,70 @@ sub charnames
my $fname;
if ($name eq "BYTE ORDER MARK") {
- $fname = $name;
- $ord = 0xFEFF;
+ $fname = $name;
+ $ord = 0xFEFF;
} else {
- ## Suck in the code/name list as a big string.
- ## Lines look like:
- ## "0052\t\tLATIN CAPITAL LETTER R\n"
- $txt = do "unicore/Name.pl" unless $txt;
-
- ## @off will hold the index into the code/name string of the start and
- ## end of the name as we find it.
-
- ## If :full, look for the the name exactly
- if ($^H{charnames_full} and $txt =~ /\t\t\Q$name\E$/m) {
+ ## Suck in the code/name list as a big string.
+ ## Lines look like:
+ ## "0052\t\tLATIN CAPITAL LETTER R\n"
+ $txt = do "unicore/Name.pl" unless $txt;
+
+ ## @off will hold the index into the code/name string of the start and
+ ## end of the name as we find it.
+
+ ## If :full, look for the name exactly
+ if ($^H{charnames_full} and $txt =~ /\t\t\Q$name\E$/m) {
+ @off = ($-[0], $+[0]);
+ }
+
+ ## If we didn't get above, and :short allowed, look for the short name.
+ ## The short name is like "greek:Sigma"
+ unless (@off) {
+ if ($^H{charnames_short} and $name =~ /^(.+?):(.+)/s) {
+ my ($script, $cname) = ($1, $2);
+ my $case = $cname =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL";
+ if ($txt =~ m/\t\t\U$script\E (?:$case )?LETTER \U\Q$cname\E$/m) {
@off = ($-[0], $+[0]);
+ }
}
+ }
- ## If we didn't get above, and :short allowed, look for the short name.
- ## The short name is like "greek:Sigma"
- unless (@off) {
- if ($^H{charnames_short} and $name =~ /^(.+?):(.+)/s) {
- my ($script, $cname) = ($1,$2);
- my $case = ( $cname =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL");
- if ($txt =~ m/\t\t\U$script\E (?:$case )?LETTER \U\Q$cname\E$/m) {
- @off = ($-[0], $+[0]);
- }
- }
- }
-
- ## If we still don't have it, check for the name among the loaded
- ## scripts.
- if (not @off)
- {
- my $case = ( $name =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL");
- for my $script ( @{$^H{charnames_scripts}} )
- {
- if ($txt =~ m/\t\t$script (?:$case )?LETTER \U\Q$name\E$/m) {
- @off = ($-[0], $+[0]);
- last;
- }
- }
- }
-
- ## If we don't have it by now, give up.
- unless (@off) {
- carp "Unknown charname '$name'";
- return "\x{FFFD}";
+ ## If we still don't have it, check for the name among the loaded
+ ## scripts.
+ if (not @off) {
+ my $case = $name =~ /[[:upper:]]/ ? "CAPITAL" : "SMALL";
+ for my $script (@{$^H{charnames_scripts}}) {
+ if ($txt =~ m/\t\t$script (?:$case )?LETTER \U\Q$name\E$/m) {
+ @off = ($-[0], $+[0]);
+ last;
+ }
}
-
- ##
- ## Now know where in the string the name starts.
- ## The code, in hex, is before that.
- ##
- ## The code can be 4-6 characters long, so we've got to sort of
- ## go look for it, just after the newline that comes before $off[0].
- ##
- ## This would be much easier if unicore/Name.pl had info in
- ## a name/code order, instead of code/name order.
- ##
- ## The +1 after the rindex() is to skip past the newline we're finding,
- ## or, if the rindex() fails, to put us to an offset of zero.
- ##
- my $hexstart = rindex($txt, "\n", $off[0]) + 1;
-
- ## we know where it starts, so turn into number -
- ## the ordinal for the char.
- $ord = hex substr($txt, $hexstart, $off[0] - $hexstart);
+ }
+
+ ## If we don't have it by now, give up.
+ unless (@off) {
+ carp "Unknown charname '$name'";
+ return "\x{FFFD}";
+ }
+
+ ##
+ ## Now know where in the string the name starts.
+ ## The code, in hex, is before that.
+ ##
+ ## The code can be 4-6 characters long, so we've got to sort of
+ ## go look for it, just after the newline that comes before $off[0].
+ ##
+ ## This would be much easier if unicore/Name.pl had info in
+ ## a name/code order, instead of code/name order.
+ ##
+ ## The +1 after the rindex() is to skip past the newline we're finding,
+ ## or, if the rindex() fails, to put us to an offset of zero.
+ ##
+ my $hexstart = rindex($txt, "\n", $off[0]) + 1;
+
+ ## we know where it starts, so turn into number -
+ ## the ordinal for the char.
+ $ord = hex substr($txt, $hexstart, $off[0] - $hexstart);
}
if ($^H & $bytes::hint_bits) { # "use bytes" in effect?
@@ -132,22 +167,21 @@ sub charnames
return chr $ord if $ord <= 255;
my $hex = sprintf "%04x", $ord;
if (not defined $fname) {
- $fname = substr $txt, $off[0] + 2, $off[1] - $off[0] - 2;
+ $fname = substr $txt, $off[0] + 2, $off[1] - $off[0] - 2;
}
croak "Character 0x$hex with name '$fname' is above 0xFF";
}
no warnings 'utf8'; # allow even illegal characters
return pack "U", $ord;
-}
+} # charnames
sub import
{
shift; ## ignore class name
- if (not @_)
- {
- carp("`use charnames' needs explicit imports list");
+ if (not @_) {
+ carp("`use charnames' needs explicit imports list");
}
$^H |= $charnames::hint_bits;
$^H{charnames} = \&charnames ;
@@ -155,8 +189,35 @@ sub import
##
## fill %h keys with our @_ args.
##
- my %h;
- @h{@_} = (1) x @_;
+ my ($promote, %h, @args) = (0);
+ while (@_ and $_ = shift) {
+ if ($_ eq ":alias") {
+ @_ or
+ croak ":alias needs an argument in charnames";
+ my $alias = shift;
+ if (ref $alias) {
+ ref $alias eq "HASH" or
+ croak "Only HASH reference supported as argument to :alias";
+ alias ($alias);
+ next;
+ }
+ if ($alias =~ m{:(\w+)$}) {
+ $1 eq "full" || $1 eq "short" and
+ croak ":alias cannot use existing pragma :$1 (reversed order?)";
+ alias_file ($1) and $promote = 1;
+ next;
+ }
+ alias_file ($alias);
+ next;
+ }
+ if (m/^:/ and ! ($_ eq ":full" || $_ eq ":short")) {
+ warn "unsupported special '$_' in charnames";
+ next;
+ }
+ push @args, $_;
+ }
+ @args == 0 && $promote and @args = (":full");
+ @h{@args} = (1) x @args;
$^H{charnames_full} = delete $h{':full'};
$^H{charnames_short} = delete $h{':short'};
@@ -166,18 +227,16 @@ sub import
## If utf8? warnings are enabled, and some scripts were given,
## see if at least we can find one letter of each script.
##
- if (warnings::enabled('utf8') && @{$^H{charnames_scripts}})
- {
- $txt = do "unicore/Name.pl" unless $txt;
-
- for my $script (@{$^H{charnames_scripts}})
- {
- if (not $txt =~ m/\t\t$script (?:CAPITAL |SMALL )?LETTER /) {
- warnings::warn('utf8', "No such script: '$script'");
- }
+ if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
+ $txt = do "unicore/Name.pl" unless $txt;
+
+ for my $script (@{$^H{charnames_scripts}}) {
+ if (not $txt =~ m/\t\t$script (?:CAPITAL |SMALL )?LETTER /) {
+ warnings::warn('utf8', "No such script: '$script'");
}
+ }
}
-}
+} # import
require Unicode::UCD; # for Unicode::UCD::_getcode()
@@ -185,73 +244,73 @@ my %viacode;
sub viacode
{
- if (@_ != 1) {
- carp "charnames::viacode() expects one argument";
- return ()
- }
+ if (@_ != 1) {
+ carp "charnames::viacode() expects one argument";
+ return ()
+ }
- my $arg = shift;
- my $code = Unicode::UCD::_getcode($arg);
+ my $arg = shift;
+ my $code = Unicode::UCD::_getcode($arg);
- my $hex;
+ my $hex;
- if (defined $code) {
- $hex = sprintf "%04X", $arg;
- } else {
- carp("unexpected arg \"$arg\" to charnames::viacode()");
- return;
- }
+ if (defined $code) {
+ $hex = sprintf "%04X", $arg;
+ } else {
+ carp("unexpected arg \"$arg\" to charnames::viacode()");
+ return;
+ }
- if ($code > 0x10FFFF) {
- carp sprintf "Unicode characters only allocated up to U+10FFFF (you asked for U+%X)", $hex;
- return;
- }
+ if ($code > 0x10FFFF) {
+ carp sprintf "Unicode characters only allocated up to U+10FFFF (you asked for U+%X)", $hex;
+ return;
+ }
- return $viacode{$hex} if exists $viacode{$hex};
+ return $viacode{$hex} if exists $viacode{$hex};
- $txt = do "unicore/Name.pl" unless $txt;
+ $txt = do "unicore/Name.pl" unless $txt;
- if ($txt =~ m/^$hex\t\t(.+)/m) {
- return $viacode{$hex} = $1;
- } else {
- return;
- }
-}
+ if ($txt =~ m/^$hex\t\t(.+)/m) {
+ return $viacode{$hex} = $1;
+ } else {
+ return;
+ }
+} # viacode
my %vianame;
sub vianame
{
- if (@_ != 1) {
- carp "charnames::vianame() expects one name argument";
- return ()
- }
+ if (@_ != 1) {
+ carp "charnames::vianame() expects one name argument";
+ return ()
+ }
- my $arg = shift;
+ my $arg = shift;
- return chr hex $1 if $arg =~ /^U\+([0-9a-fA-F]+)$/;
+ return chr hex $1 if $arg =~ /^U\+([0-9a-fA-F]+)$/;
- return $vianame{$arg} if exists $vianame{$arg};
+ return $vianame{$arg} if exists $vianame{$arg};
- $txt = do "unicore/Name.pl" unless $txt;
+ $txt = do "unicore/Name.pl" unless $txt;
- my $pos = index $txt, "\t\t$arg\n";
- if ($[ <= $pos) {
- my $posLF = rindex $txt, "\n", $pos;
- (my $code = substr $txt, $posLF + 1, 6) =~ tr/\t//d;
- return $vianame{$arg} = hex $code;
-
- # If $pos is at the 1st line, $posLF must be $[ - 1 (not found);
- # then $posLF + 1 equals to $[ (at the beginning of $txt).
- # Otherwise $posLF is the position of "\n";
- # then $posLF + 1 must be the position of the next to "\n"
- # (the beginning of the line).
- # substr($txt, $posLF + 1, 6) may be "0000\t\t", "00A1\t\t",
- # "10300\t", "100000", etc. So we can get the code via removing TAB.
- } else {
- return;
- }
-}
+ my $pos = index $txt, "\t\t$arg\n";
+ if ($[ <= $pos) {
+ my $posLF = rindex $txt, "\n", $pos;
+ (my $code = substr $txt, $posLF + 1, 6) =~ tr/\t//d;
+ return $vianame{$arg} = hex $code;
+
+ # If $pos is at the 1st line, $posLF must be $[ - 1 (not found);
+ # then $posLF + 1 equals to $[ (at the beginning of $txt).
+ # Otherwise $posLF is the position of "\n";
+ # then $posLF + 1 must be the position of the next to "\n"
+ # (the beginning of the line).
+ # substr($txt, $posLF + 1, 6) may be "0000\t\t", "00A1\t\t",
+ # "10300\t", "100000", etc. So we can get the code via removing TAB.
+ } else {
+ return;
+ }
+} # vianame
1;
@@ -272,20 +331,26 @@ charnames - define character names for C<\N{named}> string literal escapes
use charnames qw(cyrillic greek);
print "\N{sigma} is Greek sigma, and \N{be} is Cyrillic b.\n";
+ use charnames ":full", ":alias" => {
+ e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
+ };
+ print "\N{e_ACUTE} is a small letter e with an acute.\n";
+
+ use charnames ();
print charnames::viacode(0x1234); # prints "ETHIOPIC SYLLABLE SEE"
printf "%04X", charnames::vianame("GOTHIC LETTER AHSA"); # prints "10330"
=head1 DESCRIPTION
-Pragma C<use charnames> supports arguments C<:full>, C<:short> and
-script names. If C<:full> is present, for expansion of
-C<\N{CHARNAME}> string C<CHARNAME> is first looked in the list of
-standard Unicode names of chars. If C<:short> is present, and
+Pragma C<use charnames> supports arguments C<:full>, C<:short>, script
+names and customized aliases. If C<:full> is present, for expansion of
+C<\N{CHARNAME}>, the string C<CHARNAME> is first looked up in the list of
+standard Unicode character names. If C<:short> is present, and
C<CHARNAME> has the form C<SCRIPT:CNAME>, then C<CNAME> is looked up
as a letter in script C<SCRIPT>. If pragma C<use charnames> is used
with script name arguments, then for C<\N{CHARNAME}> the name
C<CHARNAME> is looked up as a letter in the given scripts (in the
-specified order).
+specified order). Customized aliases are explained in L</CUSTOM ALIASES>.
For lookup of C<CHARNAME> inside a given script C<SCRIPTNAME>
this pragma looks for the names
@@ -343,6 +408,43 @@ state of C<bytes>-flag as in:
}
}
+=head1 CUSTOM ALIASES
+
+This version of charnames supports three mechanisms of adding local
+or customized aliases to standard Unicode naming conventions (:full)
+
+=head2 Anonymous hashes
+
+ use charnames ":full", ":alias" => {
+ e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
+ };
+ my $str = "\N{e_ACUTE}";
+
+=head2 Alias file
+
+ use charnames ":full", ":alias" => "pro";
+
+ will try to read "unicore/pro_alias.pl" from the @INC path. This
+ file should return a list in plain perl:
+
+ (
+ A_GRAVE => "LATIN CAPITAL LETTER A WITH GRAVE",
+ A_CIRCUM => "LATIN CAPITAL LETTER A WITH CIRCUMFLEX",
+ A_DIAERES => "LATIN CAPITAL LETTER A WITH DIAERESIS",
+ A_TILDE => "LATIN CAPITAL LETTER A WITH TILDE",
+ A_BREVE => "LATIN CAPITAL LETTER A WITH BREVE",
+ A_RING => "LATIN CAPITAL LETTER A WITH RING ABOVE",
+ A_MACRON => "LATIN CAPITAL LETTER A WITH MACRON",
+ );
+
+=head2 Alias shortcut
+
+ use charnames ":alias" => ":pro";
+
+ works exactly the same as the alias pairs, only this time,
+ ":full" is inserted automatically as first argument (if no
+ other argument is given).
+
=head1 charnames::viacode(code)
Returns the full name of the character indicated by the numeric code.
@@ -354,7 +456,7 @@ prints "FOUR TEARDROP-SPOKED ASTERISK".
Returns undef if no name is known for the code.
-This works only for the standard names, and does not yet apply
+This works only for the standard names, and does not yet apply
to custom translators.
Notice that the name returned for of U+FEFF is "ZERO WIDTH NO-BREAK
@@ -371,7 +473,7 @@ prints "2722".
Returns undef if the name is unknown.
-This works only for the standard names, and does not yet apply
+This works only for the standard names, and does not yet apply
to custom translators.
=head1 ALIASES
diff --git a/gnu/usr.bin/perl/lib/charnames.t b/gnu/usr.bin/perl/lib/charnames.t
index 29ee0f39a6a..34fe56d3dd6 100644
--- a/gnu/usr.bin/perl/lib/charnames.t
+++ b/gnu/usr.bin/perl/lib/charnames.t
@@ -6,13 +6,16 @@ BEGIN {
unless(grep /blib/, @INC) {
chdir 't' if -d 't';
@INC = '../lib';
+ require './test.pl';
}
$SIG{__WARN__} = sub { push @WARN, @_ };
}
+require File::Spec;
+
$| = 1;
-print "1..46\n";
+print "1..73\n";
use charnames ':full';
@@ -95,7 +98,7 @@ sub to_bytes {
{
use charnames qw(:full);
use utf8;
-
+
my $x = "\x{221b}";
my $named = "\N{CUBE ROOT}";
@@ -119,7 +122,7 @@ sub to_bytes {
}
{
- # 20001114.001
+ # 20001114.001
no utf8; # naked Latin-1
@@ -264,3 +267,272 @@ print "ok 45\n";
print "not " if grep { /you asked for U+110000/ } @WARN;
print "ok 46\n";
+
+
+# ---- Alias extensions
+
+my $tmpfile = "tmp0000";
+my $alifile = File::Spec->catfile(File::Spec->updir, qw(lib unicore xyzzy_alias.pl));
+my $i = 0;
+1 while -e ++$tmpfile;
+END { if ($tmpfile) { 1 while unlink $tmpfile; } }
+
+my @prgs;
+{ local $/ = undef;
+ @prgs = split "\n########\n", <DATA>;
+ }
+
+my $i = 46;
+for (@prgs) {
+ my ($code, $exp) = ((split m/\nEXPECT\n/), '$');
+ my ($prog, $fil) = ((split m/\nFILE\n/, $code), "");
+ open my $tmp, "> $tmpfile" or die "Could not open $tmpfile: $!";
+ print $tmp $prog, "\n";
+ close $tmp or die "Could not close $tmpfile: $!";
+ if ($fil) {
+ $fil .= "\n";
+ open my $ali, "> $alifile" or die "Could not open $alifile: $!";
+ print $ali $fil;
+ close $ali or die "Could not close $alifile: $!";
+ }
+ my $res = runperl( switches => $switch,
+ progfile => $tmpfile,
+ stderr => 1 );
+ my $status = $?;
+ $res =~ s/[\r\n]+$//;
+ $res =~ s/tmp\d+/-/g; # fake $prog from STDIN
+ $res =~ s/\n%[A-Z]+-[SIWEF]-.*$// # clip off DCL status msg
+ if $^O eq "VMS";
+ $exp =~ s/[\r\n]+$//;
+ if ($^O eq "MacOS") {
+ $exp =~ s{(\./)?abc\.pm}{:abc.pm}g;
+ $exp =~ s{./abc} {:abc}g;
+ }
+ my $pfx = ($res =~ s/^PREFIX\n//);
+ my $rexp = qr{^$exp};
+ if ($res =~ s/^SKIPPED\n//) {
+ print "$results\n";
+ }
+ elsif (($pfx and $res !~ /^\Q$expected/) or
+ (!$pfx and $res !~ $rexp)) {
+ print STDERR
+ "PROG:\n$prog\n",
+ "FILE:\n$fil",
+ "EXPECTED:\n$exp\n",
+ "GOT:\n$res\n";
+ print "not ";
+ }
+ print "ok ", ++$i, "\n";
+ 1 while unlink $tmpfile;
+ $fil or next;
+ 1 while unlink $alifile;
+ }
+
+__END__
+# unsupported pragma
+use charnames ":scoobydoo";
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+unsupported special ':scoobydoo' in charnames at
+########
+# wrong type of alias (missing colon)
+use charnames "alias";
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+Unknown charname 'e_ACUTE' at
+########
+# alias without an argument
+use charnames ":alias";
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+:alias needs an argument in charnames at
+########
+# reversed sequence
+use charnames ":alias" => ":full";
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+:alias cannot use existing pragma :full \(reversed order\?\) at
+########
+# alias with hashref but no :full
+use charnames ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" };
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+Unknown charname 'LATIN SMALL LETTER E WITH ACUTE' at
+########
+# alias with hashref but with :short
+use charnames ":short", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" };
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+Unknown charname 'LATIN SMALL LETTER E WITH ACUTE' at
+########
+# alias with hashref to :full OK
+use charnames ":full", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" };
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+$
+########
+# alias with hashref to :short but using :full
+use charnames ":full", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE" };
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+Unknown charname 'LATIN:e WITH ACUTE' at
+########
+# alias with hashref to :short OK
+use charnames ":short", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE" };
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+$
+########
+# alias with bad hashref
+use charnames ":short", ":alias" => "e_ACUTE";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+unicore/e_ACUTE_alias.pl cannot be used as alias file for charnames at
+########
+# alias with arrayref
+use charnames ":short", ":alias" => [ e_ACUTE => "LATIN:e WITH ACUTE" ];
+"Here: \N{e_ACUTE}!\n";
+EXPECT
+Only HASH reference supported as argument to :alias at
+########
+# alias with bad hashref
+use charnames ":short", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE", "a_ACUTE" };
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+Use of uninitialized value in string eq at
+########
+# alias with hashref two aliases
+use charnames ":short", ":alias" => {
+ e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "",
+ };
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+Unknown charname '' at
+########
+# alias with hashref two aliases
+use charnames ":short", ":alias" => {
+ e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN:a WITH ACUTE",
+ };
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+$
+########
+# alias with hashref using mixed aliasses
+use charnames ":short", ":alias" => {
+ e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN SMALL LETTER A WITH ACUT",
+ };
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+Unknown charname 'LATIN SMALL LETTER A WITH ACUT' at
+########
+# alias with hashref using mixed aliasses
+use charnames ":short", ":alias" => {
+ e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
+ };
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+Unknown charname 'LATIN SMALL LETTER A WITH ACUTE' at
+########
+# alias with hashref using mixed aliasses
+use charnames ":full", ":alias" => {
+ e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
+ };
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+Unknown charname 'LATIN:e WITH ACUTE' at
+########
+# alias with nonexisting file
+use charnames ":full", ":alias" => "xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+unicore/xyzzy_alias.pl cannot be used as alias file for charnames at
+########
+# alias with bad file name
+use charnames ":full", ":alias" => "xy 7-";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+Charnames alias files can only have identifier characters at
+########
+# alias with non_absolute (existing) file name (which it should /not/ use)
+use charnames ":full", ":alias" => "perl";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+EXPECT
+unicore/perl_alias.pl cannot be used as alias file for charnames at
+########
+# alias with bad file
+use charnames ":full", ":alias" => "xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+0;
+EXPECT
+unicore/xyzzy_alias.pl did not return a \(valid\) list of alias pairs at
+########
+# alias with file with empty list
+use charnames ":full", ":alias" => "xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+();
+EXPECT
+Unknown charname 'e_ACUTE' at
+########
+# alias with file OK but file has :short aliasses
+use charnames ":full", ":alias" => "xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+( e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN:a WITH ACUTE",
+ );
+EXPECT
+Unknown charname 'LATIN:e WITH ACUTE' at
+########
+# alias with :short and file OK
+use charnames ":short", ":alias" => "xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+( e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN:a WITH ACUTE",
+ );
+EXPECT
+$
+########
+# alias with :short and file OK has :long aliasses
+use charnames ":short", ":alias" => "xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+( e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
+ a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
+ );
+EXPECT
+Unknown charname 'LATIN SMALL LETTER E WITH ACUTE' at
+########
+# alias with file implicit :full but file has :short aliasses
+use charnames ":alias" => ":xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+( e_ACUTE => "LATIN:e WITH ACUTE",
+ a_ACUTE => "LATIN:a WITH ACUTE",
+ );
+EXPECT
+Unknown charname 'LATIN:e WITH ACUTE' at
+########
+# alias with file implicit :full and file has :long aliasses
+use charnames ":alias" => ":xyzzy";
+"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
+FILE
+#!perl
+( e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
+ a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
+ );
+EXPECT
+$
diff --git a/gnu/usr.bin/perl/lib/constant.t b/gnu/usr.bin/perl/lib/constant.t
index 1127dcf7545..08de291e96f 100644
--- a/gnu/usr.bin/perl/lib/constant.t
+++ b/gnu/usr.bin/perl/lib/constant.t
@@ -10,7 +10,7 @@ use vars qw{ @warnings };
BEGIN { # ...and save 'em for later
$SIG{'__WARN__'} = sub { push @warnings, @_ }
}
-END { print @warnings }
+END { print STDERR @warnings }
######################### We start with some black magic to print on failure.
@@ -244,7 +244,7 @@ test 74, @{+FAMILY} == THREE;
test 75, @{+FAMILY} == @{RFAM->[0]};
test 76, FAMILY->[2] eq RFAM->[0]->[2];
test 77, AGES->{FAMILY->[1]} == 28;
-test 78, PHFAM->{John} == AGES->{John};
+{ no warnings 'deprecated'; test 78, PHFAM->{John} == AGES->{John}; }
test 79, PHFAM->[3] == AGES->{FAMILY->[2]};
test 80, @{+PHFAM} == SPIT->(THREE+1);
test 81, THREE**3 eq SPIT->(@{+FAMILY}**3);
diff --git a/gnu/usr.bin/perl/lib/dumpvar.t b/gnu/usr.bin/perl/lib/dumpvar.t
new file mode 100644
index 00000000000..f13bcee9aca
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/dumpvar.t
@@ -0,0 +1,311 @@
+#!./perl -- -*- mode: cperl; cperl-indent-level: 4 -*-
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+use strict;
+
+$|=1;
+
+my @prgs;
+{
+ local $/;
+ @prgs = split "########\n", <DATA>;
+ close DATA;
+}
+
+use Test::More;
+
+plan tests => scalar @prgs;
+
+require "dumpvar.pl";
+
+sub unctrl { print dumpvar::unctrl($_[0]), "\n" }
+sub uniescape { print dumpvar::uniescape($_[0]), "\n" }
+sub stringify { print dumpvar::stringify($_[0]), "\n" }
+sub dumpvalue {
+ # Call main::dumpValue exactly as the perl5db.pl calls it.
+ local $\ = '';
+ local $, = '';
+ local $" = ' ';
+ my @params = @_;
+ &main::dumpValue(\@params,-1);
+}
+
+package Foo;
+
+sub new { my $class = shift; bless [ @_ ], $class }
+
+package Bar;
+
+sub new { my $class = shift; bless [ @_ ], $class }
+
+use overload '""' => sub { "Bar<@{$_[0]}>" };
+
+package main;
+
+my $foo = Foo->new(1..5);
+my $bar = Bar->new(1..5);
+
+for (@prgs) {
+ my($prog, $expected) = split(/\nEXPECT\n?/, $_);
+ # TODO: dumpvar::stringify() is controlled by a pile of package
+ # dumpvar variables: $printUndef, $unctrl, $quoteHighBit, $bareStringify,
+ # and so forth. We need to test with various settings of those.
+ my $out = tie *STDOUT, 'TieOut';
+ eval $prog;
+ my $ERR = $@;
+ untie $out;
+ if ($ERR) {
+ ok(0, "$prog - $ERR");
+ } else {
+ if ($expected =~ m:^/:) {
+ like($$out, $expected, $prog);
+ } else {
+ is($$out, $expected, $prog);
+ }
+ }
+}
+
+package TieOut;
+
+sub TIEHANDLE {
+ bless( \(my $self), $_[0] );
+}
+
+sub PRINT {
+ my $self = shift;
+ $$self .= join('', @_);
+}
+
+sub read {
+ my $self = shift;
+ substr( $$self, 0, length($$self), '' );
+}
+
+__END__
+unctrl("A");
+EXPECT
+A
+########
+unctrl("\cA");
+EXPECT
+^A
+########
+uniescape("A");
+EXPECT
+A
+########
+uniescape("\x{100}");
+EXPECT
+\x{0100}
+########
+stringify(undef);
+EXPECT
+undef
+########
+stringify("foo");
+EXPECT
+'foo'
+########
+stringify("\cA");
+EXPECT
+"\cA"
+########
+stringify(*a);
+EXPECT
+*main::a
+########
+stringify(\undef);
+EXPECT
+/^'SCALAR\(0x[0-9a-f]+\)'$/i
+########
+stringify([]);
+EXPECT
+/^'ARRAY\(0x[0-9a-f]+\)'$/i
+########
+stringify({});
+EXPECT
+/^'HASH\(0x[0-9a-f]+\)'$/i
+########
+stringify(sub{});
+EXPECT
+/^'CODE\(0x[0-9a-f]+\)'$/i
+########
+stringify(\*a);
+EXPECT
+/^'GLOB\(0x[0-9a-f]+\)'$/i
+########
+stringify($foo);
+EXPECT
+/^'Foo=ARRAY\(0x[0-9a-f]+\)'$/i
+########
+stringify($bar);
+EXPECT
+/^'Bar=ARRAY\(0x[0-9a-f]+\)'$/i
+########
+dumpValue(undef);
+EXPECT
+undef
+########
+dumpValue(1);
+EXPECT
+1
+########
+dumpValue("\cA");
+EXPECT
+"\cA"
+########
+dumpValue("\x{100}");
+EXPECT
+'\x{0100}'
+########
+dumpValue("1\n2\n3");
+EXPECT
+'1
+2
+3'
+########
+dumpValue([1..3],1);
+EXPECT
+0 1
+1 2
+2 3
+########
+dumpValue([1..3]);
+EXPECT
+0 1
+1 2
+2 3
+########
+dumpValue({1..4},1);
+EXPECT
+1 => 2
+3 => 4
+########
+dumpValue({1..4});
+EXPECT
+1 => 2
+3 => 4
+########
+dumpValue($foo,1);
+EXPECT
+0 1
+1 2
+2 3
+3 4
+4 5
+########
+dumpValue($foo);
+EXPECT
+0 1
+1 2
+2 3
+3 4
+4 5
+########
+dumpValue($bar,1);
+EXPECT
+0 1
+1 2
+2 3
+3 4
+4 5
+########
+dumpValue($bar);
+EXPECT
+0 1
+1 2
+2 3
+3 4
+4 5
+########
+dumpvalue("a");
+EXPECT
+0 'a'
+########
+dumpvalue("\cA");
+EXPECT
+0 "\cA"
+########
+dumpvalue("\x{100}");
+EXPECT
+0 '\x{0100}'
+########
+dumpvalue(undef);
+EXPECT
+0 undef
+########
+dumpvalue("foo");
+EXPECT
+0 'foo'
+########
+dumpvalue(\undef);
+EXPECT
+/0 SCALAR\(0x[0-9a-f]+\)\n -> undef\n/i
+########
+dumpvalue(\\undef);
+EXPECT
+/0 REF\(0x[0-9a-f]+\)\n -> SCALAR\(0x[0-9a-f]+\)\n -> undef\n/i
+########
+dumpvalue([]);
+EXPECT
+/0 ARRAY\(0x[0-9a-f]+\)\n empty array/i
+########
+dumpvalue({});
+EXPECT
+/0 HASH\(0x[0-9a-f]+\)\n\s+empty hash/i
+########
+dumpvalue(sub{});
+EXPECT
+/0 CODE\(0x[0-9a-f]+\)\n -> &CODE\(0x[0-9a-f]+\) in /i
+########
+dumpvalue(\*a);
+EXPECT
+/0 GLOB\(0x[0-9a-f]+\)\n -> \*main::a\n/i
+########
+dumpvalue($foo);
+EXPECT
+/0 Foo=ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 3 4\n 4 5\n/i
+########
+dumpvalue($bar);
+EXPECT
+/0 Bar=ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 3 4\n 4 5\n/i
+########
+dumpvalue("1\n2\n3")
+EXPECT
+/0 '1\n2\n3'\n/i
+########
+dumpvalue([1..4]);
+EXPECT
+/0 ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 3 4\n/i
+########
+dumpvalue({1..4});
+EXPECT
+/0 HASH\(0x[0-9a-f]+\)\n 1 => 2\n 3 => 4\n/i
+########
+dumpvalue({1=>2,3=>4});
+EXPECT
+/0 HASH\(0x[0-9a-f]+\)\n 1 => 2\n 3 => 4\n/i
+########
+dumpvalue({a=>1,b=>2});
+EXPECT
+/0 HASH\(0x[0-9a-f]+\)\n 'a' => 1\n 'b' => 2\n/i
+########
+dumpvalue([{a=>[1,2,3],b=>{c=>1,d=>2}},{e=>{f=>1,g=>2},h=>[qw(i j k)]}]);
+EXPECT
+/0 ARRAY\(0x[0-9a-f]+\)\n 0 HASH\(0x[0-9a-f]+\)\n 'a' => ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 'b' => HASH\(0x[0-9a-f]+\)\n 'c' => 1\n 'd' => 2\n 1 HASH\(0x[0-9a-f]+\)\n 'e' => HASH\(0x[0-9a-f]+\)\n 'f' => 1\n 'g' => 2\n 'h' => ARRAY\(0x[0-9a-f]+\)\n 0 'i'\n 1 'j'\n 2 'k'/i
+########
+dumpvalue({reverse map {$_=>1} sort qw(the quick brown fox)})
+EXPECT
+/0 HASH\(0x[0-9a-f]+\)\n 1 => 'brown'\n/i
+########
+my @x=qw(a b c); dumpvalue(\@x);
+EXPECT
+/0 ARRAY\(0x[0-9a-f]+\)\n 0 'a'\n 1 'b'\n 2 'c'\n/i
+########
+my %x=(a=>1, b=>2); dumpvalue(\%x);
+EXPECT
+/0 HASH\(0x[0-9a-f]+\)\n 'a' => 1\n 'b' => 2\n/i
diff --git a/gnu/usr.bin/perl/lib/fields.pm b/gnu/usr.bin/perl/lib/fields.pm
index be2a7aedab4..cca778f905d 100644
--- a/gnu/usr.bin/perl/lib/fields.pm
+++ b/gnu/usr.bin/perl/lib/fields.pm
@@ -1,5 +1,173 @@
package fields;
+require 5.005;
+use strict;
+no strict 'refs';
+unless( eval q{require warnings::register; warnings::register->import} ) {
+ *warnings::warnif = sub {
+ require Carp;
+ Carp::carp(@_);
+ }
+}
+use vars qw(%attr $VERSION);
+
+$VERSION = '2.03';
+
+# constant.pm is slow
+sub PUBLIC () { 2**0 }
+sub PRIVATE () { 2**1 }
+sub INHERITED () { 2**2 }
+sub PROTECTED () { 2**3 }
+
+
+# The %attr hash holds the attributes of the currently assigned fields
+# per class. The hash is indexed by class names and the hash value is
+# an array reference. The first element in the array is the lowest field
+# number not belonging to a base class. The remaining elements' indices
+# are the field numbers. The values are integer bit masks, or undef
+# in the case of base class private fields (which occupy a slot but are
+# otherwise irrelevant to the class).
+
+sub import {
+ my $class = shift;
+ return unless @_;
+ my $package = caller(0);
+ # avoid possible typo warnings
+ %{"$package\::FIELDS"} = () unless %{"$package\::FIELDS"};
+ my $fields = \%{"$package\::FIELDS"};
+ my $fattr = ($attr{$package} ||= [1]);
+ my $next = @$fattr;
+
+ # Quiet pseudo-hash deprecation warning for uses of fields::new.
+ bless \%{"$package\::FIELDS"}, 'pseudohash';
+
+ if ($next > $fattr->[0]
+ and ($fields->{$_[0]} || 0) >= $fattr->[0])
+ {
+ # There are already fields not belonging to base classes.
+ # Looks like a possible module reload...
+ $next = $fattr->[0];
+ }
+ foreach my $f (@_) {
+ my $fno = $fields->{$f};
+
+ # Allow the module to be reloaded so long as field positions
+ # have not changed.
+ if ($fno and $fno != $next) {
+ require Carp;
+ if ($fno < $fattr->[0]) {
+ if ($] < 5.006001) {
+ warn("Hides field '$f' in base class") if $^W;
+ } else {
+ warnings::warnif("Hides field '$f' in base class") ;
+ }
+ } else {
+ Carp::croak("Field name '$f' already in use");
+ }
+ }
+ $fields->{$f} = $next;
+ $fattr->[$next] = ($f =~ /^_/) ? PRIVATE : PUBLIC;
+ $next += 1;
+ }
+ if (@$fattr > $next) {
+ # Well, we gave them the benefit of the doubt by guessing the
+ # module was reloaded, but they appear to be declaring fields
+ # in more than one place. We can't be sure (without some extra
+ # bookkeeping) that the rest of the fields will be declared or
+ # have the same positions, so punt.
+ require Carp;
+ Carp::croak ("Reloaded module must declare all fields at once");
+ }
+}
+
+sub inherit {
+ require base;
+ goto &base::inherit_fields;
+}
+
+sub _dump # sometimes useful for debugging
+{
+ for my $pkg (sort keys %attr) {
+ print "\n$pkg";
+ if (@{"$pkg\::ISA"}) {
+ print " (", join(", ", @{"$pkg\::ISA"}), ")";
+ }
+ print "\n";
+ my $fields = \%{"$pkg\::FIELDS"};
+ for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) {
+ my $no = $fields->{$f};
+ print " $no: $f";
+ my $fattr = $attr{$pkg}[$no];
+ if (defined $fattr) {
+ my @a;
+ push(@a, "public") if $fattr & PUBLIC;
+ push(@a, "private") if $fattr & PRIVATE;
+ push(@a, "inherited") if $fattr & INHERITED;
+ print "\t(", join(", ", @a), ")";
+ }
+ print "\n";
+ }
+ }
+}
+
+if ($] < 5.009) {
+ *new = sub {
+ my $class = shift;
+ $class = ref $class if ref $class;
+ return bless [\%{$class . "::FIELDS"}], $class;
+ }
+} else {
+ *new = sub {
+ my $class = shift;
+ $class = ref $class if ref $class;
+ require Hash::Util;
+ my $self = bless {}, $class;
+
+ # The lock_keys() prototype won't work since we require Hash::Util :(
+ &Hash::Util::lock_keys(\%$self, keys %{$class.'::FIELDS'});
+ return $self;
+ }
+}
+
+sub phash {
+ die "Pseudo-hashes have been removed from Perl" if $] >= 5.009;
+ my $h;
+ my $v;
+ if (@_) {
+ if (ref $_[0] eq 'ARRAY') {
+ my $a = shift;
+ @$h{@$a} = 1 .. @$a;
+ if (@_) {
+ $v = shift;
+ unless (! @_ and ref $v eq 'ARRAY') {
+ require Carp;
+ Carp::croak ("Expected at most two array refs\n");
+ }
+ }
+ }
+ else {
+ if (@_ % 2) {
+ require Carp;
+ Carp::croak ("Odd number of elements initializing pseudo-hash\n");
+ }
+ my $i = 0;
+ @$h{grep ++$i % 2, @_} = 1 .. @_ / 2;
+ $i = 0;
+ $v = [grep $i++ % 2, @_];
+ }
+ }
+ else {
+ $h = {};
+ $v = [];
+ }
+ [ $h, @$v ];
+
+}
+
+1;
+
+__END__
+
=head1 NAME
fields - compile-time class fields
@@ -21,10 +189,10 @@ fields - compile-time class fields
}
}
- my Foo $var = Foo::->new;
+ my $var = Foo->new;
$var->{foo} = 42;
- # this will generate a compile-time error
+ # this will generate an error
$var->{zap} = 42;
# subclassing
@@ -51,10 +219,13 @@ hash of the calling package, but this may change in future versions.
Do B<not> update the %FIELDS hash directly, because it must be created
at compile-time for it to be fully useful, as is done by this pragma.
+B<Only valid for perl before 5.9.0:>
+
If a typed lexical variable holding a reference is used to access a
-hash element and a package with the same name as the type has declared
-class fields using this pragma, then the operation is turned into an
-array access at compile time.
+hash element and a package with the same name as the type has
+declared class fields using this pragma, then the operation is
+turned into an array access at compile time.
+
The related C<base> pragma will combine fields from base classes and any
fields declared using the C<fields> pragma. This enables field
@@ -65,26 +236,39 @@ the class and are not visible to subclasses. Inherited fields can be
overridden but will generate a warning if used together with the C<-w>
switch.
-The effect of all this is that you can have objects with named fields
-which are as compact and as fast arrays to access. This only works
-as long as the objects are accessed through properly typed variables.
-If the objects are not typed, access is only checked at run time.
+B<Only valid for perls before 5.9.0:>
+
+The effect of all this is that you can have objects with named
+fields which are as compact and as fast arrays to access. This only
+works as long as the objects are accessed through properly typed
+variables. If the objects are not typed, access is only checked at
+run time.
+
The following functions are supported:
-=over 8
+=over 4
=item new
-fields::new() creates and blesses a pseudo-hash comprised of the fields
-declared using the C<fields> pragma into the specified class.
+B< perl before 5.9.0: > fields::new() creates and blesses a
+pseudo-hash comprised of the fields declared using the C<fields>
+pragma into the specified class.
+
+B< perl 5.9.0 and higher: > fields::new() creates and blesses a
+restricted-hash comprised of the fields declared using the C<fields>
+pragma into the specified class.
+
+This function is usable with or without pseudo-hashes. It is the
+recommended way to construct a fields-based object.
+
This makes it possible to write a constructor like this:
package Critter::Sounds;
use fields qw(cat dog bird);
sub new {
- my Critter::Sounds $self = shift;
+ my $self = shift;
$self = fields::new($self) unless ref $self;
$self->{cat} = 'meow'; # scalar element
@$self{'dog','bird'} = ('bark','tweet'); # slice
@@ -93,6 +277,8 @@ This makes it possible to write a constructor like this:
=item phash
+B< before perl 5.9.0: >
+
fields::phash() can be used to create and initialize a plain (unblessed)
pseudo-hash. This function should always be used instead of creating
pseudo-hashes directly.
@@ -106,180 +292,28 @@ This makes it particularly useful for creating a pseudo-hash from
subroutine arguments:
sub dogtag {
- my $tag = fields::phash([qw(name rank ser_num)], [@_]);
+ my $tag = fields::phash([qw(name rank ser_num)], [@_]);
}
fields::phash() also accepts a list of key-value pairs that will
be used to construct the pseudo hash. Examples:
my $tag = fields::phash(name => "Joe",
- rank => "captain",
- ser_num => 42);
+ rank => "captain",
+ ser_num => 42);
my $pseudohash = fields::phash(%args);
+B< perl 5.9.0 and higher: >
+
+Pseudo-hashes have been removed from Perl as of 5.10. Consider using
+restricted hashes or fields::new() instead. Using fields::phash()
+will cause an error.
+
=back
=head1 SEE ALSO
-L<base>,
-L<perlref/Pseudo-hashes: Using an array as a hash>
+L<base>
=cut
-
-use 5.006_001;
-use strict;
-no strict 'refs';
-use warnings::register;
-our(%attr, $VERSION);
-
-$VERSION = "1.02";
-
-# some constants
-sub _PUBLIC () { 1 }
-sub _PRIVATE () { 2 }
-
-# The %attr hash holds the attributes of the currently assigned fields
-# per class. The hash is indexed by class names and the hash value is
-# an array reference. The first element in the array is the lowest field
-# number not belonging to a base class. The remaining elements' indices
-# are the field numbers. The values are integer bit masks, or undef
-# in the case of base class private fields (which occupy a slot but are
-# otherwise irrelevant to the class).
-
-sub import {
- my $class = shift;
- return unless @_;
- my $package = caller(0);
- # avoid possible typo warnings
- %{"$package\::FIELDS"} = () unless %{"$package\::FIELDS"};
- my $fields = \%{"$package\::FIELDS"};
- my $fattr = ($attr{$package} ||= [1]);
- my $next = @$fattr;
-
- if ($next > $fattr->[0]
- and ($fields->{$_[0]} || 0) >= $fattr->[0])
- {
- # There are already fields not belonging to base classes.
- # Looks like a possible module reload...
- $next = $fattr->[0];
- }
- foreach my $f (@_) {
- my $fno = $fields->{$f};
-
- # Allow the module to be reloaded so long as field positions
- # have not changed.
- if ($fno and $fno != $next) {
- require Carp;
- if ($fno < $fattr->[0]) {
- warnings::warnif("Hides field '$f' in base class") ;
- } else {
- Carp::croak("Field name '$f' already in use");
- }
- }
- $fields->{$f} = $next;
- $fattr->[$next] = ($f =~ /^_/) ? _PRIVATE : _PUBLIC;
- $next += 1;
- }
- if (@$fattr > $next) {
- # Well, we gave them the benefit of the doubt by guessing the
- # module was reloaded, but they appear to be declaring fields
- # in more than one place. We can't be sure (without some extra
- # bookkeeping) that the rest of the fields will be declared or
- # have the same positions, so punt.
- require Carp;
- Carp::croak ("Reloaded module must declare all fields at once");
- }
-}
-
-sub inherit { # called by base.pm when $base_fields is nonempty
- my($derived, $base) = @_;
- my $base_attr = $attr{$base};
- my $derived_attr = $attr{$derived} ||= [];
- # avoid possible typo warnings
- %{"$base\::FIELDS"} = () unless %{"$base\::FIELDS"};
- %{"$derived\::FIELDS"} = () unless %{"$derived\::FIELDS"};
- my $base_fields = \%{"$base\::FIELDS"};
- my $derived_fields = \%{"$derived\::FIELDS"};
-
- $derived_attr->[0] = $base_attr ? scalar(@$base_attr) : 1;
- while (my($k,$v) = each %$base_fields) {
- my($fno);
- if ($fno = $derived_fields->{$k} and $fno != $v) {
- require Carp;
- Carp::croak ("Inherited %FIELDS can't override existing %FIELDS");
- }
- if ($base_attr->[$v] & _PRIVATE) {
- $derived_attr->[$v] = undef;
- } else {
- $derived_attr->[$v] = $base_attr->[$v];
- $derived_fields->{$k} = $v;
- }
- }
-}
-
-sub _dump # sometimes useful for debugging
-{
- for my $pkg (sort keys %attr) {
- print "\n$pkg";
- if (@{"$pkg\::ISA"}) {
- print " (", join(", ", @{"$pkg\::ISA"}), ")";
- }
- print "\n";
- my $fields = \%{"$pkg\::FIELDS"};
- for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) {
- my $no = $fields->{$f};
- print " $no: $f";
- my $fattr = $attr{$pkg}[$no];
- if (defined $fattr) {
- my @a;
- push(@a, "public") if $fattr & _PUBLIC;
- push(@a, "private") if $fattr & _PRIVATE;
- push(@a, "inherited") if $no < $attr{$pkg}[0];
- print "\t(", join(", ", @a), ")";
- }
- print "\n";
- }
- }
-}
-
-sub new {
- my $class = shift;
- $class = ref $class if ref $class;
- return bless [\%{$class . "::FIELDS"}], $class;
-}
-
-sub phash {
- my $h;
- my $v;
- if (@_) {
- if (ref $_[0] eq 'ARRAY') {
- my $a = shift;
- @$h{@$a} = 1 .. @$a;
- if (@_) {
- $v = shift;
- unless (! @_ and ref $v eq 'ARRAY') {
- require Carp;
- Carp::croak ("Expected at most two array refs\n");
- }
- }
- }
- else {
- if (@_ % 2) {
- require Carp;
- Carp::croak ("Odd number of elements initializing pseudo-hash\n");
- }
- my $i = 0;
- @$h{grep ++$i % 2, @_} = 1 .. @_ / 2;
- $i = 0;
- $v = [grep $i++ % 2, @_];
- }
- }
- else {
- $h = {};
- $v = [];
- }
- [ $h, @$v ];
-}
-
-1;
diff --git a/gnu/usr.bin/perl/lib/filetest.pm b/gnu/usr.bin/perl/lib/filetest.pm
index 21252f35a6f..0c627416866 100644
--- a/gnu/usr.bin/perl/lib/filetest.pm
+++ b/gnu/usr.bin/perl/lib/filetest.pm
@@ -1,6 +1,6 @@
package filetest;
-our $VERSION = '1.00';
+our $VERSION = '1.01';
=head1 NAME
@@ -18,10 +18,10 @@ filetest - Perl pragma to control the filetest permission operators
=head1 DESCRIPTION
This pragma tells the compiler to change the behaviour of the filetest
-permissions operators, the C<-r> C<-w> C<-x> C<-R> C<-W> C<-X>
+permission operators, C<-r> C<-w> C<-x> C<-R> C<-W> C<-X>
(see L<perlfunc>).
-The default behaviour to use the mode bits as returned by the stat()
+The default behaviour is to use the mode bits as returned by the stat()
family of calls. This, however, may not be the right thing to do if
for example various ACL (access control lists) schemes are in use.
For such environments, C<use filetest> may help the permission
@@ -38,7 +38,8 @@ B<NOTE>: using the file tests for security purposes is a lost cause
from the start: there is a window open for race conditions (who is to
say that the permissions will not change between the test and the real
operation?). Therefore if you are serious about security, just try
-the real operation and test for its success. Think atomicity.
+the real operation and test for its success - think in terms of atomic
+operations.
=head2 subpragma access
@@ -49,7 +50,7 @@ operators is a filename, not when it is a filehandle.
=cut
-$filetest::hint_bits = 0x00400000;
+$filetest::hint_bits = 0x00400000; # HINT_FILETEST_ACCESS
sub import {
if ( $_[1] eq 'access' ) {
diff --git a/gnu/usr.bin/perl/lib/filetest.t b/gnu/usr.bin/perl/lib/filetest.t
index 096031c63d0..7ea977295a8 100644
--- a/gnu/usr.bin/perl/lib/filetest.t
+++ b/gnu/usr.bin/perl/lib/filetest.t
@@ -5,7 +5,7 @@ BEGIN {
@INC = '../lib';
}
-use Test::More tests => 11;
+use Test::More tests => 15;
# these two should be kept in sync with the pragma itself
# if hint bits are changed there, other things *will* break
@@ -49,3 +49,42 @@ like( $@, qr/^$error/, 'filetest dies with missing subpragma on use' );
eval "no filetest";
like( $@, qr/^$error/, 'filetest dies with missing subpragma on unuse' );
+
+SKIP: {
+ # A real test for filetest.
+ # This works for systems with /usr/bin/chflags (i.e. BSD4.4 systems).
+ my $chflags = "/usr/bin/chflags";
+ my $tstfile = "filetest.tst";
+ skip("No $chflags available", 4) if !-x $chflags;
+
+ skip("Test does not work on OpenBSD, BSD/OS, and Darwin", 4)
+ if $^O =~ /^(?:openbsd|bsdos|darwin)$/;
+
+ SKIP: {
+ eval {
+ if (!-e $tstfile) {
+ open(T, ">$tstfile") or die "Can't create $tstfile: $!";
+ close T;
+ }
+ system($chflags, "uchg", $tstfile);
+ die "Can't exec $chflags uchg" if $? != 0;
+ };
+ skip("Errors in test using chflags: $@", 4) if $@;
+
+ {
+ use filetest 'access';
+ is(-w $tstfile, undef, "$tstfile should not be recognized as writable");
+ is(-W $tstfile, undef, "$tstfile should not be recognized as writable");
+ }
+ {
+ no filetest 'access';
+ is(-w $tstfile, 1, "$tstfile should be recognized as writable");
+ is(-W $tstfile, 1, "$tstfile should be recognized as writable");
+ }
+ }
+
+ # cleanup
+ system($chflags, "nouchg", $tstfile);
+ unlink $tstfile;
+ warn "Can't remove $tstfile: $!" if -e $tstfile;
+}
diff --git a/gnu/usr.bin/perl/lib/h2xs.t b/gnu/usr.bin/perl/lib/h2xs.t
index 5acc0b2c21f..2a5e14b66d5 100644
--- a/gnu/usr.bin/perl/lib/h2xs.t
+++ b/gnu/usr.bin/perl/lib/h2xs.t
@@ -58,74 +58,74 @@ If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.
Writing $name/ppport.h
-Writing $name/$name.pm
+Writing $name/lib/$name.pm
Writing $name/$name.xs
Writing $name/fallback/const-c.inc
Writing $name/fallback/const-xs.inc
Writing $name/Makefile.PL
Writing $name/README
-Writing $name/t/1.t
+Writing $name/t/$name.t
Writing $name/Changes
Writing $name/MANIFEST
EOXSFILES
"-f -n $name -b $thisversion", $], <<"EOXSFILES",
Writing $name/ppport.h
-Writing $name/$name.pm
+Writing $name/lib/$name.pm
Writing $name/$name.xs
Writing $name/fallback/const-c.inc
Writing $name/fallback/const-xs.inc
Writing $name/Makefile.PL
Writing $name/README
-Writing $name/t/1.t
+Writing $name/t/$name.t
Writing $name/Changes
Writing $name/MANIFEST
EOXSFILES
"-f -n $name -b 5.6.1", "5.006001", <<"EOXSFILES",
Writing $name/ppport.h
-Writing $name/$name.pm
+Writing $name/lib/$name.pm
Writing $name/$name.xs
Writing $name/fallback/const-c.inc
Writing $name/fallback/const-xs.inc
Writing $name/Makefile.PL
Writing $name/README
-Writing $name/t/1.t
+Writing $name/t/$name.t
Writing $name/Changes
Writing $name/MANIFEST
EOXSFILES
"-f -n $name -b 5.5.3", "5.00503", <<"EOXSFILES",
Writing $name/ppport.h
-Writing $name/$name.pm
+Writing $name/lib/$name.pm
Writing $name/$name.xs
Writing $name/fallback/const-c.inc
Writing $name/fallback/const-xs.inc
Writing $name/Makefile.PL
Writing $name/README
-Writing $name/t/1.t
+Writing $name/t/$name.t
Writing $name/Changes
Writing $name/MANIFEST
EOXSFILES
"\"-X\" -f -n $name -b $thisversion", $], <<"EONOXSFILES",
-Writing $name/$name.pm
+Writing $name/lib/$name.pm
Writing $name/Makefile.PL
Writing $name/README
-Writing $name/t/1.t
+Writing $name/t/$name.t
Writing $name/Changes
Writing $name/MANIFEST
EONOXSFILES
"-f -n $name $header -b $thisversion", $], <<"EOXSFILES",
Writing $name/ppport.h
-Writing $name/$name.pm
+Writing $name/lib/$name.pm
Writing $name/$name.xs
Writing $name/fallback/const-c.inc
Writing $name/fallback/const-xs.inc
Writing $name/Makefile.PL
Writing $name/README
-Writing $name/t/1.t
+Writing $name/t/$name.t
Writing $name/Changes
Writing $name/MANIFEST
EOXSFILES
@@ -134,7 +134,7 @@ EOXSFILES
my $total_tests = 3; # opening, closing and deleting the header file.
for (my $i = $#tests; $i > 0; $i-=3) {
# 1 test for running it, 1 test for the expected result, and 1 for each file
- # plus 1 to open and 1 to check for the use in $name.pm and Makefile.PL
+ # plus 1 to open and 1 to check for the use in lib/$name.pm and Makefile.PL
# And 1 more for our check for "bonus" files, 2 more for ExtUtil::Manifest.
# use the () to force list context and hence count the number of matches.
$total_tests += 9 + (() = $tests[$i] =~ /(Writing)/sg);
@@ -199,7 +199,7 @@ while (my ($args, $version, $expectation) = splice @tests, 0, 3) {
pop @INC;
chdir ($up) or die "chdir $up failed: $!";
- foreach my $leaf ("$name.pm", 'Makefile.PL') {
+ foreach my $leaf (File::Spec->catfile('lib', "$name.pm"), 'Makefile.PL') {
my $file = File::Spec->catfile($name, $leaf);
if (ok (open (FILE, $file), "open $file")) {
my $match = qr/use $version;/;
diff --git a/gnu/usr.bin/perl/lib/if.pm b/gnu/usr.bin/perl/lib/if.pm
index 32c4fad45ec..6574d978bb6 100644
--- a/gnu/usr.bin/perl/lib/if.pm
+++ b/gnu/usr.bin/perl/lib/if.pm
@@ -1,13 +1,17 @@
package if;
-our $VERSION = '0.01';
+our $VERSION = '0.03';
sub work {
my $method = shift() ? 'import' : 'unimport';
return unless shift; # CONDITION
- my $p = shift; # PACKAGE
- eval "require $p" or die; # Adds .pm etc if needed
- $p->$method(@_) if $p->can($method);
+
+ my $p = $_[0]; # PACKAGE
+ (my $file = "$p.pm") =~ s!::!/!g;
+ require $file or die;
+
+ my $m = $p->can($method);
+ goto &$m if $m;
}
sub import { shift; unshift @_, 1; goto &work }
diff --git a/gnu/usr.bin/perl/lib/if.t b/gnu/usr.bin/perl/lib/if.t
index 12ad0b0c390..61cc4b2630a 100644
--- a/gnu/usr.bin/perl/lib/if.t
+++ b/gnu/usr.bin/perl/lib/if.t
@@ -5,7 +5,7 @@ BEGIN {
@INC = '../lib';
}
-use Test::More tests => 4;
+use Test::More tests => 6;
my $v_plus = $] + 1;
my $v_minus = $] - 1;
@@ -24,3 +24,8 @@ ok( (not defined eval "use if ($v_plus > \$]), strict => 'refs'; \${'f'} = 12"
and $@ =~ /while "strict refs" in use/),
'"use if" with a true condition and a pragma');
+ok( eval "use if 1, Cwd; cwd() || 1;",
+ '"use if" with a true condition, module, no arguments, exports');
+
+ok( eval "use if qw/ 1 if 1 strict subs /; \${'f'} = 12" eq 12,
+ '"use if" with a module named after keyword');
diff --git a/gnu/usr.bin/perl/lib/lib.t b/gnu/usr.bin/perl/lib/lib.t
index 41280eee398..c137a3fa065 100644
--- a/gnu/usr.bin/perl/lib/lib.t
+++ b/gnu/usr.bin/perl/lib/lib.t
@@ -6,7 +6,7 @@ BEGIN {
@OrigINC = @INC;
}
-use Test::More tests => 12;
+use Test::More tests => 13;
use Config;
use File::Spec;
use File::Path;
@@ -81,6 +81,9 @@ BEGIN {
no lib $Lib_Dir;
+unlike( do { eval 'use lib $Config{installsitelib};'; $@ || '' },
+ qr/::Config is read-only/, 'lib handles readonly stuff' );
+
BEGIN {
is( grep(/stuff/, @INC), 0, 'no lib' );
ok( !do 'Yup.pm', ' do() effected' );
diff --git a/gnu/usr.bin/perl/lib/lib_pm.PL b/gnu/usr.bin/perl/lib/lib_pm.PL
index 6c9ab05bc0c..d7e546f002a 100644
--- a/gnu/usr.bin/perl/lib/lib_pm.PL
+++ b/gnu/usr.bin/perl/lib/lib_pm.PL
@@ -58,7 +58,7 @@ my \@inc_version_list = $Config_inc_version_list;
print OUT <<'!NO!SUBS!';
our @ORIG_INC = @INC; # take a handy copy of 'original' value
-our $VERSION = '0.5564';
+our $VERSION = '0.5565';
my $Is_MacOS = $^O eq 'MacOS';
my $Mac_FS;
if ($Is_MacOS) {
@@ -71,30 +71,31 @@ sub import {
my %names;
foreach (reverse @_) {
- if ($_ eq '') {
+ my $path = $_; # we'll be modifying it, so break the alias
+ if ($path eq '') {
require Carp;
Carp::carp("Empty compile time value given to use lib");
}
- local $_ = _nativize($_);
+ $path = _nativize($path);
- if (-e && ! -d _) {
+ if (-e $path && ! -d _) {
require Carp;
Carp::carp("Parameter to use lib must be directory, not file");
}
- unshift(@INC, $_);
+ unshift(@INC, $path);
# Add any previous version directories we found at configure time
foreach my $incver (@inc_version_list)
{
my $dir = $Is_MacOS
- ? File::Spec->catdir( $_, $incver )
- : "$_/$incver";
+ ? File::Spec->catdir( $path, $incver )
+ : "$path/$incver";
unshift(@INC, $dir) if -d $dir;
}
- # Put a corresponding archlib directory in front of $_ if it
- # looks like $_ has an archlib directory below it.
+ # Put a corresponding archlib directory in front of $path if it
+ # looks like $path has an archlib directory below it.
my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir)
- = _get_dirs($_);
+ = _get_dirs($path);
unshift(@INC, $arch_dir) if -d $arch_auto_dir;
unshift(@INC, $version_dir) if -d $version_dir;
unshift(@INC, $version_arch_dir) if -d $version_arch_dir;
@@ -111,11 +112,11 @@ sub unimport {
my %names;
foreach (@_) {
- local $_ = _nativize($_);
+ my $path = _nativize($_);
my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir)
- = _get_dirs($_);
- ++$names{$_};
+ = _get_dirs($path);
+ ++$names{$path};
++$names{$arch_dir} if -d $arch_auto_dir;
++$names{$version_dir} if -d $version_dir;
++$names{$version_arch_dir} if -d $version_arch_dir;
@@ -133,15 +134,15 @@ sub _get_dirs {
# we could use this for all platforms in the future, but leave it
# Mac-only for now, until there is more time for testing it.
if ($Is_MacOS) {
- $arch_auto_dir = File::Spec->catdir( $_, $archname, 'auto' );
- $arch_dir = File::Spec->catdir( $_, $archname, );
- $version_dir = File::Spec->catdir( $_, $version );
- $version_arch_dir = File::Spec->catdir( $_, $version, $archname );
+ $arch_auto_dir = File::Spec->catdir( $dir, $archname, 'auto' );
+ $arch_dir = File::Spec->catdir( $dir, $archname, );
+ $version_dir = File::Spec->catdir( $dir, $version );
+ $version_arch_dir = File::Spec->catdir( $dir, $version, $archname );
} else {
- $arch_auto_dir = "$_/$archname/auto";
- $arch_dir = "$_/$archname";
- $version_dir = "$_/$version";
- $version_arch_dir = "$_/$version/$archname";
+ $arch_auto_dir = "$dir/$archname/auto";
+ $arch_dir = "$dir/$archname";
+ $version_dir = "$dir/$version";
+ $version_arch_dir = "$dir/$version/$archname";
}
return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir);
}
diff --git a/gnu/usr.bin/perl/lib/locale.t b/gnu/usr.bin/perl/lib/locale.t
index 7b273309729..a294d2fbc2b 100644
--- a/gnu/usr.bin/perl/lib/locale.t
+++ b/gnu/usr.bin/perl/lib/locale.t
@@ -45,6 +45,9 @@ eval {
# and mingw32 uses said silly CRT
$have_setlocale = 0 if (($^O eq 'MSWin32' || $^O eq 'NetWare') && $Config{cc} =~ /^(cl|gcc)/i);
+# UWIN seems to loop after test 98, just skip for now
+$have_setlocale = 0 if ($^O =~ /^uwin/);
+
my $last = $have_setlocale ? &last : &last_without_setlocale;
print "1..$last\n";
@@ -523,7 +526,17 @@ foreach $Locale (@Locale) {
my $word = join('', @Neoalpha);
- if ($Locale =~ /utf-?8/i) {
+ my $badutf8;
+ {
+ local $SIG{__WARN__} = sub {
+ $badutf8 = $_[0] =~ /Malformed UTF-8/;
+ };
+ $Locale =~ /utf-?8/i;
+ }
+
+ if ($badutf8) {
+ debug "# Locale name contains bad UTF-8, skipping test 99 for locale '$Locale'\n";
+ } elsif ($Locale =~ /utf-?8/i) {
debug "# unknown whether locale and Unicode have the same \\w, skipping test 99 for locale '$Locale'\n";
push @{$Okay{99}}, $Locale;
} else {
diff --git a/gnu/usr.bin/perl/lib/open.pm b/gnu/usr.bin/perl/lib/open.pm
index 2dc1d2130c6..fa2a5181b2f 100644
--- a/gnu/usr.bin/perl/lib/open.pm
+++ b/gnu/usr.bin/perl/lib/open.pm
@@ -1,9 +1,9 @@
package open;
use warnings;
use Carp;
-$open::hint_bits = 0x20000;
+$open::hint_bits = 0x20000; # HINT_LOCALIZE_HH
-our $VERSION = '1.01';
+our $VERSION = '1.02';
my $locale_encoding;
@@ -27,6 +27,7 @@ sub _get_locale_encoding {
} elsif ($ENV{LANG} =~ /^([^.]+)\.([^.]+)$/) {
($country_language, $locale_encoding) = ($1, $2);
}
+ # LANGUAGE affects only LC_MESSAGES only on glibc
} elsif (not $locale_encoding) {
if ($ENV{LC_ALL} =~ /\butf-?8\b/i ||
$ENV{LANG} =~ /\butf-?8\b/i) {
@@ -79,7 +80,7 @@ sub import {
foreach my $layer (split(/\s+/,$dscp)) {
$layer =~ s/^://;
if ($layer eq 'locale') {
- use Encode;
+ require Encode;
_get_locale_encoding()
unless defined $locale_encoding;
(warnings::warnif("layer", "Cannot figure out an encoding to use"), last)
@@ -94,8 +95,8 @@ sub import {
my $target = $layer; # the layer name itself
$target =~ s/^(\w+)\(.+\)$/$1/; # strip parameters
- unless(PerlIO::Layer::->find($target)) {
- warnings::warnif("layer", "Unknown PerlIO layer '$layer'");
+ unless(PerlIO::Layer::->find($target,1)) {
+ warnings::warnif("layer", "Unknown PerlIO layer '$target'");
}
}
push(@val,":$layer");
@@ -165,9 +166,12 @@ Perl is configured to use PerlIO as its IO system (which is now the
default).
The C<open> pragma serves as one of the interfaces to declare default
-"layers" (also known as "disciplines") for all I/O. Any open(),
-readpipe() (aka qx//) and similar operators found within the lexical
-scope of this pragma will use the declared defaults.
+"layers" (also known as "disciplines") for all I/O. Any two-argument
+open(), readpipe() (aka qx//) and similar operators found within the
+lexical scope of this pragma will use the declared defaults.
+Three-argument opens are not affected by this pragma since there you
+(can) explicitly specify the layers and are supposed to know what you
+are doing.
With the C<IN> subpragma you can declare the default layers
of input streams, and with the C<OUT> subpragma you can declare
@@ -250,7 +254,7 @@ pragma.
=back
-If your locale environment variables (LANGUAGE, LC_ALL, LC_CTYPE, LANG)
+If your locale environment variables (LC_ALL, LC_CTYPE, LANG)
contain the strings 'UTF-8' or 'UTF8' (case-insensitive matching),
the default encoding of your STDIN, STDOUT, and STDERR, and of
B<any subsequent file open>, is UTF-8.
diff --git a/gnu/usr.bin/perl/lib/open.t b/gnu/usr.bin/perl/lib/open.t
index 50292929c85..55b955bd0fc 100644
--- a/gnu/usr.bin/perl/lib/open.t
+++ b/gnu/usr.bin/perl/lib/open.t
@@ -7,7 +7,7 @@ BEGIN {
require Config; import Config;
}
-use Test::More tests => 16;
+use Test::More tests => 17;
# open::import expects 'open' as its first argument, but it clashes with open()
sub import {
@@ -45,6 +45,7 @@ like( $warn, qr/Unknown PerlIO layer/,
SKIP: {
skip("no perlio, no :utf8", 1) unless (find PerlIO::Layer 'perlio');
+ skip("no Encode for locale layer", 1) unless eval { require Encode };
# now load a real-looking locale
$ENV{LC_ALL} = ' .utf8';
import( 'IN', 'locale' );
@@ -171,6 +172,16 @@ EOE
"checking syswrite() output on :utf8 streams by reading it back in");
}
+SKIP: {
+ skip("no perlio", 1) unless (find PerlIO::Layer 'perlio');
+ use open IN => ':non-existent';
+ eval {
+ require Symbol; # Anything that exists but we havn't loaded
+ };
+ like($@, qr/Can't locate Symbol|Recursive call/i,
+ "test for an endless loop in PerlIO_find_layer");
+}
+
END {
1 while unlink "utf8";
1 while unlink "a";
diff --git a/gnu/usr.bin/perl/lib/overload.t b/gnu/usr.bin/perl/lib/overload.t
index 4db647dbeea..3490b5bf6a4 100644
--- a/gnu/usr.bin/perl/lib/overload.t
+++ b/gnu/usr.bin/perl/lib/overload.t
@@ -41,7 +41,7 @@ sub numify { 0 + "${$_[0]}" } # Not needed, additional overhead
package main;
-$test = 0;
+our $test = 0;
$| = 1;
print "1..",&last,"\n";
@@ -1064,9 +1064,10 @@ package main;
my $utfvar = new utf8_o 200.2.1;
-test("$utfvar" eq 200.2.1); # 223
+test("$utfvar" eq 200.2.1); # 223 - stringify
+test("a$utfvar" eq "a".200.2.1); # 224 - overload via sv_2pv_flags
-# 224..226 -- more %{} tests. Hangs in 5.6.0, okay in later releases.
+# 225..227 -- more %{} tests. Hangs in 5.6.0, okay in later releases.
# Basically this example implements strong encapsulation: if Hderef::import()
# were to eval the overload code in the caller's namespace, the privatisation
# would be quite transparent.
@@ -1080,9 +1081,27 @@ sub xet { @_ == 2 ? $_[0]->{$_[1]} :
package main;
my $a = Foo->new;
$a->xet('b', 42);
-print $a->xet('b') == 42 ? "ok 224\n" : "not ok 224\n";
-print defined eval { $a->{b} } ? "not ok 225\n" : "ok 225\n";
-print $@ =~ /zap/ ? "ok 226\n" : "not ok 226\n";
+print $a->xet('b') == 42 ? "ok 225\n" : "not ok 225\n";
+print defined eval { $a->{b} } ? "not ok 226\n" : "ok 226\n";
+print $@ =~ /zap/ ? "ok 227\n" : "not ok 227\n";
+
+print overload::StrVal(qr/a/) =~ /^Regexp=SCALAR\(0x[0-9a-f]+\)$/ ? "ok 228\n" : "not ok 228\n";
+
+{
+ package t229;
+ use overload '=' => sub { 42 },
+ '++' => sub { my $x = ${$_[0]}; $_[0] };
+ sub new { my $x = 42; bless \$x }
+
+ my $warn;
+ {
+ local $SIG{__WARN__} = sub { $warn++ };
+ my $x = t229->new;
+ my $y = $x;
+ eval { $y++ };
+ }
+ print $warn ? "not ok 229\n" : "ok 229\n";
+}
# Last test is:
-sub last {226}
+sub last {229}
diff --git a/gnu/usr.bin/perl/lib/sort.pm b/gnu/usr.bin/perl/lib/sort.pm
index 3db4777c059..e785003f4f8 100644
--- a/gnu/usr.bin/perl/lib/sort.pm
+++ b/gnu/usr.bin/perl/lib/sort.pm
@@ -1,6 +1,6 @@
package sort;
-our $VERSION = '1.01';
+our $VERSION = '1.02';
# Currently the hints for pp_sort are stored in the global variable
# $sort::hints. An improvement would be to store them in $^H{SORT} and have
@@ -33,6 +33,30 @@ sub import {
$hints |= $sort::mergesort_bit;
} elsif ($_ eq 'stable') {
$hints |= $sort::stable_bit;
+ } elsif ($_ eq 'defaults') {
+ $hints = 0;
+ } else {
+ require Carp;
+ Carp::croak("sort: unknown subpragma '$_'");
+ }
+ }
+}
+
+sub unimport {
+ shift;
+ if (@_ == 0) {
+ require Carp;
+ Carp::croak("sort pragma requires arguments");
+ }
+ local $_;
+ no warnings 'uninitialized'; # bitops would warn
+ while ($_ = shift(@_)) {
+ if (/^_q(?:uick)?sort$/) {
+ $hints &= ~$sort::sort_bits;
+ } elsif ($_ eq '_mergesort') {
+ $hints &= ~$sort::sort_bits;
+ } elsif ($_ eq 'stable') {
+ $hints &= ~$sort::stable_bit;
} else {
require Carp;
Carp::croak("sort: unknown subpragma '$_'");
@@ -63,6 +87,8 @@ sort - perl pragma to control sort() behaviour
use sort 'stable'; # guarantee stability
use sort '_quicksort'; # use a quicksort algorithm
use sort '_mergesort'; # use a mergesort algorithm
+ use sort 'defaults'; # revert to default behavior
+ no sort 'stable'; # stability not important
use sort '_qsort'; # alias for quicksort
@@ -70,11 +96,11 @@ sort - perl pragma to control sort() behaviour
=head1 DESCRIPTION
-With the sort pragma you can control the behaviour of the builtin
-sort() function.
+With the C<sort> pragma you can control the behaviour of the builtin
+C<sort()> function.
In Perl versions 5.6 and earlier the quicksort algorithm was used to
-implement sort(), but in Perl 5.8 a mergesort algorithm was also made
+implement C<sort()>, but in Perl 5.8 a mergesort algorithm was also made
available, mainly to guarantee worst case O(N log N) behaviour:
the worst case of quicksort is O(N**2). In Perl 5.8 and later,
quicksort defends against quadratic behaviour by shuffling large
@@ -98,16 +124,78 @@ The best algorithm depends on many things. On average, mergesort
does fewer comparisons than quicksort, so it may be better when
complicated comparison routines are used. Mergesort also takes
advantage of pre-existing order, so it would be favored for using
-sort to merge several sorted arrays. On the other hand, quicksort
-is often faster for small arrays, and on platforms with small memory
-caches that are much faster than main memory. You can force the
+C<sort()> to merge several sorted arrays. On the other hand, quicksort
+is often faster for small arrays, and on arrays of a few distinct
+values, repeated many times. You can force the
choice of algorithm with this pragma, but this feels heavy-handed,
so the subpragmas beginning with a C<_> may not persist beyond Perl 5.8.
+The default algorithm is mergesort, which will be stable even if
+you do not explicitly demand it.
+But the stability of the default sort is a side-effect that could
+change in later versions. If stability is important, be sure to
+say so with a
+
+ use sort 'stable';
+
+The C<no sort> pragma doesn't
+I<forbid> what follows, it just leaves the choice open. Thus, after
+
+ no sort qw(_mergesort stable);
+
+a mergesort, which happens to be stable, will be employed anyway.
+Note that
+
+ no sort "_quicksort";
+ no sort "_mergesort";
+
+have exactly the same effect, leaving the choice of sort algorithm open.
=head1 CAVEATS
-This pragma is not lexically scoped : its effect is global to the program
-it appears in. This may change in future versions.
+This pragma is not lexically scoped: its effect is global to the program
+it appears in. That means the following will probably not do what you
+expect, because I<both> pragmas take effect at compile time, before
+I<either> C<sort()> happens.
+
+ { use sort "_quicksort";
+ print sort::current . "\n";
+ @a = sort @b;
+ }
+ { use sort "stable";
+ print sort::current . "\n";
+ @c = sort @d;
+ }
+ # prints:
+ # quicksort stable
+ # quicksort stable
+
+You can achieve the effect you probably wanted by using C<eval()>
+to defer the pragmas until run time. Use the quoted argument
+form of C<eval()>, I<not> the BLOCK form, as in
+
+ eval { use sort "_quicksort" }; # WRONG
+
+or the effect will still be at compile time.
+Reset to default options before selecting other subpragmas
+(in case somebody carelessly left them on) and after sorting,
+as a courtesy to others.
+
+ { eval 'use sort qw(defaults _quicksort)'; # force quicksort
+ eval 'no sort "stable"'; # stability not wanted
+ print sort::current . "\n";
+ @a = sort @b;
+ eval 'use sort "defaults"'; # clean up, for others
+ }
+ { eval 'use sort qw(defaults stable)'; # force stability
+ print sort::current . "\n";
+ @c = sort @d;
+ eval 'use sort "defaults"'; # clean up, for others
+ }
+ # prints:
+ # quicksort
+ # stable
+
+Scoping for this pragma may change in future versions.
=cut
diff --git a/gnu/usr.bin/perl/lib/sort.t b/gnu/usr.bin/perl/lib/sort.t
index 990376576b6..8828083066c 100644
--- a/gnu/usr.bin/perl/lib/sort.t
+++ b/gnu/usr.bin/perl/lib/sort.t
@@ -28,7 +28,8 @@ use warnings;
use Test::More tests => @TestSizes * 2 # sort() tests
* 4 # number of pragmas to test
+ 1 # extra test for qsort instability
- + 3; # tests for sort::current
+ + 3 # tests for sort::current
+ + 3; # tests for "defaults" and "no sort"
# Generate array of specified size for testing sort.
#
@@ -160,3 +161,23 @@ eval q{
main(0);
};
die $@ if $@;
+
+# Tests added to check "defaults" subpragma, and "no sort"
+
+eval q{
+ no sort qw(_qsort);
+ is(sort::current(), 'stable', 'sort::current after no _qsort');
+};
+die $@ if $@;
+
+eval q{
+ use sort qw(defaults _qsort);
+ is(sort::current(), 'quicksort', 'sort::current after defaults _qsort');
+};
+die $@ if $@;
+
+eval q{
+ use sort qw(defaults stable);
+ is(sort::current(), 'stable', 'sort::current after defaults stable');
+};
+die $@ if $@;
diff --git a/gnu/usr.bin/perl/lib/strict.t b/gnu/usr.bin/perl/lib/strict.t
index 02f191b9c52..1868f486852 100644
--- a/gnu/usr.bin/perl/lib/strict.t
+++ b/gnu/usr.bin/perl/lib/strict.t
@@ -20,7 +20,7 @@ my @prgs = () ;
foreach (sort glob($^O eq 'MacOS' ? ":lib:strict:*" : "lib/strict/*")) {
- next if /(~|\.orig|,v)$/;
+ next if -d || /(~|\.orig|,v)$/;
open F, "<$_" or die "Cannot open $_: $!\n" ;
while (<F>) {
@@ -36,7 +36,7 @@ foreach (sort glob($^O eq 'MacOS' ? ":lib:strict:*" : "lib/strict/*")) {
undef $/;
-print "1..", scalar @prgs, "\n";
+print "1.." . (@prgs + 4) . "\n";
for (@prgs){
@@ -94,7 +94,23 @@ for (@prgs){
print STDERR "GOT:\n$results\n";
print "not ";
}
- print "ok ", ++$i, "\n";
+ print "ok " . ++$i . "\n";
foreach (@temps)
{ unlink $_ if $_ }
}
+
+eval qq(use strict 'garbage');
+print +($@ =~ /^Unknown 'strict' tag\(s\) 'garbage'/)
+ ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@";
+
+eval qq(no strict 'garbage');
+print +($@ =~ /^Unknown 'strict' tag\(s\) 'garbage'/)
+ ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@";
+
+eval qq(use strict qw(foo bar));
+print +($@ =~ /^Unknown 'strict' tag\(s\) 'foo bar'/)
+ ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@";
+
+eval qq(no strict qw(foo bar));
+print +($@ =~ /^Unknown 'strict' tag\(s\) 'foo bar'/)
+ ? "ok ".++$i."\n" : "not ok ".++$i."\t# $@";
diff --git a/gnu/usr.bin/perl/lib/unicore/ArabLink.pl b/gnu/usr.bin/perl/lib/unicore/ArabLink.pl
index f68a8af519a..649abd39f4f 100644
--- a/gnu/usr.bin/perl/lib/unicore/ArabLink.pl
+++ b/gnu/usr.bin/perl/lib/unicore/ArabLink.pl
@@ -3,6 +3,7 @@
# Any changes made here will be lost!
return <<'END';
+0600 0603 U
0621 U
0622 0625 R
0626 D
@@ -33,6 +34,9 @@ return <<'END';
06D0 06D1 D
06D2 06D3 R
06D5 R
+06DD U
+06EE 06EF R
+06FF D
06FA 06FC D
0710 R
0712 0714 D
@@ -45,5 +49,10 @@ return <<'END';
072A R
072B D
072C R
+072D 072E D
+072F R
+074D R
+074E 074F D
200D C
+200C U
END
diff --git a/gnu/usr.bin/perl/lib/unicore/ArabLnkGrp.pl b/gnu/usr.bin/perl/lib/unicore/ArabLnkGrp.pl
index 2e766d50a8f..70bb87d54d4 100644
--- a/gnu/usr.bin/perl/lib/unicore/ArabLnkGrp.pl
+++ b/gnu/usr.bin/perl/lib/unicore/ArabLnkGrp.pl
@@ -3,6 +3,7 @@
# Any changes made here will be lost!
return <<'END';
+0600 0603 <no shaping>
0621 <no shaping>
0622 0623 ALEF
0624 WAW
@@ -66,6 +67,10 @@ return <<'END';
06D0 06D1 YEH
06D2 06D3 YEH BARREE
06D5 TEH MARBUTA
+06DD <no shaping>
+06EE DAL
+06EF REH
+06FF KNOTTED HEH
06FA SEEN
06FB SAD
06FC AIN
@@ -94,5 +99,12 @@ return <<'END';
072A DALATH RISH
072B SHIN
072C TAW
+072D BETH
+072E GAMAL
+072F DALATH RISH
+074D ZHAIN
+074E KHAPH
+074F FE
200D <no shaping>
+200C <no shaping>
END
diff --git a/gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt b/gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt
index c56e750b770..df1f1933a39 100644
--- a/gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt
+++ b/gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt
@@ -1,52 +1,55 @@
-# ArabicShaping-3.2.0.txt
+# ArabicShaping-4.0.0.txt
#
# This file is a normative contributory data file in the
# Unicode Character Database.
#
# This file defines the shaping classes for Arabic and Syriac
# positional shaping, repeating in machine readable form the
-# information printed in Tables 8-6, 8-7, 8-8, 8-10, 8-11, and
-# 8-13 of The Unicode Standard, Version 3.0, plus additions
-# for Unicode 3.1 and Unicode 3.2.
+# information printed in Tables 8-3, 8-7, 8-8, 8-11, 8-12, and
+# 8-13 of The Unicode Standard, Version 4.0.
#
-# See sections 8.2 and 8.3 of The Unicode Standard, Version 3.0
+# See sections 8.2 and 8.3 of The Unicode Standard, Version 4.0
# for more information.
#
# Each line contains four fields, separated by a semicolon.
#
-# The first field gives the code point, in 4-digit hexadecimal
+# Field 0: the code point, in 4-digit hexadecimal
# form, of an Arabic or Syriac character.
-# The second field gives a short schematic name for that character,
+# Field 1: gives a short schematic name for that character,
# abbreviated from the normative Unicode character name.
-# The third field defines the joining type: R right-joining,
-# D dual-joining, U non-joining
-# The fourth field defines the joining group.
+# Field 2: defines the joining type
+# R right-joining,
+# L left-joining,
+# D dual-joining,
+# C join-causing
+# U non-joining
+# T transparent
+# See the Arabic block description for more information on these types.
+# Field 3: defines the joining group.
#
#
-# Note: Characters of joining type T and most characters of
-# joining type U are not explicitly listed in this file.
+# Note: Code points that are not explicitly listed in this file are
+# either of type T or U:
#
-# Characters of joining type T can derived by the following formula:
-# T = Mn + Cf - ZWNJ - ZWJ
-# where Mn and Cf are the general category values. In other words,
-# any non-spacing mark or any format control character, except
-# U+200C ZERO WIDTH NON-JOINER (joining type U) and U+200D ZERO WIDTH
-# JOINER (joining type C).
+# - Those that not explicitly listed that are of General Category Mn or Cf
+# have joining type T.
+# - All others not explicitly listed have type U.
#
# For an explicit listing of characters of joining type T, see
# the derived property file DerivedJoiningType.txt.
#
# There are currently no characters of type L defined in Unicode.
#
-# Joining type U includes all characters which are neither joining
-# type T, nor explicitly marked in this file as types R, L, D, or C.
-#
# #############################################################
# Unicode; Schematic Name; Joining Type; Joining Group
# Arabic characters
+0600; ARABIC NUMBER SIGN; U; <no shaping>
+0601; ARABIC SIGN SANAH; U; <no shaping>
+0602; ARABIC FOOTNOTE MARKER; U; <no shaping>
+0603; ARABIC SIGN SAFHA; U; <no shaping>
0621; HAMZA; U; <no shaping>
0622; MADDA ON ALEF; R; ALEF
0623; HAMZA ON ALEF; R; ALEF
@@ -186,6 +189,10 @@
06D2; YEH BARREE; R; YEH BARREE
06D3; HAMZA ON YEH BARREE; R; YEH BARREE
06D5; AE; R; TEH MARBUTA
+06DD; ARABIC END OF AYAH; U; <no shaping>
+06EE; DAL WITH INVERTED V; R; DAL
+06EF; REH WITH INVERTED V; R; REH
+06FF; HEH WITH INVERTED V; D; KNOTTED HEH
06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN
06FB; DAD WITH DOT BELOW; D; SAD
06FC; GHAIN WITH DOT BELOW; D; AIN
@@ -220,7 +227,14 @@
072A; RISH; R; DALATH RISH
072B; SHIN; D; SHIN
072C; TAW; R; TAW
+072D; PERSIAN BHETH; D; BETH
+072E; PERSIAN GHAMAL; D; GAMAL
+072F; PERSIAN DHALATH; R; DALATH RISH
+074D; SOGDIAN ZHAIN; R; ZHAIN
+074E; SOGDIAN KHAPH; D; KHAPH
+074F; SOGDIAN FE; D; FE
# Other
200D; ZERO WIDTH JOINER; C; <no shaping>
+200C; ZERO WIDTH NON-JOINER; U; <no shaping>
diff --git a/gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt b/gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt
index fa620212f12..f799da12a17 100644
--- a/gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt
+++ b/gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt
@@ -1,10 +1,10 @@
-# BidiMirroring-3.2.0.txt
+# BidiMirroring-4.0.0.txt
#
# This file is an informative supplement to the UnicodeData file. It
# lists characters that have the mirrored property
# where there is another Unicode character that typically has a glyph
# that is the mirror image of the original character's glyph.
-# The repertoire covered by the file is Unicode 3.2.0.
+# The repertoire covered by the file is Unicode 4.0.0.
#
# The file contains a list of lines with mappings from one code point
# to another one for character-based mirroring.
@@ -23,12 +23,8 @@
# For information on bidi mirroring, see UAX #9: Bidirectional Algorithm,
# at http://www.unicode.org/unicode/reports/tr9/
#
-# Please address any comments to <errata@unicode.org>.
-# Note that this is an archival address: messages will be checked,
-# but do not expect an immediate response.
-#
# This file was originally created by Markus Scherer.
-# Extended for Unicode 3.2 by Ken Whistler.
+# Extended for Unicode 3.2 and 4.0 by Ken Whistler.
#
# ############################################################
diff --git a/gnu/usr.bin/perl/lib/unicore/Bidirectional.pl b/gnu/usr.bin/perl/lib/unicore/Bidirectional.pl
index 0fd1fff9321..54e7012b5a1 100644
--- a/gnu/usr.bin/perl/lib/unicore/Bidirectional.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Bidirectional.pl
@@ -49,10 +49,8 @@ return <<'END';
00D7 ON
00D8 00F6 L
00F7 ON
-00F8 0220 L
-0222 0233 L
-0250 02AD L
-02B0 02B8 L
+00F8 0236 L
+0250 02B8 L
02B9 02BA ON
02BB 02C1 L
02C2 02CF ON
@@ -61,8 +59,9 @@ return <<'END';
02E0 02E4 L
02E5 02ED ON
02EE L
-0300 034F NSM
-0360 036F NSM
+02EF 02FF ON
+0300 0357 NSM
+035D 036F NSM
0374 0375 ON
037A L
037E ON
@@ -75,6 +74,7 @@ return <<'END';
03A3 03CE L
03D0 03F5 L
03F6 ON
+03F7 03FB L
0400 0482 L
0483 0486 NSM
0488 0489 NSM
@@ -98,12 +98,16 @@ return <<'END';
05C4 NSM
05D0 05EA R
05F0 05F4 R
+0600 0603 AL
060C CS
+060D AL
+060E 060F ON
+0610 0615 NSM
061B AL
061F AL
0621 063A AL
0640 064A AL
-064B 0655 NSM
+064B 0658 NSM
0660 0669 AN
066A ET
066B 066C AN
@@ -117,20 +121,20 @@ return <<'END';
06E7 06E8 NSM
06E9 ON
06EA 06ED NSM
+06EE 06EF AL
06F0 06F9 EN
-06FA 06FE AL
-0700 070D AL
+06FA 070D AL
070F BN
0710 AL
0711 NSM
-0712 072C AL
+0712 072F AL
0730 074A NSM
+074D 074F AL
0780 07A5 AL
07A6 07B0 NSM
07B1 AL
0901 0902 NSM
-0903 L
-0905 0939 L
+0903 0939 L
093C NSM
093D 0940 L
0941 0948 NSM
@@ -150,7 +154,7 @@ return <<'END';
09B2 L
09B6 09B9 L
09BC NSM
-09BE 09C0 L
+09BD 09C0 L
09C1 09C4 NSM
09C7 09C8 L
09CB 09CC L
@@ -162,7 +166,8 @@ return <<'END';
09E6 09F1 L
09F2 09F3 ET
09F4 09FA L
-0A02 NSM
+0A01 0A02 NSM
+0A03 L
0A05 0A0A L
0A0F 0A10 L
0A13 0A28 L
@@ -182,8 +187,7 @@ return <<'END';
0A72 0A74 L
0A81 0A82 NSM
0A83 L
-0A85 0A8B L
-0A8D L
+0A85 0A8D L
0A8F 0A91 L
0A93 0AA8 L
0AAA 0AB0 L
@@ -197,8 +201,10 @@ return <<'END';
0ACB 0ACC L
0ACD NSM
0AD0 L
-0AE0 L
+0AE0 0AE1 L
+0AE2 0AE3 NSM
0AE6 0AEF L
+0AF1 ET
0B01 NSM
0B02 0B03 L
0B05 0B0C L
@@ -206,7 +212,7 @@ return <<'END';
0B13 0B28 L
0B2A 0B30 L
0B32 0B33 L
-0B36 0B39 L
+0B35 0B39 L
0B3C NSM
0B3D 0B3E L
0B3F NSM
@@ -219,7 +225,7 @@ return <<'END';
0B57 L
0B5C 0B5D L
0B5F 0B61 L
-0B66 0B70 L
+0B66 0B71 L
0B82 NSM
0B83 L
0B85 0B8A L
@@ -240,6 +246,9 @@ return <<'END';
0BCD NSM
0BD7 L
0BE7 0BF2 L
+0BF3 0BF8 ON
+0BF9 ET
+0BFA ON
0C01 0C03 L
0C05 0C0C L
0C0E 0C10 L
@@ -259,11 +268,9 @@ return <<'END';
0C92 0CA8 L
0CAA 0CB3 L
0CB5 0CB9 L
-0CBE L
-0CBF NSM
-0CC0 0CC4 L
-0CC6 NSM
-0CC7 0CC8 L
+0CBC NSM
+0CBD 0CC4 L
+0CC6 0CC8 L
0CCA 0CCB L
0CCC 0CCD NSM
0CD5 0CD6 L
@@ -418,14 +425,30 @@ return <<'END';
17D4 17DA L
17DB ET
17DC L
+17DD NSM
17E0 17E9 L
+17F0 17F9 ON
1800 180A ON
180B 180D NSM
-180E BN
+180E WS
1810 1819 L
1820 1877 L
1880 18A8 L
18A9 NSM
+1900 191C L
+1920 1922 NSM
+1923 1926 L
+1927 192B NSM
+1930 1931 L
+1932 NSM
+1933 1938 L
+1939 193B NSM
+1940 ON
+1944 1945 ON
+1946 196D L
+1970 1974 L
+19E0 19FF ON
+1D00 1D6B L
1E00 1E9B L
1EA0 1EF9 L
1F00 1F15 L
@@ -467,7 +490,7 @@ return <<'END';
202E RLO
202F WS
2030 2034 ET
-2035 2052 ON
+2035 2054 ON
2057 ON
205F WS
2060 2063 BN
@@ -505,7 +528,7 @@ return <<'END';
212F 2131 L
2132 ON
2133 2139 L
-213A ON
+213A 213B ON
213D 213F L
2140 2144 ON
2145 2149 L
@@ -518,17 +541,16 @@ return <<'END';
2336 237A L
237B 2394 ON
2395 L
-2396 23CE ON
+2396 23D0 ON
2400 2426 ON
2440 244A ON
2460 249B EN
249C 24E9 L
24EA EN
-24EB 24FE ON
-2500 2613 ON
-2616 2617 ON
+24EB 2617 ON
2619 267D ON
-2680 2689 ON
+2680 2691 ON
+26A0 26A1 ON
2701 2704 ON
2706 2709 ON
270C 2727 ON
@@ -541,7 +563,7 @@ return <<'END';
2798 27AF ON
27B1 27BE ON
27D0 27EB ON
-27F0 2AFF ON
+27F0 2B0D ON
2E80 2E99 ON
2E9B 2EF3 ON
2F00 2FD5 ON
@@ -569,16 +591,23 @@ return <<'END';
3131 318E L
3190 31B7 L
31F0 321C L
+321D 321E ON
3220 3243 L
-3251 325F ON
+3250 325F ON
3260 327B L
+327C 327D ON
327F 32B0 L
32B1 32BF ON
32C0 32CB L
+32CC 32CF ON
32D0 32FE L
3300 3376 L
+3377 337A ON
337B 33DD L
+33DE 33DF ON
33E0 33FE L
+33FF ON
+4DC0 4DFF ON
A000 A48C L
A490 A4C6 ON
F900 FA2D L
@@ -601,10 +630,10 @@ FD3E FD3F ON
FD50 FD8F AL
FD92 FDC7 AL
FDF0 FDFC AL
+FDFD ON
FE00 FE0F NSM
FE20 FE23 NSM
-FE30 FE46 ON
-FE49 FE4F ON
+FE30 FE4F ON
FE50 CS
FE51 ON
FE52 CS
@@ -647,11 +676,31 @@ FFE5 FFE6 ET
FFE8 FFEE ON
FFF9 FFFB BN
FFFC FFFD ON
+10000 1000B L
+1000D 10026 L
+10028 1003A L
+1003C 1003D L
+1003F 1004D L
+10050 1005D L
+10080 100FA L
+10100 L
+10101 ON
+10102 L
+10107 10133 L
+10137 1013F L
10300 1031E L
10320 10323 L
10330 1034A L
-10400 10425 L
-10428 1044D L
+10380 1039D L
+1039F L
+10400 1049D L
+104A0 104A9 L
+10800 10805 R
+10808 R
+1080A 10835 R
+10837 10838 R
+1083C R
+1083F R
1D000 1D0F5 L
1D100 1D126 L
1D12A 1D166 L
@@ -664,6 +713,7 @@ FFFC FFFD ON
1D18C 1D1A9 L
1D1AA 1D1AD NSM
1D1AE 1D1DD L
+1D300 1D356 ON
1D400 1D454 L
1D456 1D49C L
1D49E 1D49F L
@@ -672,8 +722,7 @@ FFFC FFFD ON
1D4A9 1D4AC L
1D4AE 1D4B9 L
1D4BB L
-1D4BD 1D4C0 L
-1D4C2 1D4C3 L
+1D4BD 1D4C3 L
1D4C5 1D505 L
1D507 1D50A L
1D50D 1D514 L
@@ -689,4 +738,5 @@ FFFC FFFD ON
2F800 2FA1D L
E0001 BN
E0020 E007F BN
+E0100 E01EF NSM
END
diff --git a/gnu/usr.bin/perl/lib/unicore/Blocks.pl b/gnu/usr.bin/perl/lib/unicore/Blocks.pl
index 07f2a325cab..e6b1a4d80e0 100644
--- a/gnu/usr.bin/perl/lib/unicore/Blocks.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Blocks.pl
@@ -45,6 +45,10 @@ return <<'END';
1760 177F Tagbanwa
1780 17FF Khmer
1800 18AF Mongolian
+1900 194F Limbu
+1950 197F Tai Le
+19E0 19FF Khmer Symbols
+1D00 1D7F Phonetic Extensions
1E00 1EFF Latin Extended Additional
1F00 1FFF Greek Extended
2000 206F General Punctuation
@@ -70,6 +74,7 @@ return <<'END';
2900 297F Supplemental Arrows-B
2980 29FF Miscellaneous Mathematical Symbols-B
2A00 2AFF Supplemental Mathematical Operators
+2B00 2BFF Miscellaneous Symbols and Arrows
2E80 2EFF CJK Radicals Supplement
2F00 2FDF Kangxi Radicals
2FF0 2FFF Ideographic Description Characters
@@ -84,6 +89,7 @@ return <<'END';
3200 32FF Enclosed CJK Letters and Months
3300 33FF CJK Compatibility
3400 4DBF CJK Unified Ideographs Extension A
+4DC0 4DFF Yijing Hexagram Symbols
4E00 9FFF CJK Unified Ideographs
A000 A48F Yi Syllables
A490 A4CF Yi Radicals
@@ -102,15 +108,24 @@ FE50 FE6F Small Form Variants
FE70 FEFF Arabic Presentation Forms-B
FF00 FFEF Halfwidth and Fullwidth Forms
FFF0 FFFF Specials
+10000 1007F Linear B Syllabary
+10080 100FF Linear B Ideograms
+10100 1013F Aegean Numbers
10300 1032F Old Italic
10330 1034F Gothic
+10380 1039F Ugaritic
10400 1044F Deseret
+10450 1047F Shavian
+10480 104AF Osmanya
+10800 1083F Cypriot Syllabary
1D000 1D0FF Byzantine Musical Symbols
1D100 1D1FF Musical Symbols
+1D300 1D35F Tai Xuan Jing Symbols
1D400 1D7FF Mathematical Alphanumeric Symbols
20000 2A6DF CJK Unified Ideographs Extension B
2F800 2FA1F CJK Compatibility Ideographs Supplement
E0000 E007F Tags
+E0100 E01EF Variation Selectors Supplement
F0000 FFFFF Supplementary Private Use Area-A
100000 10FFFF Supplementary Private Use Area-B
END
diff --git a/gnu/usr.bin/perl/lib/unicore/Blocks.txt b/gnu/usr.bin/perl/lib/unicore/Blocks.txt
index 7a272093ff2..6dc2bd2fe09 100644
--- a/gnu/usr.bin/perl/lib/unicore/Blocks.txt
+++ b/gnu/usr.bin/perl/lib/unicore/Blocks.txt
@@ -1,5 +1,10 @@
-# Blocks-3.2.0.txt
-# Correlated with Unicode 3.2
+# Blocks-4.0.0.txt
+# Correlated with Unicode 4.0
+# Note: The casing of block names is not normative.
+# For example, "Basic Latin" and "BASIC LATIN" are equivalent.
+#
+# Code points not explicitly listed in this file are given the value No_Block.
+#
# Start Code..End Code; Block Name
0000..007F; Basic Latin
0080..00FF; Latin-1 Supplement
@@ -43,6 +48,10 @@
1760..177F; Tagbanwa
1780..17FF; Khmer
1800..18AF; Mongolian
+1900..194F; Limbu
+1950..197F; Tai Le
+19E0..19FF; Khmer Symbols
+1D00..1D7F; Phonetic Extensions
1E00..1EFF; Latin Extended Additional
1F00..1FFF; Greek Extended
2000..206F; General Punctuation
@@ -68,6 +77,7 @@
2900..297F; Supplemental Arrows-B
2980..29FF; Miscellaneous Mathematical Symbols-B
2A00..2AFF; Supplemental Mathematical Operators
+2B00..2BFF; Miscellaneous Symbols and Arrows
2E80..2EFF; CJK Radicals Supplement
2F00..2FDF; Kangxi Radicals
2FF0..2FFF; Ideographic Description Characters
@@ -82,6 +92,7 @@
3200..32FF; Enclosed CJK Letters and Months
3300..33FF; CJK Compatibility
3400..4DBF; CJK Unified Ideographs Extension A
+4DC0..4DFF; Yijing Hexagram Symbols
4E00..9FFF; CJK Unified Ideographs
A000..A48F; Yi Syllables
A490..A4CF; Yi Radicals
@@ -100,14 +111,23 @@ FE50..FE6F; Small Form Variants
FE70..FEFF; Arabic Presentation Forms-B
FF00..FFEF; Halfwidth and Fullwidth Forms
FFF0..FFFF; Specials
+10000..1007F; Linear B Syllabary
+10080..100FF; Linear B Ideograms
+10100..1013F; Aegean Numbers
10300..1032F; Old Italic
10330..1034F; Gothic
+10380..1039F; Ugaritic
10400..1044F; Deseret
+10450..1047F; Shavian
+10480..104AF; Osmanya
+10800..1083F; Cypriot Syllabary
1D000..1D0FF; Byzantine Musical Symbols
1D100..1D1FF; Musical Symbols
+1D300..1D35F; Tai Xuan Jing Symbols
1D400..1D7FF; Mathematical Alphanumeric Symbols
20000..2A6DF; CJK Unified Ideographs Extension B
2F800..2FA1F; CJK Compatibility Ideographs Supplement
E0000..E007F; Tags
+E0100..E01EF; Variation Selectors Supplement
F0000..FFFFF; Supplementary Private Use Area-A
100000..10FFFF; Supplementary Private Use Area-B
diff --git a/gnu/usr.bin/perl/lib/unicore/Canonical.pl b/gnu/usr.bin/perl/lib/unicore/Canonical.pl
index 947fd2b9d5c..7c6dbe4001a 100644
--- a/gnu/usr.bin/perl/lib/unicore/Canonical.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Canonical.pl
@@ -8,6 +8,10 @@
## Mapping from lc(canonical name) to filename in ./lib
%utf8::Canonical = (
+
+ # InAegeanNumbers
+ aegeannumbers => 'InAegean',
+
alphabetic => 'Alphabet',
# InAlphabeticPresentationForms
@@ -48,6 +52,8 @@
# InBoxDrawing
boxdrawing => 'InBoxDra',
+ braille => 'Braille',
+
# InBraillePatterns
braillepatterns => 'InBraill',
@@ -116,6 +122,11 @@
# InCurrencySymbols
currencysymbols => 'InCurren',
+ cypriot => 'Cypriot',
+
+ # InCypriotSyllabary
+ cypriotsyllabary => 'InCyprio',
+
cyrillic => 'Cyrillic',
# InCyrillicSupplementary
@@ -224,6 +235,9 @@
# IdsTrinaryOperator
idstrinaryoperator => 'IdsTrina',
+ # InAegeanNumbers
+ inaegeannumbers => 'InAegean',
+
# InAlphabeticPresentationForms
inalphabeticpresentationforms => 'InAlphab',
@@ -314,6 +328,9 @@
# InCurrencySymbols
incurrencysymbols => 'InCurren',
+ # InCypriotSyllabary
+ incypriotsyllabary => 'InCyprio',
+
# InCyrillic
incyrillic => 'InCyrill',
@@ -418,6 +435,9 @@
# InKhmer
inkhmer => 'InKhmer',
+ # InKhmerSymbols
+ inkhmersymbols => 'InKhmerS',
+
# InLao
inlao => 'InLao',
@@ -436,6 +456,15 @@
# InLetterlikeSymbols
inletterlikesymbols => 'InLetter',
+ # InLimbu
+ inlimbu => 'InLimbu',
+
+ # InLinearBIdeograms
+ inlinearbideograms => 'InLinear',
+
+ # InLinearBSyllabary
+ inlinearbsyllabary => 'InLinea2',
+
# InLowSurrogates
inlowsurrogates => 'InLowSur',
@@ -449,14 +478,17 @@
inmathematicaloperators => 'InMathem',
# InMiscellaneousMathematicalSymbolsA
- inmiscellaneousmathematicalsymbolsa => 'InMisce3',
+ inmiscellaneousmathematicalsymbolsa => 'InMisce4',
# InMiscellaneousMathematicalSymbolsB
- inmiscellaneousmathematicalsymbolsb => 'InMisce4',
+ inmiscellaneousmathematicalsymbolsb => 'InMisce5',
# InMiscellaneousSymbols
inmiscellaneoussymbols => 'InMiscel',
+ # InMiscellaneousSymbolsAndArrows
+ inmiscellaneoussymbolsandarrows => 'InMisce3',
+
# InMiscellaneousTechnical
inmiscellaneoustechnical => 'InMisce2',
@@ -484,12 +516,21 @@
# InOriya
inoriya => 'InOriya',
+ # InOsmanya
+ inosmanya => 'InOsmany',
+
+ # InPhoneticExtensions
+ inphoneticextensions => 'InPhonet',
+
# InPrivateUseArea
inprivateusearea => 'InPrivat',
# InRunic
inrunic => 'InRunic',
+ # InShavian
+ inshavian => 'InShavia',
+
# InSinhala
insinhala => 'InSinhal',
@@ -532,6 +573,12 @@
# InTags
intags => 'InTags',
+ # InTaiLe
+ intaile => 'InTaiLe',
+
+ # InTaiXuanJingSymbols
+ intaixuanjingsymbols => 'InTaiXua',
+
# InTamil
intamil => 'InTamil',
@@ -547,12 +594,21 @@
# InTibetan
intibetan => 'InTibeta',
+ # InUgaritic
+ inugaritic => 'InUgarit',
+
# InUnifiedCanadianAboriginalSyllabics
inunifiedcanadianaboriginalsyllabics => 'InUnifie',
# InVariationSelectors
invariationselectors => 'InVariat',
+ # InVariationSelectorsSupplement
+ invariationselectorssupplement => 'InVaria2',
+
+ # InYijingHexagramSymbols
+ inyijinghexagramsymbols => 'InYijing',
+
# InYiRadicals
inyiradicals => 'InYiRadi',
@@ -578,6 +634,10 @@
katakanaphoneticextensions => 'InKatak2',
khmer => 'Khmer',
+
+ # InKhmerSymbols
+ khmersymbols => 'InKhmerS',
+
lao => 'Lao',
latin => 'Latin',
@@ -601,6 +661,17 @@
# LetterNumber
letternumber => 'Nl',
+ limbu => 'Limbu',
+
+ # LinearB
+ linearb => 'LinearB',
+
+ # InLinearBIdeograms
+ linearbideograms => 'InLinear',
+
+ # InLinearBSyllabary
+ linearbsyllabary => 'InLinea2',
+
# LineSeparator
lineseparator => 'Zl',
@@ -629,14 +700,17 @@
mathsymbol => 'Sm',
# InMiscellaneousMathematicalSymbolsA
- miscellaneousmathematicalsymbolsa => 'InMisce3',
+ miscellaneousmathematicalsymbolsa => 'InMisce4',
# InMiscellaneousMathematicalSymbolsB
- miscellaneousmathematicalsymbolsb => 'InMisce4',
+ miscellaneousmathematicalsymbolsb => 'InMisce5',
# InMiscellaneousSymbols
miscellaneoussymbols => 'InMiscel',
+ # InMiscellaneousSymbolsAndArrows
+ miscellaneoussymbolsandarrows => 'InMisce3',
+
# InMiscellaneousTechnical
miscellaneoustechnical => 'InMisce2',
@@ -676,6 +750,7 @@
opticalcharacterrecognition => 'InOptica',
oriya => 'Oriya',
+ osmanya => 'Osmanya',
other => 'C',
# OtherAlphabetic
@@ -687,6 +762,9 @@
# OtherGraphemeExtend
othergraphemeextend => 'OtherGra',
+ # OtherIdStart
+ otheridstart => 'OtherIdS',
+
# OtherLetter
otherletter => 'Lo',
@@ -711,6 +789,9 @@
# ParagraphSeparator
paragraphseparator => 'Zp',
+ # InPhoneticExtensions
+ phoneticextensions => 'InPhonet',
+
# PrivateUse
privateuse => 'Co',
@@ -725,6 +806,7 @@
radical => 'Radical',
runic => 'Runic',
separator => 'Z',
+ shavian => 'Shavian',
sinhala => 'Sinhala',
# InSmallFormVariants
@@ -772,6 +854,12 @@
# InTags
tags => 'InTags',
+ # TaiLe
+ taile => 'TaiLe',
+
+ # InTaiXuanJingSymbols
+ taixuanjingsymbols => 'InTaiXua',
+
tamil => 'Tamil',
telugu => 'Telugu',
@@ -785,6 +873,7 @@
# TitlecaseLetter
titlecaseletter => 'Lt',
+ ugaritic => 'Ugaritic',
unassigned => 'Cn',
# InUnifiedCanadianAboriginalSyllabics
@@ -801,11 +890,17 @@
# InVariationSelectors
variationselectors => 'InVariat',
+ # InVariationSelectorsSupplement
+ variationselectorssupplement => 'InVaria2',
+
# WhiteSpace
whitespace => 'WhiteSpa',
yi => 'Yi',
+ # InYijingHexagramSymbols
+ yijinghexagramsymbols => 'InYijing',
+
# InYiRadicals
yiradicals => 'InYiRadi',
diff --git a/gnu/usr.bin/perl/lib/unicore/CaseFolding.txt b/gnu/usr.bin/perl/lib/unicore/CaseFolding.txt
index 104a8237b51..8d9b44ac772 100644
--- a/gnu/usr.bin/perl/lib/unicore/CaseFolding.txt
+++ b/gnu/usr.bin/perl/lib/unicore/CaseFolding.txt
@@ -1,5 +1,5 @@
-# CaseFolding-3.2.0.txt
-# Date: 2002-03-22,20:54:33 GMT [MD]
+# CaseFolding-4.0.0.txt
+# Date: 2003-03-14, 20:22:08 GMT [MD]
#
# Case Folding Properties
#
@@ -14,6 +14,8 @@
# (where string lengths may grow). Note that where they can be supported, the
# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match.
#
+# All code points not listed in this file map to themselves.
+#
# NOTE: case folding does not preserve normalization formats!
#
# For information on case folding, see
@@ -33,6 +35,8 @@
# T: special case for uppercase I and dotted uppercase I
# - For non-Turkic languages, this mapping is normally not used.
# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters.
+# Note that the Turkic mappings do not maintain canonical equivalence without additional processing.
+# See the discussions of case mapping in the Unicode Standard for more information.
#
# Usage:
# A. To do a simple case folding, use the mappings with status C + S.
@@ -318,9 +322,11 @@
03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI
03F0; C; 03BA; # GREEK KAPPA SYMBOL
03F1; C; 03C1; # GREEK RHO SYMBOL
-03F2; C; 03C3; # GREEK LUNATE SIGMA SYMBOL
03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL
03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL
+03F7; C; 03F8; # GREEK CAPITAL LETTER SHO
+03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA; C; 03FB; # GREEK CAPITAL LETTER SAN
0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE
0401; C; 0451; # CYRILLIC CAPITAL LETTER IO
0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE
@@ -910,3 +916,5 @@ FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
10423; C; 1044B; # DESERET CAPITAL LETTER EM
10424; C; 1044C; # DESERET CAPITAL LETTER EN
10425; C; 1044D; # DESERET CAPITAL LETTER ENG
+10426; C; 1044E; # DESERET CAPITAL LETTER OI
+10427; C; 1044F; # DESERET CAPITAL LETTER EW
diff --git a/gnu/usr.bin/perl/lib/unicore/Category.pl b/gnu/usr.bin/perl/lib/unicore/Category.pl
index dba6ad9afc3..5dca85e32b7 100644
--- a/gnu/usr.bin/perl/lib/unicore/Category.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Category.pl
@@ -41,7 +41,7 @@ return <<'END';
00AA Ll
00AB Pi
00AC Sm
-00AD Pd
+00AD Cf
00AE So
00AF Sk
00B0 So
@@ -316,6 +316,7 @@ return <<'END';
021E Lu
021F Ll
0220 Lu
+0221 Ll
0222 Lu
0223 Ll
0224 Lu
@@ -333,19 +334,18 @@ return <<'END';
0230 Lu
0231 Ll
0232 Lu
-0233 Ll
-0250 02AD Ll
-02B0 02B8 Lm
-02B9 02BA Sk
-02BB 02C1 Lm
-02C2 02CF Sk
-02D0 02D1 Lm
+0233 0236 Ll
+0250 02AF Ll
+02B0 02C1 Lm
+02C2 02C5 Sk
+02C6 02D1 Lm
02D2 02DF Sk
02E0 02E4 Lm
02E5 02ED Sk
02EE Lm
-0300 034F Mn
-0360 036F Mn
+02EF 02FF Sk
+0300 0357 Mn
+035D 036F Mn
0374 0375 Sk
037A Lm
037E Po
@@ -389,6 +389,10 @@ return <<'END';
03F4 Lu
03F5 Ll
03F6 Sm
+03F7 Lu
+03F8 Ll
+03F9 03FA Lu
+03FB Ll
0400 042F Lu
0430 045F Ll
0460 Lu
@@ -570,13 +574,16 @@ return <<'END';
05D0 05EA Lo
05F0 05F2 Lo
05F3 05F4 Po
-060C Po
+0600 0603 Cf
+060C 060D Po
+060E 060F So
+0610 0615 Mn
061B Po
061F Po
0621 063A Lo
0640 Lm
0641 064A Lo
-064B 0655 Mn
+064B 0658 Mn
0660 0669 Nd
066A 066D Po
066E 066F Lo
@@ -592,21 +599,24 @@ return <<'END';
06E7 06E8 Mn
06E9 So
06EA 06ED Mn
+06EE 06EF Lo
06F0 06F9 Nd
06FA 06FC Lo
06FD 06FE So
+06FF Lo
0700 070D Po
070F Cf
0710 Lo
0711 Mn
-0712 072C Lo
+0712 072F Lo
0730 074A Mn
+074D 074F Lo
0780 07A5 Lo
07A6 07B0 Mn
07B1 Lo
0901 0902 Mn
0903 Mc
-0905 0939 Lo
+0904 0939 Lo
093C Mn
093D Lo
093E 0940 Mc
@@ -629,6 +639,7 @@ return <<'END';
09B2 Lo
09B6 09B9 Lo
09BC Mn
+09BD Lo
09BE 09C0 Mc
09C1 09C4 Mn
09C7 09C8 Mc
@@ -643,7 +654,8 @@ return <<'END';
09F2 09F3 Sc
09F4 09F9 No
09FA So
-0A02 Mn
+0A01 0A02 Mn
+0A03 Mc
0A05 0A0A Lo
0A0F 0A10 Lo
0A13 0A28 Lo
@@ -663,8 +675,7 @@ return <<'END';
0A72 0A74 Lo
0A81 0A82 Mn
0A83 Mc
-0A85 0A8B Lo
-0A8D Lo
+0A85 0A8D Lo
0A8F 0A91 Lo
0A93 0AA8 Lo
0AAA 0AB0 Lo
@@ -679,8 +690,10 @@ return <<'END';
0ACB 0ACC Mc
0ACD Mn
0AD0 Lo
-0AE0 Lo
+0AE0 0AE1 Lo
+0AE2 0AE3 Mn
0AE6 0AEF Nd
+0AF1 Sc
0B01 Mn
0B02 0B03 Mc
0B05 0B0C Lo
@@ -688,7 +701,7 @@ return <<'END';
0B13 0B28 Lo
0B2A 0B30 Lo
0B32 0B33 Lo
-0B36 0B39 Lo
+0B35 0B39 Lo
0B3C Mn
0B3D Lo
0B3E Mc
@@ -704,6 +717,7 @@ return <<'END';
0B5F 0B61 Lo
0B66 0B6F Nd
0B70 So
+0B71 Lo
0B82 Mn
0B83 Lo
0B85 0B8A Lo
@@ -725,6 +739,9 @@ return <<'END';
0BD7 Mc
0BE7 0BEF Nd
0BF0 0BF2 No
+0BF3 0BF8 So
+0BF9 Sc
+0BFA So
0C01 0C03 Mc
0C05 0C0C Lo
0C0E 0C10 Lo
@@ -744,6 +761,8 @@ return <<'END';
0C92 0CA8 Lo
0CAA 0CB3 Lo
0CB5 0CB9 Lo
+0CBC Mn
+0CBD Lo
0CBE Mc
0CBF Mn
0CC0 0CC4 Mc
@@ -919,7 +938,8 @@ return <<'END';
176E 1770 Lo
1772 1773 Mn
1780 17B3 Lo
-17B4 17B6 Mc
+17B4 17B5 Cf
+17B6 Mc
17B7 17BD Mn
17BE 17C5 Mc
17C6 Mn
@@ -930,18 +950,38 @@ return <<'END';
17D8 17DA Po
17DB Sc
17DC Lo
+17DD Mn
17E0 17E9 Nd
+17F0 17F9 No
1800 1805 Po
1806 Pd
1807 180A Po
180B 180D Mn
-180E Cf
+180E Zs
1810 1819 Nd
1820 1842 Lo
1843 Lm
1844 1877 Lo
1880 18A8 Lo
18A9 Mn
+1900 191C Lo
+1920 1922 Mn
+1923 1926 Mc
+1927 1928 Mn
+1929 192B Mc
+1930 1931 Mc
+1932 Mn
+1933 1938 Mc
+1939 193B Mn
+1940 So
+1944 1945 Po
+1946 194F Nd
+1950 196D Lo
+1970 1974 Lo
+19E0 19FF So
+1D00 1D2B Ll
+1D2C 1D61 Lm
+1D62 1D6B Ll
1E00 Lu
1E01 Ll
1E02 Lu
@@ -1257,6 +1297,8 @@ return <<'END';
2046 Pe
2047 2051 Po
2052 Sm
+2053 Po
+2054 Pc
2057 Po
205F Zs
2060 2063 Cf
@@ -1308,7 +1350,7 @@ return <<'END';
2134 Ll
2135 2138 Lo
2139 Ll
-213A So
+213A 213B So
213D Ll
213E 213F Lu
2140 2144 Sm
@@ -1351,24 +1393,24 @@ return <<'END';
23B4 Ps
23B5 Pe
23B6 Po
-23B7 23CE So
+23B7 23D0 So
2400 2426 So
2440 244A So
2460 249B No
249C 24E9 So
-24EA 24FE No
+24EA 24FF No
2500 25B6 So
25B7 Sm
25B8 25C0 So
25C1 Sm
25C2 25F7 So
25F8 25FF Sm
-2600 2613 So
-2616 2617 So
+2600 2617 So
2619 266E So
266F Sm
2670 267D So
-2680 2689 So
+2680 2691 So
+26A0 26A1 So
2701 2704 So
2706 2709 So
270C 2727 So
@@ -1437,6 +1479,7 @@ return <<'END';
29FC Ps
29FD Pe
29FE 2AFF Sm
+2B00 2B0D So
2E80 2E99 So
2E9B 2EF3 So
2F00 2FD5 So
@@ -1497,21 +1540,20 @@ return <<'END';
3196 319F So
31A0 31B7 Lo
31F0 31FF Lo
-3200 321C So
+3200 321E So
3220 3229 No
322A 3243 So
+3250 So
3251 325F No
-3260 327B So
+3260 327D So
327F So
3280 3289 No
328A 32B0 So
32B1 32BF No
-32C0 32CB So
-32D0 32FE So
-3300 3376 So
-337B 33DD So
-33E0 33FE So
+32C0 32FE So
+3300 33FF So
3400 4DB5 Lo
+4DC0 4DFF So
4E00 9FA5 Lo
A000 A48C Lo
A490 A4C6 So
@@ -1539,6 +1581,7 @@ FD50 FD8F Lo
FD92 FDC7 Lo
FDF0 FDFB Lo
FDFC Sc
+FDFD So
FE00 FE0F Mn
FE20 FE23 Mn
FE30 Po
@@ -1561,6 +1604,8 @@ FE42 Pe
FE43 Ps
FE44 Pe
FE45 FE46 Po
+FE47 Ps
+FE48 Pe
FE49 FE4C Po
FE4D FE4F Pc
FE50 FE52 Po
@@ -1634,12 +1679,33 @@ FFE9 FFEC Sm
FFED FFEE So
FFF9 FFFB Cf
FFFC FFFD So
+10000 1000B Lo
+1000D 10026 Lo
+10028 1003A Lo
+1003C 1003D Lo
+1003F 1004D Lo
+10050 1005D Lo
+10080 100FA Lo
+10100 10101 Po
+10102 So
+10107 10133 No
+10137 1013F So
10300 1031E Lo
10320 10323 No
10330 10349 Lo
1034A Nl
-10400 10425 Lu
-10428 1044D Ll
+10380 1039D Lo
+1039F Po
+10400 10427 Lu
+10428 1044F Ll
+10450 1049D Lo
+104A0 104A9 Nd
+10800 10805 Lo
+10808 Lo
+1080A 10835 Lo
+10837 10838 Lo
+1083C Lo
+1083F Lo
1D000 1D0F5 So
1D100 1D126 So
1D12A 1D164 So
@@ -1654,6 +1720,7 @@ FFFC FFFD So
1D18C 1D1A9 So
1D1AA 1D1AD Mn
1D1AE 1D1DD So
+1D300 1D356 So
1D400 1D419 Lu
1D41A 1D433 Ll
1D434 1D44D Lu
@@ -1669,8 +1736,7 @@ FFFC FFFD So
1D4AE 1D4B5 Lu
1D4B6 1D4B9 Ll
1D4BB Ll
-1D4BD 1D4C0 Ll
-1D4C2 1D4C3 Ll
+1D4BD 1D4C3 Ll
1D4C5 1D4CF Ll
1D4D0 1D4E9 Lu
1D4EA 1D503 Ll
@@ -1727,6 +1793,7 @@ FFFC FFFD So
2F800 2FA1D Lo
E0001 Cf
E0020 E007F Cf
+E0100 E01EF Mn
F0000 FFFFD Co
100000 10FFFD Co
END
diff --git a/gnu/usr.bin/perl/lib/unicore/CombiningClass.pl b/gnu/usr.bin/perl/lib/unicore/CombiningClass.pl
index 2b97b553e4e..a1ce7d2e53c 100644
--- a/gnu/usr.bin/perl/lib/unicore/CombiningClass.pl
+++ b/gnu/usr.bin/perl/lib/unicore/CombiningClass.pl
@@ -21,6 +21,11 @@ return <<'END';
0347 0349 220
034A 034C 230
034D 034E 220
+0350 0352 230
+0353 0356 220
+0357 230
+035D 035E 234
+035F 233
0360 0361 234
0362 233
0363 036F 230
@@ -56,6 +61,7 @@ return <<'END';
05C1 24
05C2 25
05C4 230
+0610 0615 230
064B 27
064C 28
064D 29
@@ -65,7 +71,8 @@ return <<'END';
0651 33
0652 34
0653 0654 230
-0655 220
+0655 0656 220
+0657 0658 230
0670 35
06D6 06DC 230
06DF 06E2 230
@@ -112,6 +119,7 @@ return <<'END';
0C4D 9
0C55 84
0C56 91
+0CBC 7
0CCD 9
0D4D 9
0DCA 9
@@ -138,7 +146,11 @@ return <<'END';
1714 9
1734 9
17D2 9
+17DD 230
18A9 228
+1939 222
+193A 230
+193B 220
20D0 20D1 230
20D2 20D3 1
20D4 20D7 230
diff --git a/gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt b/gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt
index 07a60b8b920..ef558e58364 100644
--- a/gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt
+++ b/gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt
@@ -1,12 +1,8 @@
-# CompositionExclusions-3.2.0.txt
-# Date: 2002-03-19,23:30:28 GMT [MD]
+# CompositionExclusions-4.0.0.txt
+# Date: 2003-02-14,16:49:03 GMT [MD]
#
# This file lists the characters from the UAX #15 Composition Exclusion Table.
#
-# The format of the comments in this file has been updated since the last version,
-# CompositionExclusions-3.txt. The only substantive change to this file between that
-# version and this one is the addition of U+2ADC FORKING.
-#
# For more information, see
# http://www.unicode.org/unicode/reports/tr15/#Primary Exclusion List Table
# ================================================
diff --git a/gnu/usr.bin/perl/lib/unicore/Decomposition.pl b/gnu/usr.bin/perl/lib/unicore/Decomposition.pl
index 739d8fc661b..8d8310956ef 100644
--- a/gnu/usr.bin/perl/lib/unicore/Decomposition.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Decomposition.pl
@@ -349,6 +349,7 @@ return <<'END';
03F2 <compat> 03C2
03F4 <compat> 0398
03F5 <compat> 03B5
+03F9 <compat> 03A3
0400 0415 0300
0401 0415 0308
0403 0413 0301
@@ -483,6 +484,66 @@ return <<'END';
0FAC 0FAB 0FB7
0FB9 0F90 0FB5
1026 1025 102E
+1D2C <super> 0041
+1D2D <super> 00C6
+1D2E <super> 0042
+1D30 <super> 0044
+1D31 <super> 0045
+1D32 <super> 018E
+1D33 <super> 0047
+1D34 <super> 0048
+1D35 <super> 0049
+1D36 <super> 004A
+1D37 <super> 004B
+1D38 <super> 004C
+1D39 <super> 004D
+1D3A <super> 004E
+1D3C <super> 004F
+1D3D <super> 0222
+1D3E <super> 0050
+1D3F <super> 0052
+1D40 <super> 0054
+1D41 <super> 0055
+1D42 <super> 0057
+1D43 <super> 0061
+1D44 <super> 0250
+1D45 <super> 0251
+1D46 <super> 1D02
+1D47 <super> 0062
+1D48 <super> 0064
+1D49 <super> 0065
+1D4A <super> 0259
+1D4B <super> 025B
+1D4C <super> 025C
+1D4D <super> 0067
+1D4F <super> 006B
+1D50 <super> 006D
+1D51 <super> 014B
+1D52 <super> 006F
+1D53 <super> 0254
+1D54 <super> 1D16
+1D55 <super> 1D17
+1D56 <super> 0070
+1D57 <super> 0074
+1D58 <super> 0075
+1D59 <super> 1D1D
+1D5A <super> 026F
+1D5B <super> 0076
+1D5C <super> 1D25
+1D5D <super> 03B2
+1D5E <super> 03B3
+1D5F <super> 03B4
+1D60 <super> 03C6
+1D61 <super> 03C7
+1D62 <sub> 0069
+1D63 <sub> 0072
+1D64 <sub> 0075
+1D65 <sub> 0076
+1D66 <sub> 03B2
+1D67 <sub> 03B3
+1D68 <sub> 03C1
+1D69 <sub> 03C6
+1D6A <sub> 03C7
1E00 0041 0325
1E01 0061 0325
1E02 0042 0307
@@ -1054,6 +1115,7 @@ return <<'END';
2137 <compat> 05D2
2138 <compat> 05D3
2139 <font> 0069
+213B <compat> 0046 0041 0058
213D <font> 03B3
213E <font> 0393
213F <font> 03A0
@@ -1722,6 +1784,8 @@ return <<'END';
321A <compat> 0028 1111 1161 0029
321B <compat> 0028 1112 1161 0029
321C <compat> 0028 110C 116E 0029
+321D <compat> 0028 110B 1169 110C 1165 11AB 0029
+321E <compat> 0028 110B 1169 1112 116E 0029
3220 <compat> 0028 4E00 0029
3221 <compat> 0028 4E8C 0029
3222 <compat> 0028 4E09 0029
@@ -1758,6 +1822,7 @@ return <<'END';
3241 <compat> 0028 4F11 0029
3242 <compat> 0028 81EA 0029
3243 <compat> 0028 81F3 0029
+3250 <square> 0050 0054 0045
3251 <circle> 0032 0031
3252 <circle> 0032 0032
3253 <circle> 0032 0033
@@ -1801,6 +1866,8 @@ return <<'END';
3279 <circle> 1110 1161
327A <circle> 1111 1161
327B <circle> 1112 1161
+327C <circle> 110E 1161 11B7 1100 1169
+327D <circle> 110C 116E 110B 1174
3280 <circle> 4E00
3281 <circle> 4E8C
3282 <circle> 4E09
@@ -1877,6 +1944,10 @@ return <<'END';
32C9 <compat> 0031 0030 6708
32CA <compat> 0031 0031 6708
32CB <compat> 0031 0032 6708
+32CC <square> 0048 0067
+32CD <square> 0065 0072 0067
+32CE <square> 0065 0056
+32CF <square> 004C 0054 0044
32D0 <circle> 30A2
32D1 <circle> 30A4
32D2 <circle> 30A6
@@ -2043,6 +2114,10 @@ return <<'END';
3374 <square> 0062 0061 0072
3375 <square> 006F 0056
3376 <square> 0070 0063
+3377 <square> 0064 006D
+3378 <square> 0064 006D 00B2
+3379 <square> 0064 006D 00B3
+337A <square> 0049 0055
337B <square> 5E73 6210
337C <square> 662D 548C
337D <square> 5927 6B63
@@ -2142,6 +2217,8 @@ return <<'END';
33DB <square> 0073 0072
33DC <square> 0053 0076
33DD <square> 0057 0062
+33DE <square> 0056 2215 006D
+33DF <square> 0041 2215 006D
33E0 <compat> 0031 65E5
33E1 <compat> 0032 65E5
33E2 <compat> 0033 65E5
@@ -2173,6 +2250,7 @@ return <<'END';
33FC <compat> 0032 0039 65E5
33FD <compat> 0033 0030 65E5
33FE <compat> 0033 0031 65E5
+33FF <square> 0067 0061 006C
F900 8C48
F901 66F4
F902 8ECA
@@ -3189,6 +3267,8 @@ FE41 <vertical> 300C
FE42 <vertical> 300D
FE43 <vertical> 300E
FE44 <vertical> 300F
+FE47 <vertical> 005B
+FE48 <vertical> 005D
FE49 FE4C <compat> 203E
FE4D FE4F <compat> 005F
FE50 <small> 002C
@@ -3776,6 +3856,7 @@ FFEE <narrow> 25CB
1D4BE <font> 0069
1D4BF <font> 006A
1D4C0 <font> 006B
+1D4C1 <font> 006C
1D4C2 <font> 006D
1D4C3 <font> 006E
1D4C5 <font> 0070
@@ -4686,7 +4767,7 @@ FFEE <narrow> 25CB
2F865 59D8
2F866 5A66
2F867 36EE
-2F868 2136A
+2F868 36FC
2F869 5B08
2F86A 2F86B 5B3E
2F86C 219C8
@@ -4697,7 +4778,7 @@ FFEE <narrow> 25CB
2F871 21B18
2F872 5BFF
2F873 5C06
-2F874 5F33
+2F874 5F53
2F875 5C22
2F876 3781
2F877 5C60
@@ -4866,7 +4947,7 @@ FFEE <narrow> 25CB
2F91C 7145
2F91D 24263
2F91E 719C
-2F91F 43AB
+2F91F 243AB
2F920 7228
2F921 7235
2F922 7250
@@ -4927,7 +5008,7 @@ FFEE <narrow> 25CB
2F95B 7A4F
2F95C 2597C
2F95D 2F95E 25AA7
-2F95F 7AAE
+2F95F 7AEE
2F960 4202
2F961 25BAB
2F962 7BC6
@@ -5023,7 +5104,7 @@ FFEE <narrow> 25CB
2F9BC 8728
2F9BD 876B
2F9BE 8786
-2F9BF 4D57
+2F9BF 45D7
2F9C0 87E1
2F9C1 8801
2F9C2 45F9
diff --git a/gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt b/gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt
index dc991078d0e..9e117d8d6c8 100644
--- a/gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt
+++ b/gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt
@@ -1,4 +1,4 @@
-# EastAsianWidth-3.2.0.txt
+# EastAsianWidth-4.0.0.txt
#
# East Asian Width Properties
#
@@ -8,7 +8,8 @@
# Field 1: Unicode value
# Field 2: East Asian Width property, consisting of one of the following values:
# "N", "A", "H", "W", "F", "Na"
-# - Assigned characters that are not listed explicitly are given the value "N".
+# - All code points, assigned or unassigned, that are not listed
+# explicitly are given the value "N".
# - Characters ranges are specified as for other property files in
# the Unicode Character Database.
#
@@ -561,6 +562,7 @@
021E;N # LATIN CAPITAL LETTER H WITH CARON
021F;N # LATIN SMALL LETTER H WITH CARON
0220;N # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221;N # LATIN SMALL LETTER D WITH CURL
0222;N # LATIN CAPITAL LETTER OU
0223;N # LATIN SMALL LETTER OU
0224;N # LATIN CAPITAL LETTER Z WITH HOOK
@@ -579,6 +581,9 @@
0231;N # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
0232;N # LATIN CAPITAL LETTER Y WITH MACRON
0233;N # LATIN SMALL LETTER Y WITH MACRON
+0234;N # LATIN SMALL LETTER L WITH CURL
+0235;N # LATIN SMALL LETTER N WITH CURL
+0236;N # LATIN SMALL LETTER T WITH CURL
0250;N # LATIN SMALL LETTER TURNED A
0251;A # LATIN SMALL LETTER ALPHA
0252;N # LATIN SMALL LETTER TURNED ALPHA
@@ -673,6 +678,8 @@
02AB;N # LATIN SMALL LETTER LZ DIGRAPH
02AC;N # LATIN LETTER BILABIAL PERCUSSIVE
02AD;N # LATIN LETTER BIDENTAL PERCUSSIVE
+02AE;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF;N # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
02B0;N # MODIFIER LETTER SMALL H
02B1;N # MODIFIER LETTER SMALL H WITH HOOK
02B2;N # MODIFIER LETTER SMALL J
@@ -736,6 +743,23 @@
02EC;N # MODIFIER LETTER VOICING
02ED;N # MODIFIER LETTER UNASPIRATED
02EE;N # MODIFIER LETTER DOUBLE APOSTROPHE
+02EF;N # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0;N # MODIFIER LETTER LOW UP ARROWHEAD
+02F1;N # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2;N # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3;N # MODIFIER LETTER LOW RING
+02F4;N # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5;N # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6;N # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7;N # MODIFIER LETTER LOW TILDE
+02F8;N # MODIFIER LETTER RAISED COLON
+02F9;N # MODIFIER LETTER BEGIN HIGH TONE
+02FA;N # MODIFIER LETTER END HIGH TONE
+02FB;N # MODIFIER LETTER BEGIN LOW TONE
+02FC;N # MODIFIER LETTER END LOW TONE
+02FD;N # MODIFIER LETTER SHELF
+02FE;N # MODIFIER LETTER OPEN SHELF
+02FF;N # MODIFIER LETTER LOW LEFT ARROW
0300;A # COMBINING GRAVE ACCENT
0301;A # COMBINING ACUTE ACCENT
0302;A # COMBINING CIRCUMFLEX ACCENT
@@ -816,6 +840,17 @@
034D;A # COMBINING LEFT RIGHT ARROW BELOW
034E;A # COMBINING UPWARDS ARROW BELOW
034F;A # COMBINING GRAPHEME JOINER
+0350;A # COMBINING RIGHT ARROWHEAD ABOVE
+0351;A # COMBINING LEFT HALF RING ABOVE
+0352;A # COMBINING FERMATA
+0353;A # COMBINING X BELOW
+0354;A # COMBINING LEFT ARROWHEAD BELOW
+0355;A # COMBINING RIGHT ARROWHEAD BELOW
+0356;A # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357;A # COMBINING RIGHT HALF RING ABOVE
+035D;A # COMBINING DOUBLE BREVE
+035E;A # COMBINING DOUBLE MACRON
+035F;A # COMBINING DOUBLE MACRON BELOW
0360;A # COMBINING DOUBLE TILDE
0361;A # COMBINING DOUBLE INVERTED BREVE
0362;A # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
@@ -947,6 +982,11 @@
03F4;N # GREEK CAPITAL THETA SYMBOL
03F5;N # GREEK LUNATE EPSILON SYMBOL
03F6;N # GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7;N # GREEK CAPITAL LETTER SHO
+03F8;N # GREEK SMALL LETTER SHO
+03F9;N # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA;N # GREEK CAPITAL LETTER SAN
+03FB;N # GREEK SMALL LETTER SAN
0400;N # CYRILLIC CAPITAL LETTER IE WITH GRAVE
0401;A # CYRILLIC CAPITAL LETTER IO
0402;N # CYRILLIC CAPITAL LETTER DJE
@@ -1377,7 +1417,20 @@
05F2;N # HEBREW LIGATURE YIDDISH DOUBLE YOD
05F3;N # HEBREW PUNCTUATION GERESH
05F4;N # HEBREW PUNCTUATION GERSHAYIM
+0600;N # ARABIC NUMBER SIGN
+0601;N # ARABIC SIGN SANAH
+0602;N # ARABIC FOOTNOTE MARKER
+0603;N # ARABIC SIGN SAFHA
060C;N # ARABIC COMMA
+060D;N # ARABIC DATE SEPARATOR
+060E;N # ARABIC POETIC VERSE SIGN
+060F;N # ARABIC SIGN MISRA
+0610;N # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611;N # ARABIC SIGN ALAYHE ASSALLAM
+0612;N # ARABIC SIGN RAHMATULLAH ALAYHE
+0613;N # ARABIC SIGN RADI ALLAHOU ANHU
+0614;N # ARABIC SIGN TAKHALLUS
+0615;N # ARABIC SMALL HIGH TAH
061B;N # ARABIC SEMICOLON
061F;N # ARABIC QUESTION MARK
0621;N # ARABIC LETTER HAMZA
@@ -1428,6 +1481,9 @@
0653;N # ARABIC MADDAH ABOVE
0654;N # ARABIC HAMZA ABOVE
0655;N # ARABIC HAMZA BELOW
+0656;N # ARABIC SUBSCRIPT ALEF
+0657;N # ARABIC INVERTED DAMMA
+0658;N # ARABIC MARK NOON GHUNNA
0660;N # ARABIC-INDIC DIGIT ZERO
0661;N # ARABIC-INDIC DIGIT ONE
0662;N # ARABIC-INDIC DIGIT TWO
@@ -1570,6 +1626,8 @@
06EB;N # ARABIC EMPTY CENTRE HIGH STOP
06EC;N # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
06ED;N # ARABIC SMALL LOW MEEM
+06EE;N # ARABIC LETTER DAL WITH INVERTED V
+06EF;N # ARABIC LETTER REH WITH INVERTED V
06F0;N # EXTENDED ARABIC-INDIC DIGIT ZERO
06F1;N # EXTENDED ARABIC-INDIC DIGIT ONE
06F2;N # EXTENDED ARABIC-INDIC DIGIT TWO
@@ -1585,6 +1643,7 @@
06FC;N # ARABIC LETTER GHAIN WITH DOT BELOW
06FD;N # ARABIC SIGN SINDHI AMPERSAND
06FE;N # ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF;N # ARABIC LETTER HEH WITH INVERTED V
0700;N # SYRIAC END OF PARAGRAPH
0701;N # SYRIAC SUPRALINEAR FULL STOP
0702;N # SYRIAC SUBLINEAR FULL STOP
@@ -1629,6 +1688,9 @@
072A;N # SYRIAC LETTER RISH
072B;N # SYRIAC LETTER SHIN
072C;N # SYRIAC LETTER TAW
+072D;N # SYRIAC LETTER PERSIAN BHETH
+072E;N # SYRIAC LETTER PERSIAN GHAMAL
+072F;N # SYRIAC LETTER PERSIAN DHALATH
0730;N # SYRIAC PTHAHA ABOVE
0731;N # SYRIAC PTHAHA BELOW
0732;N # SYRIAC PTHAHA DOTTED
@@ -1656,6 +1718,9 @@
0748;N # SYRIAC OBLIQUE LINE BELOW
0749;N # SYRIAC MUSIC
074A;N # SYRIAC BARREKH
+074D;N # SYRIAC LETTER SOGDIAN ZHAIN
+074E;N # SYRIAC LETTER SOGDIAN KHAPH
+074F;N # SYRIAC LETTER SOGDIAN FE
0780;N # THAANA LETTER HAA
0781;N # THAANA LETTER SHAVIYANI
0782;N # THAANA LETTER NOONU
@@ -1709,6 +1774,7 @@
0901;N # DEVANAGARI SIGN CANDRABINDU
0902;N # DEVANAGARI SIGN ANUSVARA
0903;N # DEVANAGARI SIGN VISARGA
+0904;N # DEVANAGARI LETTER SHORT A
0905;N # DEVANAGARI LETTER A
0906;N # DEVANAGARI LETTER AA
0907;N # DEVANAGARI LETTER I
@@ -1858,6 +1924,7 @@
09B8;N # BENGALI LETTER SA
09B9;N # BENGALI LETTER HA
09BC;N # BENGALI SIGN NUKTA
+09BD;N # BENGALI SIGN AVAGRAHA
09BE;N # BENGALI VOWEL SIGN AA
09BF;N # BENGALI VOWEL SIGN I
09C0;N # BENGALI VOWEL SIGN II
@@ -1899,7 +1966,9 @@
09F8;N # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
09F9;N # BENGALI CURRENCY DENOMINATOR SIXTEEN
09FA;N # BENGALI ISSHAR
+0A01;N # GURMUKHI SIGN ADAK BINDI
0A02;N # GURMUKHI SIGN BINDI
+0A03;N # GURMUKHI SIGN VISARGA
0A05;N # GURMUKHI LETTER A
0A06;N # GURMUKHI LETTER AA
0A07;N # GURMUKHI LETTER I
@@ -1984,6 +2053,7 @@
0A89;N # GUJARATI LETTER U
0A8A;N # GUJARATI LETTER UU
0A8B;N # GUJARATI LETTER VOCALIC R
+0A8C;N # GUJARATI LETTER VOCALIC L
0A8D;N # GUJARATI VOWEL CANDRA E
0A8F;N # GUJARATI LETTER E
0A90;N # GUJARATI LETTER AI
@@ -2042,6 +2112,9 @@
0ACD;N # GUJARATI SIGN VIRAMA
0AD0;N # GUJARATI OM
0AE0;N # GUJARATI LETTER VOCALIC RR
+0AE1;N # GUJARATI LETTER VOCALIC LL
+0AE2;N # GUJARATI VOWEL SIGN VOCALIC L
+0AE3;N # GUJARATI VOWEL SIGN VOCALIC LL
0AE6;N # GUJARATI DIGIT ZERO
0AE7;N # GUJARATI DIGIT ONE
0AE8;N # GUJARATI DIGIT TWO
@@ -2052,6 +2125,7 @@
0AED;N # GUJARATI DIGIT SEVEN
0AEE;N # GUJARATI DIGIT EIGHT
0AEF;N # GUJARATI DIGIT NINE
+0AF1;N # GUJARATI RUPEE SIGN
0B01;N # ORIYA SIGN CANDRABINDU
0B02;N # ORIYA SIGN ANUSVARA
0B03;N # ORIYA SIGN VISARGA
@@ -2096,6 +2170,7 @@
0B30;N # ORIYA LETTER RA
0B32;N # ORIYA LETTER LA
0B33;N # ORIYA LETTER LLA
+0B35;N # ORIYA LETTER VA
0B36;N # ORIYA LETTER SHA
0B37;N # ORIYA LETTER SSA
0B38;N # ORIYA LETTER SA
@@ -2131,6 +2206,7 @@
0B6E;N # ORIYA DIGIT EIGHT
0B6F;N # ORIYA DIGIT NINE
0B70;N # ORIYA ISSHAR
+0B71;N # ORIYA LETTER WA
0B82;N # TAMIL SIGN ANUSVARA
0B83;N # TAMIL SIGN VISARGA
0B85;N # TAMIL LETTER A
@@ -2192,6 +2268,14 @@
0BF0;N # TAMIL NUMBER TEN
0BF1;N # TAMIL NUMBER ONE HUNDRED
0BF2;N # TAMIL NUMBER ONE THOUSAND
+0BF3;N # TAMIL DAY SIGN
+0BF4;N # TAMIL MONTH SIGN
+0BF5;N # TAMIL YEAR SIGN
+0BF6;N # TAMIL DEBIT SIGN
+0BF7;N # TAMIL CREDIT SIGN
+0BF8;N # TAMIL AS ABOVE SIGN
+0BF9;N # TAMIL RUPEE SIGN
+0BFA;N # TAMIL NUMBER SIGN
0C01;N # TELUGU SIGN CANDRABINDU
0C02;N # TELUGU SIGN ANUSVARA
0C03;N # TELUGU SIGN VISARGA
@@ -2323,6 +2407,8 @@
0CB7;N # KANNADA LETTER SSA
0CB8;N # KANNADA LETTER SA
0CB9;N # KANNADA LETTER HA
+0CBC;N # KANNADA SIGN NUKTA
+0CBD;N # KANNADA SIGN AVAGRAHA
0CBE;N # KANNADA VOWEL SIGN AA
0CBF;N # KANNADA VOWEL SIGN I
0CC0;N # KANNADA VOWEL SIGN II
@@ -4597,6 +4683,7 @@
17DA;N # KHMER SIGN KOOMUUT
17DB;N # KHMER CURRENCY SYMBOL RIEL
17DC;N # KHMER SIGN AVAKRAHASANYA
+17DD;N # KHMER SIGN ATTHACAN
17E0;N # KHMER DIGIT ZERO
17E1;N # KHMER DIGIT ONE
17E2;N # KHMER DIGIT TWO
@@ -4607,6 +4694,16 @@
17E7;N # KHMER DIGIT SEVEN
17E8;N # KHMER DIGIT EIGHT
17E9;N # KHMER DIGIT NINE
+17F0;N # KHMER SYMBOL LEK ATTAK SON
+17F1;N # KHMER SYMBOL LEK ATTAK MUOY
+17F2;N # KHMER SYMBOL LEK ATTAK PII
+17F3;N # KHMER SYMBOL LEK ATTAK BEI
+17F4;N # KHMER SYMBOL LEK ATTAK BUON
+17F5;N # KHMER SYMBOL LEK ATTAK PRAM
+17F6;N # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7;N # KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8;N # KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9;N # KHMER SYMBOL LEK ATTAK PRAM-BUON
1800;N # MONGOLIAN BIRGA
1801;N # MONGOLIAN ELLIPSIS
1802;N # MONGOLIAN COMMA
@@ -4762,6 +4859,247 @@
18A7;N # MONGOLIAN LETTER ALI GALI HALF YA
18A8;N # MONGOLIAN LETTER MANCHU ALI GALI BHA
18A9;N # MONGOLIAN LETTER ALI GALI DAGALGA
+1900;N # LIMBU VOWEL-CARRIER LETTER
+1901;N # LIMBU LETTER KA
+1902;N # LIMBU LETTER KHA
+1903;N # LIMBU LETTER GA
+1904;N # LIMBU LETTER GHA
+1905;N # LIMBU LETTER NGA
+1906;N # LIMBU LETTER CA
+1907;N # LIMBU LETTER CHA
+1908;N # LIMBU LETTER JA
+1909;N # LIMBU LETTER JHA
+190A;N # LIMBU LETTER YAN
+190B;N # LIMBU LETTER TA
+190C;N # LIMBU LETTER THA
+190D;N # LIMBU LETTER DA
+190E;N # LIMBU LETTER DHA
+190F;N # LIMBU LETTER NA
+1910;N # LIMBU LETTER PA
+1911;N # LIMBU LETTER PHA
+1912;N # LIMBU LETTER BA
+1913;N # LIMBU LETTER BHA
+1914;N # LIMBU LETTER MA
+1915;N # LIMBU LETTER YA
+1916;N # LIMBU LETTER RA
+1917;N # LIMBU LETTER LA
+1918;N # LIMBU LETTER WA
+1919;N # LIMBU LETTER SHA
+191A;N # LIMBU LETTER SSA
+191B;N # LIMBU LETTER SA
+191C;N # LIMBU LETTER HA
+1920;N # LIMBU VOWEL SIGN A
+1921;N # LIMBU VOWEL SIGN I
+1922;N # LIMBU VOWEL SIGN U
+1923;N # LIMBU VOWEL SIGN EE
+1924;N # LIMBU VOWEL SIGN AI
+1925;N # LIMBU VOWEL SIGN OO
+1926;N # LIMBU VOWEL SIGN AU
+1927;N # LIMBU VOWEL SIGN E
+1928;N # LIMBU VOWEL SIGN O
+1929;N # LIMBU SUBJOINED LETTER YA
+192A;N # LIMBU SUBJOINED LETTER RA
+192B;N # LIMBU SUBJOINED LETTER WA
+1930;N # LIMBU SMALL LETTER KA
+1931;N # LIMBU SMALL LETTER NGA
+1932;N # LIMBU SMALL LETTER ANUSVARA
+1933;N # LIMBU SMALL LETTER TA
+1934;N # LIMBU SMALL LETTER NA
+1935;N # LIMBU SMALL LETTER PA
+1936;N # LIMBU SMALL LETTER MA
+1937;N # LIMBU SMALL LETTER RA
+1938;N # LIMBU SMALL LETTER LA
+1939;N # LIMBU SIGN MUKPHRENG
+193A;N # LIMBU SIGN KEMPHRENG
+193B;N # LIMBU SIGN SA-I
+1940;N # LIMBU SIGN LOO
+1944;N # LIMBU EXCLAMATION MARK
+1945;N # LIMBU QUESTION MARK
+1946;N # LIMBU DIGIT ZERO
+1947;N # LIMBU DIGIT ONE
+1948;N # LIMBU DIGIT TWO
+1949;N # LIMBU DIGIT THREE
+194A;N # LIMBU DIGIT FOUR
+194B;N # LIMBU DIGIT FIVE
+194C;N # LIMBU DIGIT SIX
+194D;N # LIMBU DIGIT SEVEN
+194E;N # LIMBU DIGIT EIGHT
+194F;N # LIMBU DIGIT NINE
+1950;N # TAI LE LETTER KA
+1951;N # TAI LE LETTER XA
+1952;N # TAI LE LETTER NGA
+1953;N # TAI LE LETTER TSA
+1954;N # TAI LE LETTER SA
+1955;N # TAI LE LETTER YA
+1956;N # TAI LE LETTER TA
+1957;N # TAI LE LETTER THA
+1958;N # TAI LE LETTER LA
+1959;N # TAI LE LETTER PA
+195A;N # TAI LE LETTER PHA
+195B;N # TAI LE LETTER MA
+195C;N # TAI LE LETTER FA
+195D;N # TAI LE LETTER VA
+195E;N # TAI LE LETTER HA
+195F;N # TAI LE LETTER QA
+1960;N # TAI LE LETTER KHA
+1961;N # TAI LE LETTER TSHA
+1962;N # TAI LE LETTER NA
+1963;N # TAI LE LETTER A
+1964;N # TAI LE LETTER I
+1965;N # TAI LE LETTER EE
+1966;N # TAI LE LETTER EH
+1967;N # TAI LE LETTER U
+1968;N # TAI LE LETTER OO
+1969;N # TAI LE LETTER O
+196A;N # TAI LE LETTER UE
+196B;N # TAI LE LETTER E
+196C;N # TAI LE LETTER AUE
+196D;N # TAI LE LETTER AI
+1970;N # TAI LE LETTER TONE-2
+1971;N # TAI LE LETTER TONE-3
+1972;N # TAI LE LETTER TONE-4
+1973;N # TAI LE LETTER TONE-5
+1974;N # TAI LE LETTER TONE-6
+19E0;N # KHMER SYMBOL PATHAMASAT
+19E1;N # KHMER SYMBOL MUOY KOET
+19E2;N # KHMER SYMBOL PII KOET
+19E3;N # KHMER SYMBOL BEI KOET
+19E4;N # KHMER SYMBOL BUON KOET
+19E5;N # KHMER SYMBOL PRAM KOET
+19E6;N # KHMER SYMBOL PRAM-MUOY KOET
+19E7;N # KHMER SYMBOL PRAM-PII KOET
+19E8;N # KHMER SYMBOL PRAM-BEI KOET
+19E9;N # KHMER SYMBOL PRAM-BUON KOET
+19EA;N # KHMER SYMBOL DAP KOET
+19EB;N # KHMER SYMBOL DAP-MUOY KOET
+19EC;N # KHMER SYMBOL DAP-PII KOET
+19ED;N # KHMER SYMBOL DAP-BEI KOET
+19EE;N # KHMER SYMBOL DAP-BUON KOET
+19EF;N # KHMER SYMBOL DAP-PRAM KOET
+19F0;N # KHMER SYMBOL TUTEYASAT
+19F1;N # KHMER SYMBOL MUOY ROC
+19F2;N # KHMER SYMBOL PII ROC
+19F3;N # KHMER SYMBOL BEI ROC
+19F4;N # KHMER SYMBOL BUON ROC
+19F5;N # KHMER SYMBOL PRAM ROC
+19F6;N # KHMER SYMBOL PRAM-MUOY ROC
+19F7;N # KHMER SYMBOL PRAM-PII ROC
+19F8;N # KHMER SYMBOL PRAM-BEI ROC
+19F9;N # KHMER SYMBOL PRAM-BUON ROC
+19FA;N # KHMER SYMBOL DAP ROC
+19FB;N # KHMER SYMBOL DAP-MUOY ROC
+19FC;N # KHMER SYMBOL DAP-PII ROC
+19FD;N # KHMER SYMBOL DAP-BEI ROC
+19FE;N # KHMER SYMBOL DAP-BUON ROC
+19FF;N # KHMER SYMBOL DAP-PRAM ROC
+1D00;N # LATIN LETTER SMALL CAPITAL A
+1D01;N # LATIN LETTER SMALL CAPITAL AE
+1D02;N # LATIN SMALL LETTER TURNED AE
+1D03;N # LATIN LETTER SMALL CAPITAL BARRED B
+1D04;N # LATIN LETTER SMALL CAPITAL C
+1D05;N # LATIN LETTER SMALL CAPITAL D
+1D06;N # LATIN LETTER SMALL CAPITAL ETH
+1D07;N # LATIN LETTER SMALL CAPITAL E
+1D08;N # LATIN SMALL LETTER TURNED OPEN E
+1D09;N # LATIN SMALL LETTER TURNED I
+1D0A;N # LATIN LETTER SMALL CAPITAL J
+1D0B;N # LATIN LETTER SMALL CAPITAL K
+1D0C;N # LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D;N # LATIN LETTER SMALL CAPITAL M
+1D0E;N # LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F;N # LATIN LETTER SMALL CAPITAL O
+1D10;N # LATIN LETTER SMALL CAPITAL OPEN O
+1D11;N # LATIN SMALL LETTER SIDEWAYS O
+1D12;N # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13;N # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14;N # LATIN SMALL LETTER TURNED OE
+1D15;N # LATIN LETTER SMALL CAPITAL OU
+1D16;N # LATIN SMALL LETTER TOP HALF O
+1D17;N # LATIN SMALL LETTER BOTTOM HALF O
+1D18;N # LATIN LETTER SMALL CAPITAL P
+1D19;N # LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A;N # LATIN LETTER SMALL CAPITAL TURNED R
+1D1B;N # LATIN LETTER SMALL CAPITAL T
+1D1C;N # LATIN LETTER SMALL CAPITAL U
+1D1D;N # LATIN SMALL LETTER SIDEWAYS U
+1D1E;N # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F;N # LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20;N # LATIN LETTER SMALL CAPITAL V
+1D21;N # LATIN LETTER SMALL CAPITAL W
+1D22;N # LATIN LETTER SMALL CAPITAL Z
+1D23;N # LATIN LETTER SMALL CAPITAL EZH
+1D24;N # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25;N # LATIN LETTER AIN
+1D26;N # GREEK LETTER SMALL CAPITAL GAMMA
+1D27;N # GREEK LETTER SMALL CAPITAL LAMDA
+1D28;N # GREEK LETTER SMALL CAPITAL PI
+1D29;N # GREEK LETTER SMALL CAPITAL RHO
+1D2A;N # GREEK LETTER SMALL CAPITAL PSI
+1D2B;N # CYRILLIC LETTER SMALL CAPITAL EL
+1D2C;N # MODIFIER LETTER CAPITAL A
+1D2D;N # MODIFIER LETTER CAPITAL AE
+1D2E;N # MODIFIER LETTER CAPITAL B
+1D2F;N # MODIFIER LETTER CAPITAL BARRED B
+1D30;N # MODIFIER LETTER CAPITAL D
+1D31;N # MODIFIER LETTER CAPITAL E
+1D32;N # MODIFIER LETTER CAPITAL REVERSED E
+1D33;N # MODIFIER LETTER CAPITAL G
+1D34;N # MODIFIER LETTER CAPITAL H
+1D35;N # MODIFIER LETTER CAPITAL I
+1D36;N # MODIFIER LETTER CAPITAL J
+1D37;N # MODIFIER LETTER CAPITAL K
+1D38;N # MODIFIER LETTER CAPITAL L
+1D39;N # MODIFIER LETTER CAPITAL M
+1D3A;N # MODIFIER LETTER CAPITAL N
+1D3B;N # MODIFIER LETTER CAPITAL REVERSED N
+1D3C;N # MODIFIER LETTER CAPITAL O
+1D3D;N # MODIFIER LETTER CAPITAL OU
+1D3E;N # MODIFIER LETTER CAPITAL P
+1D3F;N # MODIFIER LETTER CAPITAL R
+1D40;N # MODIFIER LETTER CAPITAL T
+1D41;N # MODIFIER LETTER CAPITAL U
+1D42;N # MODIFIER LETTER CAPITAL W
+1D43;N # MODIFIER LETTER SMALL A
+1D44;N # MODIFIER LETTER SMALL TURNED A
+1D45;N # MODIFIER LETTER SMALL ALPHA
+1D46;N # MODIFIER LETTER SMALL TURNED AE
+1D47;N # MODIFIER LETTER SMALL B
+1D48;N # MODIFIER LETTER SMALL D
+1D49;N # MODIFIER LETTER SMALL E
+1D4A;N # MODIFIER LETTER SMALL SCHWA
+1D4B;N # MODIFIER LETTER SMALL OPEN E
+1D4C;N # MODIFIER LETTER SMALL TURNED OPEN E
+1D4D;N # MODIFIER LETTER SMALL G
+1D4E;N # MODIFIER LETTER SMALL TURNED I
+1D4F;N # MODIFIER LETTER SMALL K
+1D50;N # MODIFIER LETTER SMALL M
+1D51;N # MODIFIER LETTER SMALL ENG
+1D52;N # MODIFIER LETTER SMALL O
+1D53;N # MODIFIER LETTER SMALL OPEN O
+1D54;N # MODIFIER LETTER SMALL TOP HALF O
+1D55;N # MODIFIER LETTER SMALL BOTTOM HALF O
+1D56;N # MODIFIER LETTER SMALL P
+1D57;N # MODIFIER LETTER SMALL T
+1D58;N # MODIFIER LETTER SMALL U
+1D59;N # MODIFIER LETTER SMALL SIDEWAYS U
+1D5A;N # MODIFIER LETTER SMALL TURNED M
+1D5B;N # MODIFIER LETTER SMALL V
+1D5C;N # MODIFIER LETTER SMALL AIN
+1D5D;N # MODIFIER LETTER SMALL BETA
+1D5E;N # MODIFIER LETTER SMALL GREEK GAMMA
+1D5F;N # MODIFIER LETTER SMALL DELTA
+1D60;N # MODIFIER LETTER SMALL GREEK PHI
+1D61;N # MODIFIER LETTER SMALL CHI
+1D62;N # LATIN SUBSCRIPT SMALL LETTER I
+1D63;N # LATIN SUBSCRIPT SMALL LETTER R
+1D64;N # LATIN SUBSCRIPT SMALL LETTER U
+1D65;N # LATIN SUBSCRIPT SMALL LETTER V
+1D66;N # GREEK SUBSCRIPT SMALL LETTER BETA
+1D67;N # GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68;N # GREEK SUBSCRIPT SMALL LETTER RHO
+1D69;N # GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A;N # GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B;N # LATIN SMALL LETTER UE
1E00;N # LATIN CAPITAL LETTER A WITH RING BELOW
1E01;N # LATIN SMALL LETTER A WITH RING BELOW
1E02;N # LATIN CAPITAL LETTER B WITH DOT ABOVE
@@ -5324,6 +5662,8 @@
2050;N # CLOSE UP
2051;N # TWO ASTERISKS ALIGNED VERTICALLY
2052;N # COMMERCIAL MINUS SIGN
+2053;N # SWUNG DASH
+2054;N # INVERTED UNDERTIE
2057;N # QUADRUPLE PRIME
205F;N # MEDIUM MATHEMATICAL SPACE
2060;N # WORD JOINER
@@ -5469,6 +5809,7 @@
2138;N # DALET SYMBOL
2139;N # INFORMATION SOURCE
213A;N # ROTATED CAPITAL Q
+213B;N # FACSIMILE SIGN
213D;N # DOUBLE-STRUCK SMALL GAMMA
213E;N # DOUBLE-STRUCK CAPITAL GAMMA
213F;N # DOUBLE-STRUCK CAPITAL PI
@@ -6108,6 +6449,8 @@
23CC;N # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
23CD;N # SQUARE FOOT
23CE;N # RETURN SYMBOL
+23CF;N # EJECT SYMBOL
+23D0;N # VERTICAL LINE EXTENSION
2400;N # SYMBOL FOR NULL
2401;N # SYMBOL FOR START OF HEADING
2402;N # SYMBOL FOR START OF TEXT
@@ -6317,6 +6660,7 @@
24FC;A # DOUBLE CIRCLED DIGIT EIGHT
24FD;A # DOUBLE CIRCLED DIGIT NINE
24FE;A # DOUBLE CIRCLED NUMBER TEN
+24FF;A # NEGATIVE CIRCLED DIGIT ZERO
2500;A # BOX DRAWINGS LIGHT HORIZONTAL
2501;A # BOX DRAWINGS HEAVY HORIZONTAL
2502;A # BOX DRAWINGS LIGHT VERTICAL
@@ -6593,6 +6937,8 @@
2611;N # BALLOT BOX WITH CHECK
2612;N # BALLOT BOX WITH X
2613;N # SALTIRE
+2614;A # UMBRELLA WITH RAIN DROPS
+2615;A # HOT BEVERAGE
2616;N # WHITE SHOGI PIECE
2617;N # BLACK SHOGI PIECE
2619;N # REVERSED ROTATED FLORAL HEART BULLET
@@ -6706,6 +7052,16 @@
2687;N # WHITE CIRCLE WITH TWO DOTS
2688;N # BLACK CIRCLE WITH WHITE DOT RIGHT
2689;N # BLACK CIRCLE WITH TWO WHITE DOTS
+268A;N # MONOGRAM FOR YANG
+268B;N # MONOGRAM FOR YIN
+268C;N # DIGRAM FOR GREATER YANG
+268D;N # DIGRAM FOR LESSER YIN
+268E;N # DIGRAM FOR LESSER YANG
+268F;N # DIGRAM FOR GREATER YIN
+2690;N # WHITE FLAG
+2691;N # BLACK FLAG
+26A0;N # WARNING SIGN
+26A1;N # HIGH VOLTAGE SIGN
2701;N # UPPER BLADE SCISSORS
2702;N # BLACK SCISSORS
2703;N # LOWER BLADE SCISSORS
@@ -7692,6 +8048,20 @@
2AFD;N # DOUBLE SOLIDUS OPERATOR
2AFE;N # WHITE VERTICAL BAR
2AFF;N # N-ARY WHITE VERTICAL BAR
+2B00;N # NORTH EAST WHITE ARROW
+2B01;N # NORTH WEST WHITE ARROW
+2B02;N # SOUTH EAST WHITE ARROW
+2B03;N # SOUTH WEST WHITE ARROW
+2B04;N # LEFT RIGHT WHITE ARROW
+2B05;N # LEFTWARDS BLACK ARROW
+2B06;N # UPWARDS BLACK ARROW
+2B07;N # DOWNWARDS BLACK ARROW
+2B08;N # NORTH EAST BLACK ARROW
+2B09;N # NORTH WEST BLACK ARROW
+2B0A;N # SOUTH EAST BLACK ARROW
+2B0B;N # SOUTH WEST BLACK ARROW
+2B0C;N # LEFT RIGHT BLACK ARROW
+2B0D;N # UP DOWN BLACK ARROW
2E80;W # CJK RADICAL REPEAT
2E81;W # CJK RADICAL CLIFF
2E82;W # CJK RADICAL SECOND ONE
@@ -8505,6 +8875,8 @@
321A;W # PARENTHESIZED HANGUL PHIEUPH A
321B;W # PARENTHESIZED HANGUL HIEUH A
321C;W # PARENTHESIZED HANGUL CIEUC U
+321D;W # PARENTHESIZED KOREAN CHARACTER OJEON
+321E;W # PARENTHESIZED KOREAN CHARACTER O HU
3220;W # PARENTHESIZED IDEOGRAPH ONE
3221;W # PARENTHESIZED IDEOGRAPH TWO
3222;W # PARENTHESIZED IDEOGRAPH THREE
@@ -8541,6 +8913,7 @@
3241;W # PARENTHESIZED IDEOGRAPH REST
3242;W # PARENTHESIZED IDEOGRAPH SELF
3243;W # PARENTHESIZED IDEOGRAPH REACH
+3250;W # PARTNERSHIP SIGN
3251;W # CIRCLED NUMBER TWENTY ONE
3252;W # CIRCLED NUMBER TWENTY TWO
3253;W # CIRCLED NUMBER TWENTY THREE
@@ -8584,6 +8957,8 @@
3279;W # CIRCLED HANGUL THIEUTH A
327A;W # CIRCLED HANGUL PHIEUPH A
327B;W # CIRCLED HANGUL HIEUH A
+327C;W # CIRCLED KOREAN CHARACTER CHAMKO
+327D;W # CIRCLED KOREAN CHARACTER JUEUI
327F;W # KOREAN STANDARD SYMBOL
3280;W # CIRCLED IDEOGRAPH ONE
3281;W # CIRCLED IDEOGRAPH TWO
@@ -8661,6 +9036,10 @@
32C9;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
32CA;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
32CB;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC;W # SQUARE HG
+32CD;W # SQUARE ERG
+32CE;W # SQUARE EV
+32CF;W # LIMITED LIABILITY SIGN
32D0;W # CIRCLED KATAKANA A
32D1;W # CIRCLED KATAKANA I
32D2;W # CIRCLED KATAKANA U
@@ -8827,6 +9206,10 @@
3374;W # SQUARE BAR
3375;W # SQUARE OV
3376;W # SQUARE PC
+3377;W # SQUARE DM
+3378;W # SQUARE DM SQUARED
+3379;W # SQUARE DM CUBED
+337A;W # SQUARE IU
337B;W # SQUARE ERA NAME HEISEI
337C;W # SQUARE ERA NAME SYOUWA
337D;W # SQUARE ERA NAME TAISYOU
@@ -8926,6 +9309,8 @@
33DB;W # SQUARE SR
33DC;W # SQUARE SV
33DD;W # SQUARE WB
+33DE;W # SQUARE V OVER M
+33DF;W # SQUARE A OVER M
33E0;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
33E1;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
33E2;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
@@ -8957,7 +9342,72 @@
33FC;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
33FD;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
33FE;W # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF;W # SQUARE GAL
3400..4DB5;W # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last>
+4DC0;N # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1;N # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2;N # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3;N # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4;N # HEXAGRAM FOR WAITING
+4DC5;N # HEXAGRAM FOR CONFLICT
+4DC6;N # HEXAGRAM FOR THE ARMY
+4DC7;N # HEXAGRAM FOR HOLDING TOGETHER
+4DC8;N # HEXAGRAM FOR SMALL TAMING
+4DC9;N # HEXAGRAM FOR TREADING
+4DCA;N # HEXAGRAM FOR PEACE
+4DCB;N # HEXAGRAM FOR STANDSTILL
+4DCC;N # HEXAGRAM FOR FELLOWSHIP
+4DCD;N # HEXAGRAM FOR GREAT POSSESSION
+4DCE;N # HEXAGRAM FOR MODESTY
+4DCF;N # HEXAGRAM FOR ENTHUSIASM
+4DD0;N # HEXAGRAM FOR FOLLOWING
+4DD1;N # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2;N # HEXAGRAM FOR APPROACH
+4DD3;N # HEXAGRAM FOR CONTEMPLATION
+4DD4;N # HEXAGRAM FOR BITING THROUGH
+4DD5;N # HEXAGRAM FOR GRACE
+4DD6;N # HEXAGRAM FOR SPLITTING APART
+4DD7;N # HEXAGRAM FOR RETURN
+4DD8;N # HEXAGRAM FOR INNOCENCE
+4DD9;N # HEXAGRAM FOR GREAT TAMING
+4DDA;N # HEXAGRAM FOR MOUTH CORNERS
+4DDB;N # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC;N # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD;N # HEXAGRAM FOR THE CLINGING FIRE
+4DDE;N # HEXAGRAM FOR INFLUENCE
+4DDF;N # HEXAGRAM FOR DURATION
+4DE0;N # HEXAGRAM FOR RETREAT
+4DE1;N # HEXAGRAM FOR GREAT POWER
+4DE2;N # HEXAGRAM FOR PROGRESS
+4DE3;N # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4;N # HEXAGRAM FOR THE FAMILY
+4DE5;N # HEXAGRAM FOR OPPOSITION
+4DE6;N # HEXAGRAM FOR OBSTRUCTION
+4DE7;N # HEXAGRAM FOR DELIVERANCE
+4DE8;N # HEXAGRAM FOR DECREASE
+4DE9;N # HEXAGRAM FOR INCREASE
+4DEA;N # HEXAGRAM FOR BREAKTHROUGH
+4DEB;N # HEXAGRAM FOR COMING TO MEET
+4DEC;N # HEXAGRAM FOR GATHERING TOGETHER
+4DED;N # HEXAGRAM FOR PUSHING UPWARD
+4DEE;N # HEXAGRAM FOR OPPRESSION
+4DEF;N # HEXAGRAM FOR THE WELL
+4DF0;N # HEXAGRAM FOR REVOLUTION
+4DF1;N # HEXAGRAM FOR THE CAULDRON
+4DF2;N # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3;N # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4;N # HEXAGRAM FOR DEVELOPMENT
+4DF5;N # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6;N # HEXAGRAM FOR ABUNDANCE
+4DF7;N # HEXAGRAM FOR THE WANDERER
+4DF8;N # HEXAGRAM FOR THE GENTLE WIND
+4DF9;N # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA;N # HEXAGRAM FOR DISPERSION
+4DFB;N # HEXAGRAM FOR LIMITATION
+4DFC;N # HEXAGRAM FOR INNER TRUTH
+4DFD;N # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE;N # HEXAGRAM FOR AFTER COMPLETION
+4DFF;N # HEXAGRAM FOR BEFORE COMPLETION
4E00..9FA5;W # <CJK Ideograph, First>..<CJK Ideograph, Last>
A000;W # YI SYLLABLE IT
A001;W # YI SYLLABLE IX
@@ -11197,6 +11647,7 @@ FDF9;N # ARABIC LIGATURE SALLA ISOLATED FORM
FDFA;N # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
FDFB;N # ARABIC LIGATURE JALLAJALALOUHOU
FDFC;N # RIAL SIGN
+FDFD;N # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
FE00;A # VARIATION SELECTOR-1
FE01;A # VARIATION SELECTOR-2
FE02;A # VARIATION SELECTOR-3
@@ -11240,6 +11691,8 @@ FE43;W # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
FE44;W # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
FE45;W # SESAME DOT
FE46;W # WHITE SESAME DOT
+FE47;W # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48;W # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
FE49;W # DASHED OVERLINE
FE4A;W # CENTRELINE OVERLINE
FE4B;W # WAVY OVERLINE
@@ -11644,6 +12097,274 @@ FFFA;N # INTERLINEAR ANNOTATION SEPARATOR
FFFB;N # INTERLINEAR ANNOTATION TERMINATOR
FFFC;N # OBJECT REPLACEMENT CHARACTER
FFFD;A # REPLACEMENT CHARACTER
+10000;N # LINEAR B SYLLABLE B008 A
+10001;N # LINEAR B SYLLABLE B038 E
+10002;N # LINEAR B SYLLABLE B028 I
+10003;N # LINEAR B SYLLABLE B061 O
+10004;N # LINEAR B SYLLABLE B010 U
+10005;N # LINEAR B SYLLABLE B001 DA
+10006;N # LINEAR B SYLLABLE B045 DE
+10007;N # LINEAR B SYLLABLE B007 DI
+10008;N # LINEAR B SYLLABLE B014 DO
+10009;N # LINEAR B SYLLABLE B051 DU
+1000A;N # LINEAR B SYLLABLE B057 JA
+1000B;N # LINEAR B SYLLABLE B046 JE
+1000D;N # LINEAR B SYLLABLE B036 JO
+1000E;N # LINEAR B SYLLABLE B065 JU
+1000F;N # LINEAR B SYLLABLE B077 KA
+10010;N # LINEAR B SYLLABLE B044 KE
+10011;N # LINEAR B SYLLABLE B067 KI
+10012;N # LINEAR B SYLLABLE B070 KO
+10013;N # LINEAR B SYLLABLE B081 KU
+10014;N # LINEAR B SYLLABLE B080 MA
+10015;N # LINEAR B SYLLABLE B013 ME
+10016;N # LINEAR B SYLLABLE B073 MI
+10017;N # LINEAR B SYLLABLE B015 MO
+10018;N # LINEAR B SYLLABLE B023 MU
+10019;N # LINEAR B SYLLABLE B006 NA
+1001A;N # LINEAR B SYLLABLE B024 NE
+1001B;N # LINEAR B SYLLABLE B030 NI
+1001C;N # LINEAR B SYLLABLE B052 NO
+1001D;N # LINEAR B SYLLABLE B055 NU
+1001E;N # LINEAR B SYLLABLE B003 PA
+1001F;N # LINEAR B SYLLABLE B072 PE
+10020;N # LINEAR B SYLLABLE B039 PI
+10021;N # LINEAR B SYLLABLE B011 PO
+10022;N # LINEAR B SYLLABLE B050 PU
+10023;N # LINEAR B SYLLABLE B016 QA
+10024;N # LINEAR B SYLLABLE B078 QE
+10025;N # LINEAR B SYLLABLE B021 QI
+10026;N # LINEAR B SYLLABLE B032 QO
+10028;N # LINEAR B SYLLABLE B060 RA
+10029;N # LINEAR B SYLLABLE B027 RE
+1002A;N # LINEAR B SYLLABLE B053 RI
+1002B;N # LINEAR B SYLLABLE B002 RO
+1002C;N # LINEAR B SYLLABLE B026 RU
+1002D;N # LINEAR B SYLLABLE B031 SA
+1002E;N # LINEAR B SYLLABLE B009 SE
+1002F;N # LINEAR B SYLLABLE B041 SI
+10030;N # LINEAR B SYLLABLE B012 SO
+10031;N # LINEAR B SYLLABLE B058 SU
+10032;N # LINEAR B SYLLABLE B059 TA
+10033;N # LINEAR B SYLLABLE B004 TE
+10034;N # LINEAR B SYLLABLE B037 TI
+10035;N # LINEAR B SYLLABLE B005 TO
+10036;N # LINEAR B SYLLABLE B069 TU
+10037;N # LINEAR B SYLLABLE B054 WA
+10038;N # LINEAR B SYLLABLE B075 WE
+10039;N # LINEAR B SYLLABLE B040 WI
+1003A;N # LINEAR B SYLLABLE B042 WO
+1003C;N # LINEAR B SYLLABLE B017 ZA
+1003D;N # LINEAR B SYLLABLE B074 ZE
+1003F;N # LINEAR B SYLLABLE B020 ZO
+10040;N # LINEAR B SYLLABLE B025 A2
+10041;N # LINEAR B SYLLABLE B043 A3
+10042;N # LINEAR B SYLLABLE B085 AU
+10043;N # LINEAR B SYLLABLE B071 DWE
+10044;N # LINEAR B SYLLABLE B090 DWO
+10045;N # LINEAR B SYLLABLE B048 NWA
+10046;N # LINEAR B SYLLABLE B029 PU2
+10047;N # LINEAR B SYLLABLE B062 PTE
+10048;N # LINEAR B SYLLABLE B076 RA2
+10049;N # LINEAR B SYLLABLE B033 RA3
+1004A;N # LINEAR B SYLLABLE B068 RO2
+1004B;N # LINEAR B SYLLABLE B066 TA2
+1004C;N # LINEAR B SYLLABLE B087 TWE
+1004D;N # LINEAR B SYLLABLE B091 TWO
+10050;N # LINEAR B SYMBOL B018
+10051;N # LINEAR B SYMBOL B019
+10052;N # LINEAR B SYMBOL B022
+10053;N # LINEAR B SYMBOL B034
+10054;N # LINEAR B SYMBOL B047
+10055;N # LINEAR B SYMBOL B049
+10056;N # LINEAR B SYMBOL B056
+10057;N # LINEAR B SYMBOL B063
+10058;N # LINEAR B SYMBOL B064
+10059;N # LINEAR B SYMBOL B079
+1005A;N # LINEAR B SYMBOL B082
+1005B;N # LINEAR B SYMBOL B083
+1005C;N # LINEAR B SYMBOL B086
+1005D;N # LINEAR B SYMBOL B089
+10080;N # LINEAR B IDEOGRAM B100 MAN
+10081;N # LINEAR B IDEOGRAM B102 WOMAN
+10082;N # LINEAR B IDEOGRAM B104 DEER
+10083;N # LINEAR B IDEOGRAM B105 EQUID
+10084;N # LINEAR B IDEOGRAM B105F MARE
+10085;N # LINEAR B IDEOGRAM B105M STALLION
+10086;N # LINEAR B IDEOGRAM B106F EWE
+10087;N # LINEAR B IDEOGRAM B106M RAM
+10088;N # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089;N # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A;N # LINEAR B IDEOGRAM B108F SOW
+1008B;N # LINEAR B IDEOGRAM B108M BOAR
+1008C;N # LINEAR B IDEOGRAM B109F COW
+1008D;N # LINEAR B IDEOGRAM B109M BULL
+1008E;N # LINEAR B IDEOGRAM B120 WHEAT
+1008F;N # LINEAR B IDEOGRAM B121 BARLEY
+10090;N # LINEAR B IDEOGRAM B122 OLIVE
+10091;N # LINEAR B IDEOGRAM B123 SPICE
+10092;N # LINEAR B IDEOGRAM B125 CYPERUS
+10093;N # LINEAR B MONOGRAM B127 KAPO
+10094;N # LINEAR B MONOGRAM B128 KANAKO
+10095;N # LINEAR B IDEOGRAM B130 OIL
+10096;N # LINEAR B IDEOGRAM B131 WINE
+10097;N # LINEAR B IDEOGRAM B132
+10098;N # LINEAR B MONOGRAM B133 AREPA
+10099;N # LINEAR B MONOGRAM B135 MERI
+1009A;N # LINEAR B IDEOGRAM B140 BRONZE
+1009B;N # LINEAR B IDEOGRAM B141 GOLD
+1009C;N # LINEAR B IDEOGRAM B142
+1009D;N # LINEAR B IDEOGRAM B145 WOOL
+1009E;N # LINEAR B IDEOGRAM B146
+1009F;N # LINEAR B IDEOGRAM B150
+100A0;N # LINEAR B IDEOGRAM B151 HORN
+100A1;N # LINEAR B IDEOGRAM B152
+100A2;N # LINEAR B IDEOGRAM B153
+100A3;N # LINEAR B IDEOGRAM B154
+100A4;N # LINEAR B MONOGRAM B156 TURO2
+100A5;N # LINEAR B IDEOGRAM B157
+100A6;N # LINEAR B IDEOGRAM B158
+100A7;N # LINEAR B IDEOGRAM B159 CLOTH
+100A8;N # LINEAR B IDEOGRAM B160
+100A9;N # LINEAR B IDEOGRAM B161
+100AA;N # LINEAR B IDEOGRAM B162 GARMENT
+100AB;N # LINEAR B IDEOGRAM B163 ARMOUR
+100AC;N # LINEAR B IDEOGRAM B164
+100AD;N # LINEAR B IDEOGRAM B165
+100AE;N # LINEAR B IDEOGRAM B166
+100AF;N # LINEAR B IDEOGRAM B167
+100B0;N # LINEAR B IDEOGRAM B168
+100B1;N # LINEAR B IDEOGRAM B169
+100B2;N # LINEAR B IDEOGRAM B170
+100B3;N # LINEAR B IDEOGRAM B171
+100B4;N # LINEAR B IDEOGRAM B172
+100B5;N # LINEAR B IDEOGRAM B173 MONTH
+100B6;N # LINEAR B IDEOGRAM B174
+100B7;N # LINEAR B IDEOGRAM B176 TREE
+100B8;N # LINEAR B IDEOGRAM B177
+100B9;N # LINEAR B IDEOGRAM B178
+100BA;N # LINEAR B IDEOGRAM B179
+100BB;N # LINEAR B IDEOGRAM B180
+100BC;N # LINEAR B IDEOGRAM B181
+100BD;N # LINEAR B IDEOGRAM B182
+100BE;N # LINEAR B IDEOGRAM B183
+100BF;N # LINEAR B IDEOGRAM B184
+100C0;N # LINEAR B IDEOGRAM B185
+100C1;N # LINEAR B IDEOGRAM B189
+100C2;N # LINEAR B IDEOGRAM B190
+100C3;N # LINEAR B IDEOGRAM B191 HELMET
+100C4;N # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5;N # LINEAR B IDEOGRAM B225 BATHTUB
+100C6;N # LINEAR B IDEOGRAM B230 SPEAR
+100C7;N # LINEAR B IDEOGRAM B231 ARROW
+100C8;N # LINEAR B IDEOGRAM B232
+100C9;N # LINEAR B IDEOGRAM B233 SWORD
+100CA;N # LINEAR B IDEOGRAM B234
+100CB;N # LINEAR B IDEOGRAM B236
+100CC;N # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD;N # LINEAR B IDEOGRAM B241 CHARIOT
+100CE;N # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF;N # LINEAR B IDEOGRAM B243 WHEEL
+100D0;N # LINEAR B IDEOGRAM B245
+100D1;N # LINEAR B IDEOGRAM B246
+100D2;N # LINEAR B MONOGRAM B247 DIPTE
+100D3;N # LINEAR B IDEOGRAM B248
+100D4;N # LINEAR B IDEOGRAM B249
+100D5;N # LINEAR B IDEOGRAM B251
+100D6;N # LINEAR B IDEOGRAM B252
+100D7;N # LINEAR B IDEOGRAM B253
+100D8;N # LINEAR B IDEOGRAM B254 DART
+100D9;N # LINEAR B IDEOGRAM B255
+100DA;N # LINEAR B IDEOGRAM B256
+100DB;N # LINEAR B IDEOGRAM B257
+100DC;N # LINEAR B IDEOGRAM B258
+100DD;N # LINEAR B IDEOGRAM B259
+100DE;N # LINEAR B IDEOGRAM VESSEL B155
+100DF;N # LINEAR B IDEOGRAM VESSEL B200
+100E0;N # LINEAR B IDEOGRAM VESSEL B201
+100E1;N # LINEAR B IDEOGRAM VESSEL B202
+100E2;N # LINEAR B IDEOGRAM VESSEL B203
+100E3;N # LINEAR B IDEOGRAM VESSEL B204
+100E4;N # LINEAR B IDEOGRAM VESSEL B205
+100E5;N # LINEAR B IDEOGRAM VESSEL B206
+100E6;N # LINEAR B IDEOGRAM VESSEL B207
+100E7;N # LINEAR B IDEOGRAM VESSEL B208
+100E8;N # LINEAR B IDEOGRAM VESSEL B209
+100E9;N # LINEAR B IDEOGRAM VESSEL B210
+100EA;N # LINEAR B IDEOGRAM VESSEL B211
+100EB;N # LINEAR B IDEOGRAM VESSEL B212
+100EC;N # LINEAR B IDEOGRAM VESSEL B213
+100ED;N # LINEAR B IDEOGRAM VESSEL B214
+100EE;N # LINEAR B IDEOGRAM VESSEL B215
+100EF;N # LINEAR B IDEOGRAM VESSEL B216
+100F0;N # LINEAR B IDEOGRAM VESSEL B217
+100F1;N # LINEAR B IDEOGRAM VESSEL B218
+100F2;N # LINEAR B IDEOGRAM VESSEL B219
+100F3;N # LINEAR B IDEOGRAM VESSEL B221
+100F4;N # LINEAR B IDEOGRAM VESSEL B222
+100F5;N # LINEAR B IDEOGRAM VESSEL B226
+100F6;N # LINEAR B IDEOGRAM VESSEL B227
+100F7;N # LINEAR B IDEOGRAM VESSEL B228
+100F8;N # LINEAR B IDEOGRAM VESSEL B229
+100F9;N # LINEAR B IDEOGRAM VESSEL B250
+100FA;N # LINEAR B IDEOGRAM VESSEL B305
+10100;N # AEGEAN WORD SEPARATOR LINE
+10101;N # AEGEAN WORD SEPARATOR DOT
+10102;N # AEGEAN CHECK MARK
+10107;N # AEGEAN NUMBER ONE
+10108;N # AEGEAN NUMBER TWO
+10109;N # AEGEAN NUMBER THREE
+1010A;N # AEGEAN NUMBER FOUR
+1010B;N # AEGEAN NUMBER FIVE
+1010C;N # AEGEAN NUMBER SIX
+1010D;N # AEGEAN NUMBER SEVEN
+1010E;N # AEGEAN NUMBER EIGHT
+1010F;N # AEGEAN NUMBER NINE
+10110;N # AEGEAN NUMBER TEN
+10111;N # AEGEAN NUMBER TWENTY
+10112;N # AEGEAN NUMBER THIRTY
+10113;N # AEGEAN NUMBER FORTY
+10114;N # AEGEAN NUMBER FIFTY
+10115;N # AEGEAN NUMBER SIXTY
+10116;N # AEGEAN NUMBER SEVENTY
+10117;N # AEGEAN NUMBER EIGHTY
+10118;N # AEGEAN NUMBER NINETY
+10119;N # AEGEAN NUMBER ONE HUNDRED
+1011A;N # AEGEAN NUMBER TWO HUNDRED
+1011B;N # AEGEAN NUMBER THREE HUNDRED
+1011C;N # AEGEAN NUMBER FOUR HUNDRED
+1011D;N # AEGEAN NUMBER FIVE HUNDRED
+1011E;N # AEGEAN NUMBER SIX HUNDRED
+1011F;N # AEGEAN NUMBER SEVEN HUNDRED
+10120;N # AEGEAN NUMBER EIGHT HUNDRED
+10121;N # AEGEAN NUMBER NINE HUNDRED
+10122;N # AEGEAN NUMBER ONE THOUSAND
+10123;N # AEGEAN NUMBER TWO THOUSAND
+10124;N # AEGEAN NUMBER THREE THOUSAND
+10125;N # AEGEAN NUMBER FOUR THOUSAND
+10126;N # AEGEAN NUMBER FIVE THOUSAND
+10127;N # AEGEAN NUMBER SIX THOUSAND
+10128;N # AEGEAN NUMBER SEVEN THOUSAND
+10129;N # AEGEAN NUMBER EIGHT THOUSAND
+1012A;N # AEGEAN NUMBER NINE THOUSAND
+1012B;N # AEGEAN NUMBER TEN THOUSAND
+1012C;N # AEGEAN NUMBER TWENTY THOUSAND
+1012D;N # AEGEAN NUMBER THIRTY THOUSAND
+1012E;N # AEGEAN NUMBER FORTY THOUSAND
+1012F;N # AEGEAN NUMBER FIFTY THOUSAND
+10130;N # AEGEAN NUMBER SIXTY THOUSAND
+10131;N # AEGEAN NUMBER SEVENTY THOUSAND
+10132;N # AEGEAN NUMBER EIGHTY THOUSAND
+10133;N # AEGEAN NUMBER NINETY THOUSAND
+10137;N # AEGEAN WEIGHT BASE UNIT
+10138;N # AEGEAN WEIGHT FIRST SUBUNIT
+10139;N # AEGEAN WEIGHT SECOND SUBUNIT
+1013A;N # AEGEAN WEIGHT THIRD SUBUNIT
+1013B;N # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C;N # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D;N # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E;N # AEGEAN MEASURE SECOND SUBUNIT
+1013F;N # AEGEAN MEASURE THIRD SUBUNIT
10300;N # OLD ITALIC LETTER A
10301;N # OLD ITALIC LETTER BE
10302;N # OLD ITALIC LETTER KE
@@ -11706,6 +12427,37 @@ FFFD;A # REPLACEMENT CHARACTER
10348;N # GOTHIC LETTER HWAIR
10349;N # GOTHIC LETTER OTHAL
1034A;N # GOTHIC LETTER NINE HUNDRED
+10380;N # UGARITIC LETTER ALPA
+10381;N # UGARITIC LETTER BETA
+10382;N # UGARITIC LETTER GAMLA
+10383;N # UGARITIC LETTER KHA
+10384;N # UGARITIC LETTER DELTA
+10385;N # UGARITIC LETTER HO
+10386;N # UGARITIC LETTER WO
+10387;N # UGARITIC LETTER ZETA
+10388;N # UGARITIC LETTER HOTA
+10389;N # UGARITIC LETTER TET
+1038A;N # UGARITIC LETTER YOD
+1038B;N # UGARITIC LETTER KAF
+1038C;N # UGARITIC LETTER SHIN
+1038D;N # UGARITIC LETTER LAMDA
+1038E;N # UGARITIC LETTER MEM
+1038F;N # UGARITIC LETTER DHAL
+10390;N # UGARITIC LETTER NUN
+10391;N # UGARITIC LETTER ZU
+10392;N # UGARITIC LETTER SAMKA
+10393;N # UGARITIC LETTER AIN
+10394;N # UGARITIC LETTER PU
+10395;N # UGARITIC LETTER SADE
+10396;N # UGARITIC LETTER QOPA
+10397;N # UGARITIC LETTER RASHA
+10398;N # UGARITIC LETTER THANNA
+10399;N # UGARITIC LETTER GHAIN
+1039A;N # UGARITIC LETTER TO
+1039B;N # UGARITIC LETTER I
+1039C;N # UGARITIC LETTER U
+1039D;N # UGARITIC LETTER SSU
+1039F;N # UGARITIC WORD DIVIDER
10400;N # DESERET CAPITAL LETTER LONG I
10401;N # DESERET CAPITAL LETTER LONG E
10402;N # DESERET CAPITAL LETTER LONG A
@@ -11744,6 +12496,8 @@ FFFD;A # REPLACEMENT CHARACTER
10423;N # DESERET CAPITAL LETTER EM
10424;N # DESERET CAPITAL LETTER EN
10425;N # DESERET CAPITAL LETTER ENG
+10426;N # DESERET CAPITAL LETTER OI
+10427;N # DESERET CAPITAL LETTER EW
10428;N # DESERET SMALL LETTER LONG I
10429;N # DESERET SMALL LETTER LONG E
1042A;N # DESERET SMALL LETTER LONG A
@@ -11782,6 +12536,151 @@ FFFD;A # REPLACEMENT CHARACTER
1044B;N # DESERET SMALL LETTER EM
1044C;N # DESERET SMALL LETTER EN
1044D;N # DESERET SMALL LETTER ENG
+1044E;N # DESERET SMALL LETTER OI
+1044F;N # DESERET SMALL LETTER EW
+10450;N # SHAVIAN LETTER PEEP
+10451;N # SHAVIAN LETTER TOT
+10452;N # SHAVIAN LETTER KICK
+10453;N # SHAVIAN LETTER FEE
+10454;N # SHAVIAN LETTER THIGH
+10455;N # SHAVIAN LETTER SO
+10456;N # SHAVIAN LETTER SURE
+10457;N # SHAVIAN LETTER CHURCH
+10458;N # SHAVIAN LETTER YEA
+10459;N # SHAVIAN LETTER HUNG
+1045A;N # SHAVIAN LETTER BIB
+1045B;N # SHAVIAN LETTER DEAD
+1045C;N # SHAVIAN LETTER GAG
+1045D;N # SHAVIAN LETTER VOW
+1045E;N # SHAVIAN LETTER THEY
+1045F;N # SHAVIAN LETTER ZOO
+10460;N # SHAVIAN LETTER MEASURE
+10461;N # SHAVIAN LETTER JUDGE
+10462;N # SHAVIAN LETTER WOE
+10463;N # SHAVIAN LETTER HA-HA
+10464;N # SHAVIAN LETTER LOLL
+10465;N # SHAVIAN LETTER MIME
+10466;N # SHAVIAN LETTER IF
+10467;N # SHAVIAN LETTER EGG
+10468;N # SHAVIAN LETTER ASH
+10469;N # SHAVIAN LETTER ADO
+1046A;N # SHAVIAN LETTER ON
+1046B;N # SHAVIAN LETTER WOOL
+1046C;N # SHAVIAN LETTER OUT
+1046D;N # SHAVIAN LETTER AH
+1046E;N # SHAVIAN LETTER ROAR
+1046F;N # SHAVIAN LETTER NUN
+10470;N # SHAVIAN LETTER EAT
+10471;N # SHAVIAN LETTER AGE
+10472;N # SHAVIAN LETTER ICE
+10473;N # SHAVIAN LETTER UP
+10474;N # SHAVIAN LETTER OAK
+10475;N # SHAVIAN LETTER OOZE
+10476;N # SHAVIAN LETTER OIL
+10477;N # SHAVIAN LETTER AWE
+10478;N # SHAVIAN LETTER ARE
+10479;N # SHAVIAN LETTER OR
+1047A;N # SHAVIAN LETTER AIR
+1047B;N # SHAVIAN LETTER ERR
+1047C;N # SHAVIAN LETTER ARRAY
+1047D;N # SHAVIAN LETTER EAR
+1047E;N # SHAVIAN LETTER IAN
+1047F;N # SHAVIAN LETTER YEW
+10480;N # OSMANYA LETTER ALEF
+10481;N # OSMANYA LETTER BA
+10482;N # OSMANYA LETTER TA
+10483;N # OSMANYA LETTER JA
+10484;N # OSMANYA LETTER XA
+10485;N # OSMANYA LETTER KHA
+10486;N # OSMANYA LETTER DEEL
+10487;N # OSMANYA LETTER RA
+10488;N # OSMANYA LETTER SA
+10489;N # OSMANYA LETTER SHIIN
+1048A;N # OSMANYA LETTER DHA
+1048B;N # OSMANYA LETTER CAYN
+1048C;N # OSMANYA LETTER GA
+1048D;N # OSMANYA LETTER FA
+1048E;N # OSMANYA LETTER QAAF
+1048F;N # OSMANYA LETTER KAAF
+10490;N # OSMANYA LETTER LAAN
+10491;N # OSMANYA LETTER MIIN
+10492;N # OSMANYA LETTER NUUN
+10493;N # OSMANYA LETTER WAW
+10494;N # OSMANYA LETTER HA
+10495;N # OSMANYA LETTER YA
+10496;N # OSMANYA LETTER A
+10497;N # OSMANYA LETTER E
+10498;N # OSMANYA LETTER I
+10499;N # OSMANYA LETTER O
+1049A;N # OSMANYA LETTER U
+1049B;N # OSMANYA LETTER AA
+1049C;N # OSMANYA LETTER EE
+1049D;N # OSMANYA LETTER OO
+104A0;N # OSMANYA DIGIT ZERO
+104A1;N # OSMANYA DIGIT ONE
+104A2;N # OSMANYA DIGIT TWO
+104A3;N # OSMANYA DIGIT THREE
+104A4;N # OSMANYA DIGIT FOUR
+104A5;N # OSMANYA DIGIT FIVE
+104A6;N # OSMANYA DIGIT SIX
+104A7;N # OSMANYA DIGIT SEVEN
+104A8;N # OSMANYA DIGIT EIGHT
+104A9;N # OSMANYA DIGIT NINE
+10800;N # CYPRIOT SYLLABLE A
+10801;N # CYPRIOT SYLLABLE E
+10802;N # CYPRIOT SYLLABLE I
+10803;N # CYPRIOT SYLLABLE O
+10804;N # CYPRIOT SYLLABLE U
+10805;N # CYPRIOT SYLLABLE JA
+10808;N # CYPRIOT SYLLABLE JO
+1080A;N # CYPRIOT SYLLABLE KA
+1080B;N # CYPRIOT SYLLABLE KE
+1080C;N # CYPRIOT SYLLABLE KI
+1080D;N # CYPRIOT SYLLABLE KO
+1080E;N # CYPRIOT SYLLABLE KU
+1080F;N # CYPRIOT SYLLABLE LA
+10810;N # CYPRIOT SYLLABLE LE
+10811;N # CYPRIOT SYLLABLE LI
+10812;N # CYPRIOT SYLLABLE LO
+10813;N # CYPRIOT SYLLABLE LU
+10814;N # CYPRIOT SYLLABLE MA
+10815;N # CYPRIOT SYLLABLE ME
+10816;N # CYPRIOT SYLLABLE MI
+10817;N # CYPRIOT SYLLABLE MO
+10818;N # CYPRIOT SYLLABLE MU
+10819;N # CYPRIOT SYLLABLE NA
+1081A;N # CYPRIOT SYLLABLE NE
+1081B;N # CYPRIOT SYLLABLE NI
+1081C;N # CYPRIOT SYLLABLE NO
+1081D;N # CYPRIOT SYLLABLE NU
+1081E;N # CYPRIOT SYLLABLE PA
+1081F;N # CYPRIOT SYLLABLE PE
+10820;N # CYPRIOT SYLLABLE PI
+10821;N # CYPRIOT SYLLABLE PO
+10822;N # CYPRIOT SYLLABLE PU
+10823;N # CYPRIOT SYLLABLE RA
+10824;N # CYPRIOT SYLLABLE RE
+10825;N # CYPRIOT SYLLABLE RI
+10826;N # CYPRIOT SYLLABLE RO
+10827;N # CYPRIOT SYLLABLE RU
+10828;N # CYPRIOT SYLLABLE SA
+10829;N # CYPRIOT SYLLABLE SE
+1082A;N # CYPRIOT SYLLABLE SI
+1082B;N # CYPRIOT SYLLABLE SO
+1082C;N # CYPRIOT SYLLABLE SU
+1082D;N # CYPRIOT SYLLABLE TA
+1082E;N # CYPRIOT SYLLABLE TE
+1082F;N # CYPRIOT SYLLABLE TI
+10830;N # CYPRIOT SYLLABLE TO
+10831;N # CYPRIOT SYLLABLE TU
+10832;N # CYPRIOT SYLLABLE WA
+10833;N # CYPRIOT SYLLABLE WE
+10834;N # CYPRIOT SYLLABLE WI
+10835;N # CYPRIOT SYLLABLE WO
+10837;N # CYPRIOT SYLLABLE XA
+10838;N # CYPRIOT SYLLABLE XE
+1083C;N # CYPRIOT SYLLABLE ZA
+1083F;N # CYPRIOT SYLLABLE ZO
1D000;N # BYZANTINE MUSICAL SYMBOL PSILI
1D001;N # BYZANTINE MUSICAL SYMBOL DASEIA
1D002;N # BYZANTINE MUSICAL SYMBOL PERISPOMENI
@@ -12247,6 +13146,93 @@ FFFD;A # REPLACEMENT CHARACTER
1D1DB;N # MUSICAL SYMBOL SCANDICUS FLEXUS
1D1DC;N # MUSICAL SYMBOL TORCULUS RESUPINUS
1D1DD;N # MUSICAL SYMBOL PES SUBPUNCTIS
+1D300;N # MONOGRAM FOR EARTH
+1D301;N # DIGRAM FOR HEAVENLY EARTH
+1D302;N # DIGRAM FOR HUMAN EARTH
+1D303;N # DIGRAM FOR EARTHLY HEAVEN
+1D304;N # DIGRAM FOR EARTHLY HUMAN
+1D305;N # DIGRAM FOR EARTH
+1D306;N # TETRAGRAM FOR CENTRE
+1D307;N # TETRAGRAM FOR FULL CIRCLE
+1D308;N # TETRAGRAM FOR MIRED
+1D309;N # TETRAGRAM FOR BARRIER
+1D30A;N # TETRAGRAM FOR KEEPING SMALL
+1D30B;N # TETRAGRAM FOR CONTRARIETY
+1D30C;N # TETRAGRAM FOR ASCENT
+1D30D;N # TETRAGRAM FOR OPPOSITION
+1D30E;N # TETRAGRAM FOR BRANCHING OUT
+1D30F;N # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310;N # TETRAGRAM FOR DIVERGENCE
+1D311;N # TETRAGRAM FOR YOUTHFULNESS
+1D312;N # TETRAGRAM FOR INCREASE
+1D313;N # TETRAGRAM FOR PENETRATION
+1D314;N # TETRAGRAM FOR REACH
+1D315;N # TETRAGRAM FOR CONTACT
+1D316;N # TETRAGRAM FOR HOLDING BACK
+1D317;N # TETRAGRAM FOR WAITING
+1D318;N # TETRAGRAM FOR FOLLOWING
+1D319;N # TETRAGRAM FOR ADVANCE
+1D31A;N # TETRAGRAM FOR RELEASE
+1D31B;N # TETRAGRAM FOR RESISTANCE
+1D31C;N # TETRAGRAM FOR EASE
+1D31D;N # TETRAGRAM FOR JOY
+1D31E;N # TETRAGRAM FOR CONTENTION
+1D31F;N # TETRAGRAM FOR ENDEAVOUR
+1D320;N # TETRAGRAM FOR DUTIES
+1D321;N # TETRAGRAM FOR CHANGE
+1D322;N # TETRAGRAM FOR DECISIVENESS
+1D323;N # TETRAGRAM FOR BOLD RESOLUTION
+1D324;N # TETRAGRAM FOR PACKING
+1D325;N # TETRAGRAM FOR LEGION
+1D326;N # TETRAGRAM FOR CLOSENESS
+1D327;N # TETRAGRAM FOR KINSHIP
+1D328;N # TETRAGRAM FOR GATHERING
+1D329;N # TETRAGRAM FOR STRENGTH
+1D32A;N # TETRAGRAM FOR PURITY
+1D32B;N # TETRAGRAM FOR FULLNESS
+1D32C;N # TETRAGRAM FOR RESIDENCE
+1D32D;N # TETRAGRAM FOR LAW OR MODEL
+1D32E;N # TETRAGRAM FOR RESPONSE
+1D32F;N # TETRAGRAM FOR GOING TO MEET
+1D330;N # TETRAGRAM FOR ENCOUNTERS
+1D331;N # TETRAGRAM FOR STOVE
+1D332;N # TETRAGRAM FOR GREATNESS
+1D333;N # TETRAGRAM FOR ENLARGEMENT
+1D334;N # TETRAGRAM FOR PATTERN
+1D335;N # TETRAGRAM FOR RITUAL
+1D336;N # TETRAGRAM FOR FLIGHT
+1D337;N # TETRAGRAM FOR VASTNESS OR WASTING
+1D338;N # TETRAGRAM FOR CONSTANCY
+1D339;N # TETRAGRAM FOR MEASURE
+1D33A;N # TETRAGRAM FOR ETERNITY
+1D33B;N # TETRAGRAM FOR UNITY
+1D33C;N # TETRAGRAM FOR DIMINISHMENT
+1D33D;N # TETRAGRAM FOR CLOSED MOUTH
+1D33E;N # TETRAGRAM FOR GUARDEDNESS
+1D33F;N # TETRAGRAM FOR GATHERING IN
+1D340;N # TETRAGRAM FOR MASSING
+1D341;N # TETRAGRAM FOR ACCUMULATION
+1D342;N # TETRAGRAM FOR EMBELLISHMENT
+1D343;N # TETRAGRAM FOR DOUBT
+1D344;N # TETRAGRAM FOR WATCH
+1D345;N # TETRAGRAM FOR SINKING
+1D346;N # TETRAGRAM FOR INNER
+1D347;N # TETRAGRAM FOR DEPARTURE
+1D348;N # TETRAGRAM FOR DARKENING
+1D349;N # TETRAGRAM FOR DIMMING
+1D34A;N # TETRAGRAM FOR EXHAUSTION
+1D34B;N # TETRAGRAM FOR SEVERANCE
+1D34C;N # TETRAGRAM FOR STOPPAGE
+1D34D;N # TETRAGRAM FOR HARDNESS
+1D34E;N # TETRAGRAM FOR COMPLETION
+1D34F;N # TETRAGRAM FOR CLOSURE
+1D350;N # TETRAGRAM FOR FAILURE
+1D351;N # TETRAGRAM FOR AGGRAVATION
+1D352;N # TETRAGRAM FOR COMPLIANCE
+1D353;N # TETRAGRAM FOR ON THE VERGE
+1D354;N # TETRAGRAM FOR DIFFICULTIES
+1D355;N # TETRAGRAM FOR LABOURING
+1D356;N # TETRAGRAM FOR FOSTERING
1D400;N # MATHEMATICAL BOLD CAPITAL A
1D401;N # MATHEMATICAL BOLD CAPITAL B
1D402;N # MATHEMATICAL BOLD CAPITAL C
@@ -12429,6 +13415,7 @@ FFFD;A # REPLACEMENT CHARACTER
1D4BE;N # MATHEMATICAL SCRIPT SMALL I
1D4BF;N # MATHEMATICAL SCRIPT SMALL J
1D4C0;N # MATHEMATICAL SCRIPT SMALL K
+1D4C1;N # MATHEMATICAL SCRIPT SMALL L
1D4C2;N # MATHEMATICAL SCRIPT SMALL M
1D4C3;N # MATHEMATICAL SCRIPT SMALL N
1D4C5;N # MATHEMATICAL SCRIPT SMALL P
@@ -13239,6 +14226,7 @@ FFFD;A # REPLACEMENT CHARACTER
1D7FE;N # MATHEMATICAL MONOSPACE DIGIT EIGHT
1D7FF;N # MATHEMATICAL MONOSPACE DIGIT NINE
20000..2A6D6;W # <CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
+2A6D7..2F7FF;W # <reserved>
2F800;W # CJK COMPATIBILITY IDEOGRAPH-2F800
2F801;W # CJK COMPATIBILITY IDEOGRAPH-2F801
2F802;W # CJK COMPATIBILITY IDEOGRAPH-2F802
@@ -13781,6 +14769,8 @@ FFFD;A # REPLACEMENT CHARACTER
2FA1B;W # CJK COMPATIBILITY IDEOGRAPH-2FA1B
2FA1C;W # CJK COMPATIBILITY IDEOGRAPH-2FA1C
2FA1D;W # CJK COMPATIBILITY IDEOGRAPH-2FA1D
+2FA1E..2FFFD;W # <reserved>
+30000..3FFFD;W # <reserved>
E0001;N # LANGUAGE TAG
E0020;N # TAG SPACE
E0021;N # TAG EXCLAMATION MARK
@@ -13878,5 +14868,245 @@ E007C;N # TAG VERTICAL LINE
E007D;N # TAG RIGHT CURLY BRACKET
E007E;N # TAG TILDE
E007F;N # CANCEL TAG
+E0100;A # VARIATION SELECTOR-17
+E0101;A # VARIATION SELECTOR-18
+E0102;A # VARIATION SELECTOR-19
+E0103;A # VARIATION SELECTOR-20
+E0104;A # VARIATION SELECTOR-21
+E0105;A # VARIATION SELECTOR-22
+E0106;A # VARIATION SELECTOR-23
+E0107;A # VARIATION SELECTOR-24
+E0108;A # VARIATION SELECTOR-25
+E0109;A # VARIATION SELECTOR-26
+E010A;A # VARIATION SELECTOR-27
+E010B;A # VARIATION SELECTOR-28
+E010C;A # VARIATION SELECTOR-29
+E010D;A # VARIATION SELECTOR-30
+E010E;A # VARIATION SELECTOR-31
+E010F;A # VARIATION SELECTOR-32
+E0110;A # VARIATION SELECTOR-33
+E0111;A # VARIATION SELECTOR-34
+E0112;A # VARIATION SELECTOR-35
+E0113;A # VARIATION SELECTOR-36
+E0114;A # VARIATION SELECTOR-37
+E0115;A # VARIATION SELECTOR-38
+E0116;A # VARIATION SELECTOR-39
+E0117;A # VARIATION SELECTOR-40
+E0118;A # VARIATION SELECTOR-41
+E0119;A # VARIATION SELECTOR-42
+E011A;A # VARIATION SELECTOR-43
+E011B;A # VARIATION SELECTOR-44
+E011C;A # VARIATION SELECTOR-45
+E011D;A # VARIATION SELECTOR-46
+E011E;A # VARIATION SELECTOR-47
+E011F;A # VARIATION SELECTOR-48
+E0120;A # VARIATION SELECTOR-49
+E0121;A # VARIATION SELECTOR-50
+E0122;A # VARIATION SELECTOR-51
+E0123;A # VARIATION SELECTOR-52
+E0124;A # VARIATION SELECTOR-53
+E0125;A # VARIATION SELECTOR-54
+E0126;A # VARIATION SELECTOR-55
+E0127;A # VARIATION SELECTOR-56
+E0128;A # VARIATION SELECTOR-57
+E0129;A # VARIATION SELECTOR-58
+E012A;A # VARIATION SELECTOR-59
+E012B;A # VARIATION SELECTOR-60
+E012C;A # VARIATION SELECTOR-61
+E012D;A # VARIATION SELECTOR-62
+E012E;A # VARIATION SELECTOR-63
+E012F;A # VARIATION SELECTOR-64
+E0130;A # VARIATION SELECTOR-65
+E0131;A # VARIATION SELECTOR-66
+E0132;A # VARIATION SELECTOR-67
+E0133;A # VARIATION SELECTOR-68
+E0134;A # VARIATION SELECTOR-69
+E0135;A # VARIATION SELECTOR-70
+E0136;A # VARIATION SELECTOR-71
+E0137;A # VARIATION SELECTOR-72
+E0138;A # VARIATION SELECTOR-73
+E0139;A # VARIATION SELECTOR-74
+E013A;A # VARIATION SELECTOR-75
+E013B;A # VARIATION SELECTOR-76
+E013C;A # VARIATION SELECTOR-77
+E013D;A # VARIATION SELECTOR-78
+E013E;A # VARIATION SELECTOR-79
+E013F;A # VARIATION SELECTOR-80
+E0140;A # VARIATION SELECTOR-81
+E0141;A # VARIATION SELECTOR-82
+E0142;A # VARIATION SELECTOR-83
+E0143;A # VARIATION SELECTOR-84
+E0144;A # VARIATION SELECTOR-85
+E0145;A # VARIATION SELECTOR-86
+E0146;A # VARIATION SELECTOR-87
+E0147;A # VARIATION SELECTOR-88
+E0148;A # VARIATION SELECTOR-89
+E0149;A # VARIATION SELECTOR-90
+E014A;A # VARIATION SELECTOR-91
+E014B;A # VARIATION SELECTOR-92
+E014C;A # VARIATION SELECTOR-93
+E014D;A # VARIATION SELECTOR-94
+E014E;A # VARIATION SELECTOR-95
+E014F;A # VARIATION SELECTOR-96
+E0150;A # VARIATION SELECTOR-97
+E0151;A # VARIATION SELECTOR-98
+E0152;A # VARIATION SELECTOR-99
+E0153;A # VARIATION SELECTOR-100
+E0154;A # VARIATION SELECTOR-101
+E0155;A # VARIATION SELECTOR-102
+E0156;A # VARIATION SELECTOR-103
+E0157;A # VARIATION SELECTOR-104
+E0158;A # VARIATION SELECTOR-105
+E0159;A # VARIATION SELECTOR-106
+E015A;A # VARIATION SELECTOR-107
+E015B;A # VARIATION SELECTOR-108
+E015C;A # VARIATION SELECTOR-109
+E015D;A # VARIATION SELECTOR-110
+E015E;A # VARIATION SELECTOR-111
+E015F;A # VARIATION SELECTOR-112
+E0160;A # VARIATION SELECTOR-113
+E0161;A # VARIATION SELECTOR-114
+E0162;A # VARIATION SELECTOR-115
+E0163;A # VARIATION SELECTOR-116
+E0164;A # VARIATION SELECTOR-117
+E0165;A # VARIATION SELECTOR-118
+E0166;A # VARIATION SELECTOR-119
+E0167;A # VARIATION SELECTOR-120
+E0168;A # VARIATION SELECTOR-121
+E0169;A # VARIATION SELECTOR-122
+E016A;A # VARIATION SELECTOR-123
+E016B;A # VARIATION SELECTOR-124
+E016C;A # VARIATION SELECTOR-125
+E016D;A # VARIATION SELECTOR-126
+E016E;A # VARIATION SELECTOR-127
+E016F;A # VARIATION SELECTOR-128
+E0170;A # VARIATION SELECTOR-129
+E0171;A # VARIATION SELECTOR-130
+E0172;A # VARIATION SELECTOR-131
+E0173;A # VARIATION SELECTOR-132
+E0174;A # VARIATION SELECTOR-133
+E0175;A # VARIATION SELECTOR-134
+E0176;A # VARIATION SELECTOR-135
+E0177;A # VARIATION SELECTOR-136
+E0178;A # VARIATION SELECTOR-137
+E0179;A # VARIATION SELECTOR-138
+E017A;A # VARIATION SELECTOR-139
+E017B;A # VARIATION SELECTOR-140
+E017C;A # VARIATION SELECTOR-141
+E017D;A # VARIATION SELECTOR-142
+E017E;A # VARIATION SELECTOR-143
+E017F;A # VARIATION SELECTOR-144
+E0180;A # VARIATION SELECTOR-145
+E0181;A # VARIATION SELECTOR-146
+E0182;A # VARIATION SELECTOR-147
+E0183;A # VARIATION SELECTOR-148
+E0184;A # VARIATION SELECTOR-149
+E0185;A # VARIATION SELECTOR-150
+E0186;A # VARIATION SELECTOR-151
+E0187;A # VARIATION SELECTOR-152
+E0188;A # VARIATION SELECTOR-153
+E0189;A # VARIATION SELECTOR-154
+E018A;A # VARIATION SELECTOR-155
+E018B;A # VARIATION SELECTOR-156
+E018C;A # VARIATION SELECTOR-157
+E018D;A # VARIATION SELECTOR-158
+E018E;A # VARIATION SELECTOR-159
+E018F;A # VARIATION SELECTOR-160
+E0190;A # VARIATION SELECTOR-161
+E0191;A # VARIATION SELECTOR-162
+E0192;A # VARIATION SELECTOR-163
+E0193;A # VARIATION SELECTOR-164
+E0194;A # VARIATION SELECTOR-165
+E0195;A # VARIATION SELECTOR-166
+E0196;A # VARIATION SELECTOR-167
+E0197;A # VARIATION SELECTOR-168
+E0198;A # VARIATION SELECTOR-169
+E0199;A # VARIATION SELECTOR-170
+E019A;A # VARIATION SELECTOR-171
+E019B;A # VARIATION SELECTOR-172
+E019C;A # VARIATION SELECTOR-173
+E019D;A # VARIATION SELECTOR-174
+E019E;A # VARIATION SELECTOR-175
+E019F;A # VARIATION SELECTOR-176
+E01A0;A # VARIATION SELECTOR-177
+E01A1;A # VARIATION SELECTOR-178
+E01A2;A # VARIATION SELECTOR-179
+E01A3;A # VARIATION SELECTOR-180
+E01A4;A # VARIATION SELECTOR-181
+E01A5;A # VARIATION SELECTOR-182
+E01A6;A # VARIATION SELECTOR-183
+E01A7;A # VARIATION SELECTOR-184
+E01A8;A # VARIATION SELECTOR-185
+E01A9;A # VARIATION SELECTOR-186
+E01AA;A # VARIATION SELECTOR-187
+E01AB;A # VARIATION SELECTOR-188
+E01AC;A # VARIATION SELECTOR-189
+E01AD;A # VARIATION SELECTOR-190
+E01AE;A # VARIATION SELECTOR-191
+E01AF;A # VARIATION SELECTOR-192
+E01B0;A # VARIATION SELECTOR-193
+E01B1;A # VARIATION SELECTOR-194
+E01B2;A # VARIATION SELECTOR-195
+E01B3;A # VARIATION SELECTOR-196
+E01B4;A # VARIATION SELECTOR-197
+E01B5;A # VARIATION SELECTOR-198
+E01B6;A # VARIATION SELECTOR-199
+E01B7;A # VARIATION SELECTOR-200
+E01B8;A # VARIATION SELECTOR-201
+E01B9;A # VARIATION SELECTOR-202
+E01BA;A # VARIATION SELECTOR-203
+E01BB;A # VARIATION SELECTOR-204
+E01BC;A # VARIATION SELECTOR-205
+E01BD;A # VARIATION SELECTOR-206
+E01BE;A # VARIATION SELECTOR-207
+E01BF;A # VARIATION SELECTOR-208
+E01C0;A # VARIATION SELECTOR-209
+E01C1;A # VARIATION SELECTOR-210
+E01C2;A # VARIATION SELECTOR-211
+E01C3;A # VARIATION SELECTOR-212
+E01C4;A # VARIATION SELECTOR-213
+E01C5;A # VARIATION SELECTOR-214
+E01C6;A # VARIATION SELECTOR-215
+E01C7;A # VARIATION SELECTOR-216
+E01C8;A # VARIATION SELECTOR-217
+E01C9;A # VARIATION SELECTOR-218
+E01CA;A # VARIATION SELECTOR-219
+E01CB;A # VARIATION SELECTOR-220
+E01CC;A # VARIATION SELECTOR-221
+E01CD;A # VARIATION SELECTOR-222
+E01CE;A # VARIATION SELECTOR-223
+E01CF;A # VARIATION SELECTOR-224
+E01D0;A # VARIATION SELECTOR-225
+E01D1;A # VARIATION SELECTOR-226
+E01D2;A # VARIATION SELECTOR-227
+E01D3;A # VARIATION SELECTOR-228
+E01D4;A # VARIATION SELECTOR-229
+E01D5;A # VARIATION SELECTOR-230
+E01D6;A # VARIATION SELECTOR-231
+E01D7;A # VARIATION SELECTOR-232
+E01D8;A # VARIATION SELECTOR-233
+E01D9;A # VARIATION SELECTOR-234
+E01DA;A # VARIATION SELECTOR-235
+E01DB;A # VARIATION SELECTOR-236
+E01DC;A # VARIATION SELECTOR-237
+E01DD;A # VARIATION SELECTOR-238
+E01DE;A # VARIATION SELECTOR-239
+E01DF;A # VARIATION SELECTOR-240
+E01E0;A # VARIATION SELECTOR-241
+E01E1;A # VARIATION SELECTOR-242
+E01E2;A # VARIATION SELECTOR-243
+E01E3;A # VARIATION SELECTOR-244
+E01E4;A # VARIATION SELECTOR-245
+E01E5;A # VARIATION SELECTOR-246
+E01E6;A # VARIATION SELECTOR-247
+E01E7;A # VARIATION SELECTOR-248
+E01E8;A # VARIATION SELECTOR-249
+E01E9;A # VARIATION SELECTOR-250
+E01EA;A # VARIATION SELECTOR-251
+E01EB;A # VARIATION SELECTOR-252
+E01EC;A # VARIATION SELECTOR-253
+E01ED;A # VARIATION SELECTOR-254
+E01EE;A # VARIATION SELECTOR-255
+E01EF;A # VARIATION SELECTOR-256
F0000..FFFFD;A # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
100000..10FFFD;A # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
diff --git a/gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt b/gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt
new file mode 100644
index 00000000000..dfbf78767a2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt
@@ -0,0 +1,841 @@
+# HangulSyllableType-4.0.0.txt
+# Date: 2003-03-20, 20:08:09 GMT [MD]
+#
+# Unicode Character Database: Extended Properties
+# For documentation, see UCD.html
+# Note: Unassigned and Noncharacter codepoints may be omitted
+# if they have default property values.
+# ================================================
+
+
+# ================================================
+# Hangul Syllable Type
+# All code points not explicitly listed in this file have the property
+# value: NA.
+# ================================================
+
+1100..1159 ; L # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F ; L # Lo HANGUL CHOSEONG FILLER
+
+# Total code points: 91
+
+# ================================================
+
+1160..11A2 ; V # Lo [67] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+
+# Total code points: 67
+
+# ================================================
+
+11A8..11F9 ; T # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+
+# Total code points: 82
+
+# ================================================
+
+AC00 ; LV # Lo HANGUL SYLLABLE GA
+AC1C ; LV # Lo HANGUL SYLLABLE GAE
+AC38 ; LV # Lo HANGUL SYLLABLE GYA
+AC54 ; LV # Lo HANGUL SYLLABLE GYAE
+AC70 ; LV # Lo HANGUL SYLLABLE GEO
+AC8C ; LV # Lo HANGUL SYLLABLE GE
+ACA8 ; LV # Lo HANGUL SYLLABLE GYEO
+ACC4 ; LV # Lo HANGUL SYLLABLE GYE
+ACE0 ; LV # Lo HANGUL SYLLABLE GO
+ACFC ; LV # Lo HANGUL SYLLABLE GWA
+AD18 ; LV # Lo HANGUL SYLLABLE GWAE
+AD34 ; LV # Lo HANGUL SYLLABLE GOE
+AD50 ; LV # Lo HANGUL SYLLABLE GYO
+AD6C ; LV # Lo HANGUL SYLLABLE GU
+AD88 ; LV # Lo HANGUL SYLLABLE GWEO
+ADA4 ; LV # Lo HANGUL SYLLABLE GWE
+ADC0 ; LV # Lo HANGUL SYLLABLE GWI
+ADDC ; LV # Lo HANGUL SYLLABLE GYU
+ADF8 ; LV # Lo HANGUL SYLLABLE GEU
+AE14 ; LV # Lo HANGUL SYLLABLE GYI
+AE30 ; LV # Lo HANGUL SYLLABLE GI
+AE4C ; LV # Lo HANGUL SYLLABLE GGA
+AE68 ; LV # Lo HANGUL SYLLABLE GGAE
+AE84 ; LV # Lo HANGUL SYLLABLE GGYA
+AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE
+AEBC ; LV # Lo HANGUL SYLLABLE GGEO
+AED8 ; LV # Lo HANGUL SYLLABLE GGE
+AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO
+AF10 ; LV # Lo HANGUL SYLLABLE GGYE
+AF2C ; LV # Lo HANGUL SYLLABLE GGO
+AF48 ; LV # Lo HANGUL SYLLABLE GGWA
+AF64 ; LV # Lo HANGUL SYLLABLE GGWAE
+AF80 ; LV # Lo HANGUL SYLLABLE GGOE
+AF9C ; LV # Lo HANGUL SYLLABLE GGYO
+AFB8 ; LV # Lo HANGUL SYLLABLE GGU
+AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO
+AFF0 ; LV # Lo HANGUL SYLLABLE GGWE
+B00C ; LV # Lo HANGUL SYLLABLE GGWI
+B028 ; LV # Lo HANGUL SYLLABLE GGYU
+B044 ; LV # Lo HANGUL SYLLABLE GGEU
+B060 ; LV # Lo HANGUL SYLLABLE GGYI
+B07C ; LV # Lo HANGUL SYLLABLE GGI
+B098 ; LV # Lo HANGUL SYLLABLE NA
+B0B4 ; LV # Lo HANGUL SYLLABLE NAE
+B0D0 ; LV # Lo HANGUL SYLLABLE NYA
+B0EC ; LV # Lo HANGUL SYLLABLE NYAE
+B108 ; LV # Lo HANGUL SYLLABLE NEO
+B124 ; LV # Lo HANGUL SYLLABLE NE
+B140 ; LV # Lo HANGUL SYLLABLE NYEO
+B15C ; LV # Lo HANGUL SYLLABLE NYE
+B178 ; LV # Lo HANGUL SYLLABLE NO
+B194 ; LV # Lo HANGUL SYLLABLE NWA
+B1B0 ; LV # Lo HANGUL SYLLABLE NWAE
+B1CC ; LV # Lo HANGUL SYLLABLE NOE
+B1E8 ; LV # Lo HANGUL SYLLABLE NYO
+B204 ; LV # Lo HANGUL SYLLABLE NU
+B220 ; LV # Lo HANGUL SYLLABLE NWEO
+B23C ; LV # Lo HANGUL SYLLABLE NWE
+B258 ; LV # Lo HANGUL SYLLABLE NWI
+B274 ; LV # Lo HANGUL SYLLABLE NYU
+B290 ; LV # Lo HANGUL SYLLABLE NEU
+B2AC ; LV # Lo HANGUL SYLLABLE NYI
+B2C8 ; LV # Lo HANGUL SYLLABLE NI
+B2E4 ; LV # Lo HANGUL SYLLABLE DA
+B300 ; LV # Lo HANGUL SYLLABLE DAE
+B31C ; LV # Lo HANGUL SYLLABLE DYA
+B338 ; LV # Lo HANGUL SYLLABLE DYAE
+B354 ; LV # Lo HANGUL SYLLABLE DEO
+B370 ; LV # Lo HANGUL SYLLABLE DE
+B38C ; LV # Lo HANGUL SYLLABLE DYEO
+B3A8 ; LV # Lo HANGUL SYLLABLE DYE
+B3C4 ; LV # Lo HANGUL SYLLABLE DO
+B3E0 ; LV # Lo HANGUL SYLLABLE DWA
+B3FC ; LV # Lo HANGUL SYLLABLE DWAE
+B418 ; LV # Lo HANGUL SYLLABLE DOE
+B434 ; LV # Lo HANGUL SYLLABLE DYO
+B450 ; LV # Lo HANGUL SYLLABLE DU
+B46C ; LV # Lo HANGUL SYLLABLE DWEO
+B488 ; LV # Lo HANGUL SYLLABLE DWE
+B4A4 ; LV # Lo HANGUL SYLLABLE DWI
+B4C0 ; LV # Lo HANGUL SYLLABLE DYU
+B4DC ; LV # Lo HANGUL SYLLABLE DEU
+B4F8 ; LV # Lo HANGUL SYLLABLE DYI
+B514 ; LV # Lo HANGUL SYLLABLE DI
+B530 ; LV # Lo HANGUL SYLLABLE DDA
+B54C ; LV # Lo HANGUL SYLLABLE DDAE
+B568 ; LV # Lo HANGUL SYLLABLE DDYA
+B584 ; LV # Lo HANGUL SYLLABLE DDYAE
+B5A0 ; LV # Lo HANGUL SYLLABLE DDEO
+B5BC ; LV # Lo HANGUL SYLLABLE DDE
+B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO
+B5F4 ; LV # Lo HANGUL SYLLABLE DDYE
+B610 ; LV # Lo HANGUL SYLLABLE DDO
+B62C ; LV # Lo HANGUL SYLLABLE DDWA
+B648 ; LV # Lo HANGUL SYLLABLE DDWAE
+B664 ; LV # Lo HANGUL SYLLABLE DDOE
+B680 ; LV # Lo HANGUL SYLLABLE DDYO
+B69C ; LV # Lo HANGUL SYLLABLE DDU
+B6B8 ; LV # Lo HANGUL SYLLABLE DDWEO
+B6D4 ; LV # Lo HANGUL SYLLABLE DDWE
+B6F0 ; LV # Lo HANGUL SYLLABLE DDWI
+B70C ; LV # Lo HANGUL SYLLABLE DDYU
+B728 ; LV # Lo HANGUL SYLLABLE DDEU
+B744 ; LV # Lo HANGUL SYLLABLE DDYI
+B760 ; LV # Lo HANGUL SYLLABLE DDI
+B77C ; LV # Lo HANGUL SYLLABLE RA
+B798 ; LV # Lo HANGUL SYLLABLE RAE
+B7B4 ; LV # Lo HANGUL SYLLABLE RYA
+B7D0 ; LV # Lo HANGUL SYLLABLE RYAE
+B7EC ; LV # Lo HANGUL SYLLABLE REO
+B808 ; LV # Lo HANGUL SYLLABLE RE
+B824 ; LV # Lo HANGUL SYLLABLE RYEO
+B840 ; LV # Lo HANGUL SYLLABLE RYE
+B85C ; LV # Lo HANGUL SYLLABLE RO
+B878 ; LV # Lo HANGUL SYLLABLE RWA
+B894 ; LV # Lo HANGUL SYLLABLE RWAE
+B8B0 ; LV # Lo HANGUL SYLLABLE ROE
+B8CC ; LV # Lo HANGUL SYLLABLE RYO
+B8E8 ; LV # Lo HANGUL SYLLABLE RU
+B904 ; LV # Lo HANGUL SYLLABLE RWEO
+B920 ; LV # Lo HANGUL SYLLABLE RWE
+B93C ; LV # Lo HANGUL SYLLABLE RWI
+B958 ; LV # Lo HANGUL SYLLABLE RYU
+B974 ; LV # Lo HANGUL SYLLABLE REU
+B990 ; LV # Lo HANGUL SYLLABLE RYI
+B9AC ; LV # Lo HANGUL SYLLABLE RI
+B9C8 ; LV # Lo HANGUL SYLLABLE MA
+B9E4 ; LV # Lo HANGUL SYLLABLE MAE
+BA00 ; LV # Lo HANGUL SYLLABLE MYA
+BA1C ; LV # Lo HANGUL SYLLABLE MYAE
+BA38 ; LV # Lo HANGUL SYLLABLE MEO
+BA54 ; LV # Lo HANGUL SYLLABLE ME
+BA70 ; LV # Lo HANGUL SYLLABLE MYEO
+BA8C ; LV # Lo HANGUL SYLLABLE MYE
+BAA8 ; LV # Lo HANGUL SYLLABLE MO
+BAC4 ; LV # Lo HANGUL SYLLABLE MWA
+BAE0 ; LV # Lo HANGUL SYLLABLE MWAE
+BAFC ; LV # Lo HANGUL SYLLABLE MOE
+BB18 ; LV # Lo HANGUL SYLLABLE MYO
+BB34 ; LV # Lo HANGUL SYLLABLE MU
+BB50 ; LV # Lo HANGUL SYLLABLE MWEO
+BB6C ; LV # Lo HANGUL SYLLABLE MWE
+BB88 ; LV # Lo HANGUL SYLLABLE MWI
+BBA4 ; LV # Lo HANGUL SYLLABLE MYU
+BBC0 ; LV # Lo HANGUL SYLLABLE MEU
+BBDC ; LV # Lo HANGUL SYLLABLE MYI
+BBF8 ; LV # Lo HANGUL SYLLABLE MI
+BC14 ; LV # Lo HANGUL SYLLABLE BA
+BC30 ; LV # Lo HANGUL SYLLABLE BAE
+BC4C ; LV # Lo HANGUL SYLLABLE BYA
+BC68 ; LV # Lo HANGUL SYLLABLE BYAE
+BC84 ; LV # Lo HANGUL SYLLABLE BEO
+BCA0 ; LV # Lo HANGUL SYLLABLE BE
+BCBC ; LV # Lo HANGUL SYLLABLE BYEO
+BCD8 ; LV # Lo HANGUL SYLLABLE BYE
+BCF4 ; LV # Lo HANGUL SYLLABLE BO
+BD10 ; LV # Lo HANGUL SYLLABLE BWA
+BD2C ; LV # Lo HANGUL SYLLABLE BWAE
+BD48 ; LV # Lo HANGUL SYLLABLE BOE
+BD64 ; LV # Lo HANGUL SYLLABLE BYO
+BD80 ; LV # Lo HANGUL SYLLABLE BU
+BD9C ; LV # Lo HANGUL SYLLABLE BWEO
+BDB8 ; LV # Lo HANGUL SYLLABLE BWE
+BDD4 ; LV # Lo HANGUL SYLLABLE BWI
+BDF0 ; LV # Lo HANGUL SYLLABLE BYU
+BE0C ; LV # Lo HANGUL SYLLABLE BEU
+BE28 ; LV # Lo HANGUL SYLLABLE BYI
+BE44 ; LV # Lo HANGUL SYLLABLE BI
+BE60 ; LV # Lo HANGUL SYLLABLE BBA
+BE7C ; LV # Lo HANGUL SYLLABLE BBAE
+BE98 ; LV # Lo HANGUL SYLLABLE BBYA
+BEB4 ; LV # Lo HANGUL SYLLABLE BBYAE
+BED0 ; LV # Lo HANGUL SYLLABLE BBEO
+BEEC ; LV # Lo HANGUL SYLLABLE BBE
+BF08 ; LV # Lo HANGUL SYLLABLE BBYEO
+BF24 ; LV # Lo HANGUL SYLLABLE BBYE
+BF40 ; LV # Lo HANGUL SYLLABLE BBO
+BF5C ; LV # Lo HANGUL SYLLABLE BBWA
+BF78 ; LV # Lo HANGUL SYLLABLE BBWAE
+BF94 ; LV # Lo HANGUL SYLLABLE BBOE
+BFB0 ; LV # Lo HANGUL SYLLABLE BBYO
+BFCC ; LV # Lo HANGUL SYLLABLE BBU
+BFE8 ; LV # Lo HANGUL SYLLABLE BBWEO
+C004 ; LV # Lo HANGUL SYLLABLE BBWE
+C020 ; LV # Lo HANGUL SYLLABLE BBWI
+C03C ; LV # Lo HANGUL SYLLABLE BBYU
+C058 ; LV # Lo HANGUL SYLLABLE BBEU
+C074 ; LV # Lo HANGUL SYLLABLE BBYI
+C090 ; LV # Lo HANGUL SYLLABLE BBI
+C0AC ; LV # Lo HANGUL SYLLABLE SA
+C0C8 ; LV # Lo HANGUL SYLLABLE SAE
+C0E4 ; LV # Lo HANGUL SYLLABLE SYA
+C100 ; LV # Lo HANGUL SYLLABLE SYAE
+C11C ; LV # Lo HANGUL SYLLABLE SEO
+C138 ; LV # Lo HANGUL SYLLABLE SE
+C154 ; LV # Lo HANGUL SYLLABLE SYEO
+C170 ; LV # Lo HANGUL SYLLABLE SYE
+C18C ; LV # Lo HANGUL SYLLABLE SO
+C1A8 ; LV # Lo HANGUL SYLLABLE SWA
+C1C4 ; LV # Lo HANGUL SYLLABLE SWAE
+C1E0 ; LV # Lo HANGUL SYLLABLE SOE
+C1FC ; LV # Lo HANGUL SYLLABLE SYO
+C218 ; LV # Lo HANGUL SYLLABLE SU
+C234 ; LV # Lo HANGUL SYLLABLE SWEO
+C250 ; LV # Lo HANGUL SYLLABLE SWE
+C26C ; LV # Lo HANGUL SYLLABLE SWI
+C288 ; LV # Lo HANGUL SYLLABLE SYU
+C2A4 ; LV # Lo HANGUL SYLLABLE SEU
+C2C0 ; LV # Lo HANGUL SYLLABLE SYI
+C2DC ; LV # Lo HANGUL SYLLABLE SI
+C2F8 ; LV # Lo HANGUL SYLLABLE SSA
+C314 ; LV # Lo HANGUL SYLLABLE SSAE
+C330 ; LV # Lo HANGUL SYLLABLE SSYA
+C34C ; LV # Lo HANGUL SYLLABLE SSYAE
+C368 ; LV # Lo HANGUL SYLLABLE SSEO
+C384 ; LV # Lo HANGUL SYLLABLE SSE
+C3A0 ; LV # Lo HANGUL SYLLABLE SSYEO
+C3BC ; LV # Lo HANGUL SYLLABLE SSYE
+C3D8 ; LV # Lo HANGUL SYLLABLE SSO
+C3F4 ; LV # Lo HANGUL SYLLABLE SSWA
+C410 ; LV # Lo HANGUL SYLLABLE SSWAE
+C42C ; LV # Lo HANGUL SYLLABLE SSOE
+C448 ; LV # Lo HANGUL SYLLABLE SSYO
+C464 ; LV # Lo HANGUL SYLLABLE SSU
+C480 ; LV # Lo HANGUL SYLLABLE SSWEO
+C49C ; LV # Lo HANGUL SYLLABLE SSWE
+C4B8 ; LV # Lo HANGUL SYLLABLE SSWI
+C4D4 ; LV # Lo HANGUL SYLLABLE SSYU
+C4F0 ; LV # Lo HANGUL SYLLABLE SSEU
+C50C ; LV # Lo HANGUL SYLLABLE SSYI
+C528 ; LV # Lo HANGUL SYLLABLE SSI
+C544 ; LV # Lo HANGUL SYLLABLE A
+C560 ; LV # Lo HANGUL SYLLABLE AE
+C57C ; LV # Lo HANGUL SYLLABLE YA
+C598 ; LV # Lo HANGUL SYLLABLE YAE
+C5B4 ; LV # Lo HANGUL SYLLABLE EO
+C5D0 ; LV # Lo HANGUL SYLLABLE E
+C5EC ; LV # Lo HANGUL SYLLABLE YEO
+C608 ; LV # Lo HANGUL SYLLABLE YE
+C624 ; LV # Lo HANGUL SYLLABLE O
+C640 ; LV # Lo HANGUL SYLLABLE WA
+C65C ; LV # Lo HANGUL SYLLABLE WAE
+C678 ; LV # Lo HANGUL SYLLABLE OE
+C694 ; LV # Lo HANGUL SYLLABLE YO
+C6B0 ; LV # Lo HANGUL SYLLABLE U
+C6CC ; LV # Lo HANGUL SYLLABLE WEO
+C6E8 ; LV # Lo HANGUL SYLLABLE WE
+C704 ; LV # Lo HANGUL SYLLABLE WI
+C720 ; LV # Lo HANGUL SYLLABLE YU
+C73C ; LV # Lo HANGUL SYLLABLE EU
+C758 ; LV # Lo HANGUL SYLLABLE YI
+C774 ; LV # Lo HANGUL SYLLABLE I
+C790 ; LV # Lo HANGUL SYLLABLE JA
+C7AC ; LV # Lo HANGUL SYLLABLE JAE
+C7C8 ; LV # Lo HANGUL SYLLABLE JYA
+C7E4 ; LV # Lo HANGUL SYLLABLE JYAE
+C800 ; LV # Lo HANGUL SYLLABLE JEO
+C81C ; LV # Lo HANGUL SYLLABLE JE
+C838 ; LV # Lo HANGUL SYLLABLE JYEO
+C854 ; LV # Lo HANGUL SYLLABLE JYE
+C870 ; LV # Lo HANGUL SYLLABLE JO
+C88C ; LV # Lo HANGUL SYLLABLE JWA
+C8A8 ; LV # Lo HANGUL SYLLABLE JWAE
+C8C4 ; LV # Lo HANGUL SYLLABLE JOE
+C8E0 ; LV # Lo HANGUL SYLLABLE JYO
+C8FC ; LV # Lo HANGUL SYLLABLE JU
+C918 ; LV # Lo HANGUL SYLLABLE JWEO
+C934 ; LV # Lo HANGUL SYLLABLE JWE
+C950 ; LV # Lo HANGUL SYLLABLE JWI
+C96C ; LV # Lo HANGUL SYLLABLE JYU
+C988 ; LV # Lo HANGUL SYLLABLE JEU
+C9A4 ; LV # Lo HANGUL SYLLABLE JYI
+C9C0 ; LV # Lo HANGUL SYLLABLE JI
+C9DC ; LV # Lo HANGUL SYLLABLE JJA
+C9F8 ; LV # Lo HANGUL SYLLABLE JJAE
+CA14 ; LV # Lo HANGUL SYLLABLE JJYA
+CA30 ; LV # Lo HANGUL SYLLABLE JJYAE
+CA4C ; LV # Lo HANGUL SYLLABLE JJEO
+CA68 ; LV # Lo HANGUL SYLLABLE JJE
+CA84 ; LV # Lo HANGUL SYLLABLE JJYEO
+CAA0 ; LV # Lo HANGUL SYLLABLE JJYE
+CABC ; LV # Lo HANGUL SYLLABLE JJO
+CAD8 ; LV # Lo HANGUL SYLLABLE JJWA
+CAF4 ; LV # Lo HANGUL SYLLABLE JJWAE
+CB10 ; LV # Lo HANGUL SYLLABLE JJOE
+CB2C ; LV # Lo HANGUL SYLLABLE JJYO
+CB48 ; LV # Lo HANGUL SYLLABLE JJU
+CB64 ; LV # Lo HANGUL SYLLABLE JJWEO
+CB80 ; LV # Lo HANGUL SYLLABLE JJWE
+CB9C ; LV # Lo HANGUL SYLLABLE JJWI
+CBB8 ; LV # Lo HANGUL SYLLABLE JJYU
+CBD4 ; LV # Lo HANGUL SYLLABLE JJEU
+CBF0 ; LV # Lo HANGUL SYLLABLE JJYI
+CC0C ; LV # Lo HANGUL SYLLABLE JJI
+CC28 ; LV # Lo HANGUL SYLLABLE CA
+CC44 ; LV # Lo HANGUL SYLLABLE CAE
+CC60 ; LV # Lo HANGUL SYLLABLE CYA
+CC7C ; LV # Lo HANGUL SYLLABLE CYAE
+CC98 ; LV # Lo HANGUL SYLLABLE CEO
+CCB4 ; LV # Lo HANGUL SYLLABLE CE
+CCD0 ; LV # Lo HANGUL SYLLABLE CYEO
+CCEC ; LV # Lo HANGUL SYLLABLE CYE
+CD08 ; LV # Lo HANGUL SYLLABLE CO
+CD24 ; LV # Lo HANGUL SYLLABLE CWA
+CD40 ; LV # Lo HANGUL SYLLABLE CWAE
+CD5C ; LV # Lo HANGUL SYLLABLE COE
+CD78 ; LV # Lo HANGUL SYLLABLE CYO
+CD94 ; LV # Lo HANGUL SYLLABLE CU
+CDB0 ; LV # Lo HANGUL SYLLABLE CWEO
+CDCC ; LV # Lo HANGUL SYLLABLE CWE
+CDE8 ; LV # Lo HANGUL SYLLABLE CWI
+CE04 ; LV # Lo HANGUL SYLLABLE CYU
+CE20 ; LV # Lo HANGUL SYLLABLE CEU
+CE3C ; LV # Lo HANGUL SYLLABLE CYI
+CE58 ; LV # Lo HANGUL SYLLABLE CI
+CE74 ; LV # Lo HANGUL SYLLABLE KA
+CE90 ; LV # Lo HANGUL SYLLABLE KAE
+CEAC ; LV # Lo HANGUL SYLLABLE KYA
+CEC8 ; LV # Lo HANGUL SYLLABLE KYAE
+CEE4 ; LV # Lo HANGUL SYLLABLE KEO
+CF00 ; LV # Lo HANGUL SYLLABLE KE
+CF1C ; LV # Lo HANGUL SYLLABLE KYEO
+CF38 ; LV # Lo HANGUL SYLLABLE KYE
+CF54 ; LV # Lo HANGUL SYLLABLE KO
+CF70 ; LV # Lo HANGUL SYLLABLE KWA
+CF8C ; LV # Lo HANGUL SYLLABLE KWAE
+CFA8 ; LV # Lo HANGUL SYLLABLE KOE
+CFC4 ; LV # Lo HANGUL SYLLABLE KYO
+CFE0 ; LV # Lo HANGUL SYLLABLE KU
+CFFC ; LV # Lo HANGUL SYLLABLE KWEO
+D018 ; LV # Lo HANGUL SYLLABLE KWE
+D034 ; LV # Lo HANGUL SYLLABLE KWI
+D050 ; LV # Lo HANGUL SYLLABLE KYU
+D06C ; LV # Lo HANGUL SYLLABLE KEU
+D088 ; LV # Lo HANGUL SYLLABLE KYI
+D0A4 ; LV # Lo HANGUL SYLLABLE KI
+D0C0 ; LV # Lo HANGUL SYLLABLE TA
+D0DC ; LV # Lo HANGUL SYLLABLE TAE
+D0F8 ; LV # Lo HANGUL SYLLABLE TYA
+D114 ; LV # Lo HANGUL SYLLABLE TYAE
+D130 ; LV # Lo HANGUL SYLLABLE TEO
+D14C ; LV # Lo HANGUL SYLLABLE TE
+D168 ; LV # Lo HANGUL SYLLABLE TYEO
+D184 ; LV # Lo HANGUL SYLLABLE TYE
+D1A0 ; LV # Lo HANGUL SYLLABLE TO
+D1BC ; LV # Lo HANGUL SYLLABLE TWA
+D1D8 ; LV # Lo HANGUL SYLLABLE TWAE
+D1F4 ; LV # Lo HANGUL SYLLABLE TOE
+D210 ; LV # Lo HANGUL SYLLABLE TYO
+D22C ; LV # Lo HANGUL SYLLABLE TU
+D248 ; LV # Lo HANGUL SYLLABLE TWEO
+D264 ; LV # Lo HANGUL SYLLABLE TWE
+D280 ; LV # Lo HANGUL SYLLABLE TWI
+D29C ; LV # Lo HANGUL SYLLABLE TYU
+D2B8 ; LV # Lo HANGUL SYLLABLE TEU
+D2D4 ; LV # Lo HANGUL SYLLABLE TYI
+D2F0 ; LV # Lo HANGUL SYLLABLE TI
+D30C ; LV # Lo HANGUL SYLLABLE PA
+D328 ; LV # Lo HANGUL SYLLABLE PAE
+D344 ; LV # Lo HANGUL SYLLABLE PYA
+D360 ; LV # Lo HANGUL SYLLABLE PYAE
+D37C ; LV # Lo HANGUL SYLLABLE PEO
+D398 ; LV # Lo HANGUL SYLLABLE PE
+D3B4 ; LV # Lo HANGUL SYLLABLE PYEO
+D3D0 ; LV # Lo HANGUL SYLLABLE PYE
+D3EC ; LV # Lo HANGUL SYLLABLE PO
+D408 ; LV # Lo HANGUL SYLLABLE PWA
+D424 ; LV # Lo HANGUL SYLLABLE PWAE
+D440 ; LV # Lo HANGUL SYLLABLE POE
+D45C ; LV # Lo HANGUL SYLLABLE PYO
+D478 ; LV # Lo HANGUL SYLLABLE PU
+D494 ; LV # Lo HANGUL SYLLABLE PWEO
+D4B0 ; LV # Lo HANGUL SYLLABLE PWE
+D4CC ; LV # Lo HANGUL SYLLABLE PWI
+D4E8 ; LV # Lo HANGUL SYLLABLE PYU
+D504 ; LV # Lo HANGUL SYLLABLE PEU
+D520 ; LV # Lo HANGUL SYLLABLE PYI
+D53C ; LV # Lo HANGUL SYLLABLE PI
+D558 ; LV # Lo HANGUL SYLLABLE HA
+D574 ; LV # Lo HANGUL SYLLABLE HAE
+D590 ; LV # Lo HANGUL SYLLABLE HYA
+D5AC ; LV # Lo HANGUL SYLLABLE HYAE
+D5C8 ; LV # Lo HANGUL SYLLABLE HEO
+D5E4 ; LV # Lo HANGUL SYLLABLE HE
+D600 ; LV # Lo HANGUL SYLLABLE HYEO
+D61C ; LV # Lo HANGUL SYLLABLE HYE
+D638 ; LV # Lo HANGUL SYLLABLE HO
+D654 ; LV # Lo HANGUL SYLLABLE HWA
+D670 ; LV # Lo HANGUL SYLLABLE HWAE
+D68C ; LV # Lo HANGUL SYLLABLE HOE
+D6A8 ; LV # Lo HANGUL SYLLABLE HYO
+D6C4 ; LV # Lo HANGUL SYLLABLE HU
+D6E0 ; LV # Lo HANGUL SYLLABLE HWEO
+D6FC ; LV # Lo HANGUL SYLLABLE HWE
+D718 ; LV # Lo HANGUL SYLLABLE HWI
+D734 ; LV # Lo HANGUL SYLLABLE HYU
+D750 ; LV # Lo HANGUL SYLLABLE HEU
+D76C ; LV # Lo HANGUL SYLLABLE HYI
+D788 ; LV # Lo HANGUL SYLLABLE HI
+
+# Total code points: 399
+
+# ================================================
+
+AC01..AC1B ; LVT # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH
+AC1D..AC37 ; LVT # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH
+AC39..AC53 ; LVT # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH
+AC55..AC6F ; LVT # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH
+AC71..AC8B ; LVT # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH
+AC8D..ACA7 ; LVT # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH
+ACA9..ACC3 ; LVT # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH
+ACC5..ACDF ; LVT # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH
+ACE1..ACFB ; LVT # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH
+ACFD..AD17 ; LVT # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH
+AD19..AD33 ; LVT # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH
+AD35..AD4F ; LVT # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH
+AD51..AD6B ; LVT # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH
+AD6D..AD87 ; LVT # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH
+AD89..ADA3 ; LVT # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH
+ADA5..ADBF ; LVT # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH
+ADC1..ADDB ; LVT # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH
+ADDD..ADF7 ; LVT # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH
+ADF9..AE13 ; LVT # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH
+AE15..AE2F ; LVT # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH
+AE31..AE4B ; LVT # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH
+AE4D..AE67 ; LVT # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH
+AE69..AE83 ; LVT # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH
+AE85..AE9F ; LVT # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH
+AEA1..AEBB ; LVT # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH
+AEBD..AED7 ; LVT # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH
+AED9..AEF3 ; LVT # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH
+AEF5..AF0F ; LVT # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH
+AF11..AF2B ; LVT # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH
+AF2D..AF47 ; LVT # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH
+AF49..AF63 ; LVT # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH
+AF65..AF7F ; LVT # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH
+AF81..AF9B ; LVT # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH
+AF9D..AFB7 ; LVT # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH
+AFB9..AFD3 ; LVT # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH
+AFD5..AFEF ; LVT # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH
+AFF1..B00B ; LVT # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH
+B00D..B027 ; LVT # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH
+B029..B043 ; LVT # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH
+B045..B05F ; LVT # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH
+B061..B07B ; LVT # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH
+B07D..B097 ; LVT # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH
+B099..B0B3 ; LVT # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH
+B0B5..B0CF ; LVT # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH
+B0D1..B0EB ; LVT # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH
+B0ED..B107 ; LVT # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH
+B109..B123 ; LVT # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH
+B125..B13F ; LVT # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH
+B141..B15B ; LVT # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH
+B15D..B177 ; LVT # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH
+B179..B193 ; LVT # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH
+B195..B1AF ; LVT # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH
+B1B1..B1CB ; LVT # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH
+B1CD..B1E7 ; LVT # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH
+B1E9..B203 ; LVT # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH
+B205..B21F ; LVT # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH
+B221..B23B ; LVT # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH
+B23D..B257 ; LVT # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH
+B259..B273 ; LVT # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH
+B275..B28F ; LVT # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH
+B291..B2AB ; LVT # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH
+B2AD..B2C7 ; LVT # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH
+B2C9..B2E3 ; LVT # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH
+B2E5..B2FF ; LVT # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH
+B301..B31B ; LVT # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH
+B31D..B337 ; LVT # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH
+B339..B353 ; LVT # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH
+B355..B36F ; LVT # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH
+B371..B38B ; LVT # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH
+B38D..B3A7 ; LVT # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH
+B3A9..B3C3 ; LVT # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH
+B3C5..B3DF ; LVT # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH
+B3E1..B3FB ; LVT # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH
+B3FD..B417 ; LVT # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH
+B419..B433 ; LVT # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH
+B435..B44F ; LVT # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH
+B451..B46B ; LVT # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH
+B46D..B487 ; LVT # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH
+B489..B4A3 ; LVT # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH
+B4A5..B4BF ; LVT # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH
+B4C1..B4DB ; LVT # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH
+B4DD..B4F7 ; LVT # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH
+B4F9..B513 ; LVT # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH
+B515..B52F ; LVT # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH
+B531..B54B ; LVT # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH
+B54D..B567 ; LVT # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH
+B569..B583 ; LVT # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH
+B585..B59F ; LVT # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH
+B5A1..B5BB ; LVT # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH
+B5BD..B5D7 ; LVT # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH
+B5D9..B5F3 ; LVT # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH
+B5F5..B60F ; LVT # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH
+B611..B62B ; LVT # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH
+B62D..B647 ; LVT # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH
+B649..B663 ; LVT # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH
+B665..B67F ; LVT # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH
+B681..B69B ; LVT # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH
+B69D..B6B7 ; LVT # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH
+B6B9..B6D3 ; LVT # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH
+B6D5..B6EF ; LVT # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH
+B6F1..B70B ; LVT # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH
+B70D..B727 ; LVT # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH
+B729..B743 ; LVT # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH
+B745..B75F ; LVT # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH
+B761..B77B ; LVT # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH
+B77D..B797 ; LVT # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH
+B799..B7B3 ; LVT # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH
+B7B5..B7CF ; LVT # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH
+B7D1..B7EB ; LVT # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH
+B7ED..B807 ; LVT # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH
+B809..B823 ; LVT # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH
+B825..B83F ; LVT # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH
+B841..B85B ; LVT # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH
+B85D..B877 ; LVT # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH
+B879..B893 ; LVT # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH
+B895..B8AF ; LVT # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH
+B8B1..B8CB ; LVT # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH
+B8CD..B8E7 ; LVT # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH
+B8E9..B903 ; LVT # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH
+B905..B91F ; LVT # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH
+B921..B93B ; LVT # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH
+B93D..B957 ; LVT # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH
+B959..B973 ; LVT # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH
+B975..B98F ; LVT # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH
+B991..B9AB ; LVT # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH
+B9AD..B9C7 ; LVT # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH
+B9C9..B9E3 ; LVT # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH
+B9E5..B9FF ; LVT # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH
+BA01..BA1B ; LVT # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH
+BA1D..BA37 ; LVT # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH
+BA39..BA53 ; LVT # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH
+BA55..BA6F ; LVT # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH
+BA71..BA8B ; LVT # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH
+BA8D..BAA7 ; LVT # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH
+BAA9..BAC3 ; LVT # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH
+BAC5..BADF ; LVT # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH
+BAE1..BAFB ; LVT # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH
+BAFD..BB17 ; LVT # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH
+BB19..BB33 ; LVT # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH
+BB35..BB4F ; LVT # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH
+BB51..BB6B ; LVT # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH
+BB6D..BB87 ; LVT # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH
+BB89..BBA3 ; LVT # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH
+BBA5..BBBF ; LVT # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH
+BBC1..BBDB ; LVT # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH
+BBDD..BBF7 ; LVT # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH
+BBF9..BC13 ; LVT # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH
+BC15..BC2F ; LVT # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH
+BC31..BC4B ; LVT # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH
+BC4D..BC67 ; LVT # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH
+BC69..BC83 ; LVT # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH
+BC85..BC9F ; LVT # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH
+BCA1..BCBB ; LVT # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH
+BCBD..BCD7 ; LVT # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH
+BCD9..BCF3 ; LVT # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH
+BCF5..BD0F ; LVT # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH
+BD11..BD2B ; LVT # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH
+BD2D..BD47 ; LVT # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH
+BD49..BD63 ; LVT # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH
+BD65..BD7F ; LVT # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH
+BD81..BD9B ; LVT # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH
+BD9D..BDB7 ; LVT # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH
+BDB9..BDD3 ; LVT # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH
+BDD5..BDEF ; LVT # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH
+BDF1..BE0B ; LVT # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH
+BE0D..BE27 ; LVT # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH
+BE29..BE43 ; LVT # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH
+BE45..BE5F ; LVT # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH
+BE61..BE7B ; LVT # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH
+BE7D..BE97 ; LVT # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH
+BE99..BEB3 ; LVT # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH
+BEB5..BECF ; LVT # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH
+BED1..BEEB ; LVT # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH
+BEED..BF07 ; LVT # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH
+BF09..BF23 ; LVT # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH
+BF25..BF3F ; LVT # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH
+BF41..BF5B ; LVT # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH
+BF5D..BF77 ; LVT # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH
+BF79..BF93 ; LVT # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH
+BF95..BFAF ; LVT # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH
+BFB1..BFCB ; LVT # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH
+BFCD..BFE7 ; LVT # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH
+BFE9..C003 ; LVT # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH
+C005..C01F ; LVT # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH
+C021..C03B ; LVT # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH
+C03D..C057 ; LVT # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH
+C059..C073 ; LVT # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH
+C075..C08F ; LVT # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH
+C091..C0AB ; LVT # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH
+C0AD..C0C7 ; LVT # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH
+C0C9..C0E3 ; LVT # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH
+C0E5..C0FF ; LVT # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH
+C101..C11B ; LVT # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH
+C11D..C137 ; LVT # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH
+C139..C153 ; LVT # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH
+C155..C16F ; LVT # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH
+C171..C18B ; LVT # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH
+C18D..C1A7 ; LVT # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH
+C1A9..C1C3 ; LVT # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH
+C1C5..C1DF ; LVT # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH
+C1E1..C1FB ; LVT # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH
+C1FD..C217 ; LVT # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH
+C219..C233 ; LVT # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH
+C235..C24F ; LVT # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH
+C251..C26B ; LVT # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH
+C26D..C287 ; LVT # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH
+C289..C2A3 ; LVT # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH
+C2A5..C2BF ; LVT # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH
+C2C1..C2DB ; LVT # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH
+C2DD..C2F7 ; LVT # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH
+C2F9..C313 ; LVT # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH
+C315..C32F ; LVT # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH
+C331..C34B ; LVT # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH
+C34D..C367 ; LVT # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH
+C369..C383 ; LVT # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH
+C385..C39F ; LVT # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH
+C3A1..C3BB ; LVT # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH
+C3BD..C3D7 ; LVT # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH
+C3D9..C3F3 ; LVT # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH
+C3F5..C40F ; LVT # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH
+C411..C42B ; LVT # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH
+C42D..C447 ; LVT # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH
+C449..C463 ; LVT # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH
+C465..C47F ; LVT # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH
+C481..C49B ; LVT # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH
+C49D..C4B7 ; LVT # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH
+C4B9..C4D3 ; LVT # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH
+C4D5..C4EF ; LVT # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH
+C4F1..C50B ; LVT # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH
+C50D..C527 ; LVT # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH
+C529..C543 ; LVT # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH
+C545..C55F ; LVT # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH
+C561..C57B ; LVT # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH
+C57D..C597 ; LVT # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH
+C599..C5B3 ; LVT # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH
+C5B5..C5CF ; LVT # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH
+C5D1..C5EB ; LVT # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH
+C5ED..C607 ; LVT # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH
+C609..C623 ; LVT # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH
+C625..C63F ; LVT # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH
+C641..C65B ; LVT # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH
+C65D..C677 ; LVT # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH
+C679..C693 ; LVT # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH
+C695..C6AF ; LVT # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH
+C6B1..C6CB ; LVT # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH
+C6CD..C6E7 ; LVT # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH
+C6E9..C703 ; LVT # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH
+C705..C71F ; LVT # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH
+C721..C73B ; LVT # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH
+C73D..C757 ; LVT # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH
+C759..C773 ; LVT # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH
+C775..C78F ; LVT # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH
+C791..C7AB ; LVT # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH
+C7AD..C7C7 ; LVT # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH
+C7C9..C7E3 ; LVT # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH
+C7E5..C7FF ; LVT # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH
+C801..C81B ; LVT # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH
+C81D..C837 ; LVT # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH
+C839..C853 ; LVT # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH
+C855..C86F ; LVT # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH
+C871..C88B ; LVT # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH
+C88D..C8A7 ; LVT # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH
+C8A9..C8C3 ; LVT # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH
+C8C5..C8DF ; LVT # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH
+C8E1..C8FB ; LVT # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH
+C8FD..C917 ; LVT # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH
+C919..C933 ; LVT # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH
+C935..C94F ; LVT # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH
+C951..C96B ; LVT # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH
+C96D..C987 ; LVT # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH
+C989..C9A3 ; LVT # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH
+C9A5..C9BF ; LVT # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH
+C9C1..C9DB ; LVT # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH
+C9DD..C9F7 ; LVT # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH
+C9F9..CA13 ; LVT # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH
+CA15..CA2F ; LVT # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH
+CA31..CA4B ; LVT # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH
+CA4D..CA67 ; LVT # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH
+CA69..CA83 ; LVT # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH
+CA85..CA9F ; LVT # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH
+CAA1..CABB ; LVT # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH
+CABD..CAD7 ; LVT # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH
+CAD9..CAF3 ; LVT # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH
+CAF5..CB0F ; LVT # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH
+CB11..CB2B ; LVT # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH
+CB2D..CB47 ; LVT # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH
+CB49..CB63 ; LVT # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH
+CB65..CB7F ; LVT # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH
+CB81..CB9B ; LVT # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH
+CB9D..CBB7 ; LVT # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH
+CBB9..CBD3 ; LVT # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH
+CBD5..CBEF ; LVT # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH
+CBF1..CC0B ; LVT # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH
+CC0D..CC27 ; LVT # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH
+CC29..CC43 ; LVT # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH
+CC45..CC5F ; LVT # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH
+CC61..CC7B ; LVT # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH
+CC7D..CC97 ; LVT # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH
+CC99..CCB3 ; LVT # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH
+CCB5..CCCF ; LVT # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH
+CCD1..CCEB ; LVT # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH
+CCED..CD07 ; LVT # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH
+CD09..CD23 ; LVT # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH
+CD25..CD3F ; LVT # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH
+CD41..CD5B ; LVT # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH
+CD5D..CD77 ; LVT # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH
+CD79..CD93 ; LVT # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH
+CD95..CDAF ; LVT # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH
+CDB1..CDCB ; LVT # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH
+CDCD..CDE7 ; LVT # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH
+CDE9..CE03 ; LVT # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH
+CE05..CE1F ; LVT # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH
+CE21..CE3B ; LVT # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH
+CE3D..CE57 ; LVT # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH
+CE59..CE73 ; LVT # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH
+CE75..CE8F ; LVT # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH
+CE91..CEAB ; LVT # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH
+CEAD..CEC7 ; LVT # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH
+CEC9..CEE3 ; LVT # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH
+CEE5..CEFF ; LVT # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH
+CF01..CF1B ; LVT # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH
+CF1D..CF37 ; LVT # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH
+CF39..CF53 ; LVT # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH
+CF55..CF6F ; LVT # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH
+CF71..CF8B ; LVT # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH
+CF8D..CFA7 ; LVT # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH
+CFA9..CFC3 ; LVT # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH
+CFC5..CFDF ; LVT # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH
+CFE1..CFFB ; LVT # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH
+CFFD..D017 ; LVT # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH
+D019..D033 ; LVT # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH
+D035..D04F ; LVT # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH
+D051..D06B ; LVT # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH
+D06D..D087 ; LVT # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH
+D089..D0A3 ; LVT # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH
+D0A5..D0BF ; LVT # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH
+D0C1..D0DB ; LVT # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH
+D0DD..D0F7 ; LVT # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH
+D0F9..D113 ; LVT # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH
+D115..D12F ; LVT # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH
+D131..D14B ; LVT # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH
+D14D..D167 ; LVT # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH
+D169..D183 ; LVT # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH
+D185..D19F ; LVT # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH
+D1A1..D1BB ; LVT # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH
+D1BD..D1D7 ; LVT # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH
+D1D9..D1F3 ; LVT # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH
+D1F5..D20F ; LVT # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH
+D211..D22B ; LVT # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH
+D22D..D247 ; LVT # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH
+D249..D263 ; LVT # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH
+D265..D27F ; LVT # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH
+D281..D29B ; LVT # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH
+D29D..D2B7 ; LVT # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH
+D2B9..D2D3 ; LVT # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH
+D2D5..D2EF ; LVT # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH
+D2F1..D30B ; LVT # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH
+D30D..D327 ; LVT # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH
+D329..D343 ; LVT # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH
+D345..D35F ; LVT # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH
+D361..D37B ; LVT # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH
+D37D..D397 ; LVT # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH
+D399..D3B3 ; LVT # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH
+D3B5..D3CF ; LVT # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH
+D3D1..D3EB ; LVT # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH
+D3ED..D407 ; LVT # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH
+D409..D423 ; LVT # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH
+D425..D43F ; LVT # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH
+D441..D45B ; LVT # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH
+D45D..D477 ; LVT # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH
+D479..D493 ; LVT # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH
+D495..D4AF ; LVT # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH
+D4B1..D4CB ; LVT # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH
+D4CD..D4E7 ; LVT # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH
+D4E9..D503 ; LVT # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH
+D505..D51F ; LVT # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH
+D521..D53B ; LVT # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH
+D53D..D557 ; LVT # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH
+D559..D573 ; LVT # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH
+D575..D58F ; LVT # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH
+D591..D5AB ; LVT # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH
+D5AD..D5C7 ; LVT # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH
+D5C9..D5E3 ; LVT # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH
+D5E5..D5FF ; LVT # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH
+D601..D61B ; LVT # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH
+D61D..D637 ; LVT # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH
+D639..D653 ; LVT # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH
+D655..D66F ; LVT # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH
+D671..D68B ; LVT # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH
+D68D..D6A7 ; LVT # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH
+D6A9..D6C3 ; LVT # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH
+D6C5..D6DF ; LVT # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH
+D6E1..D6FB ; LVT # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH
+D6FD..D717 ; LVT # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH
+D719..D733 ; LVT # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH
+D735..D74F ; LVT # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH
+D751..D76B ; LVT # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH
+D76D..D787 ; LVT # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH
+D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH
+
+# Total code points: 10773
+
diff --git a/gnu/usr.bin/perl/lib/unicore/Lbrk.pl b/gnu/usr.bin/perl/lib/unicore/Lbrk.pl
index 0a4eb153697..70ada2228f6 100644
--- a/gnu/usr.bin/perl/lib/unicore/Lbrk.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Lbrk.pl
@@ -39,7 +39,9 @@ return <<'END';
007C BA
007D CL
007E AL
-007F 009F CM
+007F 0084 CM
+0085 NL
+0086 009F CM
00A0 GL
00A1 AI
00A2 PO
@@ -130,14 +132,12 @@ return <<'END';
01DA AI
01DB AL
01DC AI
-01DD 0220 AL
-0222 0233 AL
+01DD 0236 AL
0250 AL
0251 AI
0252 0260 AL
0261 AI
-0262 02AD AL
-02B0 02C6 AL
+0262 02C6 AL
02C7 AI
02C8 BB
02C9 02CB AI
@@ -149,9 +149,9 @@ return <<'END';
02D8 02DB AI
02DC AL
02DD AI
-02DE 02EE AL
-0300 034F CM
-0360 036F CM
+02DE 02FF AL
+0300 0357 CM
+035D 036F CM
0374 0375 AL
037A AL
037E AL
@@ -165,7 +165,7 @@ return <<'END';
03C2 AL
03C3 03C9 AI
03CA 03CE AL
-03D0 03F6 AL
+03D0 03FB AL
0400 AL
0401 AI
0402 040F AL
@@ -195,34 +195,40 @@ return <<'END';
05C4 CM
05D0 05EA AL
05F0 05F4 AL
+0600 0603 AL
060C AL
+060D IS
+060E 060F AL
+0610 0615 CM
061B AL
061F AL
0621 063A AL
0640 064A AL
-064B 0655 CM
+064B 0658 CM
0660 0669 NU
066A 066F AL
0670 CM
0671 06D5 AL
-06D6 06E4 CM
+06D6 06DC CM
+06DD AL
+06DE 06E4 CM
06E5 06E6 AL
06E7 06E8 CM
06E9 AL
06EA 06ED CM
+06EE 06EF AL
06F0 06F9 NU
-06FA 06FE AL
-0700 070D AL
-070F CM
-0710 AL
+06FA 070D AL
+070F 0710 AL
0711 CM
-0712 072C AL
+0712 072F AL
0730 074A CM
+074D 074F AL
0780 07A5 AL
07A6 07B0 CM
07B1 AL
0901 0903 CM
-0905 0939 AL
+0904 0939 AL
093C CM
093D AL
093E 094D CM
@@ -241,6 +247,7 @@ return <<'END';
09B2 AL
09B6 09B9 AL
09BC CM
+09BD AL
09BE 09C4 CM
09C7 09C8 CM
09CB 09CD CM
@@ -252,7 +259,7 @@ return <<'END';
09F0 09F1 AL
09F2 09F3 PR
09F4 09FA AL
-0A02 CM
+0A01 0A03 CM
0A05 0A0A AL
0A0F 0A10 AL
0A13 0A28 AL
@@ -270,8 +277,7 @@ return <<'END';
0A70 0A71 CM
0A72 0A74 AL
0A81 0A83 CM
-0A85 0A8B AL
-0A8D AL
+0A85 0A8D AL
0A8F 0A91 AL
0A93 0AA8 AL
0AAA 0AB0 AL
@@ -283,15 +289,17 @@ return <<'END';
0AC7 0AC9 CM
0ACB 0ACD CM
0AD0 AL
-0AE0 AL
+0AE0 0AE1 AL
+0AE2 0AE3 CM
0AE6 0AEF NU
+0AF1 PR
0B01 0B03 CM
0B05 0B0C AL
0B0F 0B10 AL
0B13 0B28 AL
0B2A 0B30 AL
0B32 0B33 AL
-0B36 0B39 AL
+0B35 0B39 AL
0B3C CM
0B3D AL
0B3E 0B43 CM
@@ -301,7 +309,7 @@ return <<'END';
0B5C 0B5D AL
0B5F 0B61 AL
0B66 0B6F NU
-0B70 AL
+0B70 0B71 AL
0B82 CM
0B83 AL
0B85 0B8A AL
@@ -319,7 +327,9 @@ return <<'END';
0BCA 0BCD CM
0BD7 CM
0BE7 0BEF NU
-0BF0 0BF2 AL
+0BF0 0BF8 AL
+0BF9 PR
+0BFA AL
0C01 0C03 CM
0C05 0C0C AL
0C0E 0C10 AL
@@ -338,6 +348,8 @@ return <<'END';
0C92 0CA8 AL
0CAA 0CB3 AL
0CB5 0CB9 AL
+0CBC CM
+0CBD AL
0CBE 0CC4 CM
0CC6 0CC8 CM
0CCA 0CCD CM
@@ -443,9 +455,8 @@ return <<'END';
10D0 10F8 AL
10FB AL
1100 1159 ID
-115F ID
-1160 11A2 CM
-11A8 11F9 CM
+115F 11A2 ID
+11A8 11F9 ID
1200 1206 AL
1208 1246 AL
1248 AL
@@ -493,22 +504,35 @@ return <<'END';
1760 176C AL
176E 1770 AL
1772 1773 CM
-1780 17B3 SA
-17B4 17D3 CM
+1780 17B5 SA
+17B6 17D3 CM
17D4 NS
17D5 BA
17D6 17DA NS
17DB PR
17DC AL
+17DD CM
17E0 17E9 NU
+17F0 17F9 AL
1800 1805 AL
1806 BB
1807 180A AL
-180B 180E CM
+180B 180D CM
+180E GL
1810 1819 NU
1820 1877 AL
1880 18A8 AL
18A9 CM
+1900 191C AL
+1920 192B CM
+1930 193B CM
+1940 AL
+1944 1945 EX
+1946 194F NU
+1950 196D AL
+1970 1974 AL
+19E0 19FF AL
+1D00 1D6B AL
1E00 1E9B AL
1EA0 1EF9 AL
1F00 1F15 AL
@@ -556,13 +580,13 @@ return <<'END';
203B AI
203C NS
203D 2043 AL
-2044 NS
+2044 IS
2045 OP
2046 CL
-2047 2052 AL
+2047 2054 AL
2057 AL
205F BA
-2060 GL
+2060 WJ
2061 2063 AL
206A 206F CM
2070 2071 AL
@@ -596,7 +620,7 @@ return <<'END';
2126 PO
2127 212A AL
212B AI
-212C 213A AL
+212C 213B AL
213D 213F AL
2140 AI
2141 214B AL
@@ -682,7 +706,7 @@ return <<'END';
23B4 OP
23B5 CL
23B6 QU
-23B7 23CE AL
+23B7 23D0 AL
2400 2426 AL
2440 244A AL
2460 24BF AI
@@ -690,6 +714,7 @@ return <<'END';
24D0 24E9 AI
24EA AL
24EB 24FE AI
+24FF AL
2500 254B AI
254C 254F AL
2550 2574 AI
@@ -726,7 +751,7 @@ return <<'END';
260A 260D AL
260E 260F AI
2610 2613 AL
-2616 2617 AI
+2614 2617 AI
2619 261B AL
261C AI
261D AL
@@ -746,7 +771,8 @@ return <<'END';
266E AL
266F AI
2670 267D AL
-2680 2689 AL
+2680 2691 AL
+26A0 26A1 AL
2701 2704 AL
2706 2709 AL
270C 2727 AL
@@ -814,7 +840,7 @@ return <<'END';
29DC 29FB AL
29FC OP
29FD CL
-29FE 2AFF AL
+29FE 2B0D AL
2E80 2E99 ID
2E9B 2EF3 ID
2F00 2FD5 ID
@@ -897,23 +923,18 @@ return <<'END';
30EF 30F4 ID
30F5 30F6 NS
30F7 30FA ID
-30FB NS
-30FC ID
-30FD NS
-30FE 30FF ID
+30FB 30FE NS
+30FF ID
3105 312C ID
3131 318E ID
3190 31B7 ID
31F0 31FF NS
-3200 321C ID
+3200 321E ID
3220 3243 ID
-3251 327B ID
-327F 32CB ID
-32D0 32FE ID
-3300 3376 ID
-337B 33DD ID
-33E0 33FE ID
-3400 4DB5 ID
+3250 327D ID
+327F 32FE ID
+3300 4DB5 ID
+4DC0 4DFF AL
4E00 9FA5 ID
A000 A48C ID
A490 A4C6 ID
@@ -939,6 +960,7 @@ FD50 FD8F AL
FD92 FDC7 AL
FDF0 FDFB AL
FDFC PO
+FDFD AL
FE00 FE0F CM
FE20 FE23 CM
FE30 FE34 ID
@@ -959,6 +981,8 @@ FE42 CL
FE43 OP
FE44 CL
FE45 FE46 ID
+FE47 OP
+FE48 CL
FE49 FE4F ID
FE50 CL
FE51 ID
@@ -979,7 +1003,7 @@ FE6A PO
FE6B ID
FE70 FE74 AL
FE76 FEFC AL
-FEFF GL
+FEFF WJ
FF01 EX
FF02 FF03 ID
FF04 PR
@@ -1026,11 +1050,29 @@ FFE8 FFEE AL
FFF9 FFFB CM
FFFC CB
FFFD AI
+10000 1000B AL
+1000D 10026 AL
+10028 1003A AL
+1003C 1003D AL
+1003F 1004D AL
+10050 1005D AL
+10080 100FA AL
+10100 10102 BA
+10107 10133 AL
+10137 1013F AL
10300 1031E AL
10320 10323 AL
10330 1034A AL
-10400 10425 AL
-10428 1044D AL
+10380 1039D AL
+1039F BA
+10400 1049D AL
+104A0 104A9 NU
+10800 10805 AL
+10808 AL
+1080A 10835 AL
+10837 10838 AL
+1083C AL
+1083F AL
1D000 1D0F5 AL
1D100 1D126 AL
1D12A 1D164 AL
@@ -1042,6 +1084,7 @@ FFFD AI
1D18C 1D1A9 AL
1D1AA 1D1AD CM
1D1AE 1D1DD AL
+1D300 1D356 AL
1D400 1D454 AL
1D456 1D49C AL
1D49E 1D49F AL
@@ -1050,8 +1093,7 @@ FFFD AI
1D4A9 1D4AC AL
1D4AE 1D4B9 AL
1D4BB AL
-1D4BD 1D4C0 AL
-1D4C2 1D4C3 AL
+1D4BD 1D4C3 AL
1D4C5 1D505 AL
1D507 1D50A AL
1D50D 1D514 AL
@@ -1068,6 +1110,7 @@ FFFD AI
2F800 2FA1D ID
E0001 CM
E0020 E007F CM
+E0100 E01EF CM
F0000 FFFFD XX
100000 10FFFD XX
END
diff --git a/gnu/usr.bin/perl/lib/unicore/LineBreak.txt b/gnu/usr.bin/perl/lib/unicore/LineBreak.txt
index 8549eb8dd94..90a116c2afb 100644
--- a/gnu/usr.bin/perl/lib/unicore/LineBreak.txt
+++ b/gnu/usr.bin/perl/lib/unicore/LineBreak.txt
@@ -1,4 +1,4 @@
-# LineBreak-3.2.0.txt
+# LineBreak-4.0.0.txt
#
# Line Break Properties
#
@@ -8,14 +8,14 @@
# Field 1: Unicode value
# Field 2: LineBreak property, consisting of one of the following values:
# Normative:
-# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW"
+# "BK", "CR", "LF", "CM", "SG", "GL", "CB", "SP", "ZW",
+# "NL", "WJ"
# Informative:
# "XX", "OP", "CL", "QU", "NS", "EX", "SY",
# "IS", "PR", "PO", "NU", "AL", "ID", "IN", "HY",
# "BB", "BA", "SA", "AI", "B2"
-# - Assigned characters that are not listed explicitly are given the value
-# "AL".
-# - Unassigned characters are given the value "XX".
+# - All code points, assigned and unassigned, that are not listed
+# explicitly are given the value "XX".
# - Characters ranges are specified as for other property files in
# the Unicode Character Database.
#
@@ -156,7 +156,7 @@
0082;CM # <control>
0083;CM # <control>
0084;CM # <control>
-0085;CM # <control>
+0085;NL # <control>
0086;CM # <control>
0087;CM # <control>
0088;CM # <control>
@@ -568,6 +568,7 @@
021E;AL # LATIN CAPITAL LETTER H WITH CARON
021F;AL # LATIN SMALL LETTER H WITH CARON
0220;AL # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221;AL # LATIN SMALL LETTER D WITH CURL
0222;AL # LATIN CAPITAL LETTER OU
0223;AL # LATIN SMALL LETTER OU
0224;AL # LATIN CAPITAL LETTER Z WITH HOOK
@@ -586,6 +587,9 @@
0231;AL # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
0232;AL # LATIN CAPITAL LETTER Y WITH MACRON
0233;AL # LATIN SMALL LETTER Y WITH MACRON
+0234;AL # LATIN SMALL LETTER L WITH CURL
+0235;AL # LATIN SMALL LETTER N WITH CURL
+0236;AL # LATIN SMALL LETTER T WITH CURL
0250;AL # LATIN SMALL LETTER TURNED A
0251;AI # LATIN SMALL LETTER ALPHA
0252;AL # LATIN SMALL LETTER TURNED ALPHA
@@ -680,6 +684,8 @@
02AB;AL # LATIN SMALL LETTER LZ DIGRAPH
02AC;AL # LATIN LETTER BILABIAL PERCUSSIVE
02AD;AL # LATIN LETTER BIDENTAL PERCUSSIVE
+02AE;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF;AL # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
02B0;AL # MODIFIER LETTER SMALL H
02B1;AL # MODIFIER LETTER SMALL H WITH HOOK
02B2;AL # MODIFIER LETTER SMALL J
@@ -743,6 +749,23 @@
02EC;AL # MODIFIER LETTER VOICING
02ED;AL # MODIFIER LETTER UNASPIRATED
02EE;AL # MODIFIER LETTER DOUBLE APOSTROPHE
+02EF;AL # MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0;AL # MODIFIER LETTER LOW UP ARROWHEAD
+02F1;AL # MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2;AL # MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3;AL # MODIFIER LETTER LOW RING
+02F4;AL # MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5;AL # MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6;AL # MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7;AL # MODIFIER LETTER LOW TILDE
+02F8;AL # MODIFIER LETTER RAISED COLON
+02F9;AL # MODIFIER LETTER BEGIN HIGH TONE
+02FA;AL # MODIFIER LETTER END HIGH TONE
+02FB;AL # MODIFIER LETTER BEGIN LOW TONE
+02FC;AL # MODIFIER LETTER END LOW TONE
+02FD;AL # MODIFIER LETTER SHELF
+02FE;AL # MODIFIER LETTER OPEN SHELF
+02FF;AL # MODIFIER LETTER LOW LEFT ARROW
0300;CM # COMBINING GRAVE ACCENT
0301;CM # COMBINING ACUTE ACCENT
0302;CM # COMBINING CIRCUMFLEX ACCENT
@@ -823,6 +846,17 @@
034D;CM # COMBINING LEFT RIGHT ARROW BELOW
034E;CM # COMBINING UPWARDS ARROW BELOW
034F;CM # COMBINING GRAPHEME JOINER
+0350;CM # COMBINING RIGHT ARROWHEAD ABOVE
+0351;CM # COMBINING LEFT HALF RING ABOVE
+0352;CM # COMBINING FERMATA
+0353;CM # COMBINING X BELOW
+0354;CM # COMBINING LEFT ARROWHEAD BELOW
+0355;CM # COMBINING RIGHT ARROWHEAD BELOW
+0356;CM # COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357;CM # COMBINING RIGHT HALF RING ABOVE
+035D;CM # COMBINING DOUBLE BREVE
+035E;CM # COMBINING DOUBLE MACRON
+035F;CM # COMBINING DOUBLE MACRON BELOW
0360;CM # COMBINING DOUBLE TILDE
0361;CM # COMBINING DOUBLE INVERTED BREVE
0362;CM # COMBINING DOUBLE RIGHTWARDS ARROW BELOW
@@ -954,6 +988,11 @@
03F4;AL # GREEK CAPITAL THETA SYMBOL
03F5;AL # GREEK LUNATE EPSILON SYMBOL
03F6;AL # GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7;AL # GREEK CAPITAL LETTER SHO
+03F8;AL # GREEK SMALL LETTER SHO
+03F9;AL # GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA;AL # GREEK CAPITAL LETTER SAN
+03FB;AL # GREEK SMALL LETTER SAN
0400;AL # CYRILLIC CAPITAL LETTER IE WITH GRAVE
0401;AI # CYRILLIC CAPITAL LETTER IO
0402;AL # CYRILLIC CAPITAL LETTER DJE
@@ -1384,7 +1423,20 @@
05F2;AL # HEBREW LIGATURE YIDDISH DOUBLE YOD
05F3;AL # HEBREW PUNCTUATION GERESH
05F4;AL # HEBREW PUNCTUATION GERSHAYIM
+0600;AL # ARABIC NUMBER SIGN
+0601;AL # ARABIC SIGN SANAH
+0602;AL # ARABIC FOOTNOTE MARKER
+0603;AL # ARABIC SIGN SAFHA
060C;AL # ARABIC COMMA
+060D;IS # ARABIC DATE SEPARATOR
+060E;AL # ARABIC POETIC VERSE SIGN
+060F;AL # ARABIC SIGN MISRA
+0610;CM # ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611;CM # ARABIC SIGN ALAYHE ASSALLAM
+0612;CM # ARABIC SIGN RAHMATULLAH ALAYHE
+0613;CM # ARABIC SIGN RADI ALLAHOU ANHU
+0614;CM # ARABIC SIGN TAKHALLUS
+0615;CM # ARABIC SMALL HIGH TAH
061B;AL # ARABIC SEMICOLON
061F;AL # ARABIC QUESTION MARK
0621;AL # ARABIC LETTER HAMZA
@@ -1435,6 +1487,9 @@
0653;CM # ARABIC MADDAH ABOVE
0654;CM # ARABIC HAMZA ABOVE
0655;CM # ARABIC HAMZA BELOW
+0656;CM # ARABIC SUBSCRIPT ALEF
+0657;CM # ARABIC INVERTED DAMMA
+0658;CM # ARABIC MARK NOON GHUNNA
0660;NU # ARABIC-INDIC DIGIT ZERO
0661;NU # ARABIC-INDIC DIGIT ONE
0662;NU # ARABIC-INDIC DIGIT TWO
@@ -1560,7 +1615,7 @@
06DA;CM # ARABIC SMALL HIGH JEEM
06DB;CM # ARABIC SMALL HIGH THREE DOTS
06DC;CM # ARABIC SMALL HIGH SEEN
-06DD;CM # ARABIC END OF AYAH
+06DD;AL # ARABIC END OF AYAH
06DE;CM # ARABIC START OF RUB EL HIZB
06DF;CM # ARABIC SMALL HIGH ROUNDED ZERO
06E0;CM # ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
@@ -1577,6 +1632,8 @@
06EB;CM # ARABIC EMPTY CENTRE HIGH STOP
06EC;CM # ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
06ED;CM # ARABIC SMALL LOW MEEM
+06EE;AL # ARABIC LETTER DAL WITH INVERTED V
+06EF;AL # ARABIC LETTER REH WITH INVERTED V
06F0;NU # EXTENDED ARABIC-INDIC DIGIT ZERO
06F1;NU # EXTENDED ARABIC-INDIC DIGIT ONE
06F2;NU # EXTENDED ARABIC-INDIC DIGIT TWO
@@ -1592,6 +1649,7 @@
06FC;AL # ARABIC LETTER GHAIN WITH DOT BELOW
06FD;AL # ARABIC SIGN SINDHI AMPERSAND
06FE;AL # ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF;AL # ARABIC LETTER HEH WITH INVERTED V
0700;AL # SYRIAC END OF PARAGRAPH
0701;AL # SYRIAC SUPRALINEAR FULL STOP
0702;AL # SYRIAC SUBLINEAR FULL STOP
@@ -1606,7 +1664,7 @@
070B;AL # SYRIAC HARKLEAN OBELUS
070C;AL # SYRIAC HARKLEAN METOBELUS
070D;AL # SYRIAC HARKLEAN ASTERISCUS
-070F;CM # SYRIAC ABBREVIATION MARK
+070F;AL # SYRIAC ABBREVIATION MARK
0710;AL # SYRIAC LETTER ALAPH
0711;CM # SYRIAC LETTER SUPERSCRIPT ALAPH
0712;AL # SYRIAC LETTER BETH
@@ -1636,6 +1694,9 @@
072A;AL # SYRIAC LETTER RISH
072B;AL # SYRIAC LETTER SHIN
072C;AL # SYRIAC LETTER TAW
+072D;AL # SYRIAC LETTER PERSIAN BHETH
+072E;AL # SYRIAC LETTER PERSIAN GHAMAL
+072F;AL # SYRIAC LETTER PERSIAN DHALATH
0730;CM # SYRIAC PTHAHA ABOVE
0731;CM # SYRIAC PTHAHA BELOW
0732;CM # SYRIAC PTHAHA DOTTED
@@ -1663,6 +1724,9 @@
0748;CM # SYRIAC OBLIQUE LINE BELOW
0749;CM # SYRIAC MUSIC
074A;CM # SYRIAC BARREKH
+074D;AL # SYRIAC LETTER SOGDIAN ZHAIN
+074E;AL # SYRIAC LETTER SOGDIAN KHAPH
+074F;AL # SYRIAC LETTER SOGDIAN FE
0780;AL # THAANA LETTER HAA
0781;AL # THAANA LETTER SHAVIYANI
0782;AL # THAANA LETTER NOONU
@@ -1716,6 +1780,7 @@
0901;CM # DEVANAGARI SIGN CANDRABINDU
0902;CM # DEVANAGARI SIGN ANUSVARA
0903;CM # DEVANAGARI SIGN VISARGA
+0904;AL # DEVANAGARI LETTER SHORT A
0905;AL # DEVANAGARI LETTER A
0906;AL # DEVANAGARI LETTER AA
0907;AL # DEVANAGARI LETTER I
@@ -1865,6 +1930,7 @@
09B8;AL # BENGALI LETTER SA
09B9;AL # BENGALI LETTER HA
09BC;CM # BENGALI SIGN NUKTA
+09BD;AL # BENGALI SIGN AVAGRAHA
09BE;CM # BENGALI VOWEL SIGN AA
09BF;CM # BENGALI VOWEL SIGN I
09C0;CM # BENGALI VOWEL SIGN II
@@ -1906,7 +1972,9 @@
09F8;AL # BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
09F9;AL # BENGALI CURRENCY DENOMINATOR SIXTEEN
09FA;AL # BENGALI ISSHAR
+0A01;CM # GURMUKHI SIGN ADAK BINDI
0A02;CM # GURMUKHI SIGN BINDI
+0A03;CM # GURMUKHI SIGN VISARGA
0A05;AL # GURMUKHI LETTER A
0A06;AL # GURMUKHI LETTER AA
0A07;AL # GURMUKHI LETTER I
@@ -1991,6 +2059,7 @@
0A89;AL # GUJARATI LETTER U
0A8A;AL # GUJARATI LETTER UU
0A8B;AL # GUJARATI LETTER VOCALIC R
+0A8C;AL # GUJARATI LETTER VOCALIC L
0A8D;AL # GUJARATI VOWEL CANDRA E
0A8F;AL # GUJARATI LETTER E
0A90;AL # GUJARATI LETTER AI
@@ -2049,6 +2118,9 @@
0ACD;CM # GUJARATI SIGN VIRAMA
0AD0;AL # GUJARATI OM
0AE0;AL # GUJARATI LETTER VOCALIC RR
+0AE1;AL # GUJARATI LETTER VOCALIC LL
+0AE2;CM # GUJARATI VOWEL SIGN VOCALIC L
+0AE3;CM # GUJARATI VOWEL SIGN VOCALIC LL
0AE6;NU # GUJARATI DIGIT ZERO
0AE7;NU # GUJARATI DIGIT ONE
0AE8;NU # GUJARATI DIGIT TWO
@@ -2059,6 +2131,7 @@
0AED;NU # GUJARATI DIGIT SEVEN
0AEE;NU # GUJARATI DIGIT EIGHT
0AEF;NU # GUJARATI DIGIT NINE
+0AF1;PR # GUJARATI RUPEE SIGN
0B01;CM # ORIYA SIGN CANDRABINDU
0B02;CM # ORIYA SIGN ANUSVARA
0B03;CM # ORIYA SIGN VISARGA
@@ -2103,6 +2176,7 @@
0B30;AL # ORIYA LETTER RA
0B32;AL # ORIYA LETTER LA
0B33;AL # ORIYA LETTER LLA
+0B35;AL # ORIYA LETTER VA
0B36;AL # ORIYA LETTER SHA
0B37;AL # ORIYA LETTER SSA
0B38;AL # ORIYA LETTER SA
@@ -2138,6 +2212,7 @@
0B6E;NU # ORIYA DIGIT EIGHT
0B6F;NU # ORIYA DIGIT NINE
0B70;AL # ORIYA ISSHAR
+0B71;AL # ORIYA LETTER WA
0B82;CM # TAMIL SIGN ANUSVARA
0B83;AL # TAMIL SIGN VISARGA
0B85;AL # TAMIL LETTER A
@@ -2199,6 +2274,14 @@
0BF0;AL # TAMIL NUMBER TEN
0BF1;AL # TAMIL NUMBER ONE HUNDRED
0BF2;AL # TAMIL NUMBER ONE THOUSAND
+0BF3;AL # TAMIL DAY SIGN
+0BF4;AL # TAMIL MONTH SIGN
+0BF5;AL # TAMIL YEAR SIGN
+0BF6;AL # TAMIL DEBIT SIGN
+0BF7;AL # TAMIL CREDIT SIGN
+0BF8;AL # TAMIL AS ABOVE SIGN
+0BF9;PR # TAMIL RUPEE SIGN
+0BFA;AL # TAMIL NUMBER SIGN
0C01;CM # TELUGU SIGN CANDRABINDU
0C02;CM # TELUGU SIGN ANUSVARA
0C03;CM # TELUGU SIGN VISARGA
@@ -2330,6 +2413,8 @@
0CB7;AL # KANNADA LETTER SSA
0CB8;AL # KANNADA LETTER SA
0CB9;AL # KANNADA LETTER HA
+0CBC;CM # KANNADA SIGN NUKTA
+0CBD;AL # KANNADA SIGN AVAGRAHA
0CBE;CM # KANNADA VOWEL SIGN AA
0CBF;CM # KANNADA VOWEL SIGN I
0CC0;CM # KANNADA VOWEL SIGN II
@@ -3111,155 +3196,155 @@
1158;ID # HANGUL CHOSEONG SSANGHIEUH
1159;ID # HANGUL CHOSEONG YEORINHIEUH
115F;ID # HANGUL CHOSEONG FILLER
-1160;CM # HANGUL JUNGSEONG FILLER
-1161;CM # HANGUL JUNGSEONG A
-1162;CM # HANGUL JUNGSEONG AE
-1163;CM # HANGUL JUNGSEONG YA
-1164;CM # HANGUL JUNGSEONG YAE
-1165;CM # HANGUL JUNGSEONG EO
-1166;CM # HANGUL JUNGSEONG E
-1167;CM # HANGUL JUNGSEONG YEO
-1168;CM # HANGUL JUNGSEONG YE
-1169;CM # HANGUL JUNGSEONG O
-116A;CM # HANGUL JUNGSEONG WA
-116B;CM # HANGUL JUNGSEONG WAE
-116C;CM # HANGUL JUNGSEONG OE
-116D;CM # HANGUL JUNGSEONG YO
-116E;CM # HANGUL JUNGSEONG U
-116F;CM # HANGUL JUNGSEONG WEO
-1170;CM # HANGUL JUNGSEONG WE
-1171;CM # HANGUL JUNGSEONG WI
-1172;CM # HANGUL JUNGSEONG YU
-1173;CM # HANGUL JUNGSEONG EU
-1174;CM # HANGUL JUNGSEONG YI
-1175;CM # HANGUL JUNGSEONG I
-1176;CM # HANGUL JUNGSEONG A-O
-1177;CM # HANGUL JUNGSEONG A-U
-1178;CM # HANGUL JUNGSEONG YA-O
-1179;CM # HANGUL JUNGSEONG YA-YO
-117A;CM # HANGUL JUNGSEONG EO-O
-117B;CM # HANGUL JUNGSEONG EO-U
-117C;CM # HANGUL JUNGSEONG EO-EU
-117D;CM # HANGUL JUNGSEONG YEO-O
-117E;CM # HANGUL JUNGSEONG YEO-U
-117F;CM # HANGUL JUNGSEONG O-EO
-1180;CM # HANGUL JUNGSEONG O-E
-1181;CM # HANGUL JUNGSEONG O-YE
-1182;CM # HANGUL JUNGSEONG O-O
-1183;CM # HANGUL JUNGSEONG O-U
-1184;CM # HANGUL JUNGSEONG YO-YA
-1185;CM # HANGUL JUNGSEONG YO-YAE
-1186;CM # HANGUL JUNGSEONG YO-YEO
-1187;CM # HANGUL JUNGSEONG YO-O
-1188;CM # HANGUL JUNGSEONG YO-I
-1189;CM # HANGUL JUNGSEONG U-A
-118A;CM # HANGUL JUNGSEONG U-AE
-118B;CM # HANGUL JUNGSEONG U-EO-EU
-118C;CM # HANGUL JUNGSEONG U-YE
-118D;CM # HANGUL JUNGSEONG U-U
-118E;CM # HANGUL JUNGSEONG YU-A
-118F;CM # HANGUL JUNGSEONG YU-EO
-1190;CM # HANGUL JUNGSEONG YU-E
-1191;CM # HANGUL JUNGSEONG YU-YEO
-1192;CM # HANGUL JUNGSEONG YU-YE
-1193;CM # HANGUL JUNGSEONG YU-U
-1194;CM # HANGUL JUNGSEONG YU-I
-1195;CM # HANGUL JUNGSEONG EU-U
-1196;CM # HANGUL JUNGSEONG EU-EU
-1197;CM # HANGUL JUNGSEONG YI-U
-1198;CM # HANGUL JUNGSEONG I-A
-1199;CM # HANGUL JUNGSEONG I-YA
-119A;CM # HANGUL JUNGSEONG I-O
-119B;CM # HANGUL JUNGSEONG I-U
-119C;CM # HANGUL JUNGSEONG I-EU
-119D;CM # HANGUL JUNGSEONG I-ARAEA
-119E;CM # HANGUL JUNGSEONG ARAEA
-119F;CM # HANGUL JUNGSEONG ARAEA-EO
-11A0;CM # HANGUL JUNGSEONG ARAEA-U
-11A1;CM # HANGUL JUNGSEONG ARAEA-I
-11A2;CM # HANGUL JUNGSEONG SSANGARAEA
-11A8;CM # HANGUL JONGSEONG KIYEOK
-11A9;CM # HANGUL JONGSEONG SSANGKIYEOK
-11AA;CM # HANGUL JONGSEONG KIYEOK-SIOS
-11AB;CM # HANGUL JONGSEONG NIEUN
-11AC;CM # HANGUL JONGSEONG NIEUN-CIEUC
-11AD;CM # HANGUL JONGSEONG NIEUN-HIEUH
-11AE;CM # HANGUL JONGSEONG TIKEUT
-11AF;CM # HANGUL JONGSEONG RIEUL
-11B0;CM # HANGUL JONGSEONG RIEUL-KIYEOK
-11B1;CM # HANGUL JONGSEONG RIEUL-MIEUM
-11B2;CM # HANGUL JONGSEONG RIEUL-PIEUP
-11B3;CM # HANGUL JONGSEONG RIEUL-SIOS
-11B4;CM # HANGUL JONGSEONG RIEUL-THIEUTH
-11B5;CM # HANGUL JONGSEONG RIEUL-PHIEUPH
-11B6;CM # HANGUL JONGSEONG RIEUL-HIEUH
-11B7;CM # HANGUL JONGSEONG MIEUM
-11B8;CM # HANGUL JONGSEONG PIEUP
-11B9;CM # HANGUL JONGSEONG PIEUP-SIOS
-11BA;CM # HANGUL JONGSEONG SIOS
-11BB;CM # HANGUL JONGSEONG SSANGSIOS
-11BC;CM # HANGUL JONGSEONG IEUNG
-11BD;CM # HANGUL JONGSEONG CIEUC
-11BE;CM # HANGUL JONGSEONG CHIEUCH
-11BF;CM # HANGUL JONGSEONG KHIEUKH
-11C0;CM # HANGUL JONGSEONG THIEUTH
-11C1;CM # HANGUL JONGSEONG PHIEUPH
-11C2;CM # HANGUL JONGSEONG HIEUH
-11C3;CM # HANGUL JONGSEONG KIYEOK-RIEUL
-11C4;CM # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
-11C5;CM # HANGUL JONGSEONG NIEUN-KIYEOK
-11C6;CM # HANGUL JONGSEONG NIEUN-TIKEUT
-11C7;CM # HANGUL JONGSEONG NIEUN-SIOS
-11C8;CM # HANGUL JONGSEONG NIEUN-PANSIOS
-11C9;CM # HANGUL JONGSEONG NIEUN-THIEUTH
-11CA;CM # HANGUL JONGSEONG TIKEUT-KIYEOK
-11CB;CM # HANGUL JONGSEONG TIKEUT-RIEUL
-11CC;CM # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
-11CD;CM # HANGUL JONGSEONG RIEUL-NIEUN
-11CE;CM # HANGUL JONGSEONG RIEUL-TIKEUT
-11CF;CM # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
-11D0;CM # HANGUL JONGSEONG SSANGRIEUL
-11D1;CM # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
-11D2;CM # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
-11D3;CM # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
-11D4;CM # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
-11D5;CM # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
-11D6;CM # HANGUL JONGSEONG RIEUL-SSANGSIOS
-11D7;CM # HANGUL JONGSEONG RIEUL-PANSIOS
-11D8;CM # HANGUL JONGSEONG RIEUL-KHIEUKH
-11D9;CM # HANGUL JONGSEONG RIEUL-YEORINHIEUH
-11DA;CM # HANGUL JONGSEONG MIEUM-KIYEOK
-11DB;CM # HANGUL JONGSEONG MIEUM-RIEUL
-11DC;CM # HANGUL JONGSEONG MIEUM-PIEUP
-11DD;CM # HANGUL JONGSEONG MIEUM-SIOS
-11DE;CM # HANGUL JONGSEONG MIEUM-SSANGSIOS
-11DF;CM # HANGUL JONGSEONG MIEUM-PANSIOS
-11E0;CM # HANGUL JONGSEONG MIEUM-CHIEUCH
-11E1;CM # HANGUL JONGSEONG MIEUM-HIEUH
-11E2;CM # HANGUL JONGSEONG KAPYEOUNMIEUM
-11E3;CM # HANGUL JONGSEONG PIEUP-RIEUL
-11E4;CM # HANGUL JONGSEONG PIEUP-PHIEUPH
-11E5;CM # HANGUL JONGSEONG PIEUP-HIEUH
-11E6;CM # HANGUL JONGSEONG KAPYEOUNPIEUP
-11E7;CM # HANGUL JONGSEONG SIOS-KIYEOK
-11E8;CM # HANGUL JONGSEONG SIOS-TIKEUT
-11E9;CM # HANGUL JONGSEONG SIOS-RIEUL
-11EA;CM # HANGUL JONGSEONG SIOS-PIEUP
-11EB;CM # HANGUL JONGSEONG PANSIOS
-11EC;CM # HANGUL JONGSEONG IEUNG-KIYEOK
-11ED;CM # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
-11EE;CM # HANGUL JONGSEONG SSANGIEUNG
-11EF;CM # HANGUL JONGSEONG IEUNG-KHIEUKH
-11F0;CM # HANGUL JONGSEONG YESIEUNG
-11F1;CM # HANGUL JONGSEONG YESIEUNG-SIOS
-11F2;CM # HANGUL JONGSEONG YESIEUNG-PANSIOS
-11F3;CM # HANGUL JONGSEONG PHIEUPH-PIEUP
-11F4;CM # HANGUL JONGSEONG KAPYEOUNPHIEUPH
-11F5;CM # HANGUL JONGSEONG HIEUH-NIEUN
-11F6;CM # HANGUL JONGSEONG HIEUH-RIEUL
-11F7;CM # HANGUL JONGSEONG HIEUH-MIEUM
-11F8;CM # HANGUL JONGSEONG HIEUH-PIEUP
-11F9;CM # HANGUL JONGSEONG YEORINHIEUH
+1160;ID # HANGUL JUNGSEONG FILLER
+1161;ID # HANGUL JUNGSEONG A
+1162;ID # HANGUL JUNGSEONG AE
+1163;ID # HANGUL JUNGSEONG YA
+1164;ID # HANGUL JUNGSEONG YAE
+1165;ID # HANGUL JUNGSEONG EO
+1166;ID # HANGUL JUNGSEONG E
+1167;ID # HANGUL JUNGSEONG YEO
+1168;ID # HANGUL JUNGSEONG YE
+1169;ID # HANGUL JUNGSEONG O
+116A;ID # HANGUL JUNGSEONG WA
+116B;ID # HANGUL JUNGSEONG WAE
+116C;ID # HANGUL JUNGSEONG OE
+116D;ID # HANGUL JUNGSEONG YO
+116E;ID # HANGUL JUNGSEONG U
+116F;ID # HANGUL JUNGSEONG WEO
+1170;ID # HANGUL JUNGSEONG WE
+1171;ID # HANGUL JUNGSEONG WI
+1172;ID # HANGUL JUNGSEONG YU
+1173;ID # HANGUL JUNGSEONG EU
+1174;ID # HANGUL JUNGSEONG YI
+1175;ID # HANGUL JUNGSEONG I
+1176;ID # HANGUL JUNGSEONG A-O
+1177;ID # HANGUL JUNGSEONG A-U
+1178;ID # HANGUL JUNGSEONG YA-O
+1179;ID # HANGUL JUNGSEONG YA-YO
+117A;ID # HANGUL JUNGSEONG EO-O
+117B;ID # HANGUL JUNGSEONG EO-U
+117C;ID # HANGUL JUNGSEONG EO-EU
+117D;ID # HANGUL JUNGSEONG YEO-O
+117E;ID # HANGUL JUNGSEONG YEO-U
+117F;ID # HANGUL JUNGSEONG O-EO
+1180;ID # HANGUL JUNGSEONG O-E
+1181;ID # HANGUL JUNGSEONG O-YE
+1182;ID # HANGUL JUNGSEONG O-O
+1183;ID # HANGUL JUNGSEONG O-U
+1184;ID # HANGUL JUNGSEONG YO-YA
+1185;ID # HANGUL JUNGSEONG YO-YAE
+1186;ID # HANGUL JUNGSEONG YO-YEO
+1187;ID # HANGUL JUNGSEONG YO-O
+1188;ID # HANGUL JUNGSEONG YO-I
+1189;ID # HANGUL JUNGSEONG U-A
+118A;ID # HANGUL JUNGSEONG U-AE
+118B;ID # HANGUL JUNGSEONG U-EO-EU
+118C;ID # HANGUL JUNGSEONG U-YE
+118D;ID # HANGUL JUNGSEONG U-U
+118E;ID # HANGUL JUNGSEONG YU-A
+118F;ID # HANGUL JUNGSEONG YU-EO
+1190;ID # HANGUL JUNGSEONG YU-E
+1191;ID # HANGUL JUNGSEONG YU-YEO
+1192;ID # HANGUL JUNGSEONG YU-YE
+1193;ID # HANGUL JUNGSEONG YU-U
+1194;ID # HANGUL JUNGSEONG YU-I
+1195;ID # HANGUL JUNGSEONG EU-U
+1196;ID # HANGUL JUNGSEONG EU-EU
+1197;ID # HANGUL JUNGSEONG YI-U
+1198;ID # HANGUL JUNGSEONG I-A
+1199;ID # HANGUL JUNGSEONG I-YA
+119A;ID # HANGUL JUNGSEONG I-O
+119B;ID # HANGUL JUNGSEONG I-U
+119C;ID # HANGUL JUNGSEONG I-EU
+119D;ID # HANGUL JUNGSEONG I-ARAEA
+119E;ID # HANGUL JUNGSEONG ARAEA
+119F;ID # HANGUL JUNGSEONG ARAEA-EO
+11A0;ID # HANGUL JUNGSEONG ARAEA-U
+11A1;ID # HANGUL JUNGSEONG ARAEA-I
+11A2;ID # HANGUL JUNGSEONG SSANGARAEA
+11A8;ID # HANGUL JONGSEONG KIYEOK
+11A9;ID # HANGUL JONGSEONG SSANGKIYEOK
+11AA;ID # HANGUL JONGSEONG KIYEOK-SIOS
+11AB;ID # HANGUL JONGSEONG NIEUN
+11AC;ID # HANGUL JONGSEONG NIEUN-CIEUC
+11AD;ID # HANGUL JONGSEONG NIEUN-HIEUH
+11AE;ID # HANGUL JONGSEONG TIKEUT
+11AF;ID # HANGUL JONGSEONG RIEUL
+11B0;ID # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1;ID # HANGUL JONGSEONG RIEUL-MIEUM
+11B2;ID # HANGUL JONGSEONG RIEUL-PIEUP
+11B3;ID # HANGUL JONGSEONG RIEUL-SIOS
+11B4;ID # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5;ID # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6;ID # HANGUL JONGSEONG RIEUL-HIEUH
+11B7;ID # HANGUL JONGSEONG MIEUM
+11B8;ID # HANGUL JONGSEONG PIEUP
+11B9;ID # HANGUL JONGSEONG PIEUP-SIOS
+11BA;ID # HANGUL JONGSEONG SIOS
+11BB;ID # HANGUL JONGSEONG SSANGSIOS
+11BC;ID # HANGUL JONGSEONG IEUNG
+11BD;ID # HANGUL JONGSEONG CIEUC
+11BE;ID # HANGUL JONGSEONG CHIEUCH
+11BF;ID # HANGUL JONGSEONG KHIEUKH
+11C0;ID # HANGUL JONGSEONG THIEUTH
+11C1;ID # HANGUL JONGSEONG PHIEUPH
+11C2;ID # HANGUL JONGSEONG HIEUH
+11C3;ID # HANGUL JONGSEONG KIYEOK-RIEUL
+11C4;ID # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+11C5;ID # HANGUL JONGSEONG NIEUN-KIYEOK
+11C6;ID # HANGUL JONGSEONG NIEUN-TIKEUT
+11C7;ID # HANGUL JONGSEONG NIEUN-SIOS
+11C8;ID # HANGUL JONGSEONG NIEUN-PANSIOS
+11C9;ID # HANGUL JONGSEONG NIEUN-THIEUTH
+11CA;ID # HANGUL JONGSEONG TIKEUT-KIYEOK
+11CB;ID # HANGUL JONGSEONG TIKEUT-RIEUL
+11CC;ID # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+11CD;ID # HANGUL JONGSEONG RIEUL-NIEUN
+11CE;ID # HANGUL JONGSEONG RIEUL-TIKEUT
+11CF;ID # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+11D0;ID # HANGUL JONGSEONG SSANGRIEUL
+11D1;ID # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+11D2;ID # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+11D3;ID # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+11D4;ID # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+11D5;ID # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+11D6;ID # HANGUL JONGSEONG RIEUL-SSANGSIOS
+11D7;ID # HANGUL JONGSEONG RIEUL-PANSIOS
+11D8;ID # HANGUL JONGSEONG RIEUL-KHIEUKH
+11D9;ID # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+11DA;ID # HANGUL JONGSEONG MIEUM-KIYEOK
+11DB;ID # HANGUL JONGSEONG MIEUM-RIEUL
+11DC;ID # HANGUL JONGSEONG MIEUM-PIEUP
+11DD;ID # HANGUL JONGSEONG MIEUM-SIOS
+11DE;ID # HANGUL JONGSEONG MIEUM-SSANGSIOS
+11DF;ID # HANGUL JONGSEONG MIEUM-PANSIOS
+11E0;ID # HANGUL JONGSEONG MIEUM-CHIEUCH
+11E1;ID # HANGUL JONGSEONG MIEUM-HIEUH
+11E2;ID # HANGUL JONGSEONG KAPYEOUNMIEUM
+11E3;ID # HANGUL JONGSEONG PIEUP-RIEUL
+11E4;ID # HANGUL JONGSEONG PIEUP-PHIEUPH
+11E5;ID # HANGUL JONGSEONG PIEUP-HIEUH
+11E6;ID # HANGUL JONGSEONG KAPYEOUNPIEUP
+11E7;ID # HANGUL JONGSEONG SIOS-KIYEOK
+11E8;ID # HANGUL JONGSEONG SIOS-TIKEUT
+11E9;ID # HANGUL JONGSEONG SIOS-RIEUL
+11EA;ID # HANGUL JONGSEONG SIOS-PIEUP
+11EB;ID # HANGUL JONGSEONG PANSIOS
+11EC;ID # HANGUL JONGSEONG IEUNG-KIYEOK
+11ED;ID # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+11EE;ID # HANGUL JONGSEONG SSANGIEUNG
+11EF;ID # HANGUL JONGSEONG IEUNG-KHIEUKH
+11F0;ID # HANGUL JONGSEONG YESIEUNG
+11F1;ID # HANGUL JONGSEONG YESIEUNG-SIOS
+11F2;ID # HANGUL JONGSEONG YESIEUNG-PANSIOS
+11F3;ID # HANGUL JONGSEONG PHIEUPH-PIEUP
+11F4;ID # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+11F5;ID # HANGUL JONGSEONG HIEUH-NIEUN
+11F6;ID # HANGUL JONGSEONG HIEUH-RIEUL
+11F7;ID # HANGUL JONGSEONG HIEUH-MIEUM
+11F8;ID # HANGUL JONGSEONG HIEUH-PIEUP
+11F9;ID # HANGUL JONGSEONG YEORINHIEUH
1200;AL # ETHIOPIC SYLLABLE HA
1201;AL # ETHIOPIC SYLLABLE HU
1202;AL # ETHIOPIC SYLLABLE HI
@@ -4563,8 +4648,8 @@
17B1;SA # KHMER INDEPENDENT VOWEL QOO TYPE ONE
17B2;SA # KHMER INDEPENDENT VOWEL QOO TYPE TWO
17B3;SA # KHMER INDEPENDENT VOWEL QAU
-17B4;CM # KHMER VOWEL INHERENT AQ
-17B5;CM # KHMER VOWEL INHERENT AA
+17B4;SA # KHMER VOWEL INHERENT AQ
+17B5;SA # KHMER VOWEL INHERENT AA
17B6;CM # KHMER VOWEL SIGN AA
17B7;CM # KHMER VOWEL SIGN I
17B8;CM # KHMER VOWEL SIGN II
@@ -4604,6 +4689,7 @@
17DA;NS # KHMER SIGN KOOMUUT
17DB;PR # KHMER CURRENCY SYMBOL RIEL
17DC;AL # KHMER SIGN AVAKRAHASANYA
+17DD;CM # KHMER SIGN ATTHACAN
17E0;NU # KHMER DIGIT ZERO
17E1;NU # KHMER DIGIT ONE
17E2;NU # KHMER DIGIT TWO
@@ -4614,6 +4700,16 @@
17E7;NU # KHMER DIGIT SEVEN
17E8;NU # KHMER DIGIT EIGHT
17E9;NU # KHMER DIGIT NINE
+17F0;AL # KHMER SYMBOL LEK ATTAK SON
+17F1;AL # KHMER SYMBOL LEK ATTAK MUOY
+17F2;AL # KHMER SYMBOL LEK ATTAK PII
+17F3;AL # KHMER SYMBOL LEK ATTAK BEI
+17F4;AL # KHMER SYMBOL LEK ATTAK BUON
+17F5;AL # KHMER SYMBOL LEK ATTAK PRAM
+17F6;AL # KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7;AL # KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8;AL # KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9;AL # KHMER SYMBOL LEK ATTAK PRAM-BUON
1800;AL # MONGOLIAN BIRGA
1801;AL # MONGOLIAN ELLIPSIS
1802;AL # MONGOLIAN COMMA
@@ -4628,7 +4724,7 @@
180B;CM # MONGOLIAN FREE VARIATION SELECTOR ONE
180C;CM # MONGOLIAN FREE VARIATION SELECTOR TWO
180D;CM # MONGOLIAN FREE VARIATION SELECTOR THREE
-180E;CM # MONGOLIAN VOWEL SEPARATOR
+180E;GL # MONGOLIAN VOWEL SEPARATOR
1810;NU # MONGOLIAN DIGIT ZERO
1811;NU # MONGOLIAN DIGIT ONE
1812;NU # MONGOLIAN DIGIT TWO
@@ -4769,6 +4865,247 @@
18A7;AL # MONGOLIAN LETTER ALI GALI HALF YA
18A8;AL # MONGOLIAN LETTER MANCHU ALI GALI BHA
18A9;CM # MONGOLIAN LETTER ALI GALI DAGALGA
+1900;AL # LIMBU VOWEL-CARRIER LETTER
+1901;AL # LIMBU LETTER KA
+1902;AL # LIMBU LETTER KHA
+1903;AL # LIMBU LETTER GA
+1904;AL # LIMBU LETTER GHA
+1905;AL # LIMBU LETTER NGA
+1906;AL # LIMBU LETTER CA
+1907;AL # LIMBU LETTER CHA
+1908;AL # LIMBU LETTER JA
+1909;AL # LIMBU LETTER JHA
+190A;AL # LIMBU LETTER YAN
+190B;AL # LIMBU LETTER TA
+190C;AL # LIMBU LETTER THA
+190D;AL # LIMBU LETTER DA
+190E;AL # LIMBU LETTER DHA
+190F;AL # LIMBU LETTER NA
+1910;AL # LIMBU LETTER PA
+1911;AL # LIMBU LETTER PHA
+1912;AL # LIMBU LETTER BA
+1913;AL # LIMBU LETTER BHA
+1914;AL # LIMBU LETTER MA
+1915;AL # LIMBU LETTER YA
+1916;AL # LIMBU LETTER RA
+1917;AL # LIMBU LETTER LA
+1918;AL # LIMBU LETTER WA
+1919;AL # LIMBU LETTER SHA
+191A;AL # LIMBU LETTER SSA
+191B;AL # LIMBU LETTER SA
+191C;AL # LIMBU LETTER HA
+1920;CM # LIMBU VOWEL SIGN A
+1921;CM # LIMBU VOWEL SIGN I
+1922;CM # LIMBU VOWEL SIGN U
+1923;CM # LIMBU VOWEL SIGN EE
+1924;CM # LIMBU VOWEL SIGN AI
+1925;CM # LIMBU VOWEL SIGN OO
+1926;CM # LIMBU VOWEL SIGN AU
+1927;CM # LIMBU VOWEL SIGN E
+1928;CM # LIMBU VOWEL SIGN O
+1929;CM # LIMBU SUBJOINED LETTER YA
+192A;CM # LIMBU SUBJOINED LETTER RA
+192B;CM # LIMBU SUBJOINED LETTER WA
+1930;CM # LIMBU SMALL LETTER KA
+1931;CM # LIMBU SMALL LETTER NGA
+1932;CM # LIMBU SMALL LETTER ANUSVARA
+1933;CM # LIMBU SMALL LETTER TA
+1934;CM # LIMBU SMALL LETTER NA
+1935;CM # LIMBU SMALL LETTER PA
+1936;CM # LIMBU SMALL LETTER MA
+1937;CM # LIMBU SMALL LETTER RA
+1938;CM # LIMBU SMALL LETTER LA
+1939;CM # LIMBU SIGN MUKPHRENG
+193A;CM # LIMBU SIGN KEMPHRENG
+193B;CM # LIMBU SIGN SA-I
+1940;AL # LIMBU SIGN LOO
+1944;EX # LIMBU EXCLAMATION MARK
+1945;EX # LIMBU QUESTION MARK
+1946;NU # LIMBU DIGIT ZERO
+1947;NU # LIMBU DIGIT ONE
+1948;NU # LIMBU DIGIT TWO
+1949;NU # LIMBU DIGIT THREE
+194A;NU # LIMBU DIGIT FOUR
+194B;NU # LIMBU DIGIT FIVE
+194C;NU # LIMBU DIGIT SIX
+194D;NU # LIMBU DIGIT SEVEN
+194E;NU # LIMBU DIGIT EIGHT
+194F;NU # LIMBU DIGIT NINE
+1950;AL # TAI LE LETTER KA
+1951;AL # TAI LE LETTER XA
+1952;AL # TAI LE LETTER NGA
+1953;AL # TAI LE LETTER TSA
+1954;AL # TAI LE LETTER SA
+1955;AL # TAI LE LETTER YA
+1956;AL # TAI LE LETTER TA
+1957;AL # TAI LE LETTER THA
+1958;AL # TAI LE LETTER LA
+1959;AL # TAI LE LETTER PA
+195A;AL # TAI LE LETTER PHA
+195B;AL # TAI LE LETTER MA
+195C;AL # TAI LE LETTER FA
+195D;AL # TAI LE LETTER VA
+195E;AL # TAI LE LETTER HA
+195F;AL # TAI LE LETTER QA
+1960;AL # TAI LE LETTER KHA
+1961;AL # TAI LE LETTER TSHA
+1962;AL # TAI LE LETTER NA
+1963;AL # TAI LE LETTER A
+1964;AL # TAI LE LETTER I
+1965;AL # TAI LE LETTER EE
+1966;AL # TAI LE LETTER EH
+1967;AL # TAI LE LETTER U
+1968;AL # TAI LE LETTER OO
+1969;AL # TAI LE LETTER O
+196A;AL # TAI LE LETTER UE
+196B;AL # TAI LE LETTER E
+196C;AL # TAI LE LETTER AUE
+196D;AL # TAI LE LETTER AI
+1970;AL # TAI LE LETTER TONE-2
+1971;AL # TAI LE LETTER TONE-3
+1972;AL # TAI LE LETTER TONE-4
+1973;AL # TAI LE LETTER TONE-5
+1974;AL # TAI LE LETTER TONE-6
+19E0;AL # KHMER SYMBOL PATHAMASAT
+19E1;AL # KHMER SYMBOL MUOY KOET
+19E2;AL # KHMER SYMBOL PII KOET
+19E3;AL # KHMER SYMBOL BEI KOET
+19E4;AL # KHMER SYMBOL BUON KOET
+19E5;AL # KHMER SYMBOL PRAM KOET
+19E6;AL # KHMER SYMBOL PRAM-MUOY KOET
+19E7;AL # KHMER SYMBOL PRAM-PII KOET
+19E8;AL # KHMER SYMBOL PRAM-BEI KOET
+19E9;AL # KHMER SYMBOL PRAM-BUON KOET
+19EA;AL # KHMER SYMBOL DAP KOET
+19EB;AL # KHMER SYMBOL DAP-MUOY KOET
+19EC;AL # KHMER SYMBOL DAP-PII KOET
+19ED;AL # KHMER SYMBOL DAP-BEI KOET
+19EE;AL # KHMER SYMBOL DAP-BUON KOET
+19EF;AL # KHMER SYMBOL DAP-PRAM KOET
+19F0;AL # KHMER SYMBOL TUTEYASAT
+19F1;AL # KHMER SYMBOL MUOY ROC
+19F2;AL # KHMER SYMBOL PII ROC
+19F3;AL # KHMER SYMBOL BEI ROC
+19F4;AL # KHMER SYMBOL BUON ROC
+19F5;AL # KHMER SYMBOL PRAM ROC
+19F6;AL # KHMER SYMBOL PRAM-MUOY ROC
+19F7;AL # KHMER SYMBOL PRAM-PII ROC
+19F8;AL # KHMER SYMBOL PRAM-BEI ROC
+19F9;AL # KHMER SYMBOL PRAM-BUON ROC
+19FA;AL # KHMER SYMBOL DAP ROC
+19FB;AL # KHMER SYMBOL DAP-MUOY ROC
+19FC;AL # KHMER SYMBOL DAP-PII ROC
+19FD;AL # KHMER SYMBOL DAP-BEI ROC
+19FE;AL # KHMER SYMBOL DAP-BUON ROC
+19FF;AL # KHMER SYMBOL DAP-PRAM ROC
+1D00;AL # LATIN LETTER SMALL CAPITAL A
+1D01;AL # LATIN LETTER SMALL CAPITAL AE
+1D02;AL # LATIN SMALL LETTER TURNED AE
+1D03;AL # LATIN LETTER SMALL CAPITAL BARRED B
+1D04;AL # LATIN LETTER SMALL CAPITAL C
+1D05;AL # LATIN LETTER SMALL CAPITAL D
+1D06;AL # LATIN LETTER SMALL CAPITAL ETH
+1D07;AL # LATIN LETTER SMALL CAPITAL E
+1D08;AL # LATIN SMALL LETTER TURNED OPEN E
+1D09;AL # LATIN SMALL LETTER TURNED I
+1D0A;AL # LATIN LETTER SMALL CAPITAL J
+1D0B;AL # LATIN LETTER SMALL CAPITAL K
+1D0C;AL # LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D;AL # LATIN LETTER SMALL CAPITAL M
+1D0E;AL # LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F;AL # LATIN LETTER SMALL CAPITAL O
+1D10;AL # LATIN LETTER SMALL CAPITAL OPEN O
+1D11;AL # LATIN SMALL LETTER SIDEWAYS O
+1D12;AL # LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13;AL # LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14;AL # LATIN SMALL LETTER TURNED OE
+1D15;AL # LATIN LETTER SMALL CAPITAL OU
+1D16;AL # LATIN SMALL LETTER TOP HALF O
+1D17;AL # LATIN SMALL LETTER BOTTOM HALF O
+1D18;AL # LATIN LETTER SMALL CAPITAL P
+1D19;AL # LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A;AL # LATIN LETTER SMALL CAPITAL TURNED R
+1D1B;AL # LATIN LETTER SMALL CAPITAL T
+1D1C;AL # LATIN LETTER SMALL CAPITAL U
+1D1D;AL # LATIN SMALL LETTER SIDEWAYS U
+1D1E;AL # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F;AL # LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20;AL # LATIN LETTER SMALL CAPITAL V
+1D21;AL # LATIN LETTER SMALL CAPITAL W
+1D22;AL # LATIN LETTER SMALL CAPITAL Z
+1D23;AL # LATIN LETTER SMALL CAPITAL EZH
+1D24;AL # LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25;AL # LATIN LETTER AIN
+1D26;AL # GREEK LETTER SMALL CAPITAL GAMMA
+1D27;AL # GREEK LETTER SMALL CAPITAL LAMDA
+1D28;AL # GREEK LETTER SMALL CAPITAL PI
+1D29;AL # GREEK LETTER SMALL CAPITAL RHO
+1D2A;AL # GREEK LETTER SMALL CAPITAL PSI
+1D2B;AL # CYRILLIC LETTER SMALL CAPITAL EL
+1D2C;AL # MODIFIER LETTER CAPITAL A
+1D2D;AL # MODIFIER LETTER CAPITAL AE
+1D2E;AL # MODIFIER LETTER CAPITAL B
+1D2F;AL # MODIFIER LETTER CAPITAL BARRED B
+1D30;AL # MODIFIER LETTER CAPITAL D
+1D31;AL # MODIFIER LETTER CAPITAL E
+1D32;AL # MODIFIER LETTER CAPITAL REVERSED E
+1D33;AL # MODIFIER LETTER CAPITAL G
+1D34;AL # MODIFIER LETTER CAPITAL H
+1D35;AL # MODIFIER LETTER CAPITAL I
+1D36;AL # MODIFIER LETTER CAPITAL J
+1D37;AL # MODIFIER LETTER CAPITAL K
+1D38;AL # MODIFIER LETTER CAPITAL L
+1D39;AL # MODIFIER LETTER CAPITAL M
+1D3A;AL # MODIFIER LETTER CAPITAL N
+1D3B;AL # MODIFIER LETTER CAPITAL REVERSED N
+1D3C;AL # MODIFIER LETTER CAPITAL O
+1D3D;AL # MODIFIER LETTER CAPITAL OU
+1D3E;AL # MODIFIER LETTER CAPITAL P
+1D3F;AL # MODIFIER LETTER CAPITAL R
+1D40;AL # MODIFIER LETTER CAPITAL T
+1D41;AL # MODIFIER LETTER CAPITAL U
+1D42;AL # MODIFIER LETTER CAPITAL W
+1D43;AL # MODIFIER LETTER SMALL A
+1D44;AL # MODIFIER LETTER SMALL TURNED A
+1D45;AL # MODIFIER LETTER SMALL ALPHA
+1D46;AL # MODIFIER LETTER SMALL TURNED AE
+1D47;AL # MODIFIER LETTER SMALL B
+1D48;AL # MODIFIER LETTER SMALL D
+1D49;AL # MODIFIER LETTER SMALL E
+1D4A;AL # MODIFIER LETTER SMALL SCHWA
+1D4B;AL # MODIFIER LETTER SMALL OPEN E
+1D4C;AL # MODIFIER LETTER SMALL TURNED OPEN E
+1D4D;AL # MODIFIER LETTER SMALL G
+1D4E;AL # MODIFIER LETTER SMALL TURNED I
+1D4F;AL # MODIFIER LETTER SMALL K
+1D50;AL # MODIFIER LETTER SMALL M
+1D51;AL # MODIFIER LETTER SMALL ENG
+1D52;AL # MODIFIER LETTER SMALL O
+1D53;AL # MODIFIER LETTER SMALL OPEN O
+1D54;AL # MODIFIER LETTER SMALL TOP HALF O
+1D55;AL # MODIFIER LETTER SMALL BOTTOM HALF O
+1D56;AL # MODIFIER LETTER SMALL P
+1D57;AL # MODIFIER LETTER SMALL T
+1D58;AL # MODIFIER LETTER SMALL U
+1D59;AL # MODIFIER LETTER SMALL SIDEWAYS U
+1D5A;AL # MODIFIER LETTER SMALL TURNED M
+1D5B;AL # MODIFIER LETTER SMALL V
+1D5C;AL # MODIFIER LETTER SMALL AIN
+1D5D;AL # MODIFIER LETTER SMALL BETA
+1D5E;AL # MODIFIER LETTER SMALL GREEK GAMMA
+1D5F;AL # MODIFIER LETTER SMALL DELTA
+1D60;AL # MODIFIER LETTER SMALL GREEK PHI
+1D61;AL # MODIFIER LETTER SMALL CHI
+1D62;AL # LATIN SUBSCRIPT SMALL LETTER I
+1D63;AL # LATIN SUBSCRIPT SMALL LETTER R
+1D64;AL # LATIN SUBSCRIPT SMALL LETTER U
+1D65;AL # LATIN SUBSCRIPT SMALL LETTER V
+1D66;AL # GREEK SUBSCRIPT SMALL LETTER BETA
+1D67;AL # GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68;AL # GREEK SUBSCRIPT SMALL LETTER RHO
+1D69;AL # GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A;AL # GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B;AL # LATIN SMALL LETTER UE
1E00;AL # LATIN CAPITAL LETTER A WITH RING BELOW
1E01;AL # LATIN SMALL LETTER A WITH RING BELOW
1E02;AL # LATIN CAPITAL LETTER B WITH DOT ABOVE
@@ -5316,7 +5653,7 @@
2041;AL # CARET INSERTION POINT
2042;AL # ASTERISM
2043;AL # HYPHEN BULLET
-2044;NS # FRACTION SLASH
+2044;IS # FRACTION SLASH
2045;OP # LEFT SQUARE BRACKET WITH QUILL
2046;CL # RIGHT SQUARE BRACKET WITH QUILL
2047;AL # DOUBLE QUESTION MARK
@@ -5331,9 +5668,11 @@
2050;AL # CLOSE UP
2051;AL # TWO ASTERISKS ALIGNED VERTICALLY
2052;AL # COMMERCIAL MINUS SIGN
+2053;AL # SWUNG DASH
+2054;AL # INVERTED UNDERTIE
2057;AL # QUADRUPLE PRIME
205F;BA # MEDIUM MATHEMATICAL SPACE
-2060;GL # WORD JOINER
+2060;WJ # WORD JOINER
2061;AL # FUNCTION APPLICATION
2062;AL # INVISIBLE TIMES
2063;AL # INVISIBLE SEPARATOR
@@ -5476,6 +5815,7 @@
2138;AL # DALET SYMBOL
2139;AL # INFORMATION SOURCE
213A;AL # ROTATED CAPITAL Q
+213B;AL # FACSIMILE SIGN
213D;AL # DOUBLE-STRUCK SMALL GAMMA
213E;AL # DOUBLE-STRUCK CAPITAL GAMMA
213F;AL # DOUBLE-STRUCK CAPITAL PI
@@ -6115,6 +6455,8 @@
23CC;AL # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
23CD;AL # SQUARE FOOT
23CE;AL # RETURN SYMBOL
+23CF;AL # EJECT SYMBOL
+23D0;AL # VERTICAL LINE EXTENSION
2400;AL # SYMBOL FOR NULL
2401;AL # SYMBOL FOR START OF HEADING
2402;AL # SYMBOL FOR START OF TEXT
@@ -6324,6 +6666,7 @@
24FC;AI # DOUBLE CIRCLED DIGIT EIGHT
24FD;AI # DOUBLE CIRCLED DIGIT NINE
24FE;AI # DOUBLE CIRCLED NUMBER TEN
+24FF;AL # NEGATIVE CIRCLED DIGIT ZERO
2500;AI # BOX DRAWINGS LIGHT HORIZONTAL
2501;AI # BOX DRAWINGS HEAVY HORIZONTAL
2502;AI # BOX DRAWINGS LIGHT VERTICAL
@@ -6600,6 +6943,8 @@
2611;AL # BALLOT BOX WITH CHECK
2612;AL # BALLOT BOX WITH X
2613;AL # SALTIRE
+2614;AI # UMBRELLA WITH RAIN DROPS
+2615;AI # HOT BEVERAGE
2616;AI # WHITE SHOGI PIECE
2617;AI # BLACK SHOGI PIECE
2619;AL # REVERSED ROTATED FLORAL HEART BULLET
@@ -6713,6 +7058,16 @@
2687;AL # WHITE CIRCLE WITH TWO DOTS
2688;AL # BLACK CIRCLE WITH WHITE DOT RIGHT
2689;AL # BLACK CIRCLE WITH TWO WHITE DOTS
+268A;AL # MONOGRAM FOR YANG
+268B;AL # MONOGRAM FOR YIN
+268C;AL # DIGRAM FOR GREATER YANG
+268D;AL # DIGRAM FOR LESSER YIN
+268E;AL # DIGRAM FOR LESSER YANG
+268F;AL # DIGRAM FOR GREATER YIN
+2690;AL # WHITE FLAG
+2691;AL # BLACK FLAG
+26A0;AL # WARNING SIGN
+26A1;AL # HIGH VOLTAGE SIGN
2701;AL # UPPER BLADE SCISSORS
2702;AL # BLACK SCISSORS
2703;AL # LOWER BLADE SCISSORS
@@ -7699,6 +8054,20 @@
2AFD;AL # DOUBLE SOLIDUS OPERATOR
2AFE;AL # WHITE VERTICAL BAR
2AFF;AL # N-ARY WHITE VERTICAL BAR
+2B00;AL # NORTH EAST WHITE ARROW
+2B01;AL # NORTH WEST WHITE ARROW
+2B02;AL # SOUTH EAST WHITE ARROW
+2B03;AL # SOUTH WEST WHITE ARROW
+2B04;AL # LEFT RIGHT WHITE ARROW
+2B05;AL # LEFTWARDS BLACK ARROW
+2B06;AL # UPWARDS BLACK ARROW
+2B07;AL # DOWNWARDS BLACK ARROW
+2B08;AL # NORTH EAST BLACK ARROW
+2B09;AL # NORTH WEST BLACK ARROW
+2B0A;AL # SOUTH EAST BLACK ARROW
+2B0B;AL # SOUTH WEST BLACK ARROW
+2B0C;AL # LEFT RIGHT BLACK ARROW
+2B0D;AL # UP DOWN BLACK ARROW
2E80;ID # CJK RADICAL REPEAT
2E81;ID # CJK RADICAL CLIFF
2E82;ID # CJK RADICAL SECOND ONE
@@ -8289,9 +8658,9 @@
30F9;ID # KATAKANA LETTER VE
30FA;ID # KATAKANA LETTER VO
30FB;NS # KATAKANA MIDDLE DOT
-30FC;ID # KATAKANA-HIRAGANA PROLONGED SOUND MARK
+30FC;NS # KATAKANA-HIRAGANA PROLONGED SOUND MARK
30FD;NS # KATAKANA ITERATION MARK
-30FE;ID # KATAKANA VOICED ITERATION MARK
+30FE;NS # KATAKANA VOICED ITERATION MARK
30FF;ID # KATAKANA DIGRAPH KOTO
3105;ID # BOPOMOFO LETTER B
3106;ID # BOPOMOFO LETTER P
@@ -8512,6 +8881,8 @@
321A;ID # PARENTHESIZED HANGUL PHIEUPH A
321B;ID # PARENTHESIZED HANGUL HIEUH A
321C;ID # PARENTHESIZED HANGUL CIEUC U
+321D;ID # PARENTHESIZED KOREAN CHARACTER OJEON
+321E;ID # PARENTHESIZED KOREAN CHARACTER O HU
3220;ID # PARENTHESIZED IDEOGRAPH ONE
3221;ID # PARENTHESIZED IDEOGRAPH TWO
3222;ID # PARENTHESIZED IDEOGRAPH THREE
@@ -8548,6 +8919,7 @@
3241;ID # PARENTHESIZED IDEOGRAPH REST
3242;ID # PARENTHESIZED IDEOGRAPH SELF
3243;ID # PARENTHESIZED IDEOGRAPH REACH
+3250;ID # PARTNERSHIP SIGN
3251;ID # CIRCLED NUMBER TWENTY ONE
3252;ID # CIRCLED NUMBER TWENTY TWO
3253;ID # CIRCLED NUMBER TWENTY THREE
@@ -8591,6 +8963,8 @@
3279;ID # CIRCLED HANGUL THIEUTH A
327A;ID # CIRCLED HANGUL PHIEUPH A
327B;ID # CIRCLED HANGUL HIEUH A
+327C;ID # CIRCLED KOREAN CHARACTER CHAMKO
+327D;ID # CIRCLED KOREAN CHARACTER JUEUI
327F;ID # KOREAN STANDARD SYMBOL
3280;ID # CIRCLED IDEOGRAPH ONE
3281;ID # CIRCLED IDEOGRAPH TWO
@@ -8668,6 +9042,10 @@
32C9;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
32CA;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
32CB;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC;ID # SQUARE HG
+32CD;ID # SQUARE ERG
+32CE;ID # SQUARE EV
+32CF;ID # LIMITED LIABILITY SIGN
32D0;ID # CIRCLED KATAKANA A
32D1;ID # CIRCLED KATAKANA I
32D2;ID # CIRCLED KATAKANA U
@@ -8834,6 +9212,10 @@
3374;ID # SQUARE BAR
3375;ID # SQUARE OV
3376;ID # SQUARE PC
+3377;ID # SQUARE DM
+3378;ID # SQUARE DM SQUARED
+3379;ID # SQUARE DM CUBED
+337A;ID # SQUARE IU
337B;ID # SQUARE ERA NAME HEISEI
337C;ID # SQUARE ERA NAME SYOUWA
337D;ID # SQUARE ERA NAME TAISYOU
@@ -8933,6 +9315,8 @@
33DB;ID # SQUARE SR
33DC;ID # SQUARE SV
33DD;ID # SQUARE WB
+33DE;ID # SQUARE V OVER M
+33DF;ID # SQUARE A OVER M
33E0;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
33E1;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
33E2;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
@@ -8964,7 +9348,72 @@
33FC;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
33FD;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
33FE;ID # IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF;ID # SQUARE GAL
3400..4DB5;ID # <CJK Ideograph Extension A, First>..<CJK Ideograph Extension A, Last>
+4DC0;AL # HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1;AL # HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2;AL # HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3;AL # HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4;AL # HEXAGRAM FOR WAITING
+4DC5;AL # HEXAGRAM FOR CONFLICT
+4DC6;AL # HEXAGRAM FOR THE ARMY
+4DC7;AL # HEXAGRAM FOR HOLDING TOGETHER
+4DC8;AL # HEXAGRAM FOR SMALL TAMING
+4DC9;AL # HEXAGRAM FOR TREADING
+4DCA;AL # HEXAGRAM FOR PEACE
+4DCB;AL # HEXAGRAM FOR STANDSTILL
+4DCC;AL # HEXAGRAM FOR FELLOWSHIP
+4DCD;AL # HEXAGRAM FOR GREAT POSSESSION
+4DCE;AL # HEXAGRAM FOR MODESTY
+4DCF;AL # HEXAGRAM FOR ENTHUSIASM
+4DD0;AL # HEXAGRAM FOR FOLLOWING
+4DD1;AL # HEXAGRAM FOR WORK ON THE DECAYED
+4DD2;AL # HEXAGRAM FOR APPROACH
+4DD3;AL # HEXAGRAM FOR CONTEMPLATION
+4DD4;AL # HEXAGRAM FOR BITING THROUGH
+4DD5;AL # HEXAGRAM FOR GRACE
+4DD6;AL # HEXAGRAM FOR SPLITTING APART
+4DD7;AL # HEXAGRAM FOR RETURN
+4DD8;AL # HEXAGRAM FOR INNOCENCE
+4DD9;AL # HEXAGRAM FOR GREAT TAMING
+4DDA;AL # HEXAGRAM FOR MOUTH CORNERS
+4DDB;AL # HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC;AL # HEXAGRAM FOR THE ABYSMAL WATER
+4DDD;AL # HEXAGRAM FOR THE CLINGING FIRE
+4DDE;AL # HEXAGRAM FOR INFLUENCE
+4DDF;AL # HEXAGRAM FOR DURATION
+4DE0;AL # HEXAGRAM FOR RETREAT
+4DE1;AL # HEXAGRAM FOR GREAT POWER
+4DE2;AL # HEXAGRAM FOR PROGRESS
+4DE3;AL # HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4;AL # HEXAGRAM FOR THE FAMILY
+4DE5;AL # HEXAGRAM FOR OPPOSITION
+4DE6;AL # HEXAGRAM FOR OBSTRUCTION
+4DE7;AL # HEXAGRAM FOR DELIVERANCE
+4DE8;AL # HEXAGRAM FOR DECREASE
+4DE9;AL # HEXAGRAM FOR INCREASE
+4DEA;AL # HEXAGRAM FOR BREAKTHROUGH
+4DEB;AL # HEXAGRAM FOR COMING TO MEET
+4DEC;AL # HEXAGRAM FOR GATHERING TOGETHER
+4DED;AL # HEXAGRAM FOR PUSHING UPWARD
+4DEE;AL # HEXAGRAM FOR OPPRESSION
+4DEF;AL # HEXAGRAM FOR THE WELL
+4DF0;AL # HEXAGRAM FOR REVOLUTION
+4DF1;AL # HEXAGRAM FOR THE CAULDRON
+4DF2;AL # HEXAGRAM FOR THE AROUSING THUNDER
+4DF3;AL # HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4;AL # HEXAGRAM FOR DEVELOPMENT
+4DF5;AL # HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6;AL # HEXAGRAM FOR ABUNDANCE
+4DF7;AL # HEXAGRAM FOR THE WANDERER
+4DF8;AL # HEXAGRAM FOR THE GENTLE WIND
+4DF9;AL # HEXAGRAM FOR THE JOYOUS LAKE
+4DFA;AL # HEXAGRAM FOR DISPERSION
+4DFB;AL # HEXAGRAM FOR LIMITATION
+4DFC;AL # HEXAGRAM FOR INNER TRUTH
+4DFD;AL # HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE;AL # HEXAGRAM FOR AFTER COMPLETION
+4DFF;AL # HEXAGRAM FOR BEFORE COMPLETION
4E00..9FA5;ID # <CJK Ideograph, First>..<CJK Ideograph, Last>
A000;ID # YI SYLLABLE IT
A001;ID # YI SYLLABLE IX
@@ -11204,6 +11653,7 @@ FDF9;AL # ARABIC LIGATURE SALLA ISOLATED FORM
FDFA;AL # ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
FDFB;AL # ARABIC LIGATURE JALLAJALALOUHOU
FDFC;PO # RIAL SIGN
+FDFD;AL # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
FE00;CM # VARIATION SELECTOR-1
FE01;CM # VARIATION SELECTOR-2
FE02;CM # VARIATION SELECTOR-3
@@ -11247,6 +11697,8 @@ FE43;OP # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
FE44;CL # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
FE45;ID # SESAME DOT
FE46;ID # WHITE SESAME DOT
+FE47;OP # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48;CL # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
FE49;ID # DASHED OVERLINE
FE4A;ID # CENTRELINE OVERLINE
FE4B;ID # WAVY OVERLINE
@@ -11420,7 +11872,7 @@ FEF9;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
FEFA;AL # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
FEFB;AL # ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
FEFC;AL # ARABIC LIGATURE LAM WITH ALEF FINAL FORM
-FEFF;GL # ZERO WIDTH NO-BREAK SPACE
+FEFF;WJ # ZERO WIDTH NO-BREAK SPACE
FF01;EX # FULLWIDTH EXCLAMATION MARK
FF02;ID # FULLWIDTH QUOTATION MARK
FF03;ID # FULLWIDTH NUMBER SIGN
@@ -11651,6 +12103,274 @@ FFFA;CM # INTERLINEAR ANNOTATION SEPARATOR
FFFB;CM # INTERLINEAR ANNOTATION TERMINATOR
FFFC;CB # OBJECT REPLACEMENT CHARACTER
FFFD;AI # REPLACEMENT CHARACTER
+10000;AL # LINEAR B SYLLABLE B008 A
+10001;AL # LINEAR B SYLLABLE B038 E
+10002;AL # LINEAR B SYLLABLE B028 I
+10003;AL # LINEAR B SYLLABLE B061 O
+10004;AL # LINEAR B SYLLABLE B010 U
+10005;AL # LINEAR B SYLLABLE B001 DA
+10006;AL # LINEAR B SYLLABLE B045 DE
+10007;AL # LINEAR B SYLLABLE B007 DI
+10008;AL # LINEAR B SYLLABLE B014 DO
+10009;AL # LINEAR B SYLLABLE B051 DU
+1000A;AL # LINEAR B SYLLABLE B057 JA
+1000B;AL # LINEAR B SYLLABLE B046 JE
+1000D;AL # LINEAR B SYLLABLE B036 JO
+1000E;AL # LINEAR B SYLLABLE B065 JU
+1000F;AL # LINEAR B SYLLABLE B077 KA
+10010;AL # LINEAR B SYLLABLE B044 KE
+10011;AL # LINEAR B SYLLABLE B067 KI
+10012;AL # LINEAR B SYLLABLE B070 KO
+10013;AL # LINEAR B SYLLABLE B081 KU
+10014;AL # LINEAR B SYLLABLE B080 MA
+10015;AL # LINEAR B SYLLABLE B013 ME
+10016;AL # LINEAR B SYLLABLE B073 MI
+10017;AL # LINEAR B SYLLABLE B015 MO
+10018;AL # LINEAR B SYLLABLE B023 MU
+10019;AL # LINEAR B SYLLABLE B006 NA
+1001A;AL # LINEAR B SYLLABLE B024 NE
+1001B;AL # LINEAR B SYLLABLE B030 NI
+1001C;AL # LINEAR B SYLLABLE B052 NO
+1001D;AL # LINEAR B SYLLABLE B055 NU
+1001E;AL # LINEAR B SYLLABLE B003 PA
+1001F;AL # LINEAR B SYLLABLE B072 PE
+10020;AL # LINEAR B SYLLABLE B039 PI
+10021;AL # LINEAR B SYLLABLE B011 PO
+10022;AL # LINEAR B SYLLABLE B050 PU
+10023;AL # LINEAR B SYLLABLE B016 QA
+10024;AL # LINEAR B SYLLABLE B078 QE
+10025;AL # LINEAR B SYLLABLE B021 QI
+10026;AL # LINEAR B SYLLABLE B032 QO
+10028;AL # LINEAR B SYLLABLE B060 RA
+10029;AL # LINEAR B SYLLABLE B027 RE
+1002A;AL # LINEAR B SYLLABLE B053 RI
+1002B;AL # LINEAR B SYLLABLE B002 RO
+1002C;AL # LINEAR B SYLLABLE B026 RU
+1002D;AL # LINEAR B SYLLABLE B031 SA
+1002E;AL # LINEAR B SYLLABLE B009 SE
+1002F;AL # LINEAR B SYLLABLE B041 SI
+10030;AL # LINEAR B SYLLABLE B012 SO
+10031;AL # LINEAR B SYLLABLE B058 SU
+10032;AL # LINEAR B SYLLABLE B059 TA
+10033;AL # LINEAR B SYLLABLE B004 TE
+10034;AL # LINEAR B SYLLABLE B037 TI
+10035;AL # LINEAR B SYLLABLE B005 TO
+10036;AL # LINEAR B SYLLABLE B069 TU
+10037;AL # LINEAR B SYLLABLE B054 WA
+10038;AL # LINEAR B SYLLABLE B075 WE
+10039;AL # LINEAR B SYLLABLE B040 WI
+1003A;AL # LINEAR B SYLLABLE B042 WO
+1003C;AL # LINEAR B SYLLABLE B017 ZA
+1003D;AL # LINEAR B SYLLABLE B074 ZE
+1003F;AL # LINEAR B SYLLABLE B020 ZO
+10040;AL # LINEAR B SYLLABLE B025 A2
+10041;AL # LINEAR B SYLLABLE B043 A3
+10042;AL # LINEAR B SYLLABLE B085 AU
+10043;AL # LINEAR B SYLLABLE B071 DWE
+10044;AL # LINEAR B SYLLABLE B090 DWO
+10045;AL # LINEAR B SYLLABLE B048 NWA
+10046;AL # LINEAR B SYLLABLE B029 PU2
+10047;AL # LINEAR B SYLLABLE B062 PTE
+10048;AL # LINEAR B SYLLABLE B076 RA2
+10049;AL # LINEAR B SYLLABLE B033 RA3
+1004A;AL # LINEAR B SYLLABLE B068 RO2
+1004B;AL # LINEAR B SYLLABLE B066 TA2
+1004C;AL # LINEAR B SYLLABLE B087 TWE
+1004D;AL # LINEAR B SYLLABLE B091 TWO
+10050;AL # LINEAR B SYMBOL B018
+10051;AL # LINEAR B SYMBOL B019
+10052;AL # LINEAR B SYMBOL B022
+10053;AL # LINEAR B SYMBOL B034
+10054;AL # LINEAR B SYMBOL B047
+10055;AL # LINEAR B SYMBOL B049
+10056;AL # LINEAR B SYMBOL B056
+10057;AL # LINEAR B SYMBOL B063
+10058;AL # LINEAR B SYMBOL B064
+10059;AL # LINEAR B SYMBOL B079
+1005A;AL # LINEAR B SYMBOL B082
+1005B;AL # LINEAR B SYMBOL B083
+1005C;AL # LINEAR B SYMBOL B086
+1005D;AL # LINEAR B SYMBOL B089
+10080;AL # LINEAR B IDEOGRAM B100 MAN
+10081;AL # LINEAR B IDEOGRAM B102 WOMAN
+10082;AL # LINEAR B IDEOGRAM B104 DEER
+10083;AL # LINEAR B IDEOGRAM B105 EQUID
+10084;AL # LINEAR B IDEOGRAM B105F MARE
+10085;AL # LINEAR B IDEOGRAM B105M STALLION
+10086;AL # LINEAR B IDEOGRAM B106F EWE
+10087;AL # LINEAR B IDEOGRAM B106M RAM
+10088;AL # LINEAR B IDEOGRAM B107F SHE-GOAT
+10089;AL # LINEAR B IDEOGRAM B107M HE-GOAT
+1008A;AL # LINEAR B IDEOGRAM B108F SOW
+1008B;AL # LINEAR B IDEOGRAM B108M BOAR
+1008C;AL # LINEAR B IDEOGRAM B109F COW
+1008D;AL # LINEAR B IDEOGRAM B109M BULL
+1008E;AL # LINEAR B IDEOGRAM B120 WHEAT
+1008F;AL # LINEAR B IDEOGRAM B121 BARLEY
+10090;AL # LINEAR B IDEOGRAM B122 OLIVE
+10091;AL # LINEAR B IDEOGRAM B123 SPICE
+10092;AL # LINEAR B IDEOGRAM B125 CYPERUS
+10093;AL # LINEAR B MONOGRAM B127 KAPO
+10094;AL # LINEAR B MONOGRAM B128 KANAKO
+10095;AL # LINEAR B IDEOGRAM B130 OIL
+10096;AL # LINEAR B IDEOGRAM B131 WINE
+10097;AL # LINEAR B IDEOGRAM B132
+10098;AL # LINEAR B MONOGRAM B133 AREPA
+10099;AL # LINEAR B MONOGRAM B135 MERI
+1009A;AL # LINEAR B IDEOGRAM B140 BRONZE
+1009B;AL # LINEAR B IDEOGRAM B141 GOLD
+1009C;AL # LINEAR B IDEOGRAM B142
+1009D;AL # LINEAR B IDEOGRAM B145 WOOL
+1009E;AL # LINEAR B IDEOGRAM B146
+1009F;AL # LINEAR B IDEOGRAM B150
+100A0;AL # LINEAR B IDEOGRAM B151 HORN
+100A1;AL # LINEAR B IDEOGRAM B152
+100A2;AL # LINEAR B IDEOGRAM B153
+100A3;AL # LINEAR B IDEOGRAM B154
+100A4;AL # LINEAR B MONOGRAM B156 TURO2
+100A5;AL # LINEAR B IDEOGRAM B157
+100A6;AL # LINEAR B IDEOGRAM B158
+100A7;AL # LINEAR B IDEOGRAM B159 CLOTH
+100A8;AL # LINEAR B IDEOGRAM B160
+100A9;AL # LINEAR B IDEOGRAM B161
+100AA;AL # LINEAR B IDEOGRAM B162 GARMENT
+100AB;AL # LINEAR B IDEOGRAM B163 ARMOUR
+100AC;AL # LINEAR B IDEOGRAM B164
+100AD;AL # LINEAR B IDEOGRAM B165
+100AE;AL # LINEAR B IDEOGRAM B166
+100AF;AL # LINEAR B IDEOGRAM B167
+100B0;AL # LINEAR B IDEOGRAM B168
+100B1;AL # LINEAR B IDEOGRAM B169
+100B2;AL # LINEAR B IDEOGRAM B170
+100B3;AL # LINEAR B IDEOGRAM B171
+100B4;AL # LINEAR B IDEOGRAM B172
+100B5;AL # LINEAR B IDEOGRAM B173 MONTH
+100B6;AL # LINEAR B IDEOGRAM B174
+100B7;AL # LINEAR B IDEOGRAM B176 TREE
+100B8;AL # LINEAR B IDEOGRAM B177
+100B9;AL # LINEAR B IDEOGRAM B178
+100BA;AL # LINEAR B IDEOGRAM B179
+100BB;AL # LINEAR B IDEOGRAM B180
+100BC;AL # LINEAR B IDEOGRAM B181
+100BD;AL # LINEAR B IDEOGRAM B182
+100BE;AL # LINEAR B IDEOGRAM B183
+100BF;AL # LINEAR B IDEOGRAM B184
+100C0;AL # LINEAR B IDEOGRAM B185
+100C1;AL # LINEAR B IDEOGRAM B189
+100C2;AL # LINEAR B IDEOGRAM B190
+100C3;AL # LINEAR B IDEOGRAM B191 HELMET
+100C4;AL # LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5;AL # LINEAR B IDEOGRAM B225 BATHTUB
+100C6;AL # LINEAR B IDEOGRAM B230 SPEAR
+100C7;AL # LINEAR B IDEOGRAM B231 ARROW
+100C8;AL # LINEAR B IDEOGRAM B232
+100C9;AL # LINEAR B IDEOGRAM B233 SWORD
+100CA;AL # LINEAR B IDEOGRAM B234
+100CB;AL # LINEAR B IDEOGRAM B236
+100CC;AL # LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD;AL # LINEAR B IDEOGRAM B241 CHARIOT
+100CE;AL # LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF;AL # LINEAR B IDEOGRAM B243 WHEEL
+100D0;AL # LINEAR B IDEOGRAM B245
+100D1;AL # LINEAR B IDEOGRAM B246
+100D2;AL # LINEAR B MONOGRAM B247 DIPTE
+100D3;AL # LINEAR B IDEOGRAM B248
+100D4;AL # LINEAR B IDEOGRAM B249
+100D5;AL # LINEAR B IDEOGRAM B251
+100D6;AL # LINEAR B IDEOGRAM B252
+100D7;AL # LINEAR B IDEOGRAM B253
+100D8;AL # LINEAR B IDEOGRAM B254 DART
+100D9;AL # LINEAR B IDEOGRAM B255
+100DA;AL # LINEAR B IDEOGRAM B256
+100DB;AL # LINEAR B IDEOGRAM B257
+100DC;AL # LINEAR B IDEOGRAM B258
+100DD;AL # LINEAR B IDEOGRAM B259
+100DE;AL # LINEAR B IDEOGRAM VESSEL B155
+100DF;AL # LINEAR B IDEOGRAM VESSEL B200
+100E0;AL # LINEAR B IDEOGRAM VESSEL B201
+100E1;AL # LINEAR B IDEOGRAM VESSEL B202
+100E2;AL # LINEAR B IDEOGRAM VESSEL B203
+100E3;AL # LINEAR B IDEOGRAM VESSEL B204
+100E4;AL # LINEAR B IDEOGRAM VESSEL B205
+100E5;AL # LINEAR B IDEOGRAM VESSEL B206
+100E6;AL # LINEAR B IDEOGRAM VESSEL B207
+100E7;AL # LINEAR B IDEOGRAM VESSEL B208
+100E8;AL # LINEAR B IDEOGRAM VESSEL B209
+100E9;AL # LINEAR B IDEOGRAM VESSEL B210
+100EA;AL # LINEAR B IDEOGRAM VESSEL B211
+100EB;AL # LINEAR B IDEOGRAM VESSEL B212
+100EC;AL # LINEAR B IDEOGRAM VESSEL B213
+100ED;AL # LINEAR B IDEOGRAM VESSEL B214
+100EE;AL # LINEAR B IDEOGRAM VESSEL B215
+100EF;AL # LINEAR B IDEOGRAM VESSEL B216
+100F0;AL # LINEAR B IDEOGRAM VESSEL B217
+100F1;AL # LINEAR B IDEOGRAM VESSEL B218
+100F2;AL # LINEAR B IDEOGRAM VESSEL B219
+100F3;AL # LINEAR B IDEOGRAM VESSEL B221
+100F4;AL # LINEAR B IDEOGRAM VESSEL B222
+100F5;AL # LINEAR B IDEOGRAM VESSEL B226
+100F6;AL # LINEAR B IDEOGRAM VESSEL B227
+100F7;AL # LINEAR B IDEOGRAM VESSEL B228
+100F8;AL # LINEAR B IDEOGRAM VESSEL B229
+100F9;AL # LINEAR B IDEOGRAM VESSEL B250
+100FA;AL # LINEAR B IDEOGRAM VESSEL B305
+10100;BA # AEGEAN WORD SEPARATOR LINE
+10101;BA # AEGEAN WORD SEPARATOR DOT
+10102;BA # AEGEAN CHECK MARK
+10107;AL # AEGEAN NUMBER ONE
+10108;AL # AEGEAN NUMBER TWO
+10109;AL # AEGEAN NUMBER THREE
+1010A;AL # AEGEAN NUMBER FOUR
+1010B;AL # AEGEAN NUMBER FIVE
+1010C;AL # AEGEAN NUMBER SIX
+1010D;AL # AEGEAN NUMBER SEVEN
+1010E;AL # AEGEAN NUMBER EIGHT
+1010F;AL # AEGEAN NUMBER NINE
+10110;AL # AEGEAN NUMBER TEN
+10111;AL # AEGEAN NUMBER TWENTY
+10112;AL # AEGEAN NUMBER THIRTY
+10113;AL # AEGEAN NUMBER FORTY
+10114;AL # AEGEAN NUMBER FIFTY
+10115;AL # AEGEAN NUMBER SIXTY
+10116;AL # AEGEAN NUMBER SEVENTY
+10117;AL # AEGEAN NUMBER EIGHTY
+10118;AL # AEGEAN NUMBER NINETY
+10119;AL # AEGEAN NUMBER ONE HUNDRED
+1011A;AL # AEGEAN NUMBER TWO HUNDRED
+1011B;AL # AEGEAN NUMBER THREE HUNDRED
+1011C;AL # AEGEAN NUMBER FOUR HUNDRED
+1011D;AL # AEGEAN NUMBER FIVE HUNDRED
+1011E;AL # AEGEAN NUMBER SIX HUNDRED
+1011F;AL # AEGEAN NUMBER SEVEN HUNDRED
+10120;AL # AEGEAN NUMBER EIGHT HUNDRED
+10121;AL # AEGEAN NUMBER NINE HUNDRED
+10122;AL # AEGEAN NUMBER ONE THOUSAND
+10123;AL # AEGEAN NUMBER TWO THOUSAND
+10124;AL # AEGEAN NUMBER THREE THOUSAND
+10125;AL # AEGEAN NUMBER FOUR THOUSAND
+10126;AL # AEGEAN NUMBER FIVE THOUSAND
+10127;AL # AEGEAN NUMBER SIX THOUSAND
+10128;AL # AEGEAN NUMBER SEVEN THOUSAND
+10129;AL # AEGEAN NUMBER EIGHT THOUSAND
+1012A;AL # AEGEAN NUMBER NINE THOUSAND
+1012B;AL # AEGEAN NUMBER TEN THOUSAND
+1012C;AL # AEGEAN NUMBER TWENTY THOUSAND
+1012D;AL # AEGEAN NUMBER THIRTY THOUSAND
+1012E;AL # AEGEAN NUMBER FORTY THOUSAND
+1012F;AL # AEGEAN NUMBER FIFTY THOUSAND
+10130;AL # AEGEAN NUMBER SIXTY THOUSAND
+10131;AL # AEGEAN NUMBER SEVENTY THOUSAND
+10132;AL # AEGEAN NUMBER EIGHTY THOUSAND
+10133;AL # AEGEAN NUMBER NINETY THOUSAND
+10137;AL # AEGEAN WEIGHT BASE UNIT
+10138;AL # AEGEAN WEIGHT FIRST SUBUNIT
+10139;AL # AEGEAN WEIGHT SECOND SUBUNIT
+1013A;AL # AEGEAN WEIGHT THIRD SUBUNIT
+1013B;AL # AEGEAN WEIGHT FOURTH SUBUNIT
+1013C;AL # AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D;AL # AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E;AL # AEGEAN MEASURE SECOND SUBUNIT
+1013F;AL # AEGEAN MEASURE THIRD SUBUNIT
10300;AL # OLD ITALIC LETTER A
10301;AL # OLD ITALIC LETTER BE
10302;AL # OLD ITALIC LETTER KE
@@ -11713,6 +12433,37 @@ FFFD;AI # REPLACEMENT CHARACTER
10348;AL # GOTHIC LETTER HWAIR
10349;AL # GOTHIC LETTER OTHAL
1034A;AL # GOTHIC LETTER NINE HUNDRED
+10380;AL # UGARITIC LETTER ALPA
+10381;AL # UGARITIC LETTER BETA
+10382;AL # UGARITIC LETTER GAMLA
+10383;AL # UGARITIC LETTER KHA
+10384;AL # UGARITIC LETTER DELTA
+10385;AL # UGARITIC LETTER HO
+10386;AL # UGARITIC LETTER WO
+10387;AL # UGARITIC LETTER ZETA
+10388;AL # UGARITIC LETTER HOTA
+10389;AL # UGARITIC LETTER TET
+1038A;AL # UGARITIC LETTER YOD
+1038B;AL # UGARITIC LETTER KAF
+1038C;AL # UGARITIC LETTER SHIN
+1038D;AL # UGARITIC LETTER LAMDA
+1038E;AL # UGARITIC LETTER MEM
+1038F;AL # UGARITIC LETTER DHAL
+10390;AL # UGARITIC LETTER NUN
+10391;AL # UGARITIC LETTER ZU
+10392;AL # UGARITIC LETTER SAMKA
+10393;AL # UGARITIC LETTER AIN
+10394;AL # UGARITIC LETTER PU
+10395;AL # UGARITIC LETTER SADE
+10396;AL # UGARITIC LETTER QOPA
+10397;AL # UGARITIC LETTER RASHA
+10398;AL # UGARITIC LETTER THANNA
+10399;AL # UGARITIC LETTER GHAIN
+1039A;AL # UGARITIC LETTER TO
+1039B;AL # UGARITIC LETTER I
+1039C;AL # UGARITIC LETTER U
+1039D;AL # UGARITIC LETTER SSU
+1039F;BA # UGARITIC WORD DIVIDER
10400;AL # DESERET CAPITAL LETTER LONG I
10401;AL # DESERET CAPITAL LETTER LONG E
10402;AL # DESERET CAPITAL LETTER LONG A
@@ -11751,6 +12502,8 @@ FFFD;AI # REPLACEMENT CHARACTER
10423;AL # DESERET CAPITAL LETTER EM
10424;AL # DESERET CAPITAL LETTER EN
10425;AL # DESERET CAPITAL LETTER ENG
+10426;AL # DESERET CAPITAL LETTER OI
+10427;AL # DESERET CAPITAL LETTER EW
10428;AL # DESERET SMALL LETTER LONG I
10429;AL # DESERET SMALL LETTER LONG E
1042A;AL # DESERET SMALL LETTER LONG A
@@ -11789,6 +12542,151 @@ FFFD;AI # REPLACEMENT CHARACTER
1044B;AL # DESERET SMALL LETTER EM
1044C;AL # DESERET SMALL LETTER EN
1044D;AL # DESERET SMALL LETTER ENG
+1044E;AL # DESERET SMALL LETTER OI
+1044F;AL # DESERET SMALL LETTER EW
+10450;AL # SHAVIAN LETTER PEEP
+10451;AL # SHAVIAN LETTER TOT
+10452;AL # SHAVIAN LETTER KICK
+10453;AL # SHAVIAN LETTER FEE
+10454;AL # SHAVIAN LETTER THIGH
+10455;AL # SHAVIAN LETTER SO
+10456;AL # SHAVIAN LETTER SURE
+10457;AL # SHAVIAN LETTER CHURCH
+10458;AL # SHAVIAN LETTER YEA
+10459;AL # SHAVIAN LETTER HUNG
+1045A;AL # SHAVIAN LETTER BIB
+1045B;AL # SHAVIAN LETTER DEAD
+1045C;AL # SHAVIAN LETTER GAG
+1045D;AL # SHAVIAN LETTER VOW
+1045E;AL # SHAVIAN LETTER THEY
+1045F;AL # SHAVIAN LETTER ZOO
+10460;AL # SHAVIAN LETTER MEASURE
+10461;AL # SHAVIAN LETTER JUDGE
+10462;AL # SHAVIAN LETTER WOE
+10463;AL # SHAVIAN LETTER HA-HA
+10464;AL # SHAVIAN LETTER LOLL
+10465;AL # SHAVIAN LETTER MIME
+10466;AL # SHAVIAN LETTER IF
+10467;AL # SHAVIAN LETTER EGG
+10468;AL # SHAVIAN LETTER ASH
+10469;AL # SHAVIAN LETTER ADO
+1046A;AL # SHAVIAN LETTER ON
+1046B;AL # SHAVIAN LETTER WOOL
+1046C;AL # SHAVIAN LETTER OUT
+1046D;AL # SHAVIAN LETTER AH
+1046E;AL # SHAVIAN LETTER ROAR
+1046F;AL # SHAVIAN LETTER NUN
+10470;AL # SHAVIAN LETTER EAT
+10471;AL # SHAVIAN LETTER AGE
+10472;AL # SHAVIAN LETTER ICE
+10473;AL # SHAVIAN LETTER UP
+10474;AL # SHAVIAN LETTER OAK
+10475;AL # SHAVIAN LETTER OOZE
+10476;AL # SHAVIAN LETTER OIL
+10477;AL # SHAVIAN LETTER AWE
+10478;AL # SHAVIAN LETTER ARE
+10479;AL # SHAVIAN LETTER OR
+1047A;AL # SHAVIAN LETTER AIR
+1047B;AL # SHAVIAN LETTER ERR
+1047C;AL # SHAVIAN LETTER ARRAY
+1047D;AL # SHAVIAN LETTER EAR
+1047E;AL # SHAVIAN LETTER IAN
+1047F;AL # SHAVIAN LETTER YEW
+10480;AL # OSMANYA LETTER ALEF
+10481;AL # OSMANYA LETTER BA
+10482;AL # OSMANYA LETTER TA
+10483;AL # OSMANYA LETTER JA
+10484;AL # OSMANYA LETTER XA
+10485;AL # OSMANYA LETTER KHA
+10486;AL # OSMANYA LETTER DEEL
+10487;AL # OSMANYA LETTER RA
+10488;AL # OSMANYA LETTER SA
+10489;AL # OSMANYA LETTER SHIIN
+1048A;AL # OSMANYA LETTER DHA
+1048B;AL # OSMANYA LETTER CAYN
+1048C;AL # OSMANYA LETTER GA
+1048D;AL # OSMANYA LETTER FA
+1048E;AL # OSMANYA LETTER QAAF
+1048F;AL # OSMANYA LETTER KAAF
+10490;AL # OSMANYA LETTER LAAN
+10491;AL # OSMANYA LETTER MIIN
+10492;AL # OSMANYA LETTER NUUN
+10493;AL # OSMANYA LETTER WAW
+10494;AL # OSMANYA LETTER HA
+10495;AL # OSMANYA LETTER YA
+10496;AL # OSMANYA LETTER A
+10497;AL # OSMANYA LETTER E
+10498;AL # OSMANYA LETTER I
+10499;AL # OSMANYA LETTER O
+1049A;AL # OSMANYA LETTER U
+1049B;AL # OSMANYA LETTER AA
+1049C;AL # OSMANYA LETTER EE
+1049D;AL # OSMANYA LETTER OO
+104A0;NU # OSMANYA DIGIT ZERO
+104A1;NU # OSMANYA DIGIT ONE
+104A2;NU # OSMANYA DIGIT TWO
+104A3;NU # OSMANYA DIGIT THREE
+104A4;NU # OSMANYA DIGIT FOUR
+104A5;NU # OSMANYA DIGIT FIVE
+104A6;NU # OSMANYA DIGIT SIX
+104A7;NU # OSMANYA DIGIT SEVEN
+104A8;NU # OSMANYA DIGIT EIGHT
+104A9;NU # OSMANYA DIGIT NINE
+10800;AL # CYPRIOT SYLLABLE A
+10801;AL # CYPRIOT SYLLABLE E
+10802;AL # CYPRIOT SYLLABLE I
+10803;AL # CYPRIOT SYLLABLE O
+10804;AL # CYPRIOT SYLLABLE U
+10805;AL # CYPRIOT SYLLABLE JA
+10808;AL # CYPRIOT SYLLABLE JO
+1080A;AL # CYPRIOT SYLLABLE KA
+1080B;AL # CYPRIOT SYLLABLE KE
+1080C;AL # CYPRIOT SYLLABLE KI
+1080D;AL # CYPRIOT SYLLABLE KO
+1080E;AL # CYPRIOT SYLLABLE KU
+1080F;AL # CYPRIOT SYLLABLE LA
+10810;AL # CYPRIOT SYLLABLE LE
+10811;AL # CYPRIOT SYLLABLE LI
+10812;AL # CYPRIOT SYLLABLE LO
+10813;AL # CYPRIOT SYLLABLE LU
+10814;AL # CYPRIOT SYLLABLE MA
+10815;AL # CYPRIOT SYLLABLE ME
+10816;AL # CYPRIOT SYLLABLE MI
+10817;AL # CYPRIOT SYLLABLE MO
+10818;AL # CYPRIOT SYLLABLE MU
+10819;AL # CYPRIOT SYLLABLE NA
+1081A;AL # CYPRIOT SYLLABLE NE
+1081B;AL # CYPRIOT SYLLABLE NI
+1081C;AL # CYPRIOT SYLLABLE NO
+1081D;AL # CYPRIOT SYLLABLE NU
+1081E;AL # CYPRIOT SYLLABLE PA
+1081F;AL # CYPRIOT SYLLABLE PE
+10820;AL # CYPRIOT SYLLABLE PI
+10821;AL # CYPRIOT SYLLABLE PO
+10822;AL # CYPRIOT SYLLABLE PU
+10823;AL # CYPRIOT SYLLABLE RA
+10824;AL # CYPRIOT SYLLABLE RE
+10825;AL # CYPRIOT SYLLABLE RI
+10826;AL # CYPRIOT SYLLABLE RO
+10827;AL # CYPRIOT SYLLABLE RU
+10828;AL # CYPRIOT SYLLABLE SA
+10829;AL # CYPRIOT SYLLABLE SE
+1082A;AL # CYPRIOT SYLLABLE SI
+1082B;AL # CYPRIOT SYLLABLE SO
+1082C;AL # CYPRIOT SYLLABLE SU
+1082D;AL # CYPRIOT SYLLABLE TA
+1082E;AL # CYPRIOT SYLLABLE TE
+1082F;AL # CYPRIOT SYLLABLE TI
+10830;AL # CYPRIOT SYLLABLE TO
+10831;AL # CYPRIOT SYLLABLE TU
+10832;AL # CYPRIOT SYLLABLE WA
+10833;AL # CYPRIOT SYLLABLE WE
+10834;AL # CYPRIOT SYLLABLE WI
+10835;AL # CYPRIOT SYLLABLE WO
+10837;AL # CYPRIOT SYLLABLE XA
+10838;AL # CYPRIOT SYLLABLE XE
+1083C;AL # CYPRIOT SYLLABLE ZA
+1083F;AL # CYPRIOT SYLLABLE ZO
1D000;AL # BYZANTINE MUSICAL SYMBOL PSILI
1D001;AL # BYZANTINE MUSICAL SYMBOL DASEIA
1D002;AL # BYZANTINE MUSICAL SYMBOL PERISPOMENI
@@ -12254,6 +13152,93 @@ FFFD;AI # REPLACEMENT CHARACTER
1D1DB;AL # MUSICAL SYMBOL SCANDICUS FLEXUS
1D1DC;AL # MUSICAL SYMBOL TORCULUS RESUPINUS
1D1DD;AL # MUSICAL SYMBOL PES SUBPUNCTIS
+1D300;AL # MONOGRAM FOR EARTH
+1D301;AL # DIGRAM FOR HEAVENLY EARTH
+1D302;AL # DIGRAM FOR HUMAN EARTH
+1D303;AL # DIGRAM FOR EARTHLY HEAVEN
+1D304;AL # DIGRAM FOR EARTHLY HUMAN
+1D305;AL # DIGRAM FOR EARTH
+1D306;AL # TETRAGRAM FOR CENTRE
+1D307;AL # TETRAGRAM FOR FULL CIRCLE
+1D308;AL # TETRAGRAM FOR MIRED
+1D309;AL # TETRAGRAM FOR BARRIER
+1D30A;AL # TETRAGRAM FOR KEEPING SMALL
+1D30B;AL # TETRAGRAM FOR CONTRARIETY
+1D30C;AL # TETRAGRAM FOR ASCENT
+1D30D;AL # TETRAGRAM FOR OPPOSITION
+1D30E;AL # TETRAGRAM FOR BRANCHING OUT
+1D30F;AL # TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310;AL # TETRAGRAM FOR DIVERGENCE
+1D311;AL # TETRAGRAM FOR YOUTHFULNESS
+1D312;AL # TETRAGRAM FOR INCREASE
+1D313;AL # TETRAGRAM FOR PENETRATION
+1D314;AL # TETRAGRAM FOR REACH
+1D315;AL # TETRAGRAM FOR CONTACT
+1D316;AL # TETRAGRAM FOR HOLDING BACK
+1D317;AL # TETRAGRAM FOR WAITING
+1D318;AL # TETRAGRAM FOR FOLLOWING
+1D319;AL # TETRAGRAM FOR ADVANCE
+1D31A;AL # TETRAGRAM FOR RELEASE
+1D31B;AL # TETRAGRAM FOR RESISTANCE
+1D31C;AL # TETRAGRAM FOR EASE
+1D31D;AL # TETRAGRAM FOR JOY
+1D31E;AL # TETRAGRAM FOR CONTENTION
+1D31F;AL # TETRAGRAM FOR ENDEAVOUR
+1D320;AL # TETRAGRAM FOR DUTIES
+1D321;AL # TETRAGRAM FOR CHANGE
+1D322;AL # TETRAGRAM FOR DECISIVENESS
+1D323;AL # TETRAGRAM FOR BOLD RESOLUTION
+1D324;AL # TETRAGRAM FOR PACKING
+1D325;AL # TETRAGRAM FOR LEGION
+1D326;AL # TETRAGRAM FOR CLOSENESS
+1D327;AL # TETRAGRAM FOR KINSHIP
+1D328;AL # TETRAGRAM FOR GATHERING
+1D329;AL # TETRAGRAM FOR STRENGTH
+1D32A;AL # TETRAGRAM FOR PURITY
+1D32B;AL # TETRAGRAM FOR FULLNESS
+1D32C;AL # TETRAGRAM FOR RESIDENCE
+1D32D;AL # TETRAGRAM FOR LAW OR MODEL
+1D32E;AL # TETRAGRAM FOR RESPONSE
+1D32F;AL # TETRAGRAM FOR GOING TO MEET
+1D330;AL # TETRAGRAM FOR ENCOUNTERS
+1D331;AL # TETRAGRAM FOR STOVE
+1D332;AL # TETRAGRAM FOR GREATNESS
+1D333;AL # TETRAGRAM FOR ENLARGEMENT
+1D334;AL # TETRAGRAM FOR PATTERN
+1D335;AL # TETRAGRAM FOR RITUAL
+1D336;AL # TETRAGRAM FOR FLIGHT
+1D337;AL # TETRAGRAM FOR VASTNESS OR WASTING
+1D338;AL # TETRAGRAM FOR CONSTANCY
+1D339;AL # TETRAGRAM FOR MEASURE
+1D33A;AL # TETRAGRAM FOR ETERNITY
+1D33B;AL # TETRAGRAM FOR UNITY
+1D33C;AL # TETRAGRAM FOR DIMINISHMENT
+1D33D;AL # TETRAGRAM FOR CLOSED MOUTH
+1D33E;AL # TETRAGRAM FOR GUARDEDNESS
+1D33F;AL # TETRAGRAM FOR GATHERING IN
+1D340;AL # TETRAGRAM FOR MASSING
+1D341;AL # TETRAGRAM FOR ACCUMULATION
+1D342;AL # TETRAGRAM FOR EMBELLISHMENT
+1D343;AL # TETRAGRAM FOR DOUBT
+1D344;AL # TETRAGRAM FOR WATCH
+1D345;AL # TETRAGRAM FOR SINKING
+1D346;AL # TETRAGRAM FOR INNER
+1D347;AL # TETRAGRAM FOR DEPARTURE
+1D348;AL # TETRAGRAM FOR DARKENING
+1D349;AL # TETRAGRAM FOR DIMMING
+1D34A;AL # TETRAGRAM FOR EXHAUSTION
+1D34B;AL # TETRAGRAM FOR SEVERANCE
+1D34C;AL # TETRAGRAM FOR STOPPAGE
+1D34D;AL # TETRAGRAM FOR HARDNESS
+1D34E;AL # TETRAGRAM FOR COMPLETION
+1D34F;AL # TETRAGRAM FOR CLOSURE
+1D350;AL # TETRAGRAM FOR FAILURE
+1D351;AL # TETRAGRAM FOR AGGRAVATION
+1D352;AL # TETRAGRAM FOR COMPLIANCE
+1D353;AL # TETRAGRAM FOR ON THE VERGE
+1D354;AL # TETRAGRAM FOR DIFFICULTIES
+1D355;AL # TETRAGRAM FOR LABOURING
+1D356;AL # TETRAGRAM FOR FOSTERING
1D400;AL # MATHEMATICAL BOLD CAPITAL A
1D401;AL # MATHEMATICAL BOLD CAPITAL B
1D402;AL # MATHEMATICAL BOLD CAPITAL C
@@ -12436,6 +13421,7 @@ FFFD;AI # REPLACEMENT CHARACTER
1D4BE;AL # MATHEMATICAL SCRIPT SMALL I
1D4BF;AL # MATHEMATICAL SCRIPT SMALL J
1D4C0;AL # MATHEMATICAL SCRIPT SMALL K
+1D4C1;AL # MATHEMATICAL SCRIPT SMALL L
1D4C2;AL # MATHEMATICAL SCRIPT SMALL M
1D4C3;AL # MATHEMATICAL SCRIPT SMALL N
1D4C5;AL # MATHEMATICAL SCRIPT SMALL P
@@ -13885,5 +14871,245 @@ E007C;CM # TAG VERTICAL LINE
E007D;CM # TAG RIGHT CURLY BRACKET
E007E;CM # TAG TILDE
E007F;CM # CANCEL TAG
+E0100;CM # VARIATION SELECTOR-17
+E0101;CM # VARIATION SELECTOR-18
+E0102;CM # VARIATION SELECTOR-19
+E0103;CM # VARIATION SELECTOR-20
+E0104;CM # VARIATION SELECTOR-21
+E0105;CM # VARIATION SELECTOR-22
+E0106;CM # VARIATION SELECTOR-23
+E0107;CM # VARIATION SELECTOR-24
+E0108;CM # VARIATION SELECTOR-25
+E0109;CM # VARIATION SELECTOR-26
+E010A;CM # VARIATION SELECTOR-27
+E010B;CM # VARIATION SELECTOR-28
+E010C;CM # VARIATION SELECTOR-29
+E010D;CM # VARIATION SELECTOR-30
+E010E;CM # VARIATION SELECTOR-31
+E010F;CM # VARIATION SELECTOR-32
+E0110;CM # VARIATION SELECTOR-33
+E0111;CM # VARIATION SELECTOR-34
+E0112;CM # VARIATION SELECTOR-35
+E0113;CM # VARIATION SELECTOR-36
+E0114;CM # VARIATION SELECTOR-37
+E0115;CM # VARIATION SELECTOR-38
+E0116;CM # VARIATION SELECTOR-39
+E0117;CM # VARIATION SELECTOR-40
+E0118;CM # VARIATION SELECTOR-41
+E0119;CM # VARIATION SELECTOR-42
+E011A;CM # VARIATION SELECTOR-43
+E011B;CM # VARIATION SELECTOR-44
+E011C;CM # VARIATION SELECTOR-45
+E011D;CM # VARIATION SELECTOR-46
+E011E;CM # VARIATION SELECTOR-47
+E011F;CM # VARIATION SELECTOR-48
+E0120;CM # VARIATION SELECTOR-49
+E0121;CM # VARIATION SELECTOR-50
+E0122;CM # VARIATION SELECTOR-51
+E0123;CM # VARIATION SELECTOR-52
+E0124;CM # VARIATION SELECTOR-53
+E0125;CM # VARIATION SELECTOR-54
+E0126;CM # VARIATION SELECTOR-55
+E0127;CM # VARIATION SELECTOR-56
+E0128;CM # VARIATION SELECTOR-57
+E0129;CM # VARIATION SELECTOR-58
+E012A;CM # VARIATION SELECTOR-59
+E012B;CM # VARIATION SELECTOR-60
+E012C;CM # VARIATION SELECTOR-61
+E012D;CM # VARIATION SELECTOR-62
+E012E;CM # VARIATION SELECTOR-63
+E012F;CM # VARIATION SELECTOR-64
+E0130;CM # VARIATION SELECTOR-65
+E0131;CM # VARIATION SELECTOR-66
+E0132;CM # VARIATION SELECTOR-67
+E0133;CM # VARIATION SELECTOR-68
+E0134;CM # VARIATION SELECTOR-69
+E0135;CM # VARIATION SELECTOR-70
+E0136;CM # VARIATION SELECTOR-71
+E0137;CM # VARIATION SELECTOR-72
+E0138;CM # VARIATION SELECTOR-73
+E0139;CM # VARIATION SELECTOR-74
+E013A;CM # VARIATION SELECTOR-75
+E013B;CM # VARIATION SELECTOR-76
+E013C;CM # VARIATION SELECTOR-77
+E013D;CM # VARIATION SELECTOR-78
+E013E;CM # VARIATION SELECTOR-79
+E013F;CM # VARIATION SELECTOR-80
+E0140;CM # VARIATION SELECTOR-81
+E0141;CM # VARIATION SELECTOR-82
+E0142;CM # VARIATION SELECTOR-83
+E0143;CM # VARIATION SELECTOR-84
+E0144;CM # VARIATION SELECTOR-85
+E0145;CM # VARIATION SELECTOR-86
+E0146;CM # VARIATION SELECTOR-87
+E0147;CM # VARIATION SELECTOR-88
+E0148;CM # VARIATION SELECTOR-89
+E0149;CM # VARIATION SELECTOR-90
+E014A;CM # VARIATION SELECTOR-91
+E014B;CM # VARIATION SELECTOR-92
+E014C;CM # VARIATION SELECTOR-93
+E014D;CM # VARIATION SELECTOR-94
+E014E;CM # VARIATION SELECTOR-95
+E014F;CM # VARIATION SELECTOR-96
+E0150;CM # VARIATION SELECTOR-97
+E0151;CM # VARIATION SELECTOR-98
+E0152;CM # VARIATION SELECTOR-99
+E0153;CM # VARIATION SELECTOR-100
+E0154;CM # VARIATION SELECTOR-101
+E0155;CM # VARIATION SELECTOR-102
+E0156;CM # VARIATION SELECTOR-103
+E0157;CM # VARIATION SELECTOR-104
+E0158;CM # VARIATION SELECTOR-105
+E0159;CM # VARIATION SELECTOR-106
+E015A;CM # VARIATION SELECTOR-107
+E015B;CM # VARIATION SELECTOR-108
+E015C;CM # VARIATION SELECTOR-109
+E015D;CM # VARIATION SELECTOR-110
+E015E;CM # VARIATION SELECTOR-111
+E015F;CM # VARIATION SELECTOR-112
+E0160;CM # VARIATION SELECTOR-113
+E0161;CM # VARIATION SELECTOR-114
+E0162;CM # VARIATION SELECTOR-115
+E0163;CM # VARIATION SELECTOR-116
+E0164;CM # VARIATION SELECTOR-117
+E0165;CM # VARIATION SELECTOR-118
+E0166;CM # VARIATION SELECTOR-119
+E0167;CM # VARIATION SELECTOR-120
+E0168;CM # VARIATION SELECTOR-121
+E0169;CM # VARIATION SELECTOR-122
+E016A;CM # VARIATION SELECTOR-123
+E016B;CM # VARIATION SELECTOR-124
+E016C;CM # VARIATION SELECTOR-125
+E016D;CM # VARIATION SELECTOR-126
+E016E;CM # VARIATION SELECTOR-127
+E016F;CM # VARIATION SELECTOR-128
+E0170;CM # VARIATION SELECTOR-129
+E0171;CM # VARIATION SELECTOR-130
+E0172;CM # VARIATION SELECTOR-131
+E0173;CM # VARIATION SELECTOR-132
+E0174;CM # VARIATION SELECTOR-133
+E0175;CM # VARIATION SELECTOR-134
+E0176;CM # VARIATION SELECTOR-135
+E0177;CM # VARIATION SELECTOR-136
+E0178;CM # VARIATION SELECTOR-137
+E0179;CM # VARIATION SELECTOR-138
+E017A;CM # VARIATION SELECTOR-139
+E017B;CM # VARIATION SELECTOR-140
+E017C;CM # VARIATION SELECTOR-141
+E017D;CM # VARIATION SELECTOR-142
+E017E;CM # VARIATION SELECTOR-143
+E017F;CM # VARIATION SELECTOR-144
+E0180;CM # VARIATION SELECTOR-145
+E0181;CM # VARIATION SELECTOR-146
+E0182;CM # VARIATION SELECTOR-147
+E0183;CM # VARIATION SELECTOR-148
+E0184;CM # VARIATION SELECTOR-149
+E0185;CM # VARIATION SELECTOR-150
+E0186;CM # VARIATION SELECTOR-151
+E0187;CM # VARIATION SELECTOR-152
+E0188;CM # VARIATION SELECTOR-153
+E0189;CM # VARIATION SELECTOR-154
+E018A;CM # VARIATION SELECTOR-155
+E018B;CM # VARIATION SELECTOR-156
+E018C;CM # VARIATION SELECTOR-157
+E018D;CM # VARIATION SELECTOR-158
+E018E;CM # VARIATION SELECTOR-159
+E018F;CM # VARIATION SELECTOR-160
+E0190;CM # VARIATION SELECTOR-161
+E0191;CM # VARIATION SELECTOR-162
+E0192;CM # VARIATION SELECTOR-163
+E0193;CM # VARIATION SELECTOR-164
+E0194;CM # VARIATION SELECTOR-165
+E0195;CM # VARIATION SELECTOR-166
+E0196;CM # VARIATION SELECTOR-167
+E0197;CM # VARIATION SELECTOR-168
+E0198;CM # VARIATION SELECTOR-169
+E0199;CM # VARIATION SELECTOR-170
+E019A;CM # VARIATION SELECTOR-171
+E019B;CM # VARIATION SELECTOR-172
+E019C;CM # VARIATION SELECTOR-173
+E019D;CM # VARIATION SELECTOR-174
+E019E;CM # VARIATION SELECTOR-175
+E019F;CM # VARIATION SELECTOR-176
+E01A0;CM # VARIATION SELECTOR-177
+E01A1;CM # VARIATION SELECTOR-178
+E01A2;CM # VARIATION SELECTOR-179
+E01A3;CM # VARIATION SELECTOR-180
+E01A4;CM # VARIATION SELECTOR-181
+E01A5;CM # VARIATION SELECTOR-182
+E01A6;CM # VARIATION SELECTOR-183
+E01A7;CM # VARIATION SELECTOR-184
+E01A8;CM # VARIATION SELECTOR-185
+E01A9;CM # VARIATION SELECTOR-186
+E01AA;CM # VARIATION SELECTOR-187
+E01AB;CM # VARIATION SELECTOR-188
+E01AC;CM # VARIATION SELECTOR-189
+E01AD;CM # VARIATION SELECTOR-190
+E01AE;CM # VARIATION SELECTOR-191
+E01AF;CM # VARIATION SELECTOR-192
+E01B0;CM # VARIATION SELECTOR-193
+E01B1;CM # VARIATION SELECTOR-194
+E01B2;CM # VARIATION SELECTOR-195
+E01B3;CM # VARIATION SELECTOR-196
+E01B4;CM # VARIATION SELECTOR-197
+E01B5;CM # VARIATION SELECTOR-198
+E01B6;CM # VARIATION SELECTOR-199
+E01B7;CM # VARIATION SELECTOR-200
+E01B8;CM # VARIATION SELECTOR-201
+E01B9;CM # VARIATION SELECTOR-202
+E01BA;CM # VARIATION SELECTOR-203
+E01BB;CM # VARIATION SELECTOR-204
+E01BC;CM # VARIATION SELECTOR-205
+E01BD;CM # VARIATION SELECTOR-206
+E01BE;CM # VARIATION SELECTOR-207
+E01BF;CM # VARIATION SELECTOR-208
+E01C0;CM # VARIATION SELECTOR-209
+E01C1;CM # VARIATION SELECTOR-210
+E01C2;CM # VARIATION SELECTOR-211
+E01C3;CM # VARIATION SELECTOR-212
+E01C4;CM # VARIATION SELECTOR-213
+E01C5;CM # VARIATION SELECTOR-214
+E01C6;CM # VARIATION SELECTOR-215
+E01C7;CM # VARIATION SELECTOR-216
+E01C8;CM # VARIATION SELECTOR-217
+E01C9;CM # VARIATION SELECTOR-218
+E01CA;CM # VARIATION SELECTOR-219
+E01CB;CM # VARIATION SELECTOR-220
+E01CC;CM # VARIATION SELECTOR-221
+E01CD;CM # VARIATION SELECTOR-222
+E01CE;CM # VARIATION SELECTOR-223
+E01CF;CM # VARIATION SELECTOR-224
+E01D0;CM # VARIATION SELECTOR-225
+E01D1;CM # VARIATION SELECTOR-226
+E01D2;CM # VARIATION SELECTOR-227
+E01D3;CM # VARIATION SELECTOR-228
+E01D4;CM # VARIATION SELECTOR-229
+E01D5;CM # VARIATION SELECTOR-230
+E01D6;CM # VARIATION SELECTOR-231
+E01D7;CM # VARIATION SELECTOR-232
+E01D8;CM # VARIATION SELECTOR-233
+E01D9;CM # VARIATION SELECTOR-234
+E01DA;CM # VARIATION SELECTOR-235
+E01DB;CM # VARIATION SELECTOR-236
+E01DC;CM # VARIATION SELECTOR-237
+E01DD;CM # VARIATION SELECTOR-238
+E01DE;CM # VARIATION SELECTOR-239
+E01DF;CM # VARIATION SELECTOR-240
+E01E0;CM # VARIATION SELECTOR-241
+E01E1;CM # VARIATION SELECTOR-242
+E01E2;CM # VARIATION SELECTOR-243
+E01E3;CM # VARIATION SELECTOR-244
+E01E4;CM # VARIATION SELECTOR-245
+E01E5;CM # VARIATION SELECTOR-246
+E01E6;CM # VARIATION SELECTOR-247
+E01E7;CM # VARIATION SELECTOR-248
+E01E8;CM # VARIATION SELECTOR-249
+E01E9;CM # VARIATION SELECTOR-250
+E01EA;CM # VARIATION SELECTOR-251
+E01EB;CM # VARIATION SELECTOR-252
+E01EC;CM # VARIATION SELECTOR-253
+E01ED;CM # VARIATION SELECTOR-254
+E01EE;CM # VARIATION SELECTOR-255
+E01EF;CM # VARIATION SELECTOR-256
F0000..FFFFD;XX # <Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
100000..10FFFD;XX # <Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
diff --git a/gnu/usr.bin/perl/lib/unicore/Name.pl b/gnu/usr.bin/perl/lib/unicore/Name.pl
index 2dde9fdd3b1..947bff52267 100644
--- a/gnu/usr.bin/perl/lib/unicore/Name.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Name.pl
@@ -547,6 +547,7 @@ return <<'END';
021E LATIN CAPITAL LETTER H WITH CARON
021F LATIN SMALL LETTER H WITH CARON
0220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
+0221 LATIN SMALL LETTER D WITH CURL
0222 LATIN CAPITAL LETTER OU
0223 LATIN SMALL LETTER OU
0224 LATIN CAPITAL LETTER Z WITH HOOK
@@ -565,6 +566,9 @@ return <<'END';
0231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
0232 LATIN CAPITAL LETTER Y WITH MACRON
0233 LATIN SMALL LETTER Y WITH MACRON
+0234 LATIN SMALL LETTER L WITH CURL
+0235 LATIN SMALL LETTER N WITH CURL
+0236 LATIN SMALL LETTER T WITH CURL
0250 LATIN SMALL LETTER TURNED A
0251 LATIN SMALL LETTER ALPHA
0252 LATIN SMALL LETTER TURNED ALPHA
@@ -659,6 +663,8 @@ return <<'END';
02AB LATIN SMALL LETTER LZ DIGRAPH
02AC LATIN LETTER BILABIAL PERCUSSIVE
02AD LATIN LETTER BIDENTAL PERCUSSIVE
+02AE LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
02B0 MODIFIER LETTER SMALL H
02B1 MODIFIER LETTER SMALL H WITH HOOK
02B2 MODIFIER LETTER SMALL J
@@ -722,6 +728,23 @@ return <<'END';
02EC MODIFIER LETTER VOICING
02ED MODIFIER LETTER UNASPIRATED
02EE MODIFIER LETTER DOUBLE APOSTROPHE
+02EF MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 MODIFIER LETTER LOW UP ARROWHEAD
+02F1 MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 MODIFIER LETTER LOW RING
+02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 MODIFIER LETTER LOW TILDE
+02F8 MODIFIER LETTER RAISED COLON
+02F9 MODIFIER LETTER BEGIN HIGH TONE
+02FA MODIFIER LETTER END HIGH TONE
+02FB MODIFIER LETTER BEGIN LOW TONE
+02FC MODIFIER LETTER END LOW TONE
+02FD MODIFIER LETTER SHELF
+02FE MODIFIER LETTER OPEN SHELF
+02FF MODIFIER LETTER LOW LEFT ARROW
0300 COMBINING GRAVE ACCENT
0301 COMBINING ACUTE ACCENT
0302 COMBINING CIRCUMFLEX ACCENT
@@ -802,6 +825,17 @@ return <<'END';
034D COMBINING LEFT RIGHT ARROW BELOW
034E COMBINING UPWARDS ARROW BELOW
034F COMBINING GRAPHEME JOINER
+0350 COMBINING RIGHT ARROWHEAD ABOVE
+0351 COMBINING LEFT HALF RING ABOVE
+0352 COMBINING FERMATA
+0353 COMBINING X BELOW
+0354 COMBINING LEFT ARROWHEAD BELOW
+0355 COMBINING RIGHT ARROWHEAD BELOW
+0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357 COMBINING RIGHT HALF RING ABOVE
+035D COMBINING DOUBLE BREVE
+035E COMBINING DOUBLE MACRON
+035F COMBINING DOUBLE MACRON BELOW
0360 COMBINING DOUBLE TILDE
0361 COMBINING DOUBLE INVERTED BREVE
0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW
@@ -933,6 +967,11 @@ return <<'END';
03F4 GREEK CAPITAL THETA SYMBOL
03F5 GREEK LUNATE EPSILON SYMBOL
03F6 GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7 GREEK CAPITAL LETTER SHO
+03F8 GREEK SMALL LETTER SHO
+03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL
+03FA GREEK CAPITAL LETTER SAN
+03FB GREEK SMALL LETTER SAN
0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
0401 CYRILLIC CAPITAL LETTER IO
0402 CYRILLIC CAPITAL LETTER DJE
@@ -1363,7 +1402,20 @@ return <<'END';
05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD
05F3 HEBREW PUNCTUATION GERESH
05F4 HEBREW PUNCTUATION GERSHAYIM
+0600 ARABIC NUMBER SIGN
+0601 ARABIC SIGN SANAH
+0602 ARABIC FOOTNOTE MARKER
+0603 ARABIC SIGN SAFHA
060C ARABIC COMMA
+060D ARABIC DATE SEPARATOR
+060E ARABIC POETIC VERSE SIGN
+060F ARABIC SIGN MISRA
+0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+0611 ARABIC SIGN ALAYHE ASSALLAM
+0612 ARABIC SIGN RAHMATULLAH ALAYHE
+0613 ARABIC SIGN RADI ALLAHOU ANHU
+0614 ARABIC SIGN TAKHALLUS
+0615 ARABIC SMALL HIGH TAH
061B ARABIC SEMICOLON
061F ARABIC QUESTION MARK
0621 ARABIC LETTER HAMZA
@@ -1414,6 +1466,9 @@ return <<'END';
0653 ARABIC MADDAH ABOVE
0654 ARABIC HAMZA ABOVE
0655 ARABIC HAMZA BELOW
+0656 ARABIC SUBSCRIPT ALEF
+0657 ARABIC INVERTED DAMMA
+0658 ARABIC MARK NOON GHUNNA
0660 ARABIC-INDIC DIGIT ZERO
0661 ARABIC-INDIC DIGIT ONE
0662 ARABIC-INDIC DIGIT TWO
@@ -1556,6 +1611,8 @@ return <<'END';
06EB ARABIC EMPTY CENTRE HIGH STOP
06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
06ED ARABIC SMALL LOW MEEM
+06EE ARABIC LETTER DAL WITH INVERTED V
+06EF ARABIC LETTER REH WITH INVERTED V
06F0 EXTENDED ARABIC-INDIC DIGIT ZERO
06F1 EXTENDED ARABIC-INDIC DIGIT ONE
06F2 EXTENDED ARABIC-INDIC DIGIT TWO
@@ -1571,6 +1628,7 @@ return <<'END';
06FC ARABIC LETTER GHAIN WITH DOT BELOW
06FD ARABIC SIGN SINDHI AMPERSAND
06FE ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF ARABIC LETTER HEH WITH INVERTED V
0700 SYRIAC END OF PARAGRAPH
0701 SYRIAC SUPRALINEAR FULL STOP
0702 SYRIAC SUBLINEAR FULL STOP
@@ -1615,6 +1673,9 @@ return <<'END';
072A SYRIAC LETTER RISH
072B SYRIAC LETTER SHIN
072C SYRIAC LETTER TAW
+072D SYRIAC LETTER PERSIAN BHETH
+072E SYRIAC LETTER PERSIAN GHAMAL
+072F SYRIAC LETTER PERSIAN DHALATH
0730 SYRIAC PTHAHA ABOVE
0731 SYRIAC PTHAHA BELOW
0732 SYRIAC PTHAHA DOTTED
@@ -1642,6 +1703,9 @@ return <<'END';
0748 SYRIAC OBLIQUE LINE BELOW
0749 SYRIAC MUSIC
074A SYRIAC BARREKH
+074D SYRIAC LETTER SOGDIAN ZHAIN
+074E SYRIAC LETTER SOGDIAN KHAPH
+074F SYRIAC LETTER SOGDIAN FE
0780 THAANA LETTER HAA
0781 THAANA LETTER SHAVIYANI
0782 THAANA LETTER NOONU
@@ -1695,6 +1759,7 @@ return <<'END';
0901 DEVANAGARI SIGN CANDRABINDU
0902 DEVANAGARI SIGN ANUSVARA
0903 DEVANAGARI SIGN VISARGA
+0904 DEVANAGARI LETTER SHORT A
0905 DEVANAGARI LETTER A
0906 DEVANAGARI LETTER AA
0907 DEVANAGARI LETTER I
@@ -1844,6 +1909,7 @@ return <<'END';
09B8 BENGALI LETTER SA
09B9 BENGALI LETTER HA
09BC BENGALI SIGN NUKTA
+09BD BENGALI SIGN AVAGRAHA
09BE BENGALI VOWEL SIGN AA
09BF BENGALI VOWEL SIGN I
09C0 BENGALI VOWEL SIGN II
@@ -1885,7 +1951,9 @@ return <<'END';
09F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
09F9 BENGALI CURRENCY DENOMINATOR SIXTEEN
09FA BENGALI ISSHAR
+0A01 GURMUKHI SIGN ADAK BINDI
0A02 GURMUKHI SIGN BINDI
+0A03 GURMUKHI SIGN VISARGA
0A05 GURMUKHI LETTER A
0A06 GURMUKHI LETTER AA
0A07 GURMUKHI LETTER I
@@ -1970,6 +2038,7 @@ return <<'END';
0A89 GUJARATI LETTER U
0A8A GUJARATI LETTER UU
0A8B GUJARATI LETTER VOCALIC R
+0A8C GUJARATI LETTER VOCALIC L
0A8D GUJARATI VOWEL CANDRA E
0A8F GUJARATI LETTER E
0A90 GUJARATI LETTER AI
@@ -2028,6 +2097,9 @@ return <<'END';
0ACD GUJARATI SIGN VIRAMA
0AD0 GUJARATI OM
0AE0 GUJARATI LETTER VOCALIC RR
+0AE1 GUJARATI LETTER VOCALIC LL
+0AE2 GUJARATI VOWEL SIGN VOCALIC L
+0AE3 GUJARATI VOWEL SIGN VOCALIC LL
0AE6 GUJARATI DIGIT ZERO
0AE7 GUJARATI DIGIT ONE
0AE8 GUJARATI DIGIT TWO
@@ -2038,6 +2110,7 @@ return <<'END';
0AED GUJARATI DIGIT SEVEN
0AEE GUJARATI DIGIT EIGHT
0AEF GUJARATI DIGIT NINE
+0AF1 GUJARATI RUPEE SIGN
0B01 ORIYA SIGN CANDRABINDU
0B02 ORIYA SIGN ANUSVARA
0B03 ORIYA SIGN VISARGA
@@ -2082,6 +2155,7 @@ return <<'END';
0B30 ORIYA LETTER RA
0B32 ORIYA LETTER LA
0B33 ORIYA LETTER LLA
+0B35 ORIYA LETTER VA
0B36 ORIYA LETTER SHA
0B37 ORIYA LETTER SSA
0B38 ORIYA LETTER SA
@@ -2117,6 +2191,7 @@ return <<'END';
0B6E ORIYA DIGIT EIGHT
0B6F ORIYA DIGIT NINE
0B70 ORIYA ISSHAR
+0B71 ORIYA LETTER WA
0B82 TAMIL SIGN ANUSVARA
0B83 TAMIL SIGN VISARGA
0B85 TAMIL LETTER A
@@ -2178,6 +2253,14 @@ return <<'END';
0BF0 TAMIL NUMBER TEN
0BF1 TAMIL NUMBER ONE HUNDRED
0BF2 TAMIL NUMBER ONE THOUSAND
+0BF3 TAMIL DAY SIGN
+0BF4 TAMIL MONTH SIGN
+0BF5 TAMIL YEAR SIGN
+0BF6 TAMIL DEBIT SIGN
+0BF7 TAMIL CREDIT SIGN
+0BF8 TAMIL AS ABOVE SIGN
+0BF9 TAMIL RUPEE SIGN
+0BFA TAMIL NUMBER SIGN
0C01 TELUGU SIGN CANDRABINDU
0C02 TELUGU SIGN ANUSVARA
0C03 TELUGU SIGN VISARGA
@@ -2309,6 +2392,8 @@ return <<'END';
0CB7 KANNADA LETTER SSA
0CB8 KANNADA LETTER SA
0CB9 KANNADA LETTER HA
+0CBC KANNADA SIGN NUKTA
+0CBD KANNADA SIGN AVAGRAHA
0CBE KANNADA VOWEL SIGN AA
0CBF KANNADA VOWEL SIGN I
0CC0 KANNADA VOWEL SIGN II
@@ -4583,6 +4668,7 @@ return <<'END';
17DA KHMER SIGN KOOMUUT
17DB KHMER CURRENCY SYMBOL RIEL
17DC KHMER SIGN AVAKRAHASANYA
+17DD KHMER SIGN ATTHACAN
17E0 KHMER DIGIT ZERO
17E1 KHMER DIGIT ONE
17E2 KHMER DIGIT TWO
@@ -4593,6 +4679,16 @@ return <<'END';
17E7 KHMER DIGIT SEVEN
17E8 KHMER DIGIT EIGHT
17E9 KHMER DIGIT NINE
+17F0 KHMER SYMBOL LEK ATTAK SON
+17F1 KHMER SYMBOL LEK ATTAK MUOY
+17F2 KHMER SYMBOL LEK ATTAK PII
+17F3 KHMER SYMBOL LEK ATTAK BEI
+17F4 KHMER SYMBOL LEK ATTAK BUON
+17F5 KHMER SYMBOL LEK ATTAK PRAM
+17F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7 KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8 KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9 KHMER SYMBOL LEK ATTAK PRAM-BUON
1800 MONGOLIAN BIRGA
1801 MONGOLIAN ELLIPSIS
1802 MONGOLIAN COMMA
@@ -4748,6 +4844,247 @@ return <<'END';
18A7 MONGOLIAN LETTER ALI GALI HALF YA
18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA
18A9 MONGOLIAN LETTER ALI GALI DAGALGA
+1900 LIMBU VOWEL-CARRIER LETTER
+1901 LIMBU LETTER KA
+1902 LIMBU LETTER KHA
+1903 LIMBU LETTER GA
+1904 LIMBU LETTER GHA
+1905 LIMBU LETTER NGA
+1906 LIMBU LETTER CA
+1907 LIMBU LETTER CHA
+1908 LIMBU LETTER JA
+1909 LIMBU LETTER JHA
+190A LIMBU LETTER YAN
+190B LIMBU LETTER TA
+190C LIMBU LETTER THA
+190D LIMBU LETTER DA
+190E LIMBU LETTER DHA
+190F LIMBU LETTER NA
+1910 LIMBU LETTER PA
+1911 LIMBU LETTER PHA
+1912 LIMBU LETTER BA
+1913 LIMBU LETTER BHA
+1914 LIMBU LETTER MA
+1915 LIMBU LETTER YA
+1916 LIMBU LETTER RA
+1917 LIMBU LETTER LA
+1918 LIMBU LETTER WA
+1919 LIMBU LETTER SHA
+191A LIMBU LETTER SSA
+191B LIMBU LETTER SA
+191C LIMBU LETTER HA
+1920 LIMBU VOWEL SIGN A
+1921 LIMBU VOWEL SIGN I
+1922 LIMBU VOWEL SIGN U
+1923 LIMBU VOWEL SIGN EE
+1924 LIMBU VOWEL SIGN AI
+1925 LIMBU VOWEL SIGN OO
+1926 LIMBU VOWEL SIGN AU
+1927 LIMBU VOWEL SIGN E
+1928 LIMBU VOWEL SIGN O
+1929 LIMBU SUBJOINED LETTER YA
+192A LIMBU SUBJOINED LETTER RA
+192B LIMBU SUBJOINED LETTER WA
+1930 LIMBU SMALL LETTER KA
+1931 LIMBU SMALL LETTER NGA
+1932 LIMBU SMALL LETTER ANUSVARA
+1933 LIMBU SMALL LETTER TA
+1934 LIMBU SMALL LETTER NA
+1935 LIMBU SMALL LETTER PA
+1936 LIMBU SMALL LETTER MA
+1937 LIMBU SMALL LETTER RA
+1938 LIMBU SMALL LETTER LA
+1939 LIMBU SIGN MUKPHRENG
+193A LIMBU SIGN KEMPHRENG
+193B LIMBU SIGN SA-I
+1940 LIMBU SIGN LOO
+1944 LIMBU EXCLAMATION MARK
+1945 LIMBU QUESTION MARK
+1946 LIMBU DIGIT ZERO
+1947 LIMBU DIGIT ONE
+1948 LIMBU DIGIT TWO
+1949 LIMBU DIGIT THREE
+194A LIMBU DIGIT FOUR
+194B LIMBU DIGIT FIVE
+194C LIMBU DIGIT SIX
+194D LIMBU DIGIT SEVEN
+194E LIMBU DIGIT EIGHT
+194F LIMBU DIGIT NINE
+1950 TAI LE LETTER KA
+1951 TAI LE LETTER XA
+1952 TAI LE LETTER NGA
+1953 TAI LE LETTER TSA
+1954 TAI LE LETTER SA
+1955 TAI LE LETTER YA
+1956 TAI LE LETTER TA
+1957 TAI LE LETTER THA
+1958 TAI LE LETTER LA
+1959 TAI LE LETTER PA
+195A TAI LE LETTER PHA
+195B TAI LE LETTER MA
+195C TAI LE LETTER FA
+195D TAI LE LETTER VA
+195E TAI LE LETTER HA
+195F TAI LE LETTER QA
+1960 TAI LE LETTER KHA
+1961 TAI LE LETTER TSHA
+1962 TAI LE LETTER NA
+1963 TAI LE LETTER A
+1964 TAI LE LETTER I
+1965 TAI LE LETTER EE
+1966 TAI LE LETTER EH
+1967 TAI LE LETTER U
+1968 TAI LE LETTER OO
+1969 TAI LE LETTER O
+196A TAI LE LETTER UE
+196B TAI LE LETTER E
+196C TAI LE LETTER AUE
+196D TAI LE LETTER AI
+1970 TAI LE LETTER TONE-2
+1971 TAI LE LETTER TONE-3
+1972 TAI LE LETTER TONE-4
+1973 TAI LE LETTER TONE-5
+1974 TAI LE LETTER TONE-6
+19E0 KHMER SYMBOL PATHAMASAT
+19E1 KHMER SYMBOL MUOY KOET
+19E2 KHMER SYMBOL PII KOET
+19E3 KHMER SYMBOL BEI KOET
+19E4 KHMER SYMBOL BUON KOET
+19E5 KHMER SYMBOL PRAM KOET
+19E6 KHMER SYMBOL PRAM-MUOY KOET
+19E7 KHMER SYMBOL PRAM-PII KOET
+19E8 KHMER SYMBOL PRAM-BEI KOET
+19E9 KHMER SYMBOL PRAM-BUON KOET
+19EA KHMER SYMBOL DAP KOET
+19EB KHMER SYMBOL DAP-MUOY KOET
+19EC KHMER SYMBOL DAP-PII KOET
+19ED KHMER SYMBOL DAP-BEI KOET
+19EE KHMER SYMBOL DAP-BUON KOET
+19EF KHMER SYMBOL DAP-PRAM KOET
+19F0 KHMER SYMBOL TUTEYASAT
+19F1 KHMER SYMBOL MUOY ROC
+19F2 KHMER SYMBOL PII ROC
+19F3 KHMER SYMBOL BEI ROC
+19F4 KHMER SYMBOL BUON ROC
+19F5 KHMER SYMBOL PRAM ROC
+19F6 KHMER SYMBOL PRAM-MUOY ROC
+19F7 KHMER SYMBOL PRAM-PII ROC
+19F8 KHMER SYMBOL PRAM-BEI ROC
+19F9 KHMER SYMBOL PRAM-BUON ROC
+19FA KHMER SYMBOL DAP ROC
+19FB KHMER SYMBOL DAP-MUOY ROC
+19FC KHMER SYMBOL DAP-PII ROC
+19FD KHMER SYMBOL DAP-BEI ROC
+19FE KHMER SYMBOL DAP-BUON ROC
+19FF KHMER SYMBOL DAP-PRAM ROC
+1D00 LATIN LETTER SMALL CAPITAL A
+1D01 LATIN LETTER SMALL CAPITAL AE
+1D02 LATIN SMALL LETTER TURNED AE
+1D03 LATIN LETTER SMALL CAPITAL BARRED B
+1D04 LATIN LETTER SMALL CAPITAL C
+1D05 LATIN LETTER SMALL CAPITAL D
+1D06 LATIN LETTER SMALL CAPITAL ETH
+1D07 LATIN LETTER SMALL CAPITAL E
+1D08 LATIN SMALL LETTER TURNED OPEN E
+1D09 LATIN SMALL LETTER TURNED I
+1D0A LATIN LETTER SMALL CAPITAL J
+1D0B LATIN LETTER SMALL CAPITAL K
+1D0C LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D LATIN LETTER SMALL CAPITAL M
+1D0E LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F LATIN LETTER SMALL CAPITAL O
+1D10 LATIN LETTER SMALL CAPITAL OPEN O
+1D11 LATIN SMALL LETTER SIDEWAYS O
+1D12 LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14 LATIN SMALL LETTER TURNED OE
+1D15 LATIN LETTER SMALL CAPITAL OU
+1D16 LATIN SMALL LETTER TOP HALF O
+1D17 LATIN SMALL LETTER BOTTOM HALF O
+1D18 LATIN LETTER SMALL CAPITAL P
+1D19 LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A LATIN LETTER SMALL CAPITAL TURNED R
+1D1B LATIN LETTER SMALL CAPITAL T
+1D1C LATIN LETTER SMALL CAPITAL U
+1D1D LATIN SMALL LETTER SIDEWAYS U
+1D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+1D1F LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20 LATIN LETTER SMALL CAPITAL V
+1D21 LATIN LETTER SMALL CAPITAL W
+1D22 LATIN LETTER SMALL CAPITAL Z
+1D23 LATIN LETTER SMALL CAPITAL EZH
+1D24 LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 LATIN LETTER AIN
+1D26 GREEK LETTER SMALL CAPITAL GAMMA
+1D27 GREEK LETTER SMALL CAPITAL LAMDA
+1D28 GREEK LETTER SMALL CAPITAL PI
+1D29 GREEK LETTER SMALL CAPITAL RHO
+1D2A GREEK LETTER SMALL CAPITAL PSI
+1D2B CYRILLIC LETTER SMALL CAPITAL EL
+1D2C MODIFIER LETTER CAPITAL A
+1D2D MODIFIER LETTER CAPITAL AE
+1D2E MODIFIER LETTER CAPITAL B
+1D2F MODIFIER LETTER CAPITAL BARRED B
+1D30 MODIFIER LETTER CAPITAL D
+1D31 MODIFIER LETTER CAPITAL E
+1D32 MODIFIER LETTER CAPITAL REVERSED E
+1D33 MODIFIER LETTER CAPITAL G
+1D34 MODIFIER LETTER CAPITAL H
+1D35 MODIFIER LETTER CAPITAL I
+1D36 MODIFIER LETTER CAPITAL J
+1D37 MODIFIER LETTER CAPITAL K
+1D38 MODIFIER LETTER CAPITAL L
+1D39 MODIFIER LETTER CAPITAL M
+1D3A MODIFIER LETTER CAPITAL N
+1D3B MODIFIER LETTER CAPITAL REVERSED N
+1D3C MODIFIER LETTER CAPITAL O
+1D3D MODIFIER LETTER CAPITAL OU
+1D3E MODIFIER LETTER CAPITAL P
+1D3F MODIFIER LETTER CAPITAL R
+1D40 MODIFIER LETTER CAPITAL T
+1D41 MODIFIER LETTER CAPITAL U
+1D42 MODIFIER LETTER CAPITAL W
+1D43 MODIFIER LETTER SMALL A
+1D44 MODIFIER LETTER SMALL TURNED A
+1D45 MODIFIER LETTER SMALL ALPHA
+1D46 MODIFIER LETTER SMALL TURNED AE
+1D47 MODIFIER LETTER SMALL B
+1D48 MODIFIER LETTER SMALL D
+1D49 MODIFIER LETTER SMALL E
+1D4A MODIFIER LETTER SMALL SCHWA
+1D4B MODIFIER LETTER SMALL OPEN E
+1D4C MODIFIER LETTER SMALL TURNED OPEN E
+1D4D MODIFIER LETTER SMALL G
+1D4E MODIFIER LETTER SMALL TURNED I
+1D4F MODIFIER LETTER SMALL K
+1D50 MODIFIER LETTER SMALL M
+1D51 MODIFIER LETTER SMALL ENG
+1D52 MODIFIER LETTER SMALL O
+1D53 MODIFIER LETTER SMALL OPEN O
+1D54 MODIFIER LETTER SMALL TOP HALF O
+1D55 MODIFIER LETTER SMALL BOTTOM HALF O
+1D56 MODIFIER LETTER SMALL P
+1D57 MODIFIER LETTER SMALL T
+1D58 MODIFIER LETTER SMALL U
+1D59 MODIFIER LETTER SMALL SIDEWAYS U
+1D5A MODIFIER LETTER SMALL TURNED M
+1D5B MODIFIER LETTER SMALL V
+1D5C MODIFIER LETTER SMALL AIN
+1D5D MODIFIER LETTER SMALL BETA
+1D5E MODIFIER LETTER SMALL GREEK GAMMA
+1D5F MODIFIER LETTER SMALL DELTA
+1D60 MODIFIER LETTER SMALL GREEK PHI
+1D61 MODIFIER LETTER SMALL CHI
+1D62 LATIN SUBSCRIPT SMALL LETTER I
+1D63 LATIN SUBSCRIPT SMALL LETTER R
+1D64 LATIN SUBSCRIPT SMALL LETTER U
+1D65 LATIN SUBSCRIPT SMALL LETTER V
+1D66 GREEK SUBSCRIPT SMALL LETTER BETA
+1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA
+1D68 GREEK SUBSCRIPT SMALL LETTER RHO
+1D69 GREEK SUBSCRIPT SMALL LETTER PHI
+1D6A GREEK SUBSCRIPT SMALL LETTER CHI
+1D6B LATIN SMALL LETTER UE
1E00 LATIN CAPITAL LETTER A WITH RING BELOW
1E01 LATIN SMALL LETTER A WITH RING BELOW
1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE
@@ -5310,6 +5647,8 @@ return <<'END';
2050 CLOSE UP
2051 TWO ASTERISKS ALIGNED VERTICALLY
2052 COMMERCIAL MINUS SIGN
+2053 SWUNG DASH
+2054 INVERTED UNDERTIE
2057 QUADRUPLE PRIME
205F MEDIUM MATHEMATICAL SPACE
2060 WORD JOINER
@@ -5455,6 +5794,7 @@ return <<'END';
2138 DALET SYMBOL
2139 INFORMATION SOURCE
213A ROTATED CAPITAL Q
+213B FACSIMILE SIGN
213D DOUBLE-STRUCK SMALL GAMMA
213E DOUBLE-STRUCK CAPITAL GAMMA
213F DOUBLE-STRUCK CAPITAL PI
@@ -6094,6 +6434,8 @@ return <<'END';
23CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
23CD SQUARE FOOT
23CE RETURN SYMBOL
+23CF EJECT SYMBOL
+23D0 VERTICAL LINE EXTENSION
2400 SYMBOL FOR NULL
2401 SYMBOL FOR START OF HEADING
2402 SYMBOL FOR START OF TEXT
@@ -6303,6 +6645,7 @@ return <<'END';
24FC DOUBLE CIRCLED DIGIT EIGHT
24FD DOUBLE CIRCLED DIGIT NINE
24FE DOUBLE CIRCLED NUMBER TEN
+24FF NEGATIVE CIRCLED DIGIT ZERO
2500 BOX DRAWINGS LIGHT HORIZONTAL
2501 BOX DRAWINGS HEAVY HORIZONTAL
2502 BOX DRAWINGS LIGHT VERTICAL
@@ -6579,6 +6922,8 @@ return <<'END';
2611 BALLOT BOX WITH CHECK
2612 BALLOT BOX WITH X
2613 SALTIRE
+2614 UMBRELLA WITH RAIN DROPS
+2615 HOT BEVERAGE
2616 WHITE SHOGI PIECE
2617 BLACK SHOGI PIECE
2619 REVERSED ROTATED FLORAL HEART BULLET
@@ -6692,6 +7037,16 @@ return <<'END';
2687 WHITE CIRCLE WITH TWO DOTS
2688 BLACK CIRCLE WITH WHITE DOT RIGHT
2689 BLACK CIRCLE WITH TWO WHITE DOTS
+268A MONOGRAM FOR YANG
+268B MONOGRAM FOR YIN
+268C DIGRAM FOR GREATER YANG
+268D DIGRAM FOR LESSER YIN
+268E DIGRAM FOR LESSER YANG
+268F DIGRAM FOR GREATER YIN
+2690 WHITE FLAG
+2691 BLACK FLAG
+26A0 WARNING SIGN
+26A1 HIGH VOLTAGE SIGN
2701 UPPER BLADE SCISSORS
2702 BLACK SCISSORS
2703 LOWER BLADE SCISSORS
@@ -7678,6 +8033,20 @@ return <<'END';
2AFD DOUBLE SOLIDUS OPERATOR
2AFE WHITE VERTICAL BAR
2AFF N-ARY WHITE VERTICAL BAR
+2B00 NORTH EAST WHITE ARROW
+2B01 NORTH WEST WHITE ARROW
+2B02 SOUTH EAST WHITE ARROW
+2B03 SOUTH WEST WHITE ARROW
+2B04 LEFT RIGHT WHITE ARROW
+2B05 LEFTWARDS BLACK ARROW
+2B06 UPWARDS BLACK ARROW
+2B07 DOWNWARDS BLACK ARROW
+2B08 NORTH EAST BLACK ARROW
+2B09 NORTH WEST BLACK ARROW
+2B0A SOUTH EAST BLACK ARROW
+2B0B SOUTH WEST BLACK ARROW
+2B0C LEFT RIGHT BLACK ARROW
+2B0D UP DOWN BLACK ARROW
2E80 CJK RADICAL REPEAT
2E81 CJK RADICAL CLIFF
2E82 CJK RADICAL SECOND ONE
@@ -8491,6 +8860,8 @@ return <<'END';
321A PARENTHESIZED HANGUL PHIEUPH A
321B PARENTHESIZED HANGUL HIEUH A
321C PARENTHESIZED HANGUL CIEUC U
+321D PARENTHESIZED KOREAN CHARACTER OJEON
+321E PARENTHESIZED KOREAN CHARACTER O HU
3220 PARENTHESIZED IDEOGRAPH ONE
3221 PARENTHESIZED IDEOGRAPH TWO
3222 PARENTHESIZED IDEOGRAPH THREE
@@ -8527,6 +8898,7 @@ return <<'END';
3241 PARENTHESIZED IDEOGRAPH REST
3242 PARENTHESIZED IDEOGRAPH SELF
3243 PARENTHESIZED IDEOGRAPH REACH
+3250 PARTNERSHIP SIGN
3251 CIRCLED NUMBER TWENTY ONE
3252 CIRCLED NUMBER TWENTY TWO
3253 CIRCLED NUMBER TWENTY THREE
@@ -8570,6 +8942,8 @@ return <<'END';
3279 CIRCLED HANGUL THIEUTH A
327A CIRCLED HANGUL PHIEUPH A
327B CIRCLED HANGUL HIEUH A
+327C CIRCLED KOREAN CHARACTER CHAMKO
+327D CIRCLED KOREAN CHARACTER JUEUI
327F KOREAN STANDARD SYMBOL
3280 CIRCLED IDEOGRAPH ONE
3281 CIRCLED IDEOGRAPH TWO
@@ -8647,6 +9021,10 @@ return <<'END';
32C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
32CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32CC SQUARE HG
+32CD SQUARE ERG
+32CE SQUARE EV
+32CF LIMITED LIABILITY SIGN
32D0 CIRCLED KATAKANA A
32D1 CIRCLED KATAKANA I
32D2 CIRCLED KATAKANA U
@@ -8813,6 +9191,10 @@ return <<'END';
3374 SQUARE BAR
3375 SQUARE OV
3376 SQUARE PC
+3377 SQUARE DM
+3378 SQUARE DM SQUARED
+3379 SQUARE DM CUBED
+337A SQUARE IU
337B SQUARE ERA NAME HEISEI
337C SQUARE ERA NAME SYOUWA
337D SQUARE ERA NAME TAISYOU
@@ -8912,6 +9294,8 @@ return <<'END';
33DB SQUARE SR
33DC SQUARE SV
33DD SQUARE WB
+33DE SQUARE V OVER M
+33DF SQUARE A OVER M
33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
33E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
33E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
@@ -8943,7 +9327,72 @@ return <<'END';
33FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
33FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+33FF SQUARE GAL
3400 4DB5 CJK Ideograph Extension A
+4DC0 HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 HEXAGRAM FOR WAITING
+4DC5 HEXAGRAM FOR CONFLICT
+4DC6 HEXAGRAM FOR THE ARMY
+4DC7 HEXAGRAM FOR HOLDING TOGETHER
+4DC8 HEXAGRAM FOR SMALL TAMING
+4DC9 HEXAGRAM FOR TREADING
+4DCA HEXAGRAM FOR PEACE
+4DCB HEXAGRAM FOR STANDSTILL
+4DCC HEXAGRAM FOR FELLOWSHIP
+4DCD HEXAGRAM FOR GREAT POSSESSION
+4DCE HEXAGRAM FOR MODESTY
+4DCF HEXAGRAM FOR ENTHUSIASM
+4DD0 HEXAGRAM FOR FOLLOWING
+4DD1 HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 HEXAGRAM FOR APPROACH
+4DD3 HEXAGRAM FOR CONTEMPLATION
+4DD4 HEXAGRAM FOR BITING THROUGH
+4DD5 HEXAGRAM FOR GRACE
+4DD6 HEXAGRAM FOR SPLITTING APART
+4DD7 HEXAGRAM FOR RETURN
+4DD8 HEXAGRAM FOR INNOCENCE
+4DD9 HEXAGRAM FOR GREAT TAMING
+4DDA HEXAGRAM FOR MOUTH CORNERS
+4DDB HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC HEXAGRAM FOR THE ABYSMAL WATER
+4DDD HEXAGRAM FOR THE CLINGING FIRE
+4DDE HEXAGRAM FOR INFLUENCE
+4DDF HEXAGRAM FOR DURATION
+4DE0 HEXAGRAM FOR RETREAT
+4DE1 HEXAGRAM FOR GREAT POWER
+4DE2 HEXAGRAM FOR PROGRESS
+4DE3 HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 HEXAGRAM FOR THE FAMILY
+4DE5 HEXAGRAM FOR OPPOSITION
+4DE6 HEXAGRAM FOR OBSTRUCTION
+4DE7 HEXAGRAM FOR DELIVERANCE
+4DE8 HEXAGRAM FOR DECREASE
+4DE9 HEXAGRAM FOR INCREASE
+4DEA HEXAGRAM FOR BREAKTHROUGH
+4DEB HEXAGRAM FOR COMING TO MEET
+4DEC HEXAGRAM FOR GATHERING TOGETHER
+4DED HEXAGRAM FOR PUSHING UPWARD
+4DEE HEXAGRAM FOR OPPRESSION
+4DEF HEXAGRAM FOR THE WELL
+4DF0 HEXAGRAM FOR REVOLUTION
+4DF1 HEXAGRAM FOR THE CAULDRON
+4DF2 HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 HEXAGRAM FOR DEVELOPMENT
+4DF5 HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 HEXAGRAM FOR ABUNDANCE
+4DF7 HEXAGRAM FOR THE WANDERER
+4DF8 HEXAGRAM FOR THE GENTLE WIND
+4DF9 HEXAGRAM FOR THE JOYOUS LAKE
+4DFA HEXAGRAM FOR DISPERSION
+4DFB HEXAGRAM FOR LIMITATION
+4DFC HEXAGRAM FOR INNER TRUTH
+4DFD HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE HEXAGRAM FOR AFTER COMPLETION
+4DFF HEXAGRAM FOR BEFORE COMPLETION
4E00 9FA5 CJK Ideograph
A000 YI SYLLABLE IT
A001 YI SYLLABLE IX
@@ -11183,6 +11632,7 @@ FDF9 ARABIC LIGATURE SALLA ISOLATED FORM
FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
FDFB ARABIC LIGATURE JALLAJALALOUHOU
FDFC RIAL SIGN
+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
FE00 VARIATION SELECTOR-1
FE01 VARIATION SELECTOR-2
FE02 VARIATION SELECTOR-3
@@ -11226,6 +11676,8 @@ FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
FE45 SESAME DOT
FE46 WHITE SESAME DOT
+FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
FE49 DASHED OVERLINE
FE4A CENTRELINE OVERLINE
FE4B WAVY OVERLINE
@@ -11630,6 +12082,274 @@ FFFA INTERLINEAR ANNOTATION SEPARATOR
FFFB INTERLINEAR ANNOTATION TERMINATOR
FFFC OBJECT REPLACEMENT CHARACTER
FFFD REPLACEMENT CHARACTER
+10000 LINEAR B SYLLABLE B008 A
+10001 LINEAR B SYLLABLE B038 E
+10002 LINEAR B SYLLABLE B028 I
+10003 LINEAR B SYLLABLE B061 O
+10004 LINEAR B SYLLABLE B010 U
+10005 LINEAR B SYLLABLE B001 DA
+10006 LINEAR B SYLLABLE B045 DE
+10007 LINEAR B SYLLABLE B007 DI
+10008 LINEAR B SYLLABLE B014 DO
+10009 LINEAR B SYLLABLE B051 DU
+1000A LINEAR B SYLLABLE B057 JA
+1000B LINEAR B SYLLABLE B046 JE
+1000D LINEAR B SYLLABLE B036 JO
+1000E LINEAR B SYLLABLE B065 JU
+1000F LINEAR B SYLLABLE B077 KA
+10010 LINEAR B SYLLABLE B044 KE
+10011 LINEAR B SYLLABLE B067 KI
+10012 LINEAR B SYLLABLE B070 KO
+10013 LINEAR B SYLLABLE B081 KU
+10014 LINEAR B SYLLABLE B080 MA
+10015 LINEAR B SYLLABLE B013 ME
+10016 LINEAR B SYLLABLE B073 MI
+10017 LINEAR B SYLLABLE B015 MO
+10018 LINEAR B SYLLABLE B023 MU
+10019 LINEAR B SYLLABLE B006 NA
+1001A LINEAR B SYLLABLE B024 NE
+1001B LINEAR B SYLLABLE B030 NI
+1001C LINEAR B SYLLABLE B052 NO
+1001D LINEAR B SYLLABLE B055 NU
+1001E LINEAR B SYLLABLE B003 PA
+1001F LINEAR B SYLLABLE B072 PE
+10020 LINEAR B SYLLABLE B039 PI
+10021 LINEAR B SYLLABLE B011 PO
+10022 LINEAR B SYLLABLE B050 PU
+10023 LINEAR B SYLLABLE B016 QA
+10024 LINEAR B SYLLABLE B078 QE
+10025 LINEAR B SYLLABLE B021 QI
+10026 LINEAR B SYLLABLE B032 QO
+10028 LINEAR B SYLLABLE B060 RA
+10029 LINEAR B SYLLABLE B027 RE
+1002A LINEAR B SYLLABLE B053 RI
+1002B LINEAR B SYLLABLE B002 RO
+1002C LINEAR B SYLLABLE B026 RU
+1002D LINEAR B SYLLABLE B031 SA
+1002E LINEAR B SYLLABLE B009 SE
+1002F LINEAR B SYLLABLE B041 SI
+10030 LINEAR B SYLLABLE B012 SO
+10031 LINEAR B SYLLABLE B058 SU
+10032 LINEAR B SYLLABLE B059 TA
+10033 LINEAR B SYLLABLE B004 TE
+10034 LINEAR B SYLLABLE B037 TI
+10035 LINEAR B SYLLABLE B005 TO
+10036 LINEAR B SYLLABLE B069 TU
+10037 LINEAR B SYLLABLE B054 WA
+10038 LINEAR B SYLLABLE B075 WE
+10039 LINEAR B SYLLABLE B040 WI
+1003A LINEAR B SYLLABLE B042 WO
+1003C LINEAR B SYLLABLE B017 ZA
+1003D LINEAR B SYLLABLE B074 ZE
+1003F LINEAR B SYLLABLE B020 ZO
+10040 LINEAR B SYLLABLE B025 A2
+10041 LINEAR B SYLLABLE B043 A3
+10042 LINEAR B SYLLABLE B085 AU
+10043 LINEAR B SYLLABLE B071 DWE
+10044 LINEAR B SYLLABLE B090 DWO
+10045 LINEAR B SYLLABLE B048 NWA
+10046 LINEAR B SYLLABLE B029 PU2
+10047 LINEAR B SYLLABLE B062 PTE
+10048 LINEAR B SYLLABLE B076 RA2
+10049 LINEAR B SYLLABLE B033 RA3
+1004A LINEAR B SYLLABLE B068 RO2
+1004B LINEAR B SYLLABLE B066 TA2
+1004C LINEAR B SYLLABLE B087 TWE
+1004D LINEAR B SYLLABLE B091 TWO
+10050 LINEAR B SYMBOL B018
+10051 LINEAR B SYMBOL B019
+10052 LINEAR B SYMBOL B022
+10053 LINEAR B SYMBOL B034
+10054 LINEAR B SYMBOL B047
+10055 LINEAR B SYMBOL B049
+10056 LINEAR B SYMBOL B056
+10057 LINEAR B SYMBOL B063
+10058 LINEAR B SYMBOL B064
+10059 LINEAR B SYMBOL B079
+1005A LINEAR B SYMBOL B082
+1005B LINEAR B SYMBOL B083
+1005C LINEAR B SYMBOL B086
+1005D LINEAR B SYMBOL B089
+10080 LINEAR B IDEOGRAM B100 MAN
+10081 LINEAR B IDEOGRAM B102 WOMAN
+10082 LINEAR B IDEOGRAM B104 DEER
+10083 LINEAR B IDEOGRAM B105 EQUID
+10084 LINEAR B IDEOGRAM B105F MARE
+10085 LINEAR B IDEOGRAM B105M STALLION
+10086 LINEAR B IDEOGRAM B106F EWE
+10087 LINEAR B IDEOGRAM B106M RAM
+10088 LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 LINEAR B IDEOGRAM B107M HE-GOAT
+1008A LINEAR B IDEOGRAM B108F SOW
+1008B LINEAR B IDEOGRAM B108M BOAR
+1008C LINEAR B IDEOGRAM B109F COW
+1008D LINEAR B IDEOGRAM B109M BULL
+1008E LINEAR B IDEOGRAM B120 WHEAT
+1008F LINEAR B IDEOGRAM B121 BARLEY
+10090 LINEAR B IDEOGRAM B122 OLIVE
+10091 LINEAR B IDEOGRAM B123 SPICE
+10092 LINEAR B IDEOGRAM B125 CYPERUS
+10093 LINEAR B MONOGRAM B127 KAPO
+10094 LINEAR B MONOGRAM B128 KANAKO
+10095 LINEAR B IDEOGRAM B130 OIL
+10096 LINEAR B IDEOGRAM B131 WINE
+10097 LINEAR B IDEOGRAM B132
+10098 LINEAR B MONOGRAM B133 AREPA
+10099 LINEAR B MONOGRAM B135 MERI
+1009A LINEAR B IDEOGRAM B140 BRONZE
+1009B LINEAR B IDEOGRAM B141 GOLD
+1009C LINEAR B IDEOGRAM B142
+1009D LINEAR B IDEOGRAM B145 WOOL
+1009E LINEAR B IDEOGRAM B146
+1009F LINEAR B IDEOGRAM B150
+100A0 LINEAR B IDEOGRAM B151 HORN
+100A1 LINEAR B IDEOGRAM B152
+100A2 LINEAR B IDEOGRAM B153
+100A3 LINEAR B IDEOGRAM B154
+100A4 LINEAR B MONOGRAM B156 TURO2
+100A5 LINEAR B IDEOGRAM B157
+100A6 LINEAR B IDEOGRAM B158
+100A7 LINEAR B IDEOGRAM B159 CLOTH
+100A8 LINEAR B IDEOGRAM B160
+100A9 LINEAR B IDEOGRAM B161
+100AA LINEAR B IDEOGRAM B162 GARMENT
+100AB LINEAR B IDEOGRAM B163 ARMOUR
+100AC LINEAR B IDEOGRAM B164
+100AD LINEAR B IDEOGRAM B165
+100AE LINEAR B IDEOGRAM B166
+100AF LINEAR B IDEOGRAM B167
+100B0 LINEAR B IDEOGRAM B168
+100B1 LINEAR B IDEOGRAM B169
+100B2 LINEAR B IDEOGRAM B170
+100B3 LINEAR B IDEOGRAM B171
+100B4 LINEAR B IDEOGRAM B172
+100B5 LINEAR B IDEOGRAM B173 MONTH
+100B6 LINEAR B IDEOGRAM B174
+100B7 LINEAR B IDEOGRAM B176 TREE
+100B8 LINEAR B IDEOGRAM B177
+100B9 LINEAR B IDEOGRAM B178
+100BA LINEAR B IDEOGRAM B179
+100BB LINEAR B IDEOGRAM B180
+100BC LINEAR B IDEOGRAM B181
+100BD LINEAR B IDEOGRAM B182
+100BE LINEAR B IDEOGRAM B183
+100BF LINEAR B IDEOGRAM B184
+100C0 LINEAR B IDEOGRAM B185
+100C1 LINEAR B IDEOGRAM B189
+100C2 LINEAR B IDEOGRAM B190
+100C3 LINEAR B IDEOGRAM B191 HELMET
+100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 LINEAR B IDEOGRAM B225 BATHTUB
+100C6 LINEAR B IDEOGRAM B230 SPEAR
+100C7 LINEAR B IDEOGRAM B231 ARROW
+100C8 LINEAR B IDEOGRAM B232
+100C9 LINEAR B IDEOGRAM B233 SWORD
+100CA LINEAR B IDEOGRAM B234
+100CB LINEAR B IDEOGRAM B236
+100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD LINEAR B IDEOGRAM B241 CHARIOT
+100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF LINEAR B IDEOGRAM B243 WHEEL
+100D0 LINEAR B IDEOGRAM B245
+100D1 LINEAR B IDEOGRAM B246
+100D2 LINEAR B MONOGRAM B247 DIPTE
+100D3 LINEAR B IDEOGRAM B248
+100D4 LINEAR B IDEOGRAM B249
+100D5 LINEAR B IDEOGRAM B251
+100D6 LINEAR B IDEOGRAM B252
+100D7 LINEAR B IDEOGRAM B253
+100D8 LINEAR B IDEOGRAM B254 DART
+100D9 LINEAR B IDEOGRAM B255
+100DA LINEAR B IDEOGRAM B256
+100DB LINEAR B IDEOGRAM B257
+100DC LINEAR B IDEOGRAM B258
+100DD LINEAR B IDEOGRAM B259
+100DE LINEAR B IDEOGRAM VESSEL B155
+100DF LINEAR B IDEOGRAM VESSEL B200
+100E0 LINEAR B IDEOGRAM VESSEL B201
+100E1 LINEAR B IDEOGRAM VESSEL B202
+100E2 LINEAR B IDEOGRAM VESSEL B203
+100E3 LINEAR B IDEOGRAM VESSEL B204
+100E4 LINEAR B IDEOGRAM VESSEL B205
+100E5 LINEAR B IDEOGRAM VESSEL B206
+100E6 LINEAR B IDEOGRAM VESSEL B207
+100E7 LINEAR B IDEOGRAM VESSEL B208
+100E8 LINEAR B IDEOGRAM VESSEL B209
+100E9 LINEAR B IDEOGRAM VESSEL B210
+100EA LINEAR B IDEOGRAM VESSEL B211
+100EB LINEAR B IDEOGRAM VESSEL B212
+100EC LINEAR B IDEOGRAM VESSEL B213
+100ED LINEAR B IDEOGRAM VESSEL B214
+100EE LINEAR B IDEOGRAM VESSEL B215
+100EF LINEAR B IDEOGRAM VESSEL B216
+100F0 LINEAR B IDEOGRAM VESSEL B217
+100F1 LINEAR B IDEOGRAM VESSEL B218
+100F2 LINEAR B IDEOGRAM VESSEL B219
+100F3 LINEAR B IDEOGRAM VESSEL B221
+100F4 LINEAR B IDEOGRAM VESSEL B222
+100F5 LINEAR B IDEOGRAM VESSEL B226
+100F6 LINEAR B IDEOGRAM VESSEL B227
+100F7 LINEAR B IDEOGRAM VESSEL B228
+100F8 LINEAR B IDEOGRAM VESSEL B229
+100F9 LINEAR B IDEOGRAM VESSEL B250
+100FA LINEAR B IDEOGRAM VESSEL B305
+10100 AEGEAN WORD SEPARATOR LINE
+10101 AEGEAN WORD SEPARATOR DOT
+10102 AEGEAN CHECK MARK
+10107 AEGEAN NUMBER ONE
+10108 AEGEAN NUMBER TWO
+10109 AEGEAN NUMBER THREE
+1010A AEGEAN NUMBER FOUR
+1010B AEGEAN NUMBER FIVE
+1010C AEGEAN NUMBER SIX
+1010D AEGEAN NUMBER SEVEN
+1010E AEGEAN NUMBER EIGHT
+1010F AEGEAN NUMBER NINE
+10110 AEGEAN NUMBER TEN
+10111 AEGEAN NUMBER TWENTY
+10112 AEGEAN NUMBER THIRTY
+10113 AEGEAN NUMBER FORTY
+10114 AEGEAN NUMBER FIFTY
+10115 AEGEAN NUMBER SIXTY
+10116 AEGEAN NUMBER SEVENTY
+10117 AEGEAN NUMBER EIGHTY
+10118 AEGEAN NUMBER NINETY
+10119 AEGEAN NUMBER ONE HUNDRED
+1011A AEGEAN NUMBER TWO HUNDRED
+1011B AEGEAN NUMBER THREE HUNDRED
+1011C AEGEAN NUMBER FOUR HUNDRED
+1011D AEGEAN NUMBER FIVE HUNDRED
+1011E AEGEAN NUMBER SIX HUNDRED
+1011F AEGEAN NUMBER SEVEN HUNDRED
+10120 AEGEAN NUMBER EIGHT HUNDRED
+10121 AEGEAN NUMBER NINE HUNDRED
+10122 AEGEAN NUMBER ONE THOUSAND
+10123 AEGEAN NUMBER TWO THOUSAND
+10124 AEGEAN NUMBER THREE THOUSAND
+10125 AEGEAN NUMBER FOUR THOUSAND
+10126 AEGEAN NUMBER FIVE THOUSAND
+10127 AEGEAN NUMBER SIX THOUSAND
+10128 AEGEAN NUMBER SEVEN THOUSAND
+10129 AEGEAN NUMBER EIGHT THOUSAND
+1012A AEGEAN NUMBER NINE THOUSAND
+1012B AEGEAN NUMBER TEN THOUSAND
+1012C AEGEAN NUMBER TWENTY THOUSAND
+1012D AEGEAN NUMBER THIRTY THOUSAND
+1012E AEGEAN NUMBER FORTY THOUSAND
+1012F AEGEAN NUMBER FIFTY THOUSAND
+10130 AEGEAN NUMBER SIXTY THOUSAND
+10131 AEGEAN NUMBER SEVENTY THOUSAND
+10132 AEGEAN NUMBER EIGHTY THOUSAND
+10133 AEGEAN NUMBER NINETY THOUSAND
+10137 AEGEAN WEIGHT BASE UNIT
+10138 AEGEAN WEIGHT FIRST SUBUNIT
+10139 AEGEAN WEIGHT SECOND SUBUNIT
+1013A AEGEAN WEIGHT THIRD SUBUNIT
+1013B AEGEAN WEIGHT FOURTH SUBUNIT
+1013C AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E AEGEAN MEASURE SECOND SUBUNIT
+1013F AEGEAN MEASURE THIRD SUBUNIT
10300 OLD ITALIC LETTER A
10301 OLD ITALIC LETTER BE
10302 OLD ITALIC LETTER KE
@@ -11692,6 +12412,37 @@ FFFD REPLACEMENT CHARACTER
10348 GOTHIC LETTER HWAIR
10349 GOTHIC LETTER OTHAL
1034A GOTHIC LETTER NINE HUNDRED
+10380 UGARITIC LETTER ALPA
+10381 UGARITIC LETTER BETA
+10382 UGARITIC LETTER GAMLA
+10383 UGARITIC LETTER KHA
+10384 UGARITIC LETTER DELTA
+10385 UGARITIC LETTER HO
+10386 UGARITIC LETTER WO
+10387 UGARITIC LETTER ZETA
+10388 UGARITIC LETTER HOTA
+10389 UGARITIC LETTER TET
+1038A UGARITIC LETTER YOD
+1038B UGARITIC LETTER KAF
+1038C UGARITIC LETTER SHIN
+1038D UGARITIC LETTER LAMDA
+1038E UGARITIC LETTER MEM
+1038F UGARITIC LETTER DHAL
+10390 UGARITIC LETTER NUN
+10391 UGARITIC LETTER ZU
+10392 UGARITIC LETTER SAMKA
+10393 UGARITIC LETTER AIN
+10394 UGARITIC LETTER PU
+10395 UGARITIC LETTER SADE
+10396 UGARITIC LETTER QOPA
+10397 UGARITIC LETTER RASHA
+10398 UGARITIC LETTER THANNA
+10399 UGARITIC LETTER GHAIN
+1039A UGARITIC LETTER TO
+1039B UGARITIC LETTER I
+1039C UGARITIC LETTER U
+1039D UGARITIC LETTER SSU
+1039F UGARITIC WORD DIVIDER
10400 DESERET CAPITAL LETTER LONG I
10401 DESERET CAPITAL LETTER LONG E
10402 DESERET CAPITAL LETTER LONG A
@@ -11730,6 +12481,8 @@ FFFD REPLACEMENT CHARACTER
10423 DESERET CAPITAL LETTER EM
10424 DESERET CAPITAL LETTER EN
10425 DESERET CAPITAL LETTER ENG
+10426 DESERET CAPITAL LETTER OI
+10427 DESERET CAPITAL LETTER EW
10428 DESERET SMALL LETTER LONG I
10429 DESERET SMALL LETTER LONG E
1042A DESERET SMALL LETTER LONG A
@@ -11768,6 +12521,151 @@ FFFD REPLACEMENT CHARACTER
1044B DESERET SMALL LETTER EM
1044C DESERET SMALL LETTER EN
1044D DESERET SMALL LETTER ENG
+1044E DESERET SMALL LETTER OI
+1044F DESERET SMALL LETTER EW
+10450 SHAVIAN LETTER PEEP
+10451 SHAVIAN LETTER TOT
+10452 SHAVIAN LETTER KICK
+10453 SHAVIAN LETTER FEE
+10454 SHAVIAN LETTER THIGH
+10455 SHAVIAN LETTER SO
+10456 SHAVIAN LETTER SURE
+10457 SHAVIAN LETTER CHURCH
+10458 SHAVIAN LETTER YEA
+10459 SHAVIAN LETTER HUNG
+1045A SHAVIAN LETTER BIB
+1045B SHAVIAN LETTER DEAD
+1045C SHAVIAN LETTER GAG
+1045D SHAVIAN LETTER VOW
+1045E SHAVIAN LETTER THEY
+1045F SHAVIAN LETTER ZOO
+10460 SHAVIAN LETTER MEASURE
+10461 SHAVIAN LETTER JUDGE
+10462 SHAVIAN LETTER WOE
+10463 SHAVIAN LETTER HA-HA
+10464 SHAVIAN LETTER LOLL
+10465 SHAVIAN LETTER MIME
+10466 SHAVIAN LETTER IF
+10467 SHAVIAN LETTER EGG
+10468 SHAVIAN LETTER ASH
+10469 SHAVIAN LETTER ADO
+1046A SHAVIAN LETTER ON
+1046B SHAVIAN LETTER WOOL
+1046C SHAVIAN LETTER OUT
+1046D SHAVIAN LETTER AH
+1046E SHAVIAN LETTER ROAR
+1046F SHAVIAN LETTER NUN
+10470 SHAVIAN LETTER EAT
+10471 SHAVIAN LETTER AGE
+10472 SHAVIAN LETTER ICE
+10473 SHAVIAN LETTER UP
+10474 SHAVIAN LETTER OAK
+10475 SHAVIAN LETTER OOZE
+10476 SHAVIAN LETTER OIL
+10477 SHAVIAN LETTER AWE
+10478 SHAVIAN LETTER ARE
+10479 SHAVIAN LETTER OR
+1047A SHAVIAN LETTER AIR
+1047B SHAVIAN LETTER ERR
+1047C SHAVIAN LETTER ARRAY
+1047D SHAVIAN LETTER EAR
+1047E SHAVIAN LETTER IAN
+1047F SHAVIAN LETTER YEW
+10480 OSMANYA LETTER ALEF
+10481 OSMANYA LETTER BA
+10482 OSMANYA LETTER TA
+10483 OSMANYA LETTER JA
+10484 OSMANYA LETTER XA
+10485 OSMANYA LETTER KHA
+10486 OSMANYA LETTER DEEL
+10487 OSMANYA LETTER RA
+10488 OSMANYA LETTER SA
+10489 OSMANYA LETTER SHIIN
+1048A OSMANYA LETTER DHA
+1048B OSMANYA LETTER CAYN
+1048C OSMANYA LETTER GA
+1048D OSMANYA LETTER FA
+1048E OSMANYA LETTER QAAF
+1048F OSMANYA LETTER KAAF
+10490 OSMANYA LETTER LAAN
+10491 OSMANYA LETTER MIIN
+10492 OSMANYA LETTER NUUN
+10493 OSMANYA LETTER WAW
+10494 OSMANYA LETTER HA
+10495 OSMANYA LETTER YA
+10496 OSMANYA LETTER A
+10497 OSMANYA LETTER E
+10498 OSMANYA LETTER I
+10499 OSMANYA LETTER O
+1049A OSMANYA LETTER U
+1049B OSMANYA LETTER AA
+1049C OSMANYA LETTER EE
+1049D OSMANYA LETTER OO
+104A0 OSMANYA DIGIT ZERO
+104A1 OSMANYA DIGIT ONE
+104A2 OSMANYA DIGIT TWO
+104A3 OSMANYA DIGIT THREE
+104A4 OSMANYA DIGIT FOUR
+104A5 OSMANYA DIGIT FIVE
+104A6 OSMANYA DIGIT SIX
+104A7 OSMANYA DIGIT SEVEN
+104A8 OSMANYA DIGIT EIGHT
+104A9 OSMANYA DIGIT NINE
+10800 CYPRIOT SYLLABLE A
+10801 CYPRIOT SYLLABLE E
+10802 CYPRIOT SYLLABLE I
+10803 CYPRIOT SYLLABLE O
+10804 CYPRIOT SYLLABLE U
+10805 CYPRIOT SYLLABLE JA
+10808 CYPRIOT SYLLABLE JO
+1080A CYPRIOT SYLLABLE KA
+1080B CYPRIOT SYLLABLE KE
+1080C CYPRIOT SYLLABLE KI
+1080D CYPRIOT SYLLABLE KO
+1080E CYPRIOT SYLLABLE KU
+1080F CYPRIOT SYLLABLE LA
+10810 CYPRIOT SYLLABLE LE
+10811 CYPRIOT SYLLABLE LI
+10812 CYPRIOT SYLLABLE LO
+10813 CYPRIOT SYLLABLE LU
+10814 CYPRIOT SYLLABLE MA
+10815 CYPRIOT SYLLABLE ME
+10816 CYPRIOT SYLLABLE MI
+10817 CYPRIOT SYLLABLE MO
+10818 CYPRIOT SYLLABLE MU
+10819 CYPRIOT SYLLABLE NA
+1081A CYPRIOT SYLLABLE NE
+1081B CYPRIOT SYLLABLE NI
+1081C CYPRIOT SYLLABLE NO
+1081D CYPRIOT SYLLABLE NU
+1081E CYPRIOT SYLLABLE PA
+1081F CYPRIOT SYLLABLE PE
+10820 CYPRIOT SYLLABLE PI
+10821 CYPRIOT SYLLABLE PO
+10822 CYPRIOT SYLLABLE PU
+10823 CYPRIOT SYLLABLE RA
+10824 CYPRIOT SYLLABLE RE
+10825 CYPRIOT SYLLABLE RI
+10826 CYPRIOT SYLLABLE RO
+10827 CYPRIOT SYLLABLE RU
+10828 CYPRIOT SYLLABLE SA
+10829 CYPRIOT SYLLABLE SE
+1082A CYPRIOT SYLLABLE SI
+1082B CYPRIOT SYLLABLE SO
+1082C CYPRIOT SYLLABLE SU
+1082D CYPRIOT SYLLABLE TA
+1082E CYPRIOT SYLLABLE TE
+1082F CYPRIOT SYLLABLE TI
+10830 CYPRIOT SYLLABLE TO
+10831 CYPRIOT SYLLABLE TU
+10832 CYPRIOT SYLLABLE WA
+10833 CYPRIOT SYLLABLE WE
+10834 CYPRIOT SYLLABLE WI
+10835 CYPRIOT SYLLABLE WO
+10837 CYPRIOT SYLLABLE XA
+10838 CYPRIOT SYLLABLE XE
+1083C CYPRIOT SYLLABLE ZA
+1083F CYPRIOT SYLLABLE ZO
1D000 BYZANTINE MUSICAL SYMBOL PSILI
1D001 BYZANTINE MUSICAL SYMBOL DASEIA
1D002 BYZANTINE MUSICAL SYMBOL PERISPOMENI
@@ -12233,6 +13131,93 @@ FFFD REPLACEMENT CHARACTER
1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS
1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS
1D1DD MUSICAL SYMBOL PES SUBPUNCTIS
+1D300 MONOGRAM FOR EARTH
+1D301 DIGRAM FOR HEAVENLY EARTH
+1D302 DIGRAM FOR HUMAN EARTH
+1D303 DIGRAM FOR EARTHLY HEAVEN
+1D304 DIGRAM FOR EARTHLY HUMAN
+1D305 DIGRAM FOR EARTH
+1D306 TETRAGRAM FOR CENTRE
+1D307 TETRAGRAM FOR FULL CIRCLE
+1D308 TETRAGRAM FOR MIRED
+1D309 TETRAGRAM FOR BARRIER
+1D30A TETRAGRAM FOR KEEPING SMALL
+1D30B TETRAGRAM FOR CONTRARIETY
+1D30C TETRAGRAM FOR ASCENT
+1D30D TETRAGRAM FOR OPPOSITION
+1D30E TETRAGRAM FOR BRANCHING OUT
+1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 TETRAGRAM FOR DIVERGENCE
+1D311 TETRAGRAM FOR YOUTHFULNESS
+1D312 TETRAGRAM FOR INCREASE
+1D313 TETRAGRAM FOR PENETRATION
+1D314 TETRAGRAM FOR REACH
+1D315 TETRAGRAM FOR CONTACT
+1D316 TETRAGRAM FOR HOLDING BACK
+1D317 TETRAGRAM FOR WAITING
+1D318 TETRAGRAM FOR FOLLOWING
+1D319 TETRAGRAM FOR ADVANCE
+1D31A TETRAGRAM FOR RELEASE
+1D31B TETRAGRAM FOR RESISTANCE
+1D31C TETRAGRAM FOR EASE
+1D31D TETRAGRAM FOR JOY
+1D31E TETRAGRAM FOR CONTENTION
+1D31F TETRAGRAM FOR ENDEAVOUR
+1D320 TETRAGRAM FOR DUTIES
+1D321 TETRAGRAM FOR CHANGE
+1D322 TETRAGRAM FOR DECISIVENESS
+1D323 TETRAGRAM FOR BOLD RESOLUTION
+1D324 TETRAGRAM FOR PACKING
+1D325 TETRAGRAM FOR LEGION
+1D326 TETRAGRAM FOR CLOSENESS
+1D327 TETRAGRAM FOR KINSHIP
+1D328 TETRAGRAM FOR GATHERING
+1D329 TETRAGRAM FOR STRENGTH
+1D32A TETRAGRAM FOR PURITY
+1D32B TETRAGRAM FOR FULLNESS
+1D32C TETRAGRAM FOR RESIDENCE
+1D32D TETRAGRAM FOR LAW OR MODEL
+1D32E TETRAGRAM FOR RESPONSE
+1D32F TETRAGRAM FOR GOING TO MEET
+1D330 TETRAGRAM FOR ENCOUNTERS
+1D331 TETRAGRAM FOR STOVE
+1D332 TETRAGRAM FOR GREATNESS
+1D333 TETRAGRAM FOR ENLARGEMENT
+1D334 TETRAGRAM FOR PATTERN
+1D335 TETRAGRAM FOR RITUAL
+1D336 TETRAGRAM FOR FLIGHT
+1D337 TETRAGRAM FOR VASTNESS OR WASTING
+1D338 TETRAGRAM FOR CONSTANCY
+1D339 TETRAGRAM FOR MEASURE
+1D33A TETRAGRAM FOR ETERNITY
+1D33B TETRAGRAM FOR UNITY
+1D33C TETRAGRAM FOR DIMINISHMENT
+1D33D TETRAGRAM FOR CLOSED MOUTH
+1D33E TETRAGRAM FOR GUARDEDNESS
+1D33F TETRAGRAM FOR GATHERING IN
+1D340 TETRAGRAM FOR MASSING
+1D341 TETRAGRAM FOR ACCUMULATION
+1D342 TETRAGRAM FOR EMBELLISHMENT
+1D343 TETRAGRAM FOR DOUBT
+1D344 TETRAGRAM FOR WATCH
+1D345 TETRAGRAM FOR SINKING
+1D346 TETRAGRAM FOR INNER
+1D347 TETRAGRAM FOR DEPARTURE
+1D348 TETRAGRAM FOR DARKENING
+1D349 TETRAGRAM FOR DIMMING
+1D34A TETRAGRAM FOR EXHAUSTION
+1D34B TETRAGRAM FOR SEVERANCE
+1D34C TETRAGRAM FOR STOPPAGE
+1D34D TETRAGRAM FOR HARDNESS
+1D34E TETRAGRAM FOR COMPLETION
+1D34F TETRAGRAM FOR CLOSURE
+1D350 TETRAGRAM FOR FAILURE
+1D351 TETRAGRAM FOR AGGRAVATION
+1D352 TETRAGRAM FOR COMPLIANCE
+1D353 TETRAGRAM FOR ON THE VERGE
+1D354 TETRAGRAM FOR DIFFICULTIES
+1D355 TETRAGRAM FOR LABOURING
+1D356 TETRAGRAM FOR FOSTERING
1D400 MATHEMATICAL BOLD CAPITAL A
1D401 MATHEMATICAL BOLD CAPITAL B
1D402 MATHEMATICAL BOLD CAPITAL C
@@ -12415,6 +13400,7 @@ FFFD REPLACEMENT CHARACTER
1D4BE MATHEMATICAL SCRIPT SMALL I
1D4BF MATHEMATICAL SCRIPT SMALL J
1D4C0 MATHEMATICAL SCRIPT SMALL K
+1D4C1 MATHEMATICAL SCRIPT SMALL L
1D4C2 MATHEMATICAL SCRIPT SMALL M
1D4C3 MATHEMATICAL SCRIPT SMALL N
1D4C5 MATHEMATICAL SCRIPT SMALL P
@@ -13864,6 +14850,246 @@ E007C TAG VERTICAL LINE
E007D TAG RIGHT CURLY BRACKET
E007E TAG TILDE
E007F CANCEL TAG
+E0100 VARIATION SELECTOR-17
+E0101 VARIATION SELECTOR-18
+E0102 VARIATION SELECTOR-19
+E0103 VARIATION SELECTOR-20
+E0104 VARIATION SELECTOR-21
+E0105 VARIATION SELECTOR-22
+E0106 VARIATION SELECTOR-23
+E0107 VARIATION SELECTOR-24
+E0108 VARIATION SELECTOR-25
+E0109 VARIATION SELECTOR-26
+E010A VARIATION SELECTOR-27
+E010B VARIATION SELECTOR-28
+E010C VARIATION SELECTOR-29
+E010D VARIATION SELECTOR-30
+E010E VARIATION SELECTOR-31
+E010F VARIATION SELECTOR-32
+E0110 VARIATION SELECTOR-33
+E0111 VARIATION SELECTOR-34
+E0112 VARIATION SELECTOR-35
+E0113 VARIATION SELECTOR-36
+E0114 VARIATION SELECTOR-37
+E0115 VARIATION SELECTOR-38
+E0116 VARIATION SELECTOR-39
+E0117 VARIATION SELECTOR-40
+E0118 VARIATION SELECTOR-41
+E0119 VARIATION SELECTOR-42
+E011A VARIATION SELECTOR-43
+E011B VARIATION SELECTOR-44
+E011C VARIATION SELECTOR-45
+E011D VARIATION SELECTOR-46
+E011E VARIATION SELECTOR-47
+E011F VARIATION SELECTOR-48
+E0120 VARIATION SELECTOR-49
+E0121 VARIATION SELECTOR-50
+E0122 VARIATION SELECTOR-51
+E0123 VARIATION SELECTOR-52
+E0124 VARIATION SELECTOR-53
+E0125 VARIATION SELECTOR-54
+E0126 VARIATION SELECTOR-55
+E0127 VARIATION SELECTOR-56
+E0128 VARIATION SELECTOR-57
+E0129 VARIATION SELECTOR-58
+E012A VARIATION SELECTOR-59
+E012B VARIATION SELECTOR-60
+E012C VARIATION SELECTOR-61
+E012D VARIATION SELECTOR-62
+E012E VARIATION SELECTOR-63
+E012F VARIATION SELECTOR-64
+E0130 VARIATION SELECTOR-65
+E0131 VARIATION SELECTOR-66
+E0132 VARIATION SELECTOR-67
+E0133 VARIATION SELECTOR-68
+E0134 VARIATION SELECTOR-69
+E0135 VARIATION SELECTOR-70
+E0136 VARIATION SELECTOR-71
+E0137 VARIATION SELECTOR-72
+E0138 VARIATION SELECTOR-73
+E0139 VARIATION SELECTOR-74
+E013A VARIATION SELECTOR-75
+E013B VARIATION SELECTOR-76
+E013C VARIATION SELECTOR-77
+E013D VARIATION SELECTOR-78
+E013E VARIATION SELECTOR-79
+E013F VARIATION SELECTOR-80
+E0140 VARIATION SELECTOR-81
+E0141 VARIATION SELECTOR-82
+E0142 VARIATION SELECTOR-83
+E0143 VARIATION SELECTOR-84
+E0144 VARIATION SELECTOR-85
+E0145 VARIATION SELECTOR-86
+E0146 VARIATION SELECTOR-87
+E0147 VARIATION SELECTOR-88
+E0148 VARIATION SELECTOR-89
+E0149 VARIATION SELECTOR-90
+E014A VARIATION SELECTOR-91
+E014B VARIATION SELECTOR-92
+E014C VARIATION SELECTOR-93
+E014D VARIATION SELECTOR-94
+E014E VARIATION SELECTOR-95
+E014F VARIATION SELECTOR-96
+E0150 VARIATION SELECTOR-97
+E0151 VARIATION SELECTOR-98
+E0152 VARIATION SELECTOR-99
+E0153 VARIATION SELECTOR-100
+E0154 VARIATION SELECTOR-101
+E0155 VARIATION SELECTOR-102
+E0156 VARIATION SELECTOR-103
+E0157 VARIATION SELECTOR-104
+E0158 VARIATION SELECTOR-105
+E0159 VARIATION SELECTOR-106
+E015A VARIATION SELECTOR-107
+E015B VARIATION SELECTOR-108
+E015C VARIATION SELECTOR-109
+E015D VARIATION SELECTOR-110
+E015E VARIATION SELECTOR-111
+E015F VARIATION SELECTOR-112
+E0160 VARIATION SELECTOR-113
+E0161 VARIATION SELECTOR-114
+E0162 VARIATION SELECTOR-115
+E0163 VARIATION SELECTOR-116
+E0164 VARIATION SELECTOR-117
+E0165 VARIATION SELECTOR-118
+E0166 VARIATION SELECTOR-119
+E0167 VARIATION SELECTOR-120
+E0168 VARIATION SELECTOR-121
+E0169 VARIATION SELECTOR-122
+E016A VARIATION SELECTOR-123
+E016B VARIATION SELECTOR-124
+E016C VARIATION SELECTOR-125
+E016D VARIATION SELECTOR-126
+E016E VARIATION SELECTOR-127
+E016F VARIATION SELECTOR-128
+E0170 VARIATION SELECTOR-129
+E0171 VARIATION SELECTOR-130
+E0172 VARIATION SELECTOR-131
+E0173 VARIATION SELECTOR-132
+E0174 VARIATION SELECTOR-133
+E0175 VARIATION SELECTOR-134
+E0176 VARIATION SELECTOR-135
+E0177 VARIATION SELECTOR-136
+E0178 VARIATION SELECTOR-137
+E0179 VARIATION SELECTOR-138
+E017A VARIATION SELECTOR-139
+E017B VARIATION SELECTOR-140
+E017C VARIATION SELECTOR-141
+E017D VARIATION SELECTOR-142
+E017E VARIATION SELECTOR-143
+E017F VARIATION SELECTOR-144
+E0180 VARIATION SELECTOR-145
+E0181 VARIATION SELECTOR-146
+E0182 VARIATION SELECTOR-147
+E0183 VARIATION SELECTOR-148
+E0184 VARIATION SELECTOR-149
+E0185 VARIATION SELECTOR-150
+E0186 VARIATION SELECTOR-151
+E0187 VARIATION SELECTOR-152
+E0188 VARIATION SELECTOR-153
+E0189 VARIATION SELECTOR-154
+E018A VARIATION SELECTOR-155
+E018B VARIATION SELECTOR-156
+E018C VARIATION SELECTOR-157
+E018D VARIATION SELECTOR-158
+E018E VARIATION SELECTOR-159
+E018F VARIATION SELECTOR-160
+E0190 VARIATION SELECTOR-161
+E0191 VARIATION SELECTOR-162
+E0192 VARIATION SELECTOR-163
+E0193 VARIATION SELECTOR-164
+E0194 VARIATION SELECTOR-165
+E0195 VARIATION SELECTOR-166
+E0196 VARIATION SELECTOR-167
+E0197 VARIATION SELECTOR-168
+E0198 VARIATION SELECTOR-169
+E0199 VARIATION SELECTOR-170
+E019A VARIATION SELECTOR-171
+E019B VARIATION SELECTOR-172
+E019C VARIATION SELECTOR-173
+E019D VARIATION SELECTOR-174
+E019E VARIATION SELECTOR-175
+E019F VARIATION SELECTOR-176
+E01A0 VARIATION SELECTOR-177
+E01A1 VARIATION SELECTOR-178
+E01A2 VARIATION SELECTOR-179
+E01A3 VARIATION SELECTOR-180
+E01A4 VARIATION SELECTOR-181
+E01A5 VARIATION SELECTOR-182
+E01A6 VARIATION SELECTOR-183
+E01A7 VARIATION SELECTOR-184
+E01A8 VARIATION SELECTOR-185
+E01A9 VARIATION SELECTOR-186
+E01AA VARIATION SELECTOR-187
+E01AB VARIATION SELECTOR-188
+E01AC VARIATION SELECTOR-189
+E01AD VARIATION SELECTOR-190
+E01AE VARIATION SELECTOR-191
+E01AF VARIATION SELECTOR-192
+E01B0 VARIATION SELECTOR-193
+E01B1 VARIATION SELECTOR-194
+E01B2 VARIATION SELECTOR-195
+E01B3 VARIATION SELECTOR-196
+E01B4 VARIATION SELECTOR-197
+E01B5 VARIATION SELECTOR-198
+E01B6 VARIATION SELECTOR-199
+E01B7 VARIATION SELECTOR-200
+E01B8 VARIATION SELECTOR-201
+E01B9 VARIATION SELECTOR-202
+E01BA VARIATION SELECTOR-203
+E01BB VARIATION SELECTOR-204
+E01BC VARIATION SELECTOR-205
+E01BD VARIATION SELECTOR-206
+E01BE VARIATION SELECTOR-207
+E01BF VARIATION SELECTOR-208
+E01C0 VARIATION SELECTOR-209
+E01C1 VARIATION SELECTOR-210
+E01C2 VARIATION SELECTOR-211
+E01C3 VARIATION SELECTOR-212
+E01C4 VARIATION SELECTOR-213
+E01C5 VARIATION SELECTOR-214
+E01C6 VARIATION SELECTOR-215
+E01C7 VARIATION SELECTOR-216
+E01C8 VARIATION SELECTOR-217
+E01C9 VARIATION SELECTOR-218
+E01CA VARIATION SELECTOR-219
+E01CB VARIATION SELECTOR-220
+E01CC VARIATION SELECTOR-221
+E01CD VARIATION SELECTOR-222
+E01CE VARIATION SELECTOR-223
+E01CF VARIATION SELECTOR-224
+E01D0 VARIATION SELECTOR-225
+E01D1 VARIATION SELECTOR-226
+E01D2 VARIATION SELECTOR-227
+E01D3 VARIATION SELECTOR-228
+E01D4 VARIATION SELECTOR-229
+E01D5 VARIATION SELECTOR-230
+E01D6 VARIATION SELECTOR-231
+E01D7 VARIATION SELECTOR-232
+E01D8 VARIATION SELECTOR-233
+E01D9 VARIATION SELECTOR-234
+E01DA VARIATION SELECTOR-235
+E01DB VARIATION SELECTOR-236
+E01DC VARIATION SELECTOR-237
+E01DD VARIATION SELECTOR-238
+E01DE VARIATION SELECTOR-239
+E01DF VARIATION SELECTOR-240
+E01E0 VARIATION SELECTOR-241
+E01E1 VARIATION SELECTOR-242
+E01E2 VARIATION SELECTOR-243
+E01E3 VARIATION SELECTOR-244
+E01E4 VARIATION SELECTOR-245
+E01E5 VARIATION SELECTOR-246
+E01E6 VARIATION SELECTOR-247
+E01E7 VARIATION SELECTOR-248
+E01E8 VARIATION SELECTOR-249
+E01E9 VARIATION SELECTOR-250
+E01EA VARIATION SELECTOR-251
+E01EB VARIATION SELECTOR-252
+E01EC VARIATION SELECTOR-253
+E01ED VARIATION SELECTOR-254
+E01EE VARIATION SELECTOR-255
+E01EF VARIATION SELECTOR-256
F0000 FFFFD Plane 15 Private Use
100000 10FFFD Plane 16 Private Use
END
diff --git a/gnu/usr.bin/perl/lib/unicore/NamesList.txt b/gnu/usr.bin/perl/lib/unicore/NamesList.txt
index 4d5243c03d0..2aa1e7f23a5 100644
--- a/gnu/usr.bin/perl/lib/unicore/NamesList.txt
+++ b/gnu/usr.bin/perl/lib/unicore/NamesList.txt
@@ -1,7 +1,6 @@
-@@@ The Unicode Standard 3.2
-@@@+ Draft U32M020305.lst
- Minor annotation edits for final release.
- Addition of a few more Khmer annotations.
+@@@ The Unicode Standard 4.0
+@@@+ U40M030411.lst
+ Final Unicode 4.0 names list.
This file is semi-automatically derived from UnicodeData.txt and
a set of manually created annotations using a script to select
or suppress information from the data file. The rules used
@@ -82,7 +81,8 @@
001F <control>
= INFORMATION SEPARATOR ONE
= unit separator (US)
-@ ASCII
+@ ASCII punctuation and symbols
+@+ Based on ISO/IEC 646 from here.
0020 SPACE
* sometimes considered a control code
* other space characters: 2000-200A
@@ -109,6 +109,7 @@
x (ditto mark - 3003)
0023 NUMBER SIGN
= pound sign, hash, crosshatch, octothorpe
+ x (music sharp sign - 266F)
0024 DOLLAR SIGN
= milreis, escudo
* glyph may have one or two vertical bars
@@ -123,8 +124,8 @@
0027 APOSTROPHE
= APOSTROPHE-QUOTE
= APL quote
- * neutral (vertical) glyph having mixed usage
- * preferred character for apostrophe is 2019
+ * neutral (vertical) glyph with mixed usage
+ * 2019 is preferred for apostrophe
* preferred characters in English for paired quotation marks are 2018 & 2019
x (modifier letter prime - 02B9)
x (modifier letter apostrophe - 02BC)
@@ -169,6 +170,7 @@
x (combining long solidus overlay - 0338)
x (fraction slash - 2044)
x (division slash - 2215)
+@ ASCII digits
0030 DIGIT ZERO
0031 DIGIT ONE
0032 DIGIT TWO
@@ -179,17 +181,20 @@
0037 DIGIT SEVEN
0038 DIGIT EIGHT
0039 DIGIT NINE
+@ ASCII punctuation and symbols
003A COLON
x (armenian full stop - 0589)
x (hebrew punctuation sof pasuq - 05C3)
x (ratio - 2236)
003B SEMICOLON
+ * this, and not 037E, is the preferred character for 'Greek question mark'
x (greek question mark - 037E)
x (arabic semicolon - 061B)
x (reversed semicolon - 204F)
003C LESS-THAN SIGN
x (single left-pointing angle quotation mark - 2039)
x (left-pointing angle bracket - 2329)
+ x (mathematical left angle bracket - 27E8)
x (left angle bracket - 3008)
003D EQUALS SIGN
* other related characters: 2241-2263
@@ -198,6 +203,7 @@
003E GREATER-THAN SIGN
x (single right-pointing angle quotation mark - 203A)
x (right-pointing angle bracket - 232A)
+ x (mathematical right angle bracket - 27E9)
x (right angle bracket - 3009)
003F QUESTION MARK
x (inverted question mark - 00BF)
@@ -207,6 +213,7 @@
x (question exclamation mark - 2048)
x (exclamation question mark - 2049)
0040 COMMERCIAL AT
+@ Uppercase Latin alphabet
0041 LATIN CAPITAL LETTER A
0042 LATIN CAPITAL LETTER B
x (script capital b - 212C)
@@ -262,6 +269,7 @@
005A LATIN CAPITAL LETTER Z
x (double-struck capital z - 2124)
x (black-letter capital z - 2128)
+@ ASCII punctuation and symbols
005B LEFT SQUARE BRACKET
= OPENING SQUARE BRACKET
* other bracket characters: 3008-301B
@@ -289,6 +297,7 @@
x (modifier letter grave accent - 02CB)
x (combining grave accent - 0300)
x (reversed prime - 2035)
+@ Lowercase Latin alphabet
0061 LATIN SMALL LETTER A
0062 LATIN SMALL LETTER B
0063 LATIN SMALL LETTER C
@@ -327,6 +336,7 @@
0079 LATIN SMALL LETTER Y
007A LATIN SMALL LETTER Z
x (latin small letter z with stroke - 01B6)
+@ ASCII punctuation and symbols
007B LEFT CURLY BRACKET
= OPENING CURLY BRACKET
= opening brace
@@ -346,6 +356,7 @@
x (combining tilde - 0303)
x (tilde operator - 223C)
x (fullwidth tilde - FF5E)
+@ Control character
007F <control>
= DELETE
@@ 0080 C1 Controls and Latin-1 Supplement (Latin-1 Supplement) 00FF
@@ -411,8 +422,10 @@
= PRIVACY MESSAGE
009F <control>
= APPLICATION PROGRAM COMMAND
-@ ISO 8859-1 (aka Latin-1)
+@ Latin-1 punctuation and symbols
+@+ Based on ISO/IEC 8859-1 (aka Latin-1) from here.
00A0 NO-BREAK SPACE
+ = NBSP
x (space - 0020)
x (figure space - 2007)
x (narrow no-break space - 202F)
@@ -424,7 +437,7 @@
x (exclamation mark - 0021)
00A2 CENT SIGN
00A3 POUND SIGN
- = pound sterling, Irish punt
+ = pound sterling, Irish punt, Italian lira, Turkish lira, etc.
x (lira sign - 20A4)
00A4 CURRENCY SIGN
= Filzlaus, Ricardi-Sonne (German names)
@@ -457,6 +470,7 @@
= angled dash (in typography)
x (reversed not sign - 2310)
00AD SOFT HYPHEN
+ = SHY
= discretionary hyphen
x (mongolian todo soft hyphen - 1806)
00AE REGISTERED SIGN
@@ -502,7 +516,7 @@
00B7 MIDDLE DOT
= midpoint (in typography)
= Georgian comma
- = Greek middle dot
+ = Greek middle dot (ano teleia)
x (greek ano teleia - 0387)
x (bullet - 2022)
x (one dot leader - 2024)
@@ -541,6 +555,7 @@
= turned question mark
* Spanish
x (question mark - 003F)
+@ Letters
00C0 LATIN CAPITAL LETTER A WITH GRAVE
: 0041 0300
00C1 LATIN CAPITAL LETTER A WITH ACUTE
@@ -590,8 +605,10 @@
: 004F 0303
00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
: 004F 0308
+@ Mathematical operator
00D7 MULTIPLICATION SIGN
= z notation Cartesian product
+@ Letters
00D8 LATIN CAPITAL LETTER O WITH STROKE
= LATIN CAPITAL LETTER O SLASH
x (empty set - 2205)
@@ -669,7 +686,9 @@
: 006F 0303
00F6 LATIN SMALL LETTER O WITH DIAERESIS
: 006F 0308
+@ Mathematical operator
00F7 DIVISION SIGN
+@ Letters
00F8 LATIN SMALL LETTER O WITH STROKE
= LATIN SMALL LETTER O SLASH
* Danish, Norwegian, Faroese, IPA
@@ -744,6 +763,7 @@
x (latin capital letter african d - 0189)
0111 LATIN SMALL LETTER D WITH STROKE
* Croatian, Vietnamese, Sami
+ * an alternate glyph with the stroke through the bowl is used in Americanist orthographies
x (latin capital letter d with stroke - 0110)
x (cyrillic small letter dje - 0452)
0112 LATIN CAPITAL LETTER E WITH MACRON
@@ -1046,6 +1066,7 @@
@ Latin extended-B
0180 LATIN SMALL LETTER B WITH STROKE
* Americanist and Indo-Europeanist usage for phonetic beta
+ * Americanist orthographies use an alternate glyph with the stroke through the bowl
* Old Saxon
x (greek small letter beta - 03B2)
x (blank symbol - 2422)
@@ -1069,6 +1090,7 @@
x (cyrillic small letter soft sign - 044C)
0186 LATIN CAPITAL LETTER OPEN O
* typographically a turned C
+ * African
x (latin small letter open o - 0254)
0187 LATIN CAPITAL LETTER C WITH HOOK
0188 LATIN SMALL LETTER C WITH HOOK
@@ -1244,6 +1266,7 @@
* replaced by "w" in modern transcriptions of Old English
* uppercase is 01F7
x (runic letter wunjo wynn w - 16B9)
+@ African letters for clicks
01C0 LATIN LETTER DENTAL CLICK
= pipe
* Khoisan tradition
@@ -1494,6 +1517,8 @@
0220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
* Lakota
x (latin small letter n with long right leg - 019E)
+0221 LATIN SMALL LETTER D WITH CURL
+ * phonetic use in Sinology
0222 LATIN CAPITAL LETTER OU
0223 LATIN SMALL LETTER OU
* Algonquin, Huron
@@ -1536,9 +1561,13 @@
0233 LATIN SMALL LETTER Y WITH MACRON
* Livonian, Cornish
: 0079 0304
+@ Additions for Sinology
+0234 LATIN SMALL LETTER L WITH CURL
+0235 LATIN SMALL LETTER N WITH CURL
+0236 LATIN SMALL LETTER T WITH CURL
@@ 0250 IPA Extensions 02AF
@ IPA extensions
-@+ IPA includes basic Latin letters and a number of Latin letters from other blocks.
+@+ IPA includes basic Latin letters and a number of Latin or Greek letters from other blocks.
x (latin small letter ae - 00E6)
x (latin small letter c with cedilla - 00E7)
x (latin small letter eth - 00F0)
@@ -1767,7 +1796,7 @@
0292 LATIN SMALL LETTER EZH
= dram
* voiced postalveolar fricative
- * mistakenly identified as yogh in Unicode 1.0
+ * mistakenly named yogh in Unicode 1.0
* uppercase is 01B7
* Skolt Sami
x (latin small letter yogh - 021D)
@@ -1839,8 +1868,11 @@
* audible lip smack
02AD LATIN LETTER BIDENTAL PERCUSSIVE
* audible teeth gnashing
+@ Additions for Sinology
+02AE LATIN SMALL LETTER TURNED H WITH FISHHOOK
+02AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
@@ 02B0 Spacing Modifier Letters 02FF
-@ Phonetic modifiers derived from Latin letters
+@ Latin superscript modifier letters
02B0 MODIFIER LETTER SMALL H
* aspiration
# <super> 0068
@@ -1871,7 +1903,7 @@
# <super> 0077
02B8 MODIFIER LETTER SMALL Y
* palatalization
- * common Americanist substitution for 02B2
+ * common Americanist usage for 02B2
# <super> 0079
@ Miscellaneous phonetic modifiers
02B9 MODIFIER LETTER PRIME
@@ -2058,9 +2090,27 @@
@ IPA modifiers
02EC MODIFIER LETTER VOICING
02ED MODIFIER LETTER UNASPIRATED
-@ Other modifier letters
+@ Other modifier letter
02EE MODIFIER LETTER DOUBLE APOSTROPHE
* Nenets
+@ UPA modifiers
+02EF MODIFIER LETTER LOW DOWN ARROWHEAD
+02F0 MODIFIER LETTER LOW UP ARROWHEAD
+02F1 MODIFIER LETTER LOW LEFT ARROWHEAD
+02F2 MODIFIER LETTER LOW RIGHT ARROWHEAD
+02F3 MODIFIER LETTER LOW RING
+02F4 MODIFIER LETTER MIDDLE GRAVE ACCENT
+02F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT
+02F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT
+02F7 MODIFIER LETTER LOW TILDE
+02F8 MODIFIER LETTER RAISED COLON
+02F9 MODIFIER LETTER BEGIN HIGH TONE
+02FA MODIFIER LETTER END HIGH TONE
+02FB MODIFIER LETTER BEGIN LOW TONE
+02FC MODIFIER LETTER END LOW TONE
+02FD MODIFIER LETTER SHELF
+02FE MODIFIER LETTER OPEN SHELF
+02FF MODIFIER LETTER LOW LEFT ARROW
@@ 0300 Combining Diacritical Marks 036F
@ Ordinary diacritics
0300 COMBINING GRAVE ACCENT (Varia)
@@ -2297,11 +2347,25 @@
* IPA: whistled articulation
@ Grapheme joiner
034F COMBINING GRAPHEME JOINER
+ = CGJ
* has no visible glyph
* indicates that adjoining characters are to be treated as a graphemic unit
+@ Additions for the Uralic Phonetic Alphabet
+0350 COMBINING RIGHT ARROWHEAD ABOVE
+0351 COMBINING LEFT HALF RING ABOVE
+0352 COMBINING FERMATA
+0353 COMBINING X BELOW
+0354 COMBINING LEFT ARROWHEAD BELOW
+0355 COMBINING RIGHT ARROWHEAD BELOW
+0356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW
+0357 COMBINING RIGHT HALF RING ABOVE
@ Double diacritics
+035D COMBINING DOUBLE BREVE
+035E COMBINING DOUBLE MACRON
+035F COMBINING DOUBLE MACRON BELOW
0360 COMBINING DOUBLE TILDE
0361 COMBINING DOUBLE INVERTED BREVE
+ = ligature tie
0362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW
* IPA: sliding articulation
@ Medieval superscript letter diacritics
@@ -2337,6 +2401,7 @@
037E GREEK QUESTION MARK (Erotimatiko)
= erotimatiko
* sentence-final punctuation
+ * 003B is the preferred character
x (question mark - 003F)
: 003B semicolon
0384 GREEK TONOS
@@ -2348,7 +2413,8 @@
0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
: 0391 0301
0387 GREEK ANO TELEIA
- * functions in Greek like a semicolon
+ * functions in Greek like a semicolon
+ * 00B7 is the preferred character
: 00B7 middle dot
0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
: 0395 0301
@@ -2530,7 +2596,7 @@
03ED COPTIC SMALL LETTER SHIMA
03EE COPTIC CAPITAL LETTER DEI
03EF COPTIC SMALL LETTER DEI
-@ Greek symbols
+@ Variant letterforms
03F0 GREEK KAPPA SYMBOL
= GREEK SMALL LETTER SCRIPT KAPPA
* used as technical symbol
@@ -2544,7 +2610,7 @@
# 03C2 greek small letter final sigma
@ Additional letter
03F3 GREEK LETTER YOT
-@ Greek symbols
+@ Variant letterforms and symbols
03F4 GREEK CAPITAL THETA SYMBOL
x (cyrillic capital letter fita - 0472)
# 0398 greek capital letter theta
@@ -2555,6 +2621,15 @@
03F6 GREEK REVERSED LUNATE EPSILON SYMBOL
= reversed straight epsilon
x (small contains as member - 220D)
+@ Additional archaic letters for Bactrian
+03F7 GREEK CAPITAL LETTER SHO
+03F8 GREEK SMALL LETTER SHO
+@ Variant letterform
+03F9 GREEK CAPITAL LUNATE SIGMA SYMBOL
+ # 03A3 greek capital letter sigma
+@ Archaic letters
+03FA GREEK CAPITAL LETTER SAN
+03FB GREEK SMALL LETTER SAN
@@ 0400 Cyrillic 04FF
@ Cyrillic extensions
0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
@@ -2768,7 +2843,7 @@
* Kildin Sami
0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
- * Old Ukrainian
+ * Ukrainian
0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE
0493 CYRILLIC SMALL LETTER GHE WITH STROKE
* Azerbaijani, Bashkir, ...
@@ -3195,16 +3270,42 @@
05F3 HEBREW PUNCTUATION GERESH
05F4 HEBREW PUNCTUATION GERSHAYIM
@@ 0600 Arabic 06FF
-@ Based on ISO 8859-6
+@ Subtending marks
+0600 ARABIC NUMBER SIGN
+0601 ARABIC SIGN SANAH
+0602 ARABIC FOOTNOTE MARKER
+0603 ARABIC SIGN SAFHA
+@ Punctuation
060C ARABIC COMMA
* also used with Thaana and Syriac in modern text
x (comma - 002C)
+060D ARABIC DATE SEPARATOR
+@ Poetic marks
+060E ARABIC POETIC VERSE SIGN
+060F ARABIC SIGN MISRA
+@ Honorifics
+0610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
+ * represents sallallahu alayhe wasallam "may God's peace and blessings be upon him"
+0611 ARABIC SIGN ALAYHE ASSALLAM
+ * represents alayhe assalam "upon him be peace"
+0612 ARABIC SIGN RAHMATULLAH ALAYHE
+ * represents rahmatullah alayhe "may God have mercy upon him"
+0613 ARABIC SIGN RADI ALLAHOU ANHU
+ * represents radi allahu 'anhu "may God be pleased with him"
+0614 ARABIC SIGN TAKHALLUS
+ * sign placed over the name or nom-de-plume of a poet, or in some writings used to mark all proper names
+@ Koranic annotation sign
+0615 ARABIC SMALL HIGH TAH
+ * marks a recommended pause position in some Korans published in Iran and Pakistan
+ * should not be confused with the small TAH sign used as a diacritic for some letters such as 0679
+@ Punctuation
061B ARABIC SEMICOLON
* also used with Thaana and Syriac in modern text
x (semicolon - 003B)
061F ARABIC QUESTION MARK
* also used with Thaana and Syriac in modern text
x (question mark - 003F)
+@ Based on ISO 8859-6
0621 ARABIC LETTER HAMZA
x (modifier letter right half ring - 02BE)
0622 ARABIC LETTER ALEF WITH MADDA ABOVE
@@ -3264,12 +3365,18 @@
0651 ARABIC SHADDA
0652 ARABIC SUKUN
* marks absence of a vowel after the base consonant
- * used in some Korans (Qur'ans) to mark a long vowel as ignored
+ * used in some Korans to mark a long vowel as ignored
x (arabic small high dotless head of khah - 06E1)
@ Combining maddah and hamza
0653 ARABIC MADDAH ABOVE
0654 ARABIC HAMZA ABOVE
0655 ARABIC HAMZA BELOW
+@ Other combining marks
+0656 ARABIC SUBSCRIPT ALEF
+0657 ARABIC INVERTED DAMMA
+0658 ARABIC MARK NOON GHUNNA
+ * Kashmiri and Baluchi
+ * indicates nasalization in Urdu
@ Arabic-Indic digits
@+ These digits are used with Arabic proper; for languages of Iran, Pakistan, and India, see the Eastern Arabic-Indic digits at 06F0..06F9.
0660 ARABIC-INDIC DIGIT ZERO
@@ -3287,6 +3394,8 @@
x (percent sign - 0025)
066B ARABIC DECIMAL SEPARATOR
066C ARABIC THOUSANDS SEPARATOR
+ x (apostrophe - 0027)
+ x (right single quotation mark - 2019)
066D ARABIC FIVE POINTED STAR
x (asterisk - 002A)
@ Archaic letters
@@ -3294,9 +3403,10 @@
066F ARABIC LETTER DOTLESS QAF
@ Point
0670 ARABIC LETTER SUPERSCRIPT ALEF
+ * actually a vowel sign, despite the name
@ Extended Arabic letters
0671 ARABIC LETTER ALEF WASLA
- * Arabic
+ * Koranic Arabic
0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE
* Baluchi, Kashmiri
0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
@@ -3335,7 +3445,7 @@
0681 ARABIC LETTER HAH WITH HAMZA ABOVE
* Pashto
0682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE
- * Pashto
+ * not used in modern Pashto
0683 ARABIC LETTER NYEH
* Sindhi
0684 ARABIC LETTER DYEH
@@ -3359,11 +3469,12 @@
068D ARABIC LETTER DDAHAL
* Sindhi
068E ARABIC LETTER DUL
- * Sindhi
+ * older shape for DUL, now obsolete in Sindhi
068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS
* Sindhi
+ * current shape used for DUL
0690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE
- * Urdu
+ * old Urdu, not in current use
0691 ARABIC LETTER RREH
* Urdu
0692 ARABIC LETTER REH WITH SMALL V
@@ -3402,9 +3513,9 @@
06A3 ARABIC LETTER FEH WITH DOT BELOW
* Ingush
06A4 ARABIC LETTER VEH
- * Arabic for foreign words
+ * Middle Eastern Arabic for foreign words
06A5 ARABIC LETTER FEH WITH THREE DOTS BELOW
- * Arabic for foreign words
+ * North African Arabic for foreign words
06A6 ARABIC LETTER PEHEH
* Sindhi
06A7 ARABIC LETTER QAF WITH DOT ABOVE
@@ -3416,6 +3527,7 @@
06AA ARABIC LETTER SWASH KAF
06AB ARABIC LETTER KAF WITH RING
* Pashto
+ * may appear like an Arabic KAF (0643) with a ring below the base
06AC ARABIC LETTER KAF WITH DOT ABOVE
* old Malay
06AD ARABIC LETTER NG
@@ -3429,11 +3541,11 @@
06B1 ARABIC LETTER NGOEH
* Sindhi
06B2 ARABIC LETTER GAF WITH TWO DOTS BELOW
- * Sindhi
+ * not used in Sindhi
06B3 ARABIC LETTER GUEH
* Sindhi
06B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE
- * Sindhi
+ * not used in Sindhi
06B5 ARABIC LETTER LAM WITH SMALL V
* Kurdish
06B6 ARABIC LETTER LAM WITH DOT ABOVE
@@ -3457,14 +3569,14 @@
06C0 ARABIC LETTER HEH WITH YEH ABOVE
= ARABIC LETTER HAMZAH ON HA
= izafet
- * Persian, Urdu
- * actually a ligature, and not an independent letter
+ * Urdu
+ * actually a ligature, not an independent letter
: 06D5 0654
06C1 ARABIC LETTER HEH GOAL
* Urdu
06C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
* Urdu
- * actually a ligature, and not an independent letter
+ * actually a ligature, not an independent letter
: 06C1 0654
06C3 ARABIC LETTER TEH MARBUTA GOAL
* Urdu
@@ -3486,6 +3598,9 @@
* Uighur, Kazakh
06CC ARABIC LETTER FARSI YEH
* Arabic, Persian, Urdu, ...
+ * initial and medial forms of this letter have dots
+ x (arabic letter alef maksura - 0649)
+ x (arabic letter yeh - 064A)
06CD ARABIC LETTER YEH WITH TAIL
* Pashto, Sindhi
06CE ARABIC LETTER YEH WITH SMALL V
@@ -3500,7 +3615,7 @@
* Urdu
06D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
* Urdu
- * actually a ligature, and not an independent letter
+ * actually a ligature, not an independent letter
: 06D2 0654
@ Punctuation
06D4 ARABIC FULL STOP
@@ -3536,8 +3651,11 @@
06EB ARABIC EMPTY CENTRE HIGH STOP
06EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
06ED ARABIC SMALL LOW MEEM
+@ Extended Arabic letters for Parkari
+06EE ARABIC LETTER DAL WITH INVERTED V
+06EF ARABIC LETTER REH WITH INVERTED V
@ Eastern Arabic-Indic digits
-@+ These digits are used with Arabic-script languages of Iran, Pakistan, and India (Persian, Sindhi, Urdu, etc.).
+@+ These digits are used with Arabic-script languages of Iran, Pakistan, and India (Persian, Sindhi, Urdu, etc.). For details of variations in preferred glyphs, see the block description for the Arabic script.
06F0 EXTENDED ARABIC-INDIC DIGIT ZERO
06F1 EXTENDED ARABIC-INDIC DIGIT ONE
06F2 EXTENDED ARABIC-INDIC DIGIT TWO
@@ -3559,6 +3677,8 @@
@ Signs for Sindhi
06FD ARABIC SIGN SINDHI AMPERSAND
06FE ARABIC SIGN SINDHI POSTPOSITION MEN
+@ Extended Arabic letter for Parkari
+06FF ARABIC LETTER HEH WITH INVERTED V
@@ 0700 Syriac 074F
@ Syriac punctuation and signs
0700 SYRIAC END OF PARAGRAPH
@@ -3592,6 +3712,7 @@
* marks the beginning of a phrase, word, or morpheme that has a marginal note
@ Syriac format control character
070F SYRIAC ABBREVIATION MARK
+ = SAM
* marks the beginning of a Syriac abbreviation
@ Syriac letters
0710 SYRIAC LETTER ALAPH
@@ -3629,6 +3750,10 @@
072A SYRIAC LETTER RISH
072B SYRIAC LETTER SHIN
072C SYRIAC LETTER TAW
+@ Persian letters
+072D SYRIAC LETTER PERSIAN BHETH
+072E SYRIAC LETTER PERSIAN GHAMAL
+072F SYRIAC LETTER PERSIAN DHALATH
@ Syriac points (vowels)
0730 SYRIAC PTHAHA ABOVE
0731 SYRIAC PTHAHA BELOW
@@ -3671,6 +3796,10 @@
* also used in the Syrian Orthodox Anaphora book to mark the breaking of the Eucharist bread
074A SYRIAC BARREKH
* a diacritic cross used in liturgical texts
+@ Sogdian letters
+074D SYRIAC LETTER SOGDIAN ZHAIN
+074E SYRIAC LETTER SOGDIAN KHAPH
+074F SYRIAC LETTER SOGDIAN FE
@@ 0780 Thaana 07BF
@ Basic consonants
0780 THAANA LETTER HAA
@@ -3736,6 +3865,7 @@
= bindu
0903 DEVANAGARI SIGN VISARGA
@ Independent vowels
+0904 DEVANAGARI LETTER SHORT A
0905 DEVANAGARI LETTER A
0906 DEVANAGARI LETTER AA
0907 DEVANAGARI LETTER I
@@ -3825,7 +3955,7 @@
094C DEVANAGARI VOWEL SIGN AU
@ Various signs
094D DEVANAGARI SIGN VIRAMA
- = halant (the preferred name)
+ = halant (the preferred Hindi name)
* suppresses inherent vowel
0950 DEVANAGARI OM
0951 DEVANAGARI STRESS SIGN UDATTA
@@ -3855,8 +3985,10 @@
0962 DEVANAGARI VOWEL SIGN VOCALIC L
0963 DEVANAGARI VOWEL SIGN VOCALIC LL
0964 DEVANAGARI DANDA
- = phrase separator
+ = purna viram
+ * phrase separator
0965 DEVANAGARI DOUBLE DANDA
+ = deergh viram
@ Digits
0966 DEVANAGARI DIGIT ZERO
0967 DEVANAGARI DIGIT ONE
@@ -3926,6 +4058,7 @@
@ Various signs
09BC BENGALI SIGN NUKTA
* for extending the alphabet to new letters
+09BD BENGALI SIGN AVAGRAHA
@ Dependent vowel signs
09BE BENGALI VOWEL SIGN AA
09BF BENGALI VOWEL SIGN I
@@ -3939,15 +4072,15 @@
* stands to the left of the consonant
09C8 BENGALI VOWEL SIGN AI
* stands to the left of the consonant
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
09CB BENGALI VOWEL SIGN O
- * pieces on both sides of the consonant
: 09C7 09BE
09CC BENGALI VOWEL SIGN AU
- * pieces on both sides of the consonant
: 09C7 09D7
@ Various signs
09CD BENGALI SIGN VIRAMA
- = halant
+ = hasant (Bengali term for halant)
09D7 BENGALI AU LENGTH MARK
@ Additional consonants
09DC BENGALI LETTER RRA
@@ -3993,7 +4126,9 @@
@@ 0A00 Gurmukhi 0A7F
@ Based on ISCII 1988
@ Various signs
+0A01 GURMUKHI SIGN ADAK BINDI
0A02 GURMUKHI SIGN BINDI
+0A03 GURMUKHI SIGN VISARGA
@ Independent vowels
0A05 GURMUKHI LETTER A
0A06 GURMUKHI LETTER AA
@@ -4103,6 +4238,8 @@
0A89 GUJARATI LETTER U
0A8A GUJARATI LETTER UU
0A8B GUJARATI LETTER VOCALIC R
+0A8C GUJARATI LETTER VOCALIC L
+ * used with Sanskrit text
0A8D GUJARATI VOWEL CANDRA E
0A8F GUJARATI LETTER E
0A90 GUJARATI LETTER AI
@@ -4166,8 +4303,12 @@
@ Various signs
0ACD GUJARATI SIGN VIRAMA
0AD0 GUJARATI OM
-@ Generic additions
+@ Generic addition
0AE0 GUJARATI LETTER VOCALIC RR
+@ Additions for use with Sanskrit text
+0AE1 GUJARATI LETTER VOCALIC LL
+0AE2 GUJARATI VOWEL SIGN VOCALIC L
+0AE3 GUJARATI VOWEL SIGN VOCALIC LL
@ Digits
0AE6 GUJARATI DIGIT ZERO
0AE7 GUJARATI DIGIT ONE
@@ -4179,6 +4320,8 @@
0AED GUJARATI DIGIT SEVEN
0AEE GUJARATI DIGIT EIGHT
0AEF GUJARATI DIGIT NINE
+@ Currency sign
+0AF1 GUJARATI RUPEE SIGN
@@ 0B00 Oriya 0B7F
@ Based on ISCII 1988
@ Various signs
@@ -4222,14 +4365,14 @@
0B2A ORIYA LETTER PA
0B2B ORIYA LETTER PHA
0B2C ORIYA LETTER BA
- = Oriya va
+ x (oriya letter va - 0B35)
0B2D ORIYA LETTER BHA
0B2E ORIYA LETTER MA
0B2F ORIYA LETTER YA
0B30 ORIYA LETTER RA
0B32 ORIYA LETTER LA
0B33 ORIYA LETTER LLA
-0B35 <reserved>
+0B35 ORIYA LETTER VA
x (oriya letter ba - 0B2C)
0B36 ORIYA LETTER SHA
0B37 ORIYA LETTER SSA
@@ -4251,11 +4394,11 @@
0B48 ORIYA VOWEL SIGN AI
* pieces left of and above the consonant
: 0B47 0B56
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
0B4B ORIYA VOWEL SIGN O
- * pieces on both sides of the consonant
: 0B47 0B3E
0B4C ORIYA VOWEL SIGN AU
- * pieces on both sides of the consonant
: 0B47 0B57
@ Various signs
0B4D ORIYA SIGN VIRAMA
@@ -4263,8 +4406,10 @@
0B57 ORIYA AU LENGTH MARK
@ Additional consonants
0B5C ORIYA LETTER RRA
+ = dda
: 0B21 0B3C
0B5D ORIYA LETTER RHA
+ = ddha
: 0B22 0B3C
0B5F ORIYA LETTER YYA
@ Generic additions
@@ -4281,12 +4426,16 @@
0B6D ORIYA DIGIT SEVEN
0B6E ORIYA DIGIT EIGHT
0B6F ORIYA DIGIT NINE
-@ Oriya-specific addition
+@ Oriya-specific additions
0B70 ORIYA ISSHAR
+0B71 ORIYA LETTER WA
+ x (oriya letter o - 0B13)
+ x (oriya letter va - 0B35)
@@ 0B80 Tamil 0BFF
@ Based on ISCII 1988
@ Various signs
0B82 TAMIL SIGN ANUSVARA
+ * not used in Tamil
0B83 TAMIL SIGN VISARGA
= aytham
@ Independent vowels
@@ -4338,14 +4487,13 @@
* stands to the left of the consonant
0BC8 TAMIL VOWEL SIGN AI
* stands to the left of the consonant
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
0BCA TAMIL VOWEL SIGN O
- * pieces on both sides of the consonant
: 0BC6 0BBE
0BCB TAMIL VOWEL SIGN OO
- * pieces on both sides of the consonant
: 0BC7 0BBE
0BCC TAMIL VOWEL SIGN AU
- * pieces on both sides of the consonant
: 0BC6 0BD7
@ Various signs
0BCD TAMIL SIGN VIRAMA
@@ -4362,10 +4510,21 @@
0BED TAMIL DIGIT SEVEN
0BEE TAMIL DIGIT EIGHT
0BEF TAMIL DIGIT NINE
-@ Tamil-specific additions
+@ Tamil numerics
0BF0 TAMIL NUMBER TEN
0BF1 TAMIL NUMBER ONE HUNDRED
0BF2 TAMIL NUMBER ONE THOUSAND
+@ Tamil symbols
+0BF3 TAMIL DAY SIGN (Naal)
+0BF4 TAMIL MONTH SIGN (Maatham)
+0BF5 TAMIL YEAR SIGN (Varudam)
+0BF6 TAMIL DEBIT SIGN (Patru)
+0BF7 TAMIL CREDIT SIGN (Varavu)
+0BF8 TAMIL AS ABOVE SIGN (Merpadi)
+@ Currency symbol
+0BF9 TAMIL RUPEE SIGN (Rupai)
+@ Tamil symbol
+0BFA TAMIL NUMBER SIGN (Enn)
@@ 0C00 Telugu 0C7F
@ Based on ISCII 1988
@ Various signs
@@ -4514,6 +4673,9 @@
0CB7 KANNADA LETTER SSA
0CB8 KANNADA LETTER SA
0CB9 KANNADA LETTER HA
+@ Various signs
+0CBC KANNADA SIGN NUKTA
+0CBD KANNADA SIGN AVAGRAHA
@ Dependent vowel signs
0CBE KANNADA VOWEL SIGN AA
0CBF KANNADA VOWEL SIGN I
@@ -4535,6 +4697,7 @@
0CCC KANNADA VOWEL SIGN AU
@ Various signs
0CCD KANNADA SIGN VIRAMA
+ * preferred name is halant
0CD5 KANNADA LENGTH MARK
0CD6 KANNADA AI LENGTH MARK
@ Additional consonants
@@ -4641,20 +4804,20 @@
* stands to the left of the consonant
0D48 MALAYALAM VOWEL SIGN AI
* stands to the left of the consonant
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
0D4A MALAYALAM VOWEL SIGN O
- * pieces on both sides of the consonant
: 0D46 0D3E
0D4B MALAYALAM VOWEL SIGN OO
- * pieces on both sides of the consonant
: 0D47 0D3E
0D4C MALAYALAM VOWEL SIGN AU
- * pieces on both sides of the consonant
: 0D46 0D57
@ Various signs
0D4D MALAYALAM SIGN VIRAMA
= chandrakkala (the preferred name)
= vowel half-u
0D57 MALAYALAM AU LENGTH MARK
+ * only a representation of the right half of 0D4C
@ Generic additions
0D60 MALAYALAM LETTER VOCALIC RR
0D61 MALAYALAM LETTER VOCALIC LL
@@ -4826,6 +4989,8 @@
: 0DD9 0DCA
0DDB SINHALA VOWEL SIGN KOMBU DEKA
= sinhala vowel sign ai
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for most processing.
0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
= sinhala vowel sign o
: 0DD9 0DCF
@@ -4835,6 +5000,7 @@
0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
= sinhala vowel sign au
: 0DD9 0DDF
+@ Dependent vowel sign
0DDF SINHALA VOWEL SIGN GAYANUKITTA
= sinhala vowel sign vocalic l
@ Additional dependent vowel signs
@@ -5391,6 +5557,7 @@
1020 MYANMAR LETTER LLA
@ Independent vowels
1021 MYANMAR LETTER A
+ * also represents the glottal stop as a consonant
1023 MYANMAR LETTER I
1024 MYANMAR LETTER II
1025 MYANMAR LETTER U
@@ -5537,27 +5704,46 @@
@ Punctuation
10FB GEORGIAN PARAGRAPH SEPARATOR
@@ 1100 Hangul Jamo 11FF
+@+ The aliases in this block represent the Jamo short names.
@ Korean combining alphabet
@ Initial consonants
1100 HANGUL CHOSEONG KIYEOK (g) *
+ = G
1101 HANGUL CHOSEONG SSANGKIYEOK (gg) *
+ = GG
1102 HANGUL CHOSEONG NIEUN (n) *
+ = N
1103 HANGUL CHOSEONG TIKEUT (d) *
+ = D
1104 HANGUL CHOSEONG SSANGTIKEUT (dd) *
+ = DD
1105 HANGUL CHOSEONG RIEUL (r) *
+ = R
1106 HANGUL CHOSEONG MIEUM (m) *
+ = M
1107 HANGUL CHOSEONG PIEUP (b) *
+ = B
1108 HANGUL CHOSEONG SSANGPIEUP (bb) *
+ = BB
1109 HANGUL CHOSEONG SIOS (s) *
+ = S
110A HANGUL CHOSEONG SSANGSIOS (ss) *
+ = SS
110B HANGUL CHOSEONG IEUNG
110C HANGUL CHOSEONG CIEUC (j) *
+ = J
110D HANGUL CHOSEONG SSANGCIEUC (jj) *
+ = JJ
110E HANGUL CHOSEONG CHIEUCH (c) *
+ = C
110F HANGUL CHOSEONG KHIEUKH (k) *
+ = K
1110 HANGUL CHOSEONG THIEUTH (t) *
+ = T
1111 HANGUL CHOSEONG PHIEUPH (p) *
+ = P
1112 HANGUL CHOSEONG HIEUH (h) *
+ = H
1113 HANGUL CHOSEONG NIEUN-KIYEOK
1114 HANGUL CHOSEONG SSANGNIEUN
1115 HANGUL CHOSEONG NIEUN-TIKEUT
@@ -5633,26 +5819,47 @@
@ Medial vowels
1160 HANGUL JUNGSEONG FILLER
1161 HANGUL JUNGSEONG A
+ = A
1162 HANGUL JUNGSEONG AE
+ = AE
1163 HANGUL JUNGSEONG YA
+ = YA
1164 HANGUL JUNGSEONG YAE
+ = YAE
1165 HANGUL JUNGSEONG EO
+ = EO
1166 HANGUL JUNGSEONG E
+ = E
1167 HANGUL JUNGSEONG YEO
+ = YEO
1168 HANGUL JUNGSEONG YE
+ = YE
1169 HANGUL JUNGSEONG O
+ = O
116A HANGUL JUNGSEONG WA
+ = WA
116B HANGUL JUNGSEONG WAE
+ = WAE
116C HANGUL JUNGSEONG OE
+ = OE
116D HANGUL JUNGSEONG YO
+ = YO
116E HANGUL JUNGSEONG U
+ = U
116F HANGUL JUNGSEONG WEO
+ = WEO
1170 HANGUL JUNGSEONG WE
+ = WE
1171 HANGUL JUNGSEONG WI
+ = WI
1172 HANGUL JUNGSEONG YU
+ = YU
1173 HANGUL JUNGSEONG EU
+ = EU
1174 HANGUL JUNGSEONG YI
+ = YI
1175 HANGUL JUNGSEONG I
+ = I
1176 HANGUL JUNGSEONG A-O
1177 HANGUL JUNGSEONG A-U
1178 HANGUL JUNGSEONG YA-O
@@ -5700,32 +5907,59 @@
11A2 HANGUL JUNGSEONG SSANGARAEA
@ Final consonants
11A8 HANGUL JONGSEONG KIYEOK (g) *
+ = G
11A9 HANGUL JONGSEONG SSANGKIYEOK (gg) *
+ = GG
11AA HANGUL JONGSEONG KIYEOK-SIOS (gs) *
+ = GS
11AB HANGUL JONGSEONG NIEUN (n) *
+ = N
11AC HANGUL JONGSEONG NIEUN-CIEUC (nj) *
+ = NJ
11AD HANGUL JONGSEONG NIEUN-HIEUH (nh) *
+ = NH
11AE HANGUL JONGSEONG TIKEUT (d) *
+ = D
11AF HANGUL JONGSEONG RIEUL (l) *
+ = L
11B0 HANGUL JONGSEONG RIEUL-KIYEOK (lg) *
+ = LG
11B1 HANGUL JONGSEONG RIEUL-MIEUM (lm) *
+ = LM
11B2 HANGUL JONGSEONG RIEUL-PIEUP (lb) *
+ = LB
11B3 HANGUL JONGSEONG RIEUL-SIOS (ls) *
+ = LS
11B4 HANGUL JONGSEONG RIEUL-THIEUTH (lt) *
+ = LT
11B5 HANGUL JONGSEONG RIEUL-PHIEUPH (lp) *
+ = LP
11B6 HANGUL JONGSEONG RIEUL-HIEUH (lh) *
+ = LH
11B7 HANGUL JONGSEONG MIEUM (m) *
+ = M
11B8 HANGUL JONGSEONG PIEUP (b) *
+ = M
11B9 HANGUL JONGSEONG PIEUP-SIOS (bs) *
+ = BS
11BA HANGUL JONGSEONG SIOS (s) *
+ = S
11BB HANGUL JONGSEONG SSANGSIOS (ss) *
+ = SS
11BC HANGUL JONGSEONG IEUNG (ng) *
+ = NG
11BD HANGUL JONGSEONG CIEUC (j) *
+ = J
11BE HANGUL JONGSEONG CHIEUCH (c) *
+ = C
11BF HANGUL JONGSEONG KHIEUKH (k) *
+ = K
11C0 HANGUL JONGSEONG THIEUTH (t) *
+ = T
11C1 HANGUL JONGSEONG PHIEUPH (p) *
+ = P
11C2 HANGUL JONGSEONG HIEUH (h) *
+ = H
11C3 HANGUL JONGSEONG KIYEOK-RIEUL
11C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
11C5 HANGUL JONGSEONG NIEUN-KIYEOK
@@ -7137,7 +7371,7 @@
@ Dependent vowel signs
1732 HANUNOO VOWEL SIGN I
1733 HANUNOO VOWEL SIGN U
-@ Hanunóo-specific punctuation
+@ Virama
1734 HANUNOO SIGN PAMUDPOD
@ Generic punctuation for Philippine scripts
1735 PHILIPPINE SINGLE PUNCTUATION
@@ -7207,6 +7441,7 @@
178C KHMER LETTER DO
178D KHMER LETTER TTHO
178E KHMER LETTER NNO
+ * as this character belongs to the first register, its correct transliteration is no, not nno
178F KHMER LETTER TA
1790 KHMER LETTER THA
1791 KHMER LETTER TO
@@ -7225,16 +7460,18 @@
* used only for Pali/Sanskrit transliteration
179E KHMER LETTER SSO
* used only for Pali/Sanskrit transliteration
+ * as this character belongs to the first register, its correct transliteration is ssa, not sso
179F KHMER LETTER SA
17A0 KHMER LETTER HA
17A1 KHMER LETTER LA
17A2 KHMER LETTER QA
* glottal stop
+@ Independent vowel (deprecated)
+17A3 KHMER INDEPENDENT VOWEL QAQ *
+ * originally intended only for Pali/Sanskrit transliteration
+ * use of this character is strongly discouraged; 17A2 should be used instead
@ Independent vowels
-17A3 KHMER INDEPENDENT VOWEL QAQ
- * used only for Pali/Sanskrit transliteration
- * use of this character is discouraged; 17A2 should be used instead
-17A4 KHMER INDEPENDENT VOWEL QAA
+17A4 KHMER INDEPENDENT VOWEL QAA *
* used only for Pali/Sanskrit transliteration
* use of this character is discouraged; the sequence 17A2 17B6 should be used instead
17A5 KHMER INDEPENDENT VOWEL QI
@@ -7253,13 +7490,13 @@
17B0 KHMER INDEPENDENT VOWEL QAI
17B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE
17B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO
- * this is a variant of 17B1, used in only two words
+ * this is a variant for 17B1, used in only two words
* 17B1 is the normal variant of this vowel
17B3 KHMER INDEPENDENT VOWEL QAU
@ Inherent vowels
@+ These are for phonetic transcription to distinguish Indic language inherent vowels from Khmer inherent vowels. These characters are included solely for compatibility with particular applications; their use in other contexts is discouraged.
-17B4 KHMER VOWEL INHERENT AQ
-17B5 KHMER VOWEL INHERENT AA
+17B4 KHMER VOWEL INHERENT AQ *
+17B5 KHMER VOWEL INHERENT AA *
@ Dependent vowel signs
17B6 KHMER VOWEL SIGN AA
17B7 KHMER VOWEL SIGN I
@@ -7269,12 +7506,17 @@
17BB KHMER VOWEL SIGN U
17BC KHMER VOWEL SIGN UU
17BD KHMER VOWEL SIGN UA
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing.
17BE KHMER VOWEL SIGN OE
17BF KHMER VOWEL SIGN YA
17C0 KHMER VOWEL SIGN IE
+@ Dependent vowel signs
17C1 KHMER VOWEL SIGN E
17C2 KHMER VOWEL SIGN AE
17C3 KHMER VOWEL SIGN AI
+@ Two-part dependent vowel signs
+@+ These two-part dependent vowel signs have glyph pieces which stand on both sides of the consonant. These vowel signs follow the consonant in logical order, and should be handled as a unit for processing.
17C4 KHMER VOWEL SIGN OO
17C5 KHMER VOWEL SIGN AU
@ Various signs
@@ -7282,6 +7524,7 @@
= srak am
= anusvara
* final nasalization
+ * this character is usually regarded as a vowel sign am, along with om and aam
x (thai character nikhahit - 0E4D)
x (myanmar sign anusvara - 1036)
17C7 KHMER SIGN REAHMUK
@@ -7290,65 +7533,81 @@
x (myanmar sign visarga - 1038)
17C8 KHMER SIGN YUUKALEAPINTU
* inserts a short inherent vowel with abrupt glottal stop
+ * the preferred transliteration is yukaleakpintu
@ Consonant shifters
@+ These signs shift the base consonant between registers.
17C9 KHMER SIGN MUUSIKATOAN
- * change second register to first
+ * changes the second register to the first
+ * the preferred transliteration is muusekatoan
17CA KHMER SIGN TRIISAP
- * change first register to second
+ * changes the first register to the second
+ * the preferred transliteration is treisap
@ Various signs
17CB KHMER SIGN BANTOC
- * shortens preceding vowel
+ * shortens the vowel sound in the previous orthographic syllable
+ * the preferred transliteration is bantak
17CC KHMER SIGN ROBAT
- * corresponds to initial r in Indian loan words, but treated as a diacritic
+ * a diacritic historically corresponding to the repha form of ra in Devanagari
17CD KHMER SIGN TOANDAKHIAT
- * marks character not to be pronounced
+ * indicates that the base character is not pronounced
17CE KHMER SIGN KAKABAT
* sign used with some exclamations
17CF KHMER SIGN AHSDA
- * conjoined sign used in spelling of two single-consonant words
+ * denotes stressed intonation in some single-consonant words
17D0 KHMER SIGN SAMYOK SANNYA
- * used with 17A4 to indicate shortened inherent vowel
+ * denotes deviation from the general rules of pronunciation, mostly used in loan words from Pali/Sanskrit, French, and so on
17D1 KHMER SIGN VIRIAM
- * mostly obsolete
- * indicates the base character is part of the previous word
+ * mostly obsolete, a "killer"
+ * indicates that the base character is the final consonant of a word without its inherent vowel sound
17D2 KHMER SIGN COENG
- * functions to indicate that a following Khmer letter is to be subscripted
+ * functions to indicate that a following Khmer letter is to be rendered subscripted
* shape shown is arbitrary and is not visibly rendered
-17D3 KHMER SIGN BATHAMASAT
- * rare sign representing the first August of leap year in the lunar calendar
- * use of this character is discouraged in favor of a complete set of lunar date symbols under development for encoding
+@ Lunar date sign (deprecated)
+17D3 KHMER SIGN BATHAMASAT *
+ * originally intended as part of lunar date symbols
+ * use of this character is strongly discouraged in favor of the complete set of lunar date symbols
+ x (khmer symbol pathamasat - 19E0)
+@ Various signs
17D4 KHMER SIGN KHAN
- * functions as full stop, ellipsis, abbreviation
+ * functions as a full stop, period
x (thai character paiyannoi - 0E2F)
x (myanmar sign little section - 104A)
17D5 KHMER SIGN BARIYOOSAN
- * end of section
+ * indicates the end of a section or a text
x (thai character angkhankhu - 0E5A)
x (myanmar sign section - 104B)
17D6 KHMER SIGN CAMNUC PII KUUH
- * functions as colon or semicolon
+ * functions as colon
+ * the preferred transliteration is camnoc pii kuuh
x (division sign - 00F7)
x (tibetan mark gter tsheg - 0F14)
17D7 KHMER SIGN LEK TOO
* repetition sign
x (thai character maiyamok - 0E46)
-17D8 KHMER SIGN BEYYAL
+17D8 KHMER SIGN BEYYAL *
* et cetera
* use of this character is discouraged; other abbreviations for et cetera also exist
* preferred spelling: 17D4 179B 17D4
17D9 KHMER SIGN PHNAEK MUAN
- * a list bullet
+ * indicates the beginning of a book or a treatise
+ * the preferred transliteration is phnek moan
x (thai character fongman - 0E4F)
17DA KHMER SIGN KOOMUUT
- * indicates end of book or treatise
+ * indicates the end of a book or treatise
+ * this forms a pair with 17D9
+ * the preferred transliteration is koomoot
x (thai character khomut - 0E5B)
@ Currency symbol
17DB KHMER CURRENCY SYMBOL RIEL
-@ Sign
+@ Various signs
17DC KHMER SIGN AVAKRAHASANYA
- * rare, shows a deleted Sanskrit vowel, like an apostrophe
+ * rare, shows an omitted Sanskrit vowel, like an apostrophe
+ * the preferred transliteration is avakraha sannya
x (devanagari sign avagraha - 093D)
+17DD KHMER SIGN ATTHACAN
+ * mostly obsolete
+ * indicates that the base character is the final consonant of a word with its inherent vowel sound
+ x (khmer sign viriam - 17D1)
@ Digits
17E0 KHMER DIGIT ZERO
17E1 KHMER DIGIT ONE
@@ -7360,6 +7619,18 @@
17E7 KHMER DIGIT SEVEN
17E8 KHMER DIGIT EIGHT
17E9 KHMER DIGIT NINE
+@ Numeric symbols for divination lore
+@+ These characters have numeric values 0-9, respectively, but are not used for calculation.
+17F0 KHMER SYMBOL LEK ATTAK SON
+17F1 KHMER SYMBOL LEK ATTAK MUOY
+17F2 KHMER SYMBOL LEK ATTAK PII
+17F3 KHMER SYMBOL LEK ATTAK BEI
+17F4 KHMER SYMBOL LEK ATTAK BUON
+17F5 KHMER SYMBOL LEK ATTAK PRAM
+17F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY
+17F7 KHMER SYMBOL LEK ATTAK PRAM-PII
+17F8 KHMER SYMBOL LEK ATTAK PRAM-BEI
+17F9 KHMER SYMBOL LEK ATTAK PRAM-BUON
@@ 1800 Mongolian 18AF
@ Punctuation
1800 MONGOLIAN BIRGA
@@ -7371,15 +7642,21 @@
1805 MONGOLIAN FOUR DOTS
* marks the end of a chapter
1806 MONGOLIAN TODO SOFT HYPHEN
+ * not a format control character, but simply a hyphen for Todo
+ x (soft hyphen - 00AD)
1807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
1808 MONGOLIAN MANCHU COMMA
1809 MONGOLIAN MANCHU FULL STOP
180A MONGOLIAN NIRUGU
@ Format controls
180B MONGOLIAN FREE VARIATION SELECTOR ONE
+ = FVS1
180C MONGOLIAN FREE VARIATION SELECTOR TWO
+ = FVS2
180D MONGOLIAN FREE VARIATION SELECTOR THREE
+ = FVS3
180E MONGOLIAN VOWEL SEPARATOR
+ = MVS
@ Digits
1810 MONGOLIAN DIGIT ZERO
1811 MONGOLIAN DIGIT ONE
@@ -7560,7 +7837,343 @@
18A7 MONGOLIAN LETTER ALI GALI HALF YA
18A8 MONGOLIAN LETTER MANCHU ALI GALI BHA
18A9 MONGOLIAN LETTER ALI GALI DAGALGA
+@@ 1900 Limbu 194F
+@ Consonants
+1900 LIMBU VOWEL-CARRIER LETTER
+1901 LIMBU LETTER KA
+1902 LIMBU LETTER KHA
+1903 LIMBU LETTER GA
+1904 LIMBU LETTER GHA
+1905 LIMBU LETTER NGA
+1906 LIMBU LETTER CA
+1907 LIMBU LETTER CHA
+1908 LIMBU LETTER JA
+1909 LIMBU LETTER JHA
+190A LIMBU LETTER YAN
+190B LIMBU LETTER TA
+190C LIMBU LETTER THA
+190D LIMBU LETTER DA
+190E LIMBU LETTER DHA
+190F LIMBU LETTER NA
+1910 LIMBU LETTER PA
+1911 LIMBU LETTER PHA
+1912 LIMBU LETTER BA
+1913 LIMBU LETTER BHA
+1914 LIMBU LETTER MA
+1915 LIMBU LETTER YA
+1916 LIMBU LETTER RA
+1917 LIMBU LETTER LA
+1918 LIMBU LETTER WA
+1919 LIMBU LETTER SHA
+191A LIMBU LETTER SSA
+191B LIMBU LETTER SA
+191C LIMBU LETTER HA
+@ Dependent vowel signs
+1920 LIMBU VOWEL SIGN A
+1921 LIMBU VOWEL SIGN I
+1922 LIMBU VOWEL SIGN U
+1923 LIMBU VOWEL SIGN EE
+1924 LIMBU VOWEL SIGN AI
+1925 LIMBU VOWEL SIGN OO
+1926 LIMBU VOWEL SIGN AU
+1927 LIMBU VOWEL SIGN E
+1928 LIMBU VOWEL SIGN O
+@ Subjoined consonants
+1929 LIMBU SUBJOINED LETTER YA
+192A LIMBU SUBJOINED LETTER RA
+192B LIMBU SUBJOINED LETTER WA
+@ Final consonants
+1930 LIMBU SMALL LETTER KA
+1931 LIMBU SMALL LETTER NGA
+1932 LIMBU SMALL LETTER ANUSVARA
+1933 LIMBU SMALL LETTER TA
+1934 LIMBU SMALL LETTER NA
+1935 LIMBU SMALL LETTER PA
+1936 LIMBU SMALL LETTER MA
+1937 LIMBU SMALL LETTER RA
+1938 LIMBU SMALL LETTER LA
+@ Various signs
+1939 LIMBU SIGN MUKPHRENG
+193A LIMBU SIGN KEMPHRENG
+193B LIMBU SIGN SA-I
+1940 LIMBU SIGN LOO
+1944 LIMBU EXCLAMATION MARK
+1945 LIMBU QUESTION MARK
+@ Digits
+1946 LIMBU DIGIT ZERO
+1947 LIMBU DIGIT ONE
+1948 LIMBU DIGIT TWO
+1949 LIMBU DIGIT THREE
+194A LIMBU DIGIT FOUR
+194B LIMBU DIGIT FIVE
+194C LIMBU DIGIT SIX
+194D LIMBU DIGIT SEVEN
+194E LIMBU DIGIT EIGHT
+194F LIMBU DIGIT NINE
+@@ 1950 Tai Le 197F
+@ Consonants
+1950 TAI LE LETTER KA
+1951 TAI LE LETTER XA
+1952 TAI LE LETTER NGA
+1953 TAI LE LETTER TSA
+1954 TAI LE LETTER SA
+1955 TAI LE LETTER YA
+1956 TAI LE LETTER TA
+1957 TAI LE LETTER THA
+1958 TAI LE LETTER LA
+1959 TAI LE LETTER PA
+195A TAI LE LETTER PHA
+195B TAI LE LETTER MA
+195C TAI LE LETTER FA
+195D TAI LE LETTER VA
+195E TAI LE LETTER HA
+195F TAI LE LETTER QA
+1960 TAI LE LETTER KHA
+1961 TAI LE LETTER TSHA
+1962 TAI LE LETTER NA
+@ Vowels
+1963 TAI LE LETTER A
+1964 TAI LE LETTER I
+1965 TAI LE LETTER EE
+1966 TAI LE LETTER EH
+1967 TAI LE LETTER U
+1968 TAI LE LETTER OO
+1969 TAI LE LETTER O
+196A TAI LE LETTER UE
+196B TAI LE LETTER E
+196C TAI LE LETTER AUE
+196D TAI LE LETTER AI
+@ Tone letters
+1970 TAI LE LETTER TONE-2
+1971 TAI LE LETTER TONE-3
+1972 TAI LE LETTER TONE-4
+1973 TAI LE LETTER TONE-5
+1974 TAI LE LETTER TONE-6
+@@ 19E0 Khmer Symbols 19FF
+@ Lunar date symbols
+19E0 KHMER SYMBOL PATHAMASAT
+ * represents the first August in a leap year
+@+ The following fifteen characters represent the first through the fifteenth waxing days, respectively.
+19E1 KHMER SYMBOL MUOY KOET
+19E2 KHMER SYMBOL PII KOET
+19E3 KHMER SYMBOL BEI KOET
+19E4 KHMER SYMBOL BUON KOET
+19E5 KHMER SYMBOL PRAM KOET
+19E6 KHMER SYMBOL PRAM-MUOY KOET
+19E7 KHMER SYMBOL PRAM-PII KOET
+19E8 KHMER SYMBOL PRAM-BEI KOET
+19E9 KHMER SYMBOL PRAM-BUON KOET
+19EA KHMER SYMBOL DAP KOET
+19EB KHMER SYMBOL DAP-MUOY KOET
+19EC KHMER SYMBOL DAP-PII KOET
+19ED KHMER SYMBOL DAP-BEI KOET
+19EE KHMER SYMBOL DAP-BUON KOET
+19EF KHMER SYMBOL DAP-PRAM KOET
+19F0 KHMER SYMBOL TUTEYASAT
+ * represents the second August in a leap year
+@+ The following fifteen characters represent the first through the fifteenth waning days, respectively.
+19F1 KHMER SYMBOL MUOY ROC
+19F2 KHMER SYMBOL PII ROC
+19F3 KHMER SYMBOL BEI ROC
+19F4 KHMER SYMBOL BUON ROC
+19F5 KHMER SYMBOL PRAM ROC
+19F6 KHMER SYMBOL PRAM-MUOY ROC
+19F7 KHMER SYMBOL PRAM-PII ROC
+19F8 KHMER SYMBOL PRAM-BEI ROC
+19F9 KHMER SYMBOL PRAM-BUON ROC
+19FA KHMER SYMBOL DAP ROC
+19FB KHMER SYMBOL DAP-MUOY ROC
+19FC KHMER SYMBOL DAP-PII ROC
+19FD KHMER SYMBOL DAP-BEI ROC
+19FE KHMER SYMBOL DAP-BUON ROC
+19FF KHMER SYMBOL DAP-PRAM ROC
+@@ 1D00 Phonetic Extensions 1D7F
+@+ These are non-IPA phonetic extensions, mostly for the Uralic Phonetic Alphabet (UPA).
+@ Latin letters
+1D00 LATIN LETTER SMALL CAPITAL A
+1D01 LATIN LETTER SMALL CAPITAL AE
+1D02 LATIN SMALL LETTER TURNED AE
+ * glyph can also have sideways orientation
+1D03 LATIN LETTER SMALL CAPITAL BARRED B
+1D04 LATIN LETTER SMALL CAPITAL C
+1D05 LATIN LETTER SMALL CAPITAL D
+1D06 LATIN LETTER SMALL CAPITAL ETH
+1D07 LATIN LETTER SMALL CAPITAL E
+1D08 LATIN SMALL LETTER TURNED OPEN E
+1D09 LATIN SMALL LETTER TURNED I
+1D0A LATIN LETTER SMALL CAPITAL J
+1D0B LATIN LETTER SMALL CAPITAL K
+1D0C LATIN LETTER SMALL CAPITAL L WITH STROKE
+1D0D LATIN LETTER SMALL CAPITAL M
+1D0E LATIN LETTER SMALL CAPITAL REVERSED N
+1D0F LATIN LETTER SMALL CAPITAL O
+1D10 LATIN LETTER SMALL CAPITAL OPEN O
+1D11 LATIN SMALL LETTER SIDEWAYS O
+1D12 LATIN SMALL LETTER SIDEWAYS OPEN O
+1D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE
+1D14 LATIN SMALL LETTER TURNED OE
+ * glyph can also have sideways orientation
+1D15 LATIN LETTER SMALL CAPITAL OU
+1D16 LATIN SMALL LETTER TOP HALF O
+1D17 LATIN SMALL LETTER BOTTOM HALF O
+1D18 LATIN LETTER SMALL CAPITAL P
+ * representa a semi-voiced [p]
+1D19 LATIN LETTER SMALL CAPITAL REVERSED R
+1D1A LATIN LETTER SMALL CAPITAL TURNED R
+1D1B LATIN LETTER SMALL CAPITAL T
+1D1C LATIN LETTER SMALL CAPITAL U
+1D1D LATIN SMALL LETTER SIDEWAYS U
+1D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U
+ * glyph can also have turned orientation
+1D1F LATIN SMALL LETTER SIDEWAYS TURNED M
+1D20 LATIN LETTER SMALL CAPITAL V
+1D21 LATIN LETTER SMALL CAPITAL W
+1D22 LATIN LETTER SMALL CAPITAL Z
+1D23 LATIN LETTER SMALL CAPITAL EZH
+1D24 LATIN LETTER VOICED LARYNGEAL SPIRANT
+1D25 LATIN LETTER AIN
+@ Greek letters
+1D26 GREEK LETTER SMALL CAPITAL GAMMA
+1D27 GREEK LETTER SMALL CAPITAL LAMDA
+1D28 GREEK LETTER SMALL CAPITAL PI
+1D29 GREEK LETTER SMALL CAPITAL RHO
+ * represents a voiceless uvular trill
+1D2A GREEK LETTER SMALL CAPITAL PSI
+@ Cyrillic letter
+1D2B CYRILLIC LETTER SMALL CAPITAL EL
+ * in italic style, the glyph is obliqued, not italicized
+ x (cyrillic small letter el - 043B)
+@ Latin superscript modifier letters
+1D2C MODIFIER LETTER CAPITAL A
+ # <super> 0041
+1D2D MODIFIER LETTER CAPITAL AE
+ # <super> 00C6
+1D2E MODIFIER LETTER CAPITAL B
+ # <super> 0042
+1D2F MODIFIER LETTER CAPITAL BARRED B
+1D30 MODIFIER LETTER CAPITAL D
+ # <super> 0044
+1D31 MODIFIER LETTER CAPITAL E
+ # <super> 0045
+1D32 MODIFIER LETTER CAPITAL REVERSED E
+ # <super> 018E
+1D33 MODIFIER LETTER CAPITAL G
+ # <super> 0047
+1D34 MODIFIER LETTER CAPITAL H
+ # <super> 0048
+1D35 MODIFIER LETTER CAPITAL I
+ # <super> 0049
+1D36 MODIFIER LETTER CAPITAL J
+ # <super> 004A
+1D37 MODIFIER LETTER CAPITAL K
+ # <super> 004B
+1D38 MODIFIER LETTER CAPITAL L
+ # <super> 004C
+1D39 MODIFIER LETTER CAPITAL M
+ # <super> 004D
+1D3A MODIFIER LETTER CAPITAL N
+ # <super> 004E
+1D3B MODIFIER LETTER CAPITAL REVERSED N
+1D3C MODIFIER LETTER CAPITAL O
+ # <super> 004F
+1D3D MODIFIER LETTER CAPITAL OU
+ # <super> 0222
+1D3E MODIFIER LETTER CAPITAL P
+ # <super> 0050
+1D3F MODIFIER LETTER CAPITAL R
+ # <super> 0052
+1D40 MODIFIER LETTER CAPITAL T
+ # <super> 0054
+1D41 MODIFIER LETTER CAPITAL U
+ # <super> 0055
+1D42 MODIFIER LETTER CAPITAL W
+ # <super> 0057
+1D43 MODIFIER LETTER SMALL A
+ # <super> 0061
+1D44 MODIFIER LETTER SMALL TURNED A
+ # <super> 0250
+1D45 MODIFIER LETTER SMALL ALPHA
+ # <super> 0251
+1D46 MODIFIER LETTER SMALL TURNED AE
+ # <super> 1D02
+1D47 MODIFIER LETTER SMALL B
+ # <super> 0062
+1D48 MODIFIER LETTER SMALL D
+ # <super> 0064
+1D49 MODIFIER LETTER SMALL E
+ # <super> 0065
+1D4A MODIFIER LETTER SMALL SCHWA
+ # <super> 0259
+1D4B MODIFIER LETTER SMALL OPEN E
+ # <super> 025B
+1D4C MODIFIER LETTER SMALL TURNED OPEN E
+ # <super> 025C
+1D4D MODIFIER LETTER SMALL G
+ # <super> 0067
+1D4E MODIFIER LETTER SMALL TURNED I
+1D4F MODIFIER LETTER SMALL K
+ # <super> 006B
+1D50 MODIFIER LETTER SMALL M
+ # <super> 006D
+1D51 MODIFIER LETTER SMALL ENG
+ # <super> 014B
+1D52 MODIFIER LETTER SMALL O
+ # <super> 006F
+1D53 MODIFIER LETTER SMALL OPEN O
+ # <super> 0254
+1D54 MODIFIER LETTER SMALL TOP HALF O
+ # <super> 1D16
+1D55 MODIFIER LETTER SMALL BOTTOM HALF O
+ # <super> 1D17
+1D56 MODIFIER LETTER SMALL P
+ # <super> 0070
+1D57 MODIFIER LETTER SMALL T
+ # <super> 0074
+1D58 MODIFIER LETTER SMALL U
+ # <super> 0075
+1D59 MODIFIER LETTER SMALL SIDEWAYS U
+ # <super> 1D1D
+1D5A MODIFIER LETTER SMALL TURNED M
+ # <super> 026F
+1D5B MODIFIER LETTER SMALL V
+ # <super> 0076
+1D5C MODIFIER LETTER SMALL AIN
+ # <super> 1D25
+@ Greek superscript modifier letters
+1D5D MODIFIER LETTER SMALL BETA
+ # <super> 03B2
+1D5E MODIFIER LETTER SMALL GREEK GAMMA
+ # <super> 03B3
+1D5F MODIFIER LETTER SMALL DELTA
+ # <super> 03B4
+1D60 MODIFIER LETTER SMALL GREEK PHI
+ # <super> 03C6
+1D61 MODIFIER LETTER SMALL CHI
+ # <super> 03C7
+@ Latin subscript modifier letters
+1D62 LATIN SUBSCRIPT SMALL LETTER I
+ # <sub> 0069
+1D63 LATIN SUBSCRIPT SMALL LETTER R
+ # <sub> 0072
+1D64 LATIN SUBSCRIPT SMALL LETTER U
+ # <sub> 0075
+1D65 LATIN SUBSCRIPT SMALL LETTER V
+ # <sub> 0076
+@ Greek subscript modifier letters
+1D66 GREEK SUBSCRIPT SMALL LETTER BETA
+ # <sub> 03B2
+1D67 GREEK SUBSCRIPT SMALL LETTER GAMMA
+ # <sub> 03B3
+1D68 GREEK SUBSCRIPT SMALL LETTER RHO
+ # <sub> 03C1
+1D69 GREEK SUBSCRIPT SMALL LETTER PHI
+ # <sub> 03C6
+1D6A GREEK SUBSCRIPT SMALL LETTER CHI
+ # <sub> 03C7
+@ Latin letter
+1D6B LATIN SMALL LETTER UE
@@ 1E00 Latin Extended Additional 1EFF
+@+ In this block the names "WITH LINE BELOW" refer to a macron below the letter.
@ Latin general use extensions
1E00 LATIN CAPITAL LETTER A WITH RING BELOW
: 0041 0325
@@ -8596,6 +9209,7 @@
* in traditional typography, the thinnest space available
# 0020 space
200B ZERO WIDTH SPACE
+ = ZWSP
* nominally zero width, but may expand in justification
@ Formatting characters
200C ZERO WIDTH NON-JOINER
@@ -8712,12 +9326,17 @@
202E RIGHT-TO-LEFT OVERRIDE
= RLO
202F NARROW NO-BREAK SPACE
+ = NNBSP
x (no-break space - 00A0)
# <noBreak> 0020
@ General punctuation
2030 PER MILLE SIGN
+ = permille, per thousand
+ * used, for example, in measures of blood alcohol content, salinity, etc.
x (percent sign - 0025)
2031 PER TEN THOUSAND SIGN
+ = permyriad
+ * percent of a percent, rarely used
x (percent sign - 0025)
2032 PRIME
= minutes, feet
@@ -8733,6 +9352,7 @@
x (double prime quotation mark - 301E)
# 2032 2032
2034 TRIPLE PRIME
+ = lines (old measure, 1/12 of an inch)
# 2032 2032 2032
2035 REVERSED PRIME
x (grave accent - 0060)
@@ -8772,6 +9392,7 @@
= Greek enotikon
x (smile - 2323)
2040 CHARACTER TIE
+ = z notation sequence concatenation
x (frown - 2322)
2041 CARET INSERTION POINT
* proofreader's mark: insert here
@@ -8813,14 +9434,18 @@
* used in Finno-Ugric Phonetic Alphabet to indicate a related borrowed form with different sound
x (percent sign - 0025)
x (arabic percent sign - 066A)
+2053 SWUNG DASH
+2054 INVERTED UNDERTIE
2057 QUADRUPLE PRIME
# 2032 2032 2032 2032
@ Space
205F MEDIUM MATHEMATICAL SPACE
+ = MMSP
* four-eighteenths of an em
# 0020 space
@ Formatting character
2060 WORD JOINER
+ = WJ
* a zero width non-breaking space (only)
* intended for disambiguation of functions for byte order mark
x (zero width no-break space - FEFF)
@@ -8914,6 +9539,8 @@
x (yen sign - 00A5)
x (bengali rupee mark - 09F2)
x (bengali rupee sign - 09F3)
+ x (gujarati rupee sign - 0AF1)
+ x (tamil rupee sign - 0BF9)
x (thai currency symbol baht - 0E3F)
x (khmer currency symbol riel - 17DB)
x (rial sign - FDFC)
@@ -8928,7 +9555,8 @@
20A3 FRENCH FRANC SIGN
* France
20A4 LIRA SIGN
- * Italy, Turkey
+ * intended for lira, but not widely used
+ * preferred character for lira is 00A3
x (pound sign - 00A3)
20A5 MILL SIGN
* USA (1/10 cent)
@@ -8968,8 +9596,9 @@
20D1 COMBINING RIGHT HARPOON ABOVE
* vector
20D2 COMBINING LONG VERTICAL LINE OVERLAY
-20D3 COMBINING SHORT VERTICAL LINE OVERLAY
* negation
+20D3 COMBINING SHORT VERTICAL LINE OVERLAY
+ * occasional variant for negation
20D4 COMBINING ANTICLOCKWISE ARROW ABOVE
20D5 COMBINING CLOCKWISE ARROW ABOVE
* rotation
@@ -9070,8 +9699,11 @@
= Laplace symbol
# <font> 004C latin capital letter l
2113 SCRIPT SMALL L
- = liter (not an official SI recommendation)
- * the glyph shown is that of the traditional liter symbol, rather than a glyph harmonized with mathematical script fonts
+ = mathematical symbol 'ell'
+ = liter (traditional symbol)
+ * despite its character name, this symbol is derived from a special italicized version of the small letter l
+ * the SI recommended symbol for liter is 006C
+ x (mathematical script small l - 1D4C1)
# <font> 006C latin small letter l
2114 L B BAR SYMBOL
= pounds
@@ -9150,7 +9782,7 @@
= error
# <font> 0065 latin small letter e
2130 SCRIPT CAPITAL E
- = EMF (Electro-Magnetic Force)
+ = emf (electromotive force)
# <font> 0045 latin capital letter e
2131 SCRIPT CAPITAL F
= Fourier transform
@@ -9164,7 +9796,8 @@
2134 SCRIPT SMALL O
= order, of inferior order to
# <font> 006F latin small letter o
-@ Hebrew letterlike math symbols (left-to-right)
+@ Hebrew letterlike math symbols
+@+ There are left-to-right characters.
2135 ALEF SYMBOL
= first transfinite cardinal (countable)
# 05D0 hebrew letter alef
@@ -9183,6 +9816,9 @@
# <font> 0069 latin small letter i
213A ROTATED CAPITAL Q
* a binding signature mark
+213B FACSIMILE SIGN
+ x (telephone sign - 2121)
+ # 0046 0041 0058
213D DOUBLE-STRUCK SMALL GAMMA
# <font> 03B3 greek small letter gamma
213E DOUBLE-STRUCK CAPITAL GAMMA
@@ -9597,8 +10233,10 @@
222C DOUBLE INTEGRAL
# 222B 222B
222D TRIPLE INTEGRAL
+ x (quadruple integral operator - 2A0C)
# 222B 222B 222B
222E CONTOUR INTEGRAL
+ x (integral around a point operator - 2A15)
222F SURFACE INTEGRAL
# 222E 222E
2230 VOLUME INTEGRAL
@@ -9617,6 +10255,7 @@
2239 EXCESS
223A GEOMETRIC PROPORTION
223B HOMOTHETIC
+ x (tilde operator with rising dots - 2A6B)
223C TILDE OPERATOR
= varies with (proportional to)
= difference between
@@ -9751,33 +10390,42 @@
228B SUPERSET OF WITH NOT EQUAL TO
228C MULTISET
228D MULTISET MULTIPLICATION
+ x (n-ary union operator with dot - 2A03)
+ x (intersection with dot - 2A40)
228E MULTISET UNION
= z notation bag addition
+ x (n-ary union operator with plus - 2A04)
228F SQUARE IMAGE OF
2290 SQUARE ORIGINAL OF
2291 SQUARE IMAGE OF OR EQUAL TO
2292 SQUARE ORIGINAL OF OR EQUAL TO
2293 SQUARE CAP
+ x (n-ary square intersection operator - 2A05)
2294 SQUARE CUP
2295 CIRCLED PLUS
= direct sum
= vector pointing into page
x (earth - 2641)
+ x (n-ary circled plus operator - 2A01)
2296 CIRCLED MINUS
= symmetric difference
+ x (circle with horizontal bar - 29B5)
2297 CIRCLED TIMES
= tensor product
= vector pointing into page
+ x (n-ary circled times operator - 2A02)
2298 CIRCLED DIVISION SLASH
2299 CIRCLED DOT OPERATOR
= direct product
= vector pointing out of page
x (latin letter bilabial click - 0298)
x (sun - 2609)
+ x (n-ary circled dot operator - 2A00)
229A CIRCLED RING OPERATOR
x (apl functional symbol circle jot - 233E)
x (bullseye - 25CE)
229B CIRCLED ASTERISK OPERATOR
+ x (apl functional symbol circle star - 235F)
229C CIRCLED EQUALS
229D CIRCLED DASH
229E SQUARED PLUS
@@ -9949,6 +10597,8 @@
2306 PERSPECTIVE
2307 WAVY LINE
x (wavy dash - 3030)
+@ Corner brackets
+@+ The ceiling and floor characters are recommended for general-purpose corner brackets, rather than the CJK corner brackets, which are wide quotation marks.
2308 LEFT CEILING
= APL upstile
x (left corner bracket - 300C)
@@ -9958,11 +10608,13 @@
= APL downstile
230B RIGHT FLOOR
x (right corner bracket - 300D)
+@ Crops
230C BOTTOM RIGHT CROP
* set of four "crop" corners, arranged facing outward
230D BOTTOM LEFT CROP
230E TOP RIGHT CROP
230F TOP LEFT CROP
+@ Miscellaneous technical
2310 REVERSED NOT SIGN
= beginning of line
x (not sign - 00AC)
@@ -9981,19 +10633,25 @@
= COMMAND KEY
2319 TURNED NOT SIGN
= line marker
+@ GUI icons
231A WATCH
231B HOURGLASS
+@ Quine corners
231C TOP LEFT CORNER
* set of four "quine" corners, for quincuncial arrangement
231D TOP RIGHT CORNER
231E BOTTOM LEFT CORNER
231F BOTTOM RIGHT CORNER
+@ Integral pieces
2320 TOP HALF INTEGRAL
+ x (integral extension - 23AE)
2321 BOTTOM HALF INTEGRAL
+@ Frown and smile
2322 FROWN
x (character tie - 2040)
2323 SMILE
x (undertie - 203F)
+@ Keyboard symbols
2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS
= ENTER KEY
2325 OPTION KEY
@@ -10002,21 +10660,24 @@
2327 X IN A RECTANGLE BOX
= CLEAR KEY
2328 KEYBOARD
+@ Angle brackets
+@+ These are discouraged for mathematical use because of their canonical equivalence to CJK punctuation.
2329 LEFT-POINTING ANGLE BRACKET
- * discouraged for mathematical use because of canonical equivalence to CJK punctuation
x (less-than sign - 003C)
x (single left-pointing angle quotation mark - 2039)
x (mathematical left angle bracket - 27E8)
: 3008 left angle bracket
232A RIGHT-POINTING ANGLE BRACKET
- * discouraged for mathematical use because of canonical equivalence to CJK punctuation
x (greater-than sign - 003E)
x (single right-pointing angle quotation mark - 203A)
x (mathematical right angle bracket - 27E9)
: 3009 right angle bracket
+@ Keyboard symbol
232B ERASE TO THE LEFT
= DELETE TO THE LEFT KEY
+@ Chemistry symbol
232C BENZENE RING
+@ Drafting symbols
232D CYLINDRICITY
232E ALL AROUND-PROFILE
232F SYMMETRY
@@ -10024,6 +10685,7 @@
2331 DIMENSION ORIGIN
2332 CONICAL TAPER
2333 SLOPE
+ x (lower left triangle - 25FA)
2334 COUNTERBORE
x (open box - 2423)
2335 COUNTERSINK
@@ -10033,18 +10695,23 @@
2337 APL FUNCTIONAL SYMBOL SQUISH QUAD
x (apl functional symbol quad - 2395)
x (white vertical rectangle - 25AF)
+ x (n-ary white vertical bar - 2AFF)
2338 APL FUNCTIONAL SYMBOL QUAD EQUAL
2339 APL FUNCTIONAL SYMBOL QUAD DIVIDE
233A APL FUNCTIONAL SYMBOL QUAD DIAMOND
233B APL FUNCTIONAL SYMBOL QUAD JOT
+ x (squared small circle - 29C7)
233C APL FUNCTIONAL SYMBOL QUAD CIRCLE
233D APL FUNCTIONAL SYMBOL CIRCLE STILE
233E APL FUNCTIONAL SYMBOL CIRCLE JOT
x (circled ring operator - 229A)
+ x (circled white bullet - 29BE)
233F APL FUNCTIONAL SYMBOL SLASH BAR
2340 APL FUNCTIONAL SYMBOL BACKSLASH BAR
2341 APL FUNCTIONAL SYMBOL QUAD SLASH
+ x (squared rising diagonal slash - 29C4)
2342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+ x (squared falling diagonal slash - 29C5)
2343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN
2344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
2345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE
@@ -10052,6 +10719,7 @@
2347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
2348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH
+ x (reversed empty set - 29B0)
234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR *
= up tack underbar
* preferred naming for APL tack symbols now follows the London Convention in ISO/IEC 13751:2000 (APL Extended)
@@ -10082,8 +10750,10 @@
235B APL FUNCTIONAL SYMBOL JOT UNDERBAR
235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
235D APL FUNCTIONAL SYMBOL UP SHOE JOT
+ x (intersection with dot - 2A40)
235E APL FUNCTIONAL SYMBOL QUOTE QUAD
235F APL FUNCTIONAL SYMBOL CIRCLE STAR
+ x (circled asterisk operator - 229B)
2360 APL FUNCTIONAL SYMBOL QUAD COLON
2361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS *
= down tack diaeresis
@@ -10126,6 +10796,7 @@
237D SHOULDERED OPEN BOX
* from ISO 9995-7
* keyboard symbol for No Break Space
+ x (open box - 2423)
237E BELL SYMBOL
* from ISO 2047
237F VERTICAL LINE WITH MIDDLE DOT
@@ -10193,6 +10864,7 @@
x (bottom half integral - 2321)
23AF HORIZONTAL LINE EXTENSION
* used for extension of arrows
+ x (vertical line extension - 23D0)
@ Bracket pieces
23B0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION
= left moustache
@@ -10203,7 +10875,9 @@
23B3 SUMMATION BOTTOM
@ Vertical brackets
23B4 TOP SQUARE BRACKET
+ x (presentation form for vertical left square bracket - FE47)
23B5 BOTTOM SQUARE BRACKET
+ x (presentation form for vertical right square bracket - FE48)
23B6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
@ Terminal graphic characters
23B7 RADICAL SYMBOL BOTTOM
@@ -10217,7 +10891,9 @@
23BD HORIZONTAL SCAN LINE-9
@ Dentistry notation symbols
23BE DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT
+ x (left ceiling - 2308)
23BF DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT
+ x (left floor - 230A)
23C0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE
23C1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE
23C2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE
@@ -10228,15 +10904,27 @@
23C7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE
23C8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE
23C9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL
+ x (down tack - 22A4)
+ x (box drawings light down and horizontal - 252C)
23CA DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL
+ x (up tack - 22A5)
+ x (box drawings light up and horizontal - 2534)
23CB DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT
+ x (right ceiling - 2309)
23CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT
+ x (right floor - 230B)
@ Miscellaneous technical symbol
23CD SQUARE FOOT
-@ Keyboard symbol
+@ Keyboard and UI symbols
23CE RETURN SYMBOL
* may be shown with either hollow or filled glyph
x (downwards arrow with corner leftwards - 21B5)
+23CF EJECT SYMBOL
+ * UI symbol to eject media
+@ Special character extension
+23D0 VERTICAL LINE EXTENSION
+ * used for extension of arrows
+ x (horizontal line extension - 23AF)
@@ 2400 Control Pictures 243F
@+ The diagonal lettering glyphs are only exemplary; alternate representations may be, and often are used in the visible display of control codes.
@ Graphic pictures for control codes
@@ -10615,6 +11303,9 @@
24FC DOUBLE CIRCLED DIGIT EIGHT
24FD DOUBLE CIRCLED DIGIT NINE
24FE DOUBLE CIRCLED NUMBER TEN
+@ Additional white on black circled number
+24FF NEGATIVE CIRCLED DIGIT ZERO
+ x (dingbat negative circled digit one - 2776)
@@ 2500 Box Drawing 257F
@ Form and chart components
2500 BOX DRAWINGS LIGHT HORIZONTAL
@@ -10987,6 +11678,15 @@
2613 SALTIRE
= St. Andrew's Cross
x (ballot x - 2717)
+@ Weather symbol
+2614 UMBRELLA WITH RAIN DROPS
+ = showery weather
+@ Miscellaneous symbol
+2615 HOT BEVERAGE
+ = tea or coffee, depending on locale
+ * can be used to indicate a wait
+ x (watch - 231A)
+ x (hourglass - 231B)
@ Japanese chess symbols
2616 WHITE SHOGI PIECE
2617 BLACK SHOGI PIECE
@@ -11121,6 +11821,7 @@
266E MUSIC NATURAL SIGN
266F MUSIC SHARP SIGN
= z notation infix bag count
+ x (number sign - 0023)
@ Syriac cross symbols
@+ These symbols are used in liturgical texts of Syriac-speaking churches.
2670 WEST SYRIAC CROSS
@@ -11161,6 +11862,19 @@
2687 WHITE CIRCLE WITH TWO DOTS
2688 BLACK CIRCLE WITH WHITE DOT RIGHT
2689 BLACK CIRCLE WITH TWO WHITE DOTS
+@ Yijing monogram and digram symbols
+268A MONOGRAM FOR YANG
+268B MONOGRAM FOR YIN
+268C DIGRAM FOR GREATER YANG
+268D DIGRAM FOR LESSER YIN
+268E DIGRAM FOR LESSER YANG
+268F DIGRAM FOR GREATER YIN
+@ Map markers
+2690 WHITE FLAG
+2691 BLACK FLAG
+@ Warning signs
+26A0 WARNING SIGN
+26A1 HIGH VOLTAGE SIGN
@@ 2700 Dingbats 27BF
@+ ITC Zapf dingbats series 100
@ Miscellaneous
@@ -11459,8 +12173,10 @@
= will always be (modal operator)
@ Mathematical brackets
27E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ = z notation left bag bracket
x (left white square bracket - 301A)
27E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ = z notation right bag bracket
x (right white square bracket - 301B)
27E8 MATHEMATICAL LEFT ANGLE BRACKET
= bra
@@ -11814,6 +12530,7 @@
= z notation finite injection
2916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL
= bijective mapping
+ = z notation bijection
2917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE
= z notation surjective injection
2918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE
@@ -12037,7 +12754,7 @@
x (apl functional symbol quad backslash - 2342)
29C6 SQUARED ASTERISK
29C7 SQUARED SMALL CIRCLE
- x (apl functional symbol quad circle - 233C)
+ x (apl functional symbol quad jot - 233B)
29C8 SQUARED SQUARE
29C9 TWO JOINED SQUARES
@ Triangle symbols
@@ -12170,6 +12887,7 @@
x (n-ary summation - 2211)
2A0B SUMMATION WITH INTEGRAL
2A0C QUADRUPLE INTEGRAL OPERATOR
+ x (triple integral - 222D)
# 222B 222B 222B 222B
2A0D FINITE PART INTEGRAL
2A0E INTEGRAL WITH DOUBLE STROKE
@@ -12180,6 +12898,7 @@
2A13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
2A14 LINE INTEGRATION NOT INCLUDING THE POLE
2A15 INTEGRAL AROUND A POINT OPERATOR
+ x (contour integral - 222E)
2A16 QUATERNION INTEGRAL OPERATOR
2A17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
2A18 INTEGRAL WITH TIMES SIGN
@@ -12458,7 +13177,7 @@
2ADC FORKING (not independent)
= not independent
* an equational logic symbol, not a computing science symbol
- * non-indepedence (original concept) is related to forking
+ * non-independence (original concept) is related to forking
: 2ADD 0338
2ADD NONFORKING (independent)
= independent
@@ -12537,123 +13256,289 @@
= Dijkstra choice
2AFF N-ARY WHITE VERTICAL BAR
= n-ary Dijkstra choice
+@@ 2B00 Miscellaneous Symbols and Arrows 2BFF
+@ Arrows
+@+ Other white and black arrows to complete this set can be found in Supplementary Arrows-B and Dingbats
+2B00 NORTH EAST WHITE ARROW
+2B01 NORTH WEST WHITE ARROW
+2B02 SOUTH EAST WHITE ARROW
+2B03 SOUTH WEST WHITE ARROW
+2B04 LEFT RIGHT WHITE ARROW
+2B05 LEFTWARDS BLACK ARROW
+2B06 UPWARDS BLACK ARROW
+2B07 DOWNWARDS BLACK ARROW
+2B08 NORTH EAST BLACK ARROW
+2B09 NORTH WEST BLACK ARROW
+2B0A SOUTH EAST BLACK ARROW
+2B0B SOUTH WEST BLACK ARROW
+2B0C LEFT RIGHT BLACK ARROW
+2B0D UP DOWN BLACK ARROW
@@ 2E80 CJK Radicals Supplement 2EFF
@ CJK radicals supplement
2E80 CJK RADICAL REPEAT
2E81 CJK RADICAL CLIFF
+ x 5382
2E82 CJK RADICAL SECOND ONE
+ x 4E5B
2E83 CJK RADICAL SECOND TWO
+ x 4E5A
2E84 CJK RADICAL SECOND THREE
+ x 4E59
2E85 CJK RADICAL PERSON
+ * form used on left side
+ x 4EBB
2E86 CJK RADICAL BOX
+ x 5182
2E87 CJK RADICAL TABLE
+ x 51E0
2E88 CJK RADICAL KNIFE ONE
+ * form used at top
+ x 5200
2E89 CJK RADICAL KNIFE TWO
+ * form used on right side
+ x 5202
2E8A CJK RADICAL DIVINATION
+ * form used at top
+ x 535C
2E8B CJK RADICAL SEAL
+ * form used at bottom
+ x 353E
2E8C CJK RADICAL SMALL ONE
+ * form used at top
+ x 5C0F
2E8D CJK RADICAL SMALL TWO
+ * form used at top
+ x 5C0F
2E8E CJK RADICAL LAME ONE
+ x 5C22
2E8F CJK RADICAL LAME TWO
+ x 5C23
2E90 CJK RADICAL LAME THREE
+ x 5C22
2E91 CJK RADICAL LAME FOUR
+ x 5C23
2E92 CJK RADICAL SNAKE
+ x 5DF3
2E93 CJK RADICAL THREAD
+ x 5E7A
2E94 CJK RADICAL SNOUT ONE
+ x 5F51
2E95 CJK RADICAL SNOUT TWO
+ x 5F50
2E96 CJK RADICAL HEART ONE
+ * form used on left side
+ x 5FC4
2E97 CJK RADICAL HEART TWO
+ * form used at bottom
+ x 5FC3
2E98 CJK RADICAL HAND
+ * form used on left side
+ x 624C
2E99 CJK RADICAL RAP
+ * form used on right side
+ x 6535
2E9B CJK RADICAL CHOKE
+ x 65E1
2E9C CJK RADICAL SUN
+ x 65E5
2E9D CJK RADICAL MOON
+ x 6708
2E9E CJK RADICAL DEATH
+ x 6B7A
2E9F CJK RADICAL MOTHER
# 6BCD
2EA0 CJK RADICAL CIVILIAN
+ x 6C11
2EA1 CJK RADICAL WATER ONE
+ * form used on left side
+ x 6C35
2EA2 CJK RADICAL WATER TWO
+ * form used (rarely) at bottom
+ x 6C3A
2EA3 CJK RADICAL FIRE
+ * form used at bottom
+ x 706C
2EA4 CJK RADICAL PAW ONE
+ * form used at top
+ x 722B
2EA5 CJK RADICAL PAW TWO
+ * form used at top
+ x 722B
2EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK
+ x 4E2C
2EA7 CJK RADICAL COW
+ x 725B
2EA8 CJK RADICAL DOG
+ * form used on left side
+ x 72AD
2EA9 CJK RADICAL JADE
+ * form used on left side
+ x 738B
2EAA CJK RADICAL BOLT OF CLOTH
+ * form used on left side
+ x 758B
2EAB CJK RADICAL EYE
+ * form used at top
+ x (cjk radical net two - 2EB2)
+ x 76EE
2EAC CJK RADICAL SPIRIT ONE
+ x 793A
2EAD CJK RADICAL SPIRIT TWO
+ x 793B
2EAE CJK RADICAL BAMBOO
+ x 7AF9
2EAF CJK RADICAL SILK
+ * form used on left side
+ x 7CF9
2EB0 CJK RADICAL C-SIMPLIFIED SILK
+ * form used on left side
+ x 7E9F
2EB1 CJK RADICAL NET ONE
+ x 7F53
2EB2 CJK RADICAL NET TWO
+ x (cjk radical eye - 2EAB)
+ x 7F52
2EB3 CJK RADICAL NET THREE
+ x 7F51
2EB4 CJK RADICAL NET FOUR
+ x 7F51
2EB5 CJK RADICAL MESH
+ x 2626B
2EB6 CJK RADICAL SHEEP
+ * form used on left side
+ x 7F8A
2EB7 CJK RADICAL RAM
+ * form used at top
+ x 7F8A
2EB8 CJK RADICAL EWE
+ x 7F8B
2EB9 CJK RADICAL OLD
+ x 8002
2EBA CJK RADICAL BRUSH ONE
+ x 8080
2EBB CJK RADICAL BRUSH TWO
+ x 807F
2EBC CJK RADICAL MEAT
+ x 8089
2EBD CJK RADICAL MORTAR
+ x 81FC
2EBE CJK RADICAL GRASS ONE
+ x 8279
2EBF CJK RADICAL GRASS TWO
+ x 8279
2EC0 CJK RADICAL GRASS THREE
+ x 8279
2EC1 CJK RADICAL TIGER
+ x 864E
2EC2 CJK RADICAL CLOTHES
+ * form used on left side
+ x 8864
2EC3 CJK RADICAL WEST ONE
+ * form used at top
+ x 8980
2EC4 CJK RADICAL WEST TWO
+ * form used on left side
+ x 897F
2EC5 CJK RADICAL C-SIMPLIFIED SEE
+ x 89C1
2EC6 CJK RADICAL SIMPLIFIED HORN
+ x 89D2
2EC7 CJK RADICAL HORN
+ x 278B2
2EC8 CJK RADICAL C-SIMPLIFIED SPEECH
+ x 8BA0
2EC9 CJK RADICAL C-SIMPLIFIED SHELL
+ x 8D1D
2ECA CJK RADICAL FOOT
+ * form used on left side
+ x 8DB3
2ECB CJK RADICAL C-SIMPLIFIED CART
+ x 8F66
2ECC CJK RADICAL SIMPLIFIED WALK
+ x 8FB6
2ECD CJK RADICAL WALK ONE
+ x 8FB6
2ECE CJK RADICAL WALK TWO
+ x 8FB6
2ECF CJK RADICAL CITY
+ * form used on right side
+ x 9091
2ED0 CJK RADICAL C-SIMPLIFIED GOLD
+ x 9485
2ED1 CJK RADICAL LONG ONE
+ x 9577
2ED2 CJK RADICAL LONG TWO
+ * form used on left side
+ x 9578
2ED3 CJK RADICAL C-SIMPLIFIED LONG
+ x 957F
2ED4 CJK RADICAL C-SIMPLIFIED GATE
+ x 95E8
2ED5 CJK RADICAL MOUND ONE
+ x 961C
2ED6 CJK RADICAL MOUND TWO
+ * form used on left side
+ x 961D
2ED7 CJK RADICAL RAIN
+ x 96E8
2ED8 CJK RADICAL BLUE
+ x 9752
2ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER
+ x 97E6
2EDA CJK RADICAL C-SIMPLIFIED LEAF
+ x 9875
2EDB CJK RADICAL C-SIMPLIFIED WIND
+ x 98CE
2EDC CJK RADICAL C-SIMPLIFIED FLY
+ x 98DE
2EDD CJK RADICAL EAT ONE
+ * form used at bottom
+ x 98DF
2EDE CJK RADICAL EAT TWO
+ * form used on left side
+ x 2967F
2EDF CJK RADICAL EAT THREE
+ * form used on left side
+ x 98E0
2EE0 CJK RADICAL C-SIMPLIFIED EAT
+ * form used on left side
+ x 9963
2EE1 CJK RADICAL HEAD
+ x 29810
2EE2 CJK RADICAL C-SIMPLIFIED HORSE
+ x 9A6C
2EE3 CJK RADICAL BONE
+ x 9AA8
2EE4 CJK RADICAL GHOST
+ x 9B3C
2EE5 CJK RADICAL C-SIMPLIFIED FISH
+ x 9C7C
2EE6 CJK RADICAL C-SIMPLIFIED BIRD
+ x 9E1F
2EE7 CJK RADICAL C-SIMPLIFIED SALT
+ x 9E75
2EE8 CJK RADICAL SIMPLIFIED WHEAT
+ x 9EA6
2EE9 CJK RADICAL SIMPLIFIED YELLOW
+ x 9EC4
2EEA CJK RADICAL C-SIMPLIFIED FROG
+ x 9EFE
2EEB CJK RADICAL J-SIMPLIFIED EVEN
+ x 6589
2EEC CJK RADICAL C-SIMPLIFIED EVEN
+ x 9F50
2EED CJK RADICAL J-SIMPLIFIED TOOTH
+ x 6B6F
2EEE CJK RADICAL C-SIMPLIFIED TOOTH
+ x 9F7F
2EEF CJK RADICAL J-SIMPLIFIED DRAGON
+ x 9F8D
2EF0 CJK RADICAL C-SIMPLIFIED DRAGON
+ x 9F99
2EF1 CJK RADICAL TURTLE
+ x 9F9C
2EF2 CJK RADICAL J-SIMPLIFIED TURTLE
+ x 4E80
2EF3 CJK RADICAL C-SIMPLIFIED TURTLE
# 9F9F
@@ 2F00 Kangxi Radicals 2FDF
@@ -13119,6 +14004,7 @@
x (combining enclosing circle - 20DD)
x (white circle - 25CB)
x (large circle - 25EF)
+@ CJK angle brackets
3008 LEFT ANGLE BRACKET
x (less-than sign - 003C)
x (single left-pointing angle quotation mark - 2039)
@@ -13135,6 +14021,8 @@
300B RIGHT DOUBLE ANGLE BRACKET
x (right-pointing double angle quotation mark - 00BB)
x (mathematical right double angle bracket - 27EB)
+@ CJK corner brackets
+@+ The CJK corner brackets, which function as quotation marks, are not recommended for general-purpose corner brackets. See the ceiling and floor characters, instead.
300C LEFT CORNER BRACKET
x (left ceiling - 2308)
300D RIGHT CORNER BRACKET
@@ -13143,11 +14031,14 @@
300E LEFT WHITE CORNER BRACKET
300F RIGHT WHITE CORNER BRACKET
* used as quotation marks
+@ CJK brackets
3010 LEFT BLACK LENTICULAR BRACKET
3011 RIGHT BLACK LENTICULAR BRACKET
+@ CJK symbols
3012 POSTAL MARK
3013 GETA MARK
* substitute for ideograph not in font
+@ CJK brackets
3014 LEFT TORTOISE SHELL BRACKET
3015 RIGHT TORTOISE SHELL BRACKET
3016 LEFT WHITE LENTICULAR BRACKET
@@ -13158,6 +14049,7 @@
= left abstract syntax bracket
301B RIGHT WHITE SQUARE BRACKET
= right abstract syntax bracket
+@ CJK symbols and punctuation
301C WAVE DASH
@+ * This character was encoded to match JIS C 6226-1978 1-33 "wave dash". Subsequent revisions of the JIS standard and industry practice have settled on JIS 1-33 as being the fullwidth tilde character.
x (wavy dash - 3030)
@@ -13888,6 +14780,11 @@
# 0028 1112 1161 0029
321C PARENTHESIZED HANGUL CIEUC U
# 0028 110C 116E 0029
+@ Parenthesized Korean words
+321D PARENTHESIZED KOREAN CHARACTER OJEON
+ # 0028 110B 1169 110C 1165 11AB 0029
+321E PARENTHESIZED KOREAN CHARACTER O HU
+ # 0028 110B 1169 1112 116E 0029
@ Parenthesized ideographs
3220 PARENTHESIZED IDEOGRAPH ONE
# 0028 4E00 0029
@@ -13973,6 +14870,9 @@
3243 PARENTHESIZED IDEOGRAPH REACH
* to
# 0028 81F3 0029
+@ Squared Latin abbreviation
+3250 PARTNERSHIP SIGN
+ # <square> 0050 0054 0045
@ Circled numbers
3251 CIRCLED NUMBER TWENTY ONE
# <circle> 0032 0031
@@ -14062,6 +14962,11 @@
# <circle> 1111 1161
327B CIRCLED HANGUL HIEUH A
# <circle> 1112 1161
+@ Circled Korean words
+327C CIRCLED KOREAN CHARACTER CHAMKO
+ # <circle> 110E 1161 11B7 1100 1169
+327D CIRCLED KOREAN CHARACTER JUEUI
+ # <circle> 110C 116E 110B 1174
@ Symbol
327F KOREAN STANDARD SYMBOL
@ Circled ideographs
@@ -14232,6 +15137,15 @@
# 0031 0031 6708
32CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
# 0031 0032 6708
+@ Squared Latin abbreviations
+32CC SQUARE HG
+ # <square> 0048 0067
+32CD SQUARE ERG
+ # <square> 0065 0072 0067
+32CE SQUARE EV
+ # <square> 0065 0056
+32CF LIMITED LIABILITY SIGN
+ # <square> 004C 0054 0044
@ Circled Katakana
32D0 CIRCLED KATAKANA A
# <circle> 30A2
@@ -14657,6 +15571,14 @@
# <square> 006F 0056
3376 SQUARE PC
# <square> 0070 0063
+3377 SQUARE DM
+ # <square> 0064 006D
+3378 SQUARE DM SQUARED
+ # <square> 0064 006D 00B2
+3379 SQUARE DM CUBED
+ # <square> 0064 006D 00B3
+337A SQUARE IU
+ # <square> 0049 0055
@ Japanese era names
337B SQUARE ERA NAME HEISEI
# <square> 5E73 6210
@@ -14860,6 +15782,10 @@
# <square> 0053 0076
33DD SQUARE WB
# <square> 0057 0062
+33DE SQUARE V OVER M
+ # <square> 0056 2215 006D
+33DF SQUARE A OVER M
+ # <square> 0041 2215 006D
@ Telegraph symbols for days
33E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
# 0031 65E5
@@ -14923,7 +15849,76 @@
# 0033 0030 65E5
33FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
# 0033 0031 65E5
+@ Squared Latin abbreviation
+33FF SQUARE GAL
+ # <square> 0067 0061 006C
@@ 3400 CJK Unified Ideographs Extension A 4DB5
+@@ 4DC0 Yijing Hexagram Symbols 4DFF
+@ Yijing hexagram symbols
+4DC0 HEXAGRAM FOR THE CREATIVE HEAVEN
+4DC1 HEXAGRAM FOR THE RECEPTIVE EARTH
+4DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING
+4DC3 HEXAGRAM FOR YOUTHFUL FOLLY
+4DC4 HEXAGRAM FOR WAITING
+4DC5 HEXAGRAM FOR CONFLICT
+4DC6 HEXAGRAM FOR THE ARMY
+4DC7 HEXAGRAM FOR HOLDING TOGETHER
+4DC8 HEXAGRAM FOR SMALL TAMING
+4DC9 HEXAGRAM FOR TREADING
+4DCA HEXAGRAM FOR PEACE
+4DCB HEXAGRAM FOR STANDSTILL
+4DCC HEXAGRAM FOR FELLOWSHIP
+4DCD HEXAGRAM FOR GREAT POSSESSION
+4DCE HEXAGRAM FOR MODESTY
+4DCF HEXAGRAM FOR ENTHUSIASM
+4DD0 HEXAGRAM FOR FOLLOWING
+4DD1 HEXAGRAM FOR WORK ON THE DECAYED
+4DD2 HEXAGRAM FOR APPROACH
+4DD3 HEXAGRAM FOR CONTEMPLATION
+4DD4 HEXAGRAM FOR BITING THROUGH
+4DD5 HEXAGRAM FOR GRACE
+4DD6 HEXAGRAM FOR SPLITTING APART
+4DD7 HEXAGRAM FOR RETURN
+4DD8 HEXAGRAM FOR INNOCENCE
+4DD9 HEXAGRAM FOR GREAT TAMING
+4DDA HEXAGRAM FOR MOUTH CORNERS
+4DDB HEXAGRAM FOR GREAT PREPONDERANCE
+4DDC HEXAGRAM FOR THE ABYSMAL WATER
+4DDD HEXAGRAM FOR THE CLINGING FIRE
+4DDE HEXAGRAM FOR INFLUENCE
+4DDF HEXAGRAM FOR DURATION
+4DE0 HEXAGRAM FOR RETREAT
+4DE1 HEXAGRAM FOR GREAT POWER
+4DE2 HEXAGRAM FOR PROGRESS
+4DE3 HEXAGRAM FOR DARKENING OF THE LIGHT
+4DE4 HEXAGRAM FOR THE FAMILY
+4DE5 HEXAGRAM FOR OPPOSITION
+4DE6 HEXAGRAM FOR OBSTRUCTION
+4DE7 HEXAGRAM FOR DELIVERANCE
+4DE8 HEXAGRAM FOR DECREASE
+4DE9 HEXAGRAM FOR INCREASE
+4DEA HEXAGRAM FOR BREAKTHROUGH
+4DEB HEXAGRAM FOR COMING TO MEET
+4DEC HEXAGRAM FOR GATHERING TOGETHER
+4DED HEXAGRAM FOR PUSHING UPWARD
+4DEE HEXAGRAM FOR OPPRESSION
+4DEF HEXAGRAM FOR THE WELL
+4DF0 HEXAGRAM FOR REVOLUTION
+4DF1 HEXAGRAM FOR THE CAULDRON
+4DF2 HEXAGRAM FOR THE AROUSING THUNDER
+4DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN
+4DF4 HEXAGRAM FOR DEVELOPMENT
+4DF5 HEXAGRAM FOR THE MARRYING MAIDEN
+4DF6 HEXAGRAM FOR ABUNDANCE
+4DF7 HEXAGRAM FOR THE WANDERER
+4DF8 HEXAGRAM FOR THE GENTLE WIND
+4DF9 HEXAGRAM FOR THE JOYOUS LAKE
+4DFA HEXAGRAM FOR DISPERSION
+4DFB HEXAGRAM FOR LIMITATION
+4DFC HEXAGRAM FOR INNER TRUTH
+4DFD HEXAGRAM FOR SMALL PREPONDERANCE
+4DFE HEXAGRAM FOR AFTER COMPLETION
+4DFF HEXAGRAM FOR BEFORE COMPLETION
@@ 4E00 CJK Unified Ideographs 9FA5
@@ A000 Yi Syllables A48F
@ Syllables
@@ -16155,7 +17150,7 @@ A4C6 YI RADICAL KE
@@ DC00 Low Surrogates DFFF
@@ E000 Private Use Area F8FF
@@ F900 CJK Compatibility Ideographs FAFF
-@ Pronunciation variants from KS C 5601-1987
+@ Pronunciation variants from KS X 1001:1998
F900 CJK COMPATIBILITY IDEOGRAPH-F900
: 8C48
F901 CJK COMPATIBILITY IDEOGRAPH-F901
@@ -16525,6 +17520,7 @@ F9B6 CJK COMPATIBILITY IDEOGRAPH-F9B6
F9B7 CJK COMPATIBILITY IDEOGRAPH-F9B7
: 91B4
F9B8 CJK COMPATIBILITY IDEOGRAPH-F9B8
+ x (cjk unified ideograph-96B7 - 96B7)
: 96B8
F9B9 CJK COMPATIBILITY IDEOGRAPH-F9B9
: 60E1
@@ -16911,14 +17907,15 @@ FB16 ARMENIAN SMALL LIGATURE VEW NOW
FB17 ARMENIAN SMALL LIGATURE MEN XEH
# 0574 056D
@ Hebrew presentation forms
+@+ See the Hebrew block starting at 0590
FB1D HEBREW LETTER YOD WITH HIRIQ
: 05D9 05B4
FB1E HEBREW POINT JUDEO-SPANISH VARIKA
* a glyph variant of 05BF
-@+ See the Hebrew block starting at 0590
FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH
: 05F2 05B7
FB20 HEBREW LETTER ALTERNATIVE AYIN
+ * this form of AYIN has no descender, for use with marks placed below the letter
# <font> 05E2 hebrew letter ayin
FB21 HEBREW LETTER WIDE ALEF
# <font> 05D0 hebrew letter alef
@@ -18171,7 +19168,7 @@ FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
# <final> 0633 062E 064A
FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
# <final> 0646 062C 064A
-@ Process internal codes
+@ Noncharacters
@+ These codes are intended for process internal uses, but are not permitted for interchange.
FDD0 <not a character>
FDD1 <not a character>
@@ -18233,10 +19230,13 @@ FDFB ARABIC LIGATURE JALLAJALALOUHOU
@ Currency sign
FDFC RIAL SIGN
# <isolated> 0631 06CC 0627 0644
+@ Symbol
+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
@@ FE00 Variation Selectors FE0F
@ Variation selectors
@+ Combining characters; in conjunction with the preceding character these indicate a predetermined choice of variant glyph
FE00 VARIATION SELECTOR-1
+ * these are abbreviated VS1, and so on
FE01 VARIATION SELECTOR-2
FE02 VARIATION SELECTOR-3
FE03 VARIATION SELECTOR-4
@@ -18306,6 +19306,13 @@ FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
FE45 SESAME DOT
FE46 WHITE SESAME DOT
* sesame dots are used beside vertical text for emphasis
+@ Glyphs for vertical variants
+FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+ x (top square bracket - 23B4)
+ # <vertical> 005B
+FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+ x (bottom square bracket - 23B5)
+ # <vertical> 005D
@ Overscores and underscores
FE49 DASHED OVERLINE
# 203E overline
@@ -18329,8 +19336,6 @@ FE51 SMALL IDEOGRAPHIC COMMA
# <small> 3001
FE52 SMALL FULL STOP
# <small> 002E
-FE53 <reserved>
- x (middle dot - 00B7)
FE54 SMALL SEMICOLON
# <small> 003B
FE55 SMALL COLON
@@ -18369,8 +19374,6 @@ FE65 SMALL GREATER-THAN SIGN
# <small> 003E
FE66 SMALL EQUALS SIGN
# <small> 003D
-FE67 <reserved>
- x (division slash - 2215)
FE68 SMALL REVERSE SOLIDUS
# <small> 005C
FE69 SMALL DOLLAR SIGN
@@ -18666,7 +19669,7 @@ FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM
# <final> 0644 0627
@ Special
FEFF ZERO WIDTH NO-BREAK SPACE
- = BYTE ORDER MARK (BOM)
+ = BYTE ORDER MARK (BOM), ZWNBSP
* may be used to detect byte order by contrast with the noncharacter code point FFFE
* use as an indication of non-breaking is deprecated; see 2060 instead
x (zero width space - 200B)
@@ -18867,7 +19870,7 @@ FF5E FULLWIDTH TILDE
FF5F FULLWIDTH LEFT WHITE PARENTHESIS *
# <wide> 2985
FF60 FULLWIDTH RIGHT WHITE PARENTHESIS *
- * a commonly occurring glyph variant looks like doubled parentheses
+ * the most commonly occurring glyph variant looks like doubled parentheses
# <wide> 2986
@ Halfwidth CJK punctuation
@+ See CJK punctuation 3000 - 303F
@@ -19153,14 +20156,318 @@ FFFC OBJECT REPLACEMENT CHARACTER
FFFD REPLACEMENT CHARACTER
* used to replace an incoming character whose value is unknown or unrepresentable in Unicode
* compare the use of 001A as a control character to indicate the substitute function
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
FFFE <not a character>
* the value FFFE is guaranteed not to be a Unicode character at all
* may be used to detect byte order by contrast with FEFF which is a character
x (zero width no-break space - FEFF)
FFFF <not a character>
* the value FFFF is guaranteed not to be a Unicode character at all
+@@ 10000 Linear B Syllabary 1007F
+@ Basic syllables
+10000 LINEAR B SYLLABLE B008 A
+10001 LINEAR B SYLLABLE B038 E
+10002 LINEAR B SYLLABLE B028 I
+10003 LINEAR B SYLLABLE B061 O
+10004 LINEAR B SYLLABLE B010 U
+10005 LINEAR B SYLLABLE B001 DA
+10006 LINEAR B SYLLABLE B045 DE
+10007 LINEAR B SYLLABLE B007 DI
+10008 LINEAR B SYLLABLE B014 DO
+10009 LINEAR B SYLLABLE B051 DU
+1000A LINEAR B SYLLABLE B057 JA
+1000B LINEAR B SYLLABLE B046 JE
+1000D LINEAR B SYLLABLE B036 JO
+1000E LINEAR B SYLLABLE B065 JU
+ = ideogram B129 flour
+1000F LINEAR B SYLLABLE B077 KA
+10010 LINEAR B SYLLABLE B044 KE
+10011 LINEAR B SYLLABLE B067 KI
+10012 LINEAR B SYLLABLE B070 KO
+10013 LINEAR B SYLLABLE B081 KU
+10014 LINEAR B SYLLABLE B080 MA
+10015 LINEAR B SYLLABLE B013 ME
+10016 LINEAR B SYLLABLE B073 MI
+10017 LINEAR B SYLLABLE B015 MO
+10018 LINEAR B SYLLABLE B023 MU
+ = ideogram B109 ox
+10019 LINEAR B SYLLABLE B006 NA
+1001A LINEAR B SYLLABLE B024 NE
+1001B LINEAR B SYLLABLE B030 NI
+ = ideogram B030 figs
+1001C LINEAR B SYLLABLE B052 NO
+1001D LINEAR B SYLLABLE B055 NU
+1001E LINEAR B SYLLABLE B003 PA
+1001F LINEAR B SYLLABLE B072 PE
+10020 LINEAR B SYLLABLE B039 PI
+10021 LINEAR B SYLLABLE B011 PO
+10022 LINEAR B SYLLABLE B050 PU
+10023 LINEAR B SYLLABLE B016 QA
+10024 LINEAR B SYLLABLE B078 QE
+10025 LINEAR B SYLLABLE B021 QI
+ = ideogram B106 sheep
+10026 LINEAR B SYLLABLE B032 QO
+10028 LINEAR B SYLLABLE B060 RA
+10029 LINEAR B SYLLABLE B027 RE
+1002A LINEAR B SYLLABLE B053 RI
+1002B LINEAR B SYLLABLE B002 RO
+1002C LINEAR B SYLLABLE B026 RU
+1002D LINEAR B SYLLABLE B031 SA
+ = ideogram B031 flax
+1002E LINEAR B SYLLABLE B009 SE
+1002F LINEAR B SYLLABLE B041 SI
+10030 LINEAR B SYLLABLE B012 SO
+10031 LINEAR B SYLLABLE B058 SU
+10032 LINEAR B SYLLABLE B059 TA
+10033 LINEAR B SYLLABLE B004 TE
+10034 LINEAR B SYLLABLE B037 TI
+10035 LINEAR B SYLLABLE B005 TO
+10036 LINEAR B SYLLABLE B069 TU
+10037 LINEAR B SYLLABLE B054 WA
+10038 LINEAR B SYLLABLE B075 WE
+10039 LINEAR B SYLLABLE B040 WI
+1003A LINEAR B SYLLABLE B042 WO
+1003C LINEAR B SYLLABLE B017 ZA
+1003D LINEAR B SYLLABLE B074 ZE
+1003F LINEAR B SYLLABLE B020 ZO
+@ Supplementary signs
+10040 LINEAR B SYLLABLE B025 A2
+10041 LINEAR B SYLLABLE B043 A3
+10042 LINEAR B SYLLABLE B085 AU
+ = ideogram B108 pig
+10043 LINEAR B SYLLABLE B071 DWE
+10044 LINEAR B SYLLABLE B090 DWO
+10045 LINEAR B SYLLABLE B048 NWA
+10046 LINEAR B SYLLABLE B029 PU2
+10047 LINEAR B SYLLABLE B062 PTE
+10048 LINEAR B SYLLABLE B076 RA2
+10049 LINEAR B SYLLABLE B033 RA3
+ = ideogram B144 saffron
+1004A LINEAR B SYLLABLE B068 RO2
+1004B LINEAR B SYLLABLE B066 TA2
+1004C LINEAR B SYLLABLE B087 TWE
+1004D LINEAR B SYLLABLE B091 TWO
+@ Symbols
+10050 LINEAR B SYMBOL B018
+10051 LINEAR B SYMBOL B019
+10052 LINEAR B SYMBOL B022
+ = ideogram B107 goat
+10053 LINEAR B SYMBOL B034
+10054 LINEAR B SYMBOL B047
+10055 LINEAR B SYMBOL B049
+10056 LINEAR B SYMBOL B056
+10057 LINEAR B SYMBOL B063
+10058 LINEAR B SYMBOL B064
+10059 LINEAR B SYMBOL B079
+1005A LINEAR B SYMBOL B082
+1005B LINEAR B SYMBOL B083
+1005C LINEAR B SYMBOL B086
+1005D LINEAR B SYMBOL B089
+@@ 10080 Linear B Ideograms 100FF
+@ People and animals
+10080 LINEAR B IDEOGRAM B100 MAN
+10081 LINEAR B IDEOGRAM B102 WOMAN
+10082 LINEAR B IDEOGRAM B104 DEER
+10083 LINEAR B IDEOGRAM B105 EQUID
+10084 LINEAR B IDEOGRAM B105F MARE
+10085 LINEAR B IDEOGRAM B105M STALLION
+10086 LINEAR B IDEOGRAM B106F EWE
+10087 LINEAR B IDEOGRAM B106M RAM
+10088 LINEAR B IDEOGRAM B107F SHE-GOAT
+10089 LINEAR B IDEOGRAM B107M HE-GOAT
+1008A LINEAR B IDEOGRAM B108F SOW
+1008B LINEAR B IDEOGRAM B108M BOAR
+1008C LINEAR B IDEOGRAM B109F COW
+1008D LINEAR B IDEOGRAM B109M BULL
+@ Cereals and plants
+1008E LINEAR B IDEOGRAM B120 WHEAT
+1008F LINEAR B IDEOGRAM B121 BARLEY
+10090 LINEAR B IDEOGRAM B122 OLIVE
+10091 LINEAR B IDEOGRAM B123 SPICE
+10092 LINEAR B IDEOGRAM B125 CYPERUS
+10093 LINEAR B MONOGRAM B127 KAPO
+ = fruit
+10094 LINEAR B MONOGRAM B128 KANAKO
+ = saffron
+@ Extracts
+10095 LINEAR B IDEOGRAM B130 OIL
+10096 LINEAR B IDEOGRAM B131 WINE
+10097 LINEAR B IDEOGRAM B132
+10098 LINEAR B MONOGRAM B133 AREPA
+ = ointment
+10099 LINEAR B MONOGRAM B135 MERI
+ = honey
+@ Metals
+1009A LINEAR B IDEOGRAM B140 BRONZE
+1009B LINEAR B IDEOGRAM B141 GOLD
+1009C LINEAR B IDEOGRAM B142
+@ Other materials
+1009D LINEAR B IDEOGRAM B145 WOOL
+1009E LINEAR B IDEOGRAM B146
+1009F LINEAR B IDEOGRAM B150
+100A0 LINEAR B IDEOGRAM B151 HORN
+100A1 LINEAR B IDEOGRAM B152
+100A2 LINEAR B IDEOGRAM B153
+100A3 LINEAR B IDEOGRAM B154
+100A4 LINEAR B MONOGRAM B156 TURO2
+ = cheese
+100A5 LINEAR B IDEOGRAM B157
+100A6 LINEAR B IDEOGRAM B158
+100A7 LINEAR B IDEOGRAM B159 CLOTH
+100A8 LINEAR B IDEOGRAM B160
+100A9 LINEAR B IDEOGRAM B161
+100AA LINEAR B IDEOGRAM B162 GARMENT
+100AB LINEAR B IDEOGRAM B163 ARMOUR
+100AC LINEAR B IDEOGRAM B164
+100AD LINEAR B IDEOGRAM B165
+100AE LINEAR B IDEOGRAM B166
+100AF LINEAR B IDEOGRAM B167
+100B0 LINEAR B IDEOGRAM B168
+100B1 LINEAR B IDEOGRAM B169
+100B2 LINEAR B IDEOGRAM B170
+100B3 LINEAR B IDEOGRAM B171
+100B4 LINEAR B IDEOGRAM B172
+100B5 LINEAR B IDEOGRAM B173 MONTH
+100B6 LINEAR B IDEOGRAM B174
+100B7 LINEAR B IDEOGRAM B176 TREE
+100B8 LINEAR B IDEOGRAM B177
+100B9 LINEAR B IDEOGRAM B178
+100BA LINEAR B IDEOGRAM B179
+100BB LINEAR B IDEOGRAM B180
+100BC LINEAR B IDEOGRAM B181
+100BD LINEAR B IDEOGRAM B182
+100BE LINEAR B IDEOGRAM B183
+100BF LINEAR B IDEOGRAM B184
+ * the shape of this ideogram is only partially known
+100C0 LINEAR B IDEOGRAM B185
+100C1 LINEAR B IDEOGRAM B189
+100C2 LINEAR B IDEOGRAM B190
+100C3 LINEAR B IDEOGRAM B191 HELMET
+100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL
+100C5 LINEAR B IDEOGRAM B225 BATHTUB
+100C6 LINEAR B IDEOGRAM B230 SPEAR
+100C7 LINEAR B IDEOGRAM B231 ARROW
+100C8 LINEAR B IDEOGRAM B232
+100C9 LINEAR B IDEOGRAM B233 SWORD (pug)
+ = pugio
+100CA LINEAR B IDEOGRAM B234
+100CB LINEAR B IDEOGRAM B236 (gup)
+ = "gupio", inverted sword
+100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT
+100CD LINEAR B IDEOGRAM B241 CHARIOT
+100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME
+100CF LINEAR B IDEOGRAM B243 WHEEL
+100D0 LINEAR B IDEOGRAM B245
+100D1 LINEAR B IDEOGRAM B246
+100D2 LINEAR B MONOGRAM B247 DIPTE
+100D3 LINEAR B IDEOGRAM B248
+100D4 LINEAR B IDEOGRAM B249
+100D5 LINEAR B IDEOGRAM B251
+ * the shape of this ideogram is only partially known
+100D6 LINEAR B IDEOGRAM B252
+ * the shape of this ideogram is only partially known
+100D7 LINEAR B IDEOGRAM B253
+100D8 LINEAR B IDEOGRAM B254 DART
+100D9 LINEAR B IDEOGRAM B255
+100DA LINEAR B IDEOGRAM B256
+100DB LINEAR B IDEOGRAM B257
+100DC LINEAR B IDEOGRAM B258
+100DD LINEAR B IDEOGRAM B259
+@ Vessels
+100DE LINEAR B IDEOGRAM VESSEL B155
+100DF LINEAR B IDEOGRAM VESSEL B200
+100E0 LINEAR B IDEOGRAM VESSEL B201
+100E1 LINEAR B IDEOGRAM VESSEL B202
+100E2 LINEAR B IDEOGRAM VESSEL B203
+100E3 LINEAR B IDEOGRAM VESSEL B204
+100E4 LINEAR B IDEOGRAM VESSEL B205
+100E5 LINEAR B IDEOGRAM VESSEL B206
+100E6 LINEAR B IDEOGRAM VESSEL B207
+100E7 LINEAR B IDEOGRAM VESSEL B208
+100E8 LINEAR B IDEOGRAM VESSEL B209
+100E9 LINEAR B IDEOGRAM VESSEL B210
+100EA LINEAR B IDEOGRAM VESSEL B211
+100EB LINEAR B IDEOGRAM VESSEL B212
+100EC LINEAR B IDEOGRAM VESSEL B213
+100ED LINEAR B IDEOGRAM VESSEL B214
+100EE LINEAR B IDEOGRAM VESSEL B215
+100EF LINEAR B IDEOGRAM VESSEL B216
+100F0 LINEAR B IDEOGRAM VESSEL B217
+100F1 LINEAR B IDEOGRAM VESSEL B218
+100F2 LINEAR B IDEOGRAM VESSEL B219
+100F3 LINEAR B IDEOGRAM VESSEL B221
+100F4 LINEAR B IDEOGRAM VESSEL B222
+100F5 LINEAR B IDEOGRAM VESSEL B226
+100F6 LINEAR B IDEOGRAM VESSEL B227
+100F7 LINEAR B IDEOGRAM VESSEL B228
+100F8 LINEAR B IDEOGRAM VESSEL B229
+100F9 LINEAR B IDEOGRAM VESSEL B250
+100FA LINEAR B IDEOGRAM VESSEL B305
+ * the shape of this ideogram is only partially known
+@@ 10100 Aegean Numbers 1013F
+@ Punctuation
+10100 AEGEAN WORD SEPARATOR LINE
+10101 AEGEAN WORD SEPARATOR DOT
+10102 AEGEAN CHECK MARK
+@ Numbers
+10107 AEGEAN NUMBER ONE
+10108 AEGEAN NUMBER TWO
+10109 AEGEAN NUMBER THREE
+1010A AEGEAN NUMBER FOUR
+1010B AEGEAN NUMBER FIVE
+1010C AEGEAN NUMBER SIX
+1010D AEGEAN NUMBER SEVEN
+1010E AEGEAN NUMBER EIGHT
+1010F AEGEAN NUMBER NINE
+10110 AEGEAN NUMBER TEN
+10111 AEGEAN NUMBER TWENTY
+10112 AEGEAN NUMBER THIRTY
+10113 AEGEAN NUMBER FORTY
+10114 AEGEAN NUMBER FIFTY
+10115 AEGEAN NUMBER SIXTY
+10116 AEGEAN NUMBER SEVENTY
+10117 AEGEAN NUMBER EIGHTY
+10118 AEGEAN NUMBER NINETY
+10119 AEGEAN NUMBER ONE HUNDRED
+1011A AEGEAN NUMBER TWO HUNDRED
+1011B AEGEAN NUMBER THREE HUNDRED
+1011C AEGEAN NUMBER FOUR HUNDRED
+1011D AEGEAN NUMBER FIVE HUNDRED
+1011E AEGEAN NUMBER SIX HUNDRED
+1011F AEGEAN NUMBER SEVEN HUNDRED
+10120 AEGEAN NUMBER EIGHT HUNDRED
+10121 AEGEAN NUMBER NINE HUNDRED
+10122 AEGEAN NUMBER ONE THOUSAND
+10123 AEGEAN NUMBER TWO THOUSAND
+10124 AEGEAN NUMBER THREE THOUSAND
+10125 AEGEAN NUMBER FOUR THOUSAND
+10126 AEGEAN NUMBER FIVE THOUSAND
+10127 AEGEAN NUMBER SIX THOUSAND
+10128 AEGEAN NUMBER SEVEN THOUSAND
+10129 AEGEAN NUMBER EIGHT THOUSAND
+1012A AEGEAN NUMBER NINE THOUSAND
+1012B AEGEAN NUMBER TEN THOUSAND
+1012C AEGEAN NUMBER TWENTY THOUSAND
+1012D AEGEAN NUMBER THIRTY THOUSAND
+1012E AEGEAN NUMBER FORTY THOUSAND
+1012F AEGEAN NUMBER FIFTY THOUSAND
+10130 AEGEAN NUMBER SIXTY THOUSAND
+10131 AEGEAN NUMBER SEVENTY THOUSAND
+10132 AEGEAN NUMBER EIGHTY THOUSAND
+10133 AEGEAN NUMBER NINETY THOUSAND
+@ Measures
+10137 AEGEAN WEIGHT BASE UNIT
+10138 AEGEAN WEIGHT FIRST SUBUNIT
+10139 AEGEAN WEIGHT SECOND SUBUNIT
+1013A AEGEAN WEIGHT THIRD SUBUNIT
+1013B AEGEAN WEIGHT FOURTH SUBUNIT
+1013C AEGEAN DRY MEASURE FIRST SUBUNIT
+1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT
+1013E AEGEAN MEASURE SECOND SUBUNIT
+1013F AEGEAN MEASURE THIRD SUBUNIT
@@ 10300 Old Italic 1032F
+@ Letters
10300 OLD ITALIC LETTER A
10301 OLD ITALIC LETTER BE
10302 OLD ITALIC LETTER KE
@@ -19192,11 +20499,13 @@ FFFF <not a character>
1031C OLD ITALIC LETTER CHE (Umbrian)
1031D OLD ITALIC LETTER II (Oscan)
1031E OLD ITALIC LETTER UU (Oscan)
+@ Numerals
10320 OLD ITALIC NUMERAL ONE
10321 OLD ITALIC NUMERAL FIVE
10322 OLD ITALIC NUMERAL TEN
10323 OLD ITALIC NUMERAL FIFTY
@@ 10330 Gothic 1034F
+@ Letters
10330 GOTHIC LETTER AHSA
10331 GOTHIC LETTER BAIRKAN
10332 GOTHIC LETTER GIBA
@@ -19224,7 +20533,42 @@ FFFF <not a character>
10348 GOTHIC LETTER HWAIR
10349 GOTHIC LETTER OTHAL
1034A GOTHIC LETTER NINE HUNDRED
+@@ 10380 Ugaritic 1039F
+@ Letters
+10380 UGARITIC LETTER ALPA
+10381 UGARITIC LETTER BETA
+10382 UGARITIC LETTER GAMLA
+10383 UGARITIC LETTER KHA
+10384 UGARITIC LETTER DELTA
+10385 UGARITIC LETTER HO
+10386 UGARITIC LETTER WO
+10387 UGARITIC LETTER ZETA
+10388 UGARITIC LETTER HOTA
+10389 UGARITIC LETTER TET
+1038A UGARITIC LETTER YOD
+1038B UGARITIC LETTER KAF
+1038C UGARITIC LETTER SHIN
+1038D UGARITIC LETTER LAMDA
+1038E UGARITIC LETTER MEM
+1038F UGARITIC LETTER DHAL
+10390 UGARITIC LETTER NUN
+10391 UGARITIC LETTER ZU
+10392 UGARITIC LETTER SAMKA
+10393 UGARITIC LETTER AIN
+10394 UGARITIC LETTER PU
+10395 UGARITIC LETTER SADE
+10396 UGARITIC LETTER QOPA
+10397 UGARITIC LETTER RASHA
+10398 UGARITIC LETTER THANNA
+10399 UGARITIC LETTER GHAIN
+1039A UGARITIC LETTER TO
+1039B UGARITIC LETTER I
+1039C UGARITIC LETTER U
+1039D UGARITIC LETTER SSU
+@ Punctuation
+1039F UGARITIC WORD DIVIDER
@@ 10400 Deseret 1044F
+@ Uppercase letters
10400 DESERET CAPITAL LETTER LONG I
10401 DESERET CAPITAL LETTER LONG E
10402 DESERET CAPITAL LETTER LONG A
@@ -19263,6 +20607,9 @@ FFFF <not a character>
10423 DESERET CAPITAL LETTER EM
10424 DESERET CAPITAL LETTER EN
10425 DESERET CAPITAL LETTER ENG
+10426 DESERET CAPITAL LETTER OI
+10427 DESERET CAPITAL LETTER EW
+@ Lowercase letters
10428 DESERET SMALL LETTER LONG I
10429 DESERET SMALL LETTER LONG E
1042A DESERET SMALL LETTER LONG A
@@ -19301,6 +20648,159 @@ FFFF <not a character>
1044B DESERET SMALL LETTER EM
1044C DESERET SMALL LETTER EN
1044D DESERET SMALL LETTER ENG
+1044E DESERET SMALL LETTER OI
+1044F DESERET SMALL LETTER EW
+@@ 10450 Shavian 1047F
+@ Consonants
+10450 SHAVIAN LETTER PEEP
+10451 SHAVIAN LETTER TOT
+10452 SHAVIAN LETTER KICK
+10453 SHAVIAN LETTER FEE
+10454 SHAVIAN LETTER THIGH
+10455 SHAVIAN LETTER SO
+10456 SHAVIAN LETTER SURE
+10457 SHAVIAN LETTER CHURCH
+10458 SHAVIAN LETTER YEA
+10459 SHAVIAN LETTER HUNG
+1045A SHAVIAN LETTER BIB
+1045B SHAVIAN LETTER DEAD
+1045C SHAVIAN LETTER GAG
+1045D SHAVIAN LETTER VOW
+1045E SHAVIAN LETTER THEY
+1045F SHAVIAN LETTER ZOO
+10460 SHAVIAN LETTER MEASURE
+10461 SHAVIAN LETTER JUDGE
+10462 SHAVIAN LETTER WOE
+10463 SHAVIAN LETTER HA-HA
+10464 SHAVIAN LETTER LOLL
+10465 SHAVIAN LETTER MIME
+@ Vowels
+10466 SHAVIAN LETTER IF
+10467 SHAVIAN LETTER EGG
+10468 SHAVIAN LETTER ASH
+10469 SHAVIAN LETTER ADO
+1046A SHAVIAN LETTER ON
+1046B SHAVIAN LETTER WOOL
+1046C SHAVIAN LETTER OUT
+1046D SHAVIAN LETTER AH
+1046E SHAVIAN LETTER ROAR
+1046F SHAVIAN LETTER NUN
+10470 SHAVIAN LETTER EAT
+10471 SHAVIAN LETTER AGE
+10472 SHAVIAN LETTER ICE
+10473 SHAVIAN LETTER UP
+10474 SHAVIAN LETTER OAK
+10475 SHAVIAN LETTER OOZE
+10476 SHAVIAN LETTER OIL
+10477 SHAVIAN LETTER AWE
+10478 SHAVIAN LETTER ARE
+10479 SHAVIAN LETTER OR
+1047A SHAVIAN LETTER AIR
+1047B SHAVIAN LETTER ERR
+1047C SHAVIAN LETTER ARRAY
+1047D SHAVIAN LETTER EAR
+1047E SHAVIAN LETTER IAN
+1047F SHAVIAN LETTER YEW
+@@ 10480 Osmanya 104AF
+@ Letters
+10480 OSMANYA LETTER ALEF
+10481 OSMANYA LETTER BA
+10482 OSMANYA LETTER TA
+10483 OSMANYA LETTER JA
+10484 OSMANYA LETTER XA
+10485 OSMANYA LETTER KHA
+10486 OSMANYA LETTER DEEL
+10487 OSMANYA LETTER RA
+10488 OSMANYA LETTER SA
+10489 OSMANYA LETTER SHIIN
+1048A OSMANYA LETTER DHA
+1048B OSMANYA LETTER CAYN
+1048C OSMANYA LETTER GA
+1048D OSMANYA LETTER FA
+1048E OSMANYA LETTER QAAF
+1048F OSMANYA LETTER KAAF
+10490 OSMANYA LETTER LAAN
+10491 OSMANYA LETTER MIIN
+10492 OSMANYA LETTER NUUN
+10493 OSMANYA LETTER WAW
+10494 OSMANYA LETTER HA
+10495 OSMANYA LETTER YA
+10496 OSMANYA LETTER A
+10497 OSMANYA LETTER E
+10498 OSMANYA LETTER I
+10499 OSMANYA LETTER O
+1049A OSMANYA LETTER U
+1049B OSMANYA LETTER AA
+1049C OSMANYA LETTER EE
+1049D OSMANYA LETTER OO
+@ Digits
+104A0 OSMANYA DIGIT ZERO
+104A1 OSMANYA DIGIT ONE
+104A2 OSMANYA DIGIT TWO
+104A3 OSMANYA DIGIT THREE
+104A4 OSMANYA DIGIT FOUR
+104A5 OSMANYA DIGIT FIVE
+104A6 OSMANYA DIGIT SIX
+104A7 OSMANYA DIGIT SEVEN
+104A8 OSMANYA DIGIT EIGHT
+104A9 OSMANYA DIGIT NINE
+@@ 10800 Cypriot Syllabary 1083F
+@ Syllables
+10800 CYPRIOT SYLLABLE A
+10801 CYPRIOT SYLLABLE E
+10802 CYPRIOT SYLLABLE I
+10803 CYPRIOT SYLLABLE O
+10804 CYPRIOT SYLLABLE U
+10805 CYPRIOT SYLLABLE JA
+10808 CYPRIOT SYLLABLE JO
+1080A CYPRIOT SYLLABLE KA
+1080B CYPRIOT SYLLABLE KE
+1080C CYPRIOT SYLLABLE KI
+1080D CYPRIOT SYLLABLE KO
+1080E CYPRIOT SYLLABLE KU
+1080F CYPRIOT SYLLABLE LA
+10810 CYPRIOT SYLLABLE LE
+10811 CYPRIOT SYLLABLE LI
+10812 CYPRIOT SYLLABLE LO
+10813 CYPRIOT SYLLABLE LU
+10814 CYPRIOT SYLLABLE MA
+10815 CYPRIOT SYLLABLE ME
+10816 CYPRIOT SYLLABLE MI
+10817 CYPRIOT SYLLABLE MO
+10818 CYPRIOT SYLLABLE MU
+10819 CYPRIOT SYLLABLE NA
+1081A CYPRIOT SYLLABLE NE
+1081B CYPRIOT SYLLABLE NI
+1081C CYPRIOT SYLLABLE NO
+1081D CYPRIOT SYLLABLE NU
+1081E CYPRIOT SYLLABLE PA
+1081F CYPRIOT SYLLABLE PE
+10820 CYPRIOT SYLLABLE PI
+10821 CYPRIOT SYLLABLE PO
+10822 CYPRIOT SYLLABLE PU
+10823 CYPRIOT SYLLABLE RA
+10824 CYPRIOT SYLLABLE RE
+10825 CYPRIOT SYLLABLE RI
+10826 CYPRIOT SYLLABLE RO
+10827 CYPRIOT SYLLABLE RU
+10828 CYPRIOT SYLLABLE SA
+10829 CYPRIOT SYLLABLE SE
+1082A CYPRIOT SYLLABLE SI
+1082B CYPRIOT SYLLABLE SO
+1082C CYPRIOT SYLLABLE SU
+1082D CYPRIOT SYLLABLE TA
+1082E CYPRIOT SYLLABLE TE
+1082F CYPRIOT SYLLABLE TI
+10830 CYPRIOT SYLLABLE TO
+10831 CYPRIOT SYLLABLE TU
+10832 CYPRIOT SYLLABLE WA
+10833 CYPRIOT SYLLABLE WE
+10834 CYPRIOT SYLLABLE WI
+10835 CYPRIOT SYLLABLE WO
+10837 CYPRIOT SYLLABLE XA
+10838 CYPRIOT SYLLABLE XE
+1083C CYPRIOT SYLLABLE ZA
+1083F CYPRIOT SYLLABLE ZO
@@ 1D000 Byzantine Musical Symbols 1D0FF
@ Prosodies (Prosodics)
1D000 BYZANTINE MUSICAL SYMBOL PSILI
@@ -19511,6 +21011,7 @@ FFFF <not a character>
1D0C3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS
1D0C4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS
1D0C5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS
+ * misspelling of "FTHORA" in character name is a known defect
1D0C6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI
1D0C7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO
1D0C8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS
@@ -19829,6 +21330,97 @@ FFFF <not a character>
1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS
1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS
1D1DD MUSICAL SYMBOL PES SUBPUNCTIS
+@@ 1D300 Tai Xuan Jing Symbols 1D35F
+@ Monogram
+1D300 MONOGRAM FOR EARTH
+@ Digrams
+1D301 DIGRAM FOR HEAVENLY EARTH
+1D302 DIGRAM FOR HUMAN EARTH
+1D303 DIGRAM FOR EARTHLY HEAVEN
+1D304 DIGRAM FOR EARTHLY HUMAN
+1D305 DIGRAM FOR EARTH
+@ Tetragrams
+1D306 TETRAGRAM FOR CENTRE
+1D307 TETRAGRAM FOR FULL CIRCLE
+1D308 TETRAGRAM FOR MIRED
+1D309 TETRAGRAM FOR BARRIER
+1D30A TETRAGRAM FOR KEEPING SMALL
+1D30B TETRAGRAM FOR CONTRARIETY
+1D30C TETRAGRAM FOR ASCENT
+1D30D TETRAGRAM FOR OPPOSITION
+1D30E TETRAGRAM FOR BRANCHING OUT
+1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION
+1D310 TETRAGRAM FOR DIVERGENCE
+1D311 TETRAGRAM FOR YOUTHFULNESS
+1D312 TETRAGRAM FOR INCREASE
+1D313 TETRAGRAM FOR PENETRATION
+1D314 TETRAGRAM FOR REACH
+1D315 TETRAGRAM FOR CONTACT
+1D316 TETRAGRAM FOR HOLDING BACK
+1D317 TETRAGRAM FOR WAITING
+1D318 TETRAGRAM FOR FOLLOWING
+1D319 TETRAGRAM FOR ADVANCE
+1D31A TETRAGRAM FOR RELEASE
+1D31B TETRAGRAM FOR RESISTANCE
+1D31C TETRAGRAM FOR EASE
+1D31D TETRAGRAM FOR JOY
+1D31E TETRAGRAM FOR CONTENTION
+1D31F TETRAGRAM FOR ENDEAVOUR
+1D320 TETRAGRAM FOR DUTIES
+1D321 TETRAGRAM FOR CHANGE
+1D322 TETRAGRAM FOR DECISIVENESS
+1D323 TETRAGRAM FOR BOLD RESOLUTION
+1D324 TETRAGRAM FOR PACKING
+1D325 TETRAGRAM FOR LEGION
+1D326 TETRAGRAM FOR CLOSENESS
+1D327 TETRAGRAM FOR KINSHIP
+1D328 TETRAGRAM FOR GATHERING
+1D329 TETRAGRAM FOR STRENGTH
+1D32A TETRAGRAM FOR PURITY
+1D32B TETRAGRAM FOR FULLNESS
+1D32C TETRAGRAM FOR RESIDENCE
+1D32D TETRAGRAM FOR LAW OR MODEL
+1D32E TETRAGRAM FOR RESPONSE
+1D32F TETRAGRAM FOR GOING TO MEET
+1D330 TETRAGRAM FOR ENCOUNTERS
+1D331 TETRAGRAM FOR STOVE
+1D332 TETRAGRAM FOR GREATNESS
+1D333 TETRAGRAM FOR ENLARGEMENT
+1D334 TETRAGRAM FOR PATTERN
+1D335 TETRAGRAM FOR RITUAL
+1D336 TETRAGRAM FOR FLIGHT
+1D337 TETRAGRAM FOR VASTNESS OR WASTING
+1D338 TETRAGRAM FOR CONSTANCY
+1D339 TETRAGRAM FOR MEASURE
+1D33A TETRAGRAM FOR ETERNITY
+1D33B TETRAGRAM FOR UNITY
+1D33C TETRAGRAM FOR DIMINISHMENT
+1D33D TETRAGRAM FOR CLOSED MOUTH
+1D33E TETRAGRAM FOR GUARDEDNESS
+1D33F TETRAGRAM FOR GATHERING IN
+1D340 TETRAGRAM FOR MASSING
+1D341 TETRAGRAM FOR ACCUMULATION
+1D342 TETRAGRAM FOR EMBELLISHMENT
+1D343 TETRAGRAM FOR DOUBT
+1D344 TETRAGRAM FOR WATCH
+1D345 TETRAGRAM FOR SINKING
+1D346 TETRAGRAM FOR INNER
+1D347 TETRAGRAM FOR DEPARTURE
+1D348 TETRAGRAM FOR DARKENING
+1D349 TETRAGRAM FOR DIMMING
+1D34A TETRAGRAM FOR EXHAUSTION
+1D34B TETRAGRAM FOR SEVERANCE
+1D34C TETRAGRAM FOR STOPPAGE
+1D34D TETRAGRAM FOR HARDNESS
+1D34E TETRAGRAM FOR COMPLETION
+1D34F TETRAGRAM FOR CLOSURE
+1D350 TETRAGRAM FOR FAILURE
+1D351 TETRAGRAM FOR AGGRAVATION
+1D352 TETRAGRAM FOR COMPLIANCE
+1D353 TETRAGRAM FOR ON THE VERGE
+1D354 TETRAGRAM FOR DIFFICULTIES
+1D355 TETRAGRAM FOR LABOURING
+1D356 TETRAGRAM FOR FOSTERING
@@ 1D400 Mathematical Alphanumeric Symbols 1D7FF
@+ To be used for mathematical variables where style variations are important semantically. For general text, use standard Latin and Greek letters with markup.
@ Bold symbols
@@ -19937,6 +21529,7 @@ FFFF <not a character>
1D433 MATHEMATICAL BOLD SMALL Z
# <font> 007A latin small letter z
@ Italic symbols
+@+ Several italic symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
1D434 MATHEMATICAL ITALIC CAPITAL A
# <font> 0041 latin capital letter a
1D435 MATHEMATICAL ITALIC CAPITAL B
@@ -20147,7 +21740,7 @@ FFFF <not a character>
1D49B MATHEMATICAL BOLD ITALIC SMALL Z
# <font> 007A latin small letter z
@ Script symbols
-@+ Several script symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation
+@+ Several script symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
1D49C MATHEMATICAL SCRIPT CAPITAL A
# <font> 0041 latin capital letter a
1D49D <reserved>
@@ -20222,8 +21815,9 @@ FFFF <not a character>
# <font> 006A latin small letter j
1D4C0 MATHEMATICAL SCRIPT SMALL K
# <font> 006B latin small letter k
-1D4C1 <reserved>
+1D4C1 MATHEMATICAL SCRIPT SMALL L
x (script small l - 2113)
+ # <font> 006C latin small letter l
1D4C2 MATHEMATICAL SCRIPT SMALL M
# <font> 006D latin small letter m
1D4C3 MATHEMATICAL SCRIPT SMALL N
@@ -20358,7 +21952,7 @@ FFFF <not a character>
1D503 MATHEMATICAL BOLD SCRIPT SMALL Z
# <font> 007A latin small letter z
@ Fraktur symbols
-@+ This style is sometimes known as black-letter. Several black-letter symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation
+@+ This style is sometimes known as black-letter. Several black-letter symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
1D504 MATHEMATICAL FRAKTUR CAPITAL A
# <font> 0041 latin capital letter a
1D505 MATHEMATICAL FRAKTUR CAPITAL B
@@ -20384,6 +21978,7 @@ FFFF <not a character>
1D50F MATHEMATICAL FRAKTUR CAPITAL L
# <font> 004C latin capital letter l
1D510 MATHEMATICAL FRAKTUR CAPITAL M
+ = New Testament majority text
# <font> 004D latin capital letter m
1D511 MATHEMATICAL FRAKTUR CAPITAL N
# <font> 004E latin capital letter n
@@ -20396,6 +21991,7 @@ FFFF <not a character>
1D515 <reserved>
x (black-letter capital r - 211C)
1D516 MATHEMATICAL FRAKTUR CAPITAL S
+ = Septuagint, Greek Old Testament
# <font> 0053 latin capital letter s
1D517 MATHEMATICAL FRAKTUR CAPITAL T
# <font> 0054 latin capital letter t
@@ -20464,7 +22060,7 @@ FFFF <not a character>
1D537 MATHEMATICAL FRAKTUR SMALL Z
# <font> 007A latin small letter z
@ Double-struck symbols
-@+ This style is sometimes known as open-face or blackboard-bold. Several double-struck symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation
+@+ This style is sometimes known as open-face or blackboard-bold. Several double-struck symbols have been previously coded in the Letterlike Symbols block and are retained there to ensure unambiguous representation.
1D538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A
# <font> 0041 latin capital letter a
1D539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B
@@ -21896,12 +23492,14 @@ FFFF <not a character>
# <font> 0039 digit nine
@@ 1FF80 Unassigned 1FFFF
@ Not character codes
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
1FFFE <not a character>
* the value 1FFFE is guaranteed not to be a Unicode character at all
1FFFF <not a character>
* the value 1FFFF is guaranteed not to be a Unicode character at all
@@ 20000 CJK Unified Ideographs Extension B 2A6D6
@@ 2F800 CJK Compatibility Ideographs Supplement 2FA1F
+@ Duplicate characters from CNS 11643-1992
2F800 CJK COMPATIBILITY IDEOGRAPH-2F800
: 4E3D
2F801 CJK COMPATIBILITY IDEOGRAPH-2F801
@@ -21929,6 +23527,7 @@ FFFF <not a character>
2F80C CJK COMPATIBILITY IDEOGRAPH-2F80C
: 349E
2F80D CJK COMPATIBILITY IDEOGRAPH-2F80D
+ x 5145
: 2063A
2F80E CJK COMPATIBILITY IDEOGRAPH-2F80E
: 514D
@@ -21943,6 +23542,7 @@ FFFF <not a character>
2F813 CJK COMPATIBILITY IDEOGRAPH-2F813
: 34B9
2F814 CJK COMPATIBILITY IDEOGRAPH-2F814
+ x 5185
: 5167
2F815 CJK COMPATIBILITY IDEOGRAPH-2F815
: 518D
@@ -22083,8 +23683,10 @@ FFFF <not a character>
2F859 CJK COMPATIBILITY IDEOGRAPH-2F859
: 214E4
2F85A CJK COMPATIBILITY IDEOGRAPH-2F85A
+ x 58F3
: 58F2
2F85B CJK COMPATIBILITY IDEOGRAPH-2F85B
+ x 21533
: 58F7
2F85C CJK COMPATIBILITY IDEOGRAPH-2F85C
: 5906
@@ -22111,7 +23713,7 @@ FFFF <not a character>
2F867 CJK COMPATIBILITY IDEOGRAPH-2F867
: 36EE
2F868 CJK COMPATIBILITY IDEOGRAPH-2F868
- : 2136A
+ : 36FC
2F869 CJK COMPATIBILITY IDEOGRAPH-2F869
: 5B08
2F86A CJK COMPATIBILITY IDEOGRAPH-2F86A
@@ -22135,7 +23737,7 @@ FFFF <not a character>
2F873 CJK COMPATIBILITY IDEOGRAPH-2F873
: 5C06
2F874 CJK COMPATIBILITY IDEOGRAPH-2F874
- : 5F33
+ : 5F53
2F875 CJK COMPATIBILITY IDEOGRAPH-2F875
: 5C22
2F876 CJK COMPATIBILITY IDEOGRAPH-2F876
@@ -22215,6 +23817,7 @@ FFFF <not a character>
2F89B CJK COMPATIBILITY IDEOGRAPH-2F89B
: 38E3
2F89C CJK COMPATIBILITY IDEOGRAPH-2F89C
+ x 22505
: 5F9A
2F89D CJK COMPATIBILITY IDEOGRAPH-2F89D
: 5FCD
@@ -22477,7 +24080,7 @@ FFFF <not a character>
2F91E CJK COMPATIBILITY IDEOGRAPH-2F91E
: 719C
2F91F CJK COMPATIBILITY IDEOGRAPH-2F91F
- : 43AB
+ : 243AB
2F920 CJK COMPATIBILITY IDEOGRAPH-2F920
: 7228
2F921 CJK COMPATIBILITY IDEOGRAPH-2F921
@@ -22605,7 +24208,7 @@ FFFF <not a character>
2F95E CJK COMPATIBILITY IDEOGRAPH-2F95E
: 25AA7
2F95F CJK COMPATIBILITY IDEOGRAPH-2F95F
- : 7AAE
+ : 7AEE
2F960 CJK COMPATIBILITY IDEOGRAPH-2F960
: 4202
2F961 CJK COMPATIBILITY IDEOGRAPH-2F961
@@ -22771,6 +24374,9 @@ FFFF <not a character>
2F9B1 CJK COMPATIBILITY IDEOGRAPH-2F9B1
: 270D2
2F9B2 CJK COMPATIBILITY IDEOGRAPH-2F9B2
+ x 5914
+ x 270CD
+ x 270F0
: 456B
2F9B3 CJK COMPATIBILITY IDEOGRAPH-2F9B3
: 8650
@@ -22779,6 +24385,7 @@ FFFF <not a character>
2F9B5 CJK COMPATIBILITY IDEOGRAPH-2F9B5
: 8667
2F9B6 CJK COMPATIBILITY IDEOGRAPH-2F9B6
+ x 27205
: 8669
2F9B7 CJK COMPATIBILITY IDEOGRAPH-2F9B7
: 86A9
@@ -22797,7 +24404,7 @@ FFFF <not a character>
2F9BE CJK COMPATIBILITY IDEOGRAPH-2F9BE
: 8786
2F9BF CJK COMPATIBILITY IDEOGRAPH-2F9BF
- : 4D57
+ : 45D7
2F9C0 CJK COMPATIBILITY IDEOGRAPH-2F9C0
: 87E1
2F9C1 CJK COMPATIBILITY IDEOGRAPH-2F9C1
@@ -22821,6 +24428,7 @@ FFFF <not a character>
2F9CA CJK COMPATIBILITY IDEOGRAPH-2F9CA
: 34BB
2F9CB CJK COMPATIBILITY IDEOGRAPH-2F9CB
+ x 4695
: 278AE
2F9CC CJK COMPATIBILITY IDEOGRAPH-2F9CC
: 27966
@@ -22843,6 +24451,7 @@ FFFF <not a character>
2F9D5 CJK COMPATIBILITY IDEOGRAPH-2F9D5
: 8CC1
2F9D6 CJK COMPATIBILITY IDEOGRAPH-2F9D6
+ x 25AD4
: 8D1B
2F9D7 CJK COMPATIBILITY IDEOGRAPH-2F9D7
: 8D77
@@ -22987,73 +24596,85 @@ FFFF <not a character>
2FA1D CJK COMPATIBILITY IDEOGRAPH-2FA1D
: 2A600
@@ 2FF80 Unassigned 2FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
2FFFE <not a character>
* the value 2FFFE is guaranteed not to be a Unicode character at all
2FFFF <not a character>
* the value 2FFFF is guaranteed not to be a Unicode character at all
@@ 3FF80 Unassigned 3FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
3FFFE <not a character>
* the value 3FFFE is guaranteed not to be a Unicode character at all
3FFFF <not a character>
* the value 3FFFF is guaranteed not to be a Unicode character at all
@@ 4FF80 Unassigned 4FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
4FFFE <not a character>
* the value 4FFFE is guaranteed not to be a Unicode character at all
4FFFF <not a character>
* the value 4FFFF is guaranteed not to be a Unicode character at all
@@ 5FF80 Unassigned 5FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
5FFFE <not a character>
* the value 5FFFE is guaranteed not to be a Unicode character at all
5FFFF <not a character>
* the value 5FFFF is guaranteed not to be a Unicode character at all
@@ 6FF80 Unassigned 6FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
6FFFE <not a character>
* the value 6FFFE is guaranteed not to be a Unicode character at all
6FFFF <not a character>
* the value 6FFFF is guaranteed not to be a Unicode character at all
@@ 7FF80 Unassigned 7FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
7FFFE <not a character>
* the value 7FFFE is guaranteed not to be a Unicode character at all
7FFFF <not a character>
* the value 7FFFF is guaranteed not to be a Unicode character at all
@@ 8FF80 Unassigned 8FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
8FFFE <not a character>
* the value 8FFFE is guaranteed not to be a Unicode character at all
8FFFF <not a character>
* the value 8FFFF is guaranteed not to be a Unicode character at all
@@ 9FF80 Unassigned 9FFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
9FFFE <not a character>
* the value 9FFFE is guaranteed not to be a Unicode character at all
9FFFF <not a character>
* the value 9FFFF is guaranteed not to be a Unicode character at all
@@ AFF80 Unassigned AFFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
AFFFE <not a character>
* the value AFFFE is guaranteed not to be a Unicode character at all
AFFFF <not a character>
* the value AFFFF is guaranteed not to be a Unicode character at all
@@ BFF80 Unassigned BFFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
BFFFE <not a character>
* the value BFFFE is guaranteed not to be a Unicode character at all
BFFFF <not a character>
* the value BFFFF is guaranteed not to be a Unicode character at all
@@ CFF80 Unassigned CFFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
CFFFE <not a character>
* the value CFFFE is guaranteed not to be a Unicode character at all
CFFFF <not a character>
* the value CFFFF is guaranteed not to be a Unicode character at all
@@ DFF80 Unassigned DFFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
DFFFE <not a character>
* the value DFFFE is guaranteed not to be a Unicode character at all
DFFFF <not a character>
@@ -23158,20 +24779,267 @@ E007C TAG VERTICAL LINE
E007D TAG RIGHT CURLY BRACKET
E007E TAG TILDE
E007F CANCEL TAG
+@@ E0100 Variation Selectors Supplement E01EF
+@+ These complete the set started at FE01 to FE0F
+@ Variation selectors
+E0100 VARIATION SELECTOR-17
+ * these are abbreviated VS17, and so on
+E0101 VARIATION SELECTOR-18
+E0102 VARIATION SELECTOR-19
+E0103 VARIATION SELECTOR-20
+E0104 VARIATION SELECTOR-21
+E0105 VARIATION SELECTOR-22
+E0106 VARIATION SELECTOR-23
+E0107 VARIATION SELECTOR-24
+E0108 VARIATION SELECTOR-25
+E0109 VARIATION SELECTOR-26
+E010A VARIATION SELECTOR-27
+E010B VARIATION SELECTOR-28
+E010C VARIATION SELECTOR-29
+E010D VARIATION SELECTOR-30
+E010E VARIATION SELECTOR-31
+E010F VARIATION SELECTOR-32
+E0110 VARIATION SELECTOR-33
+E0111 VARIATION SELECTOR-34
+E0112 VARIATION SELECTOR-35
+E0113 VARIATION SELECTOR-36
+E0114 VARIATION SELECTOR-37
+E0115 VARIATION SELECTOR-38
+E0116 VARIATION SELECTOR-39
+E0117 VARIATION SELECTOR-40
+E0118 VARIATION SELECTOR-41
+E0119 VARIATION SELECTOR-42
+E011A VARIATION SELECTOR-43
+E011B VARIATION SELECTOR-44
+E011C VARIATION SELECTOR-45
+E011D VARIATION SELECTOR-46
+E011E VARIATION SELECTOR-47
+E011F VARIATION SELECTOR-48
+E0120 VARIATION SELECTOR-49
+E0121 VARIATION SELECTOR-50
+E0122 VARIATION SELECTOR-51
+E0123 VARIATION SELECTOR-52
+E0124 VARIATION SELECTOR-53
+E0125 VARIATION SELECTOR-54
+E0126 VARIATION SELECTOR-55
+E0127 VARIATION SELECTOR-56
+E0128 VARIATION SELECTOR-57
+E0129 VARIATION SELECTOR-58
+E012A VARIATION SELECTOR-59
+E012B VARIATION SELECTOR-60
+E012C VARIATION SELECTOR-61
+E012D VARIATION SELECTOR-62
+E012E VARIATION SELECTOR-63
+E012F VARIATION SELECTOR-64
+E0130 VARIATION SELECTOR-65
+E0131 VARIATION SELECTOR-66
+E0132 VARIATION SELECTOR-67
+E0133 VARIATION SELECTOR-68
+E0134 VARIATION SELECTOR-69
+E0135 VARIATION SELECTOR-70
+E0136 VARIATION SELECTOR-71
+E0137 VARIATION SELECTOR-72
+E0138 VARIATION SELECTOR-73
+E0139 VARIATION SELECTOR-74
+E013A VARIATION SELECTOR-75
+E013B VARIATION SELECTOR-76
+E013C VARIATION SELECTOR-77
+E013D VARIATION SELECTOR-78
+E013E VARIATION SELECTOR-79
+E013F VARIATION SELECTOR-80
+E0140 VARIATION SELECTOR-81
+E0141 VARIATION SELECTOR-82
+E0142 VARIATION SELECTOR-83
+E0143 VARIATION SELECTOR-84
+E0144 VARIATION SELECTOR-85
+E0145 VARIATION SELECTOR-86
+E0146 VARIATION SELECTOR-87
+E0147 VARIATION SELECTOR-88
+E0148 VARIATION SELECTOR-89
+E0149 VARIATION SELECTOR-90
+E014A VARIATION SELECTOR-91
+E014B VARIATION SELECTOR-92
+E014C VARIATION SELECTOR-93
+E014D VARIATION SELECTOR-94
+E014E VARIATION SELECTOR-95
+E014F VARIATION SELECTOR-96
+E0150 VARIATION SELECTOR-97
+E0151 VARIATION SELECTOR-98
+E0152 VARIATION SELECTOR-99
+E0153 VARIATION SELECTOR-100
+E0154 VARIATION SELECTOR-101
+E0155 VARIATION SELECTOR-102
+E0156 VARIATION SELECTOR-103
+E0157 VARIATION SELECTOR-104
+E0158 VARIATION SELECTOR-105
+E0159 VARIATION SELECTOR-106
+E015A VARIATION SELECTOR-107
+E015B VARIATION SELECTOR-108
+E015C VARIATION SELECTOR-109
+E015D VARIATION SELECTOR-110
+E015E VARIATION SELECTOR-111
+E015F VARIATION SELECTOR-112
+E0160 VARIATION SELECTOR-113
+E0161 VARIATION SELECTOR-114
+E0162 VARIATION SELECTOR-115
+E0163 VARIATION SELECTOR-116
+E0164 VARIATION SELECTOR-117
+E0165 VARIATION SELECTOR-118
+E0166 VARIATION SELECTOR-119
+E0167 VARIATION SELECTOR-120
+E0168 VARIATION SELECTOR-121
+E0169 VARIATION SELECTOR-122
+E016A VARIATION SELECTOR-123
+E016B VARIATION SELECTOR-124
+E016C VARIATION SELECTOR-125
+E016D VARIATION SELECTOR-126
+E016E VARIATION SELECTOR-127
+E016F VARIATION SELECTOR-128
+E0170 VARIATION SELECTOR-129
+E0171 VARIATION SELECTOR-130
+E0172 VARIATION SELECTOR-131
+E0173 VARIATION SELECTOR-132
+E0174 VARIATION SELECTOR-133
+E0175 VARIATION SELECTOR-134
+E0176 VARIATION SELECTOR-135
+E0177 VARIATION SELECTOR-136
+E0178 VARIATION SELECTOR-137
+E0179 VARIATION SELECTOR-138
+E017A VARIATION SELECTOR-139
+E017B VARIATION SELECTOR-140
+E017C VARIATION SELECTOR-141
+E017D VARIATION SELECTOR-142
+E017E VARIATION SELECTOR-143
+E017F VARIATION SELECTOR-144
+E0180 VARIATION SELECTOR-145
+E0181 VARIATION SELECTOR-146
+E0182 VARIATION SELECTOR-147
+E0183 VARIATION SELECTOR-148
+E0184 VARIATION SELECTOR-149
+E0185 VARIATION SELECTOR-150
+E0186 VARIATION SELECTOR-151
+E0187 VARIATION SELECTOR-152
+E0188 VARIATION SELECTOR-153
+E0189 VARIATION SELECTOR-154
+E018A VARIATION SELECTOR-155
+E018B VARIATION SELECTOR-156
+E018C VARIATION SELECTOR-157
+E018D VARIATION SELECTOR-158
+E018E VARIATION SELECTOR-159
+E018F VARIATION SELECTOR-160
+E0190 VARIATION SELECTOR-161
+E0191 VARIATION SELECTOR-162
+E0192 VARIATION SELECTOR-163
+E0193 VARIATION SELECTOR-164
+E0194 VARIATION SELECTOR-165
+E0195 VARIATION SELECTOR-166
+E0196 VARIATION SELECTOR-167
+E0197 VARIATION SELECTOR-168
+E0198 VARIATION SELECTOR-169
+E0199 VARIATION SELECTOR-170
+E019A VARIATION SELECTOR-171
+E019B VARIATION SELECTOR-172
+E019C VARIATION SELECTOR-173
+E019D VARIATION SELECTOR-174
+E019E VARIATION SELECTOR-175
+E019F VARIATION SELECTOR-176
+E01A0 VARIATION SELECTOR-177
+E01A1 VARIATION SELECTOR-178
+E01A2 VARIATION SELECTOR-179
+E01A3 VARIATION SELECTOR-180
+E01A4 VARIATION SELECTOR-181
+E01A5 VARIATION SELECTOR-182
+E01A6 VARIATION SELECTOR-183
+E01A7 VARIATION SELECTOR-184
+E01A8 VARIATION SELECTOR-185
+E01A9 VARIATION SELECTOR-186
+E01AA VARIATION SELECTOR-187
+E01AB VARIATION SELECTOR-188
+E01AC VARIATION SELECTOR-189
+E01AD VARIATION SELECTOR-190
+E01AE VARIATION SELECTOR-191
+E01AF VARIATION SELECTOR-192
+E01B0 VARIATION SELECTOR-193
+E01B1 VARIATION SELECTOR-194
+E01B2 VARIATION SELECTOR-195
+E01B3 VARIATION SELECTOR-196
+E01B4 VARIATION SELECTOR-197
+E01B5 VARIATION SELECTOR-198
+E01B6 VARIATION SELECTOR-199
+E01B7 VARIATION SELECTOR-200
+E01B8 VARIATION SELECTOR-201
+E01B9 VARIATION SELECTOR-202
+E01BA VARIATION SELECTOR-203
+E01BB VARIATION SELECTOR-204
+E01BC VARIATION SELECTOR-205
+E01BD VARIATION SELECTOR-206
+E01BE VARIATION SELECTOR-207
+E01BF VARIATION SELECTOR-208
+E01C0 VARIATION SELECTOR-209
+E01C1 VARIATION SELECTOR-210
+E01C2 VARIATION SELECTOR-211
+E01C3 VARIATION SELECTOR-212
+E01C4 VARIATION SELECTOR-213
+E01C5 VARIATION SELECTOR-214
+E01C6 VARIATION SELECTOR-215
+E01C7 VARIATION SELECTOR-216
+E01C8 VARIATION SELECTOR-217
+E01C9 VARIATION SELECTOR-218
+E01CA VARIATION SELECTOR-219
+E01CB VARIATION SELECTOR-220
+E01CC VARIATION SELECTOR-221
+E01CD VARIATION SELECTOR-222
+E01CE VARIATION SELECTOR-223
+E01CF VARIATION SELECTOR-224
+E01D0 VARIATION SELECTOR-225
+E01D1 VARIATION SELECTOR-226
+E01D2 VARIATION SELECTOR-227
+E01D3 VARIATION SELECTOR-228
+E01D4 VARIATION SELECTOR-229
+E01D5 VARIATION SELECTOR-230
+E01D6 VARIATION SELECTOR-231
+E01D7 VARIATION SELECTOR-232
+E01D8 VARIATION SELECTOR-233
+E01D9 VARIATION SELECTOR-234
+E01DA VARIATION SELECTOR-235
+E01DB VARIATION SELECTOR-236
+E01DC VARIATION SELECTOR-237
+E01DD VARIATION SELECTOR-238
+E01DE VARIATION SELECTOR-239
+E01DF VARIATION SELECTOR-240
+E01E0 VARIATION SELECTOR-241
+E01E1 VARIATION SELECTOR-242
+E01E2 VARIATION SELECTOR-243
+E01E3 VARIATION SELECTOR-244
+E01E4 VARIATION SELECTOR-245
+E01E5 VARIATION SELECTOR-246
+E01E6 VARIATION SELECTOR-247
+E01E7 VARIATION SELECTOR-248
+E01E8 VARIATION SELECTOR-249
+E01E9 VARIATION SELECTOR-250
+E01EA VARIATION SELECTOR-251
+E01EB VARIATION SELECTOR-252
+E01EC VARIATION SELECTOR-253
+E01ED VARIATION SELECTOR-254
+E01EE VARIATION SELECTOR-255
+E01EF VARIATION SELECTOR-256
@@ EFF80 Unassigned EFFFF
-@ Not character codes
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
EFFFE <not a character>
* the value EFFFE is guaranteed not to be a Unicode character at all
EFFFF <not a character>
* the value EFFFF is guaranteed not to be a Unicode character at all
-@@ FFF80 Private Use FFFFF
-@ Not character codes
+@@ FFF80 Supplementary Private Use Area-A FFFFF
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
FFFFE <not a character>
* the value FFFFE is guaranteed not to be a Unicode character at all
FFFFF <not a character>
* the value FFFFF is guaranteed not to be a Unicode character at all
-@@ 10FF80 Private Use 10FFFF
-@ Not character codes
+@@ 10FF80 Supplementary Private Use Area-B 10FFFF
+@ Noncharacters
+@+ These codes are intended for process internal uses, but are not permitted for interchange.
10FFFE <not a character>
* the value 10FFFE is guaranteed not to be a Unicode character at all
10FFFF <not a character>
diff --git a/gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt b/gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt
new file mode 100644
index 00000000000..d76c150d2e2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt
@@ -0,0 +1,43 @@
+# NormalizationCorrections-4.0.0.txt
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# The normalization stabilization policy of the Unicode
+# Consortium ordinarily precludes any change to the decomposition
+# for any character, once established in a relevant version
+# of the UnicodeData.txt data file. However, under certain
+# exceptional (and rare) conditions, an error in a decomposition
+# mapping may be discovered that is truly just an unintended
+# typo in the data, and not a matter of dubious interpretation.
+#
+# Whenever such an error may be found, and if it meets the
+# requirements for possible exceptions to normalization
+# stability, the correction is entered in this data file,
+# so that any implementation depending on absolute stability
+# of normalization, *including* any errors in the data, can
+# safely reconstruct the exact state of the data tables at
+# any given version of Unicode.
+#
+# Currently this list has exactly six entries in it, one for the
+# typo found and corrected in Corrigendum #3, and five for
+# the typos and misidentifications found and corrected in
+# Corrigendum #4. All efforts
+# will be made to keep the entries limited to just those fixes.
+#
+# Interpretation of the fields:
+# Field 1: Unicode code point
+# Field 2: Original (erroneous) decomposition
+# Field 3: Corrected decomposition
+# Field 4: Version of Unicode for which the correction was
+# entered into UnicodeData.txt, in n.n.n format.
+# Comment: Indicates the Unicode Corrigendum which documents
+# the correction
+#
+#
+F951;96FB;964B;3.2.0 # Corrigendum 3
+2F868;2136A;36FC;4.0.0 # Corrigendum 4
+2F874;5F33;5F53;4.0.0 # Corrigendum 4
+2F91F;43AB;243AB;4.0.0 # Corrigendum 4
+2F95F;7AAE;7AEE;4.0.0 # Corrigendum 4
+2F9BF;4D57;45D7;4.0.0 # Corrigendum 4
diff --git a/gnu/usr.bin/perl/lib/unicore/Number.pl b/gnu/usr.bin/perl/lib/unicore/Number.pl
index 9bc4fd4663d..f2a7e92db25 100644
--- a/gnu/usr.bin/perl/lib/unicore/Number.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Number.pl
@@ -219,6 +219,16 @@ return <<'END';
17E7 7
17E8 8
17E9 9
+17F0 0
+17F1 1
+17F2 2
+17F3 3
+17F4 4
+17F5 5
+17F6 6
+17F7 7
+17F8 8
+17F9 9
1810 0
1811 1
1812 2
@@ -229,6 +239,16 @@ return <<'END';
1817 7
1818 8
1819 9
+1946 0
+1947 1
+1948 2
+1949 3
+194A 4
+194B 5
+194C 6
+194D 7
+194E 8
+194F 9
2070 0
2074 4
2075 5
@@ -373,6 +393,7 @@ return <<'END';
24FC 8
24FD 9
24FE 10
+24FF 0
2776 1
2777 2
2778 3
@@ -480,10 +501,65 @@ FF16 6
FF17 7
FF18 8
FF19 9
+10107 1
+10108 2
+10109 3
+1010A 4
+1010B 5
+1010C 6
+1010D 7
+1010E 8
+1010F 9
+10110 10
+10111 20
+10112 30
+10113 40
+10114 50
+10115 60
+10116 70
+10117 80
+10118 90
+10119 100
+1011A 200
+1011B 300
+1011C 400
+1011D 500
+1011E 600
+1011F 700
+10120 800
+10121 900
+10122 1000
+10123 2000
+10124 3000
+10125 4000
+10126 5000
+10127 6000
+10128 7000
+10129 8000
+1012A 9000
+1012B 10000
+1012C 20000
+1012D 30000
+1012E 40000
+1012F 50000
+10130 60000
+10131 70000
+10132 80000
+10133 90000
10320 1
10321 5
10322 10
10323 50
+104A0 0
+104A1 1
+104A2 2
+104A3 3
+104A4 4
+104A5 5
+104A6 6
+104A7 7
+104A8 8
+104A9 9
1D7CE 0
1D7CF 1
1D7D0 2
diff --git a/gnu/usr.bin/perl/lib/unicore/PropList.txt b/gnu/usr.bin/perl/lib/unicore/PropList.txt
index 17f03ccf6b1..90176ad019b 100644
--- a/gnu/usr.bin/perl/lib/unicore/PropList.txt
+++ b/gnu/usr.bin/perl/lib/unicore/PropList.txt
@@ -1,10 +1,10 @@
-# PropList-3.2.0.txt
-# Date: 2002-03-19,23:31:21 GMT [MD]
+# PropList-4.0.0.txt
+# Date: 2003-03-20, 20:07:40 GMT [MD]
#
# Unicode Character Database: Extended Properties
-# For documentation, see PropList.html
-# Note: Unassigned and Noncharacter codepoints are omitted,
-# except when listing Noncharacter or Cn.
+# For documentation, see UCD.html
+# Note: Unassigned and Noncharacter codepoints may be omitted
+# if they have default property values.
# ================================================
# ================================================
@@ -14,13 +14,15 @@
0085 ; White_Space # Cc <control>
00A0 ; White_Space # Zs NO-BREAK SPACE
1680 ; White_Space # Zs OGHAM SPACE MARK
+180E ; White_Space # Zs MONGOLIAN VOWEL SEPARATOR
2000..200A ; White_Space # Zs [11] EN QUAD..HAIR SPACE
2028 ; White_Space # Zl LINE SEPARATOR
2029 ; White_Space # Zp PARAGRAPH SEPARATOR
202F ; White_Space # Zs NARROW NO-BREAK SPACE
+205F ; White_Space # Zs MEDIUM MATHEMATICAL SPACE
3000 ; White_Space # Zs IDEOGRAPHIC SPACE
-# Total code points: 24
+# Total code points: 26
# ================================================
@@ -38,10 +40,10 @@
# ================================================
002D ; Dash # Pd HYPHEN-MINUS
-00AD ; Dash # Pd SOFT HYPHEN
058A ; Dash # Pd ARMENIAN HYPHEN
1806 ; Dash # Pd MONGOLIAN TODO SOFT HYPHEN
2010..2015 ; Dash # Pd [6] HYPHEN..HORIZONTAL BAR
+2053 ; Dash # Po SWUNG DASH
207B ; Dash # Sm SUPERSCRIPT MINUS
208B ; Dash # Sm SUBSCRIPT MINUS
2212 ; Dash # Sm MINUS SIGN
@@ -57,7 +59,7 @@ FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS
# ================================================
002D ; Hyphen # Pd HYPHEN-MINUS
-00AD ; Hyphen # Pd SOFT HYPHEN
+00AD ; Hyphen # Cf SOFT HYPHEN
058A ; Hyphen # Pd ARMENIAN HYPHEN
1806 ; Hyphen # Pd MONGOLIAN TODO SOFT HYPHEN
2010..2011 ; Hyphen # Pd [2] HYPHEN..NON-BREAKING HYPHEN
@@ -126,8 +128,9 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
17DA ; Terminal_Punctuation # Po KHMER SIGN KOOMUUT
1802..1805 ; Terminal_Punctuation # Po [4] MONGOLIAN COMMA..MONGOLIAN FOUR DOTS
1808..1809 ; Terminal_Punctuation # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP
+1944..1945 ; Terminal_Punctuation # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
-2048..2049 ; Terminal_Punctuation # Po [2] QUESTION EXCLAMATION MARK..EXCLAMATION QUESTION MARK
+2047..2049 ; Terminal_Punctuation # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
FE50..FE52 ; Terminal_Punctuation # Po [3] SMALL COMMA..SMALL FULL STOP
FE54..FE57 ; Terminal_Punctuation # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
@@ -139,7 +142,7 @@ FF1F ; Terminal_Punctuation # Po FULLWIDTH QUESTION MARK
FF61 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC FULL STOP
FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
-# Total code points: 75
+# Total code points: 78
# ================================================
@@ -176,6 +179,8 @@ FE35 ; Other_Math # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENT
FE36 ; Other_Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
FE37 ; Other_Math # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
FE38 ; Other_Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE47 ; Other_Math # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48 ; Other_Math # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
FE59 ; Other_Math # Ps SMALL LEFT PARENTHESIS
FE5A ; Other_Math # Pe SMALL RIGHT PARENTHESIS
FE5B ; Other_Math # Ps SMALL LEFT CURLY BRACKET
@@ -202,8 +207,7 @@ FF5D ; Other_Math # Pe FULLWIDTH RIGHT CURLY BRACKET
1D4A9..1D4AC ; Other_Math # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
1D4AE..1D4B9 ; Other_Math # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
1D4BB ; Other_Math # L& MATHEMATICAL SCRIPT SMALL F
-1D4BD..1D4C0 ; Other_Math # L& [4] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL K
-1D4C2..1D4C3 ; Other_Math # L& [2] MATHEMATICAL SCRIPT SMALL M..MATHEMATICAL SCRIPT SMALL N
+1D4BD..1D4C3 ; Other_Math # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
1D4C5..1D505 ; Other_Math # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
1D507..1D50A ; Other_Math # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
1D50D..1D514 ; Other_Math # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
@@ -227,7 +231,7 @@ FF5D ; Other_Math # Pe FULLWIDTH RIGHT CURLY BRACKET
1D7C4..1D7C9 ; Other_Math # L& [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
1D7CE..1D7FF ; Other_Math # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
-# Total code points: 1066
+# Total code points: 1069
# ================================================
@@ -256,7 +260,8 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
05BF ; Other_Alphabetic # Mn HEBREW POINT RAFE
05C1..05C2 ; Other_Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
05C4 ; Other_Alphabetic # Mn HEBREW MARK UPPER DOT
-064B..0655 ; Other_Alphabetic # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW
+0610..0615 ; Other_Alphabetic # Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
+064B..0657 ; Other_Alphabetic # Mn [13] ARABIC FATHATAN..ARABIC INVERTED DAMMA
0670 ; Other_Alphabetic # Mn ARABIC LETTER SUPERSCRIPT ALEF
06D6..06DC ; Other_Alphabetic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
06E1..06E4 ; Other_Alphabetic # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA
@@ -279,7 +284,8 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
09CB..09CC ; Other_Alphabetic # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
09D7 ; Other_Alphabetic # Mc BENGALI AU LENGTH MARK
09E2..09E3 ; Other_Alphabetic # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
-0A02 ; Other_Alphabetic # Mn GURMUKHI SIGN BINDI
+0A01..0A02 ; Other_Alphabetic # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03 ; Other_Alphabetic # Mc GURMUKHI SIGN VISARGA
0A3E..0A40 ; Other_Alphabetic # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
0A41..0A42 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
0A47..0A48 ; Other_Alphabetic # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
@@ -292,6 +298,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
0AC7..0AC8 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
0AC9 ; Other_Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O
0ACB..0ACC ; Other_Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AE2..0AE3 ; Other_Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
0B01 ; Other_Alphabetic # Mn ORIYA SIGN CANDRABINDU
0B02..0B03 ; Other_Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
0B3E ; Other_Alphabetic # Mc ORIYA VOWEL SIGN AA
@@ -361,17 +368,24 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
1732..1733 ; Other_Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
1752..1753 ; Other_Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
1772..1773 ; Other_Alphabetic # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
-17B4..17B6 ; Other_Alphabetic # Mc [3] KHMER VOWEL INHERENT AQ..KHMER VOWEL SIGN AA
+17B6 ; Other_Alphabetic # Mc KHMER VOWEL SIGN AA
17B7..17BD ; Other_Alphabetic # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
17BE..17C5 ; Other_Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
17C6 ; Other_Alphabetic # Mn KHMER SIGN NIKAHIT
17C7..17C8 ; Other_Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
18A9 ; Other_Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922 ; Other_Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; Other_Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; Other_Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; Other_Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; Other_Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; Other_Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; Other_Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
2160..2183 ; Other_Alphabetic # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED
FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
1034A ; Other_Alphabetic # Nl GOTHIC LETTER NINE HUNDRED
-# Total code points: 398
+# Total code points: 429
# ================================================
@@ -396,17 +410,17 @@ F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COM
00B4 ; Diacritic # Sk ACUTE ACCENT
00B7 ; Diacritic # Po MIDDLE DOT
00B8 ; Diacritic # Sk CEDILLA
-02B0..02B8 ; Diacritic # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
-02B9..02BA ; Diacritic # Sk [2] MODIFIER LETTER PRIME..MODIFIER LETTER DOUBLE PRIME
-02BB..02C1 ; Diacritic # Lm [7] MODIFIER LETTER TURNED COMMA..MODIFIER LETTER REVERSED GLOTTAL STOP
-02C2..02CF ; Diacritic # Sk [14] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER LOW ACUTE ACCENT
-02D0..02D1 ; Diacritic # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
+02B0..02C1 ; Diacritic # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5 ; Diacritic # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1 ; Diacritic # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
02D2..02DF ; Diacritic # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
02E0..02E4 ; Diacritic # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
02E5..02ED ; Diacritic # Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED
02EE ; Diacritic # Lm MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF ; Diacritic # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
0300..034E ; Diacritic # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW
-0360..0362 ; Diacritic # Mn [3] COMBINING DOUBLE TILDE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW
+0350..0357 ; Diacritic # Mn [8] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING RIGHT HALF RING ABOVE
+035D..0362 ; Diacritic # Mn [6] COMBINING DOUBLE BREVE..COMBINING DOUBLE RIGHTWARDS ARROW BELOW
0374..0375 ; Diacritic # Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN
037A ; Diacritic # Lm GREEK YPOGEGRAMMENI
0384..0385 ; Diacritic # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS
@@ -419,6 +433,7 @@ F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COM
05C1..05C2 ; Diacritic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
05C4 ; Diacritic # Mn HEBREW MARK UPPER DOT
064B..0652 ; Diacritic # Mn [8] ARABIC FATHATAN..ARABIC SUKUN
+0657..0658 ; Diacritic # Mn [2] ARABIC INVERTED DAMMA..ARABIC MARK NOON GHUNNA
06DF..06E0 ; Diacritic # Mn [2] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO
06E5..06E6 ; Diacritic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
06EA..06EC ; Diacritic # Mn [3] ARABIC EMPTY CENTRE LOW STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE
@@ -437,6 +452,7 @@ F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COM
0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA
0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA
0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA
+0CBC ; Diacritic # Mn KANNADA SIGN NUKTA
0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA
0D4D ; Diacritic # Mn MALAYALAM SIGN VIRAMA
0DCA ; Diacritic # Mn SINHALA SIGN AL-LAKUNA
@@ -454,6 +470,10 @@ F900..FA2D ; Ideographic # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COM
1037 ; Diacritic # Mn MYANMAR SIGN DOT BELOW
1039 ; Diacritic # Mn MYANMAR SIGN VIRAMA
17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD ; Diacritic # Mn KHMER SIGN ATTHACAN
+1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1D2C..1D61 ; Diacritic # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D6A ; Diacritic # L& [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI
1FBD ; Diacritic # Sk GREEK KORONIS
1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
@@ -477,7 +497,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
-# Total code points: 384
+# Total code points: 482
# ================================================
@@ -502,10 +522,11 @@ FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND
02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI
037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI
+1D2C..1D61 ; Other_Lowercase # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
2170..217F ; Other_Lowercase # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
24D0..24E9 ; Other_Lowercase # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
-# Total code points: 60
+# Total code points: 114
# ================================================
@@ -539,12 +560,26 @@ FFFFE..FFFFF ; Noncharacter_Code_Point # Cn [2]
# ================================================
-FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
-
-# Total code points: 2
+09BE ; Other_Grapheme_Extend # Mc BENGALI VOWEL SIGN AA
+09D7 ; Other_Grapheme_Extend # Mc BENGALI AU LENGTH MARK
+0B3E ; Other_Grapheme_Extend # Mc ORIYA VOWEL SIGN AA
+0B57 ; Other_Grapheme_Extend # Mc ORIYA AU LENGTH MARK
+0BBE ; Other_Grapheme_Extend # Mc TAMIL VOWEL SIGN AA
+0BD7 ; Other_Grapheme_Extend # Mc TAMIL AU LENGTH MARK
+0CC2 ; Other_Grapheme_Extend # Mc KANNADA VOWEL SIGN UU
+0CD5..0CD6 ; Other_Grapheme_Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0D3E ; Other_Grapheme_Extend # Mc MALAYALAM VOWEL SIGN AA
+0D57 ; Other_Grapheme_Extend # Mc MALAYALAM AU LENGTH MARK
+0DCF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN AELA-PILLA
+0DDF ; Other_Grapheme_Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA
+1D165 ; Other_Grapheme_Extend # Mc MUSICAL SYMBOL COMBINING STEM
+1D16E..1D16F ; Other_Grapheme_Extend # Mc [2] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-2
+
+# Total code points: 16
# ================================================
+034F ; Grapheme_Link # Mn COMBINING GRAPHEME JOINER
094D ; Grapheme_Link # Mn DEVANAGARI SIGN VIRAMA
09CD ; Grapheme_Link # Mn BENGALI SIGN VIRAMA
0A4D ; Grapheme_Link # Mn GURMUKHI SIGN VIRAMA
@@ -559,7 +594,7 @@ FF9E..FF9F ; Other_Grapheme_Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND
1039 ; Grapheme_Link # Mn MYANMAR SIGN VIRAMA
17D2 ; Grapheme_Link # Mn KHMER SIGN COENG
-# Total code points: 13
+# Total code points: 14
# ================================================
@@ -599,27 +634,31 @@ FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..C
# ================================================
+034F ; Other_Default_Ignorable_Code_Point # Mn COMBINING GRAPHEME JOINER
+115F..1160 ; Other_Default_Ignorable_Code_Point # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
180B..180D ; Other_Default_Ignorable_Code_Point # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
-2060..2063 ; Other_Default_Ignorable_Code_Point # Cf [4] WORD JOINER..INVISIBLE SEPARATOR
+200B ; Other_Default_Ignorable_Code_Point # Zs ZERO WIDTH SPACE
2064..2069 ; Other_Default_Ignorable_Code_Point # Cn [6]
-206A..206F ; Other_Default_Ignorable_Code_Point # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+3164 ; Other_Default_Ignorable_Code_Point # Lo HANGUL FILLER
FE00..FE0F ; Other_Default_Ignorable_Code_Point # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FFA0 ; Other_Default_Ignorable_Code_Point # Lo HALFWIDTH HANGUL FILLER
FFF0..FFF8 ; Other_Default_Ignorable_Code_Point # Cn [9]
-FFF9..FFFB ; Other_Default_Ignorable_Code_Point # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
E0000 ; Other_Default_Ignorable_Code_Point # Cn
-E0001 ; Other_Default_Ignorable_Code_Point # Cf LANGUAGE TAG
E0002..E001F ; Other_Default_Ignorable_Code_Point # Cn [30]
-E0020..E007F ; Other_Default_Ignorable_Code_Point # Cf [96] TAG SPACE..CANCEL TAG
-E0080..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3968]
+E0080..E00FF ; Other_Default_Ignorable_Code_Point # Cn [128]
+E0100..E01EF ; Other_Default_Ignorable_Code_Point # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+E01F0..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3600]
-# Total code points: 4143
+# Total code points: 4039
# ================================================
0340..0341 ; Deprecated # Mn [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+17A3 ; Deprecated # Lo KHMER INDEPENDENT VOWEL QAQ
+17D3 ; Deprecated # Mn KHMER SIGN BATHAMASAT
206A..206F ; Deprecated # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
-# Total code points: 8
+# Total code points: 10
# ================================================
@@ -628,10 +667,12 @@ E0080..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3968]
0268 ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE
0456 ; Soft_Dotted # L& CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0458 ; Soft_Dotted # L& CYRILLIC SMALL LETTER JE
+1D62 ; Soft_Dotted # L& LATIN SUBSCRIPT SMALL LETTER I
1E2D ; Soft_Dotted # L& LATIN SMALL LETTER I WITH TILDE BELOW
1ECB ; Soft_Dotted # L& LATIN SMALL LETTER I WITH DOT BELOW
+2071 ; Soft_Dotted # L& SUPERSCRIPT LATIN SMALL LETTER I
-# Total code points: 8
+# Total code points: 10
# ================================================
@@ -640,3 +681,11 @@ E0080..E0FFF ; Other_Default_Ignorable_Code_Point # Cn [3968]
# Total code points: 10
+# ================================================
+
+2118 ; Other_ID_Start # So SCRIPT CAPITAL P
+212E ; Other_ID_Start # So ESTIMATED SYMBOL
+309B..309C ; Other_ID_Start # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+
+# Total code points: 4
+
diff --git a/gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt b/gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt
index eeb35831880..fe82f236177 100644
--- a/gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt
+++ b/gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt
@@ -1,12 +1,10 @@
-# PropertyValueAliases-3.2.0.txt
-# Date: 2002-03-19,23:31:21 GMT [MD]
+# PropertyValueAliases-4.0.0.txt
+# Date: 2003-03-12, 23:46:08 GMT [MD]
#
# This file contains aliases for property values used in the UCD.
# These names can be used for XML formats of UCD data, for regular-expression
# property tests, and other programmatic textual descriptions of Unicode data.
-# The names are not normative, except where they correspond to normative property
-# values in the UCD. For information on which properties are normative, see
-# UnicodeCharacterDatabase.html.
+# For information on which properties are normative, see UCD.html.
#
# The names may be translated in appropriate environments, and additional
# aliases may be useful.
@@ -25,32 +23,32 @@
#
# Third Field: The third field is a long name.
#
-# In the case of ccc, their are 4 fields. The second field is numeric, third
+# In the case of ccc, there are 4 fields. The second field is numeric, third
# is abbreviated, and fourth is long.
#
# With loose matching of property names, the case distinctions, whitespace,
# and '_' are ignored.
#
-# NOTE: The Block property values are in Blocks.txt, and not repeated here.
-# For more information on the use of blocks, see UTR #24: Regular Expression Guidelines
-#
# NOTE: Currently there is at most one abbreviated name and one long name for
-# property value. However, in the future additional aliases
-# may be added. In such a case, the first line for the property value
-# would have the preferred alias for output.
+# property value. However, in the future additional aliases may be added.
+# In such a case, the first line for the property value would have
+# the preferred alias for output.
#
# NOTE: The property value names are NOT unique across properties, especially
-# with loose matches. For example,
+# with loose matches. For example:
+#
# AL means Arabic Letter for the Bidi_Class property, and
# AL means Alpha_Left for the Combining_Class property, and
# AL means Alphabetic for the Line_Break property.
#
-# In addition, some property names may be the same as some property value names:
-# cc means Combining_Class property, and
-# cc means the General_Category property value Control (cc)
+# In addition, some property names may be the same as some property value names.
+# For example:
+#
+# cc means Combining_Class property, and
+# cc means the General_Category property value Control (cc)
#
# The combination of property value and property name is, however, unique.
-# For more information, see UTR #24: Regular Expression Guidelines
+# For more information, see UTR #18: Regular Expression Guidelines
# ================================================
@@ -74,9 +72,136 @@ bc ; RLO ; Right_To_Left_Override
bc ; S ; Segment_Separator
bc ; WS ; White_Space
+blk; n/a ; Aegean_Numbers
+blk; n/a ; Alphabetic_Presentation_Forms
+blk; n/a ; Arabic
+blk; n/a ; Arabic_Presentation_Forms-A
+blk; n/a ; Arabic_Presentation_Forms-B
+blk; n/a ; Armenian
+blk; n/a ; Arrows
+blk; n/a ; Basic_Latin
+blk; n/a ; Bengali
+blk; n/a ; Block_Elements
+blk; n/a ; Bopomofo
+blk; n/a ; Bopomofo_Extended
+blk; n/a ; Box_Drawing
+blk; n/a ; Braille_Patterns
+blk; n/a ; Buhid
+blk; n/a ; Byzantine_Musical_Symbols
+blk; n/a ; Cherokee
+blk; n/a ; CJK_Compatibility
+blk; n/a ; CJK_Compatibility_Forms
+blk; n/a ; CJK_Compatibility_Ideographs
+blk; n/a ; CJK_Compatibility_Ideographs_Supplement
+blk; n/a ; CJK_Radicals_Supplement
+blk; n/a ; CJK_Symbols_and_Punctuation
+blk; n/a ; CJK_Unified_Ideographs
+blk; n/a ; CJK_Unified_Ideographs_Extension_A
+blk; n/a ; CJK_Unified_Ideographs_Extension_B
+blk; n/a ; Combining_Diacritical_Marks
+blk; n/a ; Combining_Diacritical_Marks_for_Symbols
+blk; n/a ; Combining_Half_Marks
+blk; n/a ; Control_Pictures
+blk; n/a ; Currency_Symbols
+blk; n/a ; Cypriot_Syllabary
+blk; n/a ; Cyrillic
+blk; n/a ; Cyrillic_Supplementary
+blk; n/a ; Deseret
+blk; n/a ; Devanagari
+blk; n/a ; Dingbats
+blk; n/a ; Enclosed_Alphanumerics
+blk; n/a ; Enclosed_CJK_Letters_and_Months
+blk; n/a ; Ethiopic
+blk; n/a ; General_Punctuation
+blk; n/a ; Geometric_Shapes
+blk; n/a ; Georgian
+blk; n/a ; Gothic
+blk; n/a ; Greek_and_Coptic
+blk; n/a ; Greek_Extended
+blk; n/a ; Gujarati
+blk; n/a ; Gurmukhi
+blk; n/a ; Halfwidth_and_Fullwidth_Forms
+blk; n/a ; Hangul_Compatibility_Jamo
+blk; n/a ; Hangul_Jamo
+blk; n/a ; Hangul_Syllables
+blk; n/a ; Hanunoo
+blk; n/a ; Hebrew
+blk; n/a ; High_Private_Use_Surrogates
+blk; n/a ; High_Surrogates
+blk; n/a ; Hiragana
+blk; n/a ; Ideographic_Description_Characters
+blk; n/a ; IPA_Extensions
+blk; n/a ; Kanbun
+blk; n/a ; Kangxi_Radicals
+blk; n/a ; Kannada
+blk; n/a ; Katakana
+blk; n/a ; Katakana_Phonetic_Extensions
+blk; n/a ; Khmer
+blk; n/a ; Khmer_Symbols
+blk; n/a ; Lao
+blk; n/a ; Latin_Extended_Additional
+blk; n/a ; Latin_Extended-A
+blk; n/a ; Latin_Extended-B
+blk; n/a ; Latin-1_Supplement
+blk; n/a ; Letterlike_Symbols
+blk; n/a ; Limbu
+blk; n/a ; Linear_B_Ideograms
+blk; n/a ; Linear_B_Syllabary
+blk; n/a ; Low_Surrogates
+blk; n/a ; Malayalam
+blk; n/a ; Mathematical_Alphanumeric_Symbols
+blk; n/a ; Mathematical_Operators
+blk; n/a ; Miscellaneous_Mathematical_Symbols-A
+blk; n/a ; Miscellaneous_Mathematical_Symbols-B
+blk; n/a ; Miscellaneous_Symbols
+blk; n/a ; Miscellaneous_Symbols_and_Arrows
+blk; n/a ; Miscellaneous_Technical
+blk; n/a ; Mongolian
+blk; n/a ; Musical_Symbols
+blk; n/a ; Myanmar
+blk; n/a ; No_Block
+blk; n/a ; Number_Forms
+blk; n/a ; Ogham
+blk; n/a ; Old_Italic
+blk; n/a ; Optical_Character_Recognition
+blk; n/a ; Oriya
+blk; n/a ; Osmanya
+blk; n/a ; Phonetic_Extensions
+blk; n/a ; Private_Use_Area
+blk; n/a ; Runic
+blk; n/a ; Shavian
+blk; n/a ; Sinhala
+blk; n/a ; Small_Form_Variants
+blk; n/a ; Spacing_Modifier_Letters
+blk; n/a ; Specials
+blk; n/a ; Superscripts_and_Subscripts
+blk; n/a ; Supplemental_Arrows-A
+blk; n/a ; Supplemental_Arrows-B
+blk; n/a ; Supplemental_Mathematical_Operators
+blk; n/a ; Supplementary_Private_Use_Area-A
+blk; n/a ; Supplementary_Private_Use_Area-B
+blk; n/a ; Syriac
+blk; n/a ; Tagalog
+blk; n/a ; Tagbanwa
+blk; n/a ; Tags
+blk; n/a ; Tai_Le
+blk; n/a ; Tai_Xuan_Jing_Symbols
+blk; n/a ; Tamil
+blk; n/a ; Telugu
+blk; n/a ; Thaana
+blk; n/a ; Thai
+blk; n/a ; Tibetan
+blk; n/a ; Ugaritic
+blk; n/a ; Unified_Canadian_Aboriginal_Syllabics
+blk; n/a ; Variation_Selectors
+blk; n/a ; Variation_Selectors_Supplement
+blk; n/a ; Yi_Radicals
+blk; n/a ; Yi_Syllables
+blk; n/a ; Yijing_Hexagram_Symbols
+
ccc; 0; NR ; Not_Reordered
ccc; 1; OV ; Overlay
-ccc; 202; ATBL ; Attached_Below_Left
+ccc; 202; ATB ; Attached_Below
ccc; 216; ATAR ; Attached_Above_Right
ccc; 218; BL ; Below_Left
ccc; 220; B ; Below
@@ -158,6 +283,13 @@ gc ; Zl ; Line_Separator
gc ; Zp ; Paragraph_Separator
gc ; Zs ; Space_Separator
+hst; L ; Leading_Jamo
+hst; LV ; LV_Syllable
+hst; LVT ; LVT_Syllable
+hst; NA ; Not_Applicable
+hst; T ; Trailing_Jamo
+hst; V ; Vowel_Jamo
+
jg ; n/a ; AIN
jg ; n/a ; ALAPH
jg ; n/a ; ALEF
@@ -166,6 +298,7 @@ jg ; n/a ; BETH
jg ; n/a ; DAL
jg ; n/a ; DALATH_RISH
jg ; n/a ; E
+jg ; n/a ; FE
jg ; n/a ; FEH
jg ; n/a ; FINAL_SEMKATH
jg ; n/a ; GAF
@@ -178,6 +311,7 @@ jg ; n/a ; HEH_GOAL
jg ; n/a ; HETH
jg ; n/a ; KAF
jg ; n/a ; KAPH
+jg ; n/a ; KHAPH
jg ; n/a ; KNOTTED_HEH
jg ; n/a ; LAM
jg ; n/a ; LAMADH
@@ -209,6 +343,7 @@ jg ; n/a ; YEH_WITH_TAIL
jg ; n/a ; YUDH
jg ; n/a ; YUDH_HE
jg ; n/a ; ZAIN
+jg ; n/a ; ZHAIN
jt ; C ; Join_Causing
jt ; D ; Dual_Joining
@@ -234,6 +369,7 @@ lb ; ID ; Ideographic
lb ; IN ; Inseperable
lb ; IS ; Infix_Numeric
lb ; LF ; Line_Feed
+lb ; NL ; Next_Line
lb ; NS ; Nonstarter
lb ; NU ; Numeric
lb ; OP ; Open_Punctuation
@@ -244,6 +380,7 @@ lb ; SA ; Complex_Context
lb ; SG ; Surrogate
lb ; SP ; Space
lb ; SY ; Break_Symbols
+lb ; WJ ; Word_Joiner
lb ; XX ; Unknown
lb ; ZW ; ZWSpace
@@ -260,9 +397,11 @@ sc ; Arab ; Arabic
sc ; Armn ; Armenian
sc ; Beng ; Bengali
sc ; Bopo ; Bopomofo
+sc ; Brai ; Braille
sc ; Buhd ; Buhid
sc ; Cans ; Canadian_Aboriginal
sc ; Cher ; Cherokee
+sc ; Cprt ; Cypriot
sc ; Cyrl ; Cyrillic
sc ; Deva ; Devanagari
sc ; Dsrt ; Deseret
@@ -283,21 +422,27 @@ sc ; Khmr ; Khmer
sc ; Knda ; Kannada
sc ; Laoo ; Lao
sc ; Latn ; Latin
+sc ; Limb ; Limbu
+sc ; Linb ; Linear_B
sc ; Mlym ; Malayalam
sc ; Mong ; Mongolian
sc ; Mymr ; Myanmar
sc ; Ogam ; Ogham
sc ; Orya ; Oriya
+sc ; Osma ; Osmanya
sc ; Qaai ; Inherited
sc ; Runr ; Runic
+sc ; Shaw ; Shavian
sc ; Sinh ; Sinhala
sc ; Syrc ; Syriac
sc ; Tagb ; Tagbanwa
+sc ; Tale ; Tai_Le
sc ; Taml ; Tamil
sc ; Telu ; Telugu
sc ; Tglg ; Tagalog
sc ; Thaa ; Thaana
sc ; Thai ; Thai
sc ; Tibt ; Tibetan
+sc ; Ugar ; Ugaritic
sc ; Yiii ; Yi
sc ; Zyyy ; Common
diff --git a/gnu/usr.bin/perl/lib/unicore/Properties b/gnu/usr.bin/perl/lib/unicore/Properties
index 99e2fb87497..963c625098d 100644
--- a/gnu/usr.bin/perl/lib/unicore/Properties
+++ b/gnu/usr.bin/perl/lib/unicore/Properties
@@ -38,6 +38,7 @@
\p{BidiWS} Bi-directional category 'WS'
\p{Blank} [[:Blank:]]
* \p{Bopomofo} Script 'BOPOMOFO'
+* \p{Braille} Script 'BRAILLE'
* \p{Buhid} Script 'BUHID'
* \p{CanadianAboriginal} Script 'CANADIAN_ABORIGINAL'
\p{Canon} Decomposes to multiple characters
@@ -55,6 +56,7 @@
\p{Co} General Category 'Co'
* \p{Cs} Alias for \p{Cs} (General Category 'Cs')
\p{Cs} General Category 'Cs'
+* \p{Cypriot} Script 'CYPRIOT'
* \p{Cyrillic} Script 'CYRILLIC'
* \p{C} Alias for \p{C} (Major Category 'C')
\p{C} Major Category 'C'
@@ -101,6 +103,7 @@
* \p{Ideographic} Extended property 'Ideographic'
* \p{IdsBinaryOperator} Extended property 'IDS_Binary_Operator'
* \p{IdsTrinaryOperator} Extended property 'IDS_Trinary_Operator'
+* \p{InAegeanNumbers} Block 'Aegean Numbers'
* \p{InAlphabeticPresentationForms} Block 'Alphabetic Presentation Forms'
* \p{InArabicPresentationFormsA} Block 'Arabic Presentation Forms-A'
* \p{InArabicPresentationFormsB} Block 'Arabic Presentation Forms-B'
@@ -131,6 +134,7 @@
* \p{InCombiningHalfMarks} Block 'Combining Half Marks'
* \p{InControlPictures} Block 'Control Pictures'
* \p{InCurrencySymbols} Block 'Currency Symbols'
+* \p{InCypriotSyllabary} Block 'Cypriot Syllabary'
* \p{InCyrillicSupplementary} Block 'Cyrillic Supplementary'
* \p{InCyrillic} Block 'Cyrillic'
* \p{InDeseret} Block 'Deseret'
@@ -163,6 +167,7 @@
* \p{InKannada} Block 'Kannada'
* \p{InKatakanaPhoneticExtensions} Block 'Katakana Phonetic Extensions'
* \p{InKatakana} Block 'Katakana'
+* \p{InKhmerSymbols} Block 'Khmer Symbols'
* \p{InKhmer} Block 'Khmer'
* \p{InLao} Block 'Lao'
* \p{InLatin1Supplement} Block 'Latin-1 Supplement'
@@ -170,12 +175,16 @@
* \p{InLatinExtendedA} Block 'Latin Extended-A'
* \p{InLatinExtendedB} Block 'Latin Extended-B'
* \p{InLetterlikeSymbols} Block 'Letterlike Symbols'
+* \p{InLimbu} Block 'Limbu'
+* \p{InLinearBIdeograms} Block 'Linear B Ideograms'
+* \p{InLinearBSyllabary} Block 'Linear B Syllabary'
* \p{InLowSurrogates} Block 'Low Surrogates'
* \p{InMalayalam} Block 'Malayalam'
* \p{InMathematicalAlphanumericSymbols} Block 'Mathematical Alphanumeric Symbols'
* \p{InMathematicalOperators} Block 'Mathematical Operators'
* \p{InMiscellaneousMathematicalSymbolsA} Block 'Miscellaneous Mathematical Symbols-A'
* \p{InMiscellaneousMathematicalSymbolsB} Block 'Miscellaneous Mathematical Symbols-B'
+* \p{InMiscellaneousSymbolsAndArrows} Block 'Miscellaneous Symbols and Arrows'
* \p{InMiscellaneousSymbols} Block 'Miscellaneous Symbols'
* \p{InMiscellaneousTechnical} Block 'Miscellaneous Technical'
* \p{InMongolian} Block 'Mongolian'
@@ -186,8 +195,11 @@
* \p{InOldItalic} Block 'Old Italic'
* \p{InOpticalCharacterRecognition} Block 'Optical Character Recognition'
* \p{InOriya} Block 'Oriya'
+* \p{InOsmanya} Block 'Osmanya'
+* \p{InPhoneticExtensions} Block 'Phonetic Extensions'
* \p{InPrivateUseArea} Block 'Private Use Area'
* \p{InRunic} Block 'Runic'
+* \p{InShavian} Block 'Shavian'
* \p{InSinhala} Block 'Sinhala'
* \p{InSmallFormVariants} Block 'Small Form Variants'
* \p{InSpacingModifierLetters} Block 'Spacing Modifier Letters'
@@ -202,15 +214,20 @@
* \p{InTagalog} Block 'Tagalog'
* \p{InTagbanwa} Block 'Tagbanwa'
* \p{InTags} Block 'Tags'
+* \p{InTaiLe} Block 'Tai Le'
+* \p{InTaiXuanJingSymbols} Block 'Tai Xuan Jing Symbols'
* \p{InTamil} Block 'Tamil'
* \p{InTelugu} Block 'Telugu'
* \p{InThaana} Block 'Thaana'
* \p{InThai} Block 'Thai'
* \p{InTibetan} Block 'Tibetan'
+* \p{InUgaritic} Block 'Ugaritic'
* \p{InUnifiedCanadianAboriginalSyllabics} Block 'Unified Canadian Aboriginal Syllabics'
+* \p{InVariationSelectorsSupplement} Block 'Variation Selectors Supplement'
* \p{InVariationSelectors} Block 'Variation Selectors'
* \p{InYiRadicals} Block 'Yi Radicals'
* \p{InYiSyllables} Block 'Yi Syllables'
+* \p{InYijingHexagramSymbols} Block 'Yijing Hexagram Symbols'
* \p{Inherited} Script 'INHERITED'
* \p{JoinControl} Extended property 'Join_Control'
* \p{Kannada} Script 'KANNADA'
@@ -219,6 +236,8 @@
\p{L&} [\p{Ll}\p{Lu}\p{Lt}]
* \p{Lao} Script 'LAO'
* \p{Latin} Script 'LATIN'
+* \p{Limbu} Script 'LIMBU'
+* \p{LinearB} Script 'LINEAR_B'
* \p{Ll} Alias for \p{Ll} (General Category 'Ll')
\p{Ll} General Category 'Ll'
* \p{Lm} Alias for \p{Lm} (General Category 'Lm')
@@ -259,9 +278,11 @@
* \p{Ogham} Script 'OGHAM'
* \p{OldItalic} Script 'OLD_ITALIC'
* \p{Oriya} Script 'ORIYA'
+* \p{Osmanya} Script 'OSMANYA'
* \p{OtherAlphabetic} Extended property 'Other_Alphabetic'
* \p{OtherDefaultIgnorableCodePoint} Extended property 'Other_Default_Ignorable_Code_Point'
* \p{OtherGraphemeExtend} Extended property 'Other_Grapheme_Extend'
+* \p{OtherIdStart} Extended property 'Other_ID_Start'
* \p{OtherLowercase} Extended property 'Other_Lowercase'
* \p{OtherMath} Extended property 'Other_Math'
* \p{OtherUppercase} Extended property 'Other_Uppercase'
@@ -288,6 +309,7 @@
* \p{Runic} Script 'RUNIC'
* \p{Sc} Alias for \p{Sc} (General Category 'Sc')
\p{Sc} General Category 'Sc'
+* \p{Shavian} Script 'SHAVIAN'
* \p{Sinhala} Script 'SINHALA'
* \p{Sk} Alias for \p{Sk} (General Category 'Sk')
\p{Sk} General Category 'Sk'
@@ -303,6 +325,7 @@
\p{S} Major Category 'S'
* \p{Tagalog} Script 'TAGALOG'
* \p{Tagbanwa} Script 'TAGBANWA'
+* \p{TaiLe} Script 'TAI_LE'
* \p{Tamil} Script 'TAMIL'
* \p{Telugu} Script 'TELUGU'
* \p{TerminalPunctuation} Extended property 'Terminal_Punctuation'
@@ -310,6 +333,7 @@
* \p{Thai} Script 'THAI'
* \p{Tibetan} Script 'TIBETAN'
\p{Title} [[:Title:]]
+* \p{Ugaritic} Script 'UGARITIC'
* \p{UnifiedIdeograph} Extended property 'Unified_Ideograph'
* \p{Uppercase} [\p{Lu}\p{Other_Uppercase}]
\p{Upper} [[:Upper:]]
diff --git a/gnu/usr.bin/perl/lib/unicore/PropertyAliases.txt b/gnu/usr.bin/perl/lib/unicore/PropertyAliases.txt
index 913c41f8f67..1195e8f0ce7 100644
--- a/gnu/usr.bin/perl/lib/unicore/PropertyAliases.txt
+++ b/gnu/usr.bin/perl/lib/unicore/PropertyAliases.txt
@@ -1,12 +1,10 @@
-# PropertyAliases-3.2.0.txt
-# Date: 2002-03-19,23:31:21 GMT [MD]
+# PropertyAliases-4.0.0.txt
+# Date: 2003-03-12, 23:46:08 GMT [MD]
#
# This file contains aliases for properties used in the UCD.
# These names can be used for XML formats of UCD data, for regular-expression
# property tests, and other programmatic textual descriptions of Unicode data.
-# The names are not normative, except where they correspond to normative
-# properties in the UCD. For information on which properties are normative,
-# see UnicodeCharacterDatabase.html.
+# For information on which properties are normative, see UCD.html.
#
# The names may be translated in appropriate environments, and additional
# aliases may be useful.
@@ -15,7 +13,7 @@
#
# Each line has two fields, separated by semicolons.
#
-# First Field: The first field is an abbreviated name for the property
+# First Field: The first field is an abbreviated name for the property.
#
# Second Field: The second field is a long name
#
@@ -23,21 +21,19 @@
# and '_' are ignored.
#
# NOTE: Currently there is at most one abbreviated name and one long name for
-# each property. However, in the future additional aliases
-# may be added. In such a case, the first line for the property
-# would have the preferred alias for output.
+# each property. However, in the future additional aliases may be added.
#
# NOTE: The property value names are NOT unique across properties, especially
-# with loose matches. For example,
+# with loose matches. For example:
#
-# AL means Arabic Letter for the Bidi_Class property, and
-# AL means Alpha_Left for the Combining_Class property, and
-# AL means Alphabetic for the Line_Break property.
+# AL means Arabic Letter for the Bidi_Class property, and
+# AL means Alpha_Left for the Combining_Class property, and
+# AL means Alphabetic for the Line_Break property.
#
# In addition, some property names may be the same as some property value names.
#
# The combination of property value and property name is, however, unique.
-# For more information, see UTR #24: Regular Expression Guidelines
+# For more information, see UTR #18: Regular Expression Guidelines
# ================================================
@@ -62,6 +58,7 @@ stc ; Simple_Titlecase_Mapping
suc ; Simple_Uppercase_Mapping
tc ; Titlecase_Mapping
uc ; Uppercase_Mapping
+URS ; Unicode_Radical_Stroke
# ================================================
# Enumerated Non-Binary Properties
@@ -71,11 +68,14 @@ ccc ; Canonical_Combining_Class
dt ; Decomposition_Type
ea ; East_Asian_Width
gc ; General_Category
+hst ; Hangul_Syllable_Type
jg ; Joining_Group
jt ; Joining_Type
lb ; Line_Break
NFC_QC ; NFC_Quick_Check
+NFD_QC ; NFD_Quick_Check
NFKC_QC ; NFKC_Quick_Check
+NFKD_QC ; NFKD_Quick_Check
nt ; Numeric_Type
sc ; Script
@@ -107,13 +107,11 @@ Join_C ; Join_Control
LOE ; Logical_Order_Exception
Lower ; Lowercase
Math ; Math
-NBrk ; Non_Break
NChar ; Noncharacter_Code_Point
-NFD_QC ; NFD_Quick_Check
-NFKD_QC ; NFKD_Quick_Check
OAlpha ; Other_Alphabetic
ODI ; Other_Default_Ignorable_Code_Point
OGr_Ext ; Other_Grapheme_Extend
+OIDS ; Other_ID_Start
OLower ; Other_Lowercase
OMath ; Other_Math
OUpper ; Other_Uppercase
diff --git a/gnu/usr.bin/perl/lib/unicore/README.perl b/gnu/usr.bin/perl/lib/unicore/README.perl
index 288299c49e8..d9961d34a9e 100644
--- a/gnu/usr.bin/perl/lib/unicore/README.perl
+++ b/gnu/usr.bin/perl/lib/unicore/README.perl
@@ -1,20 +1,16 @@
-The *.txt files were copied 27 Mar 2002 from
+The *.txt files were copied from
http://www.unicode.org/Public/UNIDATA/
+as of Unicode 4.0.0 (April 2003).
+
The two big files, NormalizationTest.txt (2.0MB) and Unihan.txt
(25.7MB) were not included due to space considerations. Also NOT
-included were any *.html files and the derived files:
-
- DerivedAge.txt
- DerivedCoreProperties.txt
- DerivedNormalizationProps.txt
- DerivedProperties.txt
-
-and the normalization-related files
+included were any *.html files and the Derived* files
- NormalizationCorrections.txt
- NormalizationTest.txt
+ DerivedAge.txt
+ DerivedCoreProperties.txt
+ DerivedNormalizationProps.txt
To be 8.3-friendly, the lib/unicore/PropertyValueAliases.txt was
renamed to be lib/unicore/PropValueAliases.txt, since otherwise
diff --git a/gnu/usr.bin/perl/lib/unicore/ReadMe.txt b/gnu/usr.bin/perl/lib/unicore/ReadMe.txt
index 0ab767014ea..b8869c0b42b 100644
--- a/gnu/usr.bin/perl/lib/unicore/ReadMe.txt
+++ b/gnu/usr.bin/perl/lib/unicore/ReadMe.txt
@@ -1,4 +1,4 @@
-2002 March 25
+2003 April 16
This directory contains the Unicode Character Database
data files.
@@ -6,26 +6,25 @@ data files.
Currently, the Unicode Character Database files are at
the version level:
- Unicode Standard, Version 3.2.0
+ Unicode Standard, Version 4.0.0
-For information about the standard itself, see
-UAX #28, Unicode 3.2. <http://www.unicode.org/unicode/reports/tr28/>.
+For information about the standard itself, see:
+
+http://www.unicode.org/versions/Unicode4.0.0/
Detailed documentation of the files constituting the
Unicode Character Database (contributory data files for
-the standard itself) can be found in
-UnicodeCharacterDatabase.html. See also UnicodeData.html,
-PropList.html, NamesList.html, and DerivedProperties.html
-for specific details about particular files or sets of
-files.
+the standard itself) can be found in UCD.html.
-Unihan.txt is a very large file. A zipped version is
+Unihan.txt is a very large file and is unchanged from
+its Unicode 3.2.0 version. A zipped version is
also provided for downloading convenience: Unihan.zip.
The current Unicode 3.2.0 version of Unihan.txt is also available in
-two compressed formats in the Unicode 3.2.0 update directory.
-See: <http://www.unicode.org/Public/3.2-Update/> or
-<ftp://ftp.unicode.org/Public/3.2-Update/>
+two compressed formats in the Unicode 3.2.0 update directory. See:
+http://www.unicode.org/Public/3.2-Update/
+or
+ftp://ftp.unicode.org/Public/3.2-Update/
Unihan-3.2.0.zip for Windows. (Use winzip)
Unihan-3.2.0.txt.gz for Unix. (Use gzip or gunzip)
diff --git a/gnu/usr.bin/perl/lib/unicore/Scripts.pl b/gnu/usr.bin/perl/lib/unicore/Scripts.pl
index 4c99f029cc3..68c0e8da183 100644
--- a/gnu/usr.bin/perl/lib/unicore/Scripts.pl
+++ b/gnu/usr.bin/perl/lib/unicore/Scripts.pl
@@ -10,10 +10,8 @@ return <<'END';
00BA LATIN
00C0 00D6 LATIN
00D8 00F6 LATIN
-00F8 0220 LATIN
-0222 0233 LATIN
-0250 02AD LATIN
-02B0 02B8 LATIN
+00F8 0236 LATIN
+0250 02B8 LATIN
02E0 02E4 LATIN
0300 034F INHERITED
0360 036F INHERITED
@@ -24,6 +22,7 @@ return <<'END';
038E 03A1 GREEK
03A3 03CE GREEK
03D0 03F5 GREEK
+03F7 03FB GREEK
0400 0481 CYRILLIC
0483 0486 CYRILLIC
0488 0489 INHERITED
@@ -53,12 +52,13 @@ return <<'END';
06E5 06E6 ARABIC
06E7 06E8 INHERITED
06EA 06ED INHERITED
+06EE 06EF ARABIC
06FA 06FC ARABIC
-0710 072C SYRIAC
-0730 074A SYRIAC
+06FF ARABIC
+0710 074A SYRIAC
+074D 074F SYRIAC
0780 07B1 THAANA
-0901 0903 DEVANAGARI
-0905 0939 DEVANAGARI
+0901 0939 DEVANAGARI
093C 094D DEVANAGARI
0950 0954 DEVANAGARI
0958 0963 DEVANAGARI
@@ -70,15 +70,14 @@ return <<'END';
09AA 09B0 BENGALI
09B2 BENGALI
09B6 09B9 BENGALI
-09BC BENGALI
-09BE 09C4 BENGALI
+09BC 09C4 BENGALI
09C7 09C8 BENGALI
09CB 09CD BENGALI
09D7 BENGALI
09DC 09DD BENGALI
09DF 09E3 BENGALI
09E6 09F1 BENGALI
-0A02 GURMUKHI
+0A02 0A03 GURMUKHI
0A05 0A0A GURMUKHI
0A0F 0A10 GURMUKHI
0A13 0A28 GURMUKHI
@@ -94,8 +93,7 @@ return <<'END';
0A5E GURMUKHI
0A66 0A74 GURMUKHI
0A81 0A83 GUJARATI
-0A85 0A8B GUJARATI
-0A8D GUJARATI
+0A85 0A8D GUJARATI
0A8F 0A91 GUJARATI
0A93 0AA8 GUJARATI
0AAA 0AB0 GUJARATI
@@ -105,7 +103,7 @@ return <<'END';
0AC7 0AC9 GUJARATI
0ACB 0ACD GUJARATI
0AD0 GUJARATI
-0AE0 GUJARATI
+0AE0 0AE3 GUJARATI
0AE6 0AEF GUJARATI
0B01 0B03 ORIYA
0B05 0B0C ORIYA
@@ -113,7 +111,7 @@ return <<'END';
0B13 0B28 ORIYA
0B2A 0B30 ORIYA
0B32 0B33 ORIYA
-0B36 0B39 ORIYA
+0B35 0B39 ORIYA
0B3C 0B43 ORIYA
0B47 0B48 ORIYA
0B4B 0B4D ORIYA
@@ -121,6 +119,7 @@ return <<'END';
0B5C 0B5D ORIYA
0B5F 0B61 ORIYA
0B66 0B6F ORIYA
+0B71 ORIYA
0B82 0B83 TAMIL
0B85 0B8A TAMIL
0B8E 0B90 TAMIL
@@ -155,7 +154,7 @@ return <<'END';
0C92 0CA8 KANNADA
0CAA 0CB3 KANNADA
0CB5 0CB9 KANNADA
-0CBE 0CC4 KANNADA
+0CBD 0CC4 KANNADA
0CC6 0CC8 KANNADA
0CCA 0CCD KANNADA
0CD5 0CD6 KANNADA
@@ -275,6 +274,20 @@ return <<'END';
1810 1819 MONGOLIAN
1820 1877 MONGOLIAN
1880 18A9 MONGOLIAN
+1900 191C LIMBU
+1920 192B LIMBU
+1930 193B LIMBU
+1946 194F LIMBU
+1950 196D TAI_LE
+1970 1974 TAI_LE
+1D00 1D25 LATIN
+1D26 1D2A GREEK
+1D2B CYRILLIC
+1D2C 1D5C LATIN
+1D5D 1D61 GREEK
+1D62 1D65 LATIN
+1D66 1D6A GREEK
+1D6B LATIN
1E00 1E9B LATIN
1EA0 1EF9 LATIN
1F00 1F15 GREEK
@@ -301,6 +314,7 @@ return <<'END';
20D0 20EA INHERITED
2126 GREEK
212A 212B LATIN
+2800 28FF BRAILLE
2E80 2E99 HAN
2E9B 2EF3 HAN
2F00 2FD5 HAN
@@ -321,11 +335,7 @@ return <<'END';
3400 4DB5 HAN
4E00 9FA5 HAN
A000 A48C YI
-A490 A4A1 YI
-A4A4 A4B3 YI
-A4B5 A4C0 YI
-A4C2 A4C4 YI
-A4C6 YI
+A490 A4C6 YI
AC00 D7A3 HANGUL
F900 FA2D HAN
FA30 FA6A HAN
@@ -358,10 +368,26 @@ FFC2 FFC7 HANGUL
FFCA FFCF HANGUL
FFD2 FFD7 HANGUL
FFDA FFDC HANGUL
+10000 1000B LINEAR_B
+1000D 10026 LINEAR_B
+10028 1003A LINEAR_B
+1003C 1003D LINEAR_B
+1003F 1004D LINEAR_B
+10050 1005D LINEAR_B
+10080 100FA LINEAR_B
10300 1031E OLD_ITALIC
10330 1034A GOTHIC
-10400 10425 DESERET
-10428 1044D DESERET
+10380 1039D UGARITIC
+10400 1044F DESERET
+10450 1047F SHAVIAN
+10480 1049D OSMANYA
+104A0 104A9 OSMANYA
+10800 10805 CYPRIOT
+10808 CYPRIOT
+1080A 10835 CYPRIOT
+10837 10838 CYPRIOT
+1083C CYPRIOT
+1083F CYPRIOT
1D167 1D169 INHERITED
1D17B 1D182 INHERITED
1D185 1D18B INHERITED
diff --git a/gnu/usr.bin/perl/lib/unicore/Scripts.txt b/gnu/usr.bin/perl/lib/unicore/Scripts.txt
index cd2bc63b712..696720aaa04 100644
--- a/gnu/usr.bin/perl/lib/unicore/Scripts.txt
+++ b/gnu/usr.bin/perl/lib/unicore/Scripts.txt
@@ -1,15 +1,16 @@
-# Scripts-3.2.0.txt
-# Date: 2002-03-19,23:31:26 GMT [MD]
+# Scripts-4.0.0.txt
+# Date: 2003-03-20, 20:07:48 GMT [MD]
#
-# For documentation, see UTR #24: Script Names
-# http://www.unicode.org/unicode/reports/tr24/
-# Note: Unassigned and Noncharacter codepoints are omitted,
-# except when listing Noncharacter or Cn.
+# For documentation, see UCD.html
+# Note: Unassigned and Noncharacter codepoints may be omitted
+# if they have default property values.
# ================================================
# ================================================
# Script
+# All code points not explicitly listed in this file have the property
+# value: COMMON.
# ================================================
0041..005A ; LATIN # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
@@ -22,11 +23,14 @@
01BB ; LATIN # Lo LATIN LETTER TWO WITH STROKE
01BC..01BF ; LATIN # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
01C0..01C3 ; LATIN # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
-01C4..0220 ; LATIN # L& [93] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
-0222..0233 ; LATIN # L& [18] LATIN CAPITAL LETTER OU..LATIN SMALL LETTER Y WITH MACRON
-0250..02AD ; LATIN # L& [94] LATIN SMALL LETTER TURNED A..LATIN LETTER BIDENTAL PERCUSSIVE
+01C4..0236 ; LATIN # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL
+0250..02AF ; LATIN # L& [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
02B0..02B8 ; LATIN # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
02E0..02E4 ; LATIN # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+1D00..1D25 ; LATIN # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN
+1D2C..1D5C ; LATIN # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN
+1D62..1D65 ; LATIN # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V
+1D6B ; LATIN # L& LATIN SMALL LETTER UE
1E00..1E9B ; LATIN # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
1EA0..1EF9 ; LATIN # L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE
2071 ; LATIN # L& SUPERSCRIPT LATIN SMALL LETTER I
@@ -36,7 +40,7 @@ FB00..FB06 ; LATIN # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE S
FF21..FF3A ; LATIN # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
FF41..FF5A ; LATIN # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
-# Total code points: 840
+# Total code points: 938
# ================================================
@@ -48,6 +52,10 @@ FF41..FF5A ; LATIN # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
038E..03A1 ; GREEK # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
03A3..03CE ; GREEK # L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS
03D0..03F5 ; GREEK # L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F7..03FB ; GREEK # L& [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN
+1D26..1D2A ; GREEK # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI
+1D5D..1D61 ; GREEK # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI
+1D66..1D6A ; GREEK # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI
1F00..1F15 ; GREEK # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
1F18..1F1D ; GREEK # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
1F20..1F45 ; GREEK # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
@@ -69,7 +77,7 @@ FF41..FF5A ; LATIN # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
1FF6..1FFC ; GREEK # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
2126 ; GREEK # L& OHM SIGN
-# Total code points: 328
+# Total code points: 348
# ================================================
@@ -79,8 +87,9 @@ FF41..FF5A ; LATIN # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN
04D0..04F5 ; CYRILLIC # L& [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS
04F8..04F9 ; CYRILLIC # L& [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS
0500..050F ; CYRILLIC # L& [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE
+1D2B ; CYRILLIC # L& CYRILLIC LETTER SMALL CAPITAL EL
-# Total code points: 259
+# Total code points: 260
# ================================================
@@ -114,7 +123,9 @@ FB46..FB4F ; HEBREW # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU
0671..06D3 ; ARABIC # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
06D5 ; ARABIC # Lo ARABIC LETTER AE
06E5..06E6 ; ARABIC # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EE..06EF ; ARABIC # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
06FA..06FC ; ARABIC # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF ; ARABIC # Lo ARABIC LETTER HEH WITH INVERTED V
FB50..FBB1 ; ARABIC # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
FBD3..FD3D ; ARABIC # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
FD50..FD8F ; ARABIC # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
@@ -123,16 +134,17 @@ FDF0..FDFB ; ARABIC # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIG
FE70..FE74 ; ARABIC # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
-# Total code points: 874
+# Total code points: 877
# ================================================
0710 ; SYRIAC # Lo SYRIAC LETTER ALAPH
0711 ; SYRIAC # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
-0712..072C ; SYRIAC # Lo [27] SYRIAC LETTER BETH..SYRIAC LETTER TAW
+0712..072F ; SYRIAC # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
0730..074A ; SYRIAC # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..074F ; SYRIAC # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
-# Total code points: 56
+# Total code points: 62
# ================================================
@@ -146,7 +158,7 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0901..0902 ; DEVANAGARI # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
0903 ; DEVANAGARI # Mc DEVANAGARI SIGN VISARGA
-0905..0939 ; DEVANAGARI # Lo [53] DEVANAGARI LETTER A..DEVANAGARI LETTER HA
+0904..0939 ; DEVANAGARI # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
093C ; DEVANAGARI # Mn DEVANAGARI SIGN NUKTA
093D ; DEVANAGARI # Lo DEVANAGARI SIGN AVAGRAHA
093E..0940 ; DEVANAGARI # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
@@ -159,7 +171,7 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0962..0963 ; DEVANAGARI # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
0966..096F ; DEVANAGARI # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
-# Total code points: 101
+# Total code points: 102
# ================================================
@@ -172,6 +184,7 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
09B2 ; BENGALI # Lo BENGALI LETTER LA
09B6..09B9 ; BENGALI # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA
09BC ; BENGALI # Mn BENGALI SIGN NUKTA
+09BD ; BENGALI # Lo BENGALI SIGN AVAGRAHA
09BE..09C0 ; BENGALI # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
09C1..09C4 ; BENGALI # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
09C7..09C8 ; BENGALI # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
@@ -184,11 +197,12 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
09E6..09EF ; BENGALI # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
09F0..09F1 ; BENGALI # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
-# Total code points: 80
+# Total code points: 81
# ================================================
0A02 ; GURMUKHI # Mn GURMUKHI SIGN BINDI
+0A03 ; GURMUKHI # Mc GURMUKHI SIGN VISARGA
0A05..0A0A ; GURMUKHI # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
0A0F..0A10 ; GURMUKHI # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
0A13..0A28 ; GURMUKHI # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
@@ -207,14 +221,13 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0A70..0A71 ; GURMUKHI # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
0A72..0A74 ; GURMUKHI # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
-# Total code points: 75
+# Total code points: 76
# ================================================
0A81..0A82 ; GUJARATI # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
0A83 ; GUJARATI # Mc GUJARATI SIGN VISARGA
-0A85..0A8B ; GUJARATI # Lo [7] GUJARATI LETTER A..GUJARATI LETTER VOCALIC R
-0A8D ; GUJARATI # Lo GUJARATI VOWEL CANDRA E
+0A85..0A8D ; GUJARATI # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
0A8F..0A91 ; GUJARATI # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
0A93..0AA8 ; GUJARATI # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA
0AAA..0AB0 ; GUJARATI # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA
@@ -229,10 +242,11 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0ACB..0ACC ; GUJARATI # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
0ACD ; GUJARATI # Mn GUJARATI SIGN VIRAMA
0AD0 ; GUJARATI # Lo GUJARATI OM
-0AE0 ; GUJARATI # Lo GUJARATI LETTER VOCALIC RR
+0AE0..0AE1 ; GUJARATI # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3 ; GUJARATI # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
0AE6..0AEF ; GUJARATI # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
-# Total code points: 78
+# Total code points: 82
# ================================================
@@ -243,7 +257,7 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0B13..0B28 ; ORIYA # Lo [22] ORIYA LETTER O..ORIYA LETTER NA
0B2A..0B30 ; ORIYA # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA
0B32..0B33 ; ORIYA # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA
-0B36..0B39 ; ORIYA # Lo [4] ORIYA LETTER SHA..ORIYA LETTER HA
+0B35..0B39 ; ORIYA # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA
0B3C ; ORIYA # Mn ORIYA SIGN NUKTA
0B3D ; ORIYA # Lo ORIYA SIGN AVAGRAHA
0B3E ; ORIYA # Mc ORIYA VOWEL SIGN AA
@@ -258,8 +272,9 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0B5C..0B5D ; ORIYA # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA
0B5F..0B61 ; ORIYA # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
0B66..0B6F ; ORIYA # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B71 ; ORIYA # Lo ORIYA LETTER WA
-# Total code points: 78
+# Total code points: 80
# ================================================
@@ -313,6 +328,7 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0C92..0CA8 ; KANNADA # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
0CAA..0CB3 ; KANNADA # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA
0CB5..0CB9 ; KANNADA # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBD ; KANNADA # Lo KANNADA SIGN AVAGRAHA
0CBE ; KANNADA # Mc KANNADA VOWEL SIGN AA
0CBF ; KANNADA # Mn KANNADA VOWEL SIGN I
0CC0..0CC4 ; KANNADA # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
@@ -325,7 +341,7 @@ FE76..FEFC ; ARABIC # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
0CE0..0CE1 ; KANNADA # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
0CE6..0CEF ; KANNADA # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
-# Total code points: 80
+# Total code points: 81
# ================================================
@@ -526,7 +542,8 @@ FFDA..FFDC ; HANGUL # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL L
# ================================================
1780..17B3 ; KHMER # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
-17B4..17B6 ; KHMER # Mc [3] KHMER VOWEL INHERENT AQ..KHMER VOWEL SIGN AA
+17B4..17B5 ; KHMER # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6 ; KHMER # Mc KHMER VOWEL SIGN AA
17B7..17BD ; KHMER # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
17BE..17C5 ; KHMER # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
17C6 ; KHMER # Mn KHMER SIGN NIKAHIT
@@ -595,13 +612,9 @@ FA30..FA6A ; HAN # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILI
# ================================================
A000..A48C ; YI # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR
-A490..A4A1 ; YI # So [18] YI RADICAL QOT..YI RADICAL GA
-A4A4..A4B3 ; YI # So [16] YI RADICAL DDUR..YI RADICAL JO
-A4B5..A4C0 ; YI # So [12] YI RADICAL JJY..YI RADICAL SHAT
-A4C2..A4C4 ; YI # So [3] YI RADICAL SHOP..YI RADICAL ZZIET
-A4C6 ; YI # So YI RADICAL KE
+A490..A4C6 ; YI # So [55] YI RADICAL QOT..YI RADICAL KE
-# Total code points: 1215
+# Total code points: 1220
# ================================================
@@ -618,10 +631,9 @@ A4C6 ; YI # So YI RADICAL KE
# ================================================
-10400..10425 ; DESERET # L& [38] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER ENG
-10428..1044D ; DESERET # L& [38] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER ENG
+10400..1044F ; DESERET # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
-# Total code points: 76
+# Total code points: 80
# ================================================
@@ -690,3 +702,73 @@ FE20..FE23 ; INHERITED # Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOU
# Total code points: 18
+# ================================================
+
+1900..191C ; LIMBU # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922 ; LIMBU # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926 ; LIMBU # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928 ; LIMBU # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B ; LIMBU # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931 ; LIMBU # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932 ; LIMBU # Mn LIMBU SMALL LETTER ANUSVARA
+1933..1938 ; LIMBU # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B ; LIMBU # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1946..194F ; LIMBU # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+
+# Total code points: 63
+
+# ================================================
+
+1950..196D ; TAI_LE # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974 ; TAI_LE # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+
+# Total code points: 35
+
+# ================================================
+
+10000..1000B ; LINEAR_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026 ; LINEAR_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A ; LINEAR_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D ; LINEAR_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D ; LINEAR_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D ; LINEAR_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA ; LINEAR_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+
+# Total code points: 211
+
+# ================================================
+
+10380..1039D ; UGARITIC # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+
+# Total code points: 30
+
+# ================================================
+
+10450..1047F ; SHAVIAN # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW
+
+# Total code points: 48
+
+# ================================================
+
+10480..1049D ; OSMANYA # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO
+104A0..104A9 ; OSMANYA # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+
+# Total code points: 40
+
+# ================================================
+
+10800..10805 ; CYPRIOT # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808 ; CYPRIOT # Lo CYPRIOT SYLLABLE JO
+1080A..10835 ; CYPRIOT # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838 ; CYPRIOT # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C ; CYPRIOT # Lo CYPRIOT SYLLABLE ZA
+1083F ; CYPRIOT # Lo CYPRIOT SYLLABLE ZO
+
+# Total code points: 55
+
+# ================================================
+
+2800..28FF ; BRAILLE # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+
+# Total code points: 256
+
diff --git a/gnu/usr.bin/perl/lib/unicore/SpecialCasing.txt b/gnu/usr.bin/perl/lib/unicore/SpecialCasing.txt
index f25ac9b1b81..34d1c61de37 100644
--- a/gnu/usr.bin/perl/lib/unicore/SpecialCasing.txt
+++ b/gnu/usr.bin/perl/lib/unicore/SpecialCasing.txt
@@ -1,5 +1,5 @@
-# SpecialCasing-3.2.0.txt
-# Date: 2002-03-19,23:31:42 GMT [MD]
+# SpecialCasing-4.0.0.txt
+# Date: 2003-03-14, 20:22:04 GMT [MD]
#
# Special Casing Properties
#
@@ -7,9 +7,10 @@
# It contains additional information about the casing of Unicode characters.
# (For compatibility, the UnicodeData.txt file only contains case mappings for
# characters where they are 1-1, and does not have locale-specific mappings.)
-# For more information, see
-# UTR #21 Case Mappings, at http://www.unicode.org/unicode/reports/tr21/
+# For more information, see the discussion of Case Mappings in the Unicode Standard.
#
+# All code points not listed in this file that do not have a simple case mappings
+# in UnicodeData.txt map to themselves.
# ================================================================================
# Format
# ================================================================================
@@ -34,10 +35,10 @@
# <ISO_3166_code> := 2-letter ISO country code,
# <ISO_639_code> := 2-letter ISO language code
#
-# A context is one of the following, as defined in UAX #21: Case Mappings:
-# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot
+# A context is one of the following, as defined in the Unicode Standard:
+# Final_Sigma, After_Soft_Dotted, More_Above, Before_Dot, Not_Before_Dot, After_I
#
-# Parsers of this file must be prepared to deal future additions to this format:
+# Parsers of this file must be prepared to deal with future additions to this format:
# * Additional contexts
# * Additional fields
# ================================================================================
@@ -231,14 +232,14 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri
# The following rules handle those cases.
-0130; 0069; 0130; 0130; tr # LATIN CAPITAL LETTER I WITH DOT ABOVE
-0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE
# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i.
# This matches the behavior of the canonically equivalent I-dot_above
-0307; ; 0307; 0307; tr After_Soft_Dotted; # COMBINING DOT ABOVE
-0307; ; 0307; 0307; az After_Soft_Dotted; # COMBINING DOT ABOVE
+0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
+0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
# When lowercasing, unless an I is before a dot_above, it turns into a dotless i.
diff --git a/gnu/usr.bin/perl/lib/unicore/StandardizedVariants.txt b/gnu/usr.bin/perl/lib/unicore/StandardizedVariants.txt
new file mode 100644
index 00000000000..971fd9efbc9
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/StandardizedVariants.txt
@@ -0,0 +1,114 @@
+# StandardizedVariants-4.0.0.txt
+#
+# The following file specifies the variant sequences that are defined in the
+# Unicode Standard.
+#
+# Warning: Only the variation sequences specifically defined in this file
+# are sanctioned for standard use. In all other cases the variation selector
+# cannot change the visual appearance of the preceding base character from
+# what it would have had in the absence of the variation selector.
+#
+# For more information, see Section 15.6 Variation Selectors in The Unicode Standard.
+#
+# Format:
+# Field 0: the variation sequence
+# Field 1: the description of the desired appearance
+# Field 2: where the appearance is only different in in particular shaping environments
+# this field lists them. The possible values are: isolate, initial, medial, final.
+# If more than one is present, there are spaces between them.
+# =============================
+
+# Mathematical
+
+2229 FE00; with serifs; # INTERSECTION
+222A FE00; with serifs; # UNION
+2268 FE00; with vertical stroke; # LESS-THAN BUT NOT EQUAL TO
+2269 FE00; with vertical stroke; # GREATER-THAN AND NOT DOUBLE EQUAL
+2272 FE00; following the slant of the lower leg; # LESS-THAN OR EQUIVALENT TO
+2273 FE00; following the slant of the lower leg; # GREATER-THAN OR EQUIVALENT TO
+#2278 FE00; with vertical stroke; # NEITHER LESS-THAN NOR GREATER-THAN
+#2279 FE00; with vertical stroke; # NEITHER GREATER-THAN NOR LESS-THAN
+228A FE00; with stroke through bottom members; # SUBSET OF WITH NOT EQUAL TO
+228B FE00; with stroke through bottom members; # SUPERSET OF WITH NOT EQUAL TO
+2293 FE00; with serifs; # SQUARE CAP
+2294 FE00; with serifs; # SQUARE CUP
+2295 FE00; with white rim; # CIRCLED PLUS
+2297 FE00; with white rim; # CIRCLED TIMES
+229C FE00; with equal sign touching the circle; # CIRCLED EQUALS
+22DA FE00; with slanted equal; # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB FE00; with slanted equal; # GREATER-THAN EQUAL TO OR LESS-THAN
+2A3C FE00; tall variant with narrow foot; # INTERIOR PRODUCT
+2A3D FE00; tall variant with narrow foot; # RIGHTHAND INTERIOR PRODUCT
+2A9D FE00; with similar following the slant of the upper leg; # SIMILAR OR LESS-THAN
+2A9E FE00; with similar following the slant of the upper leg; # SIMILAR OR GREATER-THAN
+2AAC FE00; with slanted equal; # SMALLER THAN OR EQUAL TO
+2AAD FE00; with slanted equal; # LARGER THAN OR EQUAL TO
+2ACB FE00; with stroke through bottom members; # SUBSET OF ABOVE NOT EQUAL TO
+2ACC FE00; with stroke through bottom members; # SUPERSET OF ABOVE NOT EQUAL TO
+
+#Mongolian
+
+1820 180B; second form; isolate medial final # MONGOLIAN LETTER A
+1820 180C; third form; medial # MONGOLIAN LETTER A
+1821 180B; second form; initial final # MONGOLIAN LETTER E
+1822 180B; second form; medial # MONGOLIAN LETTER I
+1823 180B; second form; medial final # MONGOLIAN LETTER O
+1824 180B; second form; medial # MONGOLIAN LETTER U
+1825 180B; second form; medial final # MONGOLIAN LETTER OE
+1825 180C; third form; medial # MONGOLIAN LETTER OE
+1826 180B; second form; isolate medial final # MONGOLIAN LETTER UE
+1826 180C; third form; medial # MONGOLIAN LETTER UE
+1828 180B; second form; initial medial # MONGOLIAN LETTER NA
+1828 180C; third form; medial # MONGOLIAN LETTER NA
+1828 180D; separate form; medial # MONGOLIAN LETTER NA
+182A 180B; alternative form; final # MONGOLIAN LETTER BA
+182C 180B; second form; initial medial # MONGOLIAN LETTER QA
+182C 180B; feminine second form; isolate # MONGOLIAN LETTER QA
+182C 180C; third form; medial # MONGOLIAN LETTER QA
+182C 180D; fourth form; medial # MONGOLIAN LETTER QA
+182D 180B; second form; initial medial # MONGOLIAN LETTER GA
+182D 180B; feminine form; final # MONGOLIAN LETTER GA
+182D 180C; third form; medial # MONGOLIAN LETTER GA
+182D 180D; feminine form; medial # MONGOLIAN LETTER GA
+1830 180B; second form; final # MONGOLIAN LETTER SA
+1830 180C; third form; final # MONGOLIAN LETTER SA
+1832 180B; second form; medial # MONGOLIAN LETTER TA
+1833 180B; second form; initial medial final # MONGOLIAN LETTER DA
+1835 180B; second form; medial # MONGOLIAN LETTER JA
+1836 180B; second form; initial medial # # MONGOLIAN LETTER YA
+1836 180C; third form; medial # MONGOLIAN LETTER YA
+1838 180B; second form; final # MONGOLIAN LETTER WA
+1844 180B; second form; medial # MONGOLIAN LETTER TODO E
+1845 180B; second form; medial # MONGOLIAN LETTER TODO I
+1846 180B; second form; medial # MONGOLIAN LETTER TODO O
+1847 180B; second form; isolate medial final # MONGOLIAN LETTER TODO U
+1847 180C; third form; medial # MONGOLIAN LETTER TODO U
+1848 180B; second form; medial # MONGOLIAN LETTER TODO OE
+1849 180B; second form; isolate medial # MONGOLIAN LETTER TODO UE
+184D 180B; feminine form; initial medial # MONGOLIAN LETTER TODO QA
+184E 180B; second form; medial # MONGOLIAN LETTER TODO GA
+185D 180B; second form; medial final # MONGOLIAN LETTER SIBE E
+185E 180B; second form; medial final # MONGOLIAN LETTER SIBE I
+185E 180C; third form; medial final # MONGOLIAN LETTER SIBE I
+1860 180B; second form; medial final # MONGOLIAN LETTER SIBE UE
+1863 180B; second form; medial # MONGOLIAN LETTER SIBE KA
+1868 180B; second form; initial medial # MONGOLIAN LETTER SIBE TA
+1868 180C; third form; medial # MONGOLIAN LETTER SIBE TA
+1869 180B; second form; initial medial # MONGOLIAN LETTER SIBE DA
+186F 180B; second form; initial medial # MONGOLIAN LETTER SIBE ZA
+1873 180B; second form; medial final # MONGOLIAN LETTER MANCHU I
+1873 180C; third form; medial final # MONGOLIAN LETTER MANCHU I
+1873 180D; fourth form; medial # MONGOLIAN LETTER MANCHU I
+1874 180B; second form; medial # MONGOLIAN LETTER MANCHU KA
+1874 180B; feminine first final form; final # MONGOLIAN LETTER MANCHU KA
+1874 180C; feminine first medial form; medial # MONGOLIAN LETTER MANCHU KA
+1874 180C; feminine second final form; final # MONGOLIAN LETTER MANCHU KA
+1874 180D; feminine second medial form; medial # MONGOLIAN LETTER MANCHU KA
+1876 180B; second form; initial medial # MONGOLIAN LETTER MANCHU FA
+1880 180B; second form; # MONGOLIAN LETTER ALI GALI ANUSVARA ONE
+1881 180B; second form; # MONGOLIAN LETTER ALI GALI VISARGA ONE
+1887 180B; second form; isolate final # MONGOLIAN LETTER ALI GALI A
+1887 180C; third form; final # MONGOLIAN LETTER ALI GALI A
+1887 180D; fourth form; final # MONGOLIAN LETTER ALI GALI A
+1888 180B; second form; final # MONGOLIAN LETTER ALI GALI I
+188A 180B; second form; initial medial # MONGOLIAN LETTER ALI GALI NGA \ No newline at end of file
diff --git a/gnu/usr.bin/perl/lib/unicore/To/Digit.pl b/gnu/usr.bin/perl/lib/unicore/To/Digit.pl
index e5c0ff429ea..3d6ee2f6ff7 100644
--- a/gnu/usr.bin/perl/lib/unicore/To/Digit.pl
+++ b/gnu/usr.bin/perl/lib/unicore/To/Digit.pl
@@ -13,9 +13,6 @@ return <<'END';
0037 7
0038 8
0039 9
-00B2 2
-00B3 3
-00B9 1
0660 0
0661 1
0662 2
@@ -194,23 +191,16 @@ return <<'END';
1817 7
1818 8
1819 9
-2070 0
-2074 4
-2075 5
-2076 6
-2077 7
-2078 8
-2079 9
-2080 0
-2081 1
-2082 2
-2083 3
-2084 4
-2085 5
-2086 6
-2087 7
-2088 8
-2089 9
+1946 0
+1947 1
+1948 2
+1949 3
+194A 4
+194B 5
+194C 6
+194D 7
+194E 8
+194F 9
FF10 0
FF11 1
FF12 2
@@ -221,6 +211,16 @@ FF16 6
FF17 7
FF18 8
FF19 9
+104A0 0
+104A1 1
+104A2 2
+104A3 3
+104A4 4
+104A5 5
+104A6 6
+104A7 7
+104A8 8
+104A9 9
1D7CE 0
1D7CF 1
1D7D0 2
diff --git a/gnu/usr.bin/perl/lib/unicore/To/Fold.pl b/gnu/usr.bin/perl/lib/unicore/To/Fold.pl
index 2a355ad6a39..ee608336f84 100644
--- a/gnu/usr.bin/perl/lib/unicore/To/Fold.pl
+++ b/gnu/usr.bin/perl/lib/unicore/To/Fold.pl
@@ -378,9 +378,11 @@ return <<'END';
03EE 03EF
03F0 03BA
03F1 03C1
-03F2 03C3
03F4 03B8
03F5 03B5
+03F7 03F8
+03F9 03F2
+03FA 03FB
0400 0450
0401 0451
0402 0452
@@ -846,4 +848,6 @@ FF3A FF5A
10423 1044B
10424 1044C
10425 1044D
+10426 1044E
+10427 1044F
END
diff --git a/gnu/usr.bin/perl/lib/unicore/To/Lower.pl b/gnu/usr.bin/perl/lib/unicore/To/Lower.pl
index cbb27214882..8bf064ad801 100644
--- a/gnu/usr.bin/perl/lib/unicore/To/Lower.pl
+++ b/gnu/usr.bin/perl/lib/unicore/To/Lower.pl
@@ -294,6 +294,9 @@ return <<'END';
03EC 03ED
03EE 03EF
03F4 03B8
+03F7 03F8
+03F9 03F2
+03FA 03FB
0400 0450
0401 0451
0402 0452
@@ -757,4 +760,6 @@ FF3A FF5A
10423 1044B
10424 1044C
10425 1044D
+10426 1044E
+10427 1044F
END
diff --git a/gnu/usr.bin/perl/lib/unicore/To/Title.pl b/gnu/usr.bin/perl/lib/unicore/To/Title.pl
index 1cd9dc540f3..cfeccabcdc3 100644
--- a/gnu/usr.bin/perl/lib/unicore/To/Title.pl
+++ b/gnu/usr.bin/perl/lib/unicore/To/Title.pl
@@ -224,10 +224,13 @@ return <<'END';
01BD 01BC
01BF 01F7
01C4 01C5
+01C5 01C5
01C6 01C5
01C7 01C8
+01C8 01C8
01C9 01C8
01CA 01CB
+01CB 01CB
01CC 01CB
01CE 01CD
01D0 01CF
@@ -248,6 +251,7 @@ return <<'END';
01ED 01EC
01EF 01EE
01F1 01F2
+01F2 01F2
01F3 01F2
01F5 01F4
01F9 01F8
@@ -351,8 +355,10 @@ return <<'END';
03EF 03EE
03F0 039A
03F1 03A1
-03F2 03A3
+03F2 03F9
03F5 0395
+03F8 03F7
+03FB 03FA
0430 0410
0431 0411
0432 0412
@@ -815,4 +821,6 @@ FF5A FF3A
1044B 10423
1044C 10424
1044D 10425
+1044E 10426
+1044F 10427
END
diff --git a/gnu/usr.bin/perl/lib/unicore/To/Upper.pl b/gnu/usr.bin/perl/lib/unicore/To/Upper.pl
index 0d1596f72d6..1a427890165 100644
--- a/gnu/usr.bin/perl/lib/unicore/To/Upper.pl
+++ b/gnu/usr.bin/perl/lib/unicore/To/Upper.pl
@@ -378,8 +378,10 @@ return <<'END';
03EF 03EE
03F0 039A
03F1 03A1
-03F2 03A3
+03F2 03F9
03F5 0395
+03F8 03F7
+03FB 03FA
0430 0410
0431 0411
0432 0412
@@ -842,4 +844,6 @@ FF5A FF3A
1044B 10423
1044C 10424
1044D 10425
+1044E 10426
+1044F 10427
END
diff --git a/gnu/usr.bin/perl/lib/unicore/UnicodeData.txt b/gnu/usr.bin/perl/lib/unicore/UnicodeData.txt
index 125a6920dc9..86ea1cf9f68 100644
--- a/gnu/usr.bin/perl/lib/unicore/UnicodeData.txt
+++ b/gnu/usr.bin/perl/lib/unicore/UnicodeData.txt
@@ -171,19 +171,19 @@
00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;;
00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;;
00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;;
-00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;;
+00AD;SOFT HYPHEN;Cf;0;ON;;;;;N;;;;;
00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;;
00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;;
00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;;
00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;;
-00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
-00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
+00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;;
00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C
00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;;
00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;;
00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;;
-00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
+00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;;
00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;;
00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;;
@@ -451,13 +451,13 @@
01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;;
01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;;
01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5
-01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;
+01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5
01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5
01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8
-01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;
+01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8
01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8
01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB
-01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;
+01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB
01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB
01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE;
01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD
@@ -496,7 +496,7 @@
01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE
01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;;
01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2
-01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;
+01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2
01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2
01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5;
01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4
@@ -543,6 +543,7 @@
021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F;
021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E
0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223;
0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222
0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225;
@@ -561,6 +562,9 @@
0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230
0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233;
0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;;
0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;;
0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;;
@@ -655,6 +659,8 @@
02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;;
02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK ;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;;
02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;;
02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;;
02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;;
@@ -664,8 +670,8 @@
02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;;
02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;;
02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;;
-02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;;
-02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;;
+02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;;
02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;;
02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;;
02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;;
@@ -677,16 +683,16 @@
02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
-02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
-02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
-02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;;
-02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;;
-02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
-02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
-02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;;
-02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;;
-02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
-02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
+02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;;
02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;;
02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;;
@@ -718,6 +724,23 @@
02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;;
02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;;
02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;;
0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;;
0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia, Tonos;;;
0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;;
@@ -798,6 +821,17 @@
034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;;
0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;;
0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;;
0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;;
@@ -924,11 +958,16 @@
03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE
03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A
03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1
-03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3
+03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9
03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450;
0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451;
0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452;
@@ -1359,7 +1398,20 @@
05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;;
05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;;
05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AL;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AL;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AL;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AL;;;;;N;;;;;
060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH ;Mn;230;NSM;;;;;N;;;;;
061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;;
@@ -1410,6 +1462,9 @@
0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;;
0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;;
0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;;
0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;;
0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;;
@@ -1552,6 +1607,8 @@
06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;;
06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;;
06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;;
06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;;
06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;;
@@ -1567,6 +1624,7 @@
06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;;
06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;;
0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;;
@@ -1611,6 +1669,9 @@
072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;;
072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;;
072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;;
0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;;
0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;;
0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;;
@@ -1638,6 +1699,9 @@
0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;;
0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;;
074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;;
0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;;
0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;;
@@ -1691,6 +1755,7 @@
0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;;
0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;;
0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;;
0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;;
@@ -1840,6 +1905,7 @@
09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;;
09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;;
09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
@@ -1881,7 +1947,9 @@
09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;;
09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;;
09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;;
0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;;
0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;;
0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;;
@@ -1966,6 +2034,7 @@
0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;;
0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;;
0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;;
0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;;
0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;;
0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;;
@@ -2024,6 +2093,9 @@
0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;;
0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;;
0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -2034,6 +2106,7 @@
0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;;
0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2078,6 +2151,7 @@
0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;;
0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;;
0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;;
+0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;;
0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;;
0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;;
0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;;
@@ -2113,6 +2187,7 @@
0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;;
0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;;
@@ -2174,6 +2249,14 @@
0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;;
0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;;
0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;;
0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;;
@@ -2305,14 +2388,16 @@
0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;;
0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;;
0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
-0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;;
0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;;
0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;;
0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;;
-0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;;
0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;;
0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;;
0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;;
@@ -4521,8 +4606,8 @@
17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;;
17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;;
17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;;
-17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;;
-17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;;
+17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;*;;;
+17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;*;;;
17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;;
17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;;
17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;;
@@ -4538,8 +4623,8 @@
17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;;
17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;;
17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;;
-17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;;
-17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;;
+17B4;KHMER VOWEL INHERENT AQ;Cf;0;L;;;;;N;;*;;;
+17B5;KHMER VOWEL INHERENT AA;Cf;0;L;;;;;N;;*;;;
17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;;
@@ -4569,16 +4654,17 @@
17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;;
17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;;
17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;;
-17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;;
+17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;*;;;
17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;;
17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;;
17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;;
17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;;
-17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;;
+17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;*;;;
17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;;
17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;;
17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;;
17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;;
17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -4589,6 +4675,16 @@
17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;;
1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;;
1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;;
1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;;
@@ -4603,7 +4699,7 @@
180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;;
180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
-180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;
1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -4744,6 +4840,247 @@
18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;;
18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;;
18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;NSM;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;NSM;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;NSM;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01;
1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00
1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03;
@@ -5306,6 +5643,8 @@
2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
@@ -5318,30 +5657,30 @@
206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;;
206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;;
-2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
+2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;;
2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;;
-2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
-2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
-2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
-2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
-2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
-2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET;<super> 002B;;;;N;;;;;
207B;SUPERSCRIPT MINUS;Sm;0;ET;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;;
207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;;
207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;;
207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;;
207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L;<super> 006E;;;;N;;;;;
-2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
-2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;;
-2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;;
-2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;;
-2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
-2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
-2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;;
-2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
-2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
-2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
208A;SUBSCRIPT PLUS SIGN;Sm;0;ET;<sub> 002B;;;;N;;;;;
208B;SUBSCRIPT MINUS;Sm;0;ET;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;;
208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;;
@@ -5451,6 +5790,7 @@
2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;;
2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;;
213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
@@ -6090,6 +6430,8 @@
23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;;
2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;;
2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;;
@@ -6299,6 +6641,7 @@
24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;;
2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;;
2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;;
2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;;
@@ -6575,6 +6918,8 @@
2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;;
2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;;
2613;SALTIRE;So;0;ON;;;;;N;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;;
@@ -6688,6 +7033,16 @@
2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;;
2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;;
@@ -7674,6 +8029,20 @@
2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
@@ -8487,6 +8856,8 @@
321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
@@ -8523,6 +8894,7 @@
3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;;
3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;;
3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
@@ -8566,6 +8938,8 @@
3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;;
327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;;
327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;;
3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;;
3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;;
@@ -8643,6 +9017,10 @@
32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;;
32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;;
32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;;
32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;;
32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;;
32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;;
@@ -8809,6 +9187,10 @@
3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;;
3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;;
3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;;
337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;;
337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;;
337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;;
@@ -8908,6 +9290,8 @@
33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;;
33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;;
33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;;
33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;;
33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;;
@@ -8939,8 +9323,73 @@
33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;;
33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;;
33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;;
+33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
+4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
+4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
+4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
9FA5;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
@@ -11186,6 +11635,7 @@ FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;
FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;;
FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
@@ -11229,6 +11679,8 @@ FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical>
FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;;
FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;;
FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;;
FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;;
@@ -11633,6 +12085,274 @@ FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;;
FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;;
FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
@@ -11695,6 +12415,37 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
@@ -11733,6 +12484,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
@@ -11771,6 +12524,151 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
@@ -12236,6 +13134,93 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
@@ -12418,6 +13403,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
@@ -13333,7 +14319,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
-2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;2136A;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
@@ -13345,7 +14331,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
-2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F33;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
@@ -13516,7 +14502,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
-2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;43AB;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
@@ -13580,7 +14566,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
-2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AAE;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
@@ -13676,7 +14662,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
-2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;4D57;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
@@ -13868,6 +14854,246 @@ E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;;
F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Alnum.pl b/gnu/usr.bin/perl/lib/unicore/lib/Alnum.pl
index 0ec13c55c44..023e84ca1be 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Alnum.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Alnum.pl
@@ -13,22 +13,17 @@ return <<'END';
0041 005A
0061 007A
00AA
-00B2 00B3
00B5
-00B9 00BA
-00BC 00BE
+00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
-0300 034F
-0360 036F
+0300 0357
+035D 036F
037A
0386
0388 038A
@@ -36,6 +31,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
0483 0486
0488 04CE
@@ -53,19 +49,19 @@ return <<'END';
05C4
05D0 05EA
05F0 05F2
+0610 0615
0621 063A
-0640 0655
+0640 0658
0660 0669
066E 06D3
06D5 06DC
06DE 06E8
-06EA 06ED
-06F0 06FC
-0710 072C
-0730 074A
+06EA 06FC
+06FF
+0710 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0963
@@ -77,16 +73,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
09DC 09DD
09DF 09E3
09E6 09F1
-09F4 09F9
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -102,8 +96,7 @@ return <<'END';
0A5E
0A66 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -113,7 +106,7 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0AE6 0AEF
0B01 0B03
0B05 0B0C
@@ -121,7 +114,7 @@ return <<'END';
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
@@ -129,6 +122,7 @@ return <<'END';
0B5C 0B5D
0B5F 0B61
0B66 0B6F
+0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -144,7 +138,7 @@ return <<'END';
0BC6 0BC8
0BCA 0BCD
0BD7
-0BE7 0BF2
+0BE7 0BEF
0C01 0C03
0C05 0C0C
0C0E 0C10
@@ -163,7 +157,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -215,7 +209,7 @@ return <<'END';
0EDC 0EDD
0F00
0F18 0F19
-0F20 0F33
+0F20 0F29
0F35
0F37
0F39
@@ -263,13 +257,12 @@ return <<'END';
1318 131E
1320 1346
1348 135A
-1369 137C
+1369 1371
13A0 13F4
1401 166C
166F 1676
1681 169A
16A0 16EA
-16EE 16F0
1700 170C
170E 1714
1720 1734
@@ -277,14 +270,21 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17D3
+1780 17B3
+17B6 17D3
17D7
-17DC
+17DC 17DD
17E0 17E9
180B 180D
1810 1819
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1946 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -306,9 +306,8 @@ return <<'END';
1FE0 1FEC
1FF2 1FF4
1FF6 1FFC
-2070 2071
-2074 2079
-207F 2089
+2071
+207F
20D0 20EA
2102
2107
@@ -323,14 +322,10 @@ return <<'END';
2133 2139
213D 213F
2145 2149
-2153 2183
-2460 249B
-24EA 24FE
-2776 2793
-3005 3007
-3021 302F
+3005 3006
+302A 302F
3031 3035
-3038 303C
+303B 303C
3041 3096
3099 309A
309D 309F
@@ -338,13 +333,8 @@ return <<'END';
30FC 30FF
3105 312C
3131 318E
-3192 3195
31A0 31B7
31F0 31FF
-3220 3229
-3251 325F
-3280 3289
-32B1 32BF
3400 4DB5
4E00 9FA5
A000 A48C
@@ -376,11 +366,24 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
-10320 10323
-10330 1034A
-10400 10425
-10428 1044D
+10330 10349
+10380 1039D
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D165 1D169
1D16D 1D172
1D17B 1D182
@@ -394,8 +397,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -420,4 +422,5 @@ FFDA FFDC
1D7CE 1D7FF
20000 2A6D6
2F800 2FA1D
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Alpha.pl b/gnu/usr.bin/perl/lib/unicore/lib/Alpha.pl
index 35b0e3280be..f0658785dc2 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Alpha.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Alpha.pl
@@ -16,16 +16,13 @@ return <<'END';
00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
-0300 034F
-0360 036F
+0300 0357
+035D 036F
037A
0386
0388 038A
@@ -33,6 +30,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
0483 0486
0488 04CE
@@ -50,18 +48,19 @@ return <<'END';
05C4
05D0 05EA
05F0 05F2
+0610 0615
0621 063A
-0640 0655
+0640 0658
066E 06D3
06D5 06DC
06DE 06E8
-06EA 06ED
+06EA 06EF
06FA 06FC
-0710 072C
-0730 074A
+06FF
+0710 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0963
@@ -72,15 +71,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
09DC 09DD
09DF 09E3
09F0 09F1
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -96,8 +94,7 @@ return <<'END';
0A5E
0A70 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -107,20 +104,21 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0B01 0B03
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
0B56 0B57
0B5C 0B5D
0B5F 0B61
+0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -153,7 +151,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -259,12 +257,19 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17D3
+1780 17B3
+17B6 17D3
17D7
-17DC
+17DC 17DD
180B 180D
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1950 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -345,10 +350,23 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
10330 10349
-10400 10425
-10428 1044D
+10380 1039D
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D165 1D169
1D16D 1D172
1D17B 1D182
@@ -362,8 +380,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -387,4 +404,5 @@ FFDA FFDC
1D7C4 1D7C9
20000 2A6D6
2F800 2FA1D
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Alphabet.pl b/gnu/usr.bin/perl/lib/unicore/lib/Alphabet.pl
index a909a31f000..e1cec172cc7 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Alphabet.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Alphabet.pl
@@ -16,12 +16,9 @@ return <<'END';
00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
0345
@@ -32,6 +29,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
048A 04CE
04D0 04F5
@@ -47,18 +45,19 @@ return <<'END';
05C4
05D0 05EA
05F0 05F2
+0610 0615
0621 063A
-0640 0655
+0640 0657
066E 06D3
06D5 06DC
06E1 06E8
-06ED
+06ED 06EF
06FA 06FC
-0710 072C
-0730 073F
+06FF
+0710 073F
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093D 094C
0950
0958 0963
@@ -69,14 +68,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BE 09C4
+09BD 09C4
09C7 09C8
09CB 09CC
09D7
09DC 09DD
09DF 09E3
09F0 09F1
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -91,8 +90,7 @@ return <<'END';
0A5E
0A70 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -102,20 +100,21 @@ return <<'END';
0AC7 0AC9
0ACB 0ACC
0AD0
-0AE0
+0AE0 0AE3
0B01 0B03
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3D 0B43
0B47 0B48
0B4B 0B4C
0B56 0B57
0B5C 0B5D
0B5F 0B61
+0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -148,7 +147,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBD 0CC4
0CC6 0CC8
0CCA 0CCC
0CD5 0CD6
@@ -251,11 +250,18 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17C8
+1780 17B3
+17B6 17C8
17D7
17DC
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 1938
+1950 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -332,10 +338,23 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -344,8 +363,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Arabic.pl b/gnu/usr.bin/perl/lib/unicore/lib/Arabic.pl
index ac5df6e8900..c2859e24302 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Arabic.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Arabic.pl
@@ -15,7 +15,9 @@ return <<'END';
0671 06D3 ARABIC
06D5 ARABIC
06E5 06E6 ARABIC
+06EE 06EF ARABIC
06FA 06FC ARABIC
+06FF ARABIC
FB50 FBB1 ARABIC
FBD3 FD3D ARABIC
FD50 FD8F ARABIC
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Assigned.pl b/gnu/usr.bin/perl/lib/unicore/lib/Assigned.pl
index 5bd9faffbd3..510be679225 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Assigned.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Assigned.pl
@@ -9,12 +9,9 @@
# Meaning: All assigned code points
#
return <<'END';
-0000 0220
-0222 0233
-0250 02AD
-02B0 02EE
-0300 034F
-0360 036F
+0000 0236
+0250 0357
+035D 036F
0374 0375
037A
037E
@@ -22,7 +19,7 @@ return <<'END';
038C
038E 03A1
03A3 03CE
-03D0 03F6
+03D0 03FB
0400 0486
0488 04CE
04D0 04F5
@@ -37,19 +34,17 @@ return <<'END';
05BB 05C4
05D0 05EA
05F0 05F4
-060C
+0600 0603
+060C 0615
061B
061F
0621 063A
-0640 0655
-0660 06ED
-06F0 06FE
-0700 070D
-070F 072C
-0730 074A
+0640 0658
+0660 070D
+070F 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0970
@@ -60,15 +55,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
09DC 09DD
09DF 09E3
09E6 09FA
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -84,8 +78,7 @@ return <<'END';
0A5E
0A66 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -95,22 +88,23 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0AE6 0AEF
+0AF1
0B01 0B03
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
0B56 0B57
0B5C 0B5D
0B5F 0B61
-0B66 0B70
+0B66 0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -126,7 +120,7 @@ return <<'END';
0BC6 0BC8
0BCA 0BCD
0BD7
-0BE7 0BF2
+0BE7 0BFA
0C01 0C03
0C05 0C0C
0C0E 0C10
@@ -145,7 +139,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -250,12 +244,21 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17DC
+1780 17DD
17E0 17E9
+17F0 17F9
1800 180E
1810 1819
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+19E0 19FF
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -274,24 +277,23 @@ return <<'END';
1FDD 1FEF
1FF2 1FF4
1FF6 1FFE
-2000 2052
+2000 2054
2057
205F 2063
206A 2071
2074 208E
20A0 20B1
20D0 20EA
-2100 213A
+2100 213B
213D 214B
2153 2183
-2190 23CE
+2190 23D0
2400 2426
2440 244A
-2460 24FE
-2500 2613
-2616 2617
+2460 2617
2619 267D
-2680 2689
+2680 2691
+26A0 26A1
2701 2704
2706 2709
270C 2727
@@ -304,7 +306,7 @@ return <<'END';
2798 27AF
27B1 27BE
27D0 27EB
-27F0 2AFF
+27F0 2B0D
2E80 2E99
2E9B 2EF3
2F00 2FD5
@@ -315,16 +317,12 @@ return <<'END';
3105 312C
3131 318E
3190 31B7
-31F0 321C
+31F0 321E
3220 3243
-3251 327B
-327F 32CB
-32D0 32FE
-3300 3376
-337B 33DD
-33E0 33FE
-3400 4DB5
-4E00 9FA5
+3250 327D
+327F 32FE
+3300 4DB5
+4DC0 9FA5
A000 A48C
A490 A4C6
AC00 D7A3
@@ -341,11 +339,10 @@ FB46 FBB1
FBD3 FD3F
FD50 FD8F
FD92 FDC7
-FDF0 FDFC
+FDF0 FDFD
FE00 FE0F
FE20 FE23
-FE30 FE46
-FE49 FE52
+FE30 FE52
FE54 FE66
FE68 FE6B
FE70 FE74
@@ -359,14 +356,33 @@ FFDA FFDC
FFE0 FFE6
FFE8 FFEE
FFF9 FFFD
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1013F
10300 1031E
10320 10323
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+1039F
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D000 1D0F5
1D100 1D126
1D12A 1D1DD
+1D300 1D356
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -375,8 +391,7 @@ FFF9 FFFD
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -393,6 +408,7 @@ FFF9 FFFD
2F800 2FA1D
E0001
E0020 E007F
+E0100 E01EF
F0000 FFFFD
100000 10FFFD
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Bengali.pl b/gnu/usr.bin/perl/lib/unicore/lib/Bengali.pl
index 5d2b9db5849..08a4f3e0fef 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Bengali.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Bengali.pl
@@ -16,8 +16,7 @@ return <<'END';
09AA 09B0 BENGALI
09B2 BENGALI
09B6 09B9 BENGALI
-09BC BENGALI
-09BE 09C4 BENGALI
+09BC 09C4 BENGALI
09C7 09C8 BENGALI
09CB 09CD BENGALI
09D7 BENGALI
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiAL.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiAL.pl
index 4149869f8bb..2c3500e8dd6 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiAL.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiAL.pl
@@ -9,6 +9,8 @@
# Meaning: Bi-directional category 'AL'
#
return <<'END';
+0600 0603
+060D
061B
061F
0621 063A
@@ -17,10 +19,11 @@ return <<'END';
0671 06D5
06DD
06E5 06E6
-06FA 06FE
-0700 070D
+06EE 06EF
+06FA 070D
0710
-0712 072C
+0712 072F
+074D 074F
0780 07A5
07B1
FB50 FBB1
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiBN.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiBN.pl
index b810db1e76c..0dfe3ba267d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiBN.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiBN.pl
@@ -14,7 +14,6 @@ return <<'END';
007F 0084
0086 009F
070F
-180E
200B 200D
2060 2063
206A 206F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiET.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiET.pl
index 234cf5ff590..50073b7488d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiET.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiET.pl
@@ -16,6 +16,8 @@ return <<'END';
00B0 00B1
066A
09F2 09F3
+0AF1
+0BF9
0E3F
17DB
2030 2034
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiL.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiL.pl
index f4033f28e46..a21fab5ea71 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiL.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiL.pl
@@ -16,10 +16,8 @@ return <<'END';
00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
+00F8 0236
+0250 02B8
02BB 02C1
02D0 02D1
02E0 02E4
@@ -31,6 +29,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0482
048A 04CE
04D0 04F5
@@ -40,8 +39,7 @@ return <<'END';
0559 055F
0561 0587
0589
-0903
-0905 0939
+0903 0939
093D 0940
0949 094C
0950
@@ -54,7 +52,7 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BE 09C0
+09BD 09C0
09C7 09C8
09CB 09CC
09D7
@@ -62,6 +60,7 @@ return <<'END';
09DF 09E1
09E6 09F1
09F4 09FA
+0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -75,8 +74,7 @@ return <<'END';
0A66 0A6F
0A72 0A74
0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -86,7 +84,7 @@ return <<'END';
0AC9
0ACB 0ACC
0AD0
-0AE0
+0AE0 0AE1
0AE6 0AEF
0B02 0B03
0B05 0B0C
@@ -94,7 +92,7 @@ return <<'END';
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3D 0B3E
0B40
0B47 0B48
@@ -102,7 +100,7 @@ return <<'END';
0B57
0B5C 0B5D
0B5F 0B61
-0B66 0B70
+0B66 0B71
0B83
0B85 0B8A
0B8E 0B90
@@ -135,9 +133,8 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE
-0CC0 0CC4
-0CC7 0CC8
+0CBD 0CC4
+0CC6 0CC8
0CCA 0CCB
0CD5 0CD6
0CDE
@@ -256,6 +253,13 @@ return <<'END';
1810 1819
1820 1877
1880 18A8
+1900 191C
+1923 1926
+1930 1931
+1933 1938
+1946 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -329,11 +333,24 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100
+10102
+10107 10133
+10137 1013F
10300 1031E
10320 10323
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+1039F
+10400 1049D
+104A0 104A9
1D000 1D0F5
1D100 1D126
1D12A 1D166
@@ -349,8 +366,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiNSM.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiNSM.pl
index 7e2f4b10820..6387c7a1568 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiNSM.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiNSM.pl
@@ -9,8 +9,8 @@
# Meaning: Bi-directional category 'NSM'
#
return <<'END';
-0300 034F
-0360 036F
+0300 0357
+035D 036F
0483 0486
0488 0489
0591 05A1
@@ -19,7 +19,8 @@ return <<'END';
05BF
05C1 05C2
05C4
-064B 0655
+0610 0615
+064B 0658
0670
06D6 06DC
06DE 06E4
@@ -39,7 +40,7 @@ return <<'END';
09C1 09C4
09CD
09E2 09E3
-0A02
+0A01 0A02
0A3C
0A41 0A42
0A47 0A48
@@ -50,6 +51,7 @@ return <<'END';
0AC1 0AC5
0AC7 0AC8
0ACD
+0AE2 0AE3
0B01
0B3C
0B3F
@@ -63,8 +65,7 @@ return <<'END';
0C46 0C48
0C4A 0C4D
0C55 0C56
-0CBF
-0CC6
+0CBC
0CCC 0CCD
0D41 0D43
0D4D
@@ -100,8 +101,13 @@ return <<'END';
17B7 17BD
17C6
17C9 17D3
+17DD
180B 180D
18A9
+1920 1922
+1927 192B
+1932
+1939 193B
20D0 20EA
302A 302F
3099 309A
@@ -112,4 +118,5 @@ FE20 FE23
1D17B 1D182
1D185 1D18B
1D1AA 1D1AD
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiON.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiON.pl
index 7fe891ebad3..5ad57f4a760 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiON.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiON.pl
@@ -26,16 +26,24 @@ return <<'END';
02C2 02CF
02D2 02DF
02E5 02ED
+02EF 02FF
0374 0375
037E
0384 0385
0387
03F6
058A
+060E 060F
06E9
+0BF3 0BF8
+0BFA
0F3A 0F3D
169B 169C
+17F0 17F9
1800 180A
+1940
+1944 1945
+19E0 19FF
1FBD
1FBF 1FC1
1FCD 1FCF
@@ -43,7 +51,7 @@ return <<'END';
1FED 1FEF
1FFD 1FFE
2010 2027
-2035 2052
+2035 2054
2057
207C 207E
208C 208E
@@ -57,21 +65,20 @@ return <<'END';
2127
2129
2132
-213A
+213A 213B
2140 2144
214A 214B
2153 215F
2190 2211
2214 2335
237B 2394
-2396 23CE
+2396 23D0
2400 2426
2440 244A
-24EB 24FE
-2500 2613
-2616 2617
+24EB 2617
2619 267D
-2680 2689
+2680 2691
+26A0 26A1
2701 2704
2706 2709
270C 2727
@@ -84,7 +91,7 @@ return <<'END';
2798 27AF
27B1 27BE
27D0 27EB
-27F0 2AFF
+27F0 2B0D
2E80 2E99
2E9B 2EF3
2F00 2FD5
@@ -97,12 +104,19 @@ return <<'END';
309B 309C
30A0
30FB
-3251 325F
+321D 321E
+3250 325F
+327C 327D
32B1 32BF
+32CC 32CF
+3377 337A
+33DE 33DF
+33FF
+4DC0 4DFF
A490 A4C6
FD3E FD3F
-FE30 FE46
-FE49 FE4F
+FDFD
+FE30 FE4F
FE51
FE54
FE56 FE5E
@@ -118,4 +132,6 @@ FF5B FF65
FFE2 FFE4
FFE8 FFEE
FFFC FFFD
+10101
+1D300 1D356
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiR.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiR.pl
index 4d62027f26b..375b0713fbf 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiR.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiR.pl
@@ -23,4 +23,10 @@ FB3E
FB40 FB41
FB43 FB44
FB46 FB4F
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/BidiWS.pl b/gnu/usr.bin/perl/lib/unicore/lib/BidiWS.pl
index 11896597aea..427c73d414f 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/BidiWS.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/BidiWS.pl
@@ -12,6 +12,7 @@ return <<'END';
000C
0020
1680
+180E
2000 200A
2028
202F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Blank.pl b/gnu/usr.bin/perl/lib/unicore/lib/Blank.pl
index 96498cb22fe..639ccf4c165 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Blank.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Blank.pl
@@ -13,7 +13,8 @@ return <<'END';
0020
00A0
1680
-2000 200B
+180E
+2000 200A
202F
205F
3000
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Braille.pl b/gnu/usr.bin/perl/lib/unicore/lib/Braille.pl
new file mode 100644
index 00000000000..dfa506a1ffe
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Braille.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{Braille} (and fuzzy permutations)
+#
+# Meaning: Script 'BRAILLE'
+#
+return <<'END';
+2800 28FF BRAILLE
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/C.pl b/gnu/usr.bin/perl/lib/unicore/lib/C.pl
index bbe5b39e482..52c3f44a7e2 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/C.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/C.pl
@@ -12,11 +12,9 @@
return <<'END';
0000 001F
007F 009F
-0221
-0234 024F
-02AE 02AF
-02EF 02FF
-0350 035F
+00AD
+0237 024F
+0358 035C
0370 0373
0376 0379
037B 037D
@@ -25,7 +23,7 @@ return <<'END';
038D
03A2
03CF
-03F7 03FF
+03FC 03FF
0487
04CF
04F6 04F7
@@ -40,19 +38,16 @@ return <<'END';
05C5 05CF
05EB 05EF
05F5 060B
-060D 061A
+0616 061A
061C 061E
0620
063B 063F
-0656 065F
+0659 065F
06DD
-06EE 06EF
-06FF
070E 070F
-072D 072F
-074B 077F
+074B 074C
+0750 077F
07B2 0900
-0904
093A 093B
094E 094F
0955 0957
@@ -64,15 +59,14 @@ return <<'END';
09B1
09B3 09B5
09BA 09BB
-09BD
09C5 09C6
09C9 09CA
09CE 09D6
09D8 09DB
09DE
09E4 09E5
-09FB 0A01
-0A03 0A04
+09FB 0A00
+0A04
0A0B 0A0E
0A11 0A12
0A29
@@ -88,7 +82,6 @@ return <<'END';
0A5F 0A65
0A75 0A80
0A84
-0A8C
0A8E
0A92
0AA9
@@ -99,14 +92,15 @@ return <<'END';
0ACA
0ACE 0ACF
0AD1 0ADF
-0AE1 0AE5
-0AF0 0B00
+0AE4 0AE5
+0AF0
+0AF2 0B00
0B04
0B0D 0B0E
0B11 0B12
0B29
0B31
-0B34 0B35
+0B34
0B3A 0B3B
0B44 0B46
0B49 0B4A
@@ -114,7 +108,7 @@ return <<'END';
0B58 0B5B
0B5E
0B62 0B65
-0B71 0B81
+0B72 0B81
0B84
0B8B 0B8D
0B91
@@ -130,7 +124,7 @@ return <<'END';
0BC9
0BCE 0BD6
0BD8 0BE6
-0BF3 0C00
+0BFB 0C00
0C04
0C0D
0C11
@@ -148,7 +142,7 @@ return <<'END';
0C91
0CA9
0CB4
-0CBA 0CBD
+0CBA 0CBB
0CC5
0CC9
0CCE 0CD4
@@ -254,12 +248,22 @@ return <<'END';
176D
1771
1774 177F
-17DD 17DF
-17EA 17FF
-180E 180F
+17B4 17B5
+17DE 17DF
+17EA 17EF
+17FA 17FF
+180F
181A 181F
1878 187F
-18AA 1DFF
+18AA 18FF
+191D 191F
+192C 192F
+193C 193F
+1941 1943
+196E 196F
+1975 19DF
+1A00 1CFF
+1D6C 1DFF
1E9C 1E9F
1EFA 1EFF
1F16 1F17
@@ -280,24 +284,23 @@ return <<'END';
1FFF
200C 200F
202A 202E
-2053 2056
+2055 2056
2058 205E
2060 206F
2072 2073
208F 209F
20B2 20CF
20EB 20FF
-213B 213C
+213C
214C 2152
2184 218F
-23CF 23FF
+23D1 23FF
2427 243F
244B 245F
-24FF
-2614 2615
2618
267E 267F
-268A 2700
+2692 269F
+26A2 2700
2705
270A 270B
2728
@@ -310,7 +313,7 @@ return <<'END';
27B0
27BF 27CF
27EC 27EF
-2B00 2E7F
+2B0E 2E7F
2E9A
2EF4 2EFF
2FD6 2FEF
@@ -321,15 +324,11 @@ return <<'END';
312D 3130
318F
31B8 31EF
-321D 321F
-3244 3250
-327C 327E
-32CC 32CF
+321F
+3244 324F
+327E
32FF
-3377 337A
-33DE 33DF
-33FF
-4DB6 4DFF
+4DB6 4DBF
9FA6 9FFF
A48D A48F
A4C7 ABFF
@@ -347,10 +346,9 @@ FBB2 FBD2
FD40 FD4F
FD90 FD91
FDC8 FDEF
-FDFD FDFF
+FDFE FDFF
FE10 FE1F
FE24 FE2F
-FE47 FE48
FE53
FE67
FE6C FE6F
@@ -363,16 +361,35 @@ FFD8 FFD9
FFDD FFDF
FFE7
FFEF FFFB
-FFFE 102FF
+FFFE FFFF
+1000C
+10027
+1003B
+1003E
+1004E 1004F
+1005E 1007F
+100FB 100FF
+10103 10106
+10134 10136
+10140 102FF
1031F
10324 1032F
-1034B 103FF
-10426 10427
-1044E 1CFFF
+1034B 1037F
+1039E
+103A0 103FF
+1049E 1049F
+104AA 107FF
+10806 10807
+10809
+10836
+10839 1083B
+1083D 1083E
+10840 1CFFF
1D0F6 1D0FF
1D127 1D129
1D173 1D17A
-1D1DE 1D3FF
+1D1DE 1D2FF
+1D357 1D3FF
1D455
1D49D
1D4A0 1D4A1
@@ -381,7 +398,6 @@ FFFE 102FF
1D4AD
1D4BA
1D4BC
-1D4C1
1D4C4
1D506
1D50B 1D50C
@@ -396,5 +412,6 @@ FFFE 102FF
1D7CA 1D7CD
1D800 1FFFF
2A6D7 2F7FF
-2FA1E 10FFFF
+2FA1E E00FF
+E01F0 10FFFF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Cf.pl b/gnu/usr.bin/perl/lib/unicore/lib/Cf.pl
index 9012824ee45..8e1c32427ec 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Cf.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Cf.pl
@@ -10,9 +10,11 @@
# Meaning: General Category 'Cf'
#
return <<'END';
+00AD
+0600 0603
06DD
070F
-180E
+17B4 17B5
200C 200F
202A 202E
2060 2063
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Cn.pl b/gnu/usr.bin/perl/lib/unicore/lib/Cn.pl
index c080d192302..0402eca8954 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Cn.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Cn.pl
@@ -10,11 +10,8 @@
# Meaning: General Category 'Cn' [not functional in Perl]
#
return <<'END';
-0221
-0234 024F
-02AE 02AF
-02EF 02FF
-0350 035F
+0237 024F
+0358 035C
0370 0373
0376 0379
037B 037D
@@ -23,7 +20,7 @@ return <<'END';
038D
03A2
03CF
-03F7 03FF
+03FC 03FF
0487
04CF
04F6 04F7
@@ -37,19 +34,17 @@ return <<'END';
05BA
05C5 05CF
05EB 05EF
-05F5 060B
-060D 061A
+05F5 05FF
+0604 060B
+0616 061A
061C 061E
0620
063B 063F
-0656 065F
-06EE 06EF
-06FF
+0659 065F
070E
-072D 072F
-074B 077F
+074B 074C
+0750 077F
07B2 0900
-0904
093A 093B
094E 094F
0955 0957
@@ -61,15 +56,14 @@ return <<'END';
09B1
09B3 09B5
09BA 09BB
-09BD
09C5 09C6
09C9 09CA
09CE 09D6
09D8 09DB
09DE
09E4 09E5
-09FB 0A01
-0A03 0A04
+09FB 0A00
+0A04
0A0B 0A0E
0A11 0A12
0A29
@@ -85,7 +79,6 @@ return <<'END';
0A5F 0A65
0A75 0A80
0A84
-0A8C
0A8E
0A92
0AA9
@@ -96,14 +89,15 @@ return <<'END';
0ACA
0ACE 0ACF
0AD1 0ADF
-0AE1 0AE5
-0AF0 0B00
+0AE4 0AE5
+0AF0
+0AF2 0B00
0B04
0B0D 0B0E
0B11 0B12
0B29
0B31
-0B34 0B35
+0B34
0B3A 0B3B
0B44 0B46
0B49 0B4A
@@ -111,7 +105,7 @@ return <<'END';
0B58 0B5B
0B5E
0B62 0B65
-0B71 0B81
+0B72 0B81
0B84
0B8B 0B8D
0B91
@@ -127,7 +121,7 @@ return <<'END';
0BC9
0BCE 0BD6
0BD8 0BE6
-0BF3 0C00
+0BFB 0C00
0C04
0C0D
0C11
@@ -145,7 +139,7 @@ return <<'END';
0C91
0CA9
0CB4
-0CBA 0CBD
+0CBA 0CBB
0CC5
0CC9
0CCE 0CD4
@@ -251,12 +245,21 @@ return <<'END';
176D
1771
1774 177F
-17DD 17DF
-17EA 17FF
+17DE 17DF
+17EA 17EF
+17FA 17FF
180F
181A 181F
1878 187F
-18AA 1DFF
+18AA 18FF
+191D 191F
+192C 192F
+193C 193F
+1941 1943
+196E 196F
+1975 19DF
+1A00 1CFF
+1D6C 1DFF
1E9C 1E9F
1EFA 1EFF
1F16 1F17
@@ -275,24 +278,23 @@ return <<'END';
1FF0 1FF1
1FF5
1FFF
-2053 2056
+2055 2056
2058 205E
2064 2069
2072 2073
208F 209F
20B2 20CF
20EB 20FF
-213B 213C
+213C
214C 2152
2184 218F
-23CF 23FF
+23D1 23FF
2427 243F
244B 245F
-24FF
-2614 2615
2618
267E 267F
-268A 2700
+2692 269F
+26A2 2700
2705
270A 270B
2728
@@ -305,7 +307,7 @@ return <<'END';
27B0
27BF 27CF
27EC 27EF
-2B00 2E7F
+2B0E 2E7F
2E9A
2EF4 2EFF
2FD6 2FEF
@@ -316,15 +318,11 @@ return <<'END';
312D 3130
318F
31B8 31EF
-321D 321F
-3244 3250
-327C 327E
-32CC 32CF
+321F
+3244 324F
+327E
32FF
-3377 337A
-33DE 33DF
-33FF
-4DB6 4DFF
+4DB6 4DBF
9FA6 9FFF
A48D A48F
A4C7 ABFF
@@ -342,10 +340,9 @@ FBB2 FBD2
FD40 FD4F
FD90 FD91
FDC8 FDEF
-FDFD FDFF
+FDFE FDFF
FE10 FE1F
FE24 FE2F
-FE47 FE48
FE53
FE67
FE6C FE6F
@@ -359,15 +356,34 @@ FFD8 FFD9
FFDD FFDF
FFE7
FFEF FFF8
-FFFE 102FF
+FFFE FFFF
+1000C
+10027
+1003B
+1003E
+1004E 1004F
+1005E 1007F
+100FB 100FF
+10103 10106
+10134 10136
+10140 102FF
1031F
10324 1032F
-1034B 103FF
-10426 10427
-1044E 1CFFF
+1034B 1037F
+1039E
+103A0 103FF
+1049E 1049F
+104AA 107FF
+10806 10807
+10809
+10836
+10839 1083B
+1083D 1083E
+10840 1CFFF
1D0F6 1D0FF
1D127 1D129
-1D1DE 1D3FF
+1D1DE 1D2FF
+1D357 1D3FF
1D455
1D49D
1D4A0 1D4A1
@@ -376,7 +392,6 @@ FFFE 102FF
1D4AD
1D4BA
1D4BC
-1D4C1
1D4C4
1D506
1D50B 1D50C
@@ -393,7 +408,8 @@ FFFE 102FF
2A6D7 2F7FF
2FA1E E0000
E0002 E001F
-E0080 EFFFF
+E0080 E00FF
+E01F0 EFFFF
FFFFE FFFFF
10FFFE 10FFFF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Cntrl.pl b/gnu/usr.bin/perl/lib/unicore/lib/Cntrl.pl
index b794776699b..c1db31ae152 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Cntrl.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Cntrl.pl
@@ -11,9 +11,11 @@
return <<'END';
0000 001F
007F 009F
+00AD
+0600 0603
06DD
070F
-180E
+17B4 17B5
200C 200F
202A 202E
2060 2063
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Common.pl b/gnu/usr.bin/perl/lib/unicore/lib/Common.pl
index 677d38e8bf2..92b42ee425d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Common.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Common.pl
@@ -17,9 +17,7 @@ return <<'END';
00BB 00BF
00D7
00F7
-0221
-0234 024F
-02AE 02AF
+0237 024F
02B9 02DF
02E5 02FF
0350 035F
@@ -30,7 +28,8 @@ return <<'END';
038D
03A2
03CF
-03F6 03FF
+03F6
+03FC 03FF
0482
0487
04CF
@@ -52,12 +51,12 @@ return <<'END';
0656 066D
06D4
06E9
-06EE 06F9
-06FD 070F
-072D 072F
-074B 077F
+06F0 06F9
+06FD 06FE
+0700 070F
+074B 074C
+0750 077F
07B2 0900
-0904
093A 093B
094E 094F
0955 0957
@@ -70,7 +69,6 @@ return <<'END';
09B1
09B3 09B5
09BA 09BB
-09BD
09C5 09C6
09C9 09CA
09CE 09D6
@@ -78,7 +76,7 @@ return <<'END';
09DE
09E4 09E5
09F2 0A01
-0A03 0A04
+0A04
0A0B 0A0E
0A11 0A12
0A29
@@ -94,7 +92,6 @@ return <<'END';
0A5F 0A65
0A75 0A80
0A84
-0A8C
0A8E
0A92
0AA9
@@ -105,14 +102,14 @@ return <<'END';
0ACA
0ACE 0ACF
0AD1 0ADF
-0AE1 0AE5
+0AE4 0AE5
0AF0 0B00
0B04
0B0D 0B0E
0B11 0B12
0B29
0B31
-0B34 0B35
+0B34
0B3A 0B3B
0B44 0B46
0B49 0B4A
@@ -120,7 +117,8 @@ return <<'END';
0B58 0B5B
0B5E
0B62 0B65
-0B70 0B81
+0B70
+0B72 0B81
0B84
0B8B 0B8D
0B91
@@ -154,7 +152,7 @@ return <<'END';
0C91
0CA9
0CB4
-0CBA 0CBD
+0CBA 0CBC
0CC5
0CC9
0CCE 0CD4
@@ -274,7 +272,13 @@ return <<'END';
180E 180F
181A 181F
1878 187F
-18AA 1DFF
+18AA 18FF
+191D 191F
+192C 192F
+193C 1945
+196E 196F
+1975 1CFF
+1D6C 1DFF
1E9C 1E9F
1EFA 1EFF
1F16 1F17
@@ -300,7 +304,8 @@ return <<'END';
2080 20CF
20EB 2125
2127 2129
-212C 2E7F
+212C 27FF
+2900 2E7F
2E9A
2EF4 2EFF
2FD6 3004
@@ -320,10 +325,6 @@ return <<'END';
4DB6 4DFF
9FA6 9FFF
A48D A48F
-A4A2 A4A3
-A4B4
-A4C1
-A4C5
A4C7 ABFF
D7A4 F8FF
FA2E FA2F
@@ -353,11 +354,25 @@ FFBF FFC1
FFC8 FFC9
FFD0 FFD1
FFD8 FFD9
-FFDD 102FF
+FFDD FFFF
+1000C
+10027
+1003B
+1003E
+1004E 1004F
+1005E 1007F
+100FB 102FF
1031F 1032F
-1034B 103FF
-10426 10427
-1044E 1D166
+1034B 1037F
+1039E 103FF
+1049E 1049F
+104AA 107FF
+10806 10807
+10809
+10836
+10839 1083B
+1083D 1083E
+10840 1D166
1D16A 1D17A
1D183 1D184
1D18C 1D1A9
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Compat.pl b/gnu/usr.bin/perl/lib/unicore/lib/Compat.pl
index 12806f13605..fd0ea6a0208 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Compat.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Compat.pl
@@ -31,6 +31,7 @@ return <<'END';
03D5 03D6
03F0 03F2
03F4 03F5
+03F9
0587
0675 0678
0E33
@@ -39,6 +40,10 @@ return <<'END';
0F0C
0F77
0F79
+1D2C 1D2E
+1D30 1D3A
+1D3C 1D4D
+1D4F 1D6A
1E9A
1FBD
1FBF 1FC0
@@ -69,6 +74,7 @@ return <<'END';
212C 212D
212F 2131
2133 2139
+213B
213D 2140
2145 2149
2153 217F
@@ -88,14 +94,11 @@ return <<'END';
30FF
3131 318E
3192 319F
-3200 321C
+3200 321E
3220 3243
-3251 327B
-3280 32CB
-32D0 32FE
-3300 3376
-337B 33DD
-33E0 33FE
+3250 327D
+3280 32FE
+3300 33FF
FB00 FB06
FB13 FB17
FB20 FB29
@@ -105,7 +108,7 @@ FD50 FD8F
FD92 FDC7
FDF0 FDFC
FE30 FE44
-FE49 FE52
+FE47 FE52
FE54 FE66
FE68 FE6B
FE70 FE72
@@ -126,8 +129,7 @@ FFE8 FFEE
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Cypriot.pl b/gnu/usr.bin/perl/lib/unicore/lib/Cypriot.pl
new file mode 100644
index 00000000000..4e43cf49374
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Cypriot.pl
@@ -0,0 +1,18 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{Cypriot} (and fuzzy permutations)
+#
+# Meaning: Script 'CYPRIOT'
+#
+return <<'END';
+10800 10805 CYPRIOT
+10808 CYPRIOT
+1080A 10835 CYPRIOT
+10837 10838 CYPRIOT
+1083C CYPRIOT
+1083F CYPRIOT
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Cyrillic.pl b/gnu/usr.bin/perl/lib/unicore/lib/Cyrillic.pl
index 690e2f7a9ef..73f6726604e 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Cyrillic.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Cyrillic.pl
@@ -15,4 +15,5 @@ return <<'END';
04D0 04F5 CYRILLIC
04F8 04F9 CYRILLIC
0500 050F CYRILLIC
+1D2B CYRILLIC
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCcircle.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCcircle.pl
index b873609a4de..7a3092a9588 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCcircle.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCcircle.pl
@@ -11,7 +11,7 @@
return <<'END';
2460 2473
24B6 24EA
-3251 327B
+3251 327D
3280 32BF
32D0 32FE
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCcompat.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCcompat.pl
index a35aaa9da3c..5ffa762fbab 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCcompat.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCcompat.pl
@@ -26,6 +26,7 @@ return <<'END';
03D5 03D6
03F0 03F2
03F4 03F5
+03F9
0587
0675 0678
0E33
@@ -56,6 +57,7 @@ return <<'END';
2116
2121
2135 2138
+213B
2160 217F
222C 222D
222F 2230
@@ -69,7 +71,7 @@ return <<'END';
3038 303A
309B 309C
3131 318E
-3200 321C
+3200 321E
3220 3243
32C0 32CB
3358 3370
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCfont.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCfont.pl
index 30b94d1aeb5..d74ddb444aa 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCfont.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCfont.pl
@@ -30,8 +30,7 @@ FB20 FB29
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCsquare.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCsquare.pl
index 28d4f64d7b6..107a6ccfd04 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCsquare.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCsquare.pl
@@ -9,7 +9,9 @@
# Meaning: Compatible with 'square'
#
return <<'END';
+3250
+32CC 32CF
3300 3357
-3371 3376
-337B 33DD
+3371 33DF
+33FF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCsub.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCsub.pl
index df3daf6bb0a..b98dfe6c99a 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCsub.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCsub.pl
@@ -9,5 +9,6 @@
# Meaning: Compatible with 'sub'
#
return <<'END';
+1D62 1D6A
2080 208E
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCsuper.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCsuper.pl
index a11ac2dcb96..7bb776c4576 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCsuper.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCsuper.pl
@@ -14,6 +14,10 @@ return <<'END';
00B9 00BA
02B0 02B8
02E0 02E4
+1D2C 1D2E
+1D30 1D3A
+1D3C 1D4D
+1D4F 1D61
2070 2071
2074 207F
2120
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/DCvertic.pl b/gnu/usr.bin/perl/lib/unicore/lib/DCvertic.pl
index d7928e562f3..e8f2106ac80 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/DCvertic.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/DCvertic.pl
@@ -12,4 +12,5 @@ return <<'END';
309F
30FF
FE30 FE44
+FE47 FE48
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Dash.pl b/gnu/usr.bin/perl/lib/unicore/lib/Dash.pl
index 3d4dd59b7b0..db932f6f881 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Dash.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Dash.pl
@@ -10,10 +10,10 @@
#
return <<'END';
002D Dash
-00AD Dash
058A Dash
1806 Dash
2010 2015 Dash
+2053 Dash
207B Dash
208B Dash
2212 Dash
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Deprecat.pl b/gnu/usr.bin/perl/lib/unicore/lib/Deprecat.pl
index 1866c6c2da6..b4eecc01431 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Deprecat.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Deprecat.pl
@@ -10,5 +10,7 @@
#
return <<'END';
0340 0341 Deprecated
+17A3 Deprecated
+17D3 Deprecated
206A 206F Deprecated
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Deseret.pl b/gnu/usr.bin/perl/lib/unicore/lib/Deseret.pl
index 20431e628f8..9111e084cc8 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Deseret.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Deseret.pl
@@ -9,6 +9,5 @@
# Meaning: Script 'DESERET'
#
return <<'END';
-10400 10425 DESERET
-10428 1044D DESERET
+10400 1044F DESERET
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Devanaga.pl b/gnu/usr.bin/perl/lib/unicore/lib/Devanaga.pl
index d35fc083127..12f6a9d302a 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Devanaga.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Devanaga.pl
@@ -9,8 +9,7 @@
# Meaning: Script 'DEVANAGARI'
#
return <<'END';
-0901 0903 DEVANAGARI
-0905 0939 DEVANAGARI
+0901 0939 DEVANAGARI
093C 094D DEVANAGARI
0950 0954 DEVANAGARI
0958 0963 DEVANAGARI
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Diacriti.pl b/gnu/usr.bin/perl/lib/unicore/lib/Diacriti.pl
index e22111672b7..8d331ef8bac 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Diacriti.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Diacriti.pl
@@ -15,9 +15,9 @@ return <<'END';
00AF Diacritic
00B4 Diacritic
00B7 00B8 Diacritic
-02B0 02EE Diacritic
-0300 034E Diacritic
-0360 0362 Diacritic
+02B0 034E Diacritic
+0350 0357 Diacritic
+035D 0362 Diacritic
0374 0375 Diacritic
037A Diacritic
0384 0385 Diacritic
@@ -30,6 +30,7 @@ return <<'END';
05C1 05C2 Diacritic
05C4 Diacritic
064B 0652 Diacritic
+0657 0658 Diacritic
06DF 06E0 Diacritic
06E5 06E6 Diacritic
06EA 06EC Diacritic
@@ -48,6 +49,7 @@ return <<'END';
0B4D Diacritic
0BCD Diacritic
0C4D Diacritic
+0CBC Diacritic
0CCD Diacritic
0D4D Diacritic
0DCA Diacritic
@@ -65,6 +67,9 @@ return <<'END';
1037 Diacritic
1039 Diacritic
17C9 17D3 Diacritic
+17DD Diacritic
+1939 193B Diacritic
+1D2C 1D6A Diacritic
1FBD Diacritic
1FBF 1FC1 Diacritic
1FCD 1FCF Diacritic
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Digit.pl b/gnu/usr.bin/perl/lib/unicore/lib/Digit.pl
index 3a8c507ae73..bf992c78e7a 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Digit.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Digit.pl
@@ -28,6 +28,8 @@ return <<'END';
1369 1371
17E0 17E9
1810 1819
+1946 194F
FF10 FF19
+104A0 104A9
1D7CE 1D7FF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Graph.pl b/gnu/usr.bin/perl/lib/unicore/lib/Graph.pl
index e3e98b518dc..79ef3dbb0bf 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Graph.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Graph.pl
@@ -10,12 +10,9 @@
#
return <<'END';
0021 007E
-00A1 0220
-0222 0233
-0250 02AD
-02B0 02EE
-0300 034F
-0360 036F
+00A1 0236
+0250 0357
+035D 036F
0374 0375
037A
037E
@@ -23,7 +20,7 @@ return <<'END';
038C
038E 03A1
03A3 03CE
-03D0 03F6
+03D0 03FB
0400 0486
0488 04CE
04D0 04F5
@@ -38,20 +35,17 @@ return <<'END';
05BB 05C4
05D0 05EA
05F0 05F4
-060C
+0600 0603
+060C 0615
061B
061F
0621 063A
-0640 0655
-0660 06DC
-06DE 06ED
-06F0 06FE
-0700 070D
-0710 072C
-0730 074A
+0640 0658
+0660 070D
+070F 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0970
@@ -62,15 +56,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
09DC 09DD
09DF 09E3
09E6 09FA
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -86,8 +79,7 @@ return <<'END';
0A5E
0A66 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -97,22 +89,23 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0AE6 0AEF
+0AF1
0B01 0B03
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
0B56 0B57
0B5C 0B5D
0B5F 0B61
-0B66 0B70
+0B66 0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -128,7 +121,7 @@ return <<'END';
0BC6 0BC8
0BCA 0BCD
0BD7
-0BE7 0BF2
+0BE7 0BFA
0C01 0C03
0C05 0C0C
0C0E 0C10
@@ -147,7 +140,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -252,12 +245,21 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17DC
+1780 17DD
17E0 17E9
+17F0 17F9
1800 180D
1810 1819
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+19E0 19FF
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -276,24 +278,25 @@ return <<'END';
1FDD 1FEF
1FF2 1FF4
1FF6 1FFE
-2010 2027
-2030 2052
+200B 2027
+202A 202E
+2030 2054
2057
-2070 2071
+2060 2063
+206A 2071
2074 208E
20A0 20B1
20D0 20EA
-2100 213A
+2100 213B
213D 214B
2153 2183
-2190 23CE
+2190 23D0
2400 2426
2440 244A
-2460 24FE
-2500 2613
-2616 2617
+2460 2617
2619 267D
-2680 2689
+2680 2691
+26A0 26A1
2701 2704
2706 2709
270C 2727
@@ -306,7 +309,7 @@ return <<'END';
2798 27AF
27B1 27BE
27D0 27EB
-27F0 2AFF
+27F0 2B0D
2E80 2E99
2E9B 2EF3
2F00 2FD5
@@ -317,16 +320,12 @@ return <<'END';
3105 312C
3131 318E
3190 31B7
-31F0 321C
+31F0 321E
3220 3243
-3251 327B
-327F 32CB
-32D0 32FE
-3300 3376
-337B 33DD
-33E0 33FE
-3400 4DB5
-4E00 9FA5
+3250 327D
+327F 32FE
+3300 4DB5
+4DC0 9FA5
A000 A48C
A490 A4C6
AC00 D7A3
@@ -343,15 +342,15 @@ FB46 FBB1
FBD3 FD3F
FD50 FD8F
FD92 FDC7
-FDF0 FDFC
+FDF0 FDFD
FE00 FE0F
FE20 FE23
-FE30 FE46
-FE49 FE52
+FE30 FE52
FE54 FE66
FE68 FE6B
FE70 FE74
FE76 FEFC
+FEFF
FF01 FFBE
FFC2 FFC7
FFCA FFCF
@@ -359,16 +358,34 @@ FFD2 FFD7
FFDA FFDC
FFE0 FFE6
FFE8 FFEE
-FFFC FFFD
+FFF9 FFFD
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1013F
10300 1031E
10320 10323
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+1039F
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D000 1D0F5
1D100 1D126
-1D12A 1D172
-1D17B 1D1DD
+1D12A 1D1DD
+1D300 1D356
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -377,8 +394,7 @@ FFFC FFFD
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -393,6 +409,9 @@ FFFC FFFD
1D7CE 1D7FF
20000 2A6D6
2F800 2FA1D
+E0001
+E0020 E007F
+E0100 E01EF
F0000 FFFFD
100000 10FFFD
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Grapheme.pl b/gnu/usr.bin/perl/lib/unicore/lib/Grapheme.pl
index dc2183abb46..bbe95ba1c56 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Grapheme.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Grapheme.pl
@@ -9,6 +9,7 @@
# Meaning: Extended property 'Grapheme_Link'
#
return <<'END';
+034F Grapheme_Link
094D Grapheme_Link
09CD Grapheme_Link
0A4D Grapheme_Link
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Greek.pl b/gnu/usr.bin/perl/lib/unicore/lib/Greek.pl
index 76ad2ad6f76..b2cd72908e5 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Greek.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Greek.pl
@@ -17,6 +17,10 @@ return <<'END';
038E 03A1 GREEK
03A3 03CE GREEK
03D0 03F5 GREEK
+03F7 03FB GREEK
+1D26 1D2A GREEK
+1D5D 1D61 GREEK
+1D66 1D6A GREEK
1F00 1F15 GREEK
1F18 1F1D GREEK
1F20 1F45 GREEK
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Gujarati.pl b/gnu/usr.bin/perl/lib/unicore/lib/Gujarati.pl
index aba2f31753b..94776d232ff 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Gujarati.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Gujarati.pl
@@ -10,8 +10,7 @@
#
return <<'END';
0A81 0A83 GUJARATI
-0A85 0A8B GUJARATI
-0A8D GUJARATI
+0A85 0A8D GUJARATI
0A8F 0A91 GUJARATI
0A93 0AA8 GUJARATI
0AAA 0AB0 GUJARATI
@@ -21,6 +20,6 @@ return <<'END';
0AC7 0AC9 GUJARATI
0ACB 0ACD GUJARATI
0AD0 GUJARATI
-0AE0 GUJARATI
+0AE0 0AE3 GUJARATI
0AE6 0AEF GUJARATI
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Gurmukhi.pl b/gnu/usr.bin/perl/lib/unicore/lib/Gurmukhi.pl
index a56e9ae7218..2a14896cc9c 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Gurmukhi.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Gurmukhi.pl
@@ -9,7 +9,7 @@
# Meaning: Script 'GURMUKHI'
#
return <<'END';
-0A02 GURMUKHI
+0A02 0A03 GURMUKHI
0A05 0A0A GURMUKHI
0A0F 0A10 GURMUKHI
0A13 0A28 GURMUKHI
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/IdContin.pl b/gnu/usr.bin/perl/lib/unicore/lib/IdContin.pl
index 7de06495905..a4dd4b7a33b 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/IdContin.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/IdContin.pl
@@ -18,16 +18,13 @@ return <<'END';
00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
-0300 034F
-0360 036F
+0300 0357
+035D 036F
037A
0386
0388 038A
@@ -35,6 +32,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
0483 0486
048A 04CE
@@ -52,19 +50,19 @@ return <<'END';
05C4
05D0 05EA
05F0 05F2
+0610 0615
0621 063A
-0640 0655
+0640 0658
0660 0669
066E 06D3
06D5 06DC
06DF 06E8
-06EA 06ED
-06F0 06FC
-0710 072C
-0730 074A
+06EA 06FC
+06FF
+0710 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0963
@@ -76,15 +74,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
09DC 09DD
09DF 09E3
09E6 09F1
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -100,8 +97,7 @@ return <<'END';
0A5E
0A66 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -111,7 +107,7 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0AE6 0AEF
0B01 0B03
0B05 0B0C
@@ -119,7 +115,7 @@ return <<'END';
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
@@ -127,6 +123,7 @@ return <<'END';
0B5C 0B5D
0B5F 0B61
0B66 0B6F
+0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -161,7 +158,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -275,14 +272,21 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17D3
+1780 17B3
+17B6 17D3
17D7
-17DC
+17DC 17DD
17E0 17E9
180B 180D
1810 1819
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1946 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -305,6 +309,7 @@ return <<'END';
1FF2 1FF4
1FF6 1FFC
203F 2040
+2054
2071
207F
20D0 20DC
@@ -370,10 +375,24 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D165 1D169
1D16D 1D172
1D17B 1D182
@@ -387,8 +406,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -413,4 +431,5 @@ FFDA FFDC
1D7CE 1D7FF
20000 2A6D6
2F800 2FA1D
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/IdStart.pl b/gnu/usr.bin/perl/lib/unicore/lib/IdStart.pl
index 0772a752dd6..bfe9c09409e 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/IdStart.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/IdStart.pl
@@ -16,12 +16,9 @@ return <<'END';
00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
037A
@@ -31,6 +28,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
048A 04CE
04D0 04F5
@@ -47,12 +45,15 @@ return <<'END';
0671 06D3
06D5
06E5 06E6
+06EE 06EF
06FA 06FC
+06FF
0710
-0712 072C
+0712 072F
+074D 074F
0780 07A5
07B1
-0905 0939
+0904 0939
093D
0950
0958 0961
@@ -62,6 +63,7 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
+09BD
09DC 09DD
09DF 09E1
09F0 09F1
@@ -75,8 +77,7 @@ return <<'END';
0A59 0A5C
0A5E
0A72 0A74
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -84,16 +85,17 @@ return <<'END';
0AB5 0AB9
0ABD
0AD0
-0AE0
+0AE0 0AE1
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3D
0B5C 0B5D
0B5F 0B61
+0B71
0B83
0B85 0B8A
0B8E 0B90
@@ -116,6 +118,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
+0CBD
0CDE
0CE0 0CE1
0D05 0D0C
@@ -203,6 +206,10 @@ return <<'END';
17DC
1820 1877
1880 18A8
+1900 191C
+1950 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -281,10 +288,23 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -293,8 +313,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InAegean.pl b/gnu/usr.bin/perl/lib/unicore/lib/InAegean.pl
new file mode 100644
index 00000000000..207b51f8a8e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InAegean.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InAegeanNumbers} (and fuzzy permutations)
+#
+# Meaning: Block 'Aegean Numbers'
+#
+return <<'END';
+10100 1013F Aegean Numbers
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InCyprio.pl b/gnu/usr.bin/perl/lib/unicore/lib/InCyprio.pl
new file mode 100644
index 00000000000..8cb08b70021
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InCyprio.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InCypriotSyllabary} (and fuzzy permutations)
+#
+# Meaning: Block 'Cypriot Syllabary'
+#
+return <<'END';
+10800 1083F Cypriot Syllabary
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InKhmerS.pl b/gnu/usr.bin/perl/lib/unicore/lib/InKhmerS.pl
new file mode 100644
index 00000000000..f81515d2e57
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InKhmerS.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InKhmerSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Khmer Symbols'
+#
+return <<'END';
+19E0 19FF Khmer Symbols
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InLimbu.pl b/gnu/usr.bin/perl/lib/unicore/lib/InLimbu.pl
new file mode 100644
index 00000000000..3b123a3efd2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InLimbu.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InLimbu} (and fuzzy permutations)
+#
+# Meaning: Block 'Limbu'
+#
+return <<'END';
+1900 194F Limbu
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InLinea2.pl b/gnu/usr.bin/perl/lib/unicore/lib/InLinea2.pl
new file mode 100644
index 00000000000..98db9867623
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InLinea2.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InLinearBSyllabary} (and fuzzy permutations)
+#
+# Meaning: Block 'Linear B Syllabary'
+#
+return <<'END';
+10000 1007F Linear B Syllabary
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InLinear.pl b/gnu/usr.bin/perl/lib/unicore/lib/InLinear.pl
new file mode 100644
index 00000000000..513bce7d4bf
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InLinear.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InLinearBIdeograms} (and fuzzy permutations)
+#
+# Meaning: Block 'Linear B Ideograms'
+#
+return <<'END';
+10080 100FF Linear B Ideograms
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InMisce3.pl b/gnu/usr.bin/perl/lib/unicore/lib/InMisce3.pl
index a273df5c133..ff196bab5b6 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/InMisce3.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InMisce3.pl
@@ -4,10 +4,10 @@
#
# This file supports:
-# \p{InMiscellaneousMathematicalSymbolsA} (and fuzzy permutations)
+# \p{InMiscellaneousSymbolsAndArrows} (and fuzzy permutations)
#
-# Meaning: Block 'Miscellaneous Mathematical Symbols-A'
+# Meaning: Block 'Miscellaneous Symbols and Arrows'
#
return <<'END';
-27C0 27EF Miscellaneous Mathematical Symbols-A
+2B00 2BFF Miscellaneous Symbols and Arrows
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InMisce4.pl b/gnu/usr.bin/perl/lib/unicore/lib/InMisce4.pl
index 1c8e240fca7..a273df5c133 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/InMisce4.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InMisce4.pl
@@ -4,10 +4,10 @@
#
# This file supports:
-# \p{InMiscellaneousMathematicalSymbolsB} (and fuzzy permutations)
+# \p{InMiscellaneousMathematicalSymbolsA} (and fuzzy permutations)
#
-# Meaning: Block 'Miscellaneous Mathematical Symbols-B'
+# Meaning: Block 'Miscellaneous Mathematical Symbols-A'
#
return <<'END';
-2980 29FF Miscellaneous Mathematical Symbols-B
+27C0 27EF Miscellaneous Mathematical Symbols-A
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InMisce5.pl b/gnu/usr.bin/perl/lib/unicore/lib/InMisce5.pl
new file mode 100644
index 00000000000..1c8e240fca7
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InMisce5.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InMiscellaneousMathematicalSymbolsB} (and fuzzy permutations)
+#
+# Meaning: Block 'Miscellaneous Mathematical Symbols-B'
+#
+return <<'END';
+2980 29FF Miscellaneous Mathematical Symbols-B
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InOsmany.pl b/gnu/usr.bin/perl/lib/unicore/lib/InOsmany.pl
new file mode 100644
index 00000000000..42671cdfc2e
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InOsmany.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InOsmanya} (and fuzzy permutations)
+#
+# Meaning: Block 'Osmanya'
+#
+return <<'END';
+10480 104AF Osmanya
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InPhonet.pl b/gnu/usr.bin/perl/lib/unicore/lib/InPhonet.pl
new file mode 100644
index 00000000000..be9d9d0add2
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InPhonet.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InPhoneticExtensions} (and fuzzy permutations)
+#
+# Meaning: Block 'Phonetic Extensions'
+#
+return <<'END';
+1D00 1D7F Phonetic Extensions
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InShavia.pl b/gnu/usr.bin/perl/lib/unicore/lib/InShavia.pl
new file mode 100644
index 00000000000..a22b40cc2da
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InShavia.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InShavian} (and fuzzy permutations)
+#
+# Meaning: Block 'Shavian'
+#
+return <<'END';
+10450 1047F Shavian
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InTaiLe.pl b/gnu/usr.bin/perl/lib/unicore/lib/InTaiLe.pl
new file mode 100644
index 00000000000..da6563a7d3b
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InTaiLe.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InTaiLe} (and fuzzy permutations)
+#
+# Meaning: Block 'Tai Le'
+#
+return <<'END';
+1950 197F Tai Le
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InTaiXua.pl b/gnu/usr.bin/perl/lib/unicore/lib/InTaiXua.pl
new file mode 100644
index 00000000000..ee081554b6b
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InTaiXua.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InTaiXuanJingSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Tai Xuan Jing Symbols'
+#
+return <<'END';
+1D300 1D35F Tai Xuan Jing Symbols
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InUgarit.pl b/gnu/usr.bin/perl/lib/unicore/lib/InUgarit.pl
new file mode 100644
index 00000000000..8c5871a834a
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InUgarit.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InUgaritic} (and fuzzy permutations)
+#
+# Meaning: Block 'Ugaritic'
+#
+return <<'END';
+10380 1039F Ugaritic
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InVaria2.pl b/gnu/usr.bin/perl/lib/unicore/lib/InVaria2.pl
new file mode 100644
index 00000000000..2ab90feb798
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InVaria2.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InVariationSelectorsSupplement} (and fuzzy permutations)
+#
+# Meaning: Block 'Variation Selectors Supplement'
+#
+return <<'END';
+E0100 E01EF Variation Selectors Supplement
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/InYijing.pl b/gnu/usr.bin/perl/lib/unicore/lib/InYijing.pl
new file mode 100644
index 00000000000..6677f13ac12
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/InYijing.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{InYijingHexagramSymbols} (and fuzzy permutations)
+#
+# Meaning: Block 'Yijing Hexagram Symbols'
+#
+return <<'END';
+4DC0 4DFF Yijing Hexagram Symbols
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Kannada.pl b/gnu/usr.bin/perl/lib/unicore/lib/Kannada.pl
index 7c9a8580180..d15255b6e6b 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Kannada.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Kannada.pl
@@ -15,7 +15,7 @@ return <<'END';
0C92 0CA8 KANNADA
0CAA 0CB3 KANNADA
0CB5 0CB9 KANNADA
-0CBE 0CC4 KANNADA
+0CBD 0CC4 KANNADA
0CC6 0CC8 KANNADA
0CCA 0CCD KANNADA
0CD5 0CD6 KANNADA
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/L.pl b/gnu/usr.bin/perl/lib/unicore/lib/L.pl
index 5b17fe75891..1423c56cab8 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/L.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/L.pl
@@ -17,12 +17,9 @@ return <<'END';
00BA
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
037A
@@ -32,6 +29,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
048A 04CE
04D0 04F5
@@ -48,12 +46,15 @@ return <<'END';
0671 06D3
06D5
06E5 06E6
+06EE 06EF
06FA 06FC
+06FF
0710
-0712 072C
+0712 072F
+074D 074F
0780 07A5
07B1
-0905 0939
+0904 0939
093D
0950
0958 0961
@@ -63,6 +64,7 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
+09BD
09DC 09DD
09DF 09E1
09F0 09F1
@@ -76,8 +78,7 @@ return <<'END';
0A59 0A5C
0A5E
0A72 0A74
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -85,16 +86,17 @@ return <<'END';
0AB5 0AB9
0ABD
0AD0
-0AE0
+0AE0 0AE1
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3D
0B5C 0B5D
0B5F 0B61
+0B71
0B83
0B85 0B8A
0B8E 0B90
@@ -117,6 +119,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
+0CBD
0CDE
0CE0 0CE1
0D05 0D0C
@@ -203,6 +206,10 @@ return <<'END';
17DC
1820 1877
1880 18A8
+1900 191C
+1950 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -279,10 +286,23 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
10330 10349
-10400 10425
-10428 1044D
+10380 1039D
+10400 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -291,8 +311,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/L_.pl b/gnu/usr.bin/perl/lib/unicore/lib/L_.pl
index 44afbeb5922..d7321ade009 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/L_.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/L_.pl
@@ -18,15 +18,15 @@ return <<'END';
00D8 00F6
00F8 01BA
01BC 01BF
-01C4 0220
-0222 0233
-0250 02AD
+01C4 0236
+0250 02AF
0386
0388 038A
038C
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
048A 04CE
04D0 04F5
@@ -35,6 +35,8 @@ return <<'END';
0531 0556
0561 0587
10A0 10C5
+1D00 1D2B
+1D62 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -76,8 +78,7 @@ FB00 FB06
FB13 FB17
FF21 FF3A
FF41 FF5A
-10400 10425
-10428 1044D
+10400 1044F
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -86,8 +87,7 @@ FF41 FF5A
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Latin.pl b/gnu/usr.bin/perl/lib/unicore/lib/Latin.pl
index 2b27d1c2233..b14498ecf7d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Latin.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Latin.pl
@@ -15,11 +15,13 @@ return <<'END';
00BA LATIN
00C0 00D6 LATIN
00D8 00F6 LATIN
-00F8 0220 LATIN
-0222 0233 LATIN
-0250 02AD LATIN
-02B0 02B8 LATIN
+00F8 0236 LATIN
+0250 02B8 LATIN
02E0 02E4 LATIN
+1D00 1D25 LATIN
+1D2C 1D5C LATIN
+1D62 1D65 LATIN
+1D6B LATIN
1E00 1E9B LATIN
1EA0 1EF9 LATIN
2071 LATIN
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Limbu.pl b/gnu/usr.bin/perl/lib/unicore/lib/Limbu.pl
new file mode 100644
index 00000000000..86dd8147f80
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Limbu.pl
@@ -0,0 +1,16 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{Limbu} (and fuzzy permutations)
+#
+# Meaning: Script 'LIMBU'
+#
+return <<'END';
+1900 191C LIMBU
+1920 192B LIMBU
+1930 193B LIMBU
+1946 194F LIMBU
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/LinearB.pl b/gnu/usr.bin/perl/lib/unicore/lib/LinearB.pl
new file mode 100644
index 00000000000..0f670ce55cd
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/LinearB.pl
@@ -0,0 +1,19 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{LinearB} (and fuzzy permutations)
+#
+# Meaning: Script 'LINEAR_B'
+#
+return <<'END';
+10000 1000B LINEAR_B
+1000D 10026 LINEAR_B
+10028 1003A LINEAR_B
+1003C 1003D LINEAR_B
+1003F 1004D LINEAR_B
+10050 1005D LINEAR_B
+10080 100FA LINEAR_B
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Ll.pl b/gnu/usr.bin/perl/lib/unicore/lib/Ll.pl
index 8655dfea53f..cff194b97ea 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Ll.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Ll.pl
@@ -139,6 +139,7 @@ return <<'END';
021B
021D
021F
+0221
0223
0225
0227
@@ -147,8 +148,8 @@ return <<'END';
022D
022F
0231
-0233
-0250 02AD
+0233 0236
+0250 02AF
0390
03AC 03CE
03D0 03D1
@@ -166,6 +167,8 @@ return <<'END';
03ED
03EF 03F3
03F5
+03F8
+03FB
0430 045F
0461
0463
@@ -247,6 +250,8 @@ return <<'END';
050D
050F
0561 0587
+1D00 1D2B
+1D62 1D6B
1E01
1E03
1E05
@@ -401,15 +406,14 @@ return <<'END';
FB00 FB06
FB13 FB17
FF41 FF5A
-10428 1044D
+10428 1044F
1D41A 1D433
1D44E 1D454
1D456 1D467
1D482 1D49B
1D4B6 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D4CF
1D4EA 1D503
1D51E 1D537
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Lm.pl b/gnu/usr.bin/perl/lib/unicore/lib/Lm.pl
index 808193f0342..d6943ff0ac5 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Lm.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Lm.pl
@@ -10,9 +10,8 @@
# Meaning: General Category 'Lm'
#
return <<'END';
-02B0 02B8
-02BB 02C1
-02D0 02D1
+02B0 02C1
+02C6 02D1
02E0 02E4
02EE
037A
@@ -23,6 +22,7 @@ return <<'END';
0EC6
17D7
1843
+1D2C 1D61
3005
3031 3035
303B
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Lo.pl b/gnu/usr.bin/perl/lib/unicore/lib/Lo.pl
index d5f161a0fa6..34dc082dc63 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Lo.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Lo.pl
@@ -19,12 +19,15 @@ return <<'END';
066E 066F
0671 06D3
06D5
+06EE 06EF
06FA 06FC
+06FF
0710
-0712 072C
+0712 072F
+074D 074F
0780 07A5
07B1
-0905 0939
+0904 0939
093D
0950
0958 0961
@@ -34,6 +37,7 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
+09BD
09DC 09DD
09DF 09E1
09F0 09F1
@@ -47,8 +51,7 @@ return <<'END';
0A59 0A5C
0A5E
0A72 0A74
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -56,16 +59,17 @@ return <<'END';
0AB5 0AB9
0ABD
0AD0
-0AE0
+0AE0 0AE1
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3D
0B5C 0B5D
0B5F 0B61
+0B71
0B83
0B85 0B8A
0B8E 0B90
@@ -88,6 +92,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
+0CBD
0CDE
0CE0 0CE1
0D05 0D0C
@@ -172,6 +177,9 @@ return <<'END';
1820 1842
1844 1877
1880 18A8
+1900 191C
+1950 196D
+1970 1974
2135 2138
3006
303C
@@ -210,8 +218,23 @@ FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
10300 1031E
10330 10349
+10380 1039D
+10450 1049D
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
20000 2A6D6
2F800 2FA1D
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Lower.pl b/gnu/usr.bin/perl/lib/unicore/lib/Lower.pl
index b9e16389f7c..fe7c0ade92f 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Lower.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Lower.pl
@@ -138,6 +138,7 @@ return <<'END';
021B
021D
021F
+0221
0223
0225
0227
@@ -146,8 +147,8 @@ return <<'END';
022D
022F
0231
-0233
-0250 02AD
+0233 0236
+0250 02AF
0390
03AC 03CE
03D0 03D1
@@ -165,6 +166,8 @@ return <<'END';
03ED
03EF 03F3
03F5
+03F8
+03FB
0430 045F
0461
0463
@@ -246,6 +249,8 @@ return <<'END';
050D
050F
0561 0587
+1D00 1D2B
+1D62 1D6B
1E01
1E03
1E05
@@ -400,15 +405,14 @@ return <<'END';
FB00 FB06
FB13 FB17
FF41 FF5A
-10428 1044D
+10428 1044F
1D41A 1D433
1D44E 1D454
1D456 1D467
1D482 1D49B
1D4B6 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D4CF
1D4EA 1D503
1D51E 1D537
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Lowercas.pl b/gnu/usr.bin/perl/lib/unicore/lib/Lowercas.pl
index 07832e47ee7..8d045ccbae0 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Lowercas.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Lowercas.pl
@@ -138,6 +138,7 @@ return <<'END';
021B
021D
021F
+0221
0223
0225
0227
@@ -146,9 +147,8 @@ return <<'END';
022D
022F
0231
-0233
-0250 02AD
-02B0 02B8
+0233 0236
+0250 02B8
02C0 02C1
02E0 02E4
0345
@@ -170,6 +170,8 @@ return <<'END';
03ED
03EF 03F3
03F5
+03F8
+03FB
0430 045F
0461
0463
@@ -251,6 +253,7 @@ return <<'END';
050D
050F
0561 0587
+1D00 1D6B
1E01
1E03
1E05
@@ -407,15 +410,14 @@ return <<'END';
FB00 FB06
FB13 FB17
FF41 FF5A
-10428 1044D
+10428 1044F
1D41A 1D433
1D44E 1D454
1D456 1D467
1D482 1D49B
1D4B6 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D4CF
1D4EA 1D503
1D51E 1D537
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Lu.pl b/gnu/usr.bin/perl/lib/unicore/lib/Lu.pl
index 1414b40d2f7..f662a3f3629 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Lu.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Lu.pl
@@ -166,6 +166,8 @@ return <<'END';
03EC
03EE
03F4
+03F7
+03F9 03FA
0400 042F
0460
0462
@@ -398,7 +400,7 @@ return <<'END';
213E 213F
2145
FF21 FF3A
-10400 10425
+10400 10427
1D400 1D419
1D434 1D44D
1D468 1D481
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/M.pl b/gnu/usr.bin/perl/lib/unicore/lib/M.pl
index cd78b82348e..4fbeb499283 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/M.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/M.pl
@@ -10,8 +10,8 @@
# Meaning: Major Category 'M'
#
return <<'END';
-0300 034F
-0360 036F
+0300 0357
+035D 036F
0483 0486
0488 0489
0591 05A1
@@ -20,7 +20,8 @@ return <<'END';
05BF
05C1 05C2
05C4
-064B 0655
+0610 0615
+064B 0658
0670
06D6 06DC
06DE 06E4
@@ -41,7 +42,7 @@ return <<'END';
09CB 09CD
09D7
09E2 09E3
-0A02
+0A01 0A03
0A3C
0A3E 0A42
0A47 0A48
@@ -52,6 +53,7 @@ return <<'END';
0ABE 0AC5
0AC7 0AC9
0ACB 0ACD
+0AE2 0AE3
0B01 0B03
0B3C
0B3E 0B43
@@ -69,6 +71,7 @@ return <<'END';
0C4A 0C4D
0C55 0C56
0C82 0C83
+0CBC
0CBE 0CC4
0CC6 0CC8
0CCA 0CCD
@@ -108,9 +111,12 @@ return <<'END';
1732 1734
1752 1753
1772 1773
-17B4 17D3
+17B6 17D3
+17DD
180B 180D
18A9
+1920 192B
+1930 193B
20D0 20EA
302A 302F
3099 309A
@@ -122,4 +128,5 @@ FE20 FE23
1D17B 1D182
1D185 1D18B
1D1AA 1D1AD
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Math.pl b/gnu/usr.bin/perl/lib/unicore/lib/Math.pl
index a233c79f8fe..d0261041a35 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Math.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Math.pl
@@ -65,6 +65,7 @@ return <<'END';
29FE 2AFF
FB29
FE35 FE38
+FE47 FE48
FE59 FE5C
FE61 FE66
FE68
@@ -84,8 +85,7 @@ FFE9 FFEC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Mc.pl b/gnu/usr.bin/perl/lib/unicore/lib/Mc.pl
index cb4833a16e9..89d9ee12ca2 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Mc.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Mc.pl
@@ -18,6 +18,7 @@ return <<'END';
09C7 09C8
09CB 09CC
09D7
+0A03
0A3E 0A40
0A83
0ABE 0AC0
@@ -57,9 +58,13 @@ return <<'END';
1031
1038
1056 1057
-17B4 17B6
+17B6
17BE 17C5
17C7 17C8
+1923 1926
+1929 192B
+1930 1931
+1933 1938
1D165 1D166
1D16D 1D172
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Mn.pl b/gnu/usr.bin/perl/lib/unicore/lib/Mn.pl
index 481f1ed4915..25dd0c994eb 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Mn.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Mn.pl
@@ -10,8 +10,8 @@
# Meaning: General Category 'Mn'
#
return <<'END';
-0300 034F
-0360 036F
+0300 0357
+035D 036F
0483 0486
0591 05A1
05A3 05B9
@@ -19,7 +19,8 @@ return <<'END';
05BF
05C1 05C2
05C4
-064B 0655
+0610 0615
+064B 0658
0670
06D6 06DC
06DF 06E4
@@ -39,7 +40,7 @@ return <<'END';
09C1 09C4
09CD
09E2 09E3
-0A02
+0A01 0A02
0A3C
0A41 0A42
0A47 0A48
@@ -50,6 +51,7 @@ return <<'END';
0AC1 0AC5
0AC7 0AC8
0ACD
+0AE2 0AE3
0B01
0B3C
0B3F
@@ -63,6 +65,7 @@ return <<'END';
0C46 0C48
0C4A 0C4D
0C55 0C56
+0CBC
0CBF
0CC6
0CCC 0CCD
@@ -100,8 +103,13 @@ return <<'END';
17B7 17BD
17C6
17C9 17D3
+17DD
180B 180D
18A9
+1920 1922
+1927 1928
+1932
+1939 193B
20D0 20DC
20E1
20E5 20EA
@@ -114,4 +122,5 @@ FE20 FE23
1D17B 1D182
1D185 1D18B
1D1AA 1D1AD
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/N.pl b/gnu/usr.bin/perl/lib/unicore/lib/N.pl
index 612b79f1f3d..bd452f46bd2 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/N.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/N.pl
@@ -33,13 +33,15 @@ return <<'END';
1369 137C
16EE 16F0
17E0 17E9
+17F0 17F9
1810 1819
+1946 194F
2070
2074 2079
2080 2089
2153 2183
2460 249B
-24EA 24FE
+24EA 24FF
2776 2793
3007
3021 3029
@@ -50,7 +52,9 @@ return <<'END';
3280 3289
32B1 32BF
FF10 FF19
+10107 10133
10320 10323
1034A
+104A0 104A9
1D7CE 1D7FF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Nd.pl b/gnu/usr.bin/perl/lib/unicore/lib/Nd.pl
index 30cd8445dd1..3c96211eed3 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Nd.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Nd.pl
@@ -29,6 +29,8 @@ return <<'END';
1369 1371
17E0 17E9
1810 1819
+1946 194F
FF10 FF19
+104A0 104A9
1D7CE 1D7FF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/No.pl b/gnu/usr.bin/perl/lib/unicore/lib/No.pl
index ede689d6a46..dd4243c253f 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/No.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/No.pl
@@ -17,17 +17,19 @@ return <<'END';
0BF0 0BF2
0F2A 0F33
1372 137C
+17F0 17F9
2070
2074 2079
2080 2089
2153 215F
2460 249B
-24EA 24FE
+24EA 24FF
2776 2793
3192 3195
3220 3229
3251 325F
3280 3289
32B1 32BF
+10107 10133
10320 10323
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Oriya.pl b/gnu/usr.bin/perl/lib/unicore/lib/Oriya.pl
index 2b599d6c08a..dfc461f76a5 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Oriya.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Oriya.pl
@@ -15,7 +15,7 @@ return <<'END';
0B13 0B28 ORIYA
0B2A 0B30 ORIYA
0B32 0B33 ORIYA
-0B36 0B39 ORIYA
+0B35 0B39 ORIYA
0B3C 0B43 ORIYA
0B47 0B48 ORIYA
0B4B 0B4D ORIYA
@@ -23,4 +23,5 @@ return <<'END';
0B5C 0B5D ORIYA
0B5F 0B61 ORIYA
0B66 0B6F ORIYA
+0B71 ORIYA
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Osmanya.pl b/gnu/usr.bin/perl/lib/unicore/lib/Osmanya.pl
new file mode 100644
index 00000000000..19ffe7a7826
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Osmanya.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{Osmanya} (and fuzzy permutations)
+#
+# Meaning: Script 'OSMANYA'
+#
+return <<'END';
+10480 1049D OSMANYA
+104A0 104A9 OSMANYA
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/OtherAlp.pl b/gnu/usr.bin/perl/lib/unicore/lib/OtherAlp.pl
index 97eda4888e5..fad884bec13 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/OtherAlp.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/OtherAlp.pl
@@ -15,7 +15,8 @@ return <<'END';
05BF Other_Alphabetic
05C1 05C2 Other_Alphabetic
05C4 Other_Alphabetic
-064B 0655 Other_Alphabetic
+0610 0615 Other_Alphabetic
+064B 0657 Other_Alphabetic
0670 Other_Alphabetic
06D6 06DC Other_Alphabetic
06E1 06E4 Other_Alphabetic
@@ -33,7 +34,7 @@ return <<'END';
09CB 09CC Other_Alphabetic
09D7 Other_Alphabetic
09E2 09E3 Other_Alphabetic
-0A02 Other_Alphabetic
+0A01 0A03 Other_Alphabetic
0A3E 0A42 Other_Alphabetic
0A47 0A48 Other_Alphabetic
0A4B 0A4C Other_Alphabetic
@@ -42,6 +43,7 @@ return <<'END';
0ABE 0AC5 Other_Alphabetic
0AC7 0AC9 Other_Alphabetic
0ACB 0ACC Other_Alphabetic
+0AE2 0AE3 Other_Alphabetic
0B01 0B03 Other_Alphabetic
0B3E 0B43 Other_Alphabetic
0B47 0B48 Other_Alphabetic
@@ -91,8 +93,10 @@ return <<'END';
1732 1733 Other_Alphabetic
1752 1753 Other_Alphabetic
1772 1773 Other_Alphabetic
-17B4 17C8 Other_Alphabetic
+17B6 17C8 Other_Alphabetic
18A9 Other_Alphabetic
+1920 192B Other_Alphabetic
+1930 1938 Other_Alphabetic
2160 2183 Other_Alphabetic
FB1E Other_Alphabetic
1034A Other_Alphabetic
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/OtherDef.pl b/gnu/usr.bin/perl/lib/unicore/lib/OtherDef.pl
index 6bdd19449aa..373aa6da845 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/OtherDef.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/OtherDef.pl
@@ -9,9 +9,16 @@
# Meaning: Extended property 'Other_Default_Ignorable_Code_Point'
#
return <<'END';
+034F Other_Default_Ignorable_Code_Point
+115F 1160 Other_Default_Ignorable_Code_Point
180B 180D Other_Default_Ignorable_Code_Point
-2060 206F Other_Default_Ignorable_Code_Point
+200B Other_Default_Ignorable_Code_Point
+2064 2069 Other_Default_Ignorable_Code_Point
+3164 Other_Default_Ignorable_Code_Point
FE00 FE0F Other_Default_Ignorable_Code_Point
-FFF0 FFFB Other_Default_Ignorable_Code_Point
-E0000 E0FFF Other_Default_Ignorable_Code_Point
+FFA0 Other_Default_Ignorable_Code_Point
+FFF0 FFF8 Other_Default_Ignorable_Code_Point
+E0000 Other_Default_Ignorable_Code_Point
+E0002 E001F Other_Default_Ignorable_Code_Point
+E0080 E0FFF Other_Default_Ignorable_Code_Point
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/OtherGra.pl b/gnu/usr.bin/perl/lib/unicore/lib/OtherGra.pl
index 7a927cdb456..c846fe58379 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/OtherGra.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/OtherGra.pl
@@ -9,5 +9,18 @@
# Meaning: Extended property 'Other_Grapheme_Extend'
#
return <<'END';
-FF9E FF9F Other_Grapheme_Extend
+09BE Other_Grapheme_Extend
+09D7 Other_Grapheme_Extend
+0B3E Other_Grapheme_Extend
+0B57 Other_Grapheme_Extend
+0BBE Other_Grapheme_Extend
+0BD7 Other_Grapheme_Extend
+0CC2 Other_Grapheme_Extend
+0CD5 0CD6 Other_Grapheme_Extend
+0D3E Other_Grapheme_Extend
+0D57 Other_Grapheme_Extend
+0DCF Other_Grapheme_Extend
+0DDF Other_Grapheme_Extend
+1D165 Other_Grapheme_Extend
+1D16E 1D16F Other_Grapheme_Extend
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/OtherIdS.pl b/gnu/usr.bin/perl/lib/unicore/lib/OtherIdS.pl
new file mode 100644
index 00000000000..59e4dd3b4a9
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/OtherIdS.pl
@@ -0,0 +1,15 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{OtherIdStart} (and fuzzy permutations)
+#
+# Meaning: Extended property 'Other_ID_Start'
+#
+return <<'END';
+2118 Other_ID_Start
+212E Other_ID_Start
+309B 309C Other_ID_Start
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/OtherLow.pl b/gnu/usr.bin/perl/lib/unicore/lib/OtherLow.pl
index ae844c9d62c..e059d811aaf 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/OtherLow.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/OtherLow.pl
@@ -14,6 +14,7 @@ return <<'END';
02E0 02E4 Other_Lowercase
0345 Other_Lowercase
037A Other_Lowercase
+1D2C 1D61 Other_Lowercase
2170 217F Other_Lowercase
24D0 24E9 Other_Lowercase
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/OtherMat.pl b/gnu/usr.bin/perl/lib/unicore/lib/OtherMat.pl
index 1f9ad904090..d332e324b65 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/OtherMat.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/OtherMat.pl
@@ -31,6 +31,7 @@ return <<'END';
212F 2131 Other_Math
2133 2138 Other_Math
FE35 FE38 Other_Math
+FE47 FE48 Other_Math
FE59 FE5C Other_Math
FE61 Other_Math
FE63 Other_Math
@@ -49,8 +50,7 @@ FF5D Other_Math
1D4A9 1D4AC Other_Math
1D4AE 1D4B9 Other_Math
1D4BB Other_Math
-1D4BD 1D4C0 Other_Math
-1D4C2 1D4C3 Other_Math
+1D4BD 1D4C3 Other_Math
1D4C5 1D505 Other_Math
1D507 1D50A Other_Math
1D50D 1D514 Other_Math
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/P.pl b/gnu/usr.bin/perl/lib/unicore/lib/P.pl
index 1302e8d8f9a..955084486ea 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/P.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/P.pl
@@ -21,7 +21,6 @@ return <<'END';
007D
00A1
00AB
-00AD
00B7
00BB
00BF
@@ -33,7 +32,7 @@ return <<'END';
05C0
05C3
05F3 05F4
-060C
+060C 060D
061B
061F
066A 066D
@@ -57,9 +56,11 @@ return <<'END';
17D4 17D6
17D8 17DA
1800 180A
+1944 1945
2010 2027
2030 2043
2045 2051
+2053 2054
2057
207D 207E
208D 208E
@@ -78,8 +79,7 @@ return <<'END';
30A0
30FB
FD3E FD3F
-FE30 FE46
-FE49 FE52
+FE30 FE52
FE54 FE61
FE63
FE68
@@ -94,4 +94,6 @@ FF3F
FF5B
FF5D
FF5F FF65
+10100 10101
+1039F
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Pc.pl b/gnu/usr.bin/perl/lib/unicore/lib/Pc.pl
index 2f087426846..9c5dadb276d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Pc.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Pc.pl
@@ -12,6 +12,7 @@
return <<'END';
005F
203F 2040
+2054
30FB
FE33 FE34
FE4D FE4F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Pd.pl b/gnu/usr.bin/perl/lib/unicore/lib/Pd.pl
index e32f88fe509..545e454b515 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Pd.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Pd.pl
@@ -11,7 +11,6 @@
#
return <<'END';
002D
-00AD
058A
1806
2010 2015
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Pe.pl b/gnu/usr.bin/perl/lib/unicore/lib/Pe.pl
index 5c7e3c8dbe9..97dd19b9b8b 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Pe.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Pe.pl
@@ -64,6 +64,7 @@ FE3E
FE40
FE42
FE44
+FE48
FE5A
FE5C
FE5E
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Po.pl b/gnu/usr.bin/perl/lib/unicore/lib/Po.pl
index 963ce32a156..9c9b16aabb3 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Po.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Po.pl
@@ -29,7 +29,7 @@ return <<'END';
05C0
05C3
05F3 05F4
-060C
+060C 060D
061B
061F
066A 066D
@@ -52,12 +52,14 @@ return <<'END';
17D8 17DA
1800 1805
1807 180A
+1944 1945
2016 2017
2020 2027
2030 2038
203B 203E
2041 2043
2047 2051
+2053
2057
23B6
3001 3003
@@ -80,4 +82,6 @@ FF1F FF20
FF3C
FF61
FF64
+10100 10101
+1039F
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Print.pl b/gnu/usr.bin/perl/lib/unicore/lib/Print.pl
index 01ac6f10d41..a5bae46845d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Print.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Print.pl
@@ -9,13 +9,12 @@
# Meaning: [[:Print:]]
#
return <<'END';
+0009 000D
0020 007E
-00A0 0220
-0222 0233
-0250 02AD
-02B0 02EE
-0300 034F
-0360 036F
+0085
+00A0 0236
+0250 0357
+035D 036F
0374 0375
037A
037E
@@ -23,7 +22,7 @@ return <<'END';
038C
038E 03A1
03A3 03CE
-03D0 03F6
+03D0 03FB
0400 0486
0488 04CE
04D0 04F5
@@ -38,20 +37,17 @@ return <<'END';
05BB 05C4
05D0 05EA
05F0 05F4
-060C
+0600 0603
+060C 0615
061B
061F
0621 063A
-0640 0655
-0660 06DC
-06DE 06ED
-06F0 06FE
-0700 070D
-0710 072C
-0730 074A
+0640 0658
+0660 070D
+070F 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0970
@@ -62,15 +58,14 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
09DC 09DD
09DF 09E3
09E6 09FA
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -86,8 +81,7 @@ return <<'END';
0A5E
0A66 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -97,22 +91,23 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0AE6 0AEF
+0AF1
0B01 0B03
0B05 0B0C
0B0F 0B10
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
0B56 0B57
0B5C 0B5D
0B5F 0B61
-0B66 0B70
+0B66 0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -128,7 +123,7 @@ return <<'END';
0BC6 0BC8
0BCA 0BCD
0BD7
-0BE7 0BF2
+0BE7 0BFA
0C01 0C03
0C05 0C0C
0C0E 0C10
@@ -147,7 +142,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -252,12 +247,21 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17DC
+1780 17DD
17E0 17E9
-1800 180D
+17F0 17F9
+1800 180E
1810 1819
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1940
+1944 196D
+1970 1974
+19E0 19FF
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -276,26 +280,23 @@ return <<'END';
1FDD 1FEF
1FF2 1FF4
1FF6 1FFE
-2000 200B
-2010 2027
-202F 2052
+2000 2054
2057
-205F
-2070 2071
+205F 2063
+206A 2071
2074 208E
20A0 20B1
20D0 20EA
-2100 213A
+2100 213B
213D 214B
2153 2183
-2190 23CE
+2190 23D0
2400 2426
2440 244A
-2460 24FE
-2500 2613
-2616 2617
+2460 2617
2619 267D
-2680 2689
+2680 2691
+26A0 26A1
2701 2704
2706 2709
270C 2727
@@ -308,7 +309,7 @@ return <<'END';
2798 27AF
27B1 27BE
27D0 27EB
-27F0 2AFF
+27F0 2B0D
2E80 2E99
2E9B 2EF3
2F00 2FD5
@@ -319,16 +320,12 @@ return <<'END';
3105 312C
3131 318E
3190 31B7
-31F0 321C
+31F0 321E
3220 3243
-3251 327B
-327F 32CB
-32D0 32FE
-3300 3376
-337B 33DD
-33E0 33FE
-3400 4DB5
-4E00 9FA5
+3250 327D
+327F 32FE
+3300 4DB5
+4DC0 9FA5
A000 A48C
A490 A4C6
AC00 D7A3
@@ -345,15 +342,15 @@ FB46 FBB1
FBD3 FD3F
FD50 FD8F
FD92 FDC7
-FDF0 FDFC
+FDF0 FDFD
FE00 FE0F
FE20 FE23
-FE30 FE46
-FE49 FE52
+FE30 FE52
FE54 FE66
FE68 FE6B
FE70 FE74
FE76 FEFC
+FEFF
FF01 FFBE
FFC2 FFC7
FFCA FFCF
@@ -361,16 +358,34 @@ FFD2 FFD7
FFDA FFDC
FFE0 FFE6
FFE8 FFEE
-FFFC FFFD
+FFF9 FFFD
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10100 10102
+10107 10133
+10137 1013F
10300 1031E
10320 10323
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+1039F
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D000 1D0F5
1D100 1D126
-1D12A 1D172
-1D17B 1D1DD
+1D12A 1D1DD
+1D300 1D356
1D400 1D454
1D456 1D49C
1D49E 1D49F
@@ -379,8 +394,7 @@ FFFC FFFD
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -395,6 +409,9 @@ FFFC FFFD
1D7CE 1D7FF
20000 2A6D6
2F800 2FA1D
+E0001
+E0020 E007F
+E0100 E01EF
F0000 FFFFD
100000 10FFFD
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Ps.pl b/gnu/usr.bin/perl/lib/unicore/lib/Ps.pl
index 0c0dd89a210..097006190dc 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Ps.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Ps.pl
@@ -66,6 +66,7 @@ FE3D
FE3F
FE41
FE43
+FE47
FE59
FE5B
FE5D
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Punct.pl b/gnu/usr.bin/perl/lib/unicore/lib/Punct.pl
index ca68b6ab499..aa0812b2374 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Punct.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Punct.pl
@@ -20,7 +20,6 @@ return <<'END';
007D
00A1
00AB
-00AD
00B7
00BB
00BF
@@ -32,7 +31,7 @@ return <<'END';
05C0
05C3
05F3 05F4
-060C
+060C 060D
061B
061F
066A 066D
@@ -56,9 +55,11 @@ return <<'END';
17D4 17D6
17D8 17DA
1800 180A
+1944 1945
2010 2027
2030 2043
2045 2051
+2053 2054
2057
207D 207E
208D 208E
@@ -77,8 +78,7 @@ return <<'END';
30A0
30FB
FD3E FD3F
-FE30 FE46
-FE49 FE52
+FE30 FE52
FE54 FE61
FE63
FE68
@@ -93,4 +93,6 @@ FF3F
FF5B
FF5D
FF5F FF65
+10100 10101
+1039F
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/S.pl b/gnu/usr.bin/perl/lib/unicore/lib/S.pl
index a1ceed0442b..5d682c8e717 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/S.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/S.pl
@@ -25,19 +25,22 @@ return <<'END';
00B8
00D7
00F7
-02B9 02BA
-02C2 02CF
+02C2 02C5
02D2 02DF
02E5 02ED
+02EF 02FF
0374 0375
0384 0385
03F6
0482
+060E 060F
06E9
06FD 06FE
09F2 09F3
09FA
+0AF1
0B70
+0BF3 0BFA
0E3F
0F01 0F03
0F13 0F17
@@ -49,6 +52,8 @@ return <<'END';
0FC7 0FCC
0FCF
17DB
+1940
+19E0 19FF
1FBD
1FBF 1FC1
1FCD 1FCF
@@ -71,19 +76,19 @@ return <<'END';
2129
212E
2132
-213A
+213A 213B
2140 2144
214A 214B
2190 2328
232B 23B3
-23B7 23CE
+23B7 23D0
2400 2426
2440 244A
249C 24E9
-2500 2613
-2616 2617
+2500 2617
2619 267D
-2680 2689
+2680 2691
+26A0 26A1
2701 2704
2706 2709
270C 2727
@@ -100,7 +105,7 @@ return <<'END';
27F0 2982
2999 29D7
29DC 29FB
-29FE 2AFF
+29FE 2B0D
2E80 2E99
2E9B 2EF3
2F00 2FD5
@@ -113,19 +118,18 @@ return <<'END';
309B 309C
3190 3191
3196 319F
-3200 321C
+3200 321E
322A 3243
-3260 327B
+3250
+3260 327D
327F
328A 32B0
-32C0 32CB
-32D0 32FE
-3300 3376
-337B 33DD
-33E0 33FE
+32C0 32FE
+3300 33FF
+4DC0 4DFF
A490 A4C6
FB29
-FDFC
+FDFC FDFD
FE62
FE64 FE66
FE69
@@ -139,6 +143,8 @@ FF5E
FFE0 FFE6
FFE8 FFEE
FFFC FFFD
+10102
+10137 1013F
1D000 1D0F5
1D100 1D126
1D12A 1D164
@@ -146,6 +152,7 @@ FFFC FFFD
1D183 1D184
1D18C 1D1A9
1D1AE 1D1DD
+1D300 1D356
1D6C1
1D6DB
1D6FB
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Sc.pl b/gnu/usr.bin/perl/lib/unicore/lib/Sc.pl
index 80d79b5d2f8..0d06088d2c6 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Sc.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Sc.pl
@@ -13,6 +13,8 @@ return <<'END';
0024
00A2 00A5
09F2 09F3
+0AF1
+0BF9
0E3F
17DB
20A0 20B1
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Shavian.pl b/gnu/usr.bin/perl/lib/unicore/lib/Shavian.pl
new file mode 100644
index 00000000000..a6e343651ca
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Shavian.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{Shavian} (and fuzzy permutations)
+#
+# Meaning: Script 'SHAVIAN'
+#
+return <<'END';
+10450 1047F SHAVIAN
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Sk.pl b/gnu/usr.bin/perl/lib/unicore/lib/Sk.pl
index 19ff8b02686..442b0d84b51 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Sk.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Sk.pl
@@ -16,10 +16,10 @@ return <<'END';
00AF
00B4
00B8
-02B9 02BA
-02C2 02CF
+02C2 02C5
02D2 02DF
02E5 02ED
+02EF 02FF
0374 0375
0384 0385
1FBD
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/So.pl b/gnu/usr.bin/perl/lib/unicore/lib/So.pl
index 1ef7acc99cf..6ede8eeb219 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/So.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/So.pl
@@ -16,10 +16,13 @@ return <<'END';
00B0
00B6
0482
+060E 060F
06E9
06FD 06FE
09FA
0B70
+0BF3 0BF8
+0BFA
0F01 0F03
0F13 0F17
0F1A 0F1F
@@ -29,6 +32,8 @@ return <<'END';
0FBE 0FC5
0FC7 0FCC
0FCF
+1940
+19E0 19FF
2100 2101
2103 2106
2108 2109
@@ -40,7 +45,7 @@ return <<'END';
2129
212E
2132
-213A
+213A 213B
214A
2195 2199
219C 219F
@@ -56,18 +61,18 @@ return <<'END';
2322 2328
232B 237B
237D 239A
-23B7 23CE
+23B7 23D0
2400 2426
2440 244A
249C 24E9
2500 25B6
25B8 25C0
25C2 25F7
-2600 2613
-2616 2617
+2600 2617
2619 266E
2670 267D
-2680 2689
+2680 2691
+26A0 26A1
2701 2704
2706 2709
270C 2727
@@ -81,6 +86,7 @@ return <<'END';
2798 27AF
27B1 27BE
2800 28FF
+2B00 2B0D
2E80 2E99
2E9B 2EF3
2F00 2FD5
@@ -92,21 +98,23 @@ return <<'END';
303E 303F
3190 3191
3196 319F
-3200 321C
+3200 321E
322A 3243
-3260 327B
+3250
+3260 327D
327F
328A 32B0
-32C0 32CB
-32D0 32FE
-3300 3376
-337B 33DD
-33E0 33FE
+32C0 32FE
+3300 33FF
+4DC0 4DFF
A490 A4C6
+FDFD
FFE4
FFE8
FFED FFEE
FFFC FFFD
+10102
+10137 1013F
1D000 1D0F5
1D100 1D126
1D12A 1D164
@@ -114,4 +122,5 @@ FFFC FFFD
1D183 1D184
1D18C 1D1A9
1D1AE 1D1DD
+1D300 1D356
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/SoftDott.pl b/gnu/usr.bin/perl/lib/unicore/lib/SoftDott.pl
index b36e6756572..9a827b3b210 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/SoftDott.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/SoftDott.pl
@@ -14,6 +14,8 @@ return <<'END';
0268 Soft_Dotted
0456 Soft_Dotted
0458 Soft_Dotted
+1D62 Soft_Dotted
1E2D Soft_Dotted
1ECB Soft_Dotted
+2071 Soft_Dotted
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Space.pl b/gnu/usr.bin/perl/lib/unicore/lib/Space.pl
index 868c88c5449..6c1cc2e1b21 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Space.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Space.pl
@@ -11,9 +11,11 @@
return <<'END';
0009 000D
0020
+0085
00A0
1680
-2000 200B
+180E
+2000 200A
2028 2029
202F
205F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/SpacePer.pl b/gnu/usr.bin/perl/lib/unicore/lib/SpacePer.pl
index bf1cdcbbc15..cc12e07919d 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/SpacePer.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/SpacePer.pl
@@ -15,7 +15,8 @@ return <<'END';
0085
00A0
1680
-2000 200B
+180E
+2000 200A
2028 2029
202F
205F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Syriac.pl b/gnu/usr.bin/perl/lib/unicore/lib/Syriac.pl
index d78a76db792..a18248a12ad 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Syriac.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Syriac.pl
@@ -9,6 +9,6 @@
# Meaning: Script 'SYRIAC'
#
return <<'END';
-0710 072C SYRIAC
-0730 074A SYRIAC
+0710 074A SYRIAC
+074D 074F SYRIAC
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/TaiLe.pl b/gnu/usr.bin/perl/lib/unicore/lib/TaiLe.pl
new file mode 100644
index 00000000000..f2f4d9431dd
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/TaiLe.pl
@@ -0,0 +1,14 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{TaiLe} (and fuzzy permutations)
+#
+# Meaning: Script 'TAI_LE'
+#
+return <<'END';
+1950 196D TAI_LE
+1970 1974 TAI_LE
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Terminal.pl b/gnu/usr.bin/perl/lib/unicore/lib/Terminal.pl
index d7606867ce8..280cb5100a1 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Terminal.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Terminal.pl
@@ -33,8 +33,9 @@ return <<'END';
17DA Terminal_Punctuation
1802 1805 Terminal_Punctuation
1808 1809 Terminal_Punctuation
+1944 1945 Terminal_Punctuation
203C 203D Terminal_Punctuation
-2048 2049 Terminal_Punctuation
+2047 2049 Terminal_Punctuation
3001 3002 Terminal_Punctuation
FE50 FE52 Terminal_Punctuation
FE54 FE57 Terminal_Punctuation
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Ugaritic.pl b/gnu/usr.bin/perl/lib/unicore/lib/Ugaritic.pl
new file mode 100644
index 00000000000..d0041f4bd2b
--- /dev/null
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Ugaritic.pl
@@ -0,0 +1,13 @@
+# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+# This file is built by ./mktables from e.g. UnicodeData.txt.
+# Any changes made here will be lost!
+
+#
+# This file supports:
+# \p{Ugaritic} (and fuzzy permutations)
+#
+# Meaning: Script 'UGARITIC'
+#
+return <<'END';
+10380 1039D UGARITIC
+END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Upper.pl b/gnu/usr.bin/perl/lib/unicore/lib/Upper.pl
index d3350db9b94..6833e75b804 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Upper.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Upper.pl
@@ -165,6 +165,8 @@ return <<'END';
03EC
03EE
03F4
+03F7
+03F9 03FA
0400 042F
0460
0462
@@ -397,7 +399,7 @@ return <<'END';
213E 213F
2145
FF21 FF3A
-10400 10425
+10400 10427
1D400 1D419
1D434 1D44D
1D468 1D481
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Uppercas.pl b/gnu/usr.bin/perl/lib/unicore/lib/Uppercas.pl
index 7f39ab9ee39..f3aec8840ed 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Uppercas.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Uppercas.pl
@@ -165,6 +165,8 @@ return <<'END';
03EC
03EE
03F4
+03F7
+03F9 03FA
0400 042F
0460
0462
@@ -399,7 +401,7 @@ return <<'END';
2160 216F
24B6 24CF
FF21 FF3A
-10400 10425
+10400 10427
1D400 1D419
1D434 1D44D
1D468 1D481
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/WhiteSpa.pl b/gnu/usr.bin/perl/lib/unicore/lib/WhiteSpa.pl
index 8f05124ec30..f994862a089 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/WhiteSpa.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/WhiteSpa.pl
@@ -14,8 +14,10 @@ return <<'END';
0085 White_Space
00A0 White_Space
1680 White_Space
+180E White_Space
2000 200A White_Space
2028 2029 White_Space
202F White_Space
+205F White_Space
3000 White_Space
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Word.pl b/gnu/usr.bin/perl/lib/unicore/lib/Word.pl
index fcd8aa0f805..20936b1d62b 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Word.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Word.pl
@@ -20,16 +20,13 @@ return <<'END';
00BC 00BE
00C0 00D6
00D8 00F6
-00F8 0220
-0222 0233
-0250 02AD
-02B0 02B8
-02BB 02C1
-02D0 02D1
+00F8 0236
+0250 02C1
+02C6 02D1
02E0 02E4
02EE
-0300 034F
-0360 036F
+0300 0357
+035D 036F
037A
0386
0388 038A
@@ -37,6 +34,7 @@ return <<'END';
038E 03A1
03A3 03CE
03D0 03F5
+03F7 03FB
0400 0481
0483 0486
0488 04CE
@@ -54,19 +52,19 @@ return <<'END';
05C4
05D0 05EA
05F0 05F2
+0610 0615
0621 063A
-0640 0655
+0640 0658
0660 0669
066E 06D3
06D5 06DC
06DE 06E8
-06EA 06ED
-06F0 06FC
-0710 072C
-0730 074A
+06EA 06FC
+06FF
+0710 074A
+074D 074F
0780 07B1
-0901 0903
-0905 0939
+0901 0939
093C 094D
0950 0954
0958 0963
@@ -78,8 +76,7 @@ return <<'END';
09AA 09B0
09B2
09B6 09B9
-09BC
-09BE 09C4
+09BC 09C4
09C7 09C8
09CB 09CD
09D7
@@ -87,7 +84,7 @@ return <<'END';
09DF 09E3
09E6 09F1
09F4 09F9
-0A02
+0A01 0A03
0A05 0A0A
0A0F 0A10
0A13 0A28
@@ -103,8 +100,7 @@ return <<'END';
0A5E
0A66 0A74
0A81 0A83
-0A85 0A8B
-0A8D
+0A85 0A8D
0A8F 0A91
0A93 0AA8
0AAA 0AB0
@@ -114,7 +110,7 @@ return <<'END';
0AC7 0AC9
0ACB 0ACD
0AD0
-0AE0
+0AE0 0AE3
0AE6 0AEF
0B01 0B03
0B05 0B0C
@@ -122,7 +118,7 @@ return <<'END';
0B13 0B28
0B2A 0B30
0B32 0B33
-0B36 0B39
+0B35 0B39
0B3C 0B43
0B47 0B48
0B4B 0B4D
@@ -130,6 +126,7 @@ return <<'END';
0B5C 0B5D
0B5F 0B61
0B66 0B6F
+0B71
0B82 0B83
0B85 0B8A
0B8E 0B90
@@ -164,7 +161,7 @@ return <<'END';
0C92 0CA8
0CAA 0CB3
0CB5 0CB9
-0CBE 0CC4
+0CBC 0CC4
0CC6 0CC8
0CCA 0CCD
0CD5 0CD6
@@ -278,14 +275,22 @@ return <<'END';
1760 176C
176E 1770
1772 1773
-1780 17D3
+1780 17B3
+17B6 17D3
17D7
-17DC
+17DC 17DD
17E0 17E9
+17F0 17F9
180B 180D
1810 1819
1820 1877
1880 18A9
+1900 191C
+1920 192B
+1930 193B
+1946 196D
+1970 1974
+1D00 1D6B
1E00 1E9B
1EA0 1EF9
1F00 1F15
@@ -307,6 +312,8 @@ return <<'END';
1FE0 1FEC
1FF2 1FF4
1FF6 1FFC
+203F 2040
+2054
2070 2071
2074 2079
207F 2089
@@ -326,7 +333,7 @@ return <<'END';
2145 2149
2153 2183
2460 249B
-24EA 24FE
+24EA 24FF
2776 2793
3005 3007
3021 302F
@@ -335,8 +342,7 @@ return <<'END';
3041 3096
3099 309A
309D 309F
-30A1 30FA
-30FC 30FF
+30A1 30FF
3105 312C
3131 318E
3192 3195
@@ -367,21 +373,39 @@ FD92 FDC7
FDF0 FDFB
FE00 FE0F
FE20 FE23
+FE33 FE34
+FE4D FE4F
FE70 FE74
FE76 FEFC
FF10 FF19
FF21 FF3A
+FF3F
FF41 FF5A
-FF66 FFBE
+FF65 FFBE
FFC2 FFC7
FFCA FFCF
FFD2 FFD7
FFDA FFDC
+10000 1000B
+1000D 10026
+10028 1003A
+1003C 1003D
+1003F 1004D
+10050 1005D
+10080 100FA
+10107 10133
10300 1031E
10320 10323
10330 1034A
-10400 10425
-10428 1044D
+10380 1039D
+10400 1049D
+104A0 104A9
+10800 10805
+10808
+1080A 10835
+10837 10838
+1083C
+1083F
1D165 1D169
1D16D 1D172
1D17B 1D182
@@ -395,8 +419,7 @@ FFDA FFDC
1D4A9 1D4AC
1D4AE 1D4B9
1D4BB
-1D4BD 1D4C0
-1D4C2 1D4C3
+1D4BD 1D4C3
1D4C5 1D505
1D507 1D50A
1D50D 1D514
@@ -421,4 +444,5 @@ FFDA FFDC
1D7CE 1D7FF
20000 2A6D6
2F800 2FA1D
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Yi.pl b/gnu/usr.bin/perl/lib/unicore/lib/Yi.pl
index eb7131e801a..5c44ecec055 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Yi.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Yi.pl
@@ -10,9 +10,5 @@
#
return <<'END';
A000 A48C YI
-A490 A4A1 YI
-A4A4 A4B3 YI
-A4B5 A4C0 YI
-A4C2 A4C4 YI
-A4C6 YI
+A490 A4C6 YI
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Z.pl b/gnu/usr.bin/perl/lib/unicore/lib/Z.pl
index 751327e6922..27873b80f43 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Z.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Z.pl
@@ -13,6 +13,7 @@ return <<'END';
0020
00A0
1680
+180E
2000 200B
2028 2029
202F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/Zs.pl b/gnu/usr.bin/perl/lib/unicore/lib/Zs.pl
index 1c1b467a570..754cb709ea3 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/Zs.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/Zs.pl
@@ -13,6 +13,7 @@ return <<'END';
0020
00A0
1680
+180E
2000 200B
202F
205F
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/_CaseIgn.pl b/gnu/usr.bin/perl/lib/unicore/lib/_CaseIgn.pl
index dafa4a668f1..1c384c5bbb5 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/_CaseIgn.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/_CaseIgn.pl
@@ -10,8 +10,8 @@
#
return <<'END';
00AD
-0300 034F
-0360 036F
+0300 0357
+035D 036F
0483 0486
0591 05A1
05A3 05B9
@@ -19,7 +19,8 @@ return <<'END';
05BF
05C1 05C2
05C4
-064B 0655
+0610 0615
+064B 0658
0670
06D6 06DC
06DF 06E4
@@ -39,7 +40,7 @@ return <<'END';
09C1 09C4
09CD
09E2 09E3
-0A02
+0A01 0A02
0A3C
0A41 0A42
0A47 0A48
@@ -50,6 +51,7 @@ return <<'END';
0AC1 0AC5
0AC7 0AC8
0ACD
+0AE2 0AE3
0B01
0B3C
0B3F
@@ -63,6 +65,7 @@ return <<'END';
0C46 0C48
0C4A 0C4D
0C55 0C56
+0CBC
0CBF
0CC6
0CCC 0CCD
@@ -100,8 +103,13 @@ return <<'END';
17B7 17BD
17C6
17C9 17D3
+17DD
180B 180D
18A9
+1920 1922
+1927 1928
+1932
+1939 193B
2010
20D0 20DC
20E1
@@ -115,4 +123,5 @@ FE20 FE23
1D17B 1D182
1D185 1D18B
1D1AA 1D1AD
+E0100 E01EF
END
diff --git a/gnu/usr.bin/perl/lib/unicore/lib/_CombAbo.pl b/gnu/usr.bin/perl/lib/unicore/lib/_CombAbo.pl
index de2c8e46ab7..acf3e6d9d79 100644
--- a/gnu/usr.bin/perl/lib/unicore/lib/_CombAbo.pl
+++ b/gnu/usr.bin/perl/lib/unicore/lib/_CombAbo.pl
@@ -13,6 +13,8 @@ return <<'END';
033D 0344
0346
034A 034C
+0350 0352
+0357
0363 036F
0483 0486
0592 0595
@@ -22,7 +24,9 @@ return <<'END';
05AB 05AC
05AF
05C4
+0610 0615
0653 0654
+0657 0658
06D6 06DC
06DF 06E2
06E4
@@ -42,6 +46,8 @@ return <<'END';
0953 0954
0F82 0F83
0F86 0F87
+17DD
+193A
20D0 20D1
20D4 20D7
20DB 20DC
diff --git a/gnu/usr.bin/perl/lib/unicore/mktables b/gnu/usr.bin/perl/lib/unicore/mktables
index 654301eeb42..5fdac52dc61 100644
--- a/gnu/usr.bin/perl/lib/unicore/mktables
+++ b/gnu/usr.bin/perl/lib/unicore/mktables
@@ -2,6 +2,9 @@
use strict;
use Carp;
+die "$0: Please run me as ./mktables to avoid unnecessary differences\n"
+ unless $0 eq "./mktables";
+
##
## mktables -- create the runtime Perl Unicode files (lib/unicore/**/*.pl)
## from the Unicode database files (lib/unicore/*.txt).
@@ -624,32 +627,35 @@ sub UnicodeData_Txt()
($General{$name} ||= Table->New)->$op($code, $name);
# 005F: SPACING UNDERSCORE
- $Cat{Word}->$op($code) if $cat =~ /^[LMN]/ || $code == 0x005F;
- $Cat{Alnum}->$op($code) if $cat =~ /^[LMN]/;
+ $Cat{Word}->$op($code) if $cat =~ /^[LMN]|Pc/;
+ $Cat{Alnum}->$op($code) if $cat =~ /^[LM]|Nd/;
$Cat{Alpha}->$op($code) if $cat =~ /^[LM]/;
-
-
- $Cat{Space}->$op($code) if $cat =~ /^Z/
+ my $isspace =
+ ($cat =~ /Zs|Zl|Zp/ &&
+ $code != 0x200B) # 200B is ZWSP which is for line break control
+ # and therefore it is not part of "space" even while it is "Zs".
|| $code == 0x0009 # 0009: HORIZONTAL TAB
|| $code == 0x000A # 000A: LINE FEED
|| $code == 0x000B # 000B: VERTICAL TAB
|| $code == 0x000C # 000C: FORM FEED
- || $code == 0x000D; # 000D: CARRIAGE RETURN
+ || $code == 0x000D # 000D: CARRIAGE RETURN
+ || $code == 0x0085 # 0085: NEL
+ ;
- $Cat{SpacePerl}->$op($code) if $cat =~ /^Z/
- || $code == 0x0009 # 0009: HORIZONTAL TAB
- || $code == 0x000A # 000A: LINE FEED
- || $code == 0x000C # 000C: FORM FEED
- || $code == 0x000D # 000D: CARRIAGE RETURN
- || $code == 0x0085 # 0085: <NEXT LINE>
- || $code == 0x2028 # 2028: LINE SEPARATOR
- || $code == 0x2029;# 2029: PARAGRAPH SEP.
+ $Cat{Space}->$op($code) if $isspace;
- $Cat{Blank}->$op($code) if $cat =~ /^Z[^lp]$/
- || $code == 0x0009 # 0009: HORIZONTAL TAB
- || $code == 0x0020; # 0020: SPACE
+ $Cat{SpacePerl}->$op($code) if $isspace
+ && $code != 0x000B; # Backward compat.
+
+ $Cat{Blank}->$op($code) if $isspace
+ && !($code == 0x000A ||
+ $code == 0x000B ||
+ $code == 0x000C ||
+ $code == 0x000D ||
+ $code == 0x0085 ||
+ $cat =~ /^Z[lp]/);
$Cat{Digit}->$op($code) if $cat eq "Nd";
$Cat{Upper}->$op($code) if $cat eq "Lu";
@@ -657,8 +663,9 @@ sub UnicodeData_Txt()
$Cat{Title}->$op($code) if $cat eq "Lt";
$Cat{ASCII}->$op($code) if $code <= 0x007F;
$Cat{Cntrl}->$op($code) if $cat =~ /^C/;
- $Cat{Graph}->$op($code) if $cat =~ /^([LMNPS]|Co)/;
- $Cat{Print}->$op($code) if $cat =~ /^([LMNPS]|Co|Zs)/;
+ my $isgraph = !$isspace && $cat !~ /Cc|Cs|Cn/;
+ $Cat{Graph}->$op($code) if $isgraph;
+ $Cat{Print}->$op($code) if $isgraph || $isspace;
$Cat{Punct}->$op($code) if $cat =~ /^P/;
$Cat{XDigit}->$op($code) if ($code >= 0x30 && $code <= 0x39) ## 0..9
diff --git a/gnu/usr.bin/perl/lib/unicore/version b/gnu/usr.bin/perl/lib/unicore/version
index 944880fa15e..fcdb2e109f6 100644
--- a/gnu/usr.bin/perl/lib/unicore/version
+++ b/gnu/usr.bin/perl/lib/unicore/version
@@ -1 +1 @@
-3.2.0
+4.0.0
diff --git a/gnu/usr.bin/perl/lib/utf8.pm b/gnu/usr.bin/perl/lib/utf8.pm
index 5a37aecba87..f5eebe7fba2 100644
--- a/gnu/usr.bin/perl/lib/utf8.pm
+++ b/gnu/usr.bin/perl/lib/utf8.pm
@@ -2,7 +2,7 @@ package utf8;
$utf8::hint_bits = 0x00800000;
-our $VERSION = '1.00';
+our $VERSION = '1.02';
sub import {
$^H |= $utf8::hint_bits;
@@ -31,6 +31,15 @@ utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code
use utf8;
no utf8;
+ $num_octets = utf8::upgrade($string);
+ $success = utf8::downgrade($string[, FAIL_OK]);
+
+ utf8::encode($string);
+ utf8::decode($string);
+
+ $flag = utf8::is_utf8(STRING); # since Perl 5.8.1
+ $flag = utf8::valid(STRING);
+
=head1 DESCRIPTION
The C<use utf8> pragma tells the Perl parser to allow UTF-8 in the
@@ -41,12 +50,22 @@ the source text as literal bytes in the current lexical scope.
This pragma is primarily a compatibility device. Perl versions
earlier than 5.6 allowed arbitrary bytes in source code, whereas
in future we would like to standardize on the UTF-8 encoding for
-source text. Until UTF-8 becomes the default format for source
-text, this pragma should be used to recognize UTF-8 in the source.
-When UTF-8 becomes the standard source format, this pragma will
-effectively become a no-op. For convenience in what follows the
-term I<UTF-X> is used to refer to UTF-8 on ASCII and ISO Latin based
-platforms and UTF-EBCDIC on EBCDIC based platforms.
+source text.
+
+B<Do not use this pragma for anything else than telling Perl that your
+script is written in UTF-8.> The utility functions described below are
+useful for their own purposes, but they are not really part of the
+"pragmatic" effect.
+
+Until UTF-8 becomes the default format for source text, either this
+pragma or the L</encoding> pragma should be used to recognize UTF-8
+in the source. When UTF-8 becomes the standard source format, this
+pragma will effectively become a no-op. For convenience in what
+follows the term I<UTF-X> is used to refer to UTF-8 on ASCII and ISO
+Latin based platforms and UTF-EBCDIC on EBCDIC based platforms.
+
+See also the effects of the C<-C> switch and its cousin, the
+C<$ENV{PERL_UNICODE}>, in L<perlrun>.
Enabling the C<utf8> pragma has the following effect:
@@ -70,24 +89,38 @@ will be unhappy since the bytes are most probably not well-formed
UTF-8. If you want to have such bytes and use utf8, you can disable
utf8 until the end the block (or file, if at top level) by C<no utf8;>.
+If you want to automatically upgrade your 8-bit legacy bytes to UTF-8,
+use the L</encoding> pragma instead of this pragma. For example, if
+you want to implicitly upgrade your ISO 8859-1 (Latin-1) bytes to UTF-8
+as used in e.g. C<chr()> and C<\x{...}>, try this:
+
+ use encoding "latin-1";
+ my $c = chr(0xc4);
+ my $x = "\x{c5}";
+
+In case you are wondering: yes, C<use encoding 'utf8';> works much
+the same as C<use utf8;>.
+
=head2 Utility functions
-The following functions are defined in the C<utf8::> package by the perl core.
+The following functions are defined in the C<utf8::> package by the
+Perl core. You do not need to say C<use utf8> to use these and in fact
+you should not say that unless you really want to have UTF-8 source code.
=over 4
-=item * $num_octets = utf8::upgrade($string);
+=item * $num_octets = utf8::upgrade($string)
-Converts (in-place) internal representation of string to Perl's internal
-I<UTF-X> form. Returns the number of octets necessary to represent
-the string as I<UTF-X>. Can be used to make sure that the
+Converts (in-place) internal representation of string to Perl's
+internal I<UTF-X> form. Returns the number of octets necessary to
+represent the string as I<UTF-X>. Can be used to make sure that the
UTF-8 flag is on, so that C<\w> or C<lc()> work as expected on strings
-containing characters in the range 0x80-0xFF. Note that this should
-not be used to convert
-a legacy byte encoding to Unicode: use Encode for that. Affected
-by the encoding pragma.
+containing characters in the range 0x80-0xFF (oon ASCII and
+derivatives). Note that this should not be used to convert a legacy
+byte encoding to Unicode: use Encode for that. Affected by the
+encoding pragma.
-=item * utf8::downgrade($string[, FAIL_OK])
+=item * $success = utf8::downgrade($string[, FAIL_OK])
Converts (in-place) internal representation of string to be un-encoded
bytes. Returns true on success. On failure dies or, if the value of
@@ -101,24 +134,31 @@ pragma.
=item * utf8::encode($string)
Converts (in-place) I<$string> from logical characters to octet
-sequence representing it in Perl's I<UTF-X> encoding. Same as
-Encode::encode_utf8(). Note that this should not be used to convert
-a legacy byte encoding to Unicode: use Encode for that.
+sequence representing it in Perl's I<UTF-X> encoding. Returns
+nothing. Same as Encode::encode_utf8(). Note that this should not be
+used to convert a legacy byte encoding to Unicode: use Encode for
+that.
-=item * $flag = utf8::decode($string)
+=item * utf8::decode($string)
Attempts to convert I<$string> in-place from Perl's I<UTF-X> encoding
-into logical characters. Same as Encode::decode_utf8(). Note that this
-should not be used to convert Unicode back to a legacy byte encoding:
-use Encode for that.
+into logical characters. Returns nothing. Same as Encode::decode_utf8().
+Note that this should not be used to convert Unicode back to a legacy
+byte encoding: use Encode for that.
+
+=item * $flag = utf8::is_utf8(STRING)
+
+(Since Perl 5.8.1) Test whether STRING is in UTF-8. Functionally
+the same as Encode::is_utf8().
=item * $flag = utf8::valid(STRING)
-[INTERNAL] Test whether STRING is in a consistent state. Will return
-true if string is held as bytes, or is well-formed UTF-8 and has the
-UTF-8 flag on. Main reason for this routine is to allow Perl's
-testsuite to check that operations have left strings in a consistent
-state.
+[INTERNAL] Test whether STRING is in a consistent state regarding
+UTF-8. Will return true is well-formed UTF-8 and has the UTF-8 flag
+on B<or> if string is held as bytes (both these states are 'consistent').
+Main reason for this routine is to allow Perl's testsuite to check
+that operations have left strings in a consistent state. You most
+probably want to use utf8::is_utf8() instead.
=back
@@ -127,10 +167,10 @@ cleared. See L<perlunicode> for more on the UTF8 flag and the C API
functions C<sv_utf8_upgrade>, C<sv_utf8_downgrade>, C<sv_utf8_encode>,
and C<sv_utf8_decode>, which are wrapped by the Perl functions
C<utf8::upgrade>, C<utf8::downgrade>, C<utf8::encode> and
-C<utf8::decode>. Note that in the Perl 5.8.0 implementation the
-functions utf8::valid, utf8::encode, utf8::decode, utf8::upgrade,
-and utf8::downgrade are always available, without a C<require utf8>
-statement-- this may change in future releases.
+C<utf8::decode>. Note that in the Perl 5.8.0 and 5.8.1 implementation
+the functions utf8::is_utf8, utf8::valid, utf8::encode, utf8::decode,
+utf8::upgrade, and utf8::downgrade are always available, without a
+C<require utf8> statement-- this may change in future releases.
=head1 BUGS
@@ -147,6 +187,6 @@ portable answers.
=head1 SEE ALSO
-L<perlunicode>, L<bytes>
+L<perluniintro>, L<encoding>, L<perlrun>, L<bytes>, L<perlunicode>
=cut
diff --git a/gnu/usr.bin/perl/lib/utf8_heavy.pl b/gnu/usr.bin/perl/lib/utf8_heavy.pl
index 1839d2144f1..f4a0aaa3e8d 100644
--- a/gnu/usr.bin/perl/lib/utf8_heavy.pl
+++ b/gnu/usr.bin/perl/lib/utf8_heavy.pl
@@ -11,7 +11,8 @@ my %Cache;
sub croak { require Carp; Carp::croak(@_) }
##
-## "SWASH" == "SWATCH HASH". A "swatch" is a swatch of the Unicode landscape
+## "SWASH" == "SWATCH HASH". A "swatch" is a swatch of the Unicode landscape.
+## It's a data structure that encodes a set of Unicode characters.
##
sub SWASHNEW {
@@ -28,7 +29,7 @@ sub SWASHNEW {
## ranges.
##
## To make the parsing of $type clear, this code takes the a rather
- ## unorthadox approach of last'ing out of the block once we have the
+ ## unorthodox approach of last'ing out of the block once we have the
## info we need. Were this to be a subroutine, the 'last' would just
## be a 'return'.
##
@@ -50,7 +51,9 @@ sub SWASHNEW {
##
## 'Block=' is replaced by 'In'.
##
- $type =~ s/^Is(?:\s+|[-_])?//i
+ my $wasIs;
+
+ ($wasIs = $type =~ s/^Is(?:\s+|[-_])?//i)
or
$type =~ s/^Category\s*=\s*//i
or
@@ -85,25 +88,41 @@ sub SWASHNEW {
## It could be a user-defined property.
##
- if ($type =~ /^I[ns](\w+)$/) {
- my @caller = caller(1);
+ my $caller1 = caller(1);
- if (defined $caller[0]) {
- my $prop = $caller[0] . "::" . $type;
+ if (defined $caller1 && $type =~ /^(?:\w+)$/) {
+ my $prop = $caller1 . "::" . ( $wasIs ? "Is" : "" ) . $type;
+ if (exists &{$prop}) {
+ no strict 'refs';
+
+ $list = &{$prop};
+ last GETFILE;
+ }
+ }
+
+ ##
+ ## See if it's a user-level "To".
+ ##
- if (exists &{$prop}) {
- no strict 'refs';
+ my $caller0 = caller(0);
- $list = &{$prop};
- last GETFILE;
- }
- }
- }
+ if (defined $caller0 && $type =~ /^To(?:\w+)$/) {
+ my $map = $caller0 . "::" . $type;
+ if (exists &{$map}) {
+ no strict 'refs';
+
+ $list = &{$map};
+ last GETFILE;
+ }
+ }
##
- ## Last attempt -- see if it's a "To" name (e.g. "ToLower")
+ ## Last attempt -- see if it's a standard "To" name
+ ## (e.g. "ToLower") ToTitle is used by ucfirst().
+ ## The user-level way to access ToDigit() and ToFold()
+ ## is to use Unicode::UCD.
##
- if ($type =~ /^To([A-Z][A-Za-z]+)$/)
+ if ($type =~ /^To(Digit|Fold|Lower|Title|Upper)$/)
{
$file = "unicore/To/$1.pl";
## would like to test to see if $file actually exists....
@@ -123,7 +142,7 @@ sub SWASHNEW {
##
## If we reach here, it was due to a 'last GETFILE' above
- ## (exception: user-defined properties), so we
+ ## (exception: user-defined properties and mappings), so we
## have a filename, so now we load it if we haven't already.
## If we have, return the cached results. The cache key is the
## file to load.
@@ -141,7 +160,7 @@ sub SWASHNEW {
}
my $extras;
- my $bits;
+ my $bits = 0;
my $ORIG = $list;
if ($list) {
@@ -150,8 +169,10 @@ sub SWASHNEW {
no warnings;
$extras = join '', grep /^[^0-9a-fA-F]/, @tmp;
$list = join '',
- sort { hex $a <=> hex $b }
- grep {/^([0-9a-fA-F]+)/ and not $seen{$1}++} @tmp; # XXX doesn't do ranges right
+ map { $_->[1] }
+ sort { $a->[0] <=> $b->[0] }
+ map { /^([0-9a-fA-F]+)/; [ hex($1), $_ ] }
+ grep { /^([0-9a-fA-F]+)/ and not $seen{$1}++ } @tmp; # XXX doesn't do ranges right
}
if ($none) {
@@ -161,10 +182,10 @@ sub SWASHNEW {
if ($minbits < 32) {
my $top = 0;
- while ($list =~ /^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+)?)(?:\t([0-9a-fA-F]+))?/mg) {
+ while ($list =~ /^([0-9a-fA-F]+)(?:[\t]([0-9a-fA-F]+)?)(?:[ \t]([0-9a-fA-F]+))?/mg) {
my $min = hex $1;
- my $max = hex(defined $2 ? $2 : $1);
- my $val = hex(defined $3 ? $3 : "");
+ my $max = defined $2 ? hex $2 : $min;
+ my $val = defined $3 ? hex $3 : 0;
$val += $max - $min if defined $3;
$top = $val if $val > $top;
}
@@ -238,10 +259,15 @@ sub SWASHGET {
pos $_ = 0;
if ($bits > 1) {
LINE:
- while (/^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+)?)(?:\t([0-9a-fA-F]+))?/mg) {
- my $min = hex $1;
- my $max = (defined $2 ? hex $2 : $min);
- my $val = hex $3;
+ while (/^([0-9a-fA-F]+)(?:[ \t]([0-9a-fA-F]+)?)?(?:[ \t]([0-9a-fA-F]+))?/mg) {
+ chomp;
+ my ($a, $b, $c) = ($1, $2, $3);
+ croak "$type: illegal mapping '$_'"
+ if $type =~ /^To/ &&
+ !(defined $a && defined $c);
+ my $min = hex $a;
+ my $max = defined $b ? hex $b : $min;
+ my $val = defined $c ? hex $c : 0;
next if $max < $start;
print "$min $max $val\n" if DEBUG;
if ($none) {
@@ -272,8 +298,9 @@ sub SWASHGET {
else {
LINE:
while (/^([0-9a-fA-F]+)(?:[ \t]+([0-9a-fA-F]+))?/mg) {
+ chomp;
my $min = hex $1;
- my $max = (defined $2 ? hex $2 : $min);
+ my $max = defined $2 ? hex $2 : $min;
next if $max < $start;
if ($min < $start) {
$min = $start;
diff --git a/gnu/usr.bin/perl/lib/vmsish.pm b/gnu/usr.bin/perl/lib/vmsish.pm
index c2d97c13ae8..4907ad388d2 100644
--- a/gnu/usr.bin/perl/lib/vmsish.pm
+++ b/gnu/usr.bin/perl/lib/vmsish.pm
@@ -1,6 +1,6 @@
package vmsish;
-our $VERSION = '1.00';
+our $VERSION = '1.01';
=head1 NAME
@@ -117,6 +117,8 @@ sub bits {
my $bits = 0;
my $sememe;
foreach $sememe (@_) {
+ # Those hints are defined in vms/vmsish.h :
+ # HINT_M_VMSISH_STATUS and HINT_M_VMSISH_TIME
$bits |= 0x40000000, next if $sememe eq 'status' || $sememe eq '$?';
$bits |= 0x80000000, next if $sememe eq 'time';
}
diff --git a/gnu/usr.bin/perl/lib/vmsish.t b/gnu/usr.bin/perl/lib/vmsish.t
index 24e3b041ea5..aad4a4a66f8 100644
--- a/gnu/usr.bin/perl/lib/vmsish.t
+++ b/gnu/usr.bin/perl/lib/vmsish.t
@@ -112,17 +112,34 @@ is($?,0,"outer lex scope of vmsish [POSIX status]");
eval "END { \$ENV{'SYS\$TIMEZONE_DIFFERENTIAL'} = $oldtz; }";
gmtime(0); # Force reset of tz offset
}
+ # This test script might have been invoked in at least one of four different ways:
+ # perl lib/vmsish.t
+ # perl [.lib]vmsish.t
+ # set def [.t] && perl ../lib/vmsish.t
+ # set def [.t] && perl [-.lib]vmsish.t
+ # In the following we attempt to find ourselves without resorting to VMS::Filespec.
+ # Note that the chdir in the BEGIN block above complicates matters.
+ my $self = $0;
+ if ( ! -e $self && -e "../$0" ) { $self = "../$0"; }
+ if ( ! -e $self ) {
+ $self =~ s/\[//;
+ $self = "[-$self";
+ }
{
use_ok('vmsish qw(time)');
+
+ # but that didn't get it in our current scope
+ use vmsish qw(time);
+
$vmstime = time;
@vmslocal = localtime($vmstime);
@vmsgmtime = gmtime($vmstime);
- $vmsmtime = (stat $0)[9];
+ $vmsmtime = (stat $self)[9];
}
$utctime = time;
@utclocal = localtime($vmstime);
@utcgmtime = gmtime($vmstime);
- $utcmtime = (stat $0)[9];
+ $utcmtime = (stat $self)[9];
$offset = $ENV{'SYS$TIMEZONE_DIFFERENTIAL'};
@@ -130,23 +147,23 @@ is($?,0,"outer lex scope of vmsish [POSIX status]");
# since it's unlikely local time will differ from UTC by so small
# an amount, and it renders the test resistant to delays from
# things like stat() on a file mounted over a slow network link.
- ok($utctime - $vmstime +$offset <= 10,"(time) UTC:$utctime VMS:$vmstime");
+ ok(abs($utctime - $vmstime + $offset) <= 10,"(time) UTC: $utctime VMS: $vmstime");
$utcval = $utclocal[5] * 31536000 + $utclocal[7] * 86400 +
$utclocal[2] * 3600 + $utclocal[1] * 60 + $utclocal[0];
$vmsval = $vmslocal[5] * 31536000 + $vmslocal[7] * 86400 +
$vmslocal[2] * 3600 + $vmslocal[1] * 60 + $vmslocal[0];
- ok($vmsval - $utcval + $offset <= 10, "(localtime)");
+ ok(abs($vmsval - $utcval + $offset) <= 10, "(localtime) UTC: $utcval VMS: $vmsval");
print "# UTC: @utclocal\n# VMS: @vmslocal\n";
$utcval = $utcgmtime[5] * 31536000 + $utcgmtime[7] * 86400 +
$utcgmtime[2] * 3600 + $utcgmtime[1] * 60 + $utcgmtime[0];
$vmsval = $vmsgmtime[5] * 31536000 + $vmsgmtime[7] * 86400 +
$vmsgmtime[2] * 3600 + $vmsgmtime[1] * 60 + $vmsgmtime[0];
- ok($vmsval - $utcval + $offset <= 10, "(gmtime)");
+ ok(abs($vmsval - $utcval + $offset) <= 10, "(gmtime) UTC: $utcval VMS: $vmsval");
print "# UTC: @utcgmtime\n# VMS: @vmsgmtime\n";
- ok($vmsmtime - $utcmtime + $offset <= 10,"(stat) UTC: $utcmtime VMS: $vmsmtime");
+ ok(abs($utcmtime - $vmsmtime + $offset) <= 10,"(stat) UTC: $utcmtime VMS: $vmsmtime");
}
}
diff --git a/gnu/usr.bin/perl/lib/warnings.pm b/gnu/usr.bin/perl/lib/warnings.pm
index 8aa77482b20..a4d41578b50 100644
--- a/gnu/usr.bin/perl/lib/warnings.pm
+++ b/gnu/usr.bin/perl/lib/warnings.pm
@@ -6,7 +6,7 @@
package warnings;
-our $VERSION = '1.00';
+our $VERSION = '1.03';
=head1 NAME
@@ -39,6 +39,10 @@ warnings - Perl pragma to control optional warnings
=head1 DESCRIPTION
+The C<warnings> pragma is a replacement for the command line flag C<-w>,
+but the pragma is limited to the enclosing block, while the flag is global.
+See L<perllexwarn> for more information.
+
If no import list is supplied, all possible warnings are either enabled
or disabled.
@@ -127,9 +131,9 @@ See L<perlmodlib/Pragmatic Modules> and L<perllexwarn>.
=cut
-use Carp ;
+use Carp ();
-%Offsets = (
+our %Offsets : unique = (
# Warnings Categories added in Perl 5.008
@@ -182,7 +186,7 @@ use Carp ;
'y2k' => 92,
);
-%Bits = (
+our %Bits : unique = (
'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..46]
'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29]
'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30]
@@ -232,7 +236,7 @@ use Carp ;
'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [46]
);
-%DeadBits = (
+our %DeadBits : unique = (
'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..46]
'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29]
'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30]
@@ -291,7 +295,7 @@ $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ;
sub Croaker
{
delete $Carp::CarpInternal{'warnings'};
- croak @_ ;
+ Carp::croak(@_);
}
sub bits
@@ -460,10 +464,10 @@ sub warn
my $message = pop ;
my ($callers_bitmask, $offset, $i) = __chk(@_) ;
- croak($message)
+ Carp::croak($message)
if vec($callers_bitmask, $offset+1, 1) ||
vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
- carp($message) ;
+ Carp::carp($message) ;
}
sub warnif
@@ -479,11 +483,11 @@ sub warnif
(vec($callers_bitmask, $offset, 1) ||
vec($callers_bitmask, $Offsets{'all'}, 1)) ;
- croak($message)
+ Carp::croak($message)
if vec($callers_bitmask, $offset+1, 1) ||
vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
- carp($message) ;
+ Carp::carp($message) ;
}
1;
diff --git a/gnu/usr.bin/perl/lib/warnings.t b/gnu/usr.bin/perl/lib/warnings.t
index 8e57a6db599..0647b552f4f 100644
--- a/gnu/usr.bin/perl/lib/warnings.t
+++ b/gnu/usr.bin/perl/lib/warnings.t
@@ -40,6 +40,7 @@ foreach my $file (@w_files) {
next if $file =~ /(~|\.orig|,v)$/;
next if $file =~ /perlio$/ && !(find PerlIO::Layer 'perlio');
+ next if -d $file;
open F, "<$file" or die "Cannot open $file: $!\n" ;
my $line = 0;
@@ -58,7 +59,7 @@ foreach my $file (@w_files) {
undef $/;
-print "1..", scalar(@prgs)-$files, "\n";
+print "1.." . (scalar(@prgs)-$files) . "\n";
for (@prgs){
@@ -181,7 +182,7 @@ for (@prgs){
print STDERR "GOT:\n$results\n";
print "not ";
}
- print "ok ", ++$i, "\n";
+ print "ok " . ++$i . "\n";
foreach (@temps)
{ unlink $_ if $_ }
foreach (@temp_path)